Fossil SCM
Diff toggles: add a label to the checkbox to make it easier to click, add an 'all' button which toggles all diffs, and remove the toggle from the /fdiff page because it only has a single diff block.
Commit
a11d24547826591f0521308560fd174a46edd405683a2df2a2d55bfb0c2b0deb
Parent
2c0714f8d5e377a…
4 files changed
+9
-4
+24
-8
+3
-1
+6
-3
+9
-4
| --- src/default.css | ||
| +++ src/default.css | ||
| @@ -748,10 +748,19 @@ | ||
| 748 | 748 | border-bottom: 3px solid gold; |
| 749 | 749 | } |
| 750 | 750 | body.tkt div.content ol.tkt-changes > li:target > ol { |
| 751 | 751 | border-left: 1px solid gold; |
| 752 | 752 | } |
| 753 | +body.cpage-info .file-change-line, | |
| 754 | +body.cpage-vdiff .file-change-line { | |
| 755 | + margin-top: 16px; | |
| 756 | + margin-bottom: 16px; | |
| 757 | + margin-right: 1em /* keep it from nudging right up against the scrollbar-reveal zone */; | |
| 758 | + display: flex; | |
| 759 | + flex-direction: row; | |
| 760 | + justify-content: space-between; | |
| 761 | +} | |
| 753 | 762 | |
| 754 | 763 | span.modpending { |
| 755 | 764 | color: #b03800; |
| 756 | 765 | font-style: italic; |
| 757 | 766 | } |
| @@ -1818,14 +1827,10 @@ | ||
| 1818 | 1827 | } |
| 1819 | 1828 | body.fossil-dark-style .settings-icon { |
| 1820 | 1829 | filter: invert(100%); |
| 1821 | 1830 | } |
| 1822 | 1831 | |
| 1823 | -input[type="checkbox"].diff-toggle { | |
| 1824 | - float: right; | |
| 1825 | -} | |
| 1826 | - | |
| 1827 | 1832 | body.branch .brlist > table > tbody > tr:hover:not(.selected), |
| 1828 | 1833 | body.branch .brlist > table > tbody > tr.selected { |
| 1829 | 1834 | background-color: #ffc; |
| 1830 | 1835 | } |
| 1831 | 1836 | body.branch .brlist > table > tbody td:first-child > input { |
| 1832 | 1837 |
| --- src/default.css | |
| +++ src/default.css | |
| @@ -748,10 +748,19 @@ | |
| 748 | border-bottom: 3px solid gold; |
| 749 | } |
| 750 | body.tkt div.content ol.tkt-changes > li:target > ol { |
| 751 | border-left: 1px solid gold; |
| 752 | } |
| 753 | |
| 754 | span.modpending { |
| 755 | color: #b03800; |
| 756 | font-style: italic; |
| 757 | } |
| @@ -1818,14 +1827,10 @@ | |
| 1818 | } |
| 1819 | body.fossil-dark-style .settings-icon { |
| 1820 | filter: invert(100%); |
| 1821 | } |
| 1822 | |
| 1823 | input[type="checkbox"].diff-toggle { |
| 1824 | float: right; |
| 1825 | } |
| 1826 | |
| 1827 | body.branch .brlist > table > tbody > tr:hover:not(.selected), |
| 1828 | body.branch .brlist > table > tbody > tr.selected { |
| 1829 | background-color: #ffc; |
| 1830 | } |
| 1831 | body.branch .brlist > table > tbody td:first-child > input { |
| 1832 |
| --- src/default.css | |
| +++ src/default.css | |
| @@ -748,10 +748,19 @@ | |
| 748 | border-bottom: 3px solid gold; |
| 749 | } |
| 750 | body.tkt div.content ol.tkt-changes > li:target > ol { |
| 751 | border-left: 1px solid gold; |
| 752 | } |
| 753 | body.cpage-info .file-change-line, |
| 754 | body.cpage-vdiff .file-change-line { |
| 755 | margin-top: 16px; |
| 756 | margin-bottom: 16px; |
| 757 | margin-right: 1em /* keep it from nudging right up against the scrollbar-reveal zone */; |
| 758 | display: flex; |
| 759 | flex-direction: row; |
| 760 | justify-content: space-between; |
| 761 | } |
| 762 | |
| 763 | span.modpending { |
| 764 | color: #b03800; |
| 765 | font-style: italic; |
| 766 | } |
| @@ -1818,14 +1827,10 @@ | |
| 1827 | } |
| 1828 | body.fossil-dark-style .settings-icon { |
| 1829 | filter: invert(100%); |
| 1830 | } |
| 1831 | |
| 1832 | body.branch .brlist > table > tbody > tr:hover:not(.selected), |
| 1833 | body.branch .brlist > table > tbody > tr.selected { |
| 1834 | background-color: #ffc; |
| 1835 | } |
| 1836 | body.branch .brlist > table > tbody td:first-child > input { |
| 1837 |
+24
-8
| --- src/fossil.diff.js | ||
| +++ src/fossil.diff.js | ||
| @@ -6,23 +6,39 @@ | ||
| 6 | 6 | /** |
| 7 | 7 | Adds toggle checkboxes to each file entry in the diff views for |
| 8 | 8 | /info and similar pages. |
| 9 | 9 | */ |
| 10 | 10 | const D = window.fossil.dom; |
| 11 | - const isFdiff = !!document.querySelector('body.fdiff'); | |
| 11 | + const allToggles = [/*collection of all diff-toggle checkboxes */]; | |
| 12 | 12 | const addToggle = function(diffElem){ |
| 13 | 13 | const sib = diffElem.previousElementSibling, |
| 14 | - btn = sib ? D.addClass(D.checkbox(true), 'diff-toggle') : 0; | |
| 14 | + btnOne = sib ? D.addClass(D.checkbox(true), 'diff-toggle') : 0; | |
| 15 | 15 | if(!sib) return; |
| 16 | - if(isFdiff) sib.parentElement.insertBefore( | |
| 17 | - D.append(D.div(),btn),sib.nextElementSibling); | |
| 18 | - else D.append(sib,btn); | |
| 19 | - btn.addEventListener('click', function(){ | |
| 20 | - diffElem.classList.toggle('hidden'); | |
| 16 | + const lblToggle = D.append(D.label(null, " Toggle "), btnOne); | |
| 17 | + const wrapper = D.append(D.span(), lblToggle); | |
| 18 | + const btnAll = D.button("all"); | |
| 19 | + btnAll.$cb = btnOne; | |
| 20 | + allToggles.push(btnOne); | |
| 21 | + D.append(sib, D.append(wrapper, lblToggle, D.text(" "), btnAll)); | |
| 22 | + btnOne.addEventListener('change', function(){ | |
| 23 | + diffElem.classList[this.checked ? 'remove' : 'add']('hidden'); | |
| 24 | + }, false); | |
| 25 | + btnAll.addEventListener('click', function(){ | |
| 26 | + /* Toggle all entries to match this line's new state. Note that | |
| 27 | + we use click() instead of cb.checked=... so that the | |
| 28 | + on-change event handler fires. */ | |
| 29 | + const checked = !this.$cb.checked; | |
| 30 | + allToggles.forEach( (cb)=>{ | |
| 31 | + if(cb.checked!==checked) cb.click(); | |
| 32 | + }); | |
| 21 | 33 | }, false); |
| 22 | 34 | }; |
| 23 | - document.querySelectorAll('table.diff').forEach(addToggle); | |
| 35 | + if( !document.querySelector('body.fdiff') ){ | |
| 36 | + /* Don't show the diff toggle button for /fdiff because it only | |
| 37 | + has a single file to show (and also a different DOM layout). */ | |
| 38 | + document.querySelectorAll('table.diff').forEach(addToggle); | |
| 39 | + } | |
| 24 | 40 | }); |
| 25 | 41 | |
| 26 | 42 | window.fossil.onPageLoad(function(){ |
| 27 | 43 | const F = window.fossil, D = F.dom; |
| 28 | 44 | const Diff = F.diff = { |
| 29 | 45 |
| --- src/fossil.diff.js | |
| +++ src/fossil.diff.js | |
| @@ -6,23 +6,39 @@ | |
| 6 | /** |
| 7 | Adds toggle checkboxes to each file entry in the diff views for |
| 8 | /info and similar pages. |
| 9 | */ |
| 10 | const D = window.fossil.dom; |
| 11 | const isFdiff = !!document.querySelector('body.fdiff'); |
| 12 | const addToggle = function(diffElem){ |
| 13 | const sib = diffElem.previousElementSibling, |
| 14 | btn = sib ? D.addClass(D.checkbox(true), 'diff-toggle') : 0; |
| 15 | if(!sib) return; |
| 16 | if(isFdiff) sib.parentElement.insertBefore( |
| 17 | D.append(D.div(),btn),sib.nextElementSibling); |
| 18 | else D.append(sib,btn); |
| 19 | btn.addEventListener('click', function(){ |
| 20 | diffElem.classList.toggle('hidden'); |
| 21 | }, false); |
| 22 | }; |
| 23 | document.querySelectorAll('table.diff').forEach(addToggle); |
| 24 | }); |
| 25 | |
| 26 | window.fossil.onPageLoad(function(){ |
| 27 | const F = window.fossil, D = F.dom; |
| 28 | const Diff = F.diff = { |
| 29 |
| --- src/fossil.diff.js | |
| +++ src/fossil.diff.js | |
| @@ -6,23 +6,39 @@ | |
| 6 | /** |
| 7 | Adds toggle checkboxes to each file entry in the diff views for |
| 8 | /info and similar pages. |
| 9 | */ |
| 10 | const D = window.fossil.dom; |
| 11 | const allToggles = [/*collection of all diff-toggle checkboxes */]; |
| 12 | const addToggle = function(diffElem){ |
| 13 | const sib = diffElem.previousElementSibling, |
| 14 | btnOne = sib ? D.addClass(D.checkbox(true), 'diff-toggle') : 0; |
| 15 | if(!sib) return; |
| 16 | const lblToggle = D.append(D.label(null, " Toggle "), btnOne); |
| 17 | const wrapper = D.append(D.span(), lblToggle); |
| 18 | const btnAll = D.button("all"); |
| 19 | btnAll.$cb = btnOne; |
| 20 | allToggles.push(btnOne); |
| 21 | D.append(sib, D.append(wrapper, lblToggle, D.text(" "), btnAll)); |
| 22 | btnOne.addEventListener('change', function(){ |
| 23 | diffElem.classList[this.checked ? 'remove' : 'add']('hidden'); |
| 24 | }, false); |
| 25 | btnAll.addEventListener('click', function(){ |
| 26 | /* Toggle all entries to match this line's new state. Note that |
| 27 | we use click() instead of cb.checked=... so that the |
| 28 | on-change event handler fires. */ |
| 29 | const checked = !this.$cb.checked; |
| 30 | allToggles.forEach( (cb)=>{ |
| 31 | if(cb.checked!==checked) cb.click(); |
| 32 | }); |
| 33 | }, false); |
| 34 | }; |
| 35 | if( !document.querySelector('body.fdiff') ){ |
| 36 | /* Don't show the diff toggle button for /fdiff because it only |
| 37 | has a single file to show (and also a different DOM layout). */ |
| 38 | document.querySelectorAll('table.diff').forEach(addToggle); |
| 39 | } |
| 40 | }); |
| 41 | |
| 42 | window.fossil.onPageLoad(function(){ |
| 43 | const F = window.fossil, D = F.dom; |
| 44 | const Diff = F.diff = { |
| 45 |
+3
-1
| --- src/fossil.dom.js | ||
| +++ src/fossil.dom.js | ||
| @@ -87,11 +87,13 @@ | ||
| 87 | 87 | const rc = document.createElement('label'); |
| 88 | 88 | if(forElem){ |
| 89 | 89 | if(forElem instanceof HTMLElement){ |
| 90 | 90 | forElem = this.attr(forElem, 'id'); |
| 91 | 91 | } |
| 92 | - dom.attr(rc, 'for', forElem); | |
| 92 | + if(forElem){ | |
| 93 | + dom.attr(rc, 'for', forElem); | |
| 94 | + } | |
| 93 | 95 | } |
| 94 | 96 | if(text) this.append(rc, text); |
| 95 | 97 | return rc; |
| 96 | 98 | }; |
| 97 | 99 | /** |
| 98 | 100 |
| --- src/fossil.dom.js | |
| +++ src/fossil.dom.js | |
| @@ -87,11 +87,13 @@ | |
| 87 | const rc = document.createElement('label'); |
| 88 | if(forElem){ |
| 89 | if(forElem instanceof HTMLElement){ |
| 90 | forElem = this.attr(forElem, 'id'); |
| 91 | } |
| 92 | dom.attr(rc, 'for', forElem); |
| 93 | } |
| 94 | if(text) this.append(rc, text); |
| 95 | return rc; |
| 96 | }; |
| 97 | /** |
| 98 |
| --- src/fossil.dom.js | |
| +++ src/fossil.dom.js | |
| @@ -87,11 +87,13 @@ | |
| 87 | const rc = document.createElement('label'); |
| 88 | if(forElem){ |
| 89 | if(forElem instanceof HTMLElement){ |
| 90 | forElem = this.attr(forElem, 'id'); |
| 91 | } |
| 92 | if(forElem){ |
| 93 | dom.attr(rc, 'for', forElem); |
| 94 | } |
| 95 | } |
| 96 | if(text) this.append(rc, text); |
| 97 | return rc; |
| 98 | }; |
| 99 | /** |
| 100 |
+6
-3
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -372,11 +372,13 @@ | ||
| 372 | 372 | const char *zNew, /* blob.uuid after change. NULL for deletes */ |
| 373 | 373 | const char *zOldName, /* Prior name. NULL if no name change. */ |
| 374 | 374 | DiffConfig *pCfg, /* Flags for text_diff() or NULL to omit all */ |
| 375 | 375 | int mperm /* executable or symlink permission for zNew */ |
| 376 | 376 | ){ |
| 377 | - @ <p> | |
| 377 | + @ <div class='file-change-line'><span> | |
| 378 | + /* Maintenance reminder: the extra level of SPAN is for | |
| 379 | + ** arranging new elements via JS. */ | |
| 378 | 380 | if( !g.perm.Hyperlink ){ |
| 379 | 381 | if( zNew==0 ){ |
| 380 | 382 | @ Deleted %h(zName). |
| 381 | 383 | }else if( zOld==0 ){ |
| 382 | 384 | @ Added %h(zName). |
| @@ -391,10 +393,11 @@ | ||
| 391 | 393 | @ %h(zName) became a regular file. |
| 392 | 394 | } |
| 393 | 395 | }else{ |
| 394 | 396 | @ Changes to %h(zName). |
| 395 | 397 | } |
| 398 | + @ </span></div> | |
| 396 | 399 | if( pCfg ){ |
| 397 | 400 | append_diff(zOld, zNew, pCfg); |
| 398 | 401 | } |
| 399 | 402 | }else{ |
| 400 | 403 | if( zOld && zNew ){ |
| @@ -436,20 +439,20 @@ | ||
| 436 | 439 | @ %h(zName)</a> version %z(href("%R/artifact/%!S",zOld))[%S(zOld)]</a>. |
| 437 | 440 | }else{ |
| 438 | 441 | @ Added %z(href("%R/finfo?name=%T&m=%!S&ci=%!S",zName,zNew,zCkin))\ |
| 439 | 442 | @ %h(zName)</a> version %z(href("%R/artifact/%!S",zNew))[%S(zNew)]</a>. |
| 440 | 443 | } |
| 444 | + @ </span></div> | |
| 441 | 445 | if( zOld && zNew && fossil_strcmp(zOld,zNew)!=0 ){ |
| 442 | 446 | if( pCfg ){ |
| 443 | 447 | append_diff(zOld, zNew, pCfg); |
| 444 | - }else{ | |
| 448 | + }else{ | |
| 445 | 449 | @ |
| 446 | 450 | @ %z(href("%R/fdiff?v1=%!S&v2=%!S",zOld,zNew))[diff]</a> |
| 447 | 451 | } |
| 448 | 452 | } |
| 449 | 453 | } |
| 450 | - @ </p> | |
| 451 | 454 | } |
| 452 | 455 | |
| 453 | 456 | /* |
| 454 | 457 | ** Generate javascript to enhance HTML diffs. |
| 455 | 458 | */ |
| 456 | 459 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -372,11 +372,13 @@ | |
| 372 | const char *zNew, /* blob.uuid after change. NULL for deletes */ |
| 373 | const char *zOldName, /* Prior name. NULL if no name change. */ |
| 374 | DiffConfig *pCfg, /* Flags for text_diff() or NULL to omit all */ |
| 375 | int mperm /* executable or symlink permission for zNew */ |
| 376 | ){ |
| 377 | @ <p> |
| 378 | if( !g.perm.Hyperlink ){ |
| 379 | if( zNew==0 ){ |
| 380 | @ Deleted %h(zName). |
| 381 | }else if( zOld==0 ){ |
| 382 | @ Added %h(zName). |
| @@ -391,10 +393,11 @@ | |
| 391 | @ %h(zName) became a regular file. |
| 392 | } |
| 393 | }else{ |
| 394 | @ Changes to %h(zName). |
| 395 | } |
| 396 | if( pCfg ){ |
| 397 | append_diff(zOld, zNew, pCfg); |
| 398 | } |
| 399 | }else{ |
| 400 | if( zOld && zNew ){ |
| @@ -436,20 +439,20 @@ | |
| 436 | @ %h(zName)</a> version %z(href("%R/artifact/%!S",zOld))[%S(zOld)]</a>. |
| 437 | }else{ |
| 438 | @ Added %z(href("%R/finfo?name=%T&m=%!S&ci=%!S",zName,zNew,zCkin))\ |
| 439 | @ %h(zName)</a> version %z(href("%R/artifact/%!S",zNew))[%S(zNew)]</a>. |
| 440 | } |
| 441 | if( zOld && zNew && fossil_strcmp(zOld,zNew)!=0 ){ |
| 442 | if( pCfg ){ |
| 443 | append_diff(zOld, zNew, pCfg); |
| 444 | }else{ |
| 445 | @ |
| 446 | @ %z(href("%R/fdiff?v1=%!S&v2=%!S",zOld,zNew))[diff]</a> |
| 447 | } |
| 448 | } |
| 449 | } |
| 450 | @ </p> |
| 451 | } |
| 452 | |
| 453 | /* |
| 454 | ** Generate javascript to enhance HTML diffs. |
| 455 | */ |
| 456 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -372,11 +372,13 @@ | |
| 372 | const char *zNew, /* blob.uuid after change. NULL for deletes */ |
| 373 | const char *zOldName, /* Prior name. NULL if no name change. */ |
| 374 | DiffConfig *pCfg, /* Flags for text_diff() or NULL to omit all */ |
| 375 | int mperm /* executable or symlink permission for zNew */ |
| 376 | ){ |
| 377 | @ <div class='file-change-line'><span> |
| 378 | /* Maintenance reminder: the extra level of SPAN is for |
| 379 | ** arranging new elements via JS. */ |
| 380 | if( !g.perm.Hyperlink ){ |
| 381 | if( zNew==0 ){ |
| 382 | @ Deleted %h(zName). |
| 383 | }else if( zOld==0 ){ |
| 384 | @ Added %h(zName). |
| @@ -391,10 +393,11 @@ | |
| 393 | @ %h(zName) became a regular file. |
| 394 | } |
| 395 | }else{ |
| 396 | @ Changes to %h(zName). |
| 397 | } |
| 398 | @ </span></div> |
| 399 | if( pCfg ){ |
| 400 | append_diff(zOld, zNew, pCfg); |
| 401 | } |
| 402 | }else{ |
| 403 | if( zOld && zNew ){ |
| @@ -436,20 +439,20 @@ | |
| 439 | @ %h(zName)</a> version %z(href("%R/artifact/%!S",zOld))[%S(zOld)]</a>. |
| 440 | }else{ |
| 441 | @ Added %z(href("%R/finfo?name=%T&m=%!S&ci=%!S",zName,zNew,zCkin))\ |
| 442 | @ %h(zName)</a> version %z(href("%R/artifact/%!S",zNew))[%S(zNew)]</a>. |
| 443 | } |
| 444 | @ </span></div> |
| 445 | if( zOld && zNew && fossil_strcmp(zOld,zNew)!=0 ){ |
| 446 | if( pCfg ){ |
| 447 | append_diff(zOld, zNew, pCfg); |
| 448 | }else{ |
| 449 | @ |
| 450 | @ %z(href("%R/fdiff?v1=%!S&v2=%!S",zOld,zNew))[diff]</a> |
| 451 | } |
| 452 | } |
| 453 | } |
| 454 | } |
| 455 | |
| 456 | /* |
| 457 | ** Generate javascript to enhance HTML diffs. |
| 458 | */ |
| 459 |