| | @@ -494,10 +494,11 @@ |
| 494 | 494 | " (SELECT name FROM filename WHERE fnid=mlink.pfnid) AS oldnm" |
| 495 | 495 | " FROM mlink" |
| 496 | 496 | " WHERE mid=:mid AND (pid!=fid OR pfnid>0)" |
| 497 | 497 | " AND (fid>0 OR" |
| 498 | 498 | " fnid NOT IN (SELECT pfnid FROM mlink WHERE mid=:mid))" |
| 499 | + " AND NOT mlink.isaux" |
| 499 | 500 | " ORDER BY 3 /*sort*/" |
| 500 | 501 | ); |
| 501 | 502 | fchngQueryInit = 1; |
| 502 | 503 | } |
| 503 | 504 | db_bind_int(&fchngQuery, ":mid", rid); |
| | @@ -666,16 +667,16 @@ |
| 666 | 667 | if( cSep=='[' ) cgi_printf("["); |
| 667 | 668 | cgi_printf("],h:\"%s\"}%s", pRow->zUuid, pRow->pNext ? ",\n" : "];\n"); |
| 668 | 669 | } |
| 669 | 670 | cgi_printf("var nrail = %d\n", pGraph->mxRail+1); |
| 670 | 671 | graph_free(pGraph); |
| 671 | | - @ var canvasDiv = gebi("canvas"); |
| 672 | | - @ var canvasStyle = window.getComputedStyle && window.getComputedStyle(canvasDiv,null); |
| 673 | | - @ var lineColor = (canvasStyle && canvasStyle.getPropertyValue('color')) || 'black'; |
| 674 | | - @ var bgColor = (canvasStyle && canvasStyle.getPropertyValue('background-color')) || 'white'; |
| 675 | | - @ if( bgColor=='transparent' ) bgColor = 'white'; |
| 676 | | - @ var boxColor = lineColor; |
| 672 | + @ var cDiv = gebi("canvas"); |
| 673 | + @ var csty = window.getComputedStyle && window.getComputedStyle(cDiv,null); |
| 674 | + @ var lineClr = (csty && csty.getPropertyValue('color')) || 'black'; |
| 675 | + @ var bgClr = (csty && csty.getPropertyValue('background-color')) ||'white'; |
| 676 | + @ if( bgClr=='transparent' ) bgClr = 'white'; |
| 677 | + @ var boxColor = lineClr; |
| 677 | 678 | @ function drawBox(color,x0,y0,x1,y1){ |
| 678 | 679 | @ var n = document.createElement("div"); |
| 679 | 680 | @ if( x0>x1 ){ var t=x0; x0=x1; x1=t; } |
| 680 | 681 | @ if( y0>y1 ){ var t=y0; y0=y1; y1=t; } |
| 681 | 682 | @ var w = x1-x0+1; |
| | @@ -685,11 +686,11 @@ |
| 685 | 686 | @ n.style.left = x0+"px"; |
| 686 | 687 | @ n.style.top = y0+"px"; |
| 687 | 688 | @ n.style.width = w+"px"; |
| 688 | 689 | @ n.style.height = h+"px"; |
| 689 | 690 | @ n.style.backgroundColor = color; |
| 690 | | - @ canvasDiv.appendChild(n); |
| 691 | + @ cDiv.appendChild(n); |
| 691 | 692 | @ return n; |
| 692 | 693 | @ } |
| 693 | 694 | @ function absoluteY(id){ |
| 694 | 695 | @ var obj = gebi(id); |
| 695 | 696 | @ if( !obj ) return; |
| | @@ -711,39 +712,39 @@ |
| 711 | 712 | @ }while( obj = obj.offsetParent ); |
| 712 | 713 | @ } |
| 713 | 714 | @ return left; |
| 714 | 715 | @ } |
| 715 | 716 | @ function drawUpArrow(x,y0,y1){ |
| 716 | | - @ drawBox(lineColor,x,y0,x+1,y1); |
| 717 | + @ drawBox(lineClr,x,y0,x+1,y1); |
| 717 | 718 | @ if( y0+10>=y1 ){ |
| 718 | | - @ drawBox(lineColor,x-1,y0+1,x+2,y0+2); |
| 719 | | - @ drawBox(lineColor,x-2,y0+3,x+3,y0+4); |
| 719 | + @ drawBox(lineClr,x-1,y0+1,x+2,y0+2); |
| 720 | + @ drawBox(lineClr,x-2,y0+3,x+3,y0+4); |
| 720 | 721 | @ }else{ |
| 721 | | - @ drawBox(lineColor,x-1,y0+2,x+2,y0+4); |
| 722 | | - @ drawBox(lineColor,x-2,y0+5,x+3,y0+7); |
| 722 | + @ drawBox(lineClr,x-1,y0+2,x+2,y0+4); |
| 723 | + @ drawBox(lineClr,x-2,y0+5,x+3,y0+7); |
| 723 | 724 | @ } |
| 724 | 725 | @ } |
| 725 | 726 | @ function drawThinArrow(y,xFrom,xTo){ |
| 726 | 727 | @ if( xFrom<xTo ){ |
| 727 | | - @ drawBox(lineColor,xFrom,y,xTo,y); |
| 728 | | - @ drawBox(lineColor,xTo-3,y-1,xTo-2,y+1); |
| 729 | | - @ drawBox(lineColor,xTo-4,y-2,xTo-4,y+2); |
| 728 | + @ drawBox(lineClr,xFrom,y,xTo,y); |
| 729 | + @ drawBox(lineClr,xTo-3,y-1,xTo-2,y+1); |
| 730 | + @ drawBox(lineClr,xTo-4,y-2,xTo-4,y+2); |
| 730 | 731 | @ }else{ |
| 731 | | - @ drawBox(lineColor,xTo,y,xFrom,y); |
| 732 | | - @ drawBox(lineColor,xTo+2,y-1,xTo+3,y+1); |
| 733 | | - @ drawBox(lineColor,xTo+4,y-2,xTo+4,y+2); |
| 732 | + @ drawBox(lineClr,xTo,y,xFrom,y); |
| 733 | + @ drawBox(lineClr,xTo+2,y-1,xTo+3,y+1); |
| 734 | + @ drawBox(lineClr,xTo+4,y-2,xTo+4,y+2); |
| 734 | 735 | @ } |
| 735 | 736 | @ } |
| 736 | 737 | @ function drawThinLine(x0,y0,x1,y1){ |
| 737 | | - @ drawBox(lineColor,x0,y0,x1,y1); |
| 738 | + @ drawBox(lineClr,x0,y0,x1,y1); |
| 738 | 739 | @ } |
| 739 | 740 | @ function drawNodeBox(color,x0,y0,x1,y1){ |
| 740 | 741 | @ drawBox(color,x0,y0,x1,y1).style.cursor = "pointer"; |
| 741 | 742 | @ } |
| 742 | 743 | @ function drawNode(p, left, btm){ |
| 743 | 744 | @ drawNodeBox(boxColor,p.x-5,p.y-5,p.x+6,p.y+6); |
| 744 | | - @ drawNodeBox(p.bg||bgColor,p.x-4,p.y-4,p.x+5,p.y+5); |
| 745 | + @ drawNodeBox(p.bg||bgClr,p.x-4,p.y-4,p.x+5,p.y+5); |
| 745 | 746 | @ if( p.u>0 ) drawUpArrow(p.x, rowinfo[p.u-1].y+6, p.y-5); |
| 746 | 747 | @ if( p.f&1 ) drawNodeBox(boxColor,p.x-1,p.y-1,p.x+2,p.y+2); |
| 747 | 748 | if( !omitDescenders ){ |
| 748 | 749 | @ if( p.u==0 ) drawUpArrow(p.x, 0, p.y-5); |
| 749 | 750 | @ if( p.d ) drawUpArrow(p.x, p.y+6, btm); |
| | @@ -765,11 +766,11 @@ |
| 765 | 766 | @ for(var i=0; i<n; i+=2){ |
| 766 | 767 | @ var x1 = p.au[i]*railPitch + left; |
| 767 | 768 | @ var x0 = x1>p.x ? p.x+7 : p.x-6; |
| 768 | 769 | @ var u = rowinfo[p.au[i+1]-1]; |
| 769 | 770 | @ if(u.id<p.id){ |
| 770 | | - @ drawBox(lineColor,x0,p.y,x1,p.y+1); |
| 771 | + @ drawBox(lineClr,x0,p.y,x1,p.y+1); |
| 771 | 772 | @ drawUpArrow(x1, u.y+6, p.y); |
| 772 | 773 | @ }else{ |
| 773 | 774 | @ drawBox("#600000",x0,p.y,x1,p.y+1); |
| 774 | 775 | @ drawBox("#600000",x1-1,p.y,x1,u.y+1); |
| 775 | 776 | @ drawBox("#600000",x1,u.y,u.x-6,u.y+1); |
| | @@ -952,13 +953,22 @@ |
| 952 | 953 | if( z==0 ) return -1.0; |
| 953 | 954 | if( fossil_isdate(z) ){ |
| 954 | 955 | mtime = db_double(0.0, "SELECT julianday(%Q,'utc')", z); |
| 955 | 956 | if( mtime>0.0 ) return mtime; |
| 956 | 957 | } |
| 957 | | - rid = symbolic_name_to_rid(z, "ci"); |
| 958 | | - if( rid==0 ) return -1.0; |
| 959 | | - mtime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid); |
| 958 | + rid = symbolic_name_to_rid(z, "*"); |
| 959 | + if( rid ){ |
| 960 | + mtime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid); |
| 961 | + }else{ |
| 962 | + mtime = db_double(-1.0, |
| 963 | + "SELECT max(event.mtime) FROM event, tag, tagxref" |
| 964 | + " WHERE tag.tagname GLOB 'event-%q*'" |
| 965 | + " AND tagxref.tagid=tag.tagid AND tagxref.tagtype" |
| 966 | + " AND event.objid=tagxref.rid", |
| 967 | + z |
| 968 | + ); |
| 969 | + } |
| 960 | 970 | return mtime; |
| 961 | 971 | } |
| 962 | 972 | |
| 963 | 973 | /* |
| 964 | 974 | ** The value of one second in julianday notation |
| | @@ -1011,10 +1021,47 @@ |
| 1011 | 1021 | } |
| 1012 | 1022 | db_finalize(&q); |
| 1013 | 1023 | return blob_str(&out); |
| 1014 | 1024 | } |
| 1015 | 1025 | |
| 1026 | + |
| 1027 | +/* |
| 1028 | +** Add the select/option box to the timeline submenu that is used to |
| 1029 | +** set the y= parameter that determines which elements to display |
| 1030 | +** on the timeline. |
| 1031 | +*/ |
| 1032 | +static void timeline_y_submenu(void){ |
| 1033 | + static int i = 0; |
| 1034 | + static const char *az[12]; |
| 1035 | + if( i==0 ){ |
| 1036 | + az[0] = "all"; |
| 1037 | + az[1] = "All Types"; |
| 1038 | + i = 2; |
| 1039 | + if( g.perm.Read ){ |
| 1040 | + az[i++] = "ci"; |
| 1041 | + az[i++] = "Check-ins"; |
| 1042 | + az[i++] = "g"; |
| 1043 | + az[i++] = "Tags"; |
| 1044 | + } |
| 1045 | + if( g.perm.RdWiki ){ |
| 1046 | + az[i++] = "e"; |
| 1047 | + az[i++] = "Tech Notes"; |
| 1048 | + } |
| 1049 | + if( g.perm.RdTkt ){ |
| 1050 | + az[i++] = "t"; |
| 1051 | + az[i++] = "Tickets"; |
| 1052 | + } |
| 1053 | + if( g.perm.RdWiki ){ |
| 1054 | + az[i++] = "w"; |
| 1055 | + az[i++] = "Wiki"; |
| 1056 | + } |
| 1057 | + assert( i<=ArraySize(az) ); |
| 1058 | + } |
| 1059 | + if( i>2 ){ |
| 1060 | + style_submenu_multichoice("y", i/2, az); |
| 1061 | + } |
| 1062 | +} |
| 1016 | 1063 | |
| 1017 | 1064 | /* |
| 1018 | 1065 | ** WEBPAGE: timeline |
| 1019 | 1066 | ** |
| 1020 | 1067 | ** Query parameters: |
| | @@ -1055,11 +1102,11 @@ |
| 1055 | 1102 | */ |
| 1056 | 1103 | void page_timeline(void){ |
| 1057 | 1104 | Stmt q; /* Query used to generate the timeline */ |
| 1058 | 1105 | Blob sql; /* text of SQL used to generate timeline */ |
| 1059 | 1106 | Blob desc; /* Description of the timeline */ |
| 1060 | | - int nEntry = atoi(PD("n","20")); /* Max number of entries on timeline */ |
| 1107 | + int nEntry; /* Max number of entries on timeline */ |
| 1061 | 1108 | int p_rid = name_to_typed_rid(P("p"),"ci"); /* artifact p and its parents */ |
| 1062 | 1109 | int d_rid = name_to_typed_rid(P("d"),"ci"); /* artifact d and descendants */ |
| 1063 | 1110 | int f_rid = name_to_typed_rid(P("f"),"ci"); /* artifact f and close family */ |
| 1064 | 1111 | const char *zUser = P("u"); /* All entries by this user if not NULL */ |
| 1065 | 1112 | const char *zType = PD("y","all"); /* Type of events. All if NULL */ |
| | @@ -1069,11 +1116,11 @@ |
| 1069 | 1116 | const char *zTagName = P("t"); /* Show events with this tag */ |
| 1070 | 1117 | const char *zBrName = P("r"); /* Show events related to this tag */ |
| 1071 | 1118 | const char *zSearch = P("s"); /* Search string */ |
| 1072 | 1119 | const char *zUses = P("uf"); /* Only show checkins hold this file */ |
| 1073 | 1120 | const char *zYearMonth = P("ym"); /* Show checkins for the given YYYY-MM */ |
| 1074 | | - const char *zYearWeek = P("yw"); /* Show checkins for the given YYYY-WW (week-of-year)*/ |
| 1121 | + const char *zYearWeek = P("yw"); /* Checkins for YYYY-WW (week-of-year) */ |
| 1075 | 1122 | int useDividers = P("nd")==0; /* Show dividers if "nd" is missing */ |
| 1076 | 1123 | int renameOnly = P("namechng")!=0; /* Show only checkins that rename files */ |
| 1077 | 1124 | int tagid; /* Tag ID */ |
| 1078 | 1125 | int tmFlags = 0; /* Timeline flags */ |
| 1079 | 1126 | const char *zThisTag = 0; /* Suppress links to this tag */ |
| | @@ -1084,10 +1131,32 @@ |
| 1084 | 1131 | int noMerge = P("shortest")==0; /* Follow merge links if shorter */ |
| 1085 | 1132 | int me_rid = name_to_typed_rid(P("me"),"ci"); /* me= for common ancestory */ |
| 1086 | 1133 | int you_rid = name_to_typed_rid(P("you"),"ci");/* you= for common ancst */ |
| 1087 | 1134 | int pd_rid; |
| 1088 | 1135 | double rBefore, rAfter, rCirca; /* Boundary times */ |
| 1136 | + const char *z; |
| 1137 | + char *zOlderButton = 0; /* URL for Older button at the bottom */ |
| 1138 | + |
| 1139 | + /* Set number of rows to display */ |
| 1140 | + z = P("n"); |
| 1141 | + if( z ){ |
| 1142 | + if( fossil_strcmp(z,"all")==0 ){ |
| 1143 | + nEntry = 0; |
| 1144 | + }else{ |
| 1145 | + nEntry = atoi(z); |
| 1146 | + if( nEntry<=0 ){ |
| 1147 | + cgi_replace_query_parameter("n","10"); |
| 1148 | + nEntry = 10; |
| 1149 | + } |
| 1150 | + } |
| 1151 | + }else if( zCirca ){ |
| 1152 | + cgi_replace_query_parameter("n","11"); |
| 1153 | + nEntry = 11; |
| 1154 | + }else{ |
| 1155 | + cgi_replace_query_parameter("n","50"); |
| 1156 | + nEntry = 50; |
| 1157 | + } |
| 1089 | 1158 | |
| 1090 | 1159 | /* To view the timeline, must have permission to read project data. |
| 1091 | 1160 | */ |
| 1092 | 1161 | pd_rid = name_to_typed_rid(P("dp"),"ci"); |
| 1093 | 1162 | if( pd_rid ){ |
| | @@ -1097,10 +1166,11 @@ |
| 1097 | 1166 | if( !g.perm.Read && !g.perm.RdTkt && !g.perm.RdWiki ){ |
| 1098 | 1167 | login_needed(); |
| 1099 | 1168 | return; |
| 1100 | 1169 | } |
| 1101 | 1170 | url_initialize(&url, "timeline"); |
| 1171 | + cgi_query_parameters_to_url(&url); |
| 1102 | 1172 | if( zTagName && g.perm.Read ){ |
| 1103 | 1173 | tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'", zTagName); |
| 1104 | 1174 | zThisTag = zTagName; |
| 1105 | 1175 | }else if( zBrName && g.perm.Read ){ |
| 1106 | 1176 | tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'",zBrName); |
| | @@ -1117,32 +1187,26 @@ |
| 1117 | 1187 | if( zType[0]=='a' ){ |
| 1118 | 1188 | tmFlags |= TIMELINE_BRIEF | TIMELINE_GRAPH; |
| 1119 | 1189 | }else{ |
| 1120 | 1190 | tmFlags |= TIMELINE_GRAPH; |
| 1121 | 1191 | } |
| 1122 | | - if( nEntry>0 ) url_add_parameter(&url, "n", mprintf("%d", nEntry)); |
| 1123 | | - if( P("ng")!=0 || zSearch!=0 ){ |
| 1192 | + if( PB("ng") || zSearch!=0 ){ |
| 1124 | 1193 | tmFlags &= ~TIMELINE_GRAPH; |
| 1125 | | - url_add_parameter(&url, "ng", 0); |
| 1126 | 1194 | } |
| 1127 | | - if( P("brbg")!=0 ){ |
| 1195 | + if( PB("brbg") ){ |
| 1128 | 1196 | tmFlags |= TIMELINE_BRCOLOR; |
| 1129 | | - url_add_parameter(&url, "brbg", 0); |
| 1130 | 1197 | } |
| 1131 | | - if( P("unhide")!=0 ){ |
| 1198 | + if( PB("unhide") ){ |
| 1132 | 1199 | tmFlags |= TIMELINE_UNHIDE; |
| 1133 | | - url_add_parameter(&url, "unhide", 0); |
| 1134 | 1200 | } |
| 1135 | | - if( P("ubg")!=0 ){ |
| 1201 | + if( PB("ubg") ){ |
| 1136 | 1202 | tmFlags |= TIMELINE_UCOLOR; |
| 1137 | | - url_add_parameter(&url, "ubg", 0); |
| 1138 | 1203 | } |
| 1139 | 1204 | if( zUses!=0 ){ |
| 1140 | 1205 | int ufid = db_int(0, "SELECT rid FROM blob WHERE uuid GLOB '%q*'", zUses); |
| 1141 | 1206 | if( ufid ){ |
| 1142 | 1207 | zUses = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", ufid); |
| 1143 | | - url_add_parameter(&url, "uf", zUses); |
| 1144 | 1208 | db_multi_exec("CREATE TEMP TABLE usesfile(rid INTEGER PRIMARY KEY)"); |
| 1145 | 1209 | compute_uses_file("usesfile", ufid, 0); |
| 1146 | 1210 | zType = "ci"; |
| 1147 | 1211 | }else{ |
| 1148 | 1212 | zUses = 0; |
| | @@ -1161,22 +1225,20 @@ |
| 1161 | 1225 | timeline_temp_table(); |
| 1162 | 1226 | blob_zero(&sql); |
| 1163 | 1227 | blob_zero(&desc); |
| 1164 | 1228 | blob_append(&sql, "INSERT OR IGNORE INTO timeline ", -1); |
| 1165 | 1229 | blob_append(&sql, timeline_query_for_www(), -1); |
| 1166 | | - if( P("fc")!=0 || P("v")!=0 || P("detail")!=0 ){ |
| 1230 | + if( PB("fc") || PB("v") || PB("detail") ){ |
| 1167 | 1231 | tmFlags |= TIMELINE_FCHANGES; |
| 1168 | | - url_add_parameter(&url, "v", 0); |
| 1169 | 1232 | } |
| 1170 | 1233 | if( (tmFlags & TIMELINE_UNHIDE)==0 ){ |
| 1171 | 1234 | blob_append_sql(&sql, |
| 1172 | 1235 | " AND NOT EXISTS(SELECT 1 FROM tagxref" |
| 1173 | 1236 | " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)", |
| 1174 | 1237 | TAG_HIDDEN |
| 1175 | 1238 | ); |
| 1176 | 1239 | } |
| 1177 | | - if( !useDividers ) url_add_parameter(&url, "nd", 0); |
| 1178 | 1240 | if( ((from_rid && to_rid) || (me_rid && you_rid)) && g.perm.Read ){ |
| 1179 | 1241 | /* If from= and to= are present, display all nodes on a path connecting |
| 1180 | 1242 | ** the two */ |
| 1181 | 1243 | PathNode *p = 0; |
| 1182 | 1244 | const char *zFrom = 0; |
| | @@ -1241,34 +1303,19 @@ |
| 1241 | 1303 | } |
| 1242 | 1304 | if( d_rid==0 && useDividers ) timeline_add_dividers(0, p_rid); |
| 1243 | 1305 | } |
| 1244 | 1306 | blob_appendf(&desc, " of %z[%S]</a>", |
| 1245 | 1307 | href("%R/info/%s", zUuid), zUuid); |
| 1246 | | - if( p_rid ){ |
| 1247 | | - url_add_parameter(&url, "p", zUuid); |
| 1248 | | - } |
| 1249 | 1308 | if( d_rid ){ |
| 1250 | 1309 | if( p_rid ){ |
| 1251 | 1310 | /* If both p= and d= are set, we don't have the uuid of d yet. */ |
| 1252 | 1311 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid); |
| 1253 | 1312 | } |
| 1254 | | - url_add_parameter(&url, "d", zUuid); |
| 1255 | | - } |
| 1256 | | - if( nEntry>20 ){ |
| 1257 | | - timeline_submenu(&url, "20 Entries", "n", "20", 0); |
| 1258 | | - } |
| 1259 | | - if( nEntry<200 && nEntry>0 ){ |
| 1260 | | - timeline_submenu(&url, "200 Entries", "n", "200", 0); |
| 1261 | | - } |
| 1262 | | - if( tmFlags & TIMELINE_FCHANGES ){ |
| 1263 | | - timeline_submenu(&url, "Hide Files", "v", 0, 0); |
| 1264 | | - }else{ |
| 1265 | | - timeline_submenu(&url, "Show Files", "v", "", 0); |
| 1266 | | - } |
| 1267 | | - if( (tmFlags & TIMELINE_UNHIDE)==0 ){ |
| 1268 | | - timeline_submenu(&url, "Unhide", "unhide", "", 0); |
| 1269 | | - } |
| 1313 | + } |
| 1314 | + style_submenu_binary("v","With Files","Without Files"); |
| 1315 | + style_submenu_entry("n","Lines",1); |
| 1316 | + timeline_y_submenu(); |
| 1270 | 1317 | }else if( f_rid && g.perm.Read ){ |
| 1271 | 1318 | /* If f= is present, ignore all other parameters other than n= */ |
| 1272 | 1319 | char *zUuid; |
| 1273 | 1320 | db_multi_exec( |
| 1274 | 1321 | "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);" |
| | @@ -1282,16 +1329,11 @@ |
| 1282 | 1329 | if( useDividers ) timeline_add_dividers(0, f_rid); |
| 1283 | 1330 | blob_appendf(&desc, "Parents and children of check-in "); |
| 1284 | 1331 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid); |
| 1285 | 1332 | blob_appendf(&desc, "%z[%S]</a>", href("%R/info/%s", zUuid), zUuid); |
| 1286 | 1333 | tmFlags |= TIMELINE_DISJOINT; |
| 1287 | | - url_add_parameter(&url, "f", zUuid); |
| 1288 | | - if( tmFlags & TIMELINE_FCHANGES ){ |
| 1289 | | - timeline_submenu(&url, "Hide Files", "v", 0, 0); |
| 1290 | | - }else{ |
| 1291 | | - timeline_submenu(&url, "Show Files", "v", "", 0); |
| 1292 | | - } |
| 1334 | + style_submenu_binary("v","With Files","Without Files"); |
| 1293 | 1335 | if( (tmFlags & TIMELINE_UNHIDE)==0 ){ |
| 1294 | 1336 | timeline_submenu(&url, "Unhide", "unhide", "", 0); |
| 1295 | 1337 | } |
| 1296 | 1338 | }else{ |
| 1297 | 1339 | /* Otherwise, a timeline based on a span of time */ |
| | @@ -1316,11 +1358,10 @@ |
| 1316 | 1358 | blob_append_sql(&sql, |
| 1317 | 1359 | "AND (EXISTS(SELECT 1 FROM tagxref" |
| 1318 | 1360 | " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)", tagid); |
| 1319 | 1361 | |
| 1320 | 1362 | if( zBrName ){ |
| 1321 | | - url_add_parameter(&url, "r", zBrName); |
| 1322 | 1363 | /* The next two blob_appendf() calls add SQL that causes checkins that |
| 1323 | 1364 | ** are not part of the branch which are parents or children of the |
| 1324 | 1365 | ** branch to be included in the report. This related check-ins are |
| 1325 | 1366 | ** useful in helping to visualize what has happened on a quiescent |
| 1326 | 1367 | ** branch that is infrequently merged with a much more activate branch. |
| | @@ -1348,15 +1389,11 @@ |
| 1348 | 1389 | " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid" |
| 1349 | 1390 | " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)", |
| 1350 | 1391 | TAG_HIDDEN |
| 1351 | 1392 | ); |
| 1352 | 1393 | } |
| 1353 | | - }else{ |
| 1354 | | - url_add_parameter(&url, "mionly", "1"); |
| 1355 | 1394 | } |
| 1356 | | - }else{ |
| 1357 | | - url_add_parameter(&url, "t", zTagName); |
| 1358 | 1395 | } |
| 1359 | 1396 | blob_append_sql(&sql, ")"); |
| 1360 | 1397 | } |
| 1361 | 1398 | if( (zType[0]=='w' && !g.perm.RdWiki) |
| 1362 | 1399 | || (zType[0]=='t' && !g.perm.RdTkt) |
| | @@ -1384,11 +1421,10 @@ |
| 1384 | 1421 | } |
| 1385 | 1422 | blob_append_sql(&sql, ")"); |
| 1386 | 1423 | } |
| 1387 | 1424 | }else{ /* zType!="all" */ |
| 1388 | 1425 | blob_append_sql(&sql, " AND event.type=%Q", zType); |
| 1389 | | - url_add_parameter(&url, "y", zType); |
| 1390 | 1426 | if( zType[0]=='c' ){ |
| 1391 | 1427 | zEType = "checkin"; |
| 1392 | 1428 | }else if( zType[0]=='w' ){ |
| 1393 | 1429 | zEType = "wiki edit"; |
| 1394 | 1430 | }else if( zType[0]=='t' ){ |
| | @@ -1406,41 +1442,35 @@ |
| 1406 | 1442 | zCirca = zBefore = zAfter = 0; |
| 1407 | 1443 | nEntry = -1; |
| 1408 | 1444 | } |
| 1409 | 1445 | blob_append_sql(&sql, " AND (event.user=%Q OR event.euser=%Q)", |
| 1410 | 1446 | zUser, zUser); |
| 1411 | | - url_add_parameter(&url, "u", zUser); |
| 1412 | 1447 | zThisUser = zUser; |
| 1413 | 1448 | } |
| 1414 | 1449 | if( zSearch ){ |
| 1415 | 1450 | blob_append_sql(&sql, |
| 1416 | 1451 | " AND (event.comment LIKE '%%%q%%' OR event.brief LIKE '%%%q%%')", |
| 1417 | 1452 | zSearch, zSearch); |
| 1418 | | - url_add_parameter(&url, "s", zSearch); |
| 1419 | 1453 | } |
| 1420 | 1454 | rBefore = symbolic_name_to_mtime(zBefore); |
| 1421 | 1455 | rAfter = symbolic_name_to_mtime(zAfter); |
| 1422 | 1456 | rCirca = symbolic_name_to_mtime(zCirca); |
| 1423 | 1457 | if( rAfter>0.0 ){ |
| 1424 | 1458 | if( rBefore>0.0 ){ |
| 1425 | 1459 | blob_append_sql(&sql, |
| 1426 | 1460 | " AND event.mtime>=%.17g AND event.mtime<=%.17g" |
| 1427 | 1461 | " ORDER BY event.mtime ASC", rAfter-ONE_SECOND, rBefore+ONE_SECOND); |
| 1428 | | - url_add_parameter(&url, "a", zAfter); |
| 1429 | | - url_add_parameter(&url, "b", zBefore); |
| 1430 | 1462 | nEntry = -1; |
| 1431 | 1463 | }else{ |
| 1432 | 1464 | blob_append_sql(&sql, |
| 1433 | 1465 | " AND event.mtime>=%.17g ORDER BY event.mtime ASC", |
| 1434 | 1466 | rAfter-ONE_SECOND); |
| 1435 | | - url_add_parameter(&url, "a", zAfter); |
| 1436 | 1467 | } |
| 1437 | 1468 | }else if( rBefore>0.0 ){ |
| 1438 | 1469 | blob_append_sql(&sql, |
| 1439 | 1470 | " AND event.mtime<=%.17g ORDER BY event.mtime DESC", |
| 1440 | 1471 | rBefore+ONE_SECOND); |
| 1441 | | - url_add_parameter(&url, "b", zBefore); |
| 1442 | 1472 | }else if( rCirca>0.0 ){ |
| 1443 | 1473 | Blob sql2; |
| 1444 | 1474 | blob_init(&sql2, blob_sql_text(&sql), -1); |
| 1445 | 1475 | blob_append_sql(&sql2, |
| 1446 | 1476 | " AND event.mtime<=%f ORDER BY event.mtime DESC LIMIT %d", |
| | @@ -1452,11 +1482,10 @@ |
| 1452 | 1482 | " AND event.mtime>=%f ORDER BY event.mtime ASC", |
| 1453 | 1483 | rCirca |
| 1454 | 1484 | ); |
| 1455 | 1485 | nEntry -= (nEntry+1)/2; |
| 1456 | 1486 | if( useDividers ) timeline_add_dividers(rCirca, 0); |
| 1457 | | - url_add_parameter(&url, "c", zCirca); |
| 1458 | 1487 | }else{ |
| 1459 | 1488 | blob_append_sql(&sql, " ORDER BY event.mtime DESC"); |
| 1460 | 1489 | } |
| 1461 | 1490 | if( nEntry>0 ) blob_append_sql(&sql, " LIMIT %d", nEntry); |
| 1462 | 1491 | db_multi_exec("%s", blob_sql_text(&sql)); |
| | @@ -1509,64 +1538,44 @@ |
| 1509 | 1538 | } |
| 1510 | 1539 | if( g.perm.Hyperlink ){ |
| 1511 | 1540 | if( zAfter || n==nEntry ){ |
| 1512 | 1541 | zDate = db_text(0, "SELECT min(timestamp) FROM timeline /*scan*/"); |
| 1513 | 1542 | timeline_submenu(&url, "Older", "b", zDate, "a"); |
| 1543 | + zOlderButton = fossil_strdup(url_render(&url, "b", zDate, "a", 0)); |
| 1514 | 1544 | free(zDate); |
| 1515 | 1545 | } |
| 1516 | 1546 | if( zBefore || (zAfter && n==nEntry) ){ |
| 1517 | 1547 | zDate = db_text(0, "SELECT max(timestamp) FROM timeline /*scan*/"); |
| 1518 | 1548 | timeline_submenu(&url, "Newer", "a", zDate, "b"); |
| 1519 | 1549 | free(zDate); |
| 1520 | | - }else if( tagid==0 && zUses==0 ){ |
| 1521 | | - if( zType[0]!='a' ){ |
| 1522 | | - timeline_submenu(&url, "All Types", "y", "all", 0); |
| 1523 | | - } |
| 1524 | | - if( zType[0]!='w' && g.perm.RdWiki ){ |
| 1525 | | - timeline_submenu(&url, "Wiki Only", "y", "w", 0); |
| 1526 | | - } |
| 1527 | | - if( zType[0]!='c' && g.perm.Read ){ |
| 1528 | | - timeline_submenu(&url, "Checkins Only", "y", "ci", 0); |
| 1529 | | - } |
| 1530 | | - if( zType[0]!='t' && g.perm.RdTkt ){ |
| 1531 | | - timeline_submenu(&url, "Tickets Only", "y", "t", 0); |
| 1532 | | - } |
| 1533 | | - if( zType[0]!='e' && g.perm.RdWiki ){ |
| 1534 | | - timeline_submenu(&url, "Events Only", "y", "e", 0); |
| 1535 | | - } |
| 1536 | | - if( zType[0]!='g' && g.perm.Read ){ |
| 1537 | | - timeline_submenu(&url, "Tags Only", "y", "g", 0); |
| 1538 | | - } |
| 1539 | | - } |
| 1540 | | - if( nEntry>20 ){ |
| 1541 | | - timeline_submenu(&url, "20 Entries", "n", "20", 0); |
| 1542 | | - } |
| 1543 | | - if( nEntry<200 && nEntry>0 ){ |
| 1544 | | - timeline_submenu(&url, "200 Entries", "n", "200", 0); |
| 1545 | 1550 | } |
| 1546 | 1551 | if( zType[0]=='a' || zType[0]=='c' ){ |
| 1547 | | - if( tmFlags & TIMELINE_FCHANGES ){ |
| 1548 | | - timeline_submenu(&url, "Hide Files", "v", 0, 0); |
| 1549 | | - }else{ |
| 1550 | | - timeline_submenu(&url, "Show Files", "v", "", 0); |
| 1551 | | - } |
| 1552 | 1552 | if( (tmFlags & TIMELINE_UNHIDE)==0 ){ |
| 1553 | 1553 | timeline_submenu(&url, "Unhide", "unhide", "", 0); |
| 1554 | 1554 | } |
| 1555 | 1555 | } |
| 1556 | + style_submenu_binary("v","With Files","Without Files"); |
| 1557 | + if( zUses==0 ) timeline_y_submenu(); |
| 1558 | + style_submenu_entry("n","Lines",1); |
| 1556 | 1559 | } |
| 1557 | 1560 | } |
| 1558 | 1561 | if( P("showsql") ){ |
| 1559 | 1562 | @ <blockquote>%h(blob_sql_text(&sql))</blockquote> |
| 1560 | 1563 | } |
| 1564 | + if( search_restrict(SRCH_CKIN)!=0 ){ |
| 1565 | + style_submenu_element("Search", 0, "%R/search?y=c"); |
| 1566 | + } |
| 1561 | 1567 | if( P("showid") ) tmFlags |= TIMELINE_SHOWRID; |
| 1562 | 1568 | blob_zero(&sql); |
| 1563 | 1569 | db_prepare(&q, "SELECT * FROM timeline ORDER BY sortby DESC /*scan*/"); |
| 1564 | 1570 | @ <h2>%b(&desc)</h2> |
| 1565 | 1571 | blob_reset(&desc); |
| 1566 | 1572 | www_print_timeline(&q, tmFlags, zThisUser, zThisTag, 0); |
| 1567 | 1573 | db_finalize(&q); |
| 1574 | + if( zOlderButton ){ |
| 1575 | + @ %z(xhref("class='button'","%z",zOlderButton))Older</a> |
| 1576 | + } |
| 1568 | 1577 | style_footer(); |
| 1569 | 1578 | } |
| 1570 | 1579 | |
| 1571 | 1580 | /* |
| 1572 | 1581 | ** The input query q selects various records. Print a human-readable |
| | @@ -2041,10 +2050,10 @@ |
| 2041 | 2050 | " AND blob.rid=c.cid" |
| 2042 | 2051 | ); |
| 2043 | 2052 | while( db_step(&q)==SQLITE_ROW ){ |
| 2044 | 2053 | const char *zUuid = db_column_text(&q, 0); |
| 2045 | 2054 | @ <li> |
| 2046 | | - @ <a href="%s(g.zTop)/timeline?p=%s(zUuid)&d=%s(zUuid)&unhide">%S(zUuid)</a> |
| 2055 | + @ <a href="%s(g.zTop)/timeline?dp=%s(zUuid)&unhide">%S(zUuid)</a> |
| 2047 | 2056 | } |
| 2048 | 2057 | db_finalize(&q); |
| 2049 | 2058 | style_footer(); |
| 2050 | 2059 | } |
| 2051 | 2060 | |