Fossil SCM

Add Previous/Following Day/Week/Month links on timeline pages that use the ymd, yw, or ym query parameters.

drh 2020-12-02 17:30 trunk
Commit 96cd802a7659caf66299528e542777eb24fc6208132941a55d3d36b0a6a082f2
1 file changed +72 -4
+72 -4
--- src/timeline.c
+++ src/timeline.c
@@ -1734,11 +1734,13 @@
17341734
int you_rid = name_to_typed_rid(P("you"),"ci");/* you= for common ancst */
17351735
int pd_rid;
17361736
double rBefore, rAfter, rCirca; /* Boundary times */
17371737
const char *z;
17381738
char *zOlderButton = 0; /* URL for Older button at the bottom */
1739
+ char *zOlderButtonLabel = 0; /* Label for the Older Button */
17391740
char *zNewerButton = 0; /* URL for Newer button at the top */
1741
+ char *zNewerButtonLabel = 0; /* Label for the Newer button */
17401742
int selectedRid = 0; /* Show a highlight on this RID */
17411743
int secondaryRid = 0; /* Show secondary highlight */
17421744
int disableY = 0; /* Disable type selector on submenu */
17431745
int advancedMenu = 0; /* Use the advanced menu design */
17441746
char *zPlural; /* Ending for plural forms */
@@ -2225,23 +2227,46 @@
22252227
}
22262228
if( bisectLocal || zBisect!=0 ){
22272229
blob_append_sql(&cond, " AND event.objid IN (SELECT rid FROM bilog) ");
22282230
}
22292231
if( zYearMonth ){
2232
+ char *zNext;
22302233
zYearMonth = timeline_expand_datetime(zYearMonth);
22312234
if( strlen(zYearMonth)>7 ){
22322235
zYearMonth = mprintf("%.7s", zYearMonth);
22332236
}
22342237
if( db_int(0,"SELECT julianday('%q-01') IS NULL", zYearMonth) ){
22352238
zYearMonth = db_text(0, "SELECT strftime('%%Y-%%m','now');");
22362239
}
2240
+ zNext = db_text(0, "SELECT strftime('%%Y-%%m','%q-01','+1 month');",
2241
+ zYearMonth);
2242
+ if( db_int(0,
2243
+ "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2244
+ " WHERE blob.rid=event.objid AND mtime>=julianday('%q-01')%s)",
2245
+ zNext, blob_sql_text(&cond))
2246
+ ){
2247
+ zNewerButton = fossil_strdup(url_render(&url, "ym", zNext, 0, 0));
2248
+ zNewerButtonLabel = "Following month";
2249
+ }
2250
+ fossil_free(zNext);
2251
+ zNext = db_text(0, "SELECT strftime('%%Y-%%m','%q-01','-1 month');",
2252
+ zYearMonth);
2253
+ if( db_int(0,
2254
+ "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2255
+ " WHERE blob.rid=event.objid AND mtime<julianday('%q-01')%s)",
2256
+ zYearMonth, blob_sql_text(&cond))
2257
+ ){
2258
+ zOlderButton = fossil_strdup(url_render(&url, "ym", zNext, 0, 0));
2259
+ zOlderButtonLabel = "Previous month";
2260
+ }
2261
+ fossil_free(zNext);
22372262
blob_append_sql(&cond, " AND %Q=strftime('%%Y-%%m',event.mtime) ",
22382263
zYearMonth);
22392264
nEntry = -1;
22402265
}
22412266
else if( zYearWeek ){
2242
- char *z;
2267
+ char *z, *zNext;
22432268
zYearWeek = timeline_expand_datetime(zYearWeek);
22442269
z = db_text(0, "SELECT strftime('%%Y-%%W',%Q)", zYearWeek);
22452270
if( z && z[0] ){
22462271
zYearWeekStart = db_text(0, "SELECT date(%Q,'-6 days','weekday 1')",
22472272
zYearWeek);
@@ -2259,20 +2284,61 @@
22592284
"SELECT date('now','-6 days','weekday 1');");
22602285
zYearWeek = db_text(0,
22612286
"SELECT strftime('%%Y-%%W','now','-6 days','weekday 1')");
22622287
}
22632288
}
2289
+ zNext = db_text(0, "SELECT date(%Q,'+7 day');", zYearWeekStart);
2290
+ if( db_int(0,
2291
+ "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2292
+ " WHERE blob.rid=event.objid AND mtime>=julianday(%Q)%s)",
2293
+ zNext, blob_sql_text(&cond))
2294
+ ){
2295
+ zNewerButton = fossil_strdup(url_render(&url, "yw", zNext, 0, 0));
2296
+ zNewerButtonLabel = "Following week";
2297
+ }
2298
+ fossil_free(zNext);
2299
+ zNext = db_text(0, "SELECT date(%Q,'-7 days');", zYearWeekStart);
2300
+ if( db_int(0,
2301
+ "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2302
+ " WHERE blob.rid=event.objid AND mtime<julianday(%Q)%s)",
2303
+ zYearWeekStart, blob_sql_text(&cond))
2304
+ ){
2305
+ zOlderButton = fossil_strdup(url_render(&url, "yw", zNext, 0, 0));
2306
+ zOlderButtonLabel = "Previous week";
2307
+ }
2308
+ fossil_free(zNext);
22642309
blob_append_sql(&cond, " AND %Q=strftime('%%Y-%%W',event.mtime) ",
22652310
zYearWeek);
22662311
nEntry = -1;
22672312
}
22682313
else if( zDay ){
2314
+ char *zNext;
22692315
zDay = timeline_expand_datetime(zDay);
22702316
zDay = db_text(0, "SELECT date(%Q)", zDay);
22712317
if( zDay==0 || zDay[0]==0 ){
22722318
zDay = db_text(0, "SELECT date('now')");
22732319
}
2320
+ zNext = db_text(0, "SELECT date(%Q,'+1 day');", zDay);
2321
+ if( db_int(0,
2322
+ "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2323
+ " WHERE blob.rid=event.objid AND mtime>=julianday(%Q)%s)",
2324
+ zNext, blob_sql_text(&cond))
2325
+ ){
2326
+ zNewerButton = fossil_strdup(url_render(&url, "ymd", zNext, 0, 0));
2327
+ zNewerButtonLabel = "Following day";
2328
+ }
2329
+ fossil_free(zNext);
2330
+ zNext = db_text(0, "SELECT date(%Q,'-1 day');", zDay);
2331
+ if( db_int(0,
2332
+ "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2333
+ " WHERE blob.rid=event.objid AND mtime<julianday(%Q)%s)",
2334
+ zDay, blob_sql_text(&cond))
2335
+ ){
2336
+ zOlderButton = fossil_strdup(url_render(&url, "ymd", zNext, 0, 0));
2337
+ zOlderButtonLabel = "Previous day";
2338
+ }
2339
+ fossil_free(zNext);
22742340
blob_append_sql(&cond, " AND %Q=date(event.mtime) ",
22752341
zDay);
22762342
nEntry = -1;
22772343
}
22782344
else if( zNDays ){
@@ -2468,11 +2534,11 @@
24682534
db_multi_exec("%s", blob_sql_text(&sql));
24692535
24702536
n = db_int(0, "SELECT count(*) FROM timeline WHERE etype!='div' /*scan*/");
24712537
zPlural = n==1 ? "" : "s";
24722538
if( zYearMonth ){
2473
- blob_appendf(&desc, "%d %s%s for month beginning %h-01",
2539
+ blob_appendf(&desc, "%d %s%s for the month beginning %h-01",
24742540
n, zEType, zPlural, zYearMonth);
24752541
}else if( zYearWeek ){
24762542
blob_appendf(&desc, "%d %s%s for week %h beginning on %h",
24772543
n, zEType, zPlural, zYearWeek, zYearWeekStart);
24782544
}else if( zDay ){
@@ -2561,10 +2627,11 @@
25612627
"SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
25622628
" WHERE blob.rid=event.objid AND mtime<=%.17g%s)",
25632629
rDate-ONE_SECOND, blob_sql_text(&cond))
25642630
){
25652631
zOlderButton = fossil_strdup(url_render(&url, "b", zDate, "a", 0));
2632
+ zOlderButtonLabel = "More";
25662633
}
25672634
free(zDate);
25682635
}
25692636
zDate = db_text(0, "SELECT max(timestamp) FROM timeline /*scan*/");
25702637
if( (!zDate || !zDate[0]) && ( zAfter || zBefore ) ){
@@ -2576,10 +2643,11 @@
25762643
"SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
25772644
" WHERE blob.rid=event.objid AND mtime>=%.17g%s)",
25782645
rDate+ONE_SECOND, blob_sql_text(&cond))
25792646
){
25802647
zNewerButton = fossil_strdup(url_render(&url, "a", zDate, "b", 0));
2648
+ zNewerButton = "More";
25812649
}
25822650
free(zDate);
25832651
}
25842652
if( advancedMenu ){
25852653
if( zType[0]=='a' || zType[0]=='c' ){
@@ -2645,17 +2713,17 @@
26452713
if( zError ){
26462714
@ <p class="generalError">%h(zError)</p>
26472715
}
26482716
26492717
if( zNewerButton ){
2650
- @ %z(chref("button","%z",zNewerButton))More&nbsp;&uarr;</a>
2718
+ @ %z(chref("button","%z",zNewerButton))%h(zNewerButtonLabel)&nbsp;&uarr;</a>
26512719
}
26522720
www_print_timeline(&q, tmFlags, zThisUser, zThisTag, zBrName,
26532721
selectedRid, secondaryRid, 0);
26542722
db_finalize(&q);
26552723
if( zOlderButton ){
2656
- @ %z(chref("button","%z",zOlderButton))More&nbsp;&darr;</a>
2724
+ @ %z(chref("button","%z",zOlderButton))%h(zOlderButtonLabel)&nbsp;&darr;</a>
26572725
}
26582726
document_emit_js(/*handles pikchrs rendered above*/);
26592727
style_finish_page("timeline");
26602728
}
26612729
26622730
--- src/timeline.c
+++ src/timeline.c
@@ -1734,11 +1734,13 @@
1734 int you_rid = name_to_typed_rid(P("you"),"ci");/* you= for common ancst */
1735 int pd_rid;
1736 double rBefore, rAfter, rCirca; /* Boundary times */
1737 const char *z;
1738 char *zOlderButton = 0; /* URL for Older button at the bottom */
 
1739 char *zNewerButton = 0; /* URL for Newer button at the top */
 
1740 int selectedRid = 0; /* Show a highlight on this RID */
1741 int secondaryRid = 0; /* Show secondary highlight */
1742 int disableY = 0; /* Disable type selector on submenu */
1743 int advancedMenu = 0; /* Use the advanced menu design */
1744 char *zPlural; /* Ending for plural forms */
@@ -2225,23 +2227,46 @@
2225 }
2226 if( bisectLocal || zBisect!=0 ){
2227 blob_append_sql(&cond, " AND event.objid IN (SELECT rid FROM bilog) ");
2228 }
2229 if( zYearMonth ){
 
2230 zYearMonth = timeline_expand_datetime(zYearMonth);
2231 if( strlen(zYearMonth)>7 ){
2232 zYearMonth = mprintf("%.7s", zYearMonth);
2233 }
2234 if( db_int(0,"SELECT julianday('%q-01') IS NULL", zYearMonth) ){
2235 zYearMonth = db_text(0, "SELECT strftime('%%Y-%%m','now');");
2236 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2237 blob_append_sql(&cond, " AND %Q=strftime('%%Y-%%m',event.mtime) ",
2238 zYearMonth);
2239 nEntry = -1;
2240 }
2241 else if( zYearWeek ){
2242 char *z;
2243 zYearWeek = timeline_expand_datetime(zYearWeek);
2244 z = db_text(0, "SELECT strftime('%%Y-%%W',%Q)", zYearWeek);
2245 if( z && z[0] ){
2246 zYearWeekStart = db_text(0, "SELECT date(%Q,'-6 days','weekday 1')",
2247 zYearWeek);
@@ -2259,20 +2284,61 @@
2259 "SELECT date('now','-6 days','weekday 1');");
2260 zYearWeek = db_text(0,
2261 "SELECT strftime('%%Y-%%W','now','-6 days','weekday 1')");
2262 }
2263 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2264 blob_append_sql(&cond, " AND %Q=strftime('%%Y-%%W',event.mtime) ",
2265 zYearWeek);
2266 nEntry = -1;
2267 }
2268 else if( zDay ){
 
2269 zDay = timeline_expand_datetime(zDay);
2270 zDay = db_text(0, "SELECT date(%Q)", zDay);
2271 if( zDay==0 || zDay[0]==0 ){
2272 zDay = db_text(0, "SELECT date('now')");
2273 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2274 blob_append_sql(&cond, " AND %Q=date(event.mtime) ",
2275 zDay);
2276 nEntry = -1;
2277 }
2278 else if( zNDays ){
@@ -2468,11 +2534,11 @@
2468 db_multi_exec("%s", blob_sql_text(&sql));
2469
2470 n = db_int(0, "SELECT count(*) FROM timeline WHERE etype!='div' /*scan*/");
2471 zPlural = n==1 ? "" : "s";
2472 if( zYearMonth ){
2473 blob_appendf(&desc, "%d %s%s for month beginning %h-01",
2474 n, zEType, zPlural, zYearMonth);
2475 }else if( zYearWeek ){
2476 blob_appendf(&desc, "%d %s%s for week %h beginning on %h",
2477 n, zEType, zPlural, zYearWeek, zYearWeekStart);
2478 }else if( zDay ){
@@ -2561,10 +2627,11 @@
2561 "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2562 " WHERE blob.rid=event.objid AND mtime<=%.17g%s)",
2563 rDate-ONE_SECOND, blob_sql_text(&cond))
2564 ){
2565 zOlderButton = fossil_strdup(url_render(&url, "b", zDate, "a", 0));
 
2566 }
2567 free(zDate);
2568 }
2569 zDate = db_text(0, "SELECT max(timestamp) FROM timeline /*scan*/");
2570 if( (!zDate || !zDate[0]) && ( zAfter || zBefore ) ){
@@ -2576,10 +2643,11 @@
2576 "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2577 " WHERE blob.rid=event.objid AND mtime>=%.17g%s)",
2578 rDate+ONE_SECOND, blob_sql_text(&cond))
2579 ){
2580 zNewerButton = fossil_strdup(url_render(&url, "a", zDate, "b", 0));
 
2581 }
2582 free(zDate);
2583 }
2584 if( advancedMenu ){
2585 if( zType[0]=='a' || zType[0]=='c' ){
@@ -2645,17 +2713,17 @@
2645 if( zError ){
2646 @ <p class="generalError">%h(zError)</p>
2647 }
2648
2649 if( zNewerButton ){
2650 @ %z(chref("button","%z",zNewerButton))More&nbsp;&uarr;</a>
2651 }
2652 www_print_timeline(&q, tmFlags, zThisUser, zThisTag, zBrName,
2653 selectedRid, secondaryRid, 0);
2654 db_finalize(&q);
2655 if( zOlderButton ){
2656 @ %z(chref("button","%z",zOlderButton))More&nbsp;&darr;</a>
2657 }
2658 document_emit_js(/*handles pikchrs rendered above*/);
2659 style_finish_page("timeline");
2660 }
2661
2662
--- src/timeline.c
+++ src/timeline.c
@@ -1734,11 +1734,13 @@
1734 int you_rid = name_to_typed_rid(P("you"),"ci");/* you= for common ancst */
1735 int pd_rid;
1736 double rBefore, rAfter, rCirca; /* Boundary times */
1737 const char *z;
1738 char *zOlderButton = 0; /* URL for Older button at the bottom */
1739 char *zOlderButtonLabel = 0; /* Label for the Older Button */
1740 char *zNewerButton = 0; /* URL for Newer button at the top */
1741 char *zNewerButtonLabel = 0; /* Label for the Newer button */
1742 int selectedRid = 0; /* Show a highlight on this RID */
1743 int secondaryRid = 0; /* Show secondary highlight */
1744 int disableY = 0; /* Disable type selector on submenu */
1745 int advancedMenu = 0; /* Use the advanced menu design */
1746 char *zPlural; /* Ending for plural forms */
@@ -2225,23 +2227,46 @@
2227 }
2228 if( bisectLocal || zBisect!=0 ){
2229 blob_append_sql(&cond, " AND event.objid IN (SELECT rid FROM bilog) ");
2230 }
2231 if( zYearMonth ){
2232 char *zNext;
2233 zYearMonth = timeline_expand_datetime(zYearMonth);
2234 if( strlen(zYearMonth)>7 ){
2235 zYearMonth = mprintf("%.7s", zYearMonth);
2236 }
2237 if( db_int(0,"SELECT julianday('%q-01') IS NULL", zYearMonth) ){
2238 zYearMonth = db_text(0, "SELECT strftime('%%Y-%%m','now');");
2239 }
2240 zNext = db_text(0, "SELECT strftime('%%Y-%%m','%q-01','+1 month');",
2241 zYearMonth);
2242 if( db_int(0,
2243 "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2244 " WHERE blob.rid=event.objid AND mtime>=julianday('%q-01')%s)",
2245 zNext, blob_sql_text(&cond))
2246 ){
2247 zNewerButton = fossil_strdup(url_render(&url, "ym", zNext, 0, 0));
2248 zNewerButtonLabel = "Following month";
2249 }
2250 fossil_free(zNext);
2251 zNext = db_text(0, "SELECT strftime('%%Y-%%m','%q-01','-1 month');",
2252 zYearMonth);
2253 if( db_int(0,
2254 "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2255 " WHERE blob.rid=event.objid AND mtime<julianday('%q-01')%s)",
2256 zYearMonth, blob_sql_text(&cond))
2257 ){
2258 zOlderButton = fossil_strdup(url_render(&url, "ym", zNext, 0, 0));
2259 zOlderButtonLabel = "Previous month";
2260 }
2261 fossil_free(zNext);
2262 blob_append_sql(&cond, " AND %Q=strftime('%%Y-%%m',event.mtime) ",
2263 zYearMonth);
2264 nEntry = -1;
2265 }
2266 else if( zYearWeek ){
2267 char *z, *zNext;
2268 zYearWeek = timeline_expand_datetime(zYearWeek);
2269 z = db_text(0, "SELECT strftime('%%Y-%%W',%Q)", zYearWeek);
2270 if( z && z[0] ){
2271 zYearWeekStart = db_text(0, "SELECT date(%Q,'-6 days','weekday 1')",
2272 zYearWeek);
@@ -2259,20 +2284,61 @@
2284 "SELECT date('now','-6 days','weekday 1');");
2285 zYearWeek = db_text(0,
2286 "SELECT strftime('%%Y-%%W','now','-6 days','weekday 1')");
2287 }
2288 }
2289 zNext = db_text(0, "SELECT date(%Q,'+7 day');", zYearWeekStart);
2290 if( db_int(0,
2291 "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2292 " WHERE blob.rid=event.objid AND mtime>=julianday(%Q)%s)",
2293 zNext, blob_sql_text(&cond))
2294 ){
2295 zNewerButton = fossil_strdup(url_render(&url, "yw", zNext, 0, 0));
2296 zNewerButtonLabel = "Following week";
2297 }
2298 fossil_free(zNext);
2299 zNext = db_text(0, "SELECT date(%Q,'-7 days');", zYearWeekStart);
2300 if( db_int(0,
2301 "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2302 " WHERE blob.rid=event.objid AND mtime<julianday(%Q)%s)",
2303 zYearWeekStart, blob_sql_text(&cond))
2304 ){
2305 zOlderButton = fossil_strdup(url_render(&url, "yw", zNext, 0, 0));
2306 zOlderButtonLabel = "Previous week";
2307 }
2308 fossil_free(zNext);
2309 blob_append_sql(&cond, " AND %Q=strftime('%%Y-%%W',event.mtime) ",
2310 zYearWeek);
2311 nEntry = -1;
2312 }
2313 else if( zDay ){
2314 char *zNext;
2315 zDay = timeline_expand_datetime(zDay);
2316 zDay = db_text(0, "SELECT date(%Q)", zDay);
2317 if( zDay==0 || zDay[0]==0 ){
2318 zDay = db_text(0, "SELECT date('now')");
2319 }
2320 zNext = db_text(0, "SELECT date(%Q,'+1 day');", zDay);
2321 if( db_int(0,
2322 "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2323 " WHERE blob.rid=event.objid AND mtime>=julianday(%Q)%s)",
2324 zNext, blob_sql_text(&cond))
2325 ){
2326 zNewerButton = fossil_strdup(url_render(&url, "ymd", zNext, 0, 0));
2327 zNewerButtonLabel = "Following day";
2328 }
2329 fossil_free(zNext);
2330 zNext = db_text(0, "SELECT date(%Q,'-1 day');", zDay);
2331 if( db_int(0,
2332 "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2333 " WHERE blob.rid=event.objid AND mtime<julianday(%Q)%s)",
2334 zDay, blob_sql_text(&cond))
2335 ){
2336 zOlderButton = fossil_strdup(url_render(&url, "ymd", zNext, 0, 0));
2337 zOlderButtonLabel = "Previous day";
2338 }
2339 fossil_free(zNext);
2340 blob_append_sql(&cond, " AND %Q=date(event.mtime) ",
2341 zDay);
2342 nEntry = -1;
2343 }
2344 else if( zNDays ){
@@ -2468,11 +2534,11 @@
2534 db_multi_exec("%s", blob_sql_text(&sql));
2535
2536 n = db_int(0, "SELECT count(*) FROM timeline WHERE etype!='div' /*scan*/");
2537 zPlural = n==1 ? "" : "s";
2538 if( zYearMonth ){
2539 blob_appendf(&desc, "%d %s%s for the month beginning %h-01",
2540 n, zEType, zPlural, zYearMonth);
2541 }else if( zYearWeek ){
2542 blob_appendf(&desc, "%d %s%s for week %h beginning on %h",
2543 n, zEType, zPlural, zYearWeek, zYearWeekStart);
2544 }else if( zDay ){
@@ -2561,10 +2627,11 @@
2627 "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2628 " WHERE blob.rid=event.objid AND mtime<=%.17g%s)",
2629 rDate-ONE_SECOND, blob_sql_text(&cond))
2630 ){
2631 zOlderButton = fossil_strdup(url_render(&url, "b", zDate, "a", 0));
2632 zOlderButtonLabel = "More";
2633 }
2634 free(zDate);
2635 }
2636 zDate = db_text(0, "SELECT max(timestamp) FROM timeline /*scan*/");
2637 if( (!zDate || !zDate[0]) && ( zAfter || zBefore ) ){
@@ -2576,10 +2643,11 @@
2643 "SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob"
2644 " WHERE blob.rid=event.objid AND mtime>=%.17g%s)",
2645 rDate+ONE_SECOND, blob_sql_text(&cond))
2646 ){
2647 zNewerButton = fossil_strdup(url_render(&url, "a", zDate, "b", 0));
2648 zNewerButton = "More";
2649 }
2650 free(zDate);
2651 }
2652 if( advancedMenu ){
2653 if( zType[0]=='a' || zType[0]=='c' ){
@@ -2645,17 +2713,17 @@
2713 if( zError ){
2714 @ <p class="generalError">%h(zError)</p>
2715 }
2716
2717 if( zNewerButton ){
2718 @ %z(chref("button","%z",zNewerButton))%h(zNewerButtonLabel)&nbsp;&uarr;</a>
2719 }
2720 www_print_timeline(&q, tmFlags, zThisUser, zThisTag, zBrName,
2721 selectedRid, secondaryRid, 0);
2722 db_finalize(&q);
2723 if( zOlderButton ){
2724 @ %z(chref("button","%z",zOlderButton))%h(zOlderButtonLabel)&nbsp;&darr;</a>
2725 }
2726 document_emit_js(/*handles pikchrs rendered above*/);
2727 style_finish_page("timeline");
2728 }
2729
2730

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button