diff --git a/assets/src/js/functions/functions.js b/assets/src/js/functions/functions.js index 39e873b51..cb0efb0c5 100755 --- a/assets/src/js/functions/functions.js +++ b/assets/src/js/functions/functions.js @@ -705,58 +705,6 @@ function hideTableColumn(table, column) { } } -/** - * Funzione per caricare un file JavaScript ed eseguire delle operazioni al completamento. - * - * @param src - * @param async - * @param defer - * @returns {Promise} - */ -function loadScript(src, async = true, defer = true) { - if (!globals.dynamicScripts) { - globals.dynamicScripts = {}; - } - - return new Promise((resolve, reject) => { - // Caricamento già completato - if (globals.dynamicScripts[src] && globals.dynamicScripts[src] === "done") { - resolve(); - return; - } - - // Aggiunta del resolve all'elenco per lo script - if (!globals.dynamicScripts[src]) { - globals.dynamicScripts[src] = []; - } - globals.dynamicScripts[src].push(resolve); - - // Ricerca dello script esistente - let found = Array.prototype.slice.call(document.scripts).find(el => el.getAttribute("src") === src); - if (found) { - return; - } - - // Caricamento dinamico dello script - const script = document.createElement('script'); - script.type = 'text/javascript'; - script.async = async; - script.defer = defer; - - script.onload = function () { - for (resolve of globals.dynamicScripts[src]) { - resolve(); - } - - globals.dynamicScripts[src] = "done"; - } - - script.onerror = reject; - script.src = src; - document.head.append(script); - }) -} - /** * Funzione per aggiungere in un *endpoint* il contenuto di uno specifico *template*, effettuando delle sostituzioni di base e inizializzando i campi aggiunti. * @param endpoint_selector diff --git a/assets/src/js/functions/input.js b/assets/src/js/functions/input.js index 56efd07e8..9c5377d9e 100644 --- a/assets/src/js/functions/input.js +++ b/assets/src/js/functions/input.js @@ -269,7 +269,13 @@ Input.prototype.get = function () { * @returns {Input} */ Input.prototype.set = function (value) { - this.element.val(value).trigger("change"); + // Gestione dei valori per l'editor + if (this.element.hasClass("editor-input") && typeof CKEDITOR !== 'undefined') { + const name = this.element.attr("id"); + CKEDITOR.instances[name].setData(value); + } else { + this.element.val(value).trigger("change"); + } return this; } diff --git a/assets/src/js/functions/textarea.js b/assets/src/js/functions/textarea.js index 09980b55d..0f18d5428 100644 --- a/assets/src/js/functions/textarea.js +++ b/assets/src/js/functions/textarea.js @@ -26,35 +26,58 @@ function initTextareaInput(input) { return true; } +function waitCKEditor(input) { + setTimeout(function () { + initEditorInput(input); + }, 100); +} + /** * Funzione per l'inizializzazione dei campi editor. * @param input */ function initEditorInput(input) { - let $input = $(input); - let name = input.getAttribute("id"); - - loadScript(globals.rootdir + "/assets/dist/js/ckeditor/ckeditor.js") - .then(function () { - CKEDITOR.addCss(".cke_editable img { max-width: 100% !important; height: auto !important; }"); - - CKEDITOR.replace(name, { - toolbar: globals.ckeditorToolbar, - language: globals.locale, - scayt_autoStartup: true, - scayt_sLang: globals.full_locale, - disableNativeSpellChecker: false, - }); - - CKEDITOR.instances[name].on("key", function (event) { - $input.trigger("keydown", event.data); - $input.trigger("keyup", event.data); - }); - - CKEDITOR.instances[name].on("change", function (event) { - $input.trigger("change", event); - }); - }); + if (window.CKEDITOR && CKEDITOR.status === "loaded") { + $(document).ready(function () { + initCKEditor(input); + }) + } else { + waitCKEditor(input); + } return true; } + +function initCKEditor(input) { + let $input = $(input); + let name = input.getAttribute("id"); + + // Controllo su istanza già esistente + let instance = CKEDITOR.instances[name]; + if (instance) { + return; + } + + // Avvio di CKEditor + CKEDITOR.replace(name, { + toolbar: globals.ckeditorToolbar, + language: globals.locale, + scayt_autoStartup: true, + scayt_sLang: globals.full_locale, + disableNativeSpellChecker: false, + }); + + // Gestione di eventi noti + CKEDITOR.instances[name].on("key", function (event) { + $input.trigger("keydown", event.data); + $input.trigger("keyup", event.data); + }); + + CKEDITOR.instances[name].on("change", function (event) { + $input.trigger("change", event); + }); + + CKEDITOR.instances[name].on("focus", function (event) { + $input.trigger("focus", event); + }); +} diff --git a/bug.php b/bug.php index 0866b3e39..4d50c6d68 100755 --- a/bug.php +++ b/bug.php @@ -167,7 +167,9 @@ echo ' '; diff --git a/package.json b/package.json index d38707385..792f3300a 100755 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "bootstrap-colorpicker": "2.5.1", "bootstrap-daterangepicker": "^2.1.25", "chart.js": "^2.7.0", - "ckeditor4": "^4.14.1", + "ckeditor4-dev": "^4.14.1", "components-jqueryui": "^1.12.1", "datatables.net-bs": "^1.10.15", "datatables.net-buttons-bs": "^1.3.1", diff --git a/src/HTMLBuilder/Handler/CKEditorHandler.php b/src/HTMLBuilder/Handler/CKEditorHandler.php index 99ad990ab..101b07f40 100755 --- a/src/HTMLBuilder/Handler/CKEditorHandler.php +++ b/src/HTMLBuilder/Handler/CKEditorHandler.php @@ -33,19 +33,7 @@ class CKEditorHandler implements HandlerInterface // Generazione del codice HTML return ' - '; - /* - - */ + + '; } }