@@ -259,8 +259,12 @@ function sortTable(e) {
259
259
if ( updateInProgress )
260
260
return
261
261
262
- const header = e . target
263
- const idx = Array . from ( header . parentNode . children ) . indexOf ( e . target )
262
+ // Ignore click on the collapse toggle inside the <th>
263
+ if ( e . target . classList . contains ( 'collapse-toggle' ) )
264
+ return
265
+
266
+ const header = e . currentTarget
267
+ const idx = Array . from ( header . parentNode . children ) . indexOf ( e . currentTarget )
264
268
const rows = Array . from ( tableEl . querySelectorAll ( 'tr' ) ) . slice ( 2 )
265
269
const desc = header . classList . contains ( 'ascending' )
266
270
const body = rows [ 0 ] . parentElement
@@ -291,22 +295,39 @@ function sortTable(e) {
291
295
header . classList . add ( desc ? 'descending' : 'ascending' )
292
296
}
293
297
298
+ function toggleCollapseColumn ( e ) {
299
+ if ( updateInProgress )
300
+ return
301
+
302
+ const columnName = e . currentTarget . parentElement . dataset . column
303
+ const collapsed = ( tableEl . dataset . collapse ?? '' ) . trim ( ) . split ( ' ' ) . filter ( Boolean )
304
+
305
+ if ( collapsed . includes ( columnName ) ) {
306
+ collapsed . splice ( collapsed . indexOf ( columnName ) , 1 )
307
+ } else {
308
+ collapsed . push ( columnName )
309
+ }
310
+
311
+ tableEl . dataset . collapse = collapsed . join ( ' ' )
312
+ localStorage . setItem ( 'collapsedColumns' , tableEl . dataset . collapse )
313
+ }
314
+
294
315
function fillRow ( row , tag , sc , maxArgs ) {
295
- const ndec = document . createElement ( 'td' )
296
- const nhex = document . createElement ( 'td' )
297
- const name = document . createElement ( 'td' )
298
- const sym = document . createElement ( 'td' )
299
- const loc = document . createElement ( 'td' )
300
- const kcfg = document . createElement ( 'td' )
301
- let argsLeft = compactSignature ? 0 : sc . signature ?. length ? maxArgs - sc . signature ?. length : maxArgs ;
316
+ const cells = [
317
+ document . createElement ( 'td' ) , document . createElement ( 'td' ) ,
318
+ document . createElement ( 'td' ) , document . createElement ( 'td' ) ,
319
+ document . createElement ( 'td' ) , document . createElement ( 'td' )
320
+ ]
321
+ const [ ndec , nhex , name , sym , loc , kcfg ] = cells
322
+ let argsLeft = compactSignature ? 0 : sc . signature ?. length ? maxArgs - sc . signature ?. length : maxArgs
302
323
303
324
row . addEventListener ( 'click' , highlightRow )
304
- row . appendChild ( ndec )
305
- row . appendChild ( nhex )
306
- row . appendChild ( name )
307
- row . appendChild ( sym )
308
- row . appendChild ( loc )
309
- row . appendChild ( kcfg )
325
+ cells . forEach ( el => row . appendChild ( el ) )
326
+
327
+ name . dataset . column = ' name'
328
+ sym . dataset . column = 'symbol'
329
+ loc . dataset . column = 'location'
330
+ kcfg . dataset . column = 'kconfig'
310
331
311
332
ndec . textContent = sc . number
312
333
nhex . textContent = `0x${ sc . number . toString ( 16 ) } `
@@ -355,11 +376,13 @@ function fillRow(row, tag, sc, maxArgs) {
355
376
const sig = document . createElement ( 'td' )
356
377
sig . textContent = 'unknown signature'
357
378
sig . classList . add ( 'unknown' )
379
+ sig . dataset . column = 'signature'
358
380
row . appendChild ( sig )
359
381
argsLeft --
360
382
} else if ( compactSignature ) {
361
383
// Compact signature: single column containing comma-separated args
362
384
const sig = document . createElement ( 'td' )
385
+ sig . dataset . column = 'signature'
363
386
row . appendChild ( sig )
364
387
365
388
if ( sc . signature . length > 0 ) {
@@ -408,13 +431,17 @@ function fillRow(row, tag, sc, maxArgs) {
408
431
td . appendChild ( name )
409
432
}
410
433
434
+ td . dataset . column = 'signature'
411
435
row . appendChild ( td )
412
436
}
413
437
}
414
438
415
439
// Append multiple <td> elements to be able to style column borders
416
- for ( let i = 0 ; i < argsLeft ; i ++ )
417
- row . appendChild ( document . createElement ( 'td' ) )
440
+ for ( let i = 0 ; i < argsLeft ; i ++ ) {
441
+ const td = document . createElement ( 'td' )
442
+ td . dataset . column = 'signature'
443
+ row . appendChild ( td )
444
+ }
418
445
}
419
446
420
447
function fillTable ( syscallTable , tag ) {
@@ -423,7 +450,7 @@ function fillTable(syscallTable, tag) {
423
450
const maxArgs = syscallTable . syscalls . reduce ( ( acc , sc ) => Math . max ( acc , sc . signature ?. length || 0 ) , 0 )
424
451
const [ header1 , header2 ] = tableEl . querySelectorAll ( 'tr' )
425
452
426
- compactSigToggleEl . textContent = compactSignature ? 'expand ' : 'collapse '
453
+ compactSigToggleEl . textContent = compactSignature ? 'compact ' : 'extended '
427
454
header1 . children [ 1 ] . colSpan = maxArgs
428
455
header2 . children [ 0 ] . textContent = `Number${ numReg ? '\u00a0(' + numReg + ')' : '' } `
429
456
@@ -434,7 +461,11 @@ function fillTable(syscallTable, tag) {
434
461
if ( compactSignature ) {
435
462
// Compact signature: single column containing comma-separated args
436
463
const th = document . createElement ( 'th' )
437
- th . textContent = `Arguments (${ argRegs . join ( ', ' ) } )`
464
+ const title = document . createElement ( 'span' )
465
+ title . classList . add ( 'collapsible' )
466
+ title . textContent = `Arguments (${ argRegs . join ( ', ' ) } )`
467
+ th . dataset . column = 'signature'
468
+ th . appendChild ( title )
438
469
header2 . appendChild ( th )
439
470
} else {
440
471
// Expanded signature: one column per argument
@@ -443,7 +474,11 @@ function fillTable(syscallTable, tag) {
443
474
// that should never happen (why publish such a table to begin with?).
444
475
for ( let i = 0 ; i < maxArgs ; i ++ ) {
445
476
const th = document . createElement ( 'th' )
446
- th . textContent = `Arg\u00a0${ i + 1 } \u00a0(${ argRegs [ i ] } )`
477
+ const title = document . createElement ( 'span' )
478
+ title . classList . add ( 'collapsible' )
479
+ title . textContent = `Arg\u00a0${ i + 1 } \u00a0(${ argRegs [ i ] } )`
480
+ th . dataset . column = 'signature'
481
+ th . appendChild ( title )
447
482
header2 . appendChild ( th )
448
483
}
449
484
}
@@ -459,7 +494,6 @@ function fillTable(syscallTable, tag) {
459
494
tableEl . appendChild ( row )
460
495
}
461
496
462
- tableEl . querySelectorAll ( 'th.sortable' ) . forEach ( el => el . addEventListener ( 'click' , sortTable ) )
463
497
document . getElementById ( 'container' ) . classList . remove ( 'invisible' )
464
498
document . getElementById ( 'loading' ) . classList . add ( 'invisible' )
465
499
}
@@ -468,10 +502,10 @@ function toggleCompactSignature() {
468
502
if ( updateInProgress )
469
503
return
470
504
471
- // Could be optimized... but I could also not care less for now
472
505
const tag = getSelection ( ) . pop ( )
473
506
compactSignature = ! compactSignature
474
507
localStorage . setItem ( 'compactSignature' , compactSignature )
508
+ // Could be optimized... but I could also not care less for now
475
509
fillTable ( currentSyscallTable , tag )
476
510
}
477
511
@@ -562,12 +596,17 @@ function toggleTheme() {
562
596
}
563
597
564
598
function restoreSettings ( ) {
565
- let theme = localStorage . getItem ( 'theme' )
599
+ /* This one is global */
566
600
compactSignature = localStorage . getItem ( 'compactSignature' ) === 'true'
567
601
602
+ let theme = localStorage . getItem ( 'theme' )
568
603
if ( ! theme )
569
604
theme = window . matchMedia ?. ( '(prefers-color-scheme: dark)' ) ?. matches ? 'dark' : 'light' ;
570
605
606
+ const collapsedColumns = localStorage . getItem ( 'collapsedColumns' )
607
+ if ( collapsedColumns )
608
+ tableEl . dataset . collapse = collapsedColumns
609
+
571
610
setTheme ( theme )
572
611
}
573
612
@@ -605,6 +644,8 @@ async function setup() {
605
644
tagSelectEl . addEventListener ( 'change' , tagSelectChangeHandler )
606
645
themeToggleEl . addEventListener ( 'click' , toggleTheme )
607
646
compactSigToggleEl . addEventListener ( 'click' , toggleCompactSignature )
647
+ tableEl . querySelectorAll ( 'th.sortable' ) . forEach ( el => el . addEventListener ( 'click' , sortTable ) )
648
+ tableEl . querySelectorAll ( 'th > .collapse-toggle' ) . forEach ( el => el . addEventListener ( 'click' , toggleCollapseColumn ) )
608
649
window . addEventListener ( 'popstate' , historyPopStateHandler )
609
650
}
610
651
0 commit comments