diff options
-rw-r--r-- | install/ui/src/freeipa/navigation/menu_spec.js | 5 | ||||
-rw-r--r-- | install/ui/src/freeipa/topology.js | 250 |
2 files changed, 252 insertions, 3 deletions
diff --git a/install/ui/src/freeipa/navigation/menu_spec.js b/install/ui/src/freeipa/navigation/menu_spec.js index fb64ccaea..0afc7dace 100644 --- a/install/ui/src/freeipa/navigation/menu_spec.js +++ b/install/ui/src/freeipa/navigation/menu_spec.js @@ -226,6 +226,11 @@ var nav = {}; hidden: true }, { + entity: 'location', + facet: 'search', + hidden: true + }, + { facet: 'topology-graph', hidden: true } diff --git a/install/ui/src/freeipa/topology.js b/install/ui/src/freeipa/topology.js index c26dc6853..290dc3825 100644 --- a/install/ui/src/freeipa/topology.js +++ b/install/ui/src/freeipa/topology.js @@ -51,7 +51,8 @@ var topology = IPA.topology = { suffix_search: 'topologysuffix_search', server_search: 'server_search', domainlevel: 'domainlevel_details', - topologygraph: 'topology-graph' + topologygraph: 'topology-graph', + location_search: 'location_search' } } }; @@ -193,6 +194,14 @@ return { var make_server_spec = function() { return { name: 'server', + policies: [ + { + $factory: IPA.facet_update_policy, + source_facet: 'details', + dest_entity: 'location', + dest_facet: 'details' + } + ], facets: [ { $type: 'search', @@ -212,7 +221,6 @@ return { }, { $type: 'details', - no_update: true, disable_facet_tabs: true, sections: [ { @@ -221,7 +229,18 @@ return { { name: 'cn', read_only: true }, { name: 'ipamindomainlevel', read_only: true }, { name: 'ipamaxdomainlevel', read_only: true }, - { $type: 'multivalued', name: 'iparepltopomanagedsuffix_topologysuffix', read_only: true } + { $type: 'multivalued', name: 'iparepltopomanagedsuffix_topologysuffix', read_only: true }, + { + $type: 'entity_select', + name: 'ipalocation_location', + other_entity: 'location', + other_field: 'idnsname', + flags: ['w_if_no_aci'] + }, + { + name: 'ipalocationweight', + placeholder: '100' + } ] } ] @@ -272,6 +291,227 @@ topology.domainlevel_adapter = declare([mod_field.Adapter], { }); +var make_location_spec = function() { +return { + name: 'location', + policies: [ + { + $factory: IPA.facet_update_policy, + source_facet: 'details', + dest_entity: 'server', + dest_facet: 'details' + }, + { + $factory: IPA.facet_update_policy, + source_facet: 'details', + dest_entity: 'location', + dest_facet: 'search' + } + ], + facets: [ + { + $type: 'search', + disable_facet_tabs: false, + tabs_in_sidebar: true, + tab_label: '@mo:location.label', + facet_groups: [topology.search_facet_group], + facet_group: 'search', + columns: [ + 'idnsname', + 'description' + ] + }, + { + $type: 'details', + disable_facet_tabs: true, + section_layout_class: 'col-sm-12', + sections: [ + { + name: 'general', + label: '@i18n:details.general', + fields: [ + 'idnsname', + { + $type: 'textarea', + name: 'description' + } + ] + }, + { + $factory: IPA.section, + name: 'servers', + label: '@mo:server.label', + fields: [ + { + $type: 'location_association_table', + adapter: topology.location_adapter, + other_entity: 'server', + footer: false, + name: 'cn', + columns: [ + { + name: 'cn', + link: true + }, + { + name: 'ipalocationweight' + }, + { + name: 'location_relative_weight' + } + ] + } + ] + } + ] + } + ], + adder_dialog: { + fields: [ + { + $type: 'text', + name: 'idnsname', + required: true + }, + 'description' + ] + } +};}; + +topology.location_adapter = declare([mod_field.Adapter], { + load: function(data) { + var result = this.get_record(data); + if (result.servers_server === undefined) return []; + + result = result.servers_server; + + this.result_name = 'servers'; + var servers = this.get_record(data); + this.result_name = 'result'; + + var output = []; + + for (var i=0, l=result.length; i<l; i++) { + output.push(servers[result[i]]); + } + + return output; + } +}); + +topology.location_server_adder_dialog = function(spec) { + spec = spec || {}; + + var that = IPA.entity_adder_dialog(spec); + + that.init = function() { + that.added.attach(function() { + that.facet.refresh(); + that.facet.on_update.notify(); + }); + }; + + that.create_add_command = function(record) { + var pkey = that.facet.get_pkey(); + var command = that.entity_adder_dialog_create_add_command(record); + + command.set_option('ipalocation_location', pkey); + + return command; + }; + + that.init(); + + return that; +}; + +topology.location_association_table_widget = function(spec) { + + spec = spec || {}; + spec.name = spec.name || 'servers'; + + var that = IPA.association_table_widget(spec); + + that.create_add_dialog = function() { + + var entity_label = that.entity.metadata.label_singular; + var pkey = that.facet.get_pkey(); + var other_entity_label = that.other_entity.metadata.label_singular; + + var title = that.add_title; + title = title.replace('${entity}', entity_label); + title = title.replace('${primary_key}', pkey); + title = title.replace('${other_entity}', other_entity_label); + + return topology.location_server_adder_dialog({ + title: title, + entity: that.other_entity.name, + method: 'mod', + options: { + 'ipalocation_location': pkey + }, + sections: [ + { + fields: [ + { + $type: 'entity_select', + name: 'cn', + required: true, + other_entity: that.other_entity.name, + other_field: 'cn', + filter_options: { + 'not_in_location': pkey + } + }, + { + $type: 'text', + name: 'ipalocationweight' + } + ] + } + ] + }); + }; + + + that.remove = function(values, on_success, on_error) { + + var pkey = ''; + + var batch = rpc.batch_command({ + on_success: function(data) { + that.remove_button.set_enabled(false); + that.facet.refresh(); + + var count = data.result.count; + var msg = text.get('@i18n:association.removed').replace('${count}', count); + IPA.notify_success(msg); + }, + on_error: on_error + }); + + var command, value; + for(var i = 0, l=values.length; i<l; i++) { + value = values[i]; + + command = rpc.command({ + entity: that.other_entity.name, + method: 'mod', + args: [value], + options: { + 'ipalocation_location': pkey + } + }); + + batch.add_command(command); + } + + batch.execute(); + }; + + return that; +}; + topology.domainlevel_metadata = function(spec, context) { var metadata = metadata_provider.source; metadata.objects.domainlevel = { @@ -970,6 +1210,7 @@ topology.server_spec = make_server_spec(); */ topology.domainlevel_spec = make_domainlevel_spec(); +topology.location_spec = make_location_spec(); /** * Register entity @@ -985,17 +1226,20 @@ topology.register = function() { e.register({type: 'topologysegment', spec: topology.segment_spec}); e.register({type: 'server', spec: topology.server_spec}); e.register({type: 'domainlevel', spec: topology.domainlevel_spec}); + e.register({type: 'location', spec: topology.location_spec}); a.register('domainlevel_set', topology.domainlevel_set_action); a.register('segment_add', topology.add_segment_action); a.register('segment_del', topology.del_segment_action); w.register('topology-graph', topology.TopologyGraphWidget); + w.register('location_association_table', topology.location_association_table_widget); fa.register({ type: 'topology-graph', ctor: topology.TopologyGraphFacet, spec: topology.topology_graph_facet_spec }); + }; phases.on('registration', topology.register); |