"use strict"; /// /// class AmeActorSelector { constructor(actorManager, isProVersion, allOptionEnabled = true) { this.selectedActor = null; this.selectedDisplayName = 'All'; this.visibleUsers = []; this.subscribers = []; this.isProVersion = false; this.allOptionEnabled = true; this.cachedVisibleActors = null; this.specialActors = []; this.selectorNode = null; this.isDomInitStarted = false; this.actorManager = actorManager; if (typeof isProVersion !== 'undefined') { this.isProVersion = isProVersion; } this.allOptionEnabled = allOptionEnabled; this.currentUserLogin = wsAmeActorSelectorData.currentUserLogin; this.visibleUsers = wsAmeActorSelectorData.visibleUsers; this.ajaxParams = wsAmeActorSelectorData; //Discard any users that don't exist / were not loaded by the actor manager. const _ = AmeActorSelector._; this.visibleUsers = _.intersection(this.visibleUsers, _.keys(actorManager.getUsers())); jQuery(() => { this.initDOM(); }); } initDOM() { if (this.isDomInitStarted) { return; } this.isDomInitStarted = true; this.selectorNode = jQuery('#ws_actor_selector'); this.populateActorSelector(); //Don't show the selector in the free version. if (!this.isProVersion) { this.selectorNode.hide(); return; } //Select an actor on click. this.selectorNode.on('click', 'li a.ws_actor_option', (event) => { const href = jQuery(event.target).attr('href'); const fragmentStart = href.indexOf('#'); let actor = null; if (fragmentStart >= 0) { actor = href.substring(fragmentStart + 1); } if (actor === '') { actor = null; } this.setSelectedActor(actor); event.preventDefault(); }); //Display the user selection dialog when the user clicks "Choose users". this.selectorNode.on('click', '#ws_show_more_users', (event) => { event.preventDefault(); AmeVisibleUserDialog.open({ currentUserLogin: this.currentUserLogin, users: this.actorManager.getUsers(), visibleUsers: this.visibleUsers, actorManager: this.actorManager, save: (userDetails, selectedUsers) => { this.actorManager.addUsers(userDetails); this.visibleUsers = selectedUsers; //The user list has changed, so clear the cache. this.cachedVisibleActors = null; //Display the new actor list. this.populateActorSelector(); //Save the user list via AJAX. this.saveVisibleUsers(); } }); }); } setSelectedActor(actorId) { if ((actorId !== null) && !this.actorManager.actorExists(actorId)) { return; } const previousSelection = this.selectedActor; this.selectedActor = actorId; this.highlightSelectedActor(); if (actorId !== null) { const actor = this.actorManager.getActor(actorId); if (actor !== null) { this.selectedDisplayName = actor.getDisplayName(); } else { this.selectedDisplayName = '[' + actorId + ']'; } } else { this.selectedDisplayName = 'All'; } //Notify subscribers that the selection has changed. if (this.selectedActor !== previousSelection) { for (let i = 0; i < this.subscribers.length; i++) { this.subscribers[i](this.selectedActor, previousSelection); } } } onChange(callback) { this.subscribers.push(callback); } highlightSelectedActor() { //Set up and populate the selector element if we haven't done that yet. if (!this.isDomInitStarted) { this.initDOM(); } if (this.selectorNode === null) { return; //Should never happen since initDOM() should have set this. } //Deselect the previous item. this.selectorNode.find('.current').removeClass('current'); //Select the new one or "All". let selector; if (this.selectedActor === null) { selector = 'a.ws_no_actor'; } else { selector = 'a[href$="#' + this.selectedActor + '"]'; } this.selectorNode.find(selector).addClass('current'); } populateActorSelector() { if (this.selectorNode === null) { return; //Not initialized yet. } const actorSelector = this.selectorNode, $ = jQuery; let isSelectedActorVisible = false; //Build the list of available actors. actorSelector.empty(); if (this.allOptionEnabled) { actorSelector.append('
  • All
  • '); } const visibleActors = this.getVisibleActors(); for (let i = 0; i < visibleActors.length; i++) { const actor = visibleActors[i], name = this.getNiceName(actor); actorSelector.append($('
  • ').append($('') .attr('href', '#' + actor.getId()) .attr('data-text', name) .text(name) .addClass('ws_actor_option'))); isSelectedActorVisible = (actor.getId() === this.selectedActor) || isSelectedActorVisible; } if (this.isProVersion) { const moreUsersText = 'Choose users\u2026'; actorSelector.append($('
  • ').append($('') .attr('id', 'ws_show_more_users') .attr('href', '#more-users') .attr('data-text', moreUsersText) .text(moreUsersText))); } if (this.isProVersion) { actorSelector.show(); } //If the selected actor is no longer on the list, select the first available option instead. if ((this.selectedActor !== null) && !isSelectedActorVisible) { if (this.allOptionEnabled) { this.setSelectedActor(null); } else { const availableActors = this.getVisibleActors(); const firstActor = AmeActorSelector._.head(availableActors); if (firstActor) { this.setSelectedActor(firstActor.getId()); } else { this.setSelectedActor(null); } } } this.highlightSelectedActor(); } repopulate() { this.cachedVisibleActors = null; this.populateActorSelector(); } getVisibleActors() { if (this.cachedVisibleActors) { return this.cachedVisibleActors; } const _ = AmeActorSelector._; let actors = []; //Include special actors, if any. Note that these must also be added to the actor manager; //the actor selector doesn't do that automatically. _.forEach(this.specialActors, function (actor) { actors.push(actor); }); //Include all roles. //Idea: Sort roles either alphabetically or by typical privilege level (admin, editor, author, ...). _.forEach(this.actorManager.getRoles(), function (role) { actors.push(role); }); //Include the Super Admin (multisite only). const user = this.actorManager.getUser(this.currentUserLogin); if (user && user.isSuperAdmin) { actors.push(this.actorManager.getSuperAdmin()); } //Include the current user. const currentUser = this.actorManager.getUser(this.currentUserLogin); if (currentUser) { actors.push(currentUser); } //Include other visible users. _(this.visibleUsers) .without(this.currentUserLogin) .sortBy() .forEach((login) => { const user = this.actorManager.getUser(login); if (user) { actors.push(user); } }); this.cachedVisibleActors = actors; return actors; } addSpecialActor(actor) { this.specialActors.push(actor); } saveVisibleUsers() { jQuery.post(this.ajaxParams.adminAjaxUrl, { 'action': this.ajaxParams.ajaxUpdateAction, '_ajax_nonce': this.ajaxParams.ajaxUpdateNonce, 'visible_users': JSON.stringify(this.visibleUsers) }); } getCurrentUserActor() { return this.actorManager.getUser(this.currentUserLogin); } getNiceName(actor) { let name = actor.getDisplayName(); if (actor.hasOwnProperty('userLogin')) { const user = actor; if (user.userLogin === this.currentUserLogin) { name = 'Current user (' + user.userLogin + ')'; } else { name = user.getDisplayName() + ' (' + user.userLogin + ')'; } } return name; } /** * Wrap the selected actor ID in a computed observable so that it can be used with Knockout. * @param ko */ createKnockoutObservable(ko) { const internalObservable = ko.observable(this.selectedActor); const publicObservable = ko.computed({ read: function () { return internalObservable(); }, write: (newActor) => { this.setSelectedActor(newActor); } }); this.onChange((newSelectedActor) => { internalObservable(newSelectedActor); }); return publicObservable; } createIdObservable(ko) { return this.createKnockoutObservable(ko); } createActorObservable(ko) { const internalObservable = ko.observable((this.selectedActor === null) ? null : this.actorManager.getActor(this.selectedActor)); const publicObservable = ko.computed({ read: function () { return internalObservable(); }, write: (newActor) => { this.setSelectedActor((newActor !== null) ? newActor.getId() : null); } }); const self = this; this.onChange(function (newSelectedActor) { if (newSelectedActor === null) { internalObservable(null); } else { internalObservable(self.actorManager.getActor(newSelectedActor)); } }); return publicObservable; } /** * Select an actor based on the "selected_actor" URL parameter. * * Does nothing if the parameter is not set or the actor ID is invalid. */ setSelectedActorFromUrl() { if (!URLSearchParams) { return; } //Select an actor based on the "selected_actor" URL parameter. const urlParams = new URLSearchParams(window.location.search); const selectedActor = urlParams.get('selected_actor'); if (selectedActor !== null) { this.setSelectedActor(selectedActor); } } } AmeActorSelector._ = wsAmeLodash; //# sourceMappingURL=actor-selector.js.map