1document.addEventListener('DOMContentLoaded', () => { 2 3 /* ------------------------------------------------------ 4 * ELEMENTS 5 * ------------------------------------------------------ */ 6 const sidebar = document.getElementById('fh-sidebar'); 7 const openBtn = document.querySelector('.fh-sidebar__button'); 8 const closeBtn = document.querySelector('.fh-sidebar__close'); 9 const reorderBtn = document.getElementById('fh-sidebar-reorder'); 10 const sectionsContainer = document.getElementById('fh-sidebar-sections'); 11 12 /* ------------------------------------------------------ 13 * LOCAL STORAGE KEYS 14 * ------------------------------------------------------ */ 15 const LS_ORDER = 'financeHelperSectionOrder'; 16 const LS_DISABLED = 'financeHelperSectionDisabled'; 17 18 /* ------------------------------------------------------ 19 * LOAD SAVED STATES 20 * ------------------------------------------------------ */ 21 22 // Load order 23 const savedOrder = JSON.parse(localStorage.getItem(LS_ORDER) || '[]'); 24 25 if (savedOrder.length) { 26 const orderedEls = []; 27 savedOrder.forEach(id => { 28 const el = sectionsContainer.querySelector(`[data-id="${id}"]`); 29 if (el) orderedEls.push(el); 30 }); 31 // Append in saved order 32 orderedEls.forEach(el => sectionsContainer.appendChild(el)); 33 } 34 35 // Load disabled sections 36 const savedDisabled = new Set(JSON.parse(localStorage.getItem(LS_DISABLED) || '[]')); 37 38 savedDisabled.forEach(id => { 39 const sec = sectionsContainer.querySelector(`[data-id="${id}"]`); 40 if (sec) { 41 sec.classList.add('fh-sidebar__section--disabled'); 42 sec.style.display = 'none'; 43 } 44 }); 45 46 /* ------------------------------------------------------ 47 * SIDEBAR OPEN / CLOSE + BODY SCROLL LOCK 48 * ------------------------------------------------------ */ 49 50 let scrollPos = 0; 51 52 openBtn.addEventListener('click', () => { 53 scrollPos = window.scrollY; 54 55 document.body.classList.add('fh-sidebar--open'); 56 sidebar.classList.add('fh-sidebar__panel--open'); 57 }); 58 59 closeBtn.addEventListener('click', () => { 60 sidebar.classList.remove('fh-sidebar__panel--open'); 61 document.body.classList.remove('fh-sidebar--open'); 62 }); 63 64 /* ------------------------------------------------------ 65 * REORDER MODE 66 * ------------------------------------------------------ */ 67 68 let reorderMode = false; 69 let sortable = null; 70 71 reorderBtn.addEventListener('click', () => { 72 reorderMode = !reorderMode; 73 74 sectionsContainer.classList.toggle('fh-sidebar__sections--reorder', reorderMode); 75 reorderBtn.textContent = reorderMode ? 'ÎÎ ÎÎÎÎÎΥΣÎ' : 'ÎÎÎΧÎÎΡÎΣΠÎÎÎΤÎΤΩÎ'; 76 77 if (reorderMode) { 78 /* ----------------------------------------------- 79 * ENTER EDIT MODE 80 * ----------------------------------------------- */ 81 82 // Enable all sections so user can see disabled ones 83 sectionsContainer.querySelectorAll('.fh-sidebar__section').forEach(sec => { 84 sec.style.display = ''; 85 86 // Attach toggle button ONLY in edit mode 87 if (!sec.querySelector('.fh-sidebar__toggle')) { 88 const btn = document.createElement('button'); 89 btn.className = 'fh-sidebar__toggle'; 90 btn.setAttribute('aria-label', 'ÎνεÏγοÏοίηÏη/ÎÏενεÏγοÏοίηÏη'); 91 sec.appendChild(btn); 92 } 93 }); 94 95 // Activate sorting 96 sortable = Sortable.create(sectionsContainer, { 97 animation: 150, 98 ghostClass: 'fh-sidebar__section--dragging', 99 }); 100 101 } else { 102 /* ----------------------------------------------- 103 * EXIT EDIT MODE 104 * ----------------------------------------------- */ 105 106 if (sortable) sortable.destroy(); 107 108 // Save new order 109 const newOrder = Array.from(sectionsContainer.children).map(sec => sec.dataset.id); 110 localStorage.setItem(LS_ORDER, JSON.stringify(newOrder)); 111 112 // Remove toggle buttons 113 sectionsContainer.querySelectorAll('.fh-sidebar__toggle').forEach(btn => btn.remove()); 114 115 // Hide disabled sections again 116 sectionsContainer.querySelectorAll('.fh-sidebar__section--disabled').forEach(sec => { 117 sec.style.display = 'none'; 118 }); 119 } 120 }); 121 122 /* ------------------------------------------------------ 123 * ENABLE / DISABLE HANDLER 124 * ------------------------------------------------------ */ 125 126 sectionsContainer.addEventListener('click', (e) => { 127 if (!e.target.classList.contains('fh-sidebar__toggle')) return; 128 129 const section = e.target.closest('.fh-sidebar__section'); 130 const id = section.dataset.id; 131 132 section.classList.toggle('fh-sidebar__section--disabled'); 133 134 if (section.classList.contains('fh-sidebar__section--disabled')) { 135 savedDisabled.add(id); 136 } else { 137 savedDisabled.delete(id); 138 } 139 140 localStorage.setItem(LS_DISABLED, JSON.stringify([...savedDisabled])); 141 }); 142 143});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.