Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Improvements in the display of ticket history. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
c8a78004ce272d700f44890e7ce715a3 |
| User & Date: | drh 2008-10-20 16:05:03.000 |
Context
|
2008-10-21
| ||
| 06:10 | Add "ci" as an alias for "commit". Make provisions for a future "fossil mv" command. ... (check-in: 2bde9f9b3d user: drh tags: trunk) | |
|
2008-10-20
| ||
| 16:05 | Improvements in the display of ticket history. ... (check-in: c8a78004ce user: drh tags: trunk) | |
| 06:41 | More improvements to the timeline display of ticket changes. ... (check-in: f0c8693845 user: drh tags: trunk) | |
Changes
Changes to src/info.c.
| ︙ | ︙ | |||
830 831 832 833 834 835 836 | content_get(rid, &content); @ %h(blob_str(&content)) @ </pre></blockquote> blob_reset(&content); style_footer(); } | < < < < < < < < < < < < < < | 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 |
content_get(rid, &content);
@ %h(blob_str(&content))
@ </pre></blockquote>
blob_reset(&content);
style_footer();
}
/*
** WEBPAGE: tinfo
** URL: /tinfo?name=UUID
**
** Show the details of a ticket change control artifact.
*/
void tinfo_page(void){
int rid;
Blob content;
char *zDate;
const char *zUuid;
char zTktName[20];
Manifest m;
login_check_credentials();
if( !g.okRdTkt ){ login_needed(); return; }
rid = name_to_rid(PD("name","0"));
if( rid==0 ){ fossil_redirect_home(); }
zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid);
|
| ︙ | ︙ | |||
892 893 894 895 896 897 898 | @ <p>By %h(m.zUser) on %s(zDate). See also: @ <a href="%s(g.zTop)/artifact/%T(zUuid)">artifact content</a>, and @ <a href="%s(g.zTop)/tkthistory/%s(m.zTicketUuid)">ticket history</a> @ </p> @ @ <ol> free(zDate); | < < < < < < < < < | < < < < < < < < | 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 | @ <p>By %h(m.zUser) on %s(zDate). See also: @ <a href="%s(g.zTop)/artifact/%T(zUuid)">artifact content</a>, and @ <a href="%s(g.zTop)/tkthistory/%s(m.zTicketUuid)">ticket history</a> @ </p> @ @ <ol> free(zDate); ticket_output_change_artifact(&m); manifest_clear(&m); style_footer(); } /* ** WEBPAGE: info ** URL: info/UUID |
| ︙ | ︙ |
Changes to src/tkt.c.
| ︙ | ︙ | |||
321 322 323 324 325 326 327 328 |
login_check_credentials();
if( !g.okRdTkt ){ login_needed(); return; }
if( g.okWrTkt ){
style_submenu_element("Edit", "Edit The Ticket", "%s/tktedit?name=%T",
g.zTop, PD("name",""));
}
if( g.okHistory ){
style_submenu_element("History", "History Of This Ticket",
| > | > > | 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 |
login_check_credentials();
if( !g.okRdTkt ){ login_needed(); return; }
if( g.okWrTkt ){
style_submenu_element("Edit", "Edit The Ticket", "%s/tktedit?name=%T",
g.zTop, PD("name",""));
}
if( g.okHistory ){
const char *zUuid = PD("name","");
style_submenu_element("History", "History Of This Ticket",
"%s/tkthistory/%T", g.zTop, zUuid);
style_submenu_element("Timeline", "Timeline Of This Ticket",
"%s/tkttimeline/%T", g.zTop, zUuid);
}
style_header("View Ticket");
ticket_init();
initializeVariablesFromDb();
zScript = ticket_viewpage_code();
Th_Render(zScript);
style_footer();
|
| ︙ | ︙ | |||
578 579 580 581 582 583 584 |
return zErr;
}
}
return 0;
}
/*
| | | | | > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 |
return zErr;
}
}
return 0;
}
/*
** WEBPAGE: tkttimeline
** URL: /tkttimeline?name=TICKETUUID
**
** Show the change history for a single ticket in timeline format.
*/
void tkttimeline_page(void){
Stmt q;
char *zTitle;
char *zSQL;
const char *zUuid;
int tagid;
login_check_credentials();
if( !g.okHistory || !g.okRdTkt ){ login_needed(); return; }
zUuid = PD("name","");
style_submenu_element("History", "History",
"%s/tkthistory/%s", g.zTop, zUuid);
style_submenu_element("Status", "Status",
"%s/info/%s", g.zTop, zUuid);
zTitle = mprintf("Timeline Of Ticket %h", zUuid);
style_header(zTitle);
free(zTitle);
tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname GLOB 'tkt-%q*'",zUuid);
if( tagid==0 ){
@ No such ticket: %h(zUuid)
style_footer();
return;
}
zSQL = mprintf("%s AND event.objid IN "
" (SELECT rid FROM tagxref WHERE tagid=%d) "
"ORDER BY mtime DESC",
timeline_query_for_www(), tagid);
db_prepare(&q, zSQL);
free(zSQL);
www_print_timeline(&q);
db_finalize(&q);
style_footer();
}
/*
** WEBPAGE: tkthistory
** URL: /tkthistory?name=TICKETUUID
**
** Show the complete change history for a single ticket
*/
void tkthistory_page(void){
Stmt q;
char *zTitle;
const char *zUuid;
int tagid;
login_check_credentials();
if( !g.okHistory || !g.okRdTkt ){ login_needed(); return; }
zUuid = PD("name","");
zTitle = mprintf("History Of Ticket %h", zUuid);
style_submenu_element("Status", "Status",
"%s/info/%s", g.zTop, zUuid);
style_submenu_element("Timeline", "Timeline",
"%s/tkttimeline?name=%s", g.zTop, zUuid);
style_header(zTitle);
free(zTitle);
tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname GLOB 'tkt-%q*'",zUuid);
if( tagid==0 ){
@ No such ticket: %h(zUuid)
style_footer();
return;
}
db_prepare(&q,
"SELECT objid, uuid FROM event, blob"
" WHERE objid IN (SELECT rid FROM tagxref WHERE tagid=%d)"
" AND blob.rid=event.objid"
" ORDER BY mtime DESC",
tagid
);
while( db_step(&q)==SQLITE_ROW ){
Blob content;
Manifest m;
int rid = db_column_int(&q, 0);
const char *zChngUuid = db_column_text(&q, 1);
content_get(rid, &content);
if( manifest_parse(&m, &content) && m.type==CFTYPE_TICKET ){
char *zDate = db_text(0, "SELECT datetime(%.12f)", m.rDate);
char zUuid[12];
memcpy(zUuid, zChngUuid, 10);
zUuid[10] = 0;
@
@ <p>%s(zDate)
@ [<a href="%s(g.zTop)/artifact/%T(zChngUuid)">%s(zUuid)</a>]</a>
@ by %h(m.zUser):</p>
@
free(zDate);
ticket_output_change_artifact(&m);
}
manifest_clear(&m);
}
db_finalize(&q);
style_footer();
}
/*
** Return TRUE if the given BLOB contains a newline character.
*/
static int contains_newline(Blob *p){
const char *z = blob_str(p);
while( *z ){
if( *z=='\n' ) return 1;
z++;
}
return 0;
}
/*
** The pTkt object is a ticket change artifact. Output a detailed
** description of this object.
*/
void ticket_output_change_artifact(Manifest *pTkt){
int i;
@ <ol>
for(i=0; i<pTkt->nField; i++){
Blob val;
const char *z;
z = pTkt->aField[i].zName;
blob_set(&val, pTkt->aField[i].zValue);
if( z[0]=='+' ){
@ <li>Appended to %h(&z[1]):<blockquote>
wiki_convert(&val, 0, 0);
@ </blockquote></li>
}else if( blob_size(&val)<=50 && contains_newline(&val) ){
@ <li>Change %h(z) to:<blockquote>
wiki_convert(&val, 0, 0);
@ </blockquote></li>
}else{
@ <li>Change %h(z) to "%h(blob_str(&val))"</li>
}
blob_reset(&val);
}
@ </ol>
}
|