From 69bcfa49d43b07f9c3e4f00cac38da86378be292 Mon Sep 17 00:00:00 2001 From: Ana Krivokapic Date: Tue, 16 Jul 2013 18:40:02 +0200 Subject: Expose ipaRangeType in Web UI https://fedorahosted.org/freeipa/ticket/3759 --- install/ui/src/freeipa/idrange.js | 176 +++++++++++++++++++++++++++----------- 1 file changed, 125 insertions(+), 51 deletions(-) (limited to 'install/ui/src/freeipa/idrange.js') diff --git a/install/ui/src/freeipa/idrange.js b/install/ui/src/freeipa/idrange.js index 7e419e574..7f3954ec7 100644 --- a/install/ui/src/freeipa/idrange.js +++ b/install/ui/src/freeipa/idrange.js @@ -85,85 +85,159 @@ return { adder_dialog: { fields: [ { - name: 'cn', - widget: 'idrange.cn' + name: 'cn' }, { name: 'ipabaseid', label: '@i18n:objects.idrange.ipabaseid', - tooltip: '@mo-param:idrange:ipabaseid:label', - widget: 'idrange.ipabaseid' + tooltip: '@mo-param:idrange:ipabaseid:label' }, { name: 'ipaidrangesize', label: '@i18n:objects.idrange.ipaidrangesize', - tooltip: '@mo-param:idrange:ipaidrangesize:label', - widget: 'idrange.ipaidrangesize' + tooltip: '@mo-param:idrange:ipaidrangesize:label' }, { name: 'ipabaserid', label: '@i18n:objects.idrange.ipabaserid', - tooltip: '@mo-param:idrange:ipabaserid:label', - widget: 'idrange.ipabaserid' + tooltip: '@mo-param:idrange:ipabaserid:label' + }, + { + name: 'iparangetype', + $type: 'radio', + label: '@i18n:objects.idrange.type', + layout: 'vertical', + default_value: 'ipa-local', + options: [ + { + value: 'ipa-local', + label: '@i18n:objects.idrange.type_local' + }, + { + value: 'ipa-ad-trust', + label: '@i18n:objects.idrange.type_ad' + }, + { + value: 'ipa-ad-trust-posix', + label: '@i18n:objects.idrange.type_ad_posix' + }, + { + value: 'ipa-ad-winsync', + label: '@i18n:objects.idrange.type_winsync' + }, + { + value: 'ipa-ipa-trust', + label: '@i18n:objects.idrange.type_ipa' + } + ] }, { name: 'ipasecondarybaserid', label: '@i18n:objects.idrange.ipasecondarybaserid', - tooltip: '@mo-param:idrange:ipasecondarybaserid:label', - widget: 'type.ipasecondarybaserid' + tooltip: '@mo-param:idrange:ipasecondarybaserid:label' }, { name: 'ipanttrusteddomainsid', label: '@i18n:objects.idrange.ipanttrusteddomainsid', tooltip: '@mo-param:idrange:ipanttrusteddomainsid:label', - widget: 'type.ipanttrusteddomainsid' - } - ], - widgets: [ - { - $type: 'details_table_section_nc', - name: 'idrange', - widgets: [ - 'cn', - 'ipabaseid', - 'ipaidrangesize', - 'ipabaserid' - ] - }, - { - $type: 'multiple_choice_section', - name: 'type', - label: '@i18n:objects.idrange.type', - choices: [ - { - name: 'local', - label: '@i18n:objects.idrange.type_local', - fields: ['ipasecondarybaserid'], - required: ['ipasecondarybaserid'], - enabled: true - }, - { - name: 'ad', - label: '@i18n:objects.idrange.type_ad', - fields: ['ipanttrusteddomainsid'], - required: ['ipanttrusteddomainsid'] - } - ], - widgets: [ - 'ipasecondarybaserid', - 'ipanttrusteddomainsid' - ] + enabled: false } ], policies: [ - { - $factory: IPA.multiple_choice_section_policy, - widget: 'type' - } + IPA.idrange_adder_policy ] } };}; +IPA.idrange_adder_policy = function(spec) { + /* + The logic for enabling/requiring ipabaserid, ipasecondarybaserid and + ipanttrusteddomainsid is as follows: + 1) for AD ranges (range type is ipa-ad-trust or ipa-ad-trust-posix): + * ipabaserid and ipanttrusteddomainsid are requred + * ipasecondarybaserid is disabled + 2) for local ranges + * ipanttrusteddomainsid is disabled + A) if server has AD trust support: + * both ipabaserid and ipasecondarybaserid are required + B) if server does not have AD trust support: + * ipabaserid and ipasecondarybaserid may only be used together + (if one is set, other is required and vice versa) + */ + + function require(field) { + field.set_enabled(true); + field.set_required(true); + } + + function disable(field) { + field.reset(); + field.set_required(false); + field.set_enabled(false); + } + + function enable(field) { + field.set_enabled(true); + field.set_required(false); + } + + spec = spec || {}; + + var that = IPA.facet_policy(spec); + + that.init = function() { + var type_f = that.container.fields.get_field('iparangetype'); + var baserid_f = that.container.fields.get_field('ipabaserid'); + var secondarybaserid_f = that.container.fields.get_field('ipasecondarybaserid'); + + if (IPA.trust_enabled) { + require(baserid_f); + require(secondarybaserid_f); + } + + type_f.widget.value_changed.attach(that.on_input_change); + type_f.widget.updated.attach(that.on_input_change); + baserid_f.widget.value_changed.attach(that.on_input_change); + secondarybaserid_f.widget.value_changed.attach(that.on_input_change); + }; + + that.on_input_change = function() { + var type_f = that.container.fields.get_field('iparangetype'); + var baserid_f = that.container.fields.get_field('ipabaserid'); + var secondarybaserid_f = that.container.fields.get_field('ipasecondarybaserid'); + var trusteddomainsid_f = that.container.fields.get_field('ipanttrusteddomainsid'); + + var type_v = type_f.save()[0]; + var baserid_v = baserid_f.save()[0] || ''; + var secondarybaserid_v = secondarybaserid_f.save()[0] || ''; + + var is_ad_range = (type_v === 'ipa-ad-trust' || type_v === 'ipa-ad-trust-posix'); + + if (is_ad_range) { + require(baserid_f); + require(trusteddomainsid_f); + disable(secondarybaserid_f); + } else { + disable(trusteddomainsid_f); + + if (IPA.trust_enabled) { + require(baserid_f); + require(secondarybaserid_f); + } else { + if (baserid_v || secondarybaserid_v) { + require(baserid_f); + require(secondarybaserid_f); + } else { + enable(baserid_f); + enable(secondarybaserid_f); + } + } + } + }; + + return that; +}; + exp.entity_spec = make_spec(); exp.register = function() { var e = reg.entity; -- cgit