var Grav; /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ 3604: /***/ ((module) => { "use strict"; module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII="; /***/ }), /***/ 15980: /***/ ((module) => { "use strict"; module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII="; /***/ }), /***/ 24912: /***/ ((module) => { "use strict"; module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg=="; /***/ }), /***/ 35358: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var map = { "./af": 25177, "./af.js": 25177, "./ar": 61509, "./ar-dz": 41488, "./ar-dz.js": 41488, "./ar-kw": 58676, "./ar-kw.js": 58676, "./ar-ly": 42353, "./ar-ly.js": 42353, "./ar-ma": 24496, "./ar-ma.js": 24496, "./ar-sa": 82682, "./ar-sa.js": 82682, "./ar-tn": 89756, "./ar-tn.js": 89756, "./ar.js": 61509, "./az": 95533, "./az.js": 95533, "./be": 28959, "./be.js": 28959, "./bg": 47777, "./bg.js": 47777, "./bm": 54903, "./bm.js": 54903, "./bn": 61290, "./bn-bd": 17357, "./bn-bd.js": 17357, "./bn.js": 61290, "./bo": 31545, "./bo.js": 31545, "./br": 11470, "./br.js": 11470, "./bs": 44429, "./bs.js": 44429, "./ca": 7306, "./ca.js": 7306, "./cs": 56464, "./cs.js": 56464, "./cv": 73635, "./cv.js": 73635, "./cy": 64226, "./cy.js": 64226, "./da": 93601, "./da.js": 93601, "./de": 77853, "./de-at": 26111, "./de-at.js": 26111, "./de-ch": 54697, "./de-ch.js": 54697, "./de.js": 77853, "./dv": 60708, "./dv.js": 60708, "./el": 54691, "./el.js": 54691, "./en-au": 53872, "./en-au.js": 53872, "./en-ca": 28298, "./en-ca.js": 28298, "./en-gb": 56195, "./en-gb.js": 56195, "./en-ie": 66584, "./en-ie.js": 66584, "./en-il": 65543, "./en-il.js": 65543, "./en-in": 9033, "./en-in.js": 9033, "./en-nz": 79402, "./en-nz.js": 79402, "./en-sg": 43004, "./en-sg.js": 43004, "./eo": 32934, "./eo.js": 32934, "./es": 97650, "./es-do": 20838, "./es-do.js": 20838, "./es-mx": 17730, "./es-mx.js": 17730, "./es-us": 56575, "./es-us.js": 56575, "./es.js": 97650, "./et": 3035, "./et.js": 3035, "./eu": 3508, "./eu.js": 3508, "./fa": 119, "./fa.js": 119, "./fi": 90527, "./fi.js": 90527, "./fil": 95995, "./fil.js": 95995, "./fo": 52477, "./fo.js": 52477, "./fr": 85498, "./fr-ca": 26435, "./fr-ca.js": 26435, "./fr-ch": 37892, "./fr-ch.js": 37892, "./fr.js": 85498, "./fy": 37071, "./fy.js": 37071, "./ga": 41734, "./ga.js": 41734, "./gd": 70217, "./gd.js": 70217, "./gl": 77329, "./gl.js": 77329, "./gom-deva": 32124, "./gom-deva.js": 32124, "./gom-latn": 93383, "./gom-latn.js": 93383, "./gu": 95050, "./gu.js": 95050, "./he": 11713, "./he.js": 11713, "./hi": 43861, "./hi.js": 43861, "./hr": 26308, "./hr.js": 26308, "./hu": 90609, "./hu.js": 90609, "./hy-am": 17160, "./hy-am.js": 17160, "./id": 74063, "./id.js": 74063, "./is": 89374, "./is.js": 89374, "./it": 88383, "./it-ch": 21827, "./it-ch.js": 21827, "./it.js": 88383, "./ja": 23827, "./ja.js": 23827, "./jv": 89722, "./jv.js": 89722, "./ka": 41794, "./ka.js": 41794, "./kk": 27088, "./kk.js": 27088, "./km": 96870, "./km.js": 96870, "./kn": 84451, "./kn.js": 84451, "./ko": 63164, "./ko.js": 63164, "./ku": 98174, "./ku.js": 98174, "./ky": 78474, "./ky.js": 78474, "./lb": 79680, "./lb.js": 79680, "./lo": 15867, "./lo.js": 15867, "./lt": 45766, "./lt.js": 45766, "./lv": 69532, "./lv.js": 69532, "./me": 58076, "./me.js": 58076, "./mi": 41848, "./mi.js": 41848, "./mk": 30306, "./mk.js": 30306, "./ml": 73739, "./ml.js": 73739, "./mn": 99053, "./mn.js": 99053, "./mr": 86169, "./mr.js": 86169, "./ms": 73386, "./ms-my": 92297, "./ms-my.js": 92297, "./ms.js": 73386, "./mt": 77075, "./mt.js": 77075, "./my": 72264, "./my.js": 72264, "./nb": 22274, "./nb.js": 22274, "./ne": 8235, "./ne.js": 8235, "./nl": 92572, "./nl-be": 43784, "./nl-be.js": 43784, "./nl.js": 92572, "./nn": 54566, "./nn.js": 54566, "./oc-lnc": 69330, "./oc-lnc.js": 69330, "./pa-in": 29849, "./pa-in.js": 29849, "./pl": 94418, "./pl.js": 94418, "./pt": 79834, "./pt-br": 48303, "./pt-br.js": 48303, "./pt.js": 79834, "./ro": 24457, "./ro.js": 24457, "./ru": 82271, "./ru.js": 82271, "./sd": 1221, "./sd.js": 1221, "./se": 33478, "./se.js": 33478, "./si": 17538, "./si.js": 17538, "./sk": 5784, "./sk.js": 5784, "./sl": 46637, "./sl.js": 46637, "./sq": 86794, "./sq.js": 86794, "./sr": 45719, "./sr-cyrl": 3322, "./sr-cyrl.js": 3322, "./sr.js": 45719, "./ss": 33619, "./ss.js": 33619, "./sv": 41011, "./sv.js": 41011, "./sw": 40748, "./sw.js": 40748, "./ta": 11025, "./ta.js": 11025, "./te": 11885, "./te.js": 11885, "./tet": 28861, "./tet.js": 28861, "./tg": 86571, "./tg.js": 86571, "./th": 55802, "./th.js": 55802, "./tk": 59527, "./tk.js": 59527, "./tl-ph": 29231, "./tl-ph.js": 29231, "./tlh": 31052, "./tlh.js": 31052, "./tr": 85096, "./tr.js": 85096, "./tzl": 79846, "./tzl.js": 79846, "./tzm": 81765, "./tzm-latn": 97711, "./tzm-latn.js": 97711, "./tzm.js": 81765, "./ug-cn": 48414, "./ug-cn.js": 48414, "./uk": 16618, "./uk.js": 16618, "./ur": 57777, "./ur.js": 57777, "./uz": 57609, "./uz-latn": 72475, "./uz-latn.js": 72475, "./uz.js": 57609, "./vi": 21135, "./vi.js": 21135, "./x-pseudo": 64051, "./x-pseudo.js": 64051, "./yo": 82218, "./yo.js": 82218, "./zh-cn": 52648, "./zh-cn.js": 52648, "./zh-hk": 1632, "./zh-hk.js": 1632, "./zh-mo": 31541, "./zh-mo.js": 31541, "./zh-tw": 50304, "./zh-tw.js": 50304 }; function webpackContext(req) { var id = webpackContextResolve(req); return __webpack_require__(id); } function webpackContextResolve(req) { if(!__webpack_require__.o(map, req)) { var e = new Error("Cannot find module '" + req + "'"); e.code = 'MODULE_NOT_FOUND'; throw e; } return map[req]; } webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = 35358; /***/ }), /***/ 36736: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; // ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); // EXPORTS __webpack_require__.d(__webpack_exports__, { "default": () => (/* binding */ main) }); // EXTERNAL MODULE: ./node_modules/@babel/polyfill/lib/index.js var lib = __webpack_require__(27461); // EXTERNAL MODULE: external "jQuery" var external_jQuery_ = __webpack_require__(41669); var external_jQuery_default = /*#__PURE__*/__webpack_require__.n(external_jQuery_); ;// ./app/utils/remodal.js /* Remodal from https://github.com/vodkabears/Remodal * With Stackable option from https://github.com/antstorm/Remodal patch */ !function (root, factory) { return factory(root, (external_jQuery_default())); }(undefined, function (global, $) { 'use strict'; /** * Name of the plugin * @private * @const * @type {String} */ var PLUGIN_NAME = 'remodal'; /** * Namespace for CSS and events * @private * @const * @type {String} */ var NAMESPACE = window.REMODAL_GLOBALS && window.REMODAL_GLOBALS.NAMESPACE || PLUGIN_NAME; /** * Animationstart event with vendor prefixes * @private * @const * @type {String} */ var ANIMATIONSTART_EVENTS = $.map(['animationstart', 'webkitAnimationStart', 'MSAnimationStart', 'oAnimationStart'], function (eventName) { return eventName + '.' + NAMESPACE; }).join(' '); /** * Animationend event with vendor prefixes * @private * @const * @type {String} */ var ANIMATIONEND_EVENTS = $.map(['animationend', 'webkitAnimationEnd', 'MSAnimationEnd', 'oAnimationEnd'], function (eventName) { return eventName + '.' + NAMESPACE; }).join(' '); /** * Default settings * @private * @const * @type {Object} */ var DEFAULTS = $.extend({ hashTracking: true, closeOnConfirm: true, closeOnCancel: true, closeOnEscape: true, closeOnOutsideClick: true, modifier: '', stack: false, appendTo: null }, window.REMODAL_GLOBALS && window.REMODAL_GLOBALS.DEFAULTS); /** * States of the Remodal * @private * @const * @enum {String} */ var STATES = { CLOSING: 'closing', CLOSED: 'closed', OPENING: 'opening', OPENED: 'opened' }; /** * Reasons of the state change. * @private * @const * @enum {String} */ var STATE_CHANGE_REASONS = { CONFIRMATION: 'confirmation', CANCELLATION: 'cancellation' }; /** * Is animation supported? * @private * @const * @type {Boolean} */ var IS_ANIMATION = function () { var style = document.createElement('div').style; return style.animationName !== undefined || style.WebkitAnimationName !== undefined || style.MozAnimationName !== undefined || style.msAnimationName !== undefined || style.OAnimationName !== undefined; }(); /** * Is iOS? * @private * @const * @type {Boolean} */ var IS_IOS = /iPad|iPhone|iPod/.test(navigator.platform); /** * Current modal * @private * @type {Remodal} */ var openModals = []; /** * Scrollbar position * @private * @type {Number} */ var scrollTop; /** * Returns an animation duration * @private * @param {jQuery} $elem * @returns {Number} */ function getAnimationDuration($elem) { if (IS_ANIMATION && $elem.css('animation-name') === 'none' && $elem.css('-webkit-animation-name') === 'none' && $elem.css('-moz-animation-name') === 'none' && $elem.css('-o-animation-name') === 'none' && $elem.css('-ms-animation-name') === 'none') { return 0; } var duration = $elem.css('animation-duration') || $elem.css('-webkit-animation-duration') || $elem.css('-moz-animation-duration') || $elem.css('-o-animation-duration') || $elem.css('-ms-animation-duration') || '0s'; var delay = $elem.css('animation-delay') || $elem.css('-webkit-animation-delay') || $elem.css('-moz-animation-delay') || $elem.css('-o-animation-delay') || $elem.css('-ms-animation-delay') || '0s'; var iterationCount = $elem.css('animation-iteration-count') || $elem.css('-webkit-animation-iteration-count') || $elem.css('-moz-animation-iteration-count') || $elem.css('-o-animation-iteration-count') || $elem.css('-ms-animation-iteration-count') || '1'; var max; var len; var num; var i; duration = duration.split(', '); delay = delay.split(', '); iterationCount = iterationCount.split(', '); // The 'duration' size is the same as the 'delay' size for (i = 0, len = duration.length, max = Number.NEGATIVE_INFINITY; i < len; i++) { num = parseFloat(duration[i]) * parseInt(iterationCount[i], 10) + parseFloat(delay[i]); if (num > max) { max = num; } } return max; } /** * Returns a scrollbar width * @private * @returns {Number} */ function getScrollbarWidth() { if ($(document).height() <= $(window).height()) { return 0; } var outer = document.createElement('div'); var inner = document.createElement('div'); var widthNoScroll; var widthWithScroll; outer.style.visibility = 'hidden'; outer.style.width = '100px'; document.body.appendChild(outer); widthNoScroll = outer.offsetWidth; // Force scrollbars outer.style.overflow = 'scroll'; // Add inner div inner.style.width = '100%'; outer.appendChild(inner); widthWithScroll = inner.offsetWidth; // Remove divs outer.parentNode.removeChild(outer); return widthNoScroll - widthWithScroll; } /** * Locks the screen * @private */ function lockScreen() { if (IS_IOS) { return; } var $html = $('html'); var lockedClass = namespacify('is-locked'); var paddingRight; var $body; if (!$html.hasClass(lockedClass)) { $body = $(document.body); // Zepto does not support '-=', '+=' in the `css` method paddingRight = parseInt($body.css('padding-right'), 10) + getScrollbarWidth(); $body.css('padding-right', paddingRight + 'px'); $html.addClass(lockedClass); } } /** * Unlocks the screen * @private */ function unlockScreen() { if (IS_IOS) { return; } var $html = $('html'); var lockedClass = namespacify('is-locked'); var paddingRight; var $body; if ($html.hasClass(lockedClass)) { $body = $(document.body); // Zepto does not support '-=', '+=' in the `css` method paddingRight = parseInt($body.css('padding-right'), 10) - getScrollbarWidth(); $body.css('padding-right', paddingRight + 'px'); $html.removeClass(lockedClass); } } /** * Sets a state for an instance * @private * @param {Remodal} instance * @param {STATES} state * @param {Boolean} isSilent If true, Remodal does not trigger events * @param {String} Reason of a state change. */ function setState(instance, state, isSilent, reason) { var newState = namespacify('is', state); var allStates = [namespacify('is', STATES.CLOSING), namespacify('is', STATES.OPENING), namespacify('is', STATES.CLOSED), namespacify('is', STATES.OPENED)].join(' '); instance.$bg.removeClass(allStates).addClass(newState); instance.$overlay.removeClass(allStates).addClass(newState); instance.$wrapper.removeClass(allStates).addClass(newState); instance.$modal.removeClass(allStates).addClass(newState); instance.state = state; !isSilent && instance.$modal.trigger({ type: state, reason: reason }, [{ reason: reason }]); } /** * Synchronizes with the animation * @param {Function} doBeforeAnimation * @param {Function} doAfterAnimation * @param {Remodal} instance */ function syncWithAnimation(doBeforeAnimation, doAfterAnimation, instance) { var runningAnimationsCount = 0; var handleAnimationStart = function handleAnimationStart(e) { if (e.target !== this) { return; } runningAnimationsCount++; }; var handleAnimationEnd = function handleAnimationEnd(e) { if (e.target !== this) { return; } if (--runningAnimationsCount === 0) { // Remove event listeners $.each(['$bg', '$overlay', '$wrapper', '$modal'], function (index, elemName) { instance[elemName].off(ANIMATIONSTART_EVENTS + ' ' + ANIMATIONEND_EVENTS); }); doAfterAnimation(); } }; $.each(['$bg', '$overlay', '$wrapper', '$modal'], function (index, elemName) { instance[elemName].on(ANIMATIONSTART_EVENTS, handleAnimationStart).on(ANIMATIONEND_EVENTS, handleAnimationEnd); }); doBeforeAnimation(); // If the animation is not supported by a browser or its duration is 0 if (getAnimationDuration(instance.$bg) === 0 && getAnimationDuration(instance.$overlay) === 0 && getAnimationDuration(instance.$wrapper) === 0 && getAnimationDuration(instance.$modal) === 0) { // Remove event listeners $.each(['$bg', '$overlay', '$wrapper', '$modal'], function (index, elemName) { instance[elemName].off(ANIMATIONSTART_EVENTS + ' ' + ANIMATIONEND_EVENTS); }); doAfterAnimation(); } } /** * Closes immediately * @private * @param {Remodal} instance */ function halt(instance) { if (instance.state === STATES.CLOSED) { return; } $.each(['$bg', '$overlay', '$wrapper', '$modal'], function (index, elemName) { instance[elemName].off(ANIMATIONSTART_EVENTS + ' ' + ANIMATIONEND_EVENTS); }); removeModal(instance); instance.$bg.removeClass(instance.settings.modifier); instance.$overlay.removeClass(instance.settings.modifier).hide(); instance.$wrapper.hide(); if (openModals.length === 0) { unlockScreen(); } setState(instance, STATES.CLOSED, true); } /** * Parses a string with options * @private * @param str * @returns {Object} */ function parseOptions(str) { var obj = {}; var arr; var len; var val; var i; // Remove spaces before and after delimiters str = str.replace(/\s*:\s*/g, ':').replace(/\s*,\s*/g, ','); // Parse a string arr = str.split(','); for (i = 0, len = arr.length; i < len; i++) { arr[i] = arr[i].split(':'); val = arr[i][1]; // Convert a string value if it is like a boolean if (typeof val === 'string' || val instanceof String) { val = val === 'true' || (val === 'false' ? false : val); } // Convert a string value if it is like a number if (typeof val === 'string' || val instanceof String) { val = !isNaN(val) ? +val : val; } obj[arr[i][0]] = val; } return obj; } /** * Generates a string separated by dashes and prefixed with NAMESPACE * @private * @param {...String} * @returns {String} */ function namespacify() { var result = NAMESPACE; for (var i = 0; i < arguments.length; ++i) { result += '-' + arguments[i]; } return result; } /** * Handles the hashchange event * @private * @listens hashchange */ function handleHashChangeEvent() { var id = location.hash.replace('#', ''); var instance; var $elem; var current = currentModal(); if (!id) { // Check if we have currently opened modal and animation was completed if (current && current.state === STATES.OPENED && current.settings.hashTracking) { current.close(); } } else { if (!current || current.id !== id) { // Catch syntax error if your hash is bad try { $elem = $('[data-' + PLUGIN_NAME + '-id="' + id + '"]'); } catch (err) {} if ($elem && $elem.length) { instance = $[PLUGIN_NAME].lookup[$elem.data(PLUGIN_NAME)]; if (instance && instance.settings.hashTracking) { instance.open(); } } } } } function currentModal() { return openModals[openModals.length - 1]; } function removeModal(remodal) { var index = openModals.indexOf(remodal); if (index >= 0) { openModals.slice(index, 1); } } /** * Remodal constructor * @constructor * @param {jQuery} $modal * @param {Object} options */ function Remodal($modal, options) { var $body = $(document.body); var $appendTo = $body; var remodal = this; remodal.id = $modal.attr('data-' + PLUGIN_NAME + '-id'); remodal.settings = $.extend({}, DEFAULTS, options); remodal.index = $[PLUGIN_NAME].lookup.push(remodal) - 1; remodal.state = STATES.CLOSED; // remodal.$overlay = $('.' + namespacify('overlay')); if (remodal.settings.appendTo !== null && remodal.settings.appendTo.length) { $appendTo = $(remodal.settings.appendTo); } if (!remodal.$overlay) { remodal.$overlay = $('
').addClass(namespacify('overlay') + ' ' + namespacify('is', STATES.CLOSED)).hide(); $appendTo.append(remodal.$overlay); } remodal.$bg = $('.' + namespacify('bg')).addClass(namespacify('is', STATES.CLOSED)); remodal.$modal = $modal.addClass(NAMESPACE + ' ' + namespacify('is-initialized') + ' ' + remodal.settings.modifier + ' ' + namespacify('is', STATES.CLOSED)).attr('tabindex', '-1'); remodal.$wrapper = $('
').addClass(namespacify('wrapper') + ' ' + remodal.settings.modifier + ' ' + namespacify('is', STATES.CLOSED)).hide().append(remodal.$modal); $appendTo.append(remodal.$wrapper); // Add the event listener for the close button remodal.$wrapper.on('click.' + NAMESPACE, '[data-' + PLUGIN_NAME + '-action="close"]', function (e) { e.preventDefault(); remodal.close(); }); // Add the event listener for the cancel button remodal.$wrapper.on('click.' + NAMESPACE, '[data-' + PLUGIN_NAME + '-action="cancel"]', function (e) { e.preventDefault(); remodal.$modal.trigger(STATE_CHANGE_REASONS.CANCELLATION); if (remodal.settings.closeOnCancel) { remodal.close(STATE_CHANGE_REASONS.CANCELLATION); } }); // Add the event listener for the confirm button remodal.$wrapper.on('click.' + NAMESPACE, '[data-' + PLUGIN_NAME + '-action="confirm"]', function (e) { e.preventDefault(); remodal.$modal.trigger(STATE_CHANGE_REASONS.CONFIRMATION); if (remodal.settings.closeOnConfirm) { remodal.close(STATE_CHANGE_REASONS.CONFIRMATION); } }); // Add the event listener for the overlay remodal.$wrapper.on('click.' + NAMESPACE, function (e) { var $target = $(e.target); var isWrapper = $target.hasClass(namespacify('wrapper')); var isWithin = $target.closest('.' + namespacify('is', STATES.OPENED)).length; if (!isWrapper && isWithin) { return; } if (remodal.settings.closeOnOutsideClick) { remodal.close(); } }); } /** * Opens a modal window * @public */ Remodal.prototype.open = function () { var remodal = this; var current; var modalCount; // Check if the animation was completed if (remodal.state === STATES.OPENING || remodal.state === STATES.CLOSING) { return; } // id = remodal.$modal.attr('data-' + PLUGIN_NAME + '-id'); if (remodal.id && remodal.settings.hashTracking) { scrollTop = $(window).scrollTop(); location.hash = remodal.id; } if (!remodal.settings.stack) { current = currentModal(); if (current && current !== remodal) { halt(current); } } modalCount = openModals.push(remodal); remodal.$overlay.css('z-index', function (_, value) { return parseInt(value, 10) + modalCount; }); remodal.$wrapper.css('z-index', function (_, value) { return parseInt(value, 10) + modalCount; }); lockScreen(); remodal.$bg.addClass(remodal.settings.modifier); remodal.$overlay.addClass(remodal.settings.modifier).show(); remodal.$wrapper.show().scrollTop(0); remodal.$modal.focus(); syncWithAnimation(function () { setState(remodal, STATES.OPENING); }, function () { setState(remodal, STATES.OPENED); }, remodal); }; /** * Closes a modal window * @public * @param {String} reason */ Remodal.prototype.close = function (reason) { var remodal = this; var current; // Check if the animation was completed if (remodal.state === STATES.OPENING || remodal.state === STATES.CLOSING || remodal.state === STATES.CLOSED) { return; } removeModal(remodal); if (remodal.settings.hashTracking && remodal.id === location.hash.substr(1)) { current = currentModal(); if (current) { location.hash = current.id; } else { location.hash = ''; $(window).scrollTop(scrollTop); } } syncWithAnimation(function () { setState(remodal, STATES.CLOSING, false, reason); }, function () { remodal.$bg.removeClass(remodal.settings.modifier); remodal.$overlay.removeClass(remodal.settings.modifier).hide(); remodal.$wrapper.hide(); if (openModals.length === 0) { unlockScreen(); } setState(remodal, STATES.CLOSED, false, reason); }, remodal); }; /** * Returns a current state of a modal * @public * @returns {STATES} */ Remodal.prototype.getState = function () { return this.state; }; /** * Destroys a modal * @public */ Remodal.prototype.destroy = function () { var lookup = $[PLUGIN_NAME].lookup; var instanceCount; halt(this); this.$wrapper.remove(); delete lookup[this.index]; instanceCount = $.grep(lookup, function (instance) { return !!instance; }).length; if (instanceCount === 0) { this.$overlay.remove(); this.$bg.removeClass(namespacify('is', STATES.CLOSING) + ' ' + namespacify('is', STATES.OPENING) + ' ' + namespacify('is', STATES.CLOSED) + ' ' + namespacify('is', STATES.OPENED)); } }; /** * Special plugin object for instances * @public * @type {Object} */ $[PLUGIN_NAME] = { lookup: [] }; /** * Plugin constructor * @constructor * @param {Object} options * @returns {JQuery} */ $.fn[PLUGIN_NAME] = function (opts) { var instance; var $elem; this.each(function (index, elem) { $elem = $(elem); if ($elem.data(PLUGIN_NAME) == null) { instance = new Remodal($elem, opts); $elem.data(PLUGIN_NAME, instance.index); if (instance.settings.hashTracking && instance.id === location.hash.substr(1)) { instance.open(); } } else { instance = $[PLUGIN_NAME].lookup[$elem.data(PLUGIN_NAME)]; } }); return instance; }; $(document).ready(function () { // data-remodal-target opens a modal window with the special Id $(document).on('click', '[data-' + PLUGIN_NAME + '-target]', function (e) { e.preventDefault(); var elem = e.currentTarget; var id = elem.getAttribute('data-' + PLUGIN_NAME + '-target'); var $target = $('[data-' + PLUGIN_NAME + '-id="' + id + '"]'); $[PLUGIN_NAME].lookup[$target.data(PLUGIN_NAME)].open(); }); // Auto initialization of modal windows // They should have the 'remodal' class attribute // Also you can write the `data-remodal-options` attribute to pass params into the modal $(document).find('.' + NAMESPACE).each(function (i, container) { var $container = $(container); var options = $container.data(PLUGIN_NAME + '-options'); if (!options) { options = {}; } else if (typeof options === 'string' || options instanceof String) { options = parseOptions(options); } $container[PLUGIN_NAME](options); }); // Handles the keydown event $(document).on('keydown.' + NAMESPACE, function (e) { var current = currentModal(); if (current && current.settings.closeOnEscape && current.state === STATES.OPENED && e.keyCode === 27) { current.close(); } }); // Handles the hashchange event $(window).on('hashchange.' + NAMESPACE, handleHashChangeEvent); }); }); // EXTERNAL MODULE: ./node_modules/simplebar/dist/simplebar.min.js var simplebar_min = __webpack_require__(88904); // EXTERNAL MODULE: ./node_modules/dropzone/dist/dropzone.js var dist_dropzone = __webpack_require__(62628); var dropzone_default = /*#__PURE__*/__webpack_require__.n(dist_dropzone); // EXTERNAL MODULE: ./node_modules/toastr/toastr.js var toastr = __webpack_require__(47959); var toastr_default = /*#__PURE__*/__webpack_require__.n(toastr); ;// ./app/utils/toastr.js (toastr_default()).options.positionClass = 'toast-top-right'; (toastr_default()).options.preventDuplicates = true; /* harmony default export */ const utils_toastr = ((toastr_default())); ;// ./app/utils/offline.js var offlineElement = external_jQuery_default()('#offline-status'); external_jQuery_default()(window).on('offline', function () { offlineElement.slideDown(); }); external_jQuery_default()(window).on('online', function () { offlineElement.slideUp(); }); external_jQuery_default()(document).ready(function () { if (!offline) { offlineElement.slideDown(); } }); // assume online if can't check /* harmony default export */ const offline = (typeof __webpack_require__.g.navigator.onLine !== 'undefined' ? __webpack_require__.g.navigator.onLine : true); // EXTERNAL MODULE: ./node_modules/mout/string/trim.js var trim = __webpack_require__(35814); var trim_default = /*#__PURE__*/__webpack_require__.n(trim); ;// external "GravAdmin" const external_GravAdmin_namespaceObject = GravAdmin; ;// ./app/utils/keepalive.js function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var MAX_SAFE_DELAY = 2147483647; var KeepAlive = /*#__PURE__*/function () { function KeepAlive() { _classCallCheck(this, KeepAlive); this.active = false; } return _createClass(KeepAlive, [{ key: "start", value: function start() { var _this = this; var timeout = external_GravAdmin_namespaceObject.config.admin_timeout / 1.5 * 1000; this.timer = setInterval(function () { return _this.fetch(); }, Math.min(timeout, MAX_SAFE_DELAY)); this.active = true; } }, { key: "stop", value: function stop() { clearInterval(this.timer); this.active = false; } }, { key: "checkOnce", value: function checkOnce() { var data = new FormData(); data.append('admin-nonce', external_GravAdmin_namespaceObject.config.admin_nonce); return fetch("".concat(external_GravAdmin_namespaceObject.config.base_url_relative, "/task").concat(external_GravAdmin_namespaceObject.config.param_sep, "keepAlive"), { credentials: 'same-origin', method: 'post', body: data }).then(function (response) { if (response && (response.status === 401 || response.status === 403)) { return false; } return true; })["catch"](function () { return false; }); } }, { key: "fetch", value: function fetch() { return this.checkOnce().then(function (ok) { if (!ok) { showSessionExpiredModal(); } })["catch"](userFeedbackError); } }]); }(); /* harmony default export */ const keepalive = (new KeepAlive()); ;// ./app/utils/session-expired.js var shown = false; function showSessionExpiredModal() { if (shown) { return; } shown = true; try { localStorage.setItem('grav:admin:sessionExpiredShown', '1'); } catch (e) {} try { keepalive.stop(); } catch (e) {} // Ensure modal exists (in case a custom layout removed it) var $modal = external_jQuery_default()('[data-remodal-id="session-expired"]'); if (!$modal.length) { var html = "\n
\n
\n

Session Expired

\n

Your admin login session has expired. Please log in again.

\n
\n OK\n
\n
\n
"; external_jQuery_default()('body').append(html); $modal = external_jQuery_default()('[data-remodal-id="session-expired"]'); } // Harden the modal: no escape/overlay close var instance = $modal.remodal({ hashTracking: false, closeOnEscape: false, closeOnOutsideClick: false, closeOnCancel: false, closeOnConfirm: true, stack: false }); // Style overlay + blur background external_jQuery_default()('html').addClass('session-expired-active'); external_jQuery_default()('.remodal-overlay').addClass('session-expired'); // On confirm, redirect to login $modal.off('.session-expired').on('confirmation.session-expired', function () { // Keep suppression flag for the next page load (login) so we don't double prompt window.location.href = external_GravAdmin_namespaceObject.config.base_url_relative; }); // Open modal instance.open(); } // Bind a jQuery global ajax error trap for legacy XHR paths function bindGlobalAjaxTrap() { external_jQuery_default()(document).off('ajaxError._grav_session').on('ajaxError._grav_session', function (event, xhr) { if (!xhr) { return; } var status = xhr.status || 0; if (status === 401 || status === 403) { showSessionExpiredModal(); } }); } // Intercept in-admin link clicks to show the modal before any server redirect to login function installNavigationGuard() { external_jQuery_default()(document).off('click._grav_session_nav').on('click._grav_session_nav', 'a[href]', function (e) { var $a = external_jQuery_default()(this); var href = $a.attr('href'); if (!href || href === '#' || href.indexOf('javascript:') === 0) { return; } if (e.isDefaultPrevented()) { return; } if ($a.attr('target') === '_blank' || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) { return; } // Only guard admin-relative links var base = window.GravAdmin && window.GravAdmin.config && window.GravAdmin.config.base_url_relative || ''; var isAdminLink = href.indexOf(base + '/') === 0 || href === base || href.indexOf('/') === 0; if (!isAdminLink) { return; } e.preventDefault(); // Quick session check, if invalid show modal, else proceed with navigation try { keepalive.checkOnce().then(function (ok) { if (ok) { window.location.href = href; } else { showSessionExpiredModal(); } }); } catch (err) { // On any error, just navigate window.location.href = href; } }); } /* harmony default export */ const session_expired = ({ showSessionExpiredModal: showSessionExpiredModal, bindGlobalAjaxTrap: bindGlobalAjaxTrap }); ;// ./app/utils/response.js function response_typeof(o) { "@babel/helpers - typeof"; return response_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, response_typeof(o); } // import { config } from 'grav-config'; var UNLOADING = false; var error = function error(response) { var error = new Error(response.statusText || response || ''); error.response = response; return error; }; function parseStatus(response) { return response; /* Whoops can handle JSON responses so we don't need this for now. if (response.status >= 200 && response.status < 300) { return response; } else { throw error(response); } */ } function parseJSON(response) { // If the session is no longer valid, surface a blocking modal instead of generic errors if (response && (response.status === 401 || response.status === 403)) { showSessionExpiredModal(); throw new Error('Unauthorized'); } return response.text().then(function (text) { var parsed = text; try { parsed = JSON.parse(text); } catch (error) { var content = document.createElement('div'); content.innerHTML = text; var the_error = new Error(); the_error.stack = trim_default()(content.innerText); throw the_error; } return parsed; }); } function userFeedback(response) { if (UNLOADING) { return true; } var status = response.status || (response.error ? 'error' : ''); var message = response.message || (response.error ? response.error.message : null); var settings = response.toastr || null; var backup; switch (status) { case 'unauthenticated': // Show a blocking modal and stop further processing showSessionExpiredModal(); throw error('Logged out'); case 'unauthorized': status = 'error'; message = message || 'Unauthorized.'; break; case 'error': status = 'error'; message = message || 'Unknown error.'; break; case 'success': status = 'success'; message = message || ''; break; default: status = 'error'; message = message || 'Invalid AJAX response.'; break; } if (settings && response_typeof(settings) === 'object' && settings !== null) { backup = Object.assign({}, utils_toastr.options); Object.keys(settings).forEach(function (key) { utils_toastr.options[key] = settings[key]; }); } if (message && (offline || !offline && status !== 'error')) { utils_toastr[status === 'success' ? 'success' : 'error'](message); } if (settings) { utils_toastr.options = backup; } return response; } function userFeedbackError(error) { if (UNLOADING) { return true; } // If we can detect an unauthorized state here, show modal var unauthorized = error && (error.message === 'Unauthorized' || error.response && (error.response.status === 401 || error.response.status === 403)); if (unauthorized) { showSessionExpiredModal(); return; } var stack = error.stack ? "
".concat(error.stack, "
") : ''; utils_toastr.error("Fetch Failed:
".concat(error.message, " ").concat(stack)); console.error("".concat(error.message, " at ").concat(error.stack)); } external_jQuery_default()(__webpack_require__.g).on('beforeunload._ajax', function () { UNLOADING = true; }); ;// ./app/utils/request.js function request_typeof(o) { "@babel/helpers - typeof"; return request_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, request_typeof(o); } var raw; var request = function request(url) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var callback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () { return true; }; if (typeof options === 'function') { callback = options; options = {}; } var silentErrors = !!options.silentErrors; if (options.silentErrors) { delete options.silentErrors; } if (options.method && options.method === 'post') { var data = new FormData(); options.body = Object.assign({ 'admin-nonce': external_GravAdmin_namespaceObject.config.admin_nonce }, options.body || {}); if (options.body && request_typeof(options.body) === 'object') { Object.keys(options.body).map(function (key) { return data.append(key, options.body[key]); }); } options.body = data; } options = Object.assign({ credentials: 'same-origin', headers: { 'Accept': 'application/json' } }, options); return fetch(url, options).then(function (response) { raw = response; return response; }).then(parseStatus).then(parseJSON).then(userFeedback).then(function (response) { return callback(response, raw); })["catch"](function (error) { if (silentErrors) { console.debug('[Request] silent failure', url, error); return undefined; } userFeedbackError(error); return undefined; }); }; /* harmony default export */ const utils_request = (request); ;// ./app/forms/fields/files.js function files_typeof(o) { "@babel/helpers - typeof"; return files_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, files_typeof(o); } function files_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function files_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, files_toPropertyKey(o.key), o); } } function files_createClass(e, r, t) { return r && files_defineProperties(e.prototype, r), t && files_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function files_toPropertyKey(t) { var i = files_toPrimitive(t, "string"); return "symbol" == files_typeof(i) ? i : i + ""; } function files_toPrimitive(t, r) { if ("object" != files_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != files_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // import EXIF from 'exif-js'; // translations var Dictionary = { dictCancelUpload: external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.DROPZONE_CANCEL_UPLOAD, dictCancelUploadConfirmation: external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.DROPZONE_CANCEL_UPLOAD_CONFIRMATION, dictDefaultMessage: external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.DROPZONE_DEFAULT_MESSAGE, dictFallbackMessage: external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.DROPZONE_FALLBACK_MESSAGE, dictFallbackText: external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.DROPZONE_FALLBACK_TEXT, dictFileTooBig: external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.DROPZONE_FILE_TOO_BIG, dictInvalidFileType: external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.DROPZONE_INVALID_FILE_TYPE, dictMaxFilesExceeded: external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.DROPZONE_MAX_FILES_EXCEEDED, dictRemoveFile: external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.DROPZONE_REMOVE_FILE, dictResponseError: external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.DROPZONE_RESPONSE_ERROR }; (dropzone_default()).autoDiscover = false; (dropzone_default()).options.gravPageDropzone = {}; (dropzone_default()).confirm = function (question, accepted, rejected) { var doc = external_jQuery_default()(document); var modalSelector = '[data-remodal-id="delete-media"]'; var removeEvents = function removeEvents() { doc.off('confirmation', modalSelector, accept); doc.off('cancellation', modalSelector, reject); external_jQuery_default()(modalSelector).find('.remodal-confirm').removeClass('pointer-events-disabled'); }; var accept = function accept() { accepted && accepted(); removeEvents(); }; var reject = function reject() { rejected && rejected(); removeEvents(); }; (external_jQuery_default()).remodal.lookup[external_jQuery_default()(modalSelector).data('remodal')].open(); doc.on('confirmation', modalSelector, accept); doc.on('cancellation', modalSelector, reject); }; var DropzoneMediaConfig = { timeout: 0, thumbnailWidth: 200, thumbnailHeight: 150, addRemoveLinks: false, dictDefaultMessage: external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.DROP_FILES_HERE_TO_UPLOAD.replace(/</g, '<').replace(/>/g, '>'), dictRemoveFileConfirmation: '[placeholder]', previewTemplate: "\n ").trim() }; // global.EXIF = EXIF; var ACCEPT_FUNC = function ACCEPT_FUNC(file, done, settings) { var resolution = settings.resolution; if (!resolution) return done(); var reader = new FileReader(); var error = ''; var hasMin = resolution.min && (resolution.min.width || resolution.min.height); var hasMax = resolution.max && (resolution.max.width || resolution.max.height); if (hasMin || !(settings.resizeWidth || settings.resizeHeight) && hasMax) { reader.onload = function (event) { if (!/image\//.test(file.type)) { done(); return; } var image = new Image(); image.src = event.target.result; image.onerror = function () { done(external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD); }; image.onload = function () { var _this = this; if (resolution.min) { Object.keys(resolution.min).forEach(function (attr) { if (resolution.min[attr] && _this[attr] < resolution.min[attr]) { error += external_GravAdmin_namespaceObject.translations.PLUGIN_FORM.RESOLUTION_MIN.replace(/{{attr}}/g, attr).replace(/{{min}}/g, resolution.min[attr]); } }); } if (!(settings.resizeWidth || settings.resizeHeight)) { if (resolution.max) { Object.keys(resolution.max).forEach(function (attr) { if (resolution.max[attr] && _this[attr] > resolution.max[attr]) { error += external_GravAdmin_namespaceObject.translations.PLUGIN_FORM.RESOLUTION_MAX.replace(/{{attr}}/g, attr).replace(/{{max}}/g, resolution.max[attr]); } }); } } URL.revokeObjectURL(image.src); // release memory return error ? done(error) : done(); }; }; reader.readAsDataURL(file); } else { return error ? done(error) : done(); } }; var FilesField = /*#__PURE__*/function () { function FilesField() { var _this2 = this; var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$container = _ref.container, container = _ref$container === void 0 ? '.dropzone.files-upload' : _ref$container, _ref$options = _ref.options, options = _ref$options === void 0 ? {} : _ref$options; files_classCallCheck(this, FilesField); this.container = external_jQuery_default()(container); if (!this.container.length) { return; } this.urls = {}; this.customPost = this.container.data('filePostAdd') || {}; this.options = Object.assign({}, Dictionary, DropzoneMediaConfig, { klass: this, url: this.container.data('file-url-add') || external_GravAdmin_namespaceObject.config.current_url, acceptedFiles: this.container.data('media-types'), init: this.initDropzone }, this.container.data('dropzone-options'), options); this.options = Object.assign({}, this.options, { accept: function accept(file, done) { ACCEPT_FUNC(file, done, this.options); } }); this.dropzone = new (dropzone_default())(container, this.options); this.dropzone.on('complete', this.onDropzoneComplete.bind(this)); this.dropzone.on('success', this.onDropzoneSuccess.bind(this)); this.dropzone.on('addedfile', this.onDropzoneAddedFile.bind(this)); this.dropzone.on('removedfile', this.onDropzoneRemovedFile.bind(this)); this.dropzone.on('sending', this.onDropzoneSending.bind(this)); this.dropzone.on('error', this.onDropzoneError.bind(this)); this.container.on('mouseenter', '[data-dz-view]', function (e) { var value = JSON.parse(_this2.container.find('[name][type="hidden"]').val() || '{}'); var target = external_jQuery_default()(e.currentTarget); var file = target.parent('.dz-preview').find('.dz-filename'); var filename = encodeURI(file.text()); var URL = Object.keys(value).filter(function (key) { return value[key].name === filename; }).shift(); target.attr('href', "".concat(external_GravAdmin_namespaceObject.config.base_url_simple, "/").concat(URL)); }); } return files_createClass(FilesField, [{ key: "initDropzone", value: function initDropzone() { var _this3 = this; var files = this.options.klass.container.find('[data-file]'); var dropzone = this; if (!files.length) { return; } files.each(function (index, file) { file = external_jQuery_default()(file); var data = file.data('file'); var mock = { name: data.name, size: data.size, type: data.type, status: (dropzone_default()).ADDED, accepted: true, url: _this3.options.url, removeUrl: data.remove }; dropzone.files.push(mock); dropzone.options.addedfile.call(dropzone, mock); if (mock.type.match(/^image\//)) { dropzone.options.thumbnail.call(dropzone, mock, data.path); dropzone.createThumbnailFromUrl(mock, data.path); } file.remove(); }); } }, { key: "getURI", value: function getURI() { return this.container.data('mediaUri') || ''; } }, { key: "onDropzoneSending", value: function onDropzoneSending(file, xhr, formData) { var _this4 = this; if (Object.keys(this.customPost).length) { Object.keys(this.customPost).forEach(function (key) { formData.append(key, _this4.customPost[key]); }); } else { formData.append('name', this.options.dotNotation); formData.append('task', 'filesupload'); formData.append('uri', this.getURI()); } formData.append('admin-nonce', external_GravAdmin_namespaceObject.config.admin_nonce); } }, { key: "onDropzoneSuccess", value: function onDropzoneSuccess(file, response, xhr) { response = typeof response === 'string' ? JSON.parse(response) : response; if (this.options.reloadPage) { __webpack_require__.g.location.reload(); } // store params for removing file from session before it gets saved if (response.session) { file.sessionParams = response.session; file.removeUrl = this.options.url; // Touch field value to force a mutation detection var input = this.container.find('[name][type="hidden"]'); var value = input.val(); input.val(value + ' '); } return this.handleError({ file: file, data: response, mode: 'removeFile', msg: "

".concat(external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD, " {{fileName}}

\n
").concat(response.message, "
") }); } }, { key: "onDropzoneComplete", value: function onDropzoneComplete(file) { if (!file.accepted && !file.rejected) { var data = { status: 'error', message: "".concat(external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.FILE_UNSUPPORTED, ": ").concat(file.name.match(/\..+/).join('')) }; return this.handleError({ file: file, data: data, mode: 'removeFile', msg: "

".concat(external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.FILE_ERROR_ADD, " {{fileName}}

\n
").concat(data.message, "
") }); } if (this.options.reloadPage) { __webpack_require__.g.location.reload(); } } }, { key: "b64_to_utf8", value: function b64_to_utf8(str) { str = str.replace(/\s/g, ''); return decodeURIComponent(escape(window.atob(str))); } }, { key: "onDropzoneAddedFile", value: function onDropzoneAddedFile(file) { return this.dropzone.options.addedfile(file); } }, { key: "onDropzoneRemovedFile", value: function onDropzoneRemovedFile(file) { var _this5 = this; if (!file.accepted || file.rejected) { return; } var url = file.removeUrl || this.urls["delete"] || this.options.url; var path = (url || '').match(/path:(.*)\//); var body = { filename: file.name, uri: this.getURI() }; if (file.sessionParams) { body.task = 'filessessionremove'; body.session = file.sessionParams; } var customPost = this.container.data('filePostRemove') || {}; if (Object.keys(customPost).length) { body = {}; Object.keys(customPost).forEach(function (key) { body[key] = customPost[key]; }); } body['filename'] = file.name; body['admin-nonce'] = external_GravAdmin_namespaceObject.config.admin_nonce; utils_request(url, { method: 'post', body: body }, function () { if (!path) { return; } path = _this5.b64_to_utf8(path[1]); var input = _this5.container.find('[name][type="hidden"]'); var data = JSON.parse(input.val() || '{}'); delete data[path]; input.val(JSON.stringify(data)); }); } }, { key: "onDropzoneError", value: function onDropzoneError(file, response, xhr) { var message = xhr ? response.error.message : response; external_jQuery_default()(file.previewElement).find('[data-dz-errormessage]').html(message); return this.handleError({ file: file, data: { status: 'error' }, msg: "
".concat(message, "
") }); } }, { key: "handleError", value: function handleError(options) { var file = options.file, data = options.data, mode = options.mode, msg = options.msg; if (data.status !== 'error' && data.status !== 'unauthorized') { return; } switch (mode) { case 'addBack': if (file instanceof File) { this.dropzone.addFile.call(this.dropzone, file); } else { this.dropzone.files.push(file); this.dropzone.options.addedfile.call(this.dropzone, file); this.dropzone.options.thumbnail.call(this.dropzone, file, file.extras.url); } break; case 'removeFile': default: if (~this.dropzone.files.indexOf(file)) { file.rejected = true; this.dropzone.removeFile.call(this.dropzone, file, { silent: true }); } break; } var modal = external_jQuery_default()('[data-remodal-id="generic"]'); var cleanName = file.name.replace('<', '<').replace('>', '>'); modal.find('.error-content').html(msg.replace('{{fileName}}', cleanName)); (external_jQuery_default()).remodal.lookup[modal.data('remodal')].open(); } }]); }(); function UriToMarkdown(uri) { uri = uri.replace(/@3x|@2x|@1x/, ''); uri = uri.replace(/\(/g, '%28'); uri = uri.replace(/\)/g, '%29'); var title = uri.split('.').slice(0, -1).join('.'); return uri.match(/\.(jpe?g|png|gif|svg|webp|avif|mp4|webm|ogv|mov)$/i) ? "![".concat(title, "](").concat(uri, " \"").concat(title, "\")") : "[".concat(decodeURI(uri), "](").concat(uri, ")"); } var instances = []; var cache = external_jQuery_default()(); var onAddedNodes = function onAddedNodes(event, target /* , record, instance */) { var files = external_jQuery_default()(target).find('.dropzone.files-upload'); if (!files.length) { return; } files.each(function (index, file) { file = external_jQuery_default()(file); if (!~cache.index(file)) { addNode(file); } }); }; var addNode = function addNode(container) { container = external_jQuery_default()(container); var input = container.find('input[type="file"]'); var settings = container.data('grav-file-settings') || {}; if (settings.accept && ~settings.accept.indexOf('*')) { settings.accept = ['']; } var options = { url: container.data('file-url-add') || (container.closest('form').attr('action') || external_GravAdmin_namespaceObject.config.current_url) + '.json', paramName: settings.paramName || 'file', dotNotation: settings.name || 'file', acceptedFiles: settings.accept ? settings.accept.join(',') : input.attr('accept') || container.data('media-types'), maxFilesize: typeof settings.filesize !== 'undefined' ? settings.filesize : 256, maxFiles: settings.limit || null, resizeWidth: settings.resizeWidth || null, resizeHeight: settings.resizeHeight || null, resizeQuality: settings.resizeQuality || null, resolution: settings.resolution || null, accept: function accept(file, done) { ACCEPT_FUNC(file, done, settings); } }; cache = cache.add(container); container = container[0]; instances.push(new FilesField({ container: container, options: options })); }; var Instance = function () { external_jQuery_default()('.dropzone.files-upload').each(function (i, container) { return addNode(container); }); external_jQuery_default()('body').on('mutation._grav', onAddedNodes); return instances; }(); // EXTERNAL MODULE: ./node_modules/events/events.js var events = __webpack_require__(37007); var events_default = /*#__PURE__*/__webpack_require__.n(events); ;// ./app/utils/gpm.js function gpm_typeof(o) { "@babel/helpers - typeof"; return gpm_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, gpm_typeof(o); } function gpm_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function gpm_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, gpm_toPropertyKey(o.key), o); } } function gpm_createClass(e, r, t) { return r && gpm_defineProperties(e.prototype, r), t && gpm_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function gpm_toPropertyKey(t) { var i = gpm_toPrimitive(t, "string"); return "symbol" == gpm_typeof(i) ? i : i + ""; } function gpm_toPrimitive(t, r) { if ("object" != gpm_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != gpm_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(t, e) { if (e && ("object" == gpm_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } var GPM = /*#__PURE__*/function (_EventEmitter) { function GPM() { var _this; var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'getUpdates'; gpm_classCallCheck(this, GPM); _this = _callSuper(this, GPM); _this.payload = {}; _this.raw = {}; _this.action = action; return _this; } _inherits(GPM, _EventEmitter); return gpm_createClass(GPM, [{ key: "setPayload", value: function setPayload() { var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; this.payload = payload; this.emit('payload', payload); return this; } }, { key: "setAction", value: function setAction() { var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'getUpdates'; this.action = action; this.emit('action', action); return this; } }, { key: "fetch", value: function (_fetch) { function fetch() { return _fetch.apply(this, arguments); } fetch.toString = function () { return _fetch.toString(); }; return fetch; }(function () { var _this2 = this; var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () { return true; }; var flush = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var data = new FormData(); data.append('admin-nonce', external_GravAdmin_namespaceObject.config.admin_nonce); if (flush) { data.append('flush', true); } this.emit('fetching', this); fetch("".concat(external_GravAdmin_namespaceObject.config.base_url_relative, "/update.json/task").concat(external_GravAdmin_namespaceObject.config.param_sep, "getUpdates"), { credentials: 'same-origin', method: 'post', body: data }).then(function (response) { _this2.raw = response; return response; }).then(parseStatus).then(parseJSON).then(function (response) { return _this2.response(response); }).then(function (response) { return callback(response, _this2.raw); }).then(function (response) { return _this2.emit('fetched', _this2.payload, _this2.raw, _this2); })["catch"](userFeedbackError); }) }, { key: "response", value: function response(_response) { this.payload = _response; return _response; } }]); }((events_default())); var gpm_Instance = new GPM(); // EXTERNAL MODULE: ./node_modules/mout/array/unique.js var unique = __webpack_require__(45195); var unique_default = /*#__PURE__*/__webpack_require__.n(unique); ;// ./app/updates/notifications.js function notifications_typeof(o) { "@babel/helpers - typeof"; return notifications_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, notifications_typeof(o); } function notifications_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function notifications_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, notifications_toPropertyKey(o.key), o); } } function notifications_createClass(e, r, t) { return r && notifications_defineProperties(e.prototype, r), t && notifications_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function notifications_toPropertyKey(t) { var i = notifications_toPrimitive(t, "string"); return "symbol" == notifications_typeof(i) ? i : i + ""; } function notifications_toPrimitive(t, r) { if ("object" != notifications_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != notifications_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var canFetchNotifications = function canFetchNotifications() { return external_GravAdmin_namespaceObject.config.notifications.enabled; }; var notificationsFilters = function notificationsFilters() { return external_GravAdmin_namespaceObject.config.notifications.filters; }; var Notifications = /*#__PURE__*/function () { function Notifications() { notifications_classCallCheck(this, Notifications); } return notifications_createClass(Notifications, [{ key: "fetch", value: // Grav.default.Notifications.fetch() function fetch() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$filter = _ref.filter, filter = _ref$filter === void 0 ? notificationsFilters() : _ref$filter, _ref$refresh = _ref.refresh, refresh = _ref$refresh === void 0 ? false : _ref$refresh; if (!canFetchNotifications()) { return false; } var feed = external_jQuery_default()('#notifications'); var loader = feed.find('.widget-loader'); var content = feed.find('.widget-content > ul'); loader.find('div').remove(); loader.find('.fa-warning').removeClass('fa-warning').addClass('fa-refresh fa-spin'); loader.show(); content.hide(); var processNotifications = function processNotifications(response) { var notifications = response.notifications; external_jQuery_default()('#notifications').find('.widget-content > ul').empty(); if (notifications) { Object.keys(notifications).forEach(function (location) { return Notifications.processLocation(location, notifications[location]); }); } }; utils_request("".concat(external_GravAdmin_namespaceObject.config.base_url_relative, "/task").concat(external_GravAdmin_namespaceObject.config.param_sep, "getNotifications"), { method: 'post', body: { refresh: refresh, filter: filter } }, function (response) { processNotifications(response); })["catch"](function () { var widget = external_jQuery_default()('#notifications .widget-content'); widget.find('.widget-loader').find('div').remove(); widget.find('.widget-loader').append('
Failed to retrieve notifications
').find('.fa-spin').removeClass('fa-spin fa-refresh').addClass('fa-warning'); }); } }], [{ key: "addShowAllInFeed", value: function addShowAllInFeed() { external_jQuery_default()('#notifications ul').append('
  • Show all
  • '); } }, { key: "showNotificationInFeed", value: function showNotificationInFeed(notification) { var notifications = external_jQuery_default()('#notifications').removeClass('hidden'); var loader = notifications.find('.widget-loader').hide(); var content = notifications.find('.widget-content > ul').show(); loader.find('div').remove(); loader.find('.fa-warning').removeClass('fa-warning').addClass('fa-refresh fa-spin'); content.append(notification).find('li:nth-child(n+11)').addClass('hidden'); // hide all items > 10 if (content.find('li.hidden').length) { Notifications.addShowAllInFeed(); } } }, { key: "showNotificationInTop", value: function showNotificationInTop(notification) { var container = external_jQuery_default()('.top-notifications-container'); var dummy = external_jQuery_default()('
    ').html(notification); container.removeClass('hidden').append(dummy.children()); dummy.children().slideDown(150); } }, { key: "showNotificationInDashboard", value: function showNotificationInDashboard(notification) { var container = external_jQuery_default()('.dashboard-notifications-container'); var dummy = external_jQuery_default()('
    ').html(notification); container.removeClass('hidden').append(dummy.children()); dummy.children().slideDown(150); } }, { key: "showNotificationInPlugins", value: function showNotificationInPlugins(notification) { var container = external_jQuery_default()('.plugins-notifications-container'); var dummy = external_jQuery_default()('
    ').html(notification); container.removeClass('hidden').append(dummy.children()); dummy.children().slideDown(150); } }, { key: "showNotificationInThemes", value: function showNotificationInThemes(notification) { var container = external_jQuery_default()('.themes-notifications-container'); var dummy = external_jQuery_default()('
    ').html(notification); container.removeClass('hidden').append(dummy.children()); dummy.children().slideDown(150); } }, { key: "processLocation", value: function processLocation(location, notification) { switch (location) { case 'feed': Notifications.showNotificationInFeed(notification); break; case 'top': if (!notification.read) { Notifications.showNotificationInTop(notification); } break; case 'dashboard': if (!notification.read) { Notifications.showNotificationInDashboard(notification); } break; case 'plugins': if (!notification.read) { Notifications.showNotificationInPlugins(notification); } break; case 'themes': if (!notification.read) { Notifications.showNotificationInThemes(notification); } break; } } }]); }(); var notifications = new Notifications(); /* harmony default export */ const updates_notifications = (notifications); if (canFetchNotifications()) { notifications.fetch(); /* Hide a notification and store it hidden */ // external_jQuery_default()(document).on('click', '[data-notification-action="hide-notification"]', function (event) { var notification_id = external_jQuery_default()(event.target).parents('.hide-notification').data('notification-id'); var url = "".concat(external_GravAdmin_namespaceObject.config.base_url_relative, "/notifications.json/task").concat(external_GravAdmin_namespaceObject.config.param_sep, "hideNotification/notification_id").concat(external_GravAdmin_namespaceObject.config.param_sep).concat(notification_id); utils_request(url, { method: 'post' }, function () {}); external_jQuery_default()(event.target).parents('.single-notification').hide(); }); external_jQuery_default()(document).on('click', '[data-notification-action="hide-notification"]', function (event) { var target = external_jQuery_default()(event.currentTarget); var notification = target.parent(); notification.slideUp(function () { return notification.remove(); }); }); external_jQuery_default()(document).on('click', '[data-notification-action="show-all-notifications"]', function (event) { external_jQuery_default()('#notifications .show-all').hide(); external_jQuery_default()('#notifications .hidden').removeClass('hidden'); }); external_jQuery_default()(document).on('click', '[data-refresh="notifications"]', function (event) { event.preventDefault(); notifications.fetch({ filter: ['feed'], refresh: true }); }); } ;// ./app/updates/feed.js function feed_typeof(o) { "@babel/helpers - typeof"; return feed_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, feed_typeof(o); } function feed_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function feed_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, feed_toPropertyKey(o.key), o); } } function feed_createClass(e, r, t) { return r && feed_defineProperties(e.prototype, r), t && feed_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function feed_toPropertyKey(t) { var i = feed_toPrimitive(t, "string"); return "symbol" == feed_typeof(i) ? i : i + ""; } function feed_toPrimitive(t, r) { if ("object" != feed_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != feed_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var URI = "".concat(external_GravAdmin_namespaceObject.config.base_url_relative, "/ajax.json/task").concat(external_GravAdmin_namespaceObject.config.param_sep, "getNewsFeed"); var Feed = /*#__PURE__*/function () { function Feed() { feed_classCallCheck(this, Feed); this.data = null; } return feed_createClass(Feed, [{ key: "fetch", value: function fetch() { var _this = this; var refresh = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {}; utils_request(URI, { method: 'post', body: { refresh: refresh } }, function (response) { _this.data = response; callback(response); }); } }, { key: "refresh", value: function refresh() { var _refresh = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var feed = external_jQuery_default()('#news-feed .widget-content'); if (!feed.length) { return; } var loader = feed.find('.widget-loader'); loader.find('div').remove(); loader.find('.fa-warning').removeClass('fa-warning').addClass('fa-refresh fa-spin'); loader.show(); feed.find('> ul').hide(); if (!this.data || this.data.error || _refresh) { this.fetch(_refresh, this.updateContent.bind(this)); } else { this.updateContent(); } } }, { key: "updateContent", value: function updateContent() { var feed = external_jQuery_default()('#news-feed .widget-content'); if (!feed.length) { return; } var loader = feed.find('.widget-loader').hide(); var content = feed.find('> ul').empty().show(); if (this.data.error || this.data.status === 'error') { loader.show().find('div').remove(); loader.find('.fa-refresh').removeClass('fa-refresh fa-spin').addClass('fa-warning'); loader.append("
    ".concat(this.data.error ? this.data.error.message : this.data.message || 'Unable to download news feed', "
    ")); return; } if (this.data && this.data.feed_data) { content.append(this.data.feed_data); } } }]); }(); var feed = new Feed(); external_jQuery_default()(document).ready(function () { return feed.refresh(); }); external_jQuery_default()(document).on('click', '[data-refresh="feed"]', function (event) { event.preventDefault(); feed.refresh(true); }); /* harmony default export */ const updates_feed = (feed); ;// ./app/updates/check.js // Check for updates trigger external_jQuery_default()('[data-gpm-checkupdates]').on('click', function () { var element = external_jQuery_default()(this); element.find('i').addClass('fa-spin'); gpm_Instance.fetch(function (response) { element.find('i').removeClass('fa-spin'); var payload = response.payload; if (!payload) { return; } if (!payload.grav.isUpdatable && !payload.resources.total) { utils_toastr.success(external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.EVERYTHING_UP_TO_DATE); } else { var grav = payload.grav.isUpdatable ? 'Grav v' + payload.grav.available : ''; var resources = payload.resources.total ? payload.resources.total + ' ' + external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.UPDATES_ARE_AVAILABLE : ''; if (!resources) { grav += ' ' + external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.IS_AVAILABLE_FOR_UPDATE; } utils_toastr.info(grav + (grav && resources ? ' ' + external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.AND + ' ' : '') + resources); } }, true); }); ;// ./app/utils/formatbytes.js var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; function formatBytes(bytes, decimals) { if (bytes === 0) return '0 Byte'; var k = 1000; var value = Math.floor(Math.log(bytes) / Math.log(k)); var decimal = decimals + 1 || 3; return (bytes / Math.pow(k, value)).toPrecision(decimal) + ' ' + sizes[value]; } ;// ./app/updates/update.js // Dashboard update and Grav update external_jQuery_default()(document).on('click.remodal', '[data-remodal-id="update-grav"] [data-remodal-action="confirm"]', function () { var element = external_jQuery_default()('#grav-update-button'); // Safely get the file size with fallback var sizeText = ''; if (updates_Instance.payload && updates_Instance.payload.grav && updates_Instance.payload.grav.assets && updates_Instance.payload.grav.assets['grav-update'] && updates_Instance.payload.grav.assets['grav-update'].size) { sizeText = " ".concat(formatBytes(updates_Instance.payload.grav.assets['grav-update'].size)); } element.html("".concat(external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.UPDATING_PLEASE_WAIT).concat(sizeText, "..")); element.attr('disabled', 'disabled').find('> .fa').removeClass('fa-cloud-download').addClass('fa-refresh fa-spin'); utils_request(updates_Instance.updateURL, function (response) { if (response.type === 'updategrav') { external_jQuery_default()('[data-gpm-grav]').remove(); external_jQuery_default()('#footer .grav-version').html(response.version); } element.removeAttr('disabled').find('> .fa').removeClass('fa-refresh fa-spin').addClass('fa-cloud-download'); }); }); ;// ./app/updates/channel-switcher.js var switcher = external_jQuery_default()('input[type="radio"][name="channel-switch"]'); if (switcher) { switcher.on('change', function (event) { var radio = external_jQuery_default()(event.target); var url = "".concat(radio.parent('[data-url]').data('url')); utils_request(url, { method: 'post', body: { task: 'gpmRelease', release: radio.val() } }, function (response) { if (response.reload) { __webpack_require__.g.location.reload(); } }); }); } ;// ./app/updates/safe-upgrade.js function safe_upgrade_typeof(o) { "@babel/helpers - typeof"; return safe_upgrade_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, safe_upgrade_typeof(o); } function safe_upgrade_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function safe_upgrade_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, safe_upgrade_toPropertyKey(o.key), o); } } function safe_upgrade_createClass(e, r, t) { return r && safe_upgrade_defineProperties(e.prototype, r), t && safe_upgrade_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function safe_upgrade_toPropertyKey(t) { var i = safe_upgrade_toPrimitive(t, "string"); return "symbol" == safe_upgrade_typeof(i) ? i : i + ""; } function safe_upgrade_toPrimitive(t, r) { if ("object" != safe_upgrade_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != safe_upgrade_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var t = function t(key) { var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; if (external_GravAdmin_namespaceObject.translations && external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN && external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN[key]) { return external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN[key]; } return fallback; }; var r = function r(key, value) { var fallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var template = t(key, fallback); if (!template || typeof template.replace !== 'function') { return fallback.replace('%s', value); } return template.replace('%s', value); }; var STAGE_TITLES = { queued: function queued() { return t('SAFE_UPGRADE_STAGE_QUEUED', 'Waiting for worker'); }, initializing: function initializing() { return t('SAFE_UPGRADE_STAGE_INITIALIZING', 'Preparing upgrade'); }, downloading: function downloading() { return t('SAFE_UPGRADE_STAGE_DOWNLOADING', 'Downloading update'); }, snapshot: function snapshot() { return t('SAFE_UPGRADE_STAGE_SNAPSHOT', 'Creating backup snapshot'); }, installing: function installing() { return t('SAFE_UPGRADE_STAGE_INSTALLING', 'Installing update'); }, rollback: function rollback() { return t('SAFE_UPGRADE_STAGE_ROLLBACK', 'Restoring snapshot'); }, finalizing: function finalizing() { return t('SAFE_UPGRADE_STAGE_FINALIZING', 'Finalizing changes'); }, complete: function complete() { return t('SAFE_UPGRADE_STAGE_COMPLETE', 'Upgrade complete'); }, error: function error() { return t('SAFE_UPGRADE_STAGE_ERROR', 'Upgrade encountered an error'); } }; var SafeUpgrade = /*#__PURE__*/function () { function SafeUpgrade(updatesInstance) { safe_upgrade_classCallCheck(this, SafeUpgrade); this.updates = updatesInstance; this.modalElement = external_jQuery_default()('[data-remodal-id="update-grav"]'); this.modal = this.modalElement.remodal({ hashTracking: false }); this.steps = { preflight: this.modalElement.find('[data-safe-upgrade-step="preflight"]'), progress: this.modalElement.find('[data-safe-upgrade-step="progress"]'), result: this.modalElement.find('[data-safe-upgrade-step="result"]') }; this.buttons = { start: this.modalElement.find('[data-safe-upgrade-action="start"]'), cancel: this.modalElement.find('[data-safe-upgrade-action="cancel"]'), recheck: this.modalElement.find('[data-safe-upgrade-action="recheck"]'), finish: this.modalElement.find('[data-safe-upgrade-action="finish"]') }; this.urls = this.buildUrls(); this.decisions = {}; this.pollTimer = null; this.statusRequest = null; this.isPolling = false; this.active = false; this.jobId = null; this.statusFailures = 0; this.statusContext = null; this.statusIdleCount = 0; this.currentStage = null; this.stageEnteredAt = 0; this.directStatusUrl = this.resolveDirectStatusUrl(); this.preferDirectStatus = !!this.directStatusUrl; this.modalLocked = false; this.lastOverallPercent = 0; this.registerEvents(); } return safe_upgrade_createClass(SafeUpgrade, [{ key: "buildUrls", value: function buildUrls() { var task = "task".concat(external_GravAdmin_namespaceObject.config.param_sep); var nonce = "admin-nonce".concat(external_GravAdmin_namespaceObject.config.param_sep).concat(external_GravAdmin_namespaceObject.config.admin_nonce); var base = "".concat(external_GravAdmin_namespaceObject.config.base_url_relative, "/update.json"); return { preflight: "".concat(base, "/").concat(task, "safeUpgradePreflight/").concat(nonce), start: "".concat(base, "/").concat(task, "safeUpgradeStart/").concat(nonce), status: "".concat(base, "/").concat(task, "safeUpgradeStatus/").concat(nonce) }; } }, { key: "registerEvents", value: function registerEvents() { var _this = this; external_jQuery_default()(document).on('click', '#grav-update-button', function (event) { if (external_jQuery_default()(event.currentTarget).hasClass('pointer-events-none')) { return; } event.preventDefault(); _this.open(); }); this.modalElement.on('closed', function () { _this.stopPolling(); _this.active = false; }); this.modalElement.on('click', '[data-safe-upgrade-action="recheck"]', function (event) { event.preventDefault(); if (!_this.active) { return; } _this.fetchPreflight(true); }); this.modalElement.on('click', '[data-safe-upgrade-action="start"]', function (event) { event.preventDefault(); if (external_jQuery_default()(event.currentTarget).prop('disabled')) { return; } _this.startUpgrade(); }); this.modalElement.on('click', '[data-safe-upgrade-action="finish"]', function (event) { event.preventDefault(); var button = external_jQuery_default()(event.currentTarget); if (button.prop('disabled')) { return; } _this.modalLocked = false; _this.modal.close('finish'); setTimeout(function () { return window.location.reload(); }, 75); }); this.modalElement.on('change', '[data-safe-upgrade-decision]', function (event) { var target = external_jQuery_default()(event.currentTarget); var decision = target.val(); var type = target.data('safe-upgrade-decision'); _this.decisions[type] = decision; _this.updateStartButtonState(); }); this.modalElement.on('closing', function (event) { if (_this.modalLocked && event.reason !== 'finish') { event.preventDefault(); } }); } }, { key: "setPayload", value: function setPayload() { var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; this.payload = payload; } }, { key: "open", value: function open() { this.active = true; this.decisions = {}; this.statusFailures = 0; this.preferDirectStatus = !!this.directStatusUrl; this.statusContext = null; this.statusIdleCount = 0; this.currentStage = null; this.stageEnteredAt = 0; this.modalLocked = false; this.lastOverallPercent = 0; this.renderLoading(); this.modal.open(); this.fetchPreflight(); } }, { key: "renderLoading", value: function renderLoading() { this.modalLocked = false; this.resetFooterButtons(); this.switchStep('preflight'); this.steps.preflight.html("\n
    \n \n

    ".concat(t('SAFE_UPGRADE_CHECKING', 'Running preflight checks...'), "

    \n
    \n ")); this.buttons.start.prop('disabled', true).addClass('hidden'); this.modalElement.find('[data-safe-upgrade-footer]').removeClass('hidden'); } }, { key: "fetchPreflight", value: function fetchPreflight() { var _this2 = this; var silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; if (!silent) { this.renderLoading(); } else { this.setRecheckLoading(true); } var done = function done() { if (silent) { _this2.setRecheckLoading(false); } }; var requestPromise = utils_request(this.urls.preflight, function (response) { if (!_this2.active) { done(); return; } if (response.status === 'error') { done(); _this2.renderPreflightError(response.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.')); return; } _this2.renderPreflight(response.data || {}); done(); }); if (silent && requestPromise && typeof requestPromise["catch"] === 'function') { requestPromise["catch"](function () { return done(); }); } } }, { key: "renderPreflightError", value: function renderPreflightError(message) { this.switchStep('preflight'); this.steps.preflight.html("\n
    \n

    ".concat(message, "

    \n \n
    \n ")); this.buttons.start.prop('disabled', true).addClass('hidden'); } }, { key: "renderPreflight", value: function renderPreflight(data) { var blockers = []; var version = data.version || {}; var releaseDate = version.release_date || ''; var packageSize = version.package_size ? formatBytes(version.package_size) : t('SAFE_UPGRADE_UNKNOWN_SIZE', 'unknown'); var warnings = data.preflight && data.preflight.warnings || []; var pending = data.preflight && data.preflight.plugins_pending || {}; var isMajorUpgrade = !!(data.preflight && data.preflight.is_major_minor_upgrade); var hasPendingUpdates = Object.keys(pending).length > 0; var psrConflicts = data.preflight && data.preflight.psr_log_conflicts || {}; var monologConflicts = data.preflight && data.preflight.monolog_conflicts || {}; if (data.status === 'error') { blockers.push(data.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.')); } if (!data.requirements || !data.requirements.meets) { blockers.push(r('SAFE_UPGRADE_REQUIREMENTS_FAIL', data.requirements ? data.requirements.minimum_php : '?', 'PHP %s or newer is required before continuing.')); } if (data.symlinked) { blockers.push(t('GRAV_SYMBOLICALLY_LINKED', 'Grav is symbolically linked. Upgrade will not be available.')); } if (data.safe_upgrade && data.safe_upgrade.enabled === false) { blockers.push(t('SAFE_UPGRADE_DISABLED', 'Safe upgrade is disabled. Enable it in Configuration â–¶ System â–¶ Updates.')); } if (!data.safe_upgrade || !data.safe_upgrade.staging_ready) { var err = data.safe_upgrade && data.safe_upgrade.error ? data.safe_upgrade.error : t('SAFE_UPGRADE_STAGING_ERROR', 'Safe upgrade staging directory is not writable.'); blockers.push(err); } if (!data.upgrade_available) { blockers.push(t('SAFE_UPGRADE_NOT_AVAILABLE', 'No Grav update is available.')); } if (hasPendingUpdates && isMajorUpgrade) { blockers.push(t('SAFE_UPGRADE_PENDING_HINT', 'Because this is a major upgrade, update all plugins and themes before continuing to ensure maximum compatibility.')); } var psrWarningItems = Object.keys(psrConflicts).map(function (slug) { var info = psrConflicts[slug] || {}; var requires = info.requires || '*'; return "
  • ".concat(t('SAFE_UPGRADE_WARNINGS_PSR_ITEM', 'Potential psr/log conflict:'), " ").concat(slug, " — ").concat(r('SAFE_UPGRADE_CONFLICTS_REQUIRES', requires, 'Requires psr/log %s'), "
  • "); }); var monologWarningItems = Object.keys(monologConflicts).map(function (slug) { var entries = Array.isArray(monologConflicts[slug]) ? monologConflicts[slug] : []; var details = entries.map(function (entry) { var method = entry.method || ''; var file = entry.file ? basename(entry.file) : ''; return "".concat(method, " ").concat(file ? "".concat(file, "") : '', ""); }).join(', '); var description = details || t('SAFE_UPGRADE_WARNINGS_MONOLOG_UNKNOWN', 'Review the plugin for potential API changes.'); return "
  • ".concat(t('SAFE_UPGRADE_WARNINGS_MONOLOG_ITEM', 'Potential Monolog conflict:'), " ").concat(slug, " — ").concat(description, "
  • "); }); var filteredWarnings = warnings.filter(function (warning) { var lower = (warning || '').toLowerCase(); var isPsrRelated = lower.includes('psr/log'); var isMonologRelated = lower.includes('monolog'); return !isPsrRelated && !isMonologRelated; }); var warningsList = filteredWarnings.length || psrWarningItems.length || monologWarningItems.length ? "\n
    \n
    \n
    \n \n
    \n ".concat(t('SAFE_UPGRADE_WARNINGS', 'Warnings'), "\n ").concat(t('SAFE_UPGRADE_WARNINGS_HINT', 'These items may require attention before continuing.'), "\n
    \n
    \n
    \n
    \n
      \n ").concat(filteredWarnings.map(function (warning) { return "
    • ".concat(warning, "
    • "); }).join(''), "\n ").concat(psrWarningItems.join(''), "\n ").concat(monologWarningItems.join(''), "\n
    \n
    \n
    \n ") : ''; var pendingList = hasPendingUpdates ? "\n
    \n
    \n
    \n \n
    \n ".concat(t('SAFE_UPGRADE_PENDING_UPDATES', 'Pending plugin or theme updates'), "\n ").concat(isMajorUpgrade ? t('SAFE_UPGRADE_PENDING_INTRO', 'Because this is a major Grav upgrade, update these extensions first to ensure maximum compatibility.') : t('SAFE_UPGRADE_PENDING_MINOR_DESC', 'These updates are optional for this release; apply them at your convenience.'), "\n
    \n
    \n
    \n
    \n
      \n ").concat(Object.keys(pending).map(function (slug) { var item = pending[slug] || {}; var type = item.type || 'plugin'; var current = item.current || t('SAFE_UPGRADE_UNKNOWN_VERSION', 'unknown'); var next = item.available || t('SAFE_UPGRADE_UNKNOWN_VERSION', 'unknown'); return "
    • ".concat(slug, " (").concat(type, ") ").concat(current, " → ").concat(next, "
    • "); }).join(''), "\n
    \n
    \n
    \n ") : ''; var psrList = Object.keys(psrConflicts).length ? "\n
    \n
    \n
    \n \n
    \n ".concat(t('SAFE_UPGRADE_CONFLICTS_PSR', 'Potential psr/log compatibility issues'), "\n ").concat(t('SAFE_UPGRADE_CONFLICTS_HINT', 'Choose how to handle conflicts before starting the upgrade.'), "\n
    \n
    \n ").concat(this.renderDecisionSelect('psr_log'), "\n
    \n
    \n ") : ''; var monologList = Object.keys(monologConflicts).length ? "\n
    \n
    \n
    \n \n
    \n ".concat(t('SAFE_UPGRADE_CONFLICTS_MONOLOG', 'Potential Monolog API compatibility issues'), "\n ").concat(t('SAFE_UPGRADE_CONFLICTS_HINT', 'Choose how to handle conflicts before starting the upgrade.'), "\n
    \n
    \n ").concat(this.renderDecisionSelect('monolog'), "\n
    \n
    \n ") : ''; var blockersList = blockers.length ? "\n
    \n
    \n
    \n \n
    \n ".concat(t('SAFE_UPGRADE_BLOCKERS_TITLE', 'Action required before continuing'), "\n ").concat(t('SAFE_UPGRADE_BLOCKERS_DESC', 'Resolve the following items to enable the upgrade.'), "\n
    \n
    \n
    \n
    \n
      ").concat(blockers.map(function (item) { return "
    • ".concat(item, "
    • "); }).join(''), "
    \n
    \n
    \n ") : ''; var summary = "\n
    \n

    ".concat(r('SAFE_UPGRADE_SUMMARY_CURRENT', version.local || '?', 'Current Grav version: v%s'), "

    \n

    ").concat(r('SAFE_UPGRADE_SUMMARY_REMOTE', version.remote || '?', 'Available Grav version: v%s'), "

    \n

    ").concat(releaseDate ? r('SAFE_UPGRADE_RELEASED_ON', releaseDate, 'Released on %s') : '', "

    \n

    ").concat(r('SAFE_UPGRADE_PACKAGE_SIZE', packageSize, 'Package size: %s'), "

    \n
    \n "); this.steps.preflight.html("\n
    \n ".concat(summary, "\n ").concat(warningsList, "\n ").concat(pendingList, "\n ").concat(psrList, "\n ").concat(monologList, "\n ").concat(blockersList, "\n
    \n ")); this.switchStep('preflight'); var hasBlockingConflicts = Object.keys(psrConflicts).length && !this.decisions.psr_log || Object.keys(monologConflicts).length && !this.decisions.monolog; var canStart = !blockers.length && !hasBlockingConflicts; this.buttons.start.removeClass('hidden').prop('disabled', !canStart).text(t('SAFE_UPGRADE_START', 'Start Safe Upgrade')); if (Object.keys(psrConflicts).length && !this.decisions.psr_log) { this.decisions.psr_log = 'disable'; } if (Object.keys(monologConflicts).length && !this.decisions.monolog) { this.decisions.monolog = 'disable'; } this.updateStartButtonState(); } }, { key: "renderDecisionSelect", value: function renderDecisionSelect(type) { var currentDecision = this.decisions[type] || 'disable'; var name = "safe-upgrade-decision-".concat(type); var ariaLabel = t('SAFE_UPGRADE_DECISION_PROMPT', 'When conflicts are detected:'); var options = [{ value: 'disable', label: t('SAFE_UPGRADE_DECISION_DISABLE', 'Disable conflicting plugins'), description: t('SAFE_UPGRADE_DECISION_DISABLE_DESC', 'Temporarily disable conflicting plugins during the upgrade.') }, { value: 'continue', label: t('SAFE_UPGRADE_DECISION_CONTINUE', 'Continue with plugins enabled'), description: t('SAFE_UPGRADE_DECISION_CONTINUE_DESC', 'Proceed with plugins enabled. This may require manual fixes.') }]; return "\n
    \n ").concat(options.map(function (option) { return "\n \n "); }).join(''), "\n
    \n "); } }, { key: "updateStartButtonState", value: function updateStartButtonState() { var _this3 = this; var decisionInputs = this.modalElement.find('[data-safe-upgrade-decision]'); var unresolved = []; decisionInputs.each(function (index, element) { var input = external_jQuery_default()(element); var key = input.data('safe-upgrade-decision'); if (!_this3.decisions[key]) { unresolved.push(key); } }); var hasUnresolvedConflicts = unresolved.length > 0; var blockers = this.steps.preflight.find('.safe-upgrade-blockers li'); var disabled = hasUnresolvedConflicts || blockers.length > 0; this.buttons.start.prop('disabled', disabled); } }, { key: "setRecheckLoading", value: function setRecheckLoading(state) { var button = this.modalElement.find('[data-safe-upgrade-action="recheck"]'); if (!button.length) { return; } var dataKey = 'safe-upgrade-recheck-label'; if (state) { if (!button.data(dataKey)) { button.data(dataKey, button.html()); } button.prop('disabled', true).addClass('is-loading').html("\n \n ".concat(t('SAFE_UPGRADE_RECHECKING', 'Re-running Checks...'), "\n ")); } else { var original = button.data(dataKey); button.prop('disabled', false).removeClass('is-loading'); if (original) { button.html(original); button.removeData(dataKey); } else { button.html(t('SAFE_UPGRADE_RECHECK', 'Re-run Checks')); } } } }, { key: "startUpgrade", value: function startUpgrade() { var _this4 = this; this.switchStep('progress'); this.lastOverallPercent = 0; this.renderProgress({ stage: 'initializing', message: t('SAFE_UPGRADE_STAGE_INITIALIZING', 'Preparing upgrade'), percent: 0 }); this.buttons.start.prop('disabled', true); this.buttons.finish.addClass('hidden').prop('disabled', true); this.modalLocked = false; this.stopPolling(); this.jobId = null; var decisionFields = {}; Object.keys(this.decisions || {}).forEach(function (key) { var value = _this4.decisions[key]; if (value) { decisionFields["decisions[".concat(key, "]")] = value; } }); var body = decisionFields; utils_request(this.urls.start, { method: 'post', body: body }, function (response) { if (!_this4.active) { return; } if (response.status === 'error') { _this4.stopPolling(); _this4.renderProgress({ stage: 'error', message: response.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.'), percent: null }); _this4.renderResult({ status: 'error', message: response.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.') }); return; } var data = response.data || {}; if (data.status === 'error') { _this4.stopPolling(); _this4.renderProgress({ stage: 'error', message: data.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.'), percent: null }); _this4.renderResult(data); return; } if (data.fallback) { _this4.renderResult(data); _this4.stopPolling(); _this4.renderProgress({ stage: data.status === 'success' ? 'complete' : 'error', message: data.message || t('SAFE_UPGRADE_STAGE_COMPLETE', 'Upgrade complete'), percent: data.status === 'success' ? 100 : null, target_version: data.version || data.manifest && data.manifest.target_version || null, manifest: data.manifest || null }); return; } if (data.status === 'queued' && data.job_id) { _this4.jobId = data.job_id; if (data.progress) { _this4.renderProgress(data.progress); } _this4.statusFailures = 0; _this4.preferDirectStatus = !!_this4.directStatusUrl; _this4.statusContext = data.context || null; _this4.beginPolling(1200); } else { _this4.renderResult(data); _this4.stopPolling(); } }); } }, { key: "resolveDirectStatusUrl", value: function resolveDirectStatusUrl() { var scriptPath = '/___safe-upgrade-status'; var join = function join(base, path) { if (!base) { return path; } var trimmed = base.endsWith('/') ? base.slice(0, -1) : base; return "".concat(trimmed).concat(path); }; var normalize = function normalize(url) { return url.replace(/([^:]\/)\/+/g, '$1'); }; var candidates = [external_GravAdmin_namespaceObject.config.base_url_simple || '', (external_GravAdmin_namespaceObject.config.base_url_relative || '').replace(/\/admin\/?$/, ''), '']; for (var _i = 0, _candidates = candidates; _i < _candidates.length; _i++) { var base = _candidates[_i]; if (typeof base !== 'string') { continue; } var candidate = normalize(join(base, scriptPath)); if (candidate) { return candidate; } } return scriptPath; } }, { key: "resolveStatusEndpoint", value: function resolveStatusEndpoint() { var useDirect = this.directStatusUrl && this.preferDirectStatus; var url = useDirect ? this.directStatusUrl : this.urls.status; var params = []; if (this.jobId) { params.push("job=".concat(encodeURIComponent(this.jobId))); } if (this.statusContext) { params.push("context=".concat(encodeURIComponent(this.statusContext))); } if (params.length) { url += (url.includes('?') ? '&' : '?') + params.join('&'); } return { url: url, direct: useDirect }; } }, { key: "beginPolling", value: function beginPolling() { var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1200; if (this.isPolling) { return; } this.isPolling = true; this.schedulePoll(delay); } }, { key: "schedulePoll", value: function schedulePoll() { var _this5 = this; var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1200; this.clearPollTimer(); if (!this.isPolling) { return; } this.pollTimer = setTimeout(function () { return _this5.fetchStatus(true); }, delay); } }, { key: "clearPollTimer", value: function clearPollTimer() { if (this.pollTimer) { clearTimeout(this.pollTimer); this.pollTimer = null; } } }, { key: "fetchStatus", value: function fetchStatus() { var _this6 = this; var silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; if (this.statusRequest) { return; } this.pollTimer = null; var nextStage = null; var jobComplete = false; var jobFailed = false; var handled = false; var lastPayload = null; console.debug('[SafeUpgrade] poll status'); var endpoint = this.resolveStatusEndpoint(); var statusUrl = endpoint.url; var usingDirect = endpoint.direct; var requestOptions = { silentErrors: true }; this.statusRequest = utils_request(statusUrl, requestOptions, function (response) { console.debug('[SafeUpgrade] status response', response); if (!response) { _this6.statusFailures += 1; return; } handled = true; _this6.statusFailures = 0; if (response.status === 'error') { if (!silent) { _this6.renderProgress({ stage: 'error', message: response.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.'), percent: null }); } nextStage = 'error'; jobFailed = true; return; } var payload = response.data || {}; lastPayload = payload; if (Object.prototype.hasOwnProperty.call(payload, 'context')) { _this6.statusContext = payload.context || null; } var job = payload.job || {}; var data = payload.progress || payload; nextStage = data.stage || null; if (!job || !Object.keys(job).length) { _this6.statusIdleCount += 1; } else { _this6.statusIdleCount = 0; } _this6.renderProgress(data, job); if (job.status === 'error') { nextStage = 'error'; var message = job.error || data.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.'); _this6.renderProgress({ stage: 'error', message: message, percent: null }, job); jobFailed = true; } else if (job.status === 'success') { if (data.stage !== 'complete') { var completePayload = { stage: 'complete', message: t('SAFE_UPGRADE_STAGE_COMPLETE', 'Upgrade complete'), percent: 100, target_version: job.result && job.result.version || data.target_version || null, manifest: job.result && job.result.manifest || data.manifest || null }; _this6.renderProgress(completePayload, job); nextStage = 'complete'; } jobComplete = true; } else if (!job.status && data.stage === 'complete') { jobComplete = true; } }); var finalize = function finalize() { _this6.statusRequest = null; if (!_this6.isPolling) { return; } if (!handled) { if (usingDirect && _this6.statusFailures >= 3) { _this6.preferDirectStatus = false; _this6.statusFailures = 0; _this6.statusIdleCount = 0; _this6.schedulePoll(); } else { var delay = Math.min(5000, 1200 * Math.max(1, _this6.statusFailures)); _this6.schedulePoll(delay); } } else if ((!lastPayload || !lastPayload.job || !Object.keys(lastPayload.job).length) && usingDirect && _this6.statusIdleCount >= 5) { _this6.preferDirectStatus = false; _this6.statusFailures = 0; _this6.statusIdleCount = 0; _this6.schedulePoll(); } else if (jobFailed) { _this6.stopPolling(); _this6.jobId = null; } else if (jobComplete || nextStage === 'complete') { _this6.stopPolling(); _this6.jobId = null; } else { _this6.schedulePoll(); } }; this.statusRequest.then(finalize, finalize); } }, { key: "renderProgress", value: function renderProgress(data) { var _this7 = this; var job = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (!data) { return; } var stage = data.stage || 'initializing'; if (stage !== this.currentStage) { this.currentStage = stage; this.stageEnteredAt = Date.now(); } var titleResolver = STAGE_TITLES[stage] || STAGE_TITLES.initializing; var title = titleResolver(); var percent = typeof data.percent === 'number' ? data.percent : null; var scaledPercent = function scaledPercent() { if (stage === 'queued') { return 0; } if (stage === 'initializing') { return percent !== null ? Math.min(Math.max(percent, 0), 5) : 5; } if (stage === 'downloading') { return _this7.scaleStagePercent(5, 45, percent, 2); } if (stage === 'snapshot') { return _this7.scaleStagePercent(45, 70, percent, 2); } if (stage === 'installing') { return _this7.scaleStagePercent(70, 95, percent, 3); } if (stage === 'rollback') { return _this7.scaleStagePercent(40, 95, percent, 3); } if (stage === 'finalizing') { return _this7.scaleStagePercent(50, 99, percent, 1.5); } if (stage === 'complete') { return 100; } if (stage === 'error') { return null; } return percent; }; percent = scaledPercent(); if (percent !== null) { var baseline = typeof this.lastOverallPercent === 'number' ? this.lastOverallPercent : 0; percent = Math.max(percent, baseline); this.lastOverallPercent = percent; } var displayPercent = percent !== null ? Math.round(percent) : null; var percentLabel = displayPercent !== null ? "".concat(displayPercent, "%") : ''; var message = typeof data.message === 'string' ? data.message : ''; var normalize = function normalize(value) { return value.replace(/\u2026/g, '...').replace(/\.+$/, '').trim().toLowerCase(); }; var normalizedTitle = normalize(title || ''); var normalizedMessage = normalize(message || ''); var shouldShowMessage = stage === 'error' ? message.trim().length > 0 : message && stage !== 'installing' && stage !== 'finalizing' && normalizedMessage !== '' && normalizedMessage !== normalizedTitle; var statusLine = job && job.status ? "

    ".concat(t('SAFE_UPGRADE_JOB_STATUS', 'Status'), ": ").concat(job.status.toUpperCase(), "").concat(job.error ? " — ".concat(job.error) : '', "

    ") : ''; var animateBar = stage !== 'complete' && stage !== 'error' && percent !== null; var barClass = "safe-upgrade-progress-bar".concat(animateBar ? ' is-active' : ''); var detailMessage = shouldShowMessage ? "

    ".concat(message, "

    ") : ''; this.steps.progress.html("\n
    \n

    ".concat(title, "

    \n ").concat(detailMessage, "\n ").concat(statusLine, "\n ").concat(percentLabel ? "
    ").concat(percentLabel, "
    ") : '', "\n
    \n ")); this.switchStep('progress'); if (stage === 'complete') { this.renderResult({ status: 'success', manifest: data.manifest || null, version: data.target_version || null }); } else if (stage === 'error') { this.renderResult({ status: 'error', message: data.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.') }); } } }, { key: "renderResult", value: function renderResult(result) { var status = result.status || 'success'; if (status === 'success' || status === 'finalized') { var manifest = result.manifest || {}; var target = result.version || manifest.target_version || ''; var identifier = manifest.id || ''; this.ensureSuccessBannerStyles(); this.steps.result.html("\n
    \n
    \n \n
    \n

    ".concat(t('SAFE_UPGRADE_STAGE_COMPLETE', 'Upgrade complete'), "

    \n

    ").concat(r('SAFE_UPGRADE_RESULT_SUCCESS', target, 'Grav Upgrade to v%s Successful!'), "

    \n
    \n
    \n
    \n ").concat(identifier ? "

    ".concat(r('SAFE_UPGRADE_RESULT_MANIFEST', identifier, 'Snapshot reference: %s'), "

    ") : '', "\n

    ").concat(t('SAFE_UPGRADE_RESULT_HINT', 'Restore snapshots from Tools → Restore Grav.'), "

    \n
    \n
    \n ")); this.switchStep('result'); external_jQuery_default()('[data-gpm-grav]').remove(); if (target) { external_jQuery_default()('#footer .grav-version').html("v".concat(target)); } if (this.updates) { this.updates.fetch(true); } this.prepareCompletionFooter(); } else if (status === 'noop') { this.steps.result.html("\n
    \n

    ".concat(t('SAFE_UPGRADE_RESULT_NOOP', 'Grav is already up to date.'), "

    \n
    \n ")); this.switchStep('result'); this.prepareCompletionFooter(); } else { this.steps.result.html("\n
    \n

    ".concat(t('SAFE_UPGRADE_RESULT_FAILURE', 'Safe upgrade failed'), "

    \n

    ").concat(result.message || t('SAFE_UPGRADE_GENERIC_ERROR', 'Safe upgrade could not complete. See Grav logs for details.'), "

    \n
    \n ")); this.switchStep('result'); this.modalLocked = false; this.buttons.finish.addClass('hidden').prop('disabled', true); this.buttons.cancel.removeClass('hidden').prop('disabled', false); this.buttons.recheck.removeClass('hidden').prop('disabled', false); } } }, { key: "ensureSuccessBannerStyles", value: function ensureSuccessBannerStyles() { if (external_jQuery_default()('#safe-upgrade-success-banner-styles').length) { return; } var css = "\n .safe-upgrade-result.success {\n background: rgba(41, 182, 94, 0.08);\n border: 1px solid rgba(41, 182, 94, 0.24);\n border-radius: 12px;\n padding: 1.3rem 1.4rem;\n box-shadow: 0 14px 32px rgba(41, 182, 94, 0.18);\n margin-bottom: 1rem;\n text-align: left;\n }\n .safe-upgrade-result.success .safe-upgrade-result__banner {\n display: flex;\n align-items: center;\n gap: 0.9rem;\n margin-bottom: 0.85rem;\n }\n .safe-upgrade-result.success .safe-upgrade-result__icon {\n width: 44px;\n height: 44px;\n border-radius: 50%;\n background: #27ae60;\n color: #fff;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 1.25rem;\n box-shadow: 0 10px 22px rgba(39, 174, 96, 0.35);\n }\n .safe-upgrade-result.success .safe-upgrade-result__label {\n font-size: 0.82rem;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n font-weight: 600;\n margin: 0 0 0.15rem;\n color: rgba(39, 174, 96, 0.85);\n }\n .safe-upgrade-result.success h3 {\n margin: 0;\n font-size: 1.2rem;\n color: #14301d;\n }\n .safe-upgrade-result.success .safe-upgrade-result__details {\n font-size: 0.95rem;\n color: rgba(20, 48, 29, 0.9);\n }\n .safe-upgrade-result.success .safe-upgrade-result__details p {\n margin: 0.4rem 0;\n }\n "; external_jQuery_default()('