/// /// /// /// /// /// var AmePluginVisibilityModule = /** @class */ (function () { function AmePluginVisibilityModule(scriptData) { var _this = this; var _ = AmePluginVisibilityModule._; this.actorSelector = new AmeActorSelector(AmeActors, scriptData.isProVersion); //Wrap the selected actor in a computed observable so that it can be used with Knockout. var _selectedActor = ko.observable(this.actorSelector.selectedActor); this.selectedActor = ko.computed({ read: function () { return _selectedActor(); }, write: function (newActor) { _this.actorSelector.setSelectedActor(newActor); } }); this.actorSelector.onChange(function (newSelectedActor) { _selectedActor(newSelectedActor); }); //Re-select the previously selected actor, or select "All" (null) by default. this.selectedActor(scriptData.selectedActor); this.canRoleManagePlugins = scriptData.canManagePlugins; this.isMultisite = scriptData.isMultisite; this.grantAccessByDefault = {}; _.forEach(this.actorSelector.getVisibleActors(), function (actor) { _this.grantAccessByDefault[actor.id] = ko.observable(_.get(scriptData.settings.grantAccessByDefault, actor.id, _this.canManagePlugins(actor))); }); this.plugins = _.map(scriptData.installedPlugins, function (plugin) { return new AmePlugin(plugin, _.get(scriptData.settings.plugins, plugin.fileName, {}), _this); }); //Normally, the plugin list is sorted by the (real) plugin name. Re-sort taking custom names into account. this.plugins.sort(function (a, b) { return a.name().localeCompare(b.name()); }); this.privilegedActors = [this.actorSelector.getCurrentUserActor()]; if (this.isMultisite) { this.privilegedActors.push(AmeActors.getSuperAdmin()); } this.areNewPluginsVisible = ko.computed({ read: function () { if (_this.selectedActor() !== null) { var canSeePluginsByDefault = _this.getGrantAccessByDefault(_this.selectedActor()); return canSeePluginsByDefault(); } return _.every(_this.actorSelector.getVisibleActors(), function (actor) { //Only consider roles than can manage plugins. if (!_this.canManagePlugins(actor)) { return true; } var canSeePluginsByDefault = _this.getGrantAccessByDefault(actor.getId()); return canSeePluginsByDefault(); }); }, write: function (isChecked) { if (_this.selectedActor() !== null) { var canSeePluginsByDefault = _this.getGrantAccessByDefault(_this.selectedActor()); canSeePluginsByDefault(isChecked); return; } //Update everyone except the current user and Super Admin. _.forEach(_this.actorSelector.getVisibleActors(), function (actor) { var isAllowed = _this.getGrantAccessByDefault(actor.getId()); if (!_this.canManagePlugins(actor)) { isAllowed(false); } else if (_.includes(_this.privilegedActors, actor)) { isAllowed(true); } else { isAllowed(isChecked); } }); } }); this.areAllPluginsChecked = ko.computed({ read: function () { return _.every(_this.plugins, function (plugin) { return _this.isPluginVisible(plugin); }) && _this.areNewPluginsVisible(); }, write: function (isChecked) { _this.areNewPluginsVisible(isChecked); _.forEach(_this.plugins, function (plugin) { _this.setPluginVisibility(plugin, isChecked); }); } }); //This observable will be populated when saving changes. this.settingsData = ko.observable(''); } AmePluginVisibilityModule.prototype.isPluginVisible = function (plugin) { var actorId = this.selectedActor(); if (actorId === null) { return plugin.isVisibleByDefault(); } else { var canSeePluginsByDefault = this.getGrantAccessByDefault(actorId), isVisible = plugin.getGrantObservable(actorId, plugin.isVisibleByDefault() && canSeePluginsByDefault()); return isVisible(); } }; AmePluginVisibilityModule.prototype.setPluginVisibility = function (plugin, isVisible) { var _this = this; var selectedActor = this.selectedActor(); if (selectedActor === null) { plugin.isVisibleByDefault(isVisible); //Show/hide from everyone except the current user and Super Admin. //However, don't enable plugins for roles that can't access the "Plugins" page in the first place. var _1 = AmePluginVisibilityModule._; _1.forEach(this.actorSelector.getVisibleActors(), function (actor) { var allowAccess = plugin.getGrantObservable(actor.id, isVisible); if (!_this.canManagePlugins(actor)) { allowAccess(false); } else if (_1.includes(_this.privilegedActors, actor)) { allowAccess(true); } else { allowAccess(isVisible); } }); } else { //Show/hide from the selected role or user. var allowAccess = plugin.getGrantObservable(selectedActor, isVisible); allowAccess(isVisible); } }; AmePluginVisibilityModule.prototype.canManagePlugins = function (actor) { var _this = this; var _ = AmePluginVisibilityModule._; if ((actor instanceof AmeRole) && _.has(this.canRoleManagePlugins, actor.name)) { return this.canRoleManagePlugins[actor.name]; } if (actor instanceof AmeSuperAdmin) { return true; } if (actor instanceof AmeUser) { //Can any of the user's roles manage plugins? var result_1 = false; _.forEach(actor.roles, function (roleId) { if (_.get(_this.canRoleManagePlugins, roleId, false)) { result_1 = true; return false; } }); return (result_1 || AmeActors.hasCap(actor.id, 'activate_plugins')); } return false; }; AmePluginVisibilityModule.prototype.getGrantAccessByDefault = function (actorId) { if (!this.grantAccessByDefault.hasOwnProperty(actorId)) { this.grantAccessByDefault[actorId] = ko.observable(this.canManagePlugins(AmeActors.getActor(actorId))); } return this.grantAccessByDefault[actorId]; }; AmePluginVisibilityModule.prototype.getSettings = function () { var _ = AmePluginVisibilityModule._; var result = {}; result.grantAccessByDefault = _.mapValues(this.grantAccessByDefault, function (allow) { return allow(); }); result.plugins = {}; _.forEach(this.plugins, function (plugin) { result.plugins[plugin.fileName] = { isVisibleByDefault: plugin.isVisibleByDefault(), grantAccess: _.mapValues(plugin.grantAccess, function (allow) { return allow(); }) }; for (var i = 0; i < AmePlugin.editablePropertyNames.length; i++) { var key = AmePlugin.editablePropertyNames[i], upperKey = key.substring(0, 1).toUpperCase() + key.substring(1); result.plugins[plugin.fileName]['custom' + upperKey] = plugin.customProperties[key](); } }); return result; }; //noinspection JSUnusedGlobalSymbols Used in KO template. AmePluginVisibilityModule.prototype.saveChanges = function () { var settings = this.getSettings(); //Remove settings associated with roles and users that no longer exist or are not visible. var _ = AmePluginVisibilityModule._, visibleActorIds = _.pluck(this.actorSelector.getVisibleActors(), 'id'); _.forEach(settings.plugins, function (plugin) { plugin.grantAccess = _.pick(plugin.grantAccess, visibleActorIds); }); //Populate form field(s). this.settingsData(jQuery.toJSON(settings)); return true; }; AmePluginVisibilityModule._ = wsAmeLodash; return AmePluginVisibilityModule; }()); var AmePlugin = /** @class */ (function () { function AmePlugin(details, settings, module) { var _this = this; this.defaultProperties = {}; this.customProperties = {}; this.editableProperties = {}; var _ = AmePluginVisibilityModule._; for (var i = 0; i < AmePlugin.editablePropertyNames.length; i++) { var key = AmePlugin.editablePropertyNames[i], upperKey = key.substring(0, 1).toUpperCase() + key.substring(1); this.defaultProperties[key] = ko.observable(_.get(details, key, '')); this.customProperties[key] = ko.observable(_.get(settings, 'custom' + upperKey, '')); this.editableProperties[key] = ko.observable(this.defaultProperties[key]()); } this.name = ko.computed(function () { var value = _this.customProperties['name'](); if (value === '') { value = _this.defaultProperties['name'](); } return AmePlugin.stripAllTags(value); }); this.description = ko.computed(function () { var value = _this.customProperties['description'](); if (value === '') { value = _this.defaultProperties['description'](); } return AmePlugin.stripAllTags(value); }); this.fileName = details.fileName; this.isActive = details.isActive; this.isBeingEdited = ko.observable(false); this.isVisibleByDefault = ko.observable(_.get(settings, 'isVisibleByDefault', true)); var emptyGrant = {}; this.grantAccess = _.mapValues(_.get(settings, 'grantAccess', emptyGrant), function (hasAccess) { return ko.observable(hasAccess); }); this.isChecked = ko.computed({ read: function () { return module.isPluginVisible(_this); }, write: function (isVisible) { return module.setPluginVisibility(_this, isVisible); } }); } AmePlugin.prototype.getGrantObservable = function (actorId, defaultValue) { if (defaultValue === void 0) { defaultValue = true; } if (!this.grantAccess.hasOwnProperty(actorId)) { this.grantAccess[actorId] = ko.observable(defaultValue); } return this.grantAccess[actorId]; }; //noinspection JSUnusedGlobalSymbols Used in KO template. AmePlugin.prototype.openInlineEditor = function () { for (var i = 0; i < AmePlugin.editablePropertyNames.length; i++) { var key = AmePlugin.editablePropertyNames[i], customValue = this.customProperties[key](); this.editableProperties[key](customValue === '' ? this.defaultProperties[key]() : customValue); } this.isBeingEdited(true); }; //noinspection JSUnusedGlobalSymbols Used in KO template. AmePlugin.prototype.cancelEdit = function () { this.isBeingEdited(false); }; //noinspection JSUnusedGlobalSymbols Used in KO template. AmePlugin.prototype.confirmEdit = function () { for (var i = 0; i < AmePlugin.editablePropertyNames.length; i++) { var key = AmePlugin.editablePropertyNames[i], customValue = this.editableProperties[key](); if (customValue === this.defaultProperties[key]()) { customValue = ''; } this.customProperties[key](customValue); } this.isBeingEdited(false); }; //noinspection JSUnusedGlobalSymbols Used in KO template. AmePlugin.prototype.resetNameAndDescription = function () { for (var i = 0; i < AmePlugin.editablePropertyNames.length; i++) { var key = AmePlugin.editablePropertyNames[i]; this.customProperties[key](''); } this.isBeingEdited(false); }; AmePlugin.stripAllTags = function (input) { //Based on: http://phpjs.org/functions/strip_tags/ var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi, commentsAndPhpTags = /|<\?(?:php)?[\s\S]*?\?>/gi; return input.replace(commentsAndPhpTags, '').replace(tags, ''); }; AmePlugin.editablePropertyNames = ['name', 'description', 'author', 'siteUrl', 'version']; return AmePlugin; }()); jQuery(function ($) { amePluginVisibility = new AmePluginVisibilityModule(wsPluginVisibilityData); ko.applyBindings(amePluginVisibility, document.getElementById('ame-plugin-visibility-editor')); //Permanently dismiss the usage hint via AJAX. $('#ame-pv-usage-notice').on('click', '.notice-dismiss', function () { AjawV1.getAction('ws_ame_dismiss_pv_usage_notice').request(); }); });