From c2ba333b9681d008d9c528a79dbdd76ce11a3ecd Mon Sep 17 00:00:00 2001 From: Serhii Tsymbaliuk Date: Thu, 28 May 2020 08:47:49 +0200 Subject: [PATCH 01/22] WebUI: Fix "IPA Error 3007: RequirmentError" while adding idoverrideuser association Add builder for association adder dialog which allows to override behavior of the component. Replace default implementation with a custom one for idoverrideuser. Replace text filter with 'ID view' select box in the idoverrideuser dialog. Ticket: https://pagure.io/freeipa/issue/8335 Signed-off-by: Serhii Tsymbaliuk Reviewed-By: Alexander Bokovoy --- install/ui/src/freeipa/association.js | 13 ++++- install/ui/src/freeipa/dialog.js | 73 ++++++++++++++++----------- install/ui/src/freeipa/group.js | 14 +++++ install/ui/src/freeipa/idviews.js | 58 +++++++++++++++++++++ ipaserver/plugins/internal.py | 6 +++ 5 files changed, 133 insertions(+), 31 deletions(-) diff --git a/install/ui/src/freeipa/association.js b/install/ui/src/freeipa/association.js index f10ccb2a5..b083a79f9 100644 --- a/install/ui/src/freeipa/association.js +++ b/install/ui/src/freeipa/association.js @@ -25,6 +25,7 @@ define([ 'dojo/_base/lang', 'dojo/Deferred', + './builder', './metadata', './ipa', './jquery', @@ -38,7 +39,7 @@ define([ './facet', './search', './dialog'], - function(lang, Deferred, metadata_provider, IPA, $, metadata, + function(lang, Deferred, builder, metadata_provider, IPA, $, metadata, navigation, phases, reg, rpc, su, text) { /** @@ -1209,7 +1210,8 @@ exp.association_facet = IPA.association_facet = function (spec, no_init) { var pkeys = that.data.result.result[that.get_attribute_name()]; - var dialog = IPA.association_adder_dialog({ + var dialog = builder.build('association_adder_dialog', { + $type: that.other_entity.name, title: title, entity: that.entity, pkey: pkey, @@ -1675,6 +1677,13 @@ IPA.attr_read_only_evaluator = function(spec) { return that; }; +// Create a registry for adder dialogs where key is name of 'other entity'. +// It allows to override dialogs for some specific cases of association +// creation. +var dialog_builder = builder.get('association_adder_dialog'); +dialog_builder.factory = IPA.association_adder_dialog; +reg.set('association_adder_dialog', dialog_builder.registry); + phases.on('registration', function() { var w = reg.widget; var f = reg.field; diff --git a/install/ui/src/freeipa/dialog.js b/install/ui/src/freeipa/dialog.js index c153120df..d67d63b6d 100644 --- a/install/ui/src/freeipa/dialog.js +++ b/install/ui/src/freeipa/dialog.js @@ -919,35 +919,7 @@ IPA.adder_dialog = function(spec) { 'class': 'input-group col-md-12 adder-dialog-top' }).appendTo(container); - var filter_placeholder = text.get('@i18n:association.filter_placeholder'); - filter_placeholder = filter_placeholder.replace('${other_entity}', - that.other_entity.metadata.label); - - that.filter_field = $('', { - type: 'text', - name: 'filter', - 'class': 'form-control', - 'placeholder': filter_placeholder, - keyup: function(event) { - if (event.keyCode === keys.ENTER) { - that.search(); - return false; - } - } - }).appendTo(input_group); - - var input_group_btn = $('
', { - 'class': 'input-group-btn' - }).appendTo(input_group); - - that.find_button = IPA.button({ - name: 'find', - label: '@i18n:buttons.filter', - click: function() { - that.search(); - return false; - } - }).appendTo(input_group_btn); + that.filter_field = that.get_filter_field(input_group); var row = $('
', { 'class': 'row adder-dialog-main'}).appendTo(container); // @@ -1132,6 +1104,49 @@ IPA.adder_dialog = function(spec) { return that.filter_field.val(); }; + /** + * Return field for filtering available items + * + * Default implementation returns text input + "Filter" button. + * It can be overridden. + * + * @param {HTMLElement} input_group - container for a filter field + * @return {HTMLElement} + */ + that.get_filter_field = function(input_group) { + var filter_placeholder = text.get( + '@i18n:association.filter_placeholder' + ).replace('${other_entity}', that.other_entity.metadata.label); + + var filter_field = $('', { + type: 'text', + name: 'filter', + 'class': 'form-control', + 'placeholder': filter_placeholder, + keyup: function(event) { + if (event.keyCode === keys.ENTER) { + that.search(); + return false; + } + } + }).appendTo(input_group); + + var input_group_btn = $('
', { + 'class': 'input-group-btn' + }).appendTo(input_group); + + that.find_button = IPA.button({ + name: 'find', + label: '@i18n:buttons.filter', + click: function() { + that.search(); + return false; + } + }).appendTo(input_group_btn); + + return filter_field; + }; + /** * Clear rows in available table */ diff --git a/install/ui/src/freeipa/group.js b/install/ui/src/freeipa/group.js index e46d8c7e3..2984bd4b2 100644 --- a/install/ui/src/freeipa/group.js +++ b/install/ui/src/freeipa/group.js @@ -205,6 +205,20 @@ return { add_title: '@i18n:objects.group.add_into_sudo', remove_method: 'remove_user', remove_title: '@i18n:objects.group.remove_from_sudo' + }, + { + $type: 'association', + name: 'member_idoverrideuser', + associator: IPA.serial_associator, + add_title: '@i18n:objects.group.add_idoverride_user', + remove_title: '@i18n:objects.group.remove_idoverride_users', + columns: [ + { + name: 'ipaanchoruuid', + label: '@i18n:objects.idoverrideuser.anchor_label', + link: false + } + ] } ], standard_association_facets: true, diff --git a/install/ui/src/freeipa/idviews.js b/install/ui/src/freeipa/idviews.js index 35dc998c8..a4fca6205 100644 --- a/install/ui/src/freeipa/idviews.js +++ b/install/ui/src/freeipa/idviews.js @@ -966,6 +966,58 @@ idviews.unapply_action = function(spec) { return that; }; +idviews.idoverrideuser_adder_dialog = function(spec) { + + spec = spec || {}; + + var that = IPA.association_adder_dialog(spec); + + that.base_search = that.search; + + that.search = function() { + // Search for users only in case a ID view is selected + if (that.get_filter()) { + that.base_search(); + } + }; + + /** + * Replace default text filter with a select box for filtering by ID view + */ + that.get_filter_field = function(input_group) { + + var filter_field = $('