| 1 |
/* |
| 2 |
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). |
| 3 |
* This devtool is neither made for production nor for readable output files. |
| 4 |
* It uses "eval()" calls to create a separate source file in the browser devtools. |
| 5 |
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) |
| 6 |
* or disable the default devtool with "devtool: false". |
| 7 |
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). |
| 8 |
*/ |
| 9 |
/******/ (() => { // webpackBootstrap |
| 10 |
/******/ "use strict"; |
| 11 |
/******/ var __webpack_modules__ = ({ |
| 12 |
|
| 13 |
/***/ "./assets/js/helpers.js": |
| 14 |
/*!******************************!*\ |
| 15 |
!*** ./assets/js/helpers.js ***! |
| 16 |
\******************************/ |
| 17 |
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
| 18 |
|
| 19 |
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"cachedMediaData\": () => (/* binding */ cachedMediaData),\n/* harmony export */ \"disableAllButtons\": () => (/* binding */ disableAllButtons),\n/* harmony export */ \"disableBulkButtons\": () => (/* binding */ disableBulkButtons),\n/* harmony export */ \"elements\": () => (/* binding */ elements),\n/* harmony export */ \"logMessage\": () => (/* binding */ logMessage),\n/* harmony export */ \"populatePathInput\": () => (/* binding */ populatePathInput),\n/* harmony export */ \"removeAllButtons\": () => (/* binding */ removeAllButtons),\n/* harmony export */ \"renderDirectories\": () => (/* binding */ renderDirectories),\n/* harmony export */ \"restoreBulkButtons\": () => (/* binding */ restoreBulkButtons),\n/* harmony export */ \"updateButtonText\": () => (/* binding */ updateButtonText)\n/* harmony export */ });\n\r\n\r\nconst { __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\n// move static helper functions here\r\nconst elements = {\r\n bulkBtn: document.querySelector(\"[name='squeeze_bulk']\"),\r\n bulkAgainBtn: document.querySelector(\"[name='squeeze_bulk_again']\"),\r\n bulkPathBtn: document.querySelector(\"[name='squeeze_bulk_path_button']\"),\r\n selectPathBtn: document.querySelector(\"[name='squeeze_select_path_button']\"),\r\n savePathBtn: document.querySelector(\"[name='squeeze_save_path_button']\"),\r\n pathDialog: document.getElementById(\"squeeze-path-dialog\"),\r\n closePathDialogBtn: document.querySelector(\"[name='squeeze_close_path_dialog_button']\"),\r\n pathInput: document.querySelector(\"[name='squeeze_bulk_path']\"),\r\n pathList: document.querySelector(\".squeeze-path-list\"),\r\n postsFilterForm: document.querySelector(\"#posts-filter\"),\r\n dirContainer: document.getElementById(\"squeeze-bulk-directory-list\"),\r\n bulkLogInput: document.querySelector(\"#squeeze-log-data\"),\r\n pauseBulkBtn: document.querySelector(\"[name='squeeze_pause_page_bulk']\")\r\n}\r\n\r\nconst cachedMediaData = {\r\n isPaused: false,\r\n page: 1,\r\n process: '',\r\n mediaIDs: [],\r\n totalImages: 0,\r\n target: null\r\n}\r\n\r\nconst loadTemplate = async (templatePath, data) => {\r\n const response = await fetch(templatePath);\r\n let template = await response.text();\r\n\r\n // Process sub-templates\r\n const subTemplateRegex = /\\{\\{\\>\\s*(.*?)\\s*\\}\\}/g;\r\n let match;\r\n while ((match = subTemplateRegex.exec(template)) !== null) {\r\n const subTemplatePath = `${squeezeOptions.templateBase}/${match[1].trim()}.html`;\r\n const subTemplate = await loadTemplate(subTemplatePath, data);\r\n template = template.replace(match[0], subTemplate);\r\n }\r\n\r\n // Process nested if-else conditions using a recursive approach\r\n const processIfStatements = (template) => {\r\n return template.replace(/\\{\\{#if (\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (match, condition, content) => {\r\n if (data[condition.trim()]) {\r\n // Handle nested if-else conditions inside the true block\r\n return processIfStatements(content.replace(/\\{\\{#else\\}\\}([\\s\\S]*)/g, \"\"));\r\n } else {\r\n // Handle nested if-else conditions inside the false block\r\n return processIfStatements(content.match(/\\{\\{#else\\}\\}([\\s\\S]*)/)?.[1] || \"\");\r\n }\r\n });\r\n };\r\n\r\n // Apply recursive processing of if conditions\r\n template = processIfStatements(template);\r\n\r\n // Replace variables\r\n return template.replace(/\\{\\{(.*?)\\}\\}/g, (match, key) => data[key.trim()] || '');\r\n}\r\n\r\nconst renderTemplate = async (templatePath, data, target) => {\r\n const renderedHTML = await loadTemplate(templatePath, data);\r\n\r\n // Create a temporary container to parse HTML\r\n const tempContainer = document.createElement(\"template\");\r\n tempContainer.innerHTML = renderedHTML.trim();\r\n\r\n target.appendChild(tempContainer.content.firstChild);\r\n\r\n // Return the last element of the rendered template\r\n return target.lastElementChild;\r\n}\r\n\r\nconst logMessage = async (msg, options = {}) => {\r\n const { mediaLogWrapper = null, isStart = false, isPause = false } = options;\r\n let { title = '', iconId = 'check-mark-circle-icon' } = options;\r\n\r\n if (!elements.bulkLogInput) return;\r\n\r\n if (isStart || isPause) {\r\n iconId = isPause ? 'pause-button-icon' : 'image-file-icon';\r\n title = isPause ? __('Bulk squeezing has been paused!', 'squeeze') : `${__('Media', 'squeeze')} ${title}:`;\r\n return await renderTemplate(squeezeOptions.templates.logWrapper, { title: title, msg: msg, iconId: iconId, isStart: isStart, isPause: isPause }, elements.bulkLogInput);\r\n } else {\r\n if (mediaLogWrapper) {\r\n const process = mediaLogWrapper.querySelector(\".media-log-process\");\r\n const step = await renderTemplate(squeezeOptions.templates.logStep, { msg: msg, iconId: iconId }, process);\r\n\r\n if (msg.includes('squeeze-comparison-table')) {\r\n const comparisonTable = step.querySelector('.squeeze-comparison-table');\r\n const toggleBtn = await renderTemplate(squeezeOptions.templates.logDetailsButton, { buttonText: __('Show details', 'squeeze') }, mediaLogWrapper);\r\n\r\n toggleBtn.addEventListener(\"click\", () => {\r\n comparisonTable.classList.toggle(\"show\");\r\n toggleBtn.textContent = comparisonTable.classList.contains(\"show\") ? __('Hide details', 'squeeze') : __('Show details', 'squeeze');\r\n });\r\n step.closest(\".media-log-wrapper\").appendChild(comparisonTable);\r\n step.closest(\".media-log-wrapper\").appendChild(toggleBtn);\r\n }\r\n } else {\r\n elements.bulkLogInput.innerHTML += msg + `<br>`;\r\n }\r\n }\r\n}\r\n\r\nconst restoreBulkButtons = () => {\r\n elements.bulkBtn.disabled = false;\r\n elements.bulkAgainBtn.disabled = false;\r\n elements.bulkPathBtn.disabled = false;\r\n updateButtonText(elements.bulkBtn, __('Run Bulk Squeeze', 'squeeze'), '#play-button-round-icon');\r\n updateButtonText(elements.bulkAgainBtn, __('Repeat Bulk Squeeze', 'squeeze'), '#combine-left-right-outline-icon');\r\n updateButtonText(elements.bulkPathBtn, __('Run Directory Squeeze', 'squeeze'), '#play-button-round-icon');\r\n elements.bulkBtn.dataset.running = 'false';\r\n elements.bulkAgainBtn.dataset.running = 'false';\r\n elements.bulkPathBtn.dataset.running = 'false';\r\n\r\n cachedMediaData.process = '';\r\n cachedMediaData.mediaIDs = [];\r\n cachedMediaData.page = 1;\r\n}\r\n\r\nconst disableBulkButtons = () => {\r\n elements.bulkBtn.disabled = true;\r\n elements.bulkAgainBtn.disabled = true;\r\n elements.bulkPathBtn.disabled = true;\r\n}\r\n\r\nconst disableAllButtons = (buttons) => {\r\n if (!buttons) return;\r\n buttons.forEach((btn) => btn.disabled = true);\r\n}\r\n\r\nconst removeAllButtons = (buttons) => {\r\n if (!buttons) return;\r\n buttons.forEach((btn) => btn.remove());\r\n}\r\n\r\nconst updateButtonText = (button, text, svgAnchor = false) => {\r\n button.childNodes.forEach((node) => {\r\n if (node.nodeName === '#text' && node.textContent.trim() !== '') {\r\n node.textContent = text;\r\n }\r\n if (svgAnchor && node.nodeName === 'svg') {\r\n node.querySelector('use').setAttribute('xlink:href', svgAnchor);\r\n }\r\n });\r\n}\r\n\r\n// Function to render directories in the dialog\r\nconst renderDirectories = async (dirs, parentDir = null, listeners = {}) => {\r\n if (!dirs) return;\r\n if (typeof dirs === 'object') dirs = Object.values(dirs);\r\n if (!elements.dirContainer.classList.contains(\"loaded\")) elements.dirContainer.innerHTML = \"\";\r\n\r\n if (dirs.length === 0 && !parentDir) {\r\n const listItem = await renderTemplate(squeezeOptions.templates.directoryItemEmpty, { emptyText: __('No directories found!', 'squeeze') }, elements.dirContainer);\r\n return;\r\n }\r\n\r\n const selectedFolders = JSON.parse(elements.pathInput.value);\r\n let target;\r\n\r\n for (const dir of dirs) {\r\n const listItemClasses = [];\r\n\r\n if (dir.parent === '/') {\r\n listItemClasses.push(\"loaded\", \"opened\");\r\n }\r\n\r\n if (parentDir) {\r\n target = parentDir;\r\n } else if (dir.parent) {\r\n const parentElement = elements.dirContainer.querySelector(`[data-path=\"${dir.parent}\"]`);\r\n if (parentElement) {\r\n target = parentElement;\r\n } else {\r\n target = elements.dirContainer;\r\n }\r\n } else {\r\n target = elements.dirContainer;\r\n }\r\n\r\n const listItem = await renderTemplate(\r\n squeezeOptions.templates.directoryItem,\r\n {\r\n parent: dir.parent,\r\n path: dir.path,\r\n label: dir.name,\r\n classes: listItemClasses.join(\" \"),\r\n isWritable: dir.is_writeable && !(Array.isArray(selectedFolders) && selectedFolders.includes(dir.path)),\r\n isChecked: dir.is_writeable && Array.isArray(selectedFolders) && selectedFolders.includes(dir.path),\r\n },\r\n target\r\n )\r\n\r\n listItem.querySelector(\"label\").addEventListener(\"click\", listeners.handleDirectoryClick);\r\n listItem.querySelector(\"input[type='checkbox']\")?.addEventListener(\"change\", listeners.handleDirectoryCheck);\r\n }\r\n\r\n elements.dirContainer.classList.add(\"loaded\");\r\n}\r\n\r\nconst populatePathInput = async () => {\r\n const path = elements.pathInput.value;\r\n if (!path) return;\r\n\r\n try {\r\n const selectedFolders = JSON.parse(path);\r\n const inputs = elements.pathList.querySelectorAll(\".squeeze-path-list__item\");\r\n\r\n inputs.forEach(input => input.remove());\r\n\r\n for (const folder of selectedFolders) {\r\n const input = await renderTemplate(squeezeOptions.templates.pathListItem, { folder: folder }, elements.pathList);\r\n }\r\n } catch (error) {\r\n alert(__('Error parsing path input!', 'squeeze'));\r\n console.error('Error parsing path input:', error);\r\n }\r\n}\n\n//# sourceURL=webpack:///./assets/js/helpers.js?"); |
| 20 |
|
| 21 |
/***/ }), |
| 22 |
|
| 23 |
/***/ "./assets/js/script.js": |
| 24 |
/*!*****************************!*\ |
| 25 |
!*** ./assets/js/script.js ***! |
| 26 |
\*****************************/ |
| 27 |
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
| 28 |
|
| 29 |
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _squeeze_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./squeeze.js */ \"./assets/js/squeeze.js\");\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n\r\n\r\n\r\n\r\n\"use strict\";\r\n\r\nconst { __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\nconst Squeeze = new _squeeze_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](squeezeOptions);\r\nconst compressOptions = JSON.parse(squeezeOptions.options);\r\n\r\nconst handleDirectoryClick = async (event) => {\r\n if (event.target !== event.currentTarget) return;\r\n\r\n const currentDir = event.target.closest(\".directory-item\");\r\n const currentPath = currentDir.dataset.path;\r\n const parentPath = currentDir.dataset.parent;\r\n\r\n if (parentPath === '/' || currentDir.classList.contains(\"loading\")) return;\r\n\r\n if (currentDir.classList.contains(\"loaded\")) {\r\n currentDir.classList.toggle(\"opened\");\r\n return;\r\n }\r\n\r\n currentDir.classList.add(\"loading\");\r\n\r\n const subDirs = await Squeeze.getDirectories(currentPath);\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.renderDirectories(subDirs, currentDir, {\r\n handleDirectoryClick,\r\n handleDirectoryCheck\r\n });\r\n\r\n currentDir.classList.remove(\"loading\");\r\n currentDir.classList.add(\"loaded\", \"opened\");\r\n}\r\n\r\nconst handleDirectoryCheck = (event) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.savePathBtn.disabled = !_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelector(\"input[type='checkbox']:checked\");\r\n};\r\n\r\nconst handleClosePathDialog = (event) => {\r\n if (!event.target.contains(_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog)) return;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n};\r\n\r\nconst handleBulkPause = (data, currentPage) => {\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.logMessage(__('Bulk squeezing has been paused!', 'squeeze'), { isPause: true });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs = data;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page = currentPage;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.target.disabled = false;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.target, __('Resume bulk squeezing', 'squeeze'), '#play-button-round-icon');\r\n};\r\n\r\nconst handleBulkToggle = (event, process, mediaIDs, page = 1) => {\r\n const isPaused = event.target.dataset.running === 'true';\r\n\r\n event.target.dataset.running = isPaused ? 'false' : 'true';\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(event.target, isPaused ? __('Resume bulk squeezing', 'squeeze') : __('Pause bulk squeezing', 'squeeze'), isPaused ? '#play-button-round-icon' : '#pause-button-icon');\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.isPaused = isPaused;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.process = process;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs = mediaIDs;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page = page;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.target = event.target;\r\n\r\n return isPaused;\r\n};\r\n\r\n/**\r\n * Hadnle warning on page leave\r\n*/\r\nconst handleOnLeave = () => {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const page = urlParams.get('page');\r\n const isUploadPage = window.location.href.includes('upload.php');\r\n const isMediaNewPage = window.location.href.includes('media-new.php');\r\n const isAttachmentPage = window.location.href.includes('post.php') && urlParams.get('action') === 'edit';\r\n\r\n if (page === 'squeeze-bulk' || isMediaNewPage || isAttachmentPage) {\r\n return __('Are you sure you want to leave this page? The squeezing process will be terminated!', 'squeeze');\r\n }\r\n if (isUploadPage) {\r\n return __('Are you sure you want to leave this page? The settings will not be saved!', 'squeeze');\r\n }\r\n};\r\n\r\n// Handle single compress button click\r\nconst handleSingleBtnClick = async (event) => {\r\n const attachmentID = event.target.dataset.attachment;\r\n const squeezeStatus = event.target.closest(\"td\").querySelector(\".squeeze_status\");\r\n\r\n try {\r\n wp.media.attachment(attachmentID).fetch().then(async (data) => {\r\n const attachment = { attributes: data };\r\n\r\n try {\r\n const compressData = await Squeeze.handleCompress(attachment);\r\n const response = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n squeezeStatus.innerHTML = response?.data ?? response;\r\n\r\n if (event.target.closest(\"td\").classList.contains(\"field\")) {\r\n const table = event.target.closest(\"td\")?.querySelector(\".squeeze_status .squeeze-comparison-table\");\r\n if (table) {\r\n const td = document.createElement(\"td\");\r\n td.classList.add(\"field\");\r\n td.style.width = \"100%\";\r\n td.appendChild(table);\r\n event.target.closest(\"tr\").appendChild(td);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n squeezeStatus.innerHTML = error;\r\n } finally {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.removeAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n window.onbeforeunload = null;\r\n }\r\n });\r\n } catch (error) {\r\n console.error(error);\r\n squeezeStatus.innerHTML = error;\r\n event.target.remove();\r\n }\r\n};\r\n\r\nconst handleRestoreBtnClick = async (event) => {\r\n const attachmentID = event.target.dataset.attachment;\r\n\r\n event.target.disabled = true;\r\n event.target.closest(\"td\").querySelector(\".squeeze_status\").innerHTML = '⏳ ' + __('Restore in process...', 'squeeze');\r\n\r\n try {\r\n const response = await Squeeze.handleRestore(attachmentID);\r\n event.target.closest(\"td\").querySelector(\".squeeze_status\").innerHTML = response.data;\r\n } catch (error) {\r\n console.error(error);\r\n event.target.closest(\"td\").querySelector(\".squeeze_status\").innerHTML = error;\r\n } finally {\r\n event.target.closest('td').querySelector(`[name='squeeze_compress_again']`).disabled = false;\r\n event.target.remove();\r\n window.onbeforeunload = null;\r\n }\r\n};\r\n\r\nconst handleButtonsClick = async (event) => {\r\n const singleBtnName = 'squeeze_compress_single';\r\n const compressAgainBtnName = 'squeeze_compress_again';\r\n const restoreBtnName = 'squeeze_restore';\r\n\r\n if (event.target.getAttribute(\"name\") === singleBtnName || event.target.getAttribute(\"name\") === compressAgainBtnName) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.disableAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n event.target.closest(\"td\").querySelector(\".squeeze_status\").innerHTML = '⏳ ' + __('Squeezing...', 'squeeze');\r\n window.onbeforeunload = handleOnLeave;\r\n handleSingleBtnClick(event);\r\n }\r\n\r\n if (event.target.getAttribute(\"name\") === restoreBtnName) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.disableAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n window.onbeforeunload = handleOnLeave;\r\n handleRestoreBtnClick(event);\r\n }\r\n};\r\n\r\nconst handleRecursiveUpload = async (path, data, currentPage, isUpdateChart = false) => {\r\n if (data === undefined) return { success: false, data: 'No data provided!', mediaIDs: [] }; // when bulk directory path has no images\r\n\r\n const initData = [...data]; // initial data \r\n let totalPages = 1;\r\n if (path === 'uncompressed') {\r\n totalPages = document.querySelector(\"input[name='squeeze_bulk_uncompressed_pages']\")?.value ?? 1;\r\n }\r\n if (path === 'all') {\r\n totalPages = document.querySelector(\"input[name='squeeze_bulk_total_pages']\")?.value ?? 1;\r\n }\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.isPaused) {\r\n handleBulkPause(data, currentPage);\r\n return { success: false, data: 'Process has been paused!', mediaIDs: data, page: currentPage };\r\n }\r\n\r\n const filename = data[0]?.filename ? data[0].filename : `ID #${data[0]}`;\r\n const mediaLogWrapper = await _helpers_js__WEBPACK_IMPORTED_MODULE_1__.logMessage(`${__('Start squeezing...', 'squeeze')}`, { title: filename, isStart: true });\r\n\r\n try {\r\n const response = await Squeeze.handleBulkUpload(path, data);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.logMessage(`${response.data}`, { mediaLogWrapper, iconId: response.success ? 'check-mark-circle-icon' : 'ban-sign-icon' });\r\n\r\n if (isUpdateChart) {\r\n handleUpdateChart(response.mediaIDs);\r\n }\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.isPaused) {\r\n handleBulkPause(data, currentPage);\r\n return { success: false, data: 'Process has been paused!', mediaIDs: data, page: currentPage };\r\n }\r\n\r\n const squeezeStatusElement = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm?.querySelector(`#post-${initData[0]} .column-squeeze .squeeze_status`);\r\n if (squeezeStatusElement) {\r\n squeezeStatusElement.innerHTML = response.data;\r\n }\r\n\r\n if (response.mediaIDs.length > 0) {\r\n return handleRecursiveUpload(path, response.mediaIDs, currentPage, isUpdateChart);\r\n } else {\r\n currentPage++;\r\n if (currentPage > totalPages) return response;\r\n\r\n const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path);\r\n if (maybeGetNextMediaIDs.success) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n }\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.logMessage(`${error}`, { mediaLogWrapper, iconId: 'ban-sign-icon' });\r\n\r\n if (data.length > 0) {\r\n return handleRecursiveUpload(path, data, currentPage, isUpdateChart);\r\n } else {\r\n currentPage++;\r\n if (currentPage > totalPages) return { success: false, data: error, mediaIDs: [] };\r\n\r\n const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path);\r\n if (maybeGetNextMediaIDs.success) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n }\r\n }\r\n }\r\n};\r\n\r\nconst handleUpdateChart = (data) => {\r\n const chartValue = document.querySelector(\".squeeze-bulk-media-stats-chart-value > text\");\r\n const chartBar = document.querySelector(\".squeeze-bulk-media-stats-chart\");\r\n\r\n if (!chartValue || !chartBar) return;\r\n\r\n const imagesLeft = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.totalImages - data.length;\r\n const percentage = Math.round((imagesLeft / _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.totalImages) * 100);\r\n const dasharray = percentage * 560 / 100;\r\n chartValue.textContent = `${percentage}%`;\r\n chartBar.style.setProperty('--squeeze-dasharray', dasharray);\r\n};\r\n\r\ndocument.addEventListener(\"click\", (event) => {\r\n handleButtonsClick(event);\r\n});\r\n\r\nconst handleBulkButtonClick = async (event, process, mediaIDs, currentPage) => {\r\n if (mediaIDs.length === 0) return;\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.disableBulkButtons();\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.process === process) {\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs.length > 0) {\r\n mediaIDs = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs;\r\n }\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page) {\r\n currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page;\r\n }\r\n }\r\n\r\n const isPaused = handleBulkToggle(event, process, mediaIDs, currentPage);\r\n if (isPaused) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n return;\r\n } else {\r\n event.target.disabled = false;\r\n }\r\n\r\n try {\r\n const finalResponse = await handleRecursiveUpload(process, mediaIDs, currentPage); // TBD: Add isUpdateChart\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0) {\r\n alert(__('All images have been processed!', 'squeeze'));\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n};\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkBtn?.addEventListener(\"click\", async (event) => {\r\n let uncompressedIDs = squeezeBulk.unCompressedImages ? squeezeBulk.unCompressedImages.split(\",\") : [];\r\n let currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page ?? 1;\r\n\r\n handleBulkButtonClick(event, 'uncompressed', uncompressedIDs, currentPage);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkAgainBtn?.addEventListener(\"click\", async (event) => {\r\n let allIDs = squeezeBulk.allImages ? squeezeBulk.allImages.split(\",\") : [];\r\n let currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page ?? 1;\r\n\r\n handleBulkButtonClick(event, 'all', allIDs, currentPage);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkPathBtn?.addEventListener(\"click\", async (event) => {\r\n const path = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput?.value ?? '';\r\n let bulkPathData;\r\n\r\n if (!path) {\r\n alert(__('Please enter a valid path!', 'squeeze'));\r\n return;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.disableBulkButtons();\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.process === 'path' && _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs.length > 0) {\r\n bulkPathData = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs;\r\n } else {\r\n const pathData = await Squeeze.getAttachmentsByPath(path);\r\n\r\n if (pathData.success) {\r\n bulkPathData = pathData.data;\r\n } else {\r\n console.error(pathData.data);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n }\r\n }\r\n\r\n const isPaused = handleBulkToggle(event, 'path', bulkPathData);\r\n\r\n if (isPaused) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n return;\r\n } else {\r\n event.target.disabled = false;\r\n }\r\n\r\n try {\r\n const finalResponse = await handleRecursiveUpload('path', bulkPathData, 1);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0) {\r\n alert(__('All images have been processed!', 'squeeze'));\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n})\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.selectPathBtn?.addEventListener(\"click\", async (event) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.selectPathBtn.disabled = true;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.showModal();\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.contains(\"loaded\")) {\r\n const selectedFolders = JSON.parse(_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput.value);\r\n\r\n if (Array.isArray(selectedFolders)) {\r\n selectedFolders.forEach((folder) => {\r\n const checkbox = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelector(`input[value=\"${folder}\"]`);\r\n if (checkbox) {\r\n checkbox.checked = true;\r\n }\r\n });\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.selectPathBtn.disabled = false;\r\n return;\r\n }\r\n const folders = await Squeeze.getDirectories();\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.renderDirectories(folders, null, {\r\n handleDirectoryClick,\r\n handleDirectoryCheck\r\n });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.selectPathBtn.disabled = false;\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.savePathBtn?.addEventListener(\"click\", () => {\r\n const checkboxes = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelectorAll(\"input[type='checkbox']\");\r\n const selectedFolders = Array.from(checkboxes)\r\n .filter(checkbox => checkbox.checked)\r\n .map(checkbox => checkbox.value);\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput.value = JSON.stringify(selectedFolders);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.populatePathInput();\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.closePathDialogBtn?.addEventListener(\"click\", () => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n});\r\n\r\ndocument.addEventListener('click', handleClosePathDialog);\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm?.addEventListener(\"submit\", async (event) => {\r\n const dataAction = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.dataset.action;\r\n const action = event.target.querySelector(\"select[name='action']\").value;\r\n const submitButtons = event.target.querySelectorAll(\"input[name='bulk_action']\");\r\n\r\n if (action === 'squeeze_bulk_compress' && dataAction !== 'squeeze_bulk_compressed') {\r\n event.preventDefault();\r\n const mediaList = document.querySelectorAll(\"input[name='media[]']:checked\");\r\n const uncompressedIDs = Array.from(mediaList).map((el) => el.value);\r\n\r\n if (uncompressedIDs.length === 0) return;\r\n\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n uncompressedIDs.forEach((id) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.querySelectorAll(`#post-${id} .column-squeeze button`).forEach((btn) => {\r\n btn.disabled = true;\r\n });\r\n const squeezeStatusElement = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.querySelector(`#post-${id} .column-squeeze .squeeze_status`);\r\n if (squeezeStatusElement) {\r\n squeezeStatusElement.innerText = '⏳ ' + __('Squeezing...', 'squeeze');\r\n }\r\n });\r\n\r\n submitButtons.forEach((btn) => {\r\n btn.disabled = true;\r\n btn.value = __('Squeezing...', 'squeeze');\r\n });\r\n\r\n try {\r\n const finalResponse = await handleRecursiveUpload('uncompressed', uncompressedIDs, 1);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0) {\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.dataset.action = 'squeeze_bulk_compressed';\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.submit();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n }\r\n});\r\n\r\n/*! <fs_premium_only> */\r\nconst handleFetchImagesFromPage = async () => {\r\n const url = new URL(window.location.href);\r\n const pageURL = url.searchParams.get('url');\r\n const action = url.searchParams.get('action');\r\n const page = url.searchParams.get('page');\r\n const labelTitle = document.querySelector(\"[class='squeeze-bulk-media-stats-item-label']\");\r\n const labelValue = document.querySelector(\"[class='squeeze-bulk-media-stats-item-value']\");\r\n const labelIcon = document.querySelector(\"[class='squeeze-bulk-media-stats-item-label'] .squeeze-icon\");\r\n\r\n if (page !== 'squeeze-bulk' || action !== 'bulk-from-page' || !pageURL) return;\r\n\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n try {\r\n const data = await Squeeze.getAttachmentsByPage(pageURL);\r\n\r\n if (data.success) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn.disabled = false;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn.removeAttribute('hidden');\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn.dataset.running = 'false';\r\n\r\n const mediaIDs = data.data;\r\n\r\n labelTitle.innerHTML = __('Found images on the page:', 'squeeze');\r\n labelValue.innerHTML = mediaIDs.length;\r\n labelIcon.style.display = 'none';\r\n\r\n // trigger click event on bulk button (using dispatchEvent) and pass the mediaIDs\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: { mediaIDs: mediaIDs } }));\r\n } else {\r\n labelTitle.innerHTML = __('Error:', 'squeeze') + ' ' + data.data;\r\n labelIcon.style.display = 'none';\r\n console.error(data.data);\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n } catch (error) {\r\n labelTitle.innerHTML = __('An error has occurred while fetching images from the page. Check the console for details.', 'squeeze');\r\n labelIcon.style.display = 'none';\r\n console.error(error);\r\n alert(__('An error has occurred while fetching images from the page. Check the console for details.', 'squeeze'));\r\n window.onbeforeunload = null;\r\n }\r\n};\r\n\r\nconst handleBulkFromPage = async (event) => {\r\n const url = new URL(window.location.href);\r\n const pageURL = url.searchParams.get('url');\r\n\r\n let bulkPageData = event.detail.mediaIDs;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.process === 'path' && _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs?.length) {\r\n bulkPageData = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.totalImages = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.totalImages || bulkPageData.length;\r\n\r\n const isPaused = handleBulkToggle(event, 'path', bulkPageData);\r\n\r\n if (isPaused) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn.disabled = true;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n return;\r\n } else {\r\n event.target.disabled = false;\r\n }\r\n\r\n try {\r\n const finalResponse = await handleRecursiveUpload('path', bulkPageData, 1, true);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0) {\r\n alert(__('All images have been processed!', 'squeeze'));\r\n window.onbeforeunload = null;\r\n location.href = pageURL;\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n};\r\n\r\nwindow.addEventListener('load', handleFetchImagesFromPage);\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn?.addEventListener(\"click\", handleBulkFromPage);\r\n/*! </fs_premium_only> */\r\n\r\nconst maybeCompressAttachment = (attachmentType, attachmentSubType) => {\r\n const isAutoCompress = compressOptions.auto_compress;\r\n const allowedMimeTypes = ['jpeg', 'png', 'webp', 'avif'];\r\n const isImage = attachmentType === 'image' && allowedMimeTypes.includes(attachmentSubType);\r\n\r\n return isImage && isAutoCompress;\r\n};\r\n\r\n// https://wordpress.stackexchange.com/a/131295/186146 - override wp.Uploader.prototype.success\r\njQuery.extend(wp?.Uploader?.prototype, {\r\n success: async (attachment) => {\r\n if (maybeCompressAttachment(attachment.attributes.type, attachment.attributes.subtype)) {\r\n\r\n // set 'uploading' param to true, to pause the uploading process\r\n window.onbeforeunload = handleOnLeave;\r\n attachment.set('uploading', true);\r\n attachment.set('percent', 100);\r\n\r\n // TBD: indicate that the image is being compressed\r\n\r\n try {\r\n const compressData = await Squeeze.handleCompress(attachment);\r\n const uploadData = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n if (uploadData.success) {\r\n const compat = attachment.get('compat');\r\n const tempDiv = document.createElement('div');\r\n let compatItem = compat.item;\r\n\r\n tempDiv.innerHTML = compatItem;\r\n tempDiv.querySelector('.compat-field-squeeze_is_compressed .field').innerHTML = uploadData.data;\r\n compat.item = tempDiv.innerHTML;\r\n\r\n attachment.set('compat', compat);\r\n attachment.set('uploading', false);\r\n window.onbeforeunload = null;\r\n } else {\r\n attachment.set('uploading', false);\r\n window.onbeforeunload = null;\r\n alert(uploadData.data);\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n attachment.set('uploading', false);\r\n window.onbeforeunload = null;\r\n }\r\n }\r\n },\r\n});\r\n\r\nconst handleMultiFileFormUpload = () => {\r\n if (typeof wpUploaderInit === 'undefined' || typeof plupload === 'undefined' || typeof uploader === 'undefined') return;\r\n\r\n const SqueezeUploader = uploader;\r\n\r\n SqueezeUploader.bind('FilesAdded', function (up, files) {});\r\n\r\n SqueezeUploader.bind('FileUploaded', function (up, file, response) {\r\n const fileMime = file.type;\r\n const fileType = fileMime.split('/')[0];\r\n const fileSubType = fileMime.split('/')[1];\r\n\r\n if (!maybeCompressAttachment(fileType, fileSubType)) return;\r\n\r\n const fileID = file.id;\r\n const attachmentID = response.response;\r\n const mediaItem = document.getElementById(`media-item-${fileID}`);\r\n\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n /**\r\n * Wait for media item to load( 'async-upload.php' )\r\n * Ping every 1 second until the media item is loaded\r\n * @returns Promise\r\n */\r\n const waitForItemLoad = () => {\r\n return new Promise((resolve) => {\r\n let interval = setInterval(() => {\r\n if (mediaItem.querySelector('.media-item-wrapper')) {\r\n mediaItem.querySelector('.media-item-wrapper').innerHTML += `\r\n <div class=\"progress\">\r\n <div class=\"percent\">${__('Squeezing...', 'squeeze')}</div>\r\n <div class=\"bar\" style=\"width: 200px;\"></div>\r\n </div>\r\n `;\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 1000);\r\n });\r\n };\r\n\r\n waitForItemLoad().then(() => {\r\n try {\r\n wp.media.attachment(attachmentID).fetch().then(async function (data) {\r\n const attachment = { attributes: data };\r\n\r\n try {\r\n const compressData = await Squeeze.handleCompress(attachment);\r\n const uploadData = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n if (uploadData.success) {\r\n window.onbeforeunload = null;\r\n mediaItem.innerHTML += `<div class=\"squeeze_status\">${uploadData.data}</div>`;\r\n mediaItem.querySelector('.progress')?.remove();\r\n } else {\r\n alert(uploadData?.data ?? uploadData);\r\n window.onbeforeunload = null;\r\n mediaItem.querySelector('.progress')?.remove();\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n mediaItem.innerHTML += error;\r\n window.onbeforeunload = null;\r\n mediaItem.querySelector('.progress')?.remove();\r\n }\r\n });\r\n } catch (error) {\r\n console.error(error);\r\n mediaItem.innerHTML += error;\r\n window.onbeforeunload = null;\r\n mediaItem.querySelector('.progress')?.remove();\r\n }\r\n });\r\n });\r\n\r\n SqueezeUploader.bind('UploadComplete', function (up, files) {});\r\n};\r\n\r\ndocument.onreadystatechange = function () {\r\n if (document.readyState === \"complete\") { // equivalent to jQuery $(document).ready()\r\n handleMultiFileFormUpload();\r\n }\r\n};\n\n//# sourceURL=webpack:///./assets/js/script.js?"); |
| 30 |
|
| 31 |
/***/ }), |
| 32 |
|
| 33 |
/***/ "./assets/js/squeeze.js": |
| 34 |
/*!******************************!*\ |
| 35 |
!*** ./assets/js/squeeze.js ***! |
| 36 |
\******************************/ |
| 37 |
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
| 38 |
|
| 39 |
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SQUEEZE)\n/* harmony export */ });\n\r\n\r\nconst { __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\nclass SQUEEZE {\r\n\r\n constructor(squeeze) {\r\n this.options = JSON.parse(squeeze.options); // plugin options\r\n this.nonce = squeeze.nonce; // nonce\r\n this.ajaxUrl = squeeze.ajaxUrl; // ajax url\r\n }\r\n\r\n handleCompress = async ( attachment ) => {\r\n const attachmentData = attachment.attributes;\r\n const url = attachmentData?.originalImageURL ?? attachmentData.url;\r\n const mime = attachmentData.mime;\r\n const name = attachmentData.name;\r\n const filename = attachmentData?.originalImageName ?? attachmentData.filename;\r\n const attachmentID = attachmentData.id;\r\n const sizes = attachmentData.sizes;\r\n const format = mime.split(\"/\")[1];\r\n const sourceType = format;\r\n const outputType = format;\r\n const skipFull = attachmentData.originalImageName === undefined ? true : false;\r\n const timeout = parseInt(this.options.timeout) * 1000; // convert to milliseconds\r\n\r\n //console.log(attachmentData, 'attachmentData')\r\n\r\n const worker = new Worker(new URL(/* worker import */ __webpack_require__.p + __webpack_require__.u(\"assets_js_worker_js\"), __webpack_require__.b), {type: undefined}); // worker url\r\n worker.postMessage({\r\n action: 'compress',\r\n format,\r\n url,\r\n name,\r\n sourceType,\r\n outputType,\r\n mime,\r\n sizes,\r\n skipFull,\r\n timeout,\r\n options: this.options,\r\n });\r\n\r\n return new Promise((resolve, reject) => {\r\n const timeoutId = setTimeout(() => {\r\n worker.terminate();\r\n console.warn('Worker terminated');\r\n reject(new Error(__('Request timed out.', 'squeeze')));\r\n }, timeout);\r\n\r\n worker.onmessage = (event) => {\r\n clearTimeout(timeoutId);\r\n if (event.data.error) {\r\n reject(new Error(event.data.error));\r\n } else {\r\n resolve(event.data);\r\n }\r\n worker.terminate();\r\n };\r\n\r\n worker.onerror = (error) => {\r\n clearTimeout(timeoutId);\r\n reject(new Error(`Worker error: ${error.message}`));\r\n };\r\n });\r\n\r\n }\r\n\r\n handleUpload = async ({ attachment, base64, type = 'uncompressed', mediaIDs = [] }) => {\r\n\r\n const attachmentData = attachment.attributes;\r\n const url = attachmentData?.originalImageURL ?? attachmentData.url;\r\n const mime = attachmentData.mime;\r\n const filename = attachmentData?.originalImageName ?? attachmentData.filename;\r\n const attachmentID = attachmentData.id;\r\n const format = mime.split(\"/\")[1];\r\n\r\n //console.log(attachmentData, 'attachmentData')\r\n\r\n const data = {\r\n action: 'squeeze_update_attachment',\r\n _ajax_nonce: this.nonce,\r\n filename: filename,\r\n type: 'image',\r\n format: format,\r\n base64: base64.base64,\r\n base64Sizes: base64.base64Sizes,\r\n base64Webp: base64.base64Webp,\r\n base64SizesWebp: base64.base64SizesWebp,\r\n attachmentID: attachmentID,\r\n url: url,\r\n process: type,\r\n }\r\n\r\n //console.log(data, 'squeeze_update_attachment')\r\n\r\n try {\r\n const uploadResponse = await jQuery.ajax({\r\n url: this.ajaxUrl, // + '111',\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n //if (type === 'uncompressed' || type === 'all' || type === 'path') {\r\n if (uploadResponse.success) {\r\n uploadResponse['mediaIDs'] = mediaIDs;\r\n }\r\n\r\n return uploadResponse;\r\n \r\n } catch (error) {\r\n return {\r\n 'mediaIDs': mediaIDs,\r\n 'data': error.message,\r\n 'success': false\r\n };\r\n }\r\n\r\n }\r\n\r\n handleBulkUpload = async (type = 'uncompressed', mediaIDs = []) => {\r\n let currentID;\r\n let attachment;\r\n\r\n switch (type) {\r\n case 'all':\r\n case 'uncompressed':\r\n currentID = mediaIDs[0];\r\n break;\r\n case 'path':\r\n currentID = mediaIDs[0]?.filename;\r\n break;\r\n default:\r\n currentID = 0;\r\n break;\r\n }\r\n\r\n if (type === 'path') {\r\n\r\n attachment = {\r\n attributes: {\r\n url: mediaIDs[0].url,\r\n mime: mediaIDs[0].mime,\r\n name: mediaIDs[0].name,\r\n filename: mediaIDs[0].filename,\r\n id: mediaIDs[0].id,\r\n sizes: mediaIDs[0]?.sizes,\r\n }\r\n }\r\n\r\n } else {\r\n\r\n const attachmentResponse = await this.getAttachment(currentID); \r\n if (attachmentResponse.success === false) {\r\n mediaIDs.shift();\r\n return {\r\n 'mediaIDs': mediaIDs,\r\n 'data': attachmentResponse.data\r\n }\r\n }\r\n const attachmentData = attachmentResponse.data;\r\n attachment = {\r\n attributes: {\r\n url: attachmentData.url,\r\n mime: attachmentData.mime,\r\n name: attachmentData.name,\r\n filename: attachmentData.filename,\r\n id: attachmentData.id,\r\n sizes: attachmentData.sizes,\r\n }\r\n }\r\n\r\n }\r\n\r\n mediaIDs.shift();\r\n\r\n const mediaType = attachment.attributes.mime.split(\"/\")[0];\r\n const mediaSubType = attachment.attributes.mime.split(\"/\")[1];\r\n\r\n if (!this.maybeCompressAttachment(mediaType, mediaSubType)) {\r\n return {\r\n 'mediaIDs': mediaIDs,\r\n 'data': __('Skipped', 'squeeze')\r\n }\r\n }\r\n\r\n try {\r\n const compressData = await this.handleCompress( attachment );\r\n const uploadData = await this.handleUpload({ attachment: attachment, base64: compressData, type: type, mediaIDs: mediaIDs })\r\n\r\n return uploadData;\r\n\r\n } catch (error) {\r\n return {\r\n 'mediaIDs': mediaIDs,\r\n 'data': error.message,\r\n 'success': false\r\n }\r\n }\r\n\r\n }\r\n\r\n maybeCompressAttachment = (attachmentType, attachmentSubType) => {\r\n const allowedMimeTypes = ['jpeg', 'png', 'webp', 'avif'];\r\n const isImage = attachmentType === 'image' && allowedMimeTypes.includes(attachmentSubType)\r\n\r\n if (isImage) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n handleRestore = async (attachmentID) => {\r\n const data = {\r\n action: 'squeeze_restore_attachment',\r\n _ajax_nonce: this.nonce,\r\n attachmentID: attachmentID,\r\n };\r\n\r\n const response = await jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n };\r\n\r\n // Get list of attachments by path\r\n getAttachmentsByPath = async (path) => {\r\n\r\n const data = {\r\n action: 'squeeze_get_attachment_by_path',\r\n path: path,\r\n _ajax_nonce: this.nonce,\r\n }\r\n\r\n const response = jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n getAttachment = async (attachmentID) => {\r\n const data = {\r\n action: 'squeeze_get_attachment',\r\n _ajax_nonce: this.nonce,\r\n attachmentID: attachmentID,\r\n }\r\n\r\n const response = jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n getNextAttachments = async (page = 1, type = 'uncompressed') => {\r\n const data = {\r\n action: 'squeeze_get_next_attachments',\r\n _ajax_nonce: this.nonce,\r\n page: page,\r\n type: type,\r\n }\r\n\r\n const response = jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n getDirectories = async (parentDir = false) => {\r\n const data = {\r\n action: 'squeeze_get_directories',\r\n _ajax_nonce: this.nonce,\r\n }\r\n\r\n if (parentDir) {\r\n data['parentDir'] = parentDir;\r\n }\r\n\r\n const response = jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n /*! <fs_premium_only> */\r\n getAttachmentsByPage = async (pageURL) => {\r\n const data = {\r\n action: 'squeeze_get_attachments_by_page',\r\n _ajax_nonce: this.nonce,\r\n pageURL: pageURL,\r\n }\r\n\r\n const response = jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n }\r\n /*! </fs_premium_only> */\r\n\r\n}\n\n//# sourceURL=webpack:///./assets/js/squeeze.js?"); |
| 40 |
|
| 41 |
/***/ }) |
| 42 |
|
| 43 |
/******/ }); |
| 44 |
/************************************************************************/ |
| 45 |
/******/ // The module cache |
| 46 |
/******/ var __webpack_module_cache__ = {}; |
| 47 |
/******/ |
| 48 |
/******/ // The require function |
| 49 |
/******/ function __webpack_require__(moduleId) { |
| 50 |
/******/ // Check if module is in cache |
| 51 |
/******/ var cachedModule = __webpack_module_cache__[moduleId]; |
| 52 |
/******/ if (cachedModule !== undefined) { |
| 53 |
/******/ return cachedModule.exports; |
| 54 |
/******/ } |
| 55 |
/******/ // Create a new module (and put it into the cache) |
| 56 |
/******/ var module = __webpack_module_cache__[moduleId] = { |
| 57 |
/******/ // no module.id needed |
| 58 |
/******/ // no module.loaded needed |
| 59 |
/******/ exports: {} |
| 60 |
/******/ }; |
| 61 |
/******/ |
| 62 |
/******/ // Execute the module function |
| 63 |
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); |
| 64 |
/******/ |
| 65 |
/******/ // Return the exports of the module |
| 66 |
/******/ return module.exports; |
| 67 |
/******/ } |
| 68 |
/******/ |
| 69 |
/******/ // expose the modules object (__webpack_modules__) |
| 70 |
/******/ __webpack_require__.m = __webpack_modules__; |
| 71 |
/******/ |
| 72 |
/************************************************************************/ |
| 73 |
/******/ /* webpack/runtime/define property getters */ |
| 74 |
/******/ (() => { |
| 75 |
/******/ // define getter functions for harmony exports |
| 76 |
/******/ __webpack_require__.d = (exports, definition) => { |
| 77 |
/******/ for(var key in definition) { |
| 78 |
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { |
| 79 |
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); |
| 80 |
/******/ } |
| 81 |
/******/ } |
| 82 |
/******/ }; |
| 83 |
/******/ })(); |
| 84 |
/******/ |
| 85 |
/******/ /* webpack/runtime/get javascript chunk filename */ |
| 86 |
/******/ (() => { |
| 87 |
/******/ // This function allow to reference async chunks |
| 88 |
/******/ __webpack_require__.u = (chunkId) => { |
| 89 |
/******/ // return url for filenames based on template |
| 90 |
/******/ return "" + chunkId + ".script.bundle.js"; |
| 91 |
/******/ }; |
| 92 |
/******/ })(); |
| 93 |
/******/ |
| 94 |
/******/ /* webpack/runtime/global */ |
| 95 |
/******/ (() => { |
| 96 |
/******/ __webpack_require__.g = (function() { |
| 97 |
/******/ if (typeof globalThis === 'object') return globalThis; |
| 98 |
/******/ try { |
| 99 |
/******/ return this || new Function('return this')(); |
| 100 |
/******/ } catch (e) { |
| 101 |
/******/ if (typeof window === 'object') return window; |
| 102 |
/******/ } |
| 103 |
/******/ })(); |
| 104 |
/******/ })(); |
| 105 |
/******/ |
| 106 |
/******/ /* webpack/runtime/hasOwnProperty shorthand */ |
| 107 |
/******/ (() => { |
| 108 |
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) |
| 109 |
/******/ })(); |
| 110 |
/******/ |
| 111 |
/******/ /* webpack/runtime/make namespace object */ |
| 112 |
/******/ (() => { |
| 113 |
/******/ // define __esModule on exports |
| 114 |
/******/ __webpack_require__.r = (exports) => { |
| 115 |
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { |
| 116 |
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); |
| 117 |
/******/ } |
| 118 |
/******/ Object.defineProperty(exports, '__esModule', { value: true }); |
| 119 |
/******/ }; |
| 120 |
/******/ })(); |
| 121 |
/******/ |
| 122 |
/******/ /* webpack/runtime/publicPath */ |
| 123 |
/******/ (() => { |
| 124 |
/******/ var scriptUrl; |
| 125 |
/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; |
| 126 |
/******/ var document = __webpack_require__.g.document; |
| 127 |
/******/ if (!scriptUrl && document) { |
| 128 |
/******/ if (document.currentScript) |
| 129 |
/******/ scriptUrl = document.currentScript.src; |
| 130 |
/******/ if (!scriptUrl) { |
| 131 |
/******/ var scripts = document.getElementsByTagName("script"); |
| 132 |
/******/ if(scripts.length) scriptUrl = scripts[scripts.length - 1].src |
| 133 |
/******/ } |
| 134 |
/******/ } |
| 135 |
/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration |
| 136 |
/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. |
| 137 |
/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); |
| 138 |
/******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); |
| 139 |
/******/ __webpack_require__.p = scriptUrl; |
| 140 |
/******/ })(); |
| 141 |
/******/ |
| 142 |
/******/ /* webpack/runtime/jsonp chunk loading */ |
| 143 |
/******/ (() => { |
| 144 |
/******/ __webpack_require__.b = document.baseURI || self.location.href; |
| 145 |
/******/ |
| 146 |
/******/ // object to store loaded and loading chunks |
| 147 |
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched |
| 148 |
/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded |
| 149 |
/******/ var installedChunks = { |
| 150 |
/******/ "main": 0 |
| 151 |
/******/ }; |
| 152 |
/******/ |
| 153 |
/******/ // no chunk on demand loading |
| 154 |
/******/ |
| 155 |
/******/ // no prefetching |
| 156 |
/******/ |
| 157 |
/******/ // no preloaded |
| 158 |
/******/ |
| 159 |
/******/ // no HMR |
| 160 |
/******/ |
| 161 |
/******/ // no HMR manifest |
| 162 |
/******/ |
| 163 |
/******/ // no on chunks loaded |
| 164 |
/******/ |
| 165 |
/******/ // no jsonp function |
| 166 |
/******/ })(); |
| 167 |
/******/ |
| 168 |
/************************************************************************/ |
| 169 |
/******/ |
| 170 |
/******/ // startup |
| 171 |
/******/ // Load entry module and return exports |
| 172 |
/******/ // This entry module can't be inlined because the eval devtool is used. |
| 173 |
/******/ var __webpack_exports__ = __webpack_require__("./assets/js/script.js"); |
| 174 |
/******/ |
| 175 |
/******/ })() |
| 176 |
; |