|
19 | 19 | </button> |
20 | 20 | </div> |
21 | 21 | <div id="supercode-editor"></div> |
| 22 | + <div id="supercode-footer"> |
| 23 | + <button id="supercode-cancel-btn"> |
| 24 | + Cancel |
| 25 | + </button> |
| 26 | + <button id="supercode-save-btn"> |
| 27 | + Save |
| 28 | + </button> |
| 29 | + </div> |
22 | 30 | </div> |
23 | 31 | ` |
24 | 32 |
|
25 | 33 | const MODAL_CSS = ` |
26 | 34 |
|
| 35 | + :root{ |
| 36 | + --supercode-modal-primary: #ffffff; |
| 37 | + --supercode-modal-secondary: #222f3e; |
| 38 | + --supercode-modal-border: rgba(0, 0, 0, 0.1); |
| 39 | + } |
| 40 | +
|
27 | 41 | /* Media query for mobile devices */ |
28 | 42 | @media only screen and (max-width: 767px) { |
29 | 43 | #supercode-modal { |
|
68 | 82 | border-radius: 10px; |
69 | 83 | display: flex; |
70 | 84 | flex-direction: column; |
| 85 | + background: var(--supercode-modal-primary); |
71 | 86 | } |
72 | 87 | #supercode-header { |
73 | 88 | display: flex; |
74 | 89 | padding: 0.5rem 1rem; |
75 | | - border-bottom: 1px solid #ebebeb; |
| 90 | + border-bottom: 1px solid var(--supercode-modal-border); |
| 91 | + color: var(--supercode-modal-secondary); |
76 | 92 | } |
77 | 93 | #supercode-modal h1 { |
78 | 94 | flex-grow: 1; |
79 | 95 | margin: auto; |
80 | 96 | font-size: 14px; |
81 | 97 | } |
82 | | - #supercode-modal button { |
| 98 | + #supercode-close-btn { |
83 | 99 | background: none; |
84 | 100 | border: none; |
85 | 101 | padding: 0; |
86 | 102 | height: 100%; |
87 | | - cursor:pointer; |
| 103 | + cursor: pointer; |
| 104 | + fill: var(--supercode-modal-secondary); |
88 | 105 | } |
89 | 106 | #supercode-editor { |
90 | 107 | width: 100%; |
91 | 108 | height: 100%; |
92 | 109 | position: relative; |
93 | 110 | } |
94 | | -` |
| 111 | + #supercode-footer { |
| 112 | + padding: 0.5rem 1rem; |
| 113 | + display: flex; |
| 114 | + justify-content: end; |
| 115 | + gap: 1rem; |
| 116 | + border-top: 1px solid var(--supercode-modal-border); |
| 117 | + } |
| 118 | + #supercode-footer button { |
| 119 | + padding: 0.5rem 1rem; |
| 120 | + border-radius: 5px; |
| 121 | + font-weight: bold; |
| 122 | + border: none; |
| 123 | + cursor: pointer; |
| 124 | + min-width: 5rem; |
| 125 | + transition: opacity 0.1s linear; |
| 126 | + } |
| 127 | + #supercode-footer button:hover { |
| 128 | + opacity: 0.8; |
| 129 | + } |
| 130 | + #supercode-cancel-btn { |
| 131 | + background: transparent; |
| 132 | + color: var(--supercode-modal-secondary); |
| 133 | + } |
| 134 | + #supercode-save-btn { |
| 135 | + background: var(--supercode-modal-secondary); |
| 136 | + color: var(--supercode-modal-primary); |
| 137 | + } |
| 138 | + ` |
95 | 139 |
|
96 | 140 | let modal = null; |
97 | 141 |
|
|
152 | 196 | fontFamily: null, |
153 | 197 | fallbackModal: false, // enabled in cases like inline, or versions where `CustomView` is not supported. |
154 | 198 | modalPrimaryColor: '#ffffff', |
155 | | - modalSecondaryColor: '#222f3e' |
| 199 | + modalSecondaryColor: '#222f3e', |
| 200 | + dark: false |
156 | 201 | } |
157 | 202 |
|
158 | 203 | // Get Configurations |
|
185 | 230 | case 'autocomplete': |
186 | 231 | case 'shortcut': |
187 | 232 | case 'fallbackModal': |
| 233 | + case 'dark': |
188 | 234 | if (typeof value === "boolean") { |
189 | 235 | Config[key] = value; |
190 | 236 | } |
|
208 | 254 | if (!Config.icon) { |
209 | 255 | throw new Error("Supercode Icon name is invalid"); |
210 | 256 | } |
211 | | - |
212 | 257 |
|
213 | 258 | // Detect and set fallback model if its required |
214 | 259 | if(!Config.fallbackModal){ |
|
217 | 262 | Config.fallbackModal = true |
218 | 263 | } |
219 | 264 | } |
220 | | - |
221 | 265 | } |
222 | 266 |
|
223 | 267 | const setAceOptions = () => { |
|
259 | 303 | setAceOptions(); |
260 | 304 | } |
261 | 305 |
|
262 | | - const setHeader = (view, originalHeader, onSave) => { |
| 306 | + const setHeader = (view, originalHeader) => { |
263 | 307 | // add a copy of original header to give original header look |
264 | 308 | const newHeader = originalHeader.cloneNode(true); |
265 | 309 | newHeader.style.position = 'relative'; |
|
287 | 331 | isOverflow = false; |
288 | 332 | btn.setAttribute('data-mce-name', 'supercode-toggle') |
289 | 333 | btn.classList.add('tox-tbtn--enabled'); |
290 | | - btn.onclick = onSave; |
| 334 | + btn.onclick = onSaveHandler; |
291 | 335 | } |
292 | 336 | }); |
293 | 337 |
|
|
301 | 345 | const button = document.createElement('button'); |
302 | 346 | button.classList = 'tox-tbtn tox-tbtn--enabled'; |
303 | 347 | button.innerHTML = `<span class="tox-icon tox-tbtn__icon-wrap">${Config.icon}</span>`; |
304 | | - button.onclick = onSave; |
| 348 | + button.onclick = onSaveHandler; |
305 | 349 | div.append(button); |
306 | 350 | newHeader.append(div); |
307 | 351 | } |
|
322 | 366 | setConfig(editor); |
323 | 367 | initDependencies(Config); |
324 | 368 |
|
325 | | - // todo: fix event listener issue |
326 | | - // const modalKeydownListener = (e) => { |
327 | | - // if((e.key === ' ' && e.ctrlKey) || e.key === 'Escape') { |
328 | | - // hideModal(); |
329 | | - // } |
330 | | - // }; |
| 369 | + const modalKeydownListener = (e) => { |
| 370 | + if(e.key === 'Escape') { |
| 371 | + hideModal(); |
| 372 | + } |
| 373 | + }; |
331 | 374 |
|
332 | 375 | const showModal = () => { |
333 | 376 | if(!modal){ |
|
351 | 394 |
|
352 | 395 | /* Update Event Listeners */ |
353 | 396 | modal.element.querySelector('#supercode-backdrop').onclick = hideModal; |
354 | | - modal.element.querySelector('button').onclick = hideModal; |
355 | | - // modal.element.querySelector('#supercode-editor').addEventListener('keydown', modalKeydownListener); |
| 397 | + modal.element.querySelector('#supercode-close-btn').onclick = hideModal; |
| 398 | + modal.element.querySelector('#supercode-cancel-btn').onclick = hideModal; |
| 399 | + modal.element.querySelector('#supercode-save-btn').onclick = () => { |
| 400 | + onSaveHandler(); |
| 401 | + hideModal(); |
| 402 | + }; |
| 403 | + modal.element.querySelector('#supercode-editor').addEventListener('keydown', modalKeydownListener); |
356 | 404 |
|
357 | 405 | /* Update Modal based on editor's theme */ |
358 | 406 | document.querySelector('body').classList.add('disable-scroll'); |
359 | | - document.querySelector('#supercode-modal').style.background = Config.modalPrimaryColor |
360 | | - document.querySelector('#supercode-header').style.color = Config.modalSecondaryColor |
| 407 | + |
| 408 | + document.body.style.setProperty('--supercode-modal-primary', Config.modalPrimaryColor); |
| 409 | + document.body.style.setProperty('--supercode-modal-secondary', Config.modalSecondaryColor); |
| 410 | + if(Config.dark){ |
| 411 | + document.body.style.setProperty('--supercode-modal-border', 'rgba(255, 255, 255, 0.1)'); |
| 412 | + } |
361 | 413 | document.querySelector('#supercode-close-btn').innerHTML = editor.ui.registry.getAll().icons['close'] |
362 | | - document.querySelector('#supercode-close-btn').style.fill = Config.modalSecondaryColor |
| 414 | + |
363 | 415 | modal.element.style.display = 'flex'; |
364 | 416 | setTimeout(() => { |
365 | 417 | modal.element.style.opacity = 1; |
|
370 | 422 | } |
371 | 423 |
|
372 | 424 | const hideModal = () => { |
373 | | - // removeEventListener('keydown', modalKeydownListener); |
374 | | - onSaveHandler(); |
| 425 | + removeEventListener('keydown', modalKeydownListener); |
375 | 426 | document.querySelector('body').classList.remove('disable-scroll'); |
376 | 427 | modal.element.style.opacity = 0; |
| 428 | + editor.focus(); |
377 | 429 | setTimeout(() => { |
378 | 430 | modal.element.style.display = 'none'; |
379 | 431 | }, 10) |
|
446 | 498 |
|
447 | 499 | // On tinymce size change => resize code view |
448 | 500 | if(isScreenSizeChanged){ |
449 | | - setHeader(codeView.querySelector('.supercode-header'), originalHeader, onSaveHandler); |
| 501 | + setHeader(codeView.querySelector('.supercode-header'), originalHeader); |
450 | 502 | codeView.querySelector('.supercode-body ').style.width = editorWidth+'px'; |
451 | 503 | } |
452 | 504 |
|
|
462 | 514 | codeView.addEventListener('keydown', onKeyDownHandler) |
463 | 515 | } |
464 | 516 | // configure header |
465 | | - setHeader(codeView.querySelector('.supercode-header'), originalHeader, onSaveHandler); |
| 517 | + setHeader(codeView.querySelector('.supercode-header'), originalHeader); |
466 | 518 | // configure main code view to look same |
467 | 519 | setMainView(codeView.querySelector('.supercode-body '), editorWidth); |
468 | 520 | } |
|
0 commit comments