Fossil SCM

move quickfilter javascript into own js-file

jkosche 2025-03-26 16:36 quickfilter
Commit a6ac88cbb00938659deeaa80f34de1ab63fede763ef910bfe8c5bde3c628b7bc
--- src/main.mk
+++ src/main.mk
@@ -250,10 +250,11 @@
250250
$(SRCDIR)/href.js \
251251
$(SRCDIR)/login.js \
252252
$(SRCDIR)/markdown.md \
253253
$(SRCDIR)/menu.js \
254254
$(SRCDIR)/merge.tcl \
255
+ $(SRCDIR)/quickfilter.js \
255256
$(SRCDIR)/scroll.js \
256257
$(SRCDIR)/skin.js \
257258
$(SRCDIR)/sorttable.js \
258259
$(SRCDIR)/sounds/0.wav \
259260
$(SRCDIR)/sounds/1.wav \
260261
261262
ADDED src/quickfilter.js
--- src/main.mk
+++ src/main.mk
@@ -250,10 +250,11 @@
250 $(SRCDIR)/href.js \
251 $(SRCDIR)/login.js \
252 $(SRCDIR)/markdown.md \
253 $(SRCDIR)/menu.js \
254 $(SRCDIR)/merge.tcl \
 
255 $(SRCDIR)/scroll.js \
256 $(SRCDIR)/skin.js \
257 $(SRCDIR)/sorttable.js \
258 $(SRCDIR)/sounds/0.wav \
259 $(SRCDIR)/sounds/1.wav \
260
261 DDED src/quickfilter.js
--- src/main.mk
+++ src/main.mk
@@ -250,10 +250,11 @@
250 $(SRCDIR)/href.js \
251 $(SRCDIR)/login.js \
252 $(SRCDIR)/markdown.md \
253 $(SRCDIR)/menu.js \
254 $(SRCDIR)/merge.tcl \
255 $(SRCDIR)/quickfilter.js \
256 $(SRCDIR)/scroll.js \
257 $(SRCDIR)/skin.js \
258 $(SRCDIR)/sorttable.js \
259 $(SRCDIR)/sounds/0.wav \
260 $(SRCDIR)/sounds/1.wav \
261
262 DDED src/quickfilter.js
--- a/src/quickfilter.js
+++ b/src/quickfilter.js
@@ -0,0 +1,29 @@
1
+/* Javascript code that will enable quick filtering of items in tables.
2
+**
3
+** Add an input field with the id 'quickfilter' as follows:
4
+** <input type="text" id="quickfilter" placeholder="filter list..."
5
+** style="display: none">
6
+** be
7
+** functionless.
8
+**
9
+** Mark the table with the filter ilist with the class 'filterable'.
10
+** The table is expected to have a tbody around the rows that are
11
+** filtered (to avoid filterinput field is hidden at standard ('display:none'), but the script
12
+** will display it, if the list contains more than five elementsavoid fiIf shown ttering the header).
13
+**
14
+** The u
15
+** the typed text.
16
+*/
17
+
18
+const );
19
+
20
+quickfilter.addEventLisconst filterlist = documenlist tbody tr');
21
+ conet groupmatched = fals
22
+document.addEventListener('DOMContentLoaded', function(){
23
+ if (filterlist.length > 5) quickfilterLowerCase().trim('';
24
+});
25
+
26
+ter.addEven(){
27
+ quickfilter.st (row of filterrows){
28
+ const orig = rowlisterHTML;ilterlist.forEach(function(row){
29
+ const rowText = row.textContent.toLowerCase().trim(rowText.includes(filter) ? 'tabl
--- a/src/quickfilter.js
+++ b/src/quickfilter.js
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/src/quickfilter.js
+++ b/src/quickfilter.js
@@ -0,0 +1,29 @@
1 /* Javascript code that will enable quick filtering of items in tables.
2 **
3 ** Add an input field with the id 'quickfilter' as follows:
4 ** <input type="text" id="quickfilter" placeholder="filter list..."
5 ** style="display: none">
6 ** be
7 ** functionless.
8 **
9 ** Mark the table with the filter ilist with the class 'filterable'.
10 ** The table is expected to have a tbody around the rows that are
11 ** filtered (to avoid filterinput field is hidden at standard ('display:none'), but the script
12 ** will display it, if the list contains more than five elementsavoid fiIf shown ttering the header).
13 **
14 ** The u
15 ** the typed text.
16 */
17
18 const );
19
20 quickfilter.addEventLisconst filterlist = documenlist tbody tr');
21 conet groupmatched = fals
22 document.addEventListener('DOMContentLoaded', function(){
23 if (filterlist.length > 5) quickfilterLowerCase().trim('';
24 });
25
26 ter.addEven(){
27 quickfilter.st (row of filterrows){
28 const orig = rowlisterHTML;ilterlist.forEach(function(row){
29 const rowText = row.textContent.toLowerCase().trim(rowText.includes(filter) ? 'tabl
+4 -34
--- src/repolist.c
+++ src/repolist.c
@@ -161,12 +161,12 @@
161161
return 0;
162162
}else{
163163
Stmt q;
164164
double rNow;
165165
blob_append_sql(&html,
166
- "<table border='0' class='sortable' data-init-sort='1'"
167
- " data-column-types='txtxkxt' id=\"repolist\"><thead>\n"
166
+ "<table border='0' class='sortable filterlist' data-init-sort='1'"
167
+ " data-column-types='txtxkxt'><thead>\n"
168168
"<tr><th>Filename<th width='20'>"
169169
"<th>Project Name<th width='20'>"
170170
"<th>Last Modified<th width='20'>"
171171
"<th>Login Group</tr>\n"
172172
"</thead><tbody>\n");
@@ -314,27 +314,12 @@
314314
login_check_credentials();
315315
style_set_current_feature("repolist");
316316
style_header("Repository List");
317317
@ <input type="text" id="quickfilter" placeholder="filter repository list..." style="display: none">
318318
@ %s(blob_str(&html))
319
- @ <script nonce="%h(style_nonce())">
320
- @ const quickfilter = document.getElementById('quickfilter');
321
- @ const ticketlist = document.querySelectorAll('#repolist tbody tr');
322
- @
323
- @ document.addEventListener('DOMContentLoaded', function(){
324
- @ if (ticketlist.length > 5) quickfilter.style.display = '';
325
- @ });
326
- @
327
- @ quickfilter.addEventListener('input', function (){
328
- @ const filter = quickfilter.value.toLowerCase().trim();
329
- @ ticketlist.forEach(function(row){
330
- @ const rowText = row.textContent.toLowerCase().trim();
331
- @ row.style.display = rowText.includes(filter) ? 'table-row' : 'none';
332
- @ });
333
- @ });
334
- @ </script>
335319
style_table_sorter();
320
+ style_quickfilter();
336321
style_finish_page();
337322
}else{
338323
const char *zTitle = PD("FOSSIL_REPOLIST_TITLE","Repository List");
339324
/* If no repositories were found that had the "repolist_skin"
340325
** property set, then use a default skin */
@@ -347,26 +332,11 @@
347332
@ <body>
348333
@ <h1 align="center">%h(zTitle)</h1>
349334
@ <input type="text" id="quickfilter" placeholder="filter repository list..." style="display: none">
350335
@ %s(blob_str(&html))
351336
@ <script>%s(builtin_text("sorttable.js"))</script>
352
- @ <script>
353
- @ const quickfilter = document.getElementById('quickfilter');
354
- @ const ticketlist = document.querySelectorAll('#repolist tbody tr');
355
- @
356
- @ document.addEventListener('DOMContentLoaded', function(){
357
- @ if (ticketlist.length > 5) quickfilter.style.display = '';
358
- @ });
359
- @
360
- @ quickfilter.addEventListener('input', function (){
361
- @ const filter = quickfilter.value.toLowerCase().trim();
362
- @ ticketlist.forEach(function(row){
363
- @ const rowText = row.textContent.toLowerCase().trim();
364
- @ row.style.display = rowText.includes(filter) ? 'table-row' : 'none';
365
- @ });
366
- @ });
367
- @ </script>
337
+ @ <script>%s(builtin_text("quickfilter.js"))</script>
368338
@ </body>
369339
@ </html>
370340
}
371341
blob_reset(&html);
372342
cgi_reply();
373343
--- src/repolist.c
+++ src/repolist.c
@@ -161,12 +161,12 @@
161 return 0;
162 }else{
163 Stmt q;
164 double rNow;
165 blob_append_sql(&html,
166 "<table border='0' class='sortable' data-init-sort='1'"
167 " data-column-types='txtxkxt' id=\"repolist\"><thead>\n"
168 "<tr><th>Filename<th width='20'>"
169 "<th>Project Name<th width='20'>"
170 "<th>Last Modified<th width='20'>"
171 "<th>Login Group</tr>\n"
172 "</thead><tbody>\n");
@@ -314,27 +314,12 @@
314 login_check_credentials();
315 style_set_current_feature("repolist");
316 style_header("Repository List");
317 @ <input type="text" id="quickfilter" placeholder="filter repository list..." style="display: none">
318 @ %s(blob_str(&html))
319 @ <script nonce="%h(style_nonce())">
320 @ const quickfilter = document.getElementById('quickfilter');
321 @ const ticketlist = document.querySelectorAll('#repolist tbody tr');
322 @
323 @ document.addEventListener('DOMContentLoaded', function(){
324 @ if (ticketlist.length > 5) quickfilter.style.display = '';
325 @ });
326 @
327 @ quickfilter.addEventListener('input', function (){
328 @ const filter = quickfilter.value.toLowerCase().trim();
329 @ ticketlist.forEach(function(row){
330 @ const rowText = row.textContent.toLowerCase().trim();
331 @ row.style.display = rowText.includes(filter) ? 'table-row' : 'none';
332 @ });
333 @ });
334 @ </script>
335 style_table_sorter();
 
336 style_finish_page();
337 }else{
338 const char *zTitle = PD("FOSSIL_REPOLIST_TITLE","Repository List");
339 /* If no repositories were found that had the "repolist_skin"
340 ** property set, then use a default skin */
@@ -347,26 +332,11 @@
347 @ <body>
348 @ <h1 align="center">%h(zTitle)</h1>
349 @ <input type="text" id="quickfilter" placeholder="filter repository list..." style="display: none">
350 @ %s(blob_str(&html))
351 @ <script>%s(builtin_text("sorttable.js"))</script>
352 @ <script>
353 @ const quickfilter = document.getElementById('quickfilter');
354 @ const ticketlist = document.querySelectorAll('#repolist tbody tr');
355 @
356 @ document.addEventListener('DOMContentLoaded', function(){
357 @ if (ticketlist.length > 5) quickfilter.style.display = '';
358 @ });
359 @
360 @ quickfilter.addEventListener('input', function (){
361 @ const filter = quickfilter.value.toLowerCase().trim();
362 @ ticketlist.forEach(function(row){
363 @ const rowText = row.textContent.toLowerCase().trim();
364 @ row.style.display = rowText.includes(filter) ? 'table-row' : 'none';
365 @ });
366 @ });
367 @ </script>
368 @ </body>
369 @ </html>
370 }
371 blob_reset(&html);
372 cgi_reply();
373
--- src/repolist.c
+++ src/repolist.c
@@ -161,12 +161,12 @@
161 return 0;
162 }else{
163 Stmt q;
164 double rNow;
165 blob_append_sql(&html,
166 "<table border='0' class='sortable filterlist' data-init-sort='1'"
167 " data-column-types='txtxkxt'><thead>\n"
168 "<tr><th>Filename<th width='20'>"
169 "<th>Project Name<th width='20'>"
170 "<th>Last Modified<th width='20'>"
171 "<th>Login Group</tr>\n"
172 "</thead><tbody>\n");
@@ -314,27 +314,12 @@
314 login_check_credentials();
315 style_set_current_feature("repolist");
316 style_header("Repository List");
317 @ <input type="text" id="quickfilter" placeholder="filter repository list..." style="display: none">
318 @ %s(blob_str(&html))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
319 style_table_sorter();
320 style_quickfilter();
321 style_finish_page();
322 }else{
323 const char *zTitle = PD("FOSSIL_REPOLIST_TITLE","Repository List");
324 /* If no repositories were found that had the "repolist_skin"
325 ** property set, then use a default skin */
@@ -347,26 +332,11 @@
332 @ <body>
333 @ <h1 align="center">%h(zTitle)</h1>
334 @ <input type="text" id="quickfilter" placeholder="filter repository list..." style="display: none">
335 @ %s(blob_str(&html))
336 @ <script>%s(builtin_text("sorttable.js"))</script>
337 @ <script>%s(builtin_text("quickfilter.js"))</script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
338 @ </body>
339 @ </html>
340 }
341 blob_reset(&html);
342 cgi_reply();
343
+3 -19
--- src/report.c
+++ src/report.c
@@ -1225,35 +1225,19 @@
12251225
@ <br>
12261226
}
12271227
output_color_key(zClrKey, 1,
12281228
"border=\"0\" cellpadding=\"3\" cellspacing=\"0\" class=\"report\"");
12291229
@ <input type="text" id="quickfilter" placeholder="filter ticket list..." style="display: none">
1230
- @ <table border="1" cellpadding="2" cellspacing="0" class="report sortable"
1231
- @ id="ticketlist" data-column-types='' data-init-sort='0'>
1230
+ @ <table border="1" cellpadding="2" cellspacing="0" class="report sortable filterlist"
1231
+ @ data-column-types='' data-init-sort='0'>
12321232
sState.rn = rn;
12331233
sState.nCount = 0;
12341234
report_restrict_sql(&zErr1);
12351235
db_exec_readonly(g.db, zSql, generate_html, &sState, &zErr2);
12361236
report_unrestrict_sql();
12371237
@ </tbody></table>
1238
- @
1239
- @ <script nonce="%h(style_nonce())">
1240
- @ const quickfilter = document.getElementById('quickfilter');
1241
- @ const ticketlist = document.querySelectorAll('#ticketlist tbody tr');
1242
- @
1243
- @ document.addEventListener('DOMContentLoaded', function(){
1244
- @ if (ticketlist.length > 5) quickfilter.style.display = '';
1245
- @ });
1246
- @
1247
- @ quickfilter.addEventListener('input', function (){
1248
- @ const filter = quickfilter.value.toLowerCase().trim();
1249
- @ ticketlist.forEach(function(row){
1250
- @ const rowText = row.textContent.toLowerCase().trim();
1251
- @ row.style.display = rowText.includes(filter) ? 'table-row' : 'none';
1252
- @ });
1253
- @ });
1254
- @ </script>
1238
+ style_quickfilter();
12551239
if( zErr1 ){
12561240
@ <p class="reportError">Error: %h(zErr1)</p>
12571241
}else if( zErr2 ){
12581242
@ <p class="reportError">Error: %h(zErr2)</p>
12591243
}
12601244
--- src/report.c
+++ src/report.c
@@ -1225,35 +1225,19 @@
1225 @ <br>
1226 }
1227 output_color_key(zClrKey, 1,
1228 "border=\"0\" cellpadding=\"3\" cellspacing=\"0\" class=\"report\"");
1229 @ <input type="text" id="quickfilter" placeholder="filter ticket list..." style="display: none">
1230 @ <table border="1" cellpadding="2" cellspacing="0" class="report sortable"
1231 @ id="ticketlist" data-column-types='' data-init-sort='0'>
1232 sState.rn = rn;
1233 sState.nCount = 0;
1234 report_restrict_sql(&zErr1);
1235 db_exec_readonly(g.db, zSql, generate_html, &sState, &zErr2);
1236 report_unrestrict_sql();
1237 @ </tbody></table>
1238 @
1239 @ <script nonce="%h(style_nonce())">
1240 @ const quickfilter = document.getElementById('quickfilter');
1241 @ const ticketlist = document.querySelectorAll('#ticketlist tbody tr');
1242 @
1243 @ document.addEventListener('DOMContentLoaded', function(){
1244 @ if (ticketlist.length > 5) quickfilter.style.display = '';
1245 @ });
1246 @
1247 @ quickfilter.addEventListener('input', function (){
1248 @ const filter = quickfilter.value.toLowerCase().trim();
1249 @ ticketlist.forEach(function(row){
1250 @ const rowText = row.textContent.toLowerCase().trim();
1251 @ row.style.display = rowText.includes(filter) ? 'table-row' : 'none';
1252 @ });
1253 @ });
1254 @ </script>
1255 if( zErr1 ){
1256 @ <p class="reportError">Error: %h(zErr1)</p>
1257 }else if( zErr2 ){
1258 @ <p class="reportError">Error: %h(zErr2)</p>
1259 }
1260
--- src/report.c
+++ src/report.c
@@ -1225,35 +1225,19 @@
1225 @ <br>
1226 }
1227 output_color_key(zClrKey, 1,
1228 "border=\"0\" cellpadding=\"3\" cellspacing=\"0\" class=\"report\"");
1229 @ <input type="text" id="quickfilter" placeholder="filter ticket list..." style="display: none">
1230 @ <table border="1" cellpadding="2" cellspacing="0" class="report sortable filterlist"
1231 @ data-column-types='' data-init-sort='0'>
1232 sState.rn = rn;
1233 sState.nCount = 0;
1234 report_restrict_sql(&zErr1);
1235 db_exec_readonly(g.db, zSql, generate_html, &sState, &zErr2);
1236 report_unrestrict_sql();
1237 @ </tbody></table>
1238 style_quickfilter();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1239 if( zErr1 ){
1240 @ <p class="reportError">Error: %h(zErr1)</p>
1241 }else if( zErr2 ){
1242 @ <p class="reportError">Error: %h(zErr2)</p>
1243 }
1244
--- src/style.c
+++ src/style.c
@@ -877,10 +877,17 @@
877877
** Indicate that the table-sorting javascript is needed.
878878
*/
879879
void style_table_sorter(void){
880880
builtin_request_js("sorttable.js");
881881
}
882
+
883
+/*
884
+** Indicate that the quickfilter javascript is needed.
885
+*/
886
+void style_quickfilter(void){
887
+ builtin_request_js("quickfilter.js");
888
+}
882889
883890
/*
884891
** Generate code to load all required javascript files.
885892
*/
886893
static void style_load_all_js_files(void){
887894
--- src/style.c
+++ src/style.c
@@ -877,10 +877,17 @@
877 ** Indicate that the table-sorting javascript is needed.
878 */
879 void style_table_sorter(void){
880 builtin_request_js("sorttable.js");
881 }
 
 
 
 
 
 
 
882
883 /*
884 ** Generate code to load all required javascript files.
885 */
886 static void style_load_all_js_files(void){
887
--- src/style.c
+++ src/style.c
@@ -877,10 +877,17 @@
877 ** Indicate that the table-sorting javascript is needed.
878 */
879 void style_table_sorter(void){
880 builtin_request_js("sorttable.js");
881 }
882
883 /*
884 ** Indicate that the quickfilter javascript is needed.
885 */
886 void style_quickfilter(void){
887 builtin_request_js("quickfilter.js");
888 }
889
890 /*
891 ** Generate code to load all required javascript files.
892 */
893 static void style_load_all_js_files(void){
894
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -636,10 +636,11 @@
636636
$(SRCDIR)/href.js \
637637
$(SRCDIR)/login.js \
638638
$(SRCDIR)/markdown.md \
639639
$(SRCDIR)/menu.js \
640640
$(SRCDIR)/merge.tcl \
641
+ $(SRCDIR)/quickfilter.js \
641642
$(SRCDIR)/scroll.js \
642643
$(SRCDIR)/skin.js \
643644
$(SRCDIR)/sorttable.js \
644645
$(SRCDIR)/sounds/0.wav \
645646
$(SRCDIR)/sounds/1.wav \
646647
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -636,10 +636,11 @@
636 $(SRCDIR)/href.js \
637 $(SRCDIR)/login.js \
638 $(SRCDIR)/markdown.md \
639 $(SRCDIR)/menu.js \
640 $(SRCDIR)/merge.tcl \
 
641 $(SRCDIR)/scroll.js \
642 $(SRCDIR)/skin.js \
643 $(SRCDIR)/sorttable.js \
644 $(SRCDIR)/sounds/0.wav \
645 $(SRCDIR)/sounds/1.wav \
646
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -636,10 +636,11 @@
636 $(SRCDIR)/href.js \
637 $(SRCDIR)/login.js \
638 $(SRCDIR)/markdown.md \
639 $(SRCDIR)/menu.js \
640 $(SRCDIR)/merge.tcl \
641 $(SRCDIR)/quickfilter.js \
642 $(SRCDIR)/scroll.js \
643 $(SRCDIR)/skin.js \
644 $(SRCDIR)/sorttable.js \
645 $(SRCDIR)/sounds/0.wav \
646 $(SRCDIR)/sounds/1.wav \
647
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -596,10 +596,11 @@
596596
"$(SRCDIR)\href.js" \
597597
"$(SRCDIR)\login.js" \
598598
"$(SRCDIR)\markdown.md" \
599599
"$(SRCDIR)\menu.js" \
600600
"$(SRCDIR)\merge.tcl" \
601
+ "$(SRCDIR)\quickfilter.js" \
601602
"$(SRCDIR)\scroll.js" \
602603
"$(SRCDIR)\skin.js" \
603604
"$(SRCDIR)\sorttable.js" \
604605
"$(SRCDIR)\sounds\0.wav" \
605606
"$(SRCDIR)\sounds\1.wav" \
@@ -1229,10 +1230,11 @@
12291230
echo "$(SRCDIR)\href.js" >> $@
12301231
echo "$(SRCDIR)\login.js" >> $@
12311232
echo "$(SRCDIR)\markdown.md" >> $@
12321233
echo "$(SRCDIR)\menu.js" >> $@
12331234
echo "$(SRCDIR)\merge.tcl" >> $@
1235
+ echo "$(SRCDIR)\quickfilter.js" >> $@
12341236
echo "$(SRCDIR)\scroll.js" >> $@
12351237
echo "$(SRCDIR)\skin.js" >> $@
12361238
echo "$(SRCDIR)\sorttable.js" >> $@
12371239
echo "$(SRCDIR)\sounds/0.wav" >> $@
12381240
echo "$(SRCDIR)\sounds/1.wav" >> $@
12391241
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -596,10 +596,11 @@
596 "$(SRCDIR)\href.js" \
597 "$(SRCDIR)\login.js" \
598 "$(SRCDIR)\markdown.md" \
599 "$(SRCDIR)\menu.js" \
600 "$(SRCDIR)\merge.tcl" \
 
601 "$(SRCDIR)\scroll.js" \
602 "$(SRCDIR)\skin.js" \
603 "$(SRCDIR)\sorttable.js" \
604 "$(SRCDIR)\sounds\0.wav" \
605 "$(SRCDIR)\sounds\1.wav" \
@@ -1229,10 +1230,11 @@
1229 echo "$(SRCDIR)\href.js" >> $@
1230 echo "$(SRCDIR)\login.js" >> $@
1231 echo "$(SRCDIR)\markdown.md" >> $@
1232 echo "$(SRCDIR)\menu.js" >> $@
1233 echo "$(SRCDIR)\merge.tcl" >> $@
 
1234 echo "$(SRCDIR)\scroll.js" >> $@
1235 echo "$(SRCDIR)\skin.js" >> $@
1236 echo "$(SRCDIR)\sorttable.js" >> $@
1237 echo "$(SRCDIR)\sounds/0.wav" >> $@
1238 echo "$(SRCDIR)\sounds/1.wav" >> $@
1239
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -596,10 +596,11 @@
596 "$(SRCDIR)\href.js" \
597 "$(SRCDIR)\login.js" \
598 "$(SRCDIR)\markdown.md" \
599 "$(SRCDIR)\menu.js" \
600 "$(SRCDIR)\merge.tcl" \
601 "$(SRCDIR)\quickfilter.js" \
602 "$(SRCDIR)\scroll.js" \
603 "$(SRCDIR)\skin.js" \
604 "$(SRCDIR)\sorttable.js" \
605 "$(SRCDIR)\sounds\0.wav" \
606 "$(SRCDIR)\sounds\1.wav" \
@@ -1229,10 +1230,11 @@
1230 echo "$(SRCDIR)\href.js" >> $@
1231 echo "$(SRCDIR)\login.js" >> $@
1232 echo "$(SRCDIR)\markdown.md" >> $@
1233 echo "$(SRCDIR)\menu.js" >> $@
1234 echo "$(SRCDIR)\merge.tcl" >> $@
1235 echo "$(SRCDIR)\quickfilter.js" >> $@
1236 echo "$(SRCDIR)\scroll.js" >> $@
1237 echo "$(SRCDIR)\skin.js" >> $@
1238 echo "$(SRCDIR)\sorttable.js" >> $@
1239 echo "$(SRCDIR)\sounds/0.wav" >> $@
1240 echo "$(SRCDIR)\sounds/1.wav" >> $@
1241

Keyboard Shortcuts

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