PluginProbe
Age Gate / 3.7.3
Age Gate v3.7.3
3.7.3 trunk 1.0.0 1.0.1 1.1.0 1.2.0 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.4.0 1.4.1 1.4.10 1.4.11 1.4.12 1.4.13 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 All 113 releases
age-gate / src / Resources / assets / js / admin / modules / modal.js

modal.js in Age Gate 3.7.3, at src/Resources/assets/js/admin/modules/modal.js

152 lines 4.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import React from 'react';
2 import { createRoot } from 'react-dom/client';
3 import Gallery from './react/gallery';
4
5 class Modal {
6
7 constructor() {
8 this.triggers = document.querySelectorAll('[data-modal]');
9 this.close = document.querySelectorAll('.js-close-modal');
10 this.modals = document.querySelectorAll('.modal');
11 this.modalInners = document.querySelectorAll('.modal-inner');
12 this.select = document.querySelectorAll('.modal .button-primary');
13 this.clearButtons = document.querySelectorAll('.ag-media-clear');
14 this.selected = false;
15
16 this.listeners();
17 }
18
19 listeners() {
20 window.addEventListener('keydown', this.keyDown);
21
22 this.triggers.forEach(el => {
23 el.addEventListener('click', this.openModal, false);
24 });
25
26 this.modals.forEach(el => {
27 el.addEventListener('transitionend', this.revealModal, false);
28 el.addEventListener('click', this.backdropClose, false);
29 });
30
31 this.close.forEach(el => {
32 el.addEventListener('click', Modal.hideModal, false);
33 });
34
35 this.modalInners.forEach(el => {
36 el.addEventListener('transitionend', this.closeModal, false);
37 });
38
39 this.select.forEach(el => {
40 el.addEventListener('click', this.choose, false);
41 });
42
43 this.clearButtons.forEach(el => {
44 el.addEventListener('click', this.clear, false);
45 });
46 }
47
48 clear = (e) => {
49 const root = e.currentTarget.parentNode;
50 root.querySelector('input').value = '';
51 root.querySelector('.ag-preview').innerHTML = '';
52 }
53
54 keyDown = (e) => {
55 if (27 === e.keyCode && document.body.classList.contains('modal-body')) {
56 Modal.hideModal();
57 }
58 }
59
60 backdropClose = (el) => {
61 if (!el.target.classList.contains('modal-visible')) {
62 return;
63 }
64
65 let backdrop = el.currentTarget.dataset.backdrop !== undefined ? el.currentTarget.dataset.backdrop : true;
66
67 if (backdrop === true) {
68 Modal.hideModal();
69 }
70 }
71
72 choose = () => {
73 const root = this.selected.parentNode;
74 const preview = root.querySelector('.ag-preview');
75 const checked = document.querySelector('#ag-media-gallery input:checked');
76
77
78 preview.innerHTML = '';
79
80 if (!checked) {
81 root.querySelector('input').value = '';
82 } else {
83 root.querySelector('input').value = checked.value;
84 const img = document.createElement(checked.dataset.type.match(/video/) ? 'video' : 'img');
85
86 img.src = checked.dataset.full;
87
88 preview.appendChild(img);
89
90 }
91
92 Modal.hideModal();
93 }
94
95 static hideModal = () => {
96 let modalOpen = document.querySelector('.modal.modal-visible');
97
98 modalOpen.querySelector('.modal-inner').classList.remove('modal-reveal');
99 document.querySelector('.modal-body').addEventListener('transitionend', Modal.modalBody, false);
100 document.body.classList.add('modal-fadeOut');
101 }
102
103 closeModal = (el) => {
104 if ('opacity' === el.propertyName && !el.target.classList.contains('modal-reveal')) {
105 document.querySelector('.modal.modal-visible').classList.remove('modal-visible');
106 }
107 }
108
109 openModal = (el) => {
110 if (!el.currentTarget.dataset.modal) {
111 console.error('No data-modal attribute defined!');
112 return;
113 }
114
115 window.agPreSelected = el.currentTarget.parentNode.querySelector('input').value;
116 this.selected = el.currentTarget;
117
118 console.log(this.selected);
119
120 const modalID = el.currentTarget.dataset.modal;
121 const modal = document.getElementById(modalID);
122
123 document.body.classList.add('modal-body');
124 modal.classList.add('modal-visible');
125
126 if (!modal.classList.contains('modal-init')) {
127 modal.classList.add('modal-init')
128 const wrapper = document.getElementById('ag-media-gallery');
129 const root = createRoot(wrapper);
130 root.render(<Gallery />);
131 }
132
133 const event = new Event('ag_gallery_update');
134 window.dispatchEvent(event);
135 }
136
137 revealModal = (el) => {
138 if ('opacity' === el.propertyName && el.target.classList.contains('modal-visible')) {
139 el.target.querySelector('.modal-inner').classList.add('modal-reveal');
140 }
141 }
142
143 static modalBody = (el) => {
144 if ('opacity' === el.propertyName && el.target.classList.contains('modal') && !el.target.classList.contains('modal-visible')) {
145 document.body.classList.remove('modal-body', 'modal-fadeOut');
146 }
147 }
148
149 }
150
151 export default Modal;
152