@@ -1,43 +1,81 @@
1 1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
2 2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
diff-related JS APIs for fossil.
3 3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
4 4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"use strict";
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Locate the UI element (if any) into which we can inject some diff-related
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UI controls. */
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ window.fossil.onPageLoad(function(){
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const potentialParents = window.fossil.page.diffControlContainers = [
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* CSS selectors for possible parents for injected diff-related UI
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ controls. */
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Put the most likely pages at the end, as array.pop() is more
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ efficient than array.shift() (see loop below). */
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* /filedit */ 'body.cpage-fileedit #fileedit-tab-diff-buttons',
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* /wikiedit */ 'body.cpage-wikiedit #wikiedit-tab-diff-buttons',
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* /fdiff */ 'body.fdiff form div.submenu',
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* /vdiff */ 'body.vdiff form div.submenu',
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* /info, /vinfo, /ckout */ 'body.vinfo div.sectionmenu.info-changes-menu'
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ];
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ window.fossil.page.diffControlContainer = undefined;
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( potentialParents.length ){
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (window.fossil.page.diffControlContainer
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ = document.querySelector(potentialParents.pop())) ){
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
5 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
window.fossil.onPageLoad(function(){
6 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
7 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Adds toggle checkboxes to each file entry in the diff views for
8 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/info and similar pages.
9 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
10 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const D = window.fossil.dom;
11 34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const allToggles = [/*collection of all diff-toggle checkboxes */];
12 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const addToggle = function(diffElem){
13 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const sib = diffElem.previousElementSibling,
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- btnOne = sib ? D.addClass(D.checkbox(true), 'diff-toggle') : 0;
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ckbox = sib ? D.addClass(D.checkbox(true), 'diff-toggle') : 0;
15 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!sib) return;
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const lblToggle = D.append(D.label(null, " Toggle "), btnOne);
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const lblToggle = D.label();
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(lblToggle, ckbox, D.text(" show/hide "));
17 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const wrapper = D.append(D.span(), lblToggle);
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const btnAll = D.button("all");
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- btnAll.$cb = btnOne;
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- allToggles.push(btnOne);
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.append(sib, D.append(wrapper, lblToggle, D.text(" "), btnAll));
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- btnOne.addEventListener('change', function(){
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ allToggles.push(ckbox);
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(sib, D.append(wrapper, lblToggle));
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ckbox.addEventListener('change', function(){
23 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
diffElem.classList[this.checked ? 'remove' : 'add']('hidden');
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }, false);
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- btnAll.addEventListener('click', function(){
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Toggle all entries to match this line's new state. Note that
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- we use click() instead of cb.checked=... so that the
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- on-change event handler fires. */
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const checked = !this.$cb.checked;
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- allToggles.forEach( (cb)=>{
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(cb.checked!==checked) cb.click();
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- });
33 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}, false);
34 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
35 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !document.querySelector('body.fdiff') ){
36 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Don't show the diff toggle button for /fdiff because it only
37 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
has a single file to show (and also a different DOM layout). */
38 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.querySelectorAll('table.diff').forEach(addToggle);
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const icm = allToggles.length>1 ? window.fossil.page.diffControlContainer : 0;
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(icm) {
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const btnAll = D.addClass(D.a("#", "Toggle all diffs"), "button");
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append( icm, btnAll );
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ btnAll.addEventListener('click', function(ev){
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ev.preventDefault();
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ev.stopPropagation();
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Figure out whether we want to show all or hide all: if any diffs are
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ toggled off, show all, else hide all. */
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let show = false;
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let ckbox;
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for( ckbox of allToggles ){
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !ckbox.checked ){
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ show = true;
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for( ckbox of allToggles ){
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Toggle all entries to match this new state. We use click()
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ instead of ckbox.checked=... so that the on-change event handler
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fires. */
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(ckbox.checked!==show) ckbox.click();
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }, false);
39 77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
40 78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
41 79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
42 80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
window.fossil.onPageLoad(function(){
43 81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const F = window.fossil, D = F.dom;
@@ -651,26 +689,15 @@
651 689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Look for a parent element to hold the sbs-sync-scroll toggle
652 690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
checkbox. This differs per page. If we don't find one, simply
653 691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
elide that toggle and use whatever preference the user last
654 692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
specified (defaulting to on). */
655 693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
let cbSync /* scroll-sync checkbox */;
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let eToggleParent /* element to put the sync-scroll checkbox in */;
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const potentialParents = [ /* possible parents for the checkbox */
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Put the most likely pages at the end, as array.pop() is more
659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- efficient than array.shift() (see loop below). */
660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* /filedit */ 'body.cpage-fileedit #fileedit-tab-diff-buttons',
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* /wikiedit */ 'body.cpage-wikiedit #wikiedit-tab-diff-buttons',
662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* /fdiff */ 'body.fdiff form div.submenu',
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* /vdiff */ 'body.vdiff form div.submenu',
664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* /info, /vinfo */ 'body.vinfo div.sectionmenu.info-changes-menu'
665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ];
666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( potentialParents.length ){
667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (eToggleParent = document.querySelector(potentialParents.pop())) ){
668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const keySbsScroll = 'sync-diff-scroll' /* F.storage key */;
694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let eToggleParent = /* element to put the sync-scroll checkbox in */
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.querySelector('table.diff.splitdiff')
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ? window.fossil.page.diffControlContainer
697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ : undefined;
698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const keySbsScroll = 'sync-diff-scroll' /* F.storage key for persistent user preference */;
672 699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( eToggleParent ){
673 700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Add a checkbox to toggle sbs scroll sync. Remember that in
674 701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
order to be UI-consistent in the /vdiff page we have to ensure
675 702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
that the checkbox is to the LEFT of of its label. We store the
676 703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sync-scroll preference in F.storage (not a cookie) so that it
677 704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!