123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384 |
- /**
- * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com>
- * This file is licensed under the Affero General Public License version 3 or later.
- * See the COPYING-README file.
- */
- OCA = OCA || {};
- (function() {
- /**
- * @classdesc This class represents the view belonging to the server tab
- * in the LDAP wizard.
- */
- var WizardTabAbstractFilter = OCA.LDAP.Wizard.WizardTabGeneric.subClass({
- /**
- * @property {number} number that needs to exceeded to use complex group
- * selection element
- */
- _groupElementSwitchThreshold: 40,
- /**
- * @property {boolean} - tells whether multiselect or complex element is
- * used for selecting groups
- */
- isComplexGroupChooser: false,
- /** @property {string} */
- tabID: '',
- /**
- * initializes the instance. Always call it after initialization.
- * concrete view must set managed items first, and then call the parent
- * init.
- *
- * @param {OCA.LDAP.Wizard.FilterOnTypeFactory} fotf
- * @param {number} [tabIndex]
- * @param {string} [tabID]
- */
- init: function (fotf, tabIndex, tabID) {
- this._super(tabIndex, tabID);
- /** @type {OCA.LDAP.Wizard.FilterOnTypeFactory} */
- this.foTFactory = fotf;
- this._initMultiSelect(
- this.getGroupsItem().$element,
- t('user_ldap', 'Select groups')
- );
- this._initMultiSelect(
- this.getObjectClassItem().$element,
- t('user_ldap', 'Select object classes')
- );
- this.filterName = this.getFilterItem().keyName;
- this._initFilterModeSwitcher(
- this.getToggleItem().$element,
- this.getRawFilterContainerItem().$element,
- [ this.getObjectClassItem().$element ],
- this.getFilterModeKey(),
- {
- status: 'disabled',
- $element: this.getGroupsItem().$element
- }
- );
- _.bindAll(this, 'onCountButtonClick', 'onSelectGroup', 'onDeselectGroup');
- this.getCountItem().$relatedElements.click(this.onCountButtonClick);
- if(this.manyGroupsSupport) {
- var $selectBtn = $(this.tabID).find('.ldapGroupListSelect');
- $selectBtn.click(this.onSelectGroup);
- var $deselectBtn = $(this.tabID).find('.ldapGroupListDeselect');
- $deselectBtn.click(this.onDeselectGroup);
- }
- },
- /**
- * returns managed item for the object class chooser. must be
- * implemented by concrete view
- */
- getObjectClassItem: function () {},
- /**
- * returns managed item for the group chooser. must be
- * implemented by concrete view
- */
- getGroupsItem: function () {},
- /**
- * returns managed item for the effective filter. must be
- * implemented by concrete view
- */
- getFilterItem: function () {},
- /**
- * returns managed item for the toggle element. must be
- * implemented by concrete view
- */
- getToggleItem: function () {},
- /**
- * returns managed item for the raw filter container. must be
- * implemented by concrete view
- */
- getRawFilterContainerItem: function () {},
- /**
- * returns managed item for the count control. must be
- * implemented by concrete view
- */
- getCountItem: function () {},
- /**
- * returns name of the filter mode key. must be implemented by concrete
- * view
- */
- getFilterModeKey: function () {},
- /**
- * Sets the config model for this view and subscribes to some events.
- * Also binds the config chooser to the model
- *
- * @param {OCA.LDAP.Wizard.ConfigModel} configModel
- */
- setModel: function(configModel) {
- this._super(configModel);
- this.configModel.on('configLoaded', this.onConfigSwitch, this);
- this.configModel.on('receivedLdapFeature', this.onFeatureReceived, this);
- },
- /**
- * @inheritdoc
- */
- _setFilterModeAssisted: function () {
- this._super();
- if(this.isComplexGroupChooser) {
- this.enableElement(this.getGroupsItem().$relatedElements);
- }
- },
- /**
- * @inheritdoc
- */
- _setFilterModeRaw: function () {
- this._super();
- if(this.manyGroupsSupport) {
- this.disableElement(this.getGroupsItem().$relatedElements);
- }
- },
- /**
- * sets the selected user object classes
- *
- * @param {Array} classes
- */
- setObjectClass: function(classes) {
- this.setElementValue(this.getObjectClassItem().$element, classes);
- this.getObjectClassItem().$element.multiselect('refresh');
- },
- /**
- * sets the selected groups
- *
- * @param {string} groups
- */
- setGroups: function(groups) {
- if(typeof groups === 'string') {
- groups = groups.split("\n");
- }
- if(!this.isComplexGroupChooser) {
- this.setElementValue(this.getGroupsItem().$element, groups);
- this.getGroupsItem().$element.multiselect('refresh');
- } else {
- var $element = $(this.tabID).find('.ldapGroupListSelected');
- this.equipMultiSelect($element, groups);
- this.updateFilterOnType();
- }
- },
- /**
- * sets the filter
- *
- * @param {string} filter
- */
- setFilter: function(filter) {
- this.setElementValue(this.getFilterItem().$element, filter);
- this.$filterModeRawContainer.siblings('.ldapReadOnlyFilterContainer').find('.ldapFilterReadOnlyElement').text(filter);
- },
- /**
- * sets the user count string
- *
- * @param {string} countInfo
- */
- setCount: function(countInfo) {
- this.setElementValue(this.getCountItem().$element, countInfo);
- },
- /**
- * @inheritdoc
- */
- considerFeatureRequests: function() {
- if(!this.isActive) {
- return;
- }
- if(this.getObjectClassItem().$element.find('option').length === 0) {
- this.disableElement(this.getObjectClassItem().$element);
- this.disableElement(this.getGroupsItem().$element);
- if(this.parsedFilterMode === this.configModel.FILTER_MODE_ASSISTED) {
- this.configModel.requestWizard(this.getObjectClassItem().keyName);
- this.configModel.requestWizard(this.getGroupsItem().keyName);
- }
- }
- },
- /**
- * updates (creates, if necessary) filterOnType instances
- */
- updateFilterOnType: function() {
- if(_.isUndefined(this.filterOnType)) {
- this.filterOnType = [];
- var $availableGroups = $(this.tabID).find('.ldapGroupListAvailable');
- this.filterOnType.push(this.foTFactory.get(
- $availableGroups, $(this.tabID).find('.ldapManyGroupsSearch')
- ));
- var $selectedGroups = $(this.tabID).find('.ldapGroupListSelected');
- this.filterOnType.push(this.foTFactory.get(
- $selectedGroups, $(this.tabID).find('.ldapManyGroupsSearch')
- ));
- }
- },
- /**
- * @inheritdoc
- */
- onActivate: function() {
- this._super();
- this.considerFeatureRequests();
- },
- /**
- * resets the view when a configuration switch happened.
- *
- * @param {WizardTabAbstractFilter} view
- * @param {Object} configuration
- */
- onConfigSwitch: function(view, configuration) {
- view.getObjectClassItem().$element.find('option').remove();
- view.getGroupsItem().$element.find('option').remove();
- view.getCountItem().$element.text('');
- $(view.tabID).find('.ldapGroupListAvailable').empty();
- $(view.tabID).find('.ldapGroupListSelected').empty();
- view.updateFilterOnType();
- $(view.tabID).find('.ldapManyGroupsSearch').val('');
- if(view.isComplexGroupChooser) {
- view.isComplexGroupChooser = false;
- view.getGroupsItem().$element.multiselect({classes: view.multiSelectPluginClass});
- $(view.tabID).find(".ldapManyGroupsSupport").addClass('hidden');
- }
- view.onConfigLoaded(view, configuration);
- },
- /**
- * @inheritdoc
- */
- onConfigLoaded: function(view, configuration) {
- for(var key in view.managedItems){
- if(!_.isUndefined(configuration[key])) {
- var value = configuration[key];
- var methodName = view.managedItems[key].setMethod;
- if(!_.isUndefined(view[methodName])) {
- view[methodName](value);
- // we reimplement it here to update the filter index
- // for groups. Maybe we can isolate it?
- if(methodName === 'setGroups') {
- view.updateFilterOnType();
- }
- }
- }
- }
- },
- /**
- * if UserObjectClasses are found, the corresponding element will be
- * updated
- *
- * @param {WizardTabAbstractFilter} view
- * @param {FeaturePayload} payload
- */
- onFeatureReceived: function(view, payload) {
- if(payload.feature === view.getObjectClassItem().featureName) {
- view.equipMultiSelect(view.getObjectClassItem().$element, payload.data);
- if( !view.getFilterItem().$element.val()
- && view.parsedFilterMode === view.configModel.FILTER_MODE_ASSISTED
- ) {
- view.configModel.requestWizard(view.getFilterItem().keyName);
- }
- } else if (payload.feature === view.getGroupsItem().featureName) {
- if(view.manyGroupsSupport && payload.data.length > view._groupElementSwitchThreshold) {
- // we need to fill the left list box, excluding the values
- // that are already selected
- var $element = $(view.tabID).find('.ldapGroupListAvailable');
- var selected = view.configModel.configuration[view.getGroupsItem().keyName];
- var available = $(payload.data).not(selected).get();
- view.equipMultiSelect($element, available);
- $(view.tabID).find(".ldapManyGroupsSupport").removeClass('hidden');
- view.getGroupsItem().$element.multiselect({classes: view.multiSelectPluginClass + ' forceHidden'});
- view.isComplexGroupChooser = true;
- } else {
- view.isComplexGroupChooser = false;
- view.equipMultiSelect(view.getGroupsItem().$element, payload.data);
- view.getGroupsItem().$element.multiselect({classes: view.multiSelectPluginClass});
- $(view.tabID).find(".ldapManyGroupsSupport").addClass('hidden');
- }
- }
- },
- /**
- * request to count the users with the current filter
- *
- * @param {Event} event
- */
- onCountButtonClick: function(event) {
- event.preventDefault();
- // let's clear the field
- this.getCountItem().$element.text('');
- this.configModel.requestWizard(this.getCountItem().keyName);
- },
- /**
- * saves groups when using the complex UI
- *
- * @param {Array} groups
- * @returns {boolean}
- * @private
- */
- _saveGroups: function(groups) {
- var toSave = '';
- $(groups).each(function() { toSave = toSave + "\n" + this; } );
- this.configModel.set(this.getGroupsItem().keyName, $.trim(toSave));
- },
- /**
- * acts on adding groups to the filter
- */
- onSelectGroup: function() {
- var $available = $(this.tabID).find('.ldapGroupListAvailable');
- if(!$available.val()) {
- return; // no selection – nothing to do
- }
- var $selected = $(this.tabID).find('.ldapGroupListSelected');
- var selected = $.map($selected.find('option'), function(e) { return e.value; });
- let selectedGroups = [];
- $available.find('option:selected:visible').each(function() {
- selectedGroups.push($(this).val());
- });
- this._saveGroups(selected.concat(selectedGroups));
- $available.find('option:selected:visible').prependTo($selected);
- this.updateFilterOnType(); // selected groups are not updated yet
- $available.find('option:selected').prop("selected", false);
- },
- /**
- * acts on removing groups to the filter
- */
- onDeselectGroup: function() {
- var $available = $(this.tabID).find('.ldapGroupListAvailable');
- var $selected = $(this.tabID).find('.ldapGroupListSelected');
- var selected = $.map($selected.find('option:not(:selected:visible)'), function(e) { return e.value; });
- this._saveGroups(selected);
- $selected.find('option:selected:visible').appendTo($available);
- this.updateFilterOnType(); // selected groups are not updated yet
- $selected.find('option:selected').prop("selected", false);
- }
- });
- OCA.LDAP.Wizard.WizardTabAbstractFilter = WizardTabAbstractFilter;
- })();
|