diff --git a/admin.php b/admin.php index a90e80d3..5f0dd4cc 100644 --- a/admin.php +++ b/admin.php @@ -1,6 +1,7 @@ config->get('plugins.login.enabled')) { throw new \RuntimeException($this->grav['language']->translate('PLUGIN_LOGIN.PLUGIN_LOGIN_DISABLED')); } @@ -290,7 +289,6 @@ class AdminPlugin extends Plugin { // Only activate admin if we're inside the admin path. if ($this->active) { - // Store this version and prefer newer method if (method_exists($this, 'getBlueprint')) { $this->version = $this->getBlueprint()->version; @@ -475,7 +473,6 @@ class AdminPlugin extends Plugin $twig_paths[] = __DIR__ . '/themes/' . $this->theme . '/templates'; $this->grav['twig']->twig_paths = $twig_paths; - } /** @@ -498,6 +495,15 @@ class AdminPlugin extends Plugin $twig->twig_vars['admin'] = $this->admin; $twig->twig_vars['admin_version'] = $this->version; + $fa_icons_file = CompiledYamlFile::instance($this->grav['locator']->findResource('plugin://admin/themes/grav/templates/forms/fields/iconpicker/icons' . YAML_EXT, true, true)); + $fa_icons = $fa_icons_file->content(); + $fa_icons = array_map(function ($icon) { + //only pick used values + return ['id' => $icon['id'], 'unicode' => $icon['unicode']]; + }, $fa_icons['icons']); + + $twig->twig_vars['fa_icons'] = $fa_icons; + // add form if it exists in the page $header = $page->header(); if (isset($header->form)) { @@ -875,5 +881,4 @@ class AdminPlugin extends Plugin return $types; } - } diff --git a/themes/grav/app/forms/fields/iconpicker.js b/themes/grav/app/forms/fields/iconpicker.js new file mode 100755 index 00000000..a422a8c7 --- /dev/null +++ b/themes/grav/app/forms/fields/iconpicker.js @@ -0,0 +1,288 @@ +import $ from 'jquery'; + +/* Icon Picker by QueryLoop + * Author: @eliorivero + * URL: http://queryloop.com/ + * License: GPLv2 + */ + +var defaults = { + 'mode': 'dialog', // show overlay 'dialog' panel or slide down 'inline' panel + 'closeOnPick': true, // whether to close panel after picking or 'no' + 'save': 'class', // save icon 'class' or 'code' + 'size': '', + 'classes': { + 'launcher': '', // extra classes for launcher buttons + 'clear': 'remove-times', // extra classes for button that removes preview and clears field + 'highlight': '', // extra classes when highlighting an icon + 'close': '' // extra classes for close button + }, + 'iconSets': { // example data structure. Used to specify which launchers will be created + 'genericon': 'Genericon', // create a launcher to pick genericon icons + 'fa': 'FontAwesome' // create a launcher to pick fontawesome icons + } +}; + +class QL_Icon_Picker { + + constructor(element, options) { + this.iconSet = ''; + this.iconSetName = ''; + this.$field = ''; + this.element = element; + this.settings = $.extend({}, defaults, options); + this._defaults = defaults; + this.init(); + } + + init() { + var $brick = $(this.element); + var pickerId = $brick.data('pickerid'); + var $preview = $('
'); + + this.$field = $brick.find('input'); + + // Add preview area + this.makePreview($brick, pickerId, $preview); + + // Make button to clear field and remove preview + this.makeClear(pickerId, $preview); + + // Make buttons that open the panel of icons + this.makeLaunchers($brick, pickerId); + + // Prepare display styles, inline and dialog + this.makeDisplay($brick); + } + + makePreview($brick, pickerId, $preview) { + var $icon = $(''); + var iconValue = this.$field.val(); + + $preview.prependTo($brick); + $icon.prependTo($preview); + if (iconValue !== '') { + $preview.addClass('icon-preview-on'); + $icon.addClass(iconValue); + } + } + + makeClear(pickerId, $preview) { + var base = this; + var $clear = $(''); + + // Hide button to remove icon and preview and append it to preview area + $clear.hide().prependTo($preview); + // If there's a icon saved in the field, show remove icon button + if (base.$field.val() !== '') { + $clear.show(); + } + + $preview.on('click', '.remove-icon', function(e) { + e.preventDefault(); + base.$field.val(''); + $preview.removeClass('icon-preview-on').find('i').removeClass(); + $(this).hide(); + }); + } + + makeDisplay($brick) { + var base = this; + var close = base.settings.classes.close; + var $body = $('body'); + + var $close = $(''); + + if (base.settings.mode === 'inline') { + $brick.find('.icon-set').append($close).removeClass('dialog').addClass('inline ' + base.settings.size).parent().addClass('icon-set-wrap'); + } else if (base.settings.mode === 'dialog') { + $('.icon-set').addClass('dialog ' + base.settings.size); + if ($('.icon-picker-overlay').length <= 0) { + $body.append('').append($close); + } + } + $body + .on('click', '.icon-picker-close, .icon-picker-overlay', function(e) { + e.preventDefault(); + base.closePicker($brick, $(base.iconSet), base.settings.mode); + }) + .on('mouseenter mouseleave', '.icon-picker-close', function(e) { + if (e.type === 'mouseenter') { + $(this).addClass(close); + } else { + $(this).removeClass(close); + } + }); + } + + makeLaunchers($brick) { + var base = this; + var dataIconSets = $brick.data('iconsets'); + var iconSet; + + if (typeof dataIconSets === 'undefined') { + dataIconSets = base.settings.iconSets; + } + for (iconSet in dataIconSets) { + if (dataIconSets.hasOwnProperty(iconSet)) { + $brick.append('' + dataIconSets[iconSet] + ''); + } + } + + $brick.find('.launch-icons').on('click', function(e) { + e.preventDefault(); + var $self = $(this); + var theseIcons = $self.data('icons'); + + base.iconSetName = theseIcons; + base.iconSet = '.' + theseIcons + '-set'; + + // Initialize picker + base.iconPick($brick); + + // Show icon picker + base.showPicker($brick, $(base.iconSet), base.settings.mode); + }); + } + + iconPick($brick) { + var base = this; + var highlight = 'icon-highlight ' + base.settings.classes.highlight; + + $(base.iconSet).on('click', 'li', function(e) { + e.preventDefault(); + var $icon = $(this); + var icon = $icon.data(base.settings.save); + + // Mark as selected + $('.icon-selected').removeClass('icon-selected'); + $icon.addClass('icon-selected'); + if (base.$field.data('format') === 'short') { + icon = icon.slice(6); + } + + // Save icon value to field + base.$field.val(icon); + + // Close icon picker + if (base.settings.closeOnPick) { + base.closePicker($brick, $icon.closest(base.iconSet), base.settings.mode); + } + + // Set preview + base.setPreview($icon.data('class')); + + // Broadcast event passing the selected icon. + $('body').trigger('iconselected.queryloop', icon); + }); + $(base.iconSet).on('mouseenter mouseleave', 'li', function(e) { + if (e.type === 'mouseenter') { + $(this).addClass(highlight); + } else { + $(this).removeClass(highlight); + } + }); + } + + showPicker($brick, $icons, mode) { + if (mode === 'inline') { + $('.icon-set').removeClass('inline-open'); + $brick.find($icons).toggleClass('inline-open'); + } else if (mode === 'dialog') { + $brick.find('.icon-picker-close').addClass('make-visible'); + $brick.find('.icon-picker-overlay').addClass('make-visible'); + $icons.addClass('dialog-open'); + } + + $icons.find('.icon-selected').removeClass('icon-selected'); + var selectedIcon = this.$field.val().replace(' ', '.'); + if (selectedIcon !== '') { + if (this.settings.save === 'class') { + $icons.find('.' + selectedIcon).addClass('icon-selected'); + } else { + $icons.find('[data-code="' + selectedIcon + '"]').addClass('icon-selected'); + } + } + // Broadcast event when the picker is shown passing the picker mode. + $('body').trigger('iconpickershow.queryloop', mode); + } + + closePicker($brick, $icons, mode) { + // Remove event so they don't fire from a different picker + $(this.iconSet).off('click', 'li'); + + if (mode === 'inline') { + $brick.find($icons).removeClass('inline-open'); + } else if (mode === 'dialog') { + $('.icon-picker-close, .icon-picker-overlay').removeClass('make-visible'); + } + // Broadcast event when the picker is closed passing the picker mode. + $('body').trigger('iconpickerclose.queryloop', mode); + $('.icon-set').removeClass('dialog-open'); + } + + setPreview(preview) { + var $preview = $(this.element).find('.icon-preview'); + + $preview.addClass('icon-preview-on').find('i').removeClass() + .addClass(this.iconSetName) + .addClass(preview); + $preview.find('a').show(); + } +}; + +export default class IconpickerField { + + constructor(options) { + this.items = $(); + this.options = Object.assign({}, this.defaults, options); + + $('[data-grav-iconpicker]').each((index, element) => this.addItem(element)); + $('body').on('mutation._grav', this._onAddedNodes.bind(this)); + } + + _onAddedNodes(event, target/* , record, instance */) { + let fields = $(target).find('[data-grav-iconpicker]'); + if (!fields.length) { return; } + + fields.each((index, field) => { + field = $(field); + if (!~this.items.index(field)) { + this.addItem(field); + } + }); + } + + addItem(element) { + element = $(element); + this.items = this.items.add(element); + + $.fn.qlIconPicker = function(options) { + this.each(function() { + if (!$.data(this, 'plugin_qlIconPicker')) { + $.data(this, 'plugin_qlIconPicker', new QL_Icon_Picker(this, options)); + } + }); + return this; + }; + + $('.icon-picker').qlIconPicker({ + 'save': 'class' + }); + } +} + +export let Instance = new IconpickerField(); + +$.fn.qlIconPicker = function(options) { + this.each(function() { + if (!$.data(this, 'plugin_qlIconPicker')) { + $.data(this, 'plugin_qlIconPicker', new QL_Icon_Picker(this, options)); + } + }); + return this; +}; + +$('.icon-picker').qlIconPicker({ + 'save': 'class' +}); diff --git a/themes/grav/app/forms/fields/index.js b/themes/grav/app/forms/fields/index.js index 8d858957..0d88680f 100644 --- a/themes/grav/app/forms/fields/index.js +++ b/themes/grav/app/forms/fields/index.js @@ -9,6 +9,7 @@ import FilesField, { Instance as FilesFieldInstance } from './files'; import MediapickerField, { Instance as MediapickerInstance } from './mediapicker'; import MultilevelField, { Instance as MultilevelInstance } from './multilevel'; import SelectUniqueField, { Instance as SelectUniqueInstance } from './selectunique'; +import IconpickerField, { Instance as IconpickerInstance } from './iconpicker'; export default { FilepickerField: { @@ -54,6 +55,10 @@ export default { MultilevelField: { MultilevelField, Instance: MultilevelInstance + }, + IconpickerField: { + IconpickerField, + Instance: IconpickerInstance } }; diff --git a/themes/grav/css/iconpicker.css b/themes/grav/css/iconpicker.css new file mode 100755 index 00000000..76af402e --- /dev/null +++ b/themes/grav/css/iconpicker.css @@ -0,0 +1,221 @@ +/* Icon Picker by QueryLoop + * Author: @eliorivero + * URL: http://queryloop.com/ + * License: GPLv2 + */ + +.icon-set { + display: none; + background: #fff; + overflow-y: auto; + -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15); + box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15); +} +.icon-set ul { + list-style: none; + padding: 0; + margin: 0; +} +.icon-set li { + display: inline-block; + cursor: pointer; + padding: 8px; + margin: 0 0 5px; + width: 48px; + height: 48px; + font-size: 24px; + text-align: center; +} +.icon-set li:hover:before, .icon-set .icon-selected:before { + font-size: 32px; + position: relative; + top: 5px; + line-height: 1px; + width: 32px; + display: inline-block; +} +.icon-set.large li { + width: 32px; + height: 32px; + font-size: 32px; +} +.icon-set.large li:hover:before, .icon-set.large .icon-selected:before { + font-size: 48px; + width: 48px; + line-height: 24px; +} +.icon-highlight { + background: #00a6cf; + color: #fff; +} +.dialog { + display: block; + margin: 20px 0 0; + position: fixed; + right: 30%; + bottom: 30%; + width: 40%; + height: 40%; + max-height: 315px; + z-index: 19998; + visibility:hidden; + opacity: 0; + -webkit-box-shadow: 0 2px 4px rgba(0,0,0,0.25); + box-shadow: 0 2px 4px rgba(0,0,0,0.25); + -webkit-transform: scale(0.7) translateZ(0); + -ms-transform: scale(0.7) translateZ(0); + transform: scale(0.7) translateZ(0); + -webkit-transition: all 0.2s; + transition: all 0.2s; +} +.dialog-open { + padding: 10px; + visibility:visible; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; +} +.icon-set-wrap { + position: relative; +} +.inline { + display: block; + width: 276px; + height: 0; + opacity: 0; + visibility:hidden; + -webkit-transform: scaleX(0.5) rotateX(90deg); + -ms-transform: scaleX(0.5) rotateX(90deg); + transform: scaleX(0.5) rotateX(90deg); + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform-origin: 50% 0; + transform-origin: 50% 0; + -webkit-transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.inline-open { + padding: 10px; + border: 1px solid #eee; + height: auto; + visibility:visible; + -webkit-transform: scaleX(1) rotateY(0deg); + -ms-transform: scaleX(1) rotateY(0deg); + transform: scaleX(1) rotateY(0deg); + opacity: 1; +} +.dialog, .icon-picker-close { + top: 30%; + left: 30%; +} +.icon-picker-close { + opacity: 0; + visibility: hidden; + display: block; + width: 20px; + height: 20px; + color: #fff; + background: #333; + font-size: 19px; + margin: 30px 0 0 20px; + position: fixed; + z-index: 19999; + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.25); + box-shadow: 0 1px 3px rgba(0,0,0,0.25); + -webkit-transition: all 0.2s; + transition: all 0.2s; +} +.icon-picker-close:after { + content: "\00D7"; + width: 20px; + display: block; + position: absolute; + text-align: center; +} +.icon-picker-overlay { + opacity: 0; + visibility: hidden; + background: #222; + background: rgba(0, 0, 0, 0.5); + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 19997; + -webkit-transition: all 0.2s; + transition: all 0.2s; +} +.icon-picker-close.make-visible { + margin: 10px 0 0 -10px; +} +.inline .icon-picker-close { + position: absolute; + z-index: 8; + top: 0; + right: 0; + left: auto; + opacity: 1; + visibility: visible; + margin: 0; +} +.make-visible { + visibility: visible; + opacity: 1; +} +.icon-selected { + background: #349886; + color: #fff; +} +.icon-preview { + display: none; + margin: 10px 0; + position: relative; +} +.icon-preview-on { + display: inline-block; +} +.icon-preview i { + width: 48px; + height: 48px; + text-align: center; + border: 1px solid #d5d5d5; + border-radius: 3px; + background: #fff; +} +.icon-preview i:before { + font-size: 32px; + line-height: 48px; +} +.remove-icon { + background-color: #00a6cf; + color: #fff !important; + border-radius: 3px; + transition: background .2s ease-out; + position: absolute; + top: -10px; + right: -10px; +} +.remove-icon:hover { + color: #fff !important; + background-color: #00a6cf; + cursor: pointer; +} +.remove-times { + width: 20px; + height: 20px; + font-size: 21px; + text-align: center; + line-height: 99%; +} +.remove-times:after { + content: "\00D7"; +} +.launch-icons { + margin: 5px 3px 0 0; +} +.launch-icons:active { + margin: 5px 3px 0 0; +} + diff --git a/themes/grav/js/admin.min.js b/themes/grav/js/admin.min.js index 0926b680..1c03d2f9 100644 --- a/themes/grav/js/admin.min.js +++ b/themes/grav/js/admin.min.js @@ -1,29 +1,29 @@ -var Grav=webpackJsonpGrav([0],[function(e,t,n){(function(e){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(1),a=r(i),o=n(2),s=r(o),l=n(312),u=r(l),c=n(313),f=r(c),d=n(333),h=r(d),p=n(338),m=r(p),v=n(424),g=r(v),_=n(562),y=r(_);n(566),n(577);var b=n(578),w=n(301),k=r(w),x=n(328),S=r(x);n(579),n(580),n(581),n(582);var A=n(584),E=r(A);u.default.start(),e.setInterval(function(){_.Instance.update(),A.Instance.scroller.update()},150),(0,a.default)(e).on("sidebar_state._grav",function(){Object.keys(h.default.Chart.Instances).forEach(function(e){setTimeout(function(){return h.default.Chart.Instances[e].chart.update()},10)})}),t.default={GPM:{GPM:s.default,Instance:o.Instance},KeepAlive:u.default,Dashboard:h.default,Pages:m.default,Forms:g.default,Scrollbar:{Scrollbar:y.default,Instance:_.Instance},Updates:{Updates:f.default,Notifications:c.Notifications,Feed:c.Feed,Instance:c.Instance},Sidebar:{Sidebar:E.default,Instance:A.Instance},MediaFilter:{MediaFilter:b.Filter,Instance:b.Instance},Utils:{request:S.default,toastr:k.default}}}).call(t,function(){return this}())},,function(e,t,n){(function(e){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0}),t.Instance=void 0;var o=function(){function e(e,t){for(var n=0;n"+e.stack+"":"";f.default.error("Fetch Failed: \n '+c.translations.PLUGIN_ADMIN.UPDATE+" "+c.translations.PLUGIN_ADMIN.ALL+" "+l+'\n \n '+a+" "+c.translations.PLUGIN_ADMIN.OF_YOUR+" "+o+" "+c.translations.PLUGIN_ADMIN.HAVE_AN_UPDATE_AVAILABLE+"\n
\n ");var d=(0,s.default)("[data-update-packages]").attr("data-packages-slugs")||"";d=d?d.split(","):[];var h=(0,u.default)(d.concat(Object.keys(r))).join();(0,s.default)("[data-update-packages]").attr("data-packages-slugs",""+h),Object.keys(r).forEach(function(t){var a=(0,s.default)("[data-gpm-"+n[i]+'="'+t+'"]'),l=a.find(".gpm-name"),u=l.find("a"),f=a.parents(".content-wrapper");if("plugins"!==o||l.find(".badge.update").length?"themes"===o&&(l.append('"),f.addClass("has-updates")):(l.append(''+c.translations.PLUGIN_ADMIN.UPDATE_AVAILABLE+"!"),f.addClass("has-updates")),a.length){var d=(0,s.default)(".grav-update."+n[i]);if(d.length){var h="testing"===r[t].type?'test release':"";d.html('\n\n '+c.translations.PLUGIN_ADMIN.UPDATE+" "+(n[i].charAt(0).toUpperCase()+n[i].substr(1).toLowerCase())+'\n \n v'+r[t].available+" "+h+" "+c.translations.PLUGIN_ADMIN.OF_THIS+" "+n[i]+" "+c.translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE+"!\n
\n ").css("display","block"),e=!1}}}),(0,s.default)("[data-update-packages]").removeClass("hidden")}}),(0,s.default)(".content-wrapper").addClass("updates-checked"),void(e||(0,s.default)(".warning-reinstall-not-latest-release").removeClass("hidden"))):this}}]),e}();t.default=_;var y=new _;t.Instance=y,t.Notifications=m.default,t.Feed=g.default,h.Instance.on("fetched",function(e,t){y.setPayload(e.payload||{}),y.grav().resources()}),"1"===c.config.enable_auto_updates_check&&h.Instance.fetch()},function(e,t,n){function r(e,t){return t=t||i,a(e,function(e,n,r){for(var i=r.length;++n ul").show();switch(r.find("div").remove(),r.find(".fa-warning").removeClass("fa-warning").addClass("fa-refresh fa-spin"),e.type||(e.type="note"),e.type){case"note":e.intro_text="Note";break;case"info":e.intro_text="Info";break;case"warning":e.intro_text="Warning"}var a="";if(t>9&&(a=" hidden "),e.link)i.append('\n"+e.message+"
").text();i.append('\n"+h.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD+" "+t.name+"
\n"+n.message+""})}},{key:"onDropzoneComplete",value:function(t){if(!t.accepted&&!t.rejected){var n={status:"error",message:h.translations.PLUGIN_ADMIN.FILE_UNSUPPORTED+": "+t.name.match(/\..+/).join("")};return this.handleError({file:t,data:n,mode:"removeFile",msg:"
"+h.translations.PLUGIN_ADMIN.FILE_ERROR_ADD+" "+t.name+"
\n"+n.message+""})}this.options.reloadPage&&e.location.reload()}},{key:"b64_to_utf8",value:function(e){return e=e.replace(/\s/g,""),decodeURIComponent(escape(window.atob(e)))}},{key:"onDropzoneRemovedFile",value:function(e){var t=this;if(e.accepted&&!e.rejected){var n=e.removeUrl||this.urls.delete,r=(n||"").match(/path:(.*)\//),i={filename:e.name};e.sessionParams&&(i.task="filessessionremove",i.session=e.sessionParams),(0,d.default)(n,{method:"post",body:i},function(){if(r){r=t.b64_to_utf8(r[1]);var e=t.container.find('[name][type="hidden"]'),n=JSON.parse(e.val()||"{}");delete n[r],e.val(JSON.stringify(n))}})}}},{key:"onDropzoneError",value:function(e,t,n){var r=n?t.error.message:t;return(0,l.default)(e.previewElement).find("[data-dz-errormessage]").html(r),this.handleError({file:e,data:{status:"error"},msg:"
"+r+""})}},{key:"handleError",value:function(e){var t=e.file,n=e.data,r=e.mode,i=e.msg;if("error"===n.status||"unauthorized"===n.status){switch(r){case"addBack":t instanceof File?this.dropzone.addFile.call(this.dropzone,t):(this.dropzone.files.push(t),this.dropzone.options.addedfile.call(this.dropzone,t),this.dropzone.options.thumbnail.call(this.dropzone,t,t.extras.url));break;case"removeFile":default:~this.dropzone.files.indexOf(t)&&(t.rejected=!0,this.dropzone.removeFile.call(this.dropzone,t,{silent:!0}))}var a=(0,l.default)('[data-remodal-id="generic"]');a.find(".error-content").html(i),l.default.remodal.lookup[a.data("remodal")].open()}}}]),t}();t.default=v;var g=[],_=(0,l.default)(),y=function(e,t){var n=(0,l.default)(t).find(".dropzone.files-upload");n.length&&n.each(function(e,t){t=(0,l.default)(t),~_.index(t)||b(t)})},b=function(e){e=(0,l.default)(e);var t=e.find('input[type="file"]'),n=e.data("grav-file-settings")||{};n.accept&&~n.accept.indexOf("*")&&(n.accept=[""]);var r={url:e.data("file-url-add")||(e.closest("form").attr("action")||h.config.current_url)+".json",paramName:n.paramName||"file",dotNotation:n.name||"file",acceptedFiles:n.accept?n.accept.join(","):t.attr("accept")||e.data("media-types"),maxFilesize:"undefined"!=typeof n.filesize?n.filesize:256,maxFiles:n.limit||null};_=_.add(e),e=e[0],g.push(new v({container:e,options:r}))};t.Instances=function(){return(0,l.default)(".dropzone.files-upload").each(function(e,t){return b(t)}),(0,l.default)("body").on("mutation._grav",y),g}()}).call(t,function(){return this}())},,,function(e,t,n){(function(e){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0}),t.Instance=t.Toolbar=void 0;var a=function(){function e(e,t){for(var n=0;n
"+e.stack+"":"";f.default.error("Fetch Failed: \n '+u.translations.PLUGIN_ADMIN.UPDATE+" "+u.translations.PLUGIN_ADMIN.ALL+" "+l+'\n \n '+a+" "+u.translations.PLUGIN_ADMIN.OF_YOUR+" "+o+" "+u.translations.PLUGIN_ADMIN.HAVE_AN_UPDATE_AVAILABLE+"\n
\n ");var d=(0,s.default)("[data-update-packages]").attr("data-packages-slugs")||"";d=d?d.split(","):[];var h=(0,c.default)(d.concat(Object.keys(r))).join();(0,s.default)("[data-update-packages]").attr("data-packages-slugs",""+h),Object.keys(r).forEach(function(t){var a=(0,s.default)("[data-gpm-"+n[i]+'="'+t+'"]'),l=a.find(".gpm-name"),c=l.find("a"),f=a.parents(".content-wrapper");if("plugins"!==o||l.find(".badge.update").length?"themes"===o&&(l.append('"),f.addClass("has-updates")):(l.append(''+u.translations.PLUGIN_ADMIN.UPDATE_AVAILABLE+"!"),f.addClass("has-updates")),a.length){var d=(0,s.default)(".grav-update."+n[i]);if(d.length){var h="testing"===r[t].type?'test release':"";d.html('\n\n '+u.translations.PLUGIN_ADMIN.UPDATE+" "+(n[i].charAt(0).toUpperCase()+n[i].substr(1).toLowerCase())+'\n \n v'+r[t].available+" "+h+" "+u.translations.PLUGIN_ADMIN.OF_THIS+" "+n[i]+" "+u.translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE+"!\n
\n ").css("display","block"),e=!1}}}),(0,s.default)("[data-update-packages]").removeClass("hidden")}}),(0,s.default)(".content-wrapper").addClass("updates-checked"),void(e||(0,s.default)(".warning-reinstall-not-latest-release").removeClass("hidden"))):this}}]),e}();t.default=_;var y=new _;t.Instance=y,t.Notifications=m.default,t.Feed=g.default,h.Instance.on("fetched",function(e,t){y.setPayload(e.payload||{}),y.grav().resources()}),"1"===u.config.enable_auto_updates_check&&h.Instance.fetch()},function(e,t,n){function r(e,t){return t=t||i,a(e,function(e,n,r){for(var i=r.length;++n ul").show();switch(r.find("div").remove(),r.find(".fa-warning").removeClass("fa-warning").addClass("fa-refresh fa-spin"),e.type||(e.type="note"),e.type){case"note":e.intro_text="Note";break;case"info":e.intro_text="Info";break;case"warning":e.intro_text="Warning"}var a="";if(t>9&&(a=" hidden "),e.link)i.append('\n"+e.message+"
").text();i.append('\n"+h.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD+" "+t.name+"
\n"+n.message+""})}},{key:"onDropzoneComplete",value:function(t){if(!t.accepted&&!t.rejected){var n={status:"error",message:h.translations.PLUGIN_ADMIN.FILE_UNSUPPORTED+": "+t.name.match(/\..+/).join("")};return this.handleError({file:t,data:n,mode:"removeFile",msg:"
"+h.translations.PLUGIN_ADMIN.FILE_ERROR_ADD+" "+t.name+"
\n"+n.message+""})}this.options.reloadPage&&e.location.reload()}},{key:"b64_to_utf8",value:function(e){return e=e.replace(/\s/g,""),decodeURIComponent(escape(window.atob(e)))}},{key:"onDropzoneRemovedFile",value:function(e){var t=this;if(e.accepted&&!e.rejected){var n=e.removeUrl||this.urls.delete,r=(n||"").match(/path:(.*)\//),i={filename:e.name};e.sessionParams&&(i.task="filessessionremove",i.session=e.sessionParams),(0,d.default)(n,{method:"post",body:i},function(){if(r){r=t.b64_to_utf8(r[1]);var e=t.container.find('[name][type="hidden"]'),n=JSON.parse(e.val()||"{}");delete n[r],e.val(JSON.stringify(n))}})}}},{key:"onDropzoneError",value:function(e,t,n){var r=n?t.error.message:t;return(0,l.default)(e.previewElement).find("[data-dz-errormessage]").html(r),this.handleError({file:e,data:{status:"error"},msg:"
"+r+""})}},{key:"handleError",value:function(e){var t=e.file,n=e.data,r=e.mode,i=e.msg;if("error"===n.status||"unauthorized"===n.status){switch(r){case"addBack":t instanceof File?this.dropzone.addFile.call(this.dropzone,t):(this.dropzone.files.push(t),this.dropzone.options.addedfile.call(this.dropzone,t),this.dropzone.options.thumbnail.call(this.dropzone,t,t.extras.url));break;case"removeFile":default:~this.dropzone.files.indexOf(t)&&(t.rejected=!0,this.dropzone.removeFile.call(this.dropzone,t,{silent:!0}))}var a=(0,l.default)('[data-remodal-id="generic"]');a.find(".error-content").html(i),l.default.remodal.lookup[a.data("remodal")].open()}}}]),t}();t.default=v;var g=[],_=(0,l.default)(),y=function(e,t){var n=(0,l.default)(t).find(".dropzone.files-upload");n.length&&n.each(function(e,t){t=(0,l.default)(t),~_.index(t)||b(t)})},b=function(e){e=(0,l.default)(e);var t=e.find('input[type="file"]'),n=e.data("grav-file-settings")||{};n.accept&&~n.accept.indexOf("*")&&(n.accept=[""]);var r={url:e.data("file-url-add")||(e.closest("form").attr("action")||h.config.current_url)+".json",paramName:n.paramName||"file",dotNotation:n.name||"file",acceptedFiles:n.accept?n.accept.join(","):t.attr("accept")||e.data("media-types"),maxFilesize:"undefined"!=typeof n.filesize?n.filesize:256,maxFiles:n.limit||null};_=_.add(e),e=e[0],g.push(new v({container:e,options:r}))};t.Instances=function(){return(0,l.default)(".dropzone.files-upload").each(function(e,t){return b(t)}),(0,l.default)("body").on("mutation._grav",y),g}()}).call(t,function(){return this}())},,,function(e,t,n){(function(e){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0}),t.Instance=t.Toolbar=void 0;var a=function(){function e(e,t){for(var n=0;n