|
1 | | -(function (global, doc) { |
| 1 | +(function (global, doc, bootstrap, Translator) { |
| 2 | + let toggleAllTimeout; |
| 3 | + const TOGGLE_TIMEOUT = 200; |
| 4 | + const toggleAllBtns = [...doc.querySelectorAll(`[data-multi-collapse-btn-id]`)]; |
| 5 | + const toggleMultiCollapseBtn = (btn, changeToCollapseAll) => { |
| 6 | + const displayedText = changeToCollapseAll |
| 7 | + ? Translator.trans(/*@Desc("Collapse all sections")*/ 'collapse.collapse_all', {}, 'ibexa_collapse') |
| 8 | + : Translator.trans(/*@Desc("Expand all sections")*/ 'collapse.expand_all', {}, 'ibexa_collapse'); |
| 9 | + |
| 10 | + btn.innerText = displayedText; |
| 11 | + btn.classList.toggle('ibexa-multi-collapse__btn--expand-all-label', !changeToCollapseAll); |
| 12 | + }; |
| 13 | + |
2 | 14 | doc.querySelectorAll('.ibexa-collapse').forEach((collapseNode) => { |
3 | 15 | const toggleButton = collapseNode.querySelector('.ibexa-collapse__toggle-btn'); |
4 | 16 | const isCollapsed = toggleButton.classList.contains('collapsed'); |
5 | 17 |
|
6 | 18 | collapseNode.classList.toggle('ibexa-collapse--collapsed', isCollapsed); |
7 | 19 | collapseNode.dataset.collapsed = isCollapsed; |
8 | 20 |
|
| 21 | + const multiCollapseNode = collapseNode.closest(`[data-multi-collapse-body]`); |
| 22 | + |
9 | 23 | collapseNode.addEventListener('hide.bs.collapse', (event) => { |
10 | 24 | event.stopPropagation(); |
| 25 | + |
11 | 26 | collapseNode.classList.add('ibexa-collapse--collapsed'); |
12 | 27 | collapseNode.dataset.collapsed = true; |
13 | 28 | }); |
14 | 29 |
|
15 | 30 | collapseNode.addEventListener('show.bs.collapse', (event) => { |
16 | 31 | event.stopPropagation(); |
| 32 | + |
17 | 33 | collapseNode.classList.remove('ibexa-collapse--collapsed'); |
18 | 34 | collapseNode.dataset.collapsed = false; |
19 | 35 | }); |
| 36 | + |
| 37 | + if (!multiCollapseNode || !toggleAllBtns.length) { |
| 38 | + return; |
| 39 | + } |
| 40 | + |
| 41 | + const currentToggleAllBtn = doc.querySelector(`[data-multi-collapse-btn-id="${multiCollapseNode.dataset.multiCollapseBody}"]`); |
| 42 | + const attachClickToggleHandler = (section) => { |
| 43 | + section.addEventListener('click', () => { |
| 44 | + const currentCollapsibleBtns = [...multiCollapseNode.querySelectorAll('[data-bs-toggle]')]; |
| 45 | + |
| 46 | + global.clearTimeout(toggleAllTimeout); |
| 47 | + |
| 48 | + toggleAllTimeout = global.setTimeout(() => { |
| 49 | + const collapsedCount = currentCollapsibleBtns.filter((btn) => btn.classList.contains('collapsed')).length; |
| 50 | + const shouldBeToggled = collapsedCount === currentCollapsibleBtns.length || collapsedCount === 0; |
| 51 | + |
| 52 | + if (shouldBeToggled) { |
| 53 | + toggleMultiCollapseBtn(currentToggleAllBtn, collapsedCount === 0); |
| 54 | + } |
| 55 | + }, TOGGLE_TIMEOUT); |
| 56 | + }); |
| 57 | + }; |
| 58 | + |
| 59 | + collapseNode.querySelectorAll('[data-bs-toggle]').forEach(attachClickToggleHandler); |
20 | 60 | }); |
21 | | -})(window, window.document); |
| 61 | + |
| 62 | + const handleCollapseAction = (multiCollapseNode, isExpandAction) => { |
| 63 | + multiCollapseNode.querySelectorAll('.ibexa-collapse').forEach((collapseNode) => { |
| 64 | + const isElementCollapsed = collapseNode.classList.contains('ibexa-collapse--collapsed'); |
| 65 | + const shouldBeToggled = isExpandAction === isElementCollapsed; |
| 66 | + |
| 67 | + if (shouldBeToggled) { |
| 68 | + const element = bootstrap.Collapse.getOrCreateInstance(collapseNode.querySelector('.ibexa-multi-collapse__single-item')); |
| 69 | + |
| 70 | + if (isExpandAction) { |
| 71 | + element.show(); |
| 72 | + } else { |
| 73 | + element.hide(); |
| 74 | + } |
| 75 | + } |
| 76 | + }); |
| 77 | + }; |
| 78 | + const attachAllElementsToggler = (btn) => { |
| 79 | + btn.addEventListener('click', () => { |
| 80 | + const collapseId = btn.dataset.multiCollapseBtnId; |
| 81 | + |
| 82 | + if (!collapseId) { |
| 83 | + return; |
| 84 | + } |
| 85 | + |
| 86 | + const multiCollapseBodyNode = doc.querySelector(`[data-multi-collapse-body="${collapseId}"]`); |
| 87 | + |
| 88 | + global.clearTimeout(toggleAllTimeout); |
| 89 | + |
| 90 | + toggleAllTimeout = global.setTimeout(() => { |
| 91 | + const isExpandingAction = btn.classList.contains('ibexa-multi-collapse__btn--expand-all-label'); |
| 92 | + |
| 93 | + handleCollapseAction(multiCollapseBodyNode, isExpandingAction); |
| 94 | + toggleMultiCollapseBtn(btn, isExpandingAction); |
| 95 | + }, TOGGLE_TIMEOUT); |
| 96 | + }); |
| 97 | + }; |
| 98 | + toggleAllBtns.forEach(attachAllElementsToggler); |
| 99 | +})(window, window.document, window.bootstrap, window.Translator); |
0 commit comments