]> BookStack Code Mirror - bookstack/blob - resources/assets/js/components/expand-toggle.js
Update maintenance.php
[bookstack] / resources / assets / js / components / expand-toggle.js
1
2 class ExpandToggle {
3
4     constructor(elem) {
5         this.elem = elem;
6
7         // Component state
8         this.isOpen = elem.getAttribute('expand-toggle-is-open') === 'yes';
9         this.updateEndpoint = elem.getAttribute('expand-toggle-update-endpoint');
10         this.selector = elem.getAttribute('expand-toggle');
11
12         // Listener setup
13         elem.addEventListener('click', this.click.bind(this));
14     }
15
16     open(elemToToggle) {
17         elemToToggle.style.display = 'block';
18         elemToToggle.style.height = '';
19         let height = elemToToggle.getBoundingClientRect().height;
20         elemToToggle.style.height = '0px';
21         elemToToggle.style.overflow = 'hidden';
22         elemToToggle.style.transition = 'height ease-in-out 240ms';
23
24         let transitionEndBound = onTransitionEnd.bind(this);
25         function onTransitionEnd() {
26             elemToToggle.style.overflow = '';
27             elemToToggle.style.height = '';
28             elemToToggle.style.transition = '';
29             elemToToggle.removeEventListener('transitionend', transitionEndBound);
30         }
31
32         setTimeout(() => {
33             elemToToggle.style.height = `${height}px`;
34             elemToToggle.addEventListener('transitionend', transitionEndBound)
35         }, 1);
36     }
37
38     close(elemToToggle) {
39         elemToToggle.style.display =  'block';
40         elemToToggle.style.height = elemToToggle.getBoundingClientRect().height + 'px';
41         elemToToggle.style.overflow = 'hidden';
42         elemToToggle.style.transition = 'all ease-in-out 240ms';
43
44         let transitionEndBound = onTransitionEnd.bind(this);
45         function onTransitionEnd() {
46             elemToToggle.style.overflow = '';
47             elemToToggle.style.height = '';
48             elemToToggle.style.transition = '';
49             elemToToggle.style.display =  'none';
50             elemToToggle.removeEventListener('transitionend', transitionEndBound);
51         }
52
53         setTimeout(() => {
54             elemToToggle.style.height = `0px`;
55             elemToToggle.addEventListener('transitionend', transitionEndBound)
56         }, 1);
57     }
58
59     click(event) {
60         event.preventDefault();
61
62         const matchingElems = document.querySelectorAll(this.selector);
63         for (let match of matchingElems) {
64             this.isOpen ?  this.close(match) : this.open(match);
65         }
66
67         this.isOpen = !this.isOpen;
68         this.updateSystemAjax(this.isOpen);
69     }
70
71     updateSystemAjax(isOpen) {
72         window.$http.patch(this.updateEndpoint, {
73             expand: isOpen ? 'true' : 'false'
74         });
75     }
76
77 }
78
79 export default ExpandToggle;