PluginProbe
Squeeze – Image Optimization & Compression, WEBP Conversion / 1.6
Squeeze – Image Optimization & Compression, WEBP Conversion v1.6
1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 trunk 1.0 1.1 1.2 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5 1.5.1 1.5.2 1.6 All 42 releases
squeeze / assets / js / script.bundle.js

script.bundle.js in Squeeze – Image Optimization & Compression, WEBP Conversion 1.6, at assets/js/script.bundle.js

176 lines 54.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 ;