diff options
-rw-r--r-- | install/ui/src/freeipa/automember.js | 2 | ||||
-rw-r--r-- | install/ui/src/freeipa/details.js | 39 | ||||
-rw-r--r-- | install/ui/src/freeipa/dns.js | 19 | ||||
-rw-r--r-- | install/ui/src/freeipa/field.js | 74 | ||||
-rw-r--r-- | install/ui/src/freeipa/rule.js | 6 | ||||
-rw-r--r-- | install/ui/src/freeipa/service.js | 6 | ||||
-rw-r--r-- | install/ui/src/freeipa/user.js | 65 | ||||
-rw-r--r-- | install/ui/src/freeipa/util.js | 3 |
8 files changed, 122 insertions, 92 deletions
diff --git a/install/ui/src/freeipa/automember.js b/install/ui/src/freeipa/automember.js index 95f6960d2..5eff3e69b 100644 --- a/install/ui/src/freeipa/automember.js +++ b/install/ui/src/freeipa/automember.js @@ -455,7 +455,7 @@ IPA.automember.condition_field = function(spec) { IPA.automember.condition_adapter = declare([field_mod.Adapter], { - load: function(record) { + load: function(data) { var regexes = this.inherited(arguments); var values = []; if (regexes) { diff --git a/install/ui/src/freeipa/details.js b/install/ui/src/freeipa/details.js index a3aac27c7..b7fa36469 100644 --- a/install/ui/src/freeipa/details.js +++ b/install/ui/src/freeipa/details.js @@ -237,15 +237,15 @@ exp.section_builder = IPA.section_builder = function(spec) { */ that.build_section = function(section_spec, index) { - var spec = section_spec; + var spec = {}; var overrides = {}; var spec_type = typeof that.section_spec; if (spec_type === 'object') { spec = lang.mixin({}, that.section_spec); - spec = lang.mixin(spec, section_spec); } else if (spec_type === "function") { overrides = that.section_spec; } + spec = lang.mixin(spec, section_spec); if (!spec.label && spec.name && that.container.entity) { var section_label = '@i18n:objects.'+that.container.entity.name+ @@ -261,7 +261,9 @@ exp.section_builder = IPA.section_builder = function(spec) { }, overrides); that.container.widgets.add_widget(section); + section.$field_adapter = spec.field_adapter; that.create_fields(section, spec.fields); + delete section.$field_adapter; }; /** @@ -283,8 +285,18 @@ exp.section_builder = IPA.section_builder = function(spec) { */ that.create_field = function(section, field_spec) { + if (typeof field_spec === 'string') { + field_spec = { + name: field_spec + }; + } + var widget = that.widget_builder.build_widget(field_spec, section.widgets); + if (section.$field_adapter && !field_spec.adapter) { + field_spec.adapter = section.$field_adapter; + } + //spec.$factory refers to widget factory if(field_spec.$factory) delete field_spec.$factory; @@ -714,7 +726,7 @@ exp.details_facet = IPA.details_facet = function(spec, no_init) { var fields = that.fields.get_fields(); for (var i=0; i<fields.length; i++) { var field = fields[i]; - field.load(data.result.result); + field.load(data); } that.policies.post_load(data); that.post_load.notify([data], that); @@ -1467,6 +1479,10 @@ exp.boolean_state_evaluator = IPA.boolean_state_evaluator = function(spec) { */ that.field_name = spec.field; + that.param = spec.param || that.field_name; + + that.adapter = builder.build('adapter', spec.adapter || 'adapter', { context: that }); + /** * State to set when value is `true` * @property {string} @@ -1504,10 +1520,10 @@ exp.boolean_state_evaluator = IPA.boolean_state_evaluator = function(spec) { that.on_event = function(data) { var old_state = that.state; - var record = data.result.result; that.state = []; - var value = that.parser.parse(record[that.field_name]); + var value = that.adapter.load(data); + value = that.parser.parse(value); if (value === true) { that.state.push(that.true_state); @@ -1570,20 +1586,23 @@ exp.acl_state_evaluator = IPA.acl_state_evaluator = function(spec) { */ that.attribute = spec.attribute; + that.param = spec.param || 'attributelevelrights'; + + that.adapter = builder.build('adapter', spec.adapter || 'adapter', { context: that }); + /** * @inheritDoc */ that.on_event = function(data) { - var old_state, record, rights, i, state; + var old_state, record, all_rights, rights, i, state; old_state = that.state; - record = data.result.result; - that.state = []; - if (record.attributelevelrights) { - rights = record.attributelevelrights[that.attribute]; + all_rights = that.adapter.load(data); + if (all_rights) { + rights = all_rights[that.attribute]; } // Full rights if we don't know the rights. Better to allow action and diff --git a/install/ui/src/freeipa/dns.js b/install/ui/src/freeipa/dns.js index 0dd84e686..aa1ac15e6 100644 --- a/install/ui/src/freeipa/dns.js +++ b/install/ui/src/freeipa/dns.js @@ -339,12 +339,6 @@ IPA.dnszone_details_facet = function(spec, no_init) { that.permission_load = IPA.observer(); that.permission_status = 'unknown'; // [unknown, set, none] - that.refresh_on_success = function(data, text_status, xhr) { - // do not load data from batch - - that.show_content(); - }; - that.create_refresh_command = function() { var pkey = that.get_pkey(); @@ -354,14 +348,6 @@ IPA.dnszone_details_facet = function(spec, no_init) { }); var dnszone_command = that.details_facet_create_refresh_command(); - - dnszone_command.on_success = function(data, text_status, xhr) { - // create data that mimics dnszone-show output - var dnszone_data = {}; - dnszone_data.result = data; - that.load(dnszone_data); - }; - batch.add_command(dnszone_command); var permission_name = IPA.dns.zone_permission_name.replace('${dnszone}', pkey); @@ -1608,8 +1594,9 @@ IPA.dns.record_type_adapter = declare([field_mod.Adapter], { separator: ';', - load: function(record) { + load: function(rpcdata) { + var record = this.get_record(rpcdata); var data = {}; data.idnsname = record.idnsname; @@ -2060,7 +2047,7 @@ IPA.dns.netaddr_adapter = declare([field_mod.Adapter], { separator: ';', - load: function(record) { + load: function(data) { var value = this.inherited(arguments)[0]; if (value) { if (value[value.length-1] === this.separator) { diff --git a/install/ui/src/freeipa/field.js b/install/ui/src/freeipa/field.js index 52cd2b18f..24522575d 100644 --- a/install/ui/src/freeipa/field.js +++ b/install/ui/src/freeipa/field.js @@ -411,17 +411,18 @@ field.field = IPA.field = function(spec) { * This function calls adapter to get value from record and date_parser to * process it. The it sets is as `value`. */ - that.load = function(record) { + that.load = function(data) { - var value = that.adapter.load(record); + var value = that.adapter.load(data); var parsed = util.parse(that.data_parser, value, "Parse error:"+that.name); value = parsed.value; if (!parsed.ok) { window.console.warn(parsed.message); } - // this call is quite application specific and should be moved to + // this part is quite application specific and should be moved to // different component + var record = that.adapter.get_record(data); that.load_writable(record); that.set_value(value, true); @@ -459,7 +460,7 @@ field.field = IPA.field = function(spec) { } } - if (record.attributelevelrights) { + if (record && record.attributelevelrights) { var rights = record.attributelevelrights[that.acl_param]; var oc_rights= record.attributelevelrights['objectclass']; var write_oc = oc_rights && oc_rights.indexOf('w') > -1; @@ -740,10 +741,10 @@ field.field = IPA.field = function(spec) { }; /** - * Adapter's task is to select wanted data from record and vice-versa. + * Adapter's task is to select wanted data from RPC response * - * This default adapter expects that context will be field and record - * will be FreeIPA JsonRPC result. + * This default adapter expects that context will be a field and data + * will be FreeIPA JsonRPC response. * * @class */ @@ -757,6 +758,41 @@ field.Adapter = declare(null, { context: null, /** + * Index of result in batch results array + * @type {Number} + */ + result_index: 0, + + /** + * Extract record from RPC call response + * + * Tries to detect if supplied data is RPC call response if so, it + * extracts the record. Otherwise it returns supplied data as the record. + * + * @param {Object} data Response data or record + * @return {Object} record + */ + get_record: function(data) { + + // detection if it's result or raw RPC command response + // all raw responses should contain `version` and `principal` + if (!data.version || !data.principal) { + return data; + } + + var dr = data.result; + var record = null; + if (dr) { + if (dr.result) record = dr.result; + else if (dr.results) { + var result = dr.results[this.result_index]; + if (result) record = result.result; + } + } + return record; + }, + + /** * Get single value from record * @param {Object} record Record * @param {string} name Attribute name @@ -772,13 +808,21 @@ field.Adapter = declare(null, { * By default just select attribute with name defined by `context.param` * from a record. Uses default value if value is not in record and context * defines it. - * @param {Object} record + * @param {Object} data Object which contains the record or the record + * @param {string} [attribute] attribute name - overrides `context.param` + * @param {Mixed} [def_val] default value - overrides `context.default_value` * @returns {Array} attribute value */ - load: function(record) { - var value = this.get_value(record, this.context.param); - if (util.is_empty(value) && !util.is_empty(this.context.default_value)) { - value = util.normalize_value(this.context.default_value); + load: function(data, attribute, def_val) { + var record = this.get_record(data); + var value = null; + var attr = attribute || this.context.param; + var def = def_val || this.context.default_value; + if (record) { + value = this.get_value(record, attr); + } + if (util.is_empty(value) && !util.is_empty(def)) { + value = util.normalize_value(def); } return value; }, @@ -803,6 +847,7 @@ field.Adapter = declare(null, { }, constructor: function(spec) { + declare.safeMixin(this, spec); this.context = spec.context || {}; } }); @@ -1127,7 +1172,9 @@ field.SshKeysAdapter = declare([field.Adapter], { * ] * """ */ - load: function(record) { + load: function(data) { + + var record = this.get_record(data); var keys = this.get_value(record, this.context.param); var fingerprints = this.get_value(record, 'sshpubkeyfp'); var values = []; @@ -1392,6 +1439,7 @@ reg.set('validator', field.validator_builder.registry); * @member field */ field.adapter_builder = builder.get('adapter'); +field.adapter_builder.ctor = field.Adapter; field.adapter_builder.post_ops.push(function(obj, spec, context) { obj.context = context.context; return obj; diff --git a/install/ui/src/freeipa/rule.js b/install/ui/src/freeipa/rule.js index 7ad08e1f2..11a8e8201 100644 --- a/install/ui/src/freeipa/rule.js +++ b/install/ui/src/freeipa/rule.js @@ -193,12 +193,12 @@ IPA.rule_association_table_field = function(spec) { } }; - that.load = function(result) { - that.values = result[that.param] || []; + that.load = function(data) { + that.values = that.adapter.load(data); if (that.external) { that.set_values_external(that.values, ''); - var external_values = result[that.external] || []; + var external_values = that.adapter.load(data, that.external, []); that.set_values_external(external_values, 'true'); $.merge(that.values, external_values); } diff --git a/install/ui/src/freeipa/service.js b/install/ui/src/freeipa/service.js index 82f9ab3b3..4b04878c0 100644 --- a/install/ui/src/freeipa/service.js +++ b/install/ui/src/freeipa/service.js @@ -269,7 +269,8 @@ IPA.service_adder_dialog = function(spec) { }; IPA.service_name_adapter = declare([field_mod.Adapter], { - load: function(record) { + load: function(data) { + var record = this.get_record(data); var krbprincipalname = record.krbprincipalname[0]; var value = krbprincipalname.replace(/\/.*$/, ''); return [value]; @@ -277,7 +278,8 @@ IPA.service_name_adapter = declare([field_mod.Adapter], { }); IPA.service_host_adapter = declare([field_mod.Adapter], { - load: function(record) { + load: function(data) { + var record = this.get_record(data); var krbprincipalname = record.krbprincipalname[0]; var value = krbprincipalname.replace(/^.*\//, '').replace(/@.*$/, ''); return [value]; diff --git a/install/ui/src/freeipa/user.js b/install/ui/src/freeipa/user.js index 270f0b2cc..c5b9686a0 100644 --- a/install/ui/src/freeipa/user.js +++ b/install/ui/src/freeipa/user.js @@ -153,6 +153,7 @@ return { { name: 'pwpolicy', label: '@i18n:objects.pwpolicy.identity', + field_adapter: { result_index: 1 }, fields: [ { name: 'krbmaxpwdlife', @@ -202,6 +203,7 @@ return { { name: 'krbtpolicy', label: '@i18n:objects.krbtpolicy.identity', + field_adapter: { result_index: 2 }, fields: [ { name: 'krbmaxrenewableage', @@ -272,9 +274,15 @@ return { { $factory: IPA.enable_state_evaluator, field: 'nsaccountlock', + adapter: { $type: 'batch', result_index: 0 }, invert_value: true }, - IPA.user.reset_password_acl_evaluator + { + $factory: IPA.acl_state_evaluator, + name: 'reset_password_acl_evaluator', + adapter: { $type: 'batch', result_index: 0 }, + attribute: 'userpassword' + } ], summary_conditions: [ IPA.enabled_summary_cond, @@ -358,12 +366,6 @@ IPA.user.details_facet = function(spec) { var that = IPA.details_facet(spec); - that.refresh_on_success = function(data, text_status, xhr) { - // do not load data from batch - - that.show_content(); - }; - that.create_refresh_command = function() { var pkey = that.get_pkey(); @@ -373,19 +375,12 @@ IPA.user.details_facet = function(spec) { }); var user_command = that.details_facet_create_refresh_command(); - - user_command.on_success = function(data, text_status, xhr) { - // create data that mimics user-show output - var user_data = {}; - user_data.result = data; - that.load(user_data); - }; - batch.add_command(user_command); var pwpolicy_command = rpc.command({ entity: 'pwpolicy', method: 'show', + retry: false, options: { user: pkey, all: true, @@ -394,16 +389,11 @@ IPA.user.details_facet = function(spec) { }); pwpolicy_command.on_success = function(data, text_status, xhr) { - // TODO: Use nested fields: that.fields.get_field('pwpolicy').get_fields(); - var fields = that.fields.get_fields(); - for (var i=0; i<fields.length; i++) { - var field = fields[i]; - - // load result into pwpolicy fields - if (field.widget_name.match(/^pwpolicy\./)) { - field.load(data.result); - } - } + that.widgets.get_widget('pwpolicy').set_visible(true); + }; + + pwpolicy_command.on_error = function(xhr, text_status, error_thrown) { + that.widgets.get_widget('pwpolicy').set_visible(false); }; batch.add_command(pwpolicy_command); @@ -412,6 +402,7 @@ IPA.user.details_facet = function(spec) { entity: 'krbtpolicy', method: 'show', args: [ pkey ], + retry: false, options: { all: true, rights: true @@ -419,16 +410,11 @@ IPA.user.details_facet = function(spec) { }); krbtpolicy_command.on_success = function(data, text_status, xhr) { - // TODO: Use nested fields: that.fields.get_field('krbtpolicy').get_fields(); - var fields = that.fields.get_fields(); - for (var i=0; i<fields.length; i++) { - var field = fields[i]; - - // load result into krbtpolicy fields - if (field.widget_name.match(/^krbtpolicy\./)) { - field.load(data.result); - } - } + that.widgets.get_widget('krbtpolicy').set_visible(true); + }; + + krbtpolicy_command.on_error = function(xhr, text_status, error_thrown) { + that.widgets.get_widget('krbtpolicy').set_visible(false); }; batch.add_command(krbtpolicy_command); @@ -693,15 +679,6 @@ IPA.user.reset_password_action = function(spec) { return that; }; -IPA.user.reset_password_acl_evaluator = function(spec) { - - spec.name = spec.name || 'reset_password_acl_evaluator'; - spec.attribute = spec.attribute || 'userpassword'; - - var that = IPA.acl_state_evaluator(spec); - return that; -}; - exp.entity_spec = make_spec(); exp.register = function() { var e = reg.entity; diff --git a/install/ui/src/freeipa/util.js b/install/ui/src/freeipa/util.js index d6fbbf4f1..4b05b18a8 100644 --- a/install/ui/src/freeipa/util.js +++ b/install/ui/src/freeipa/util.js @@ -209,9 +209,6 @@ define([ if (!(value instanceof Array)) { value = value !== undefined ? [value] : []; } - if (!value.length) { - value = ['']; - } return value; } |