nextcloud/apps/user_ldap/js/wizard/wizardTabAbstractFilter.js

385 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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;
})();