diff --git a/install/ui/src/freeipa/Application_controller.js b/install/ui/src/freeipa/Application_controller.js index a656b9061..46aabc9c4 100644 --- a/install/ui/src/freeipa/Application_controller.js +++ b/install/ui/src/freeipa/Application_controller.js @@ -541,37 +541,9 @@ define([ * Tries to find menu item with assigned facet and navigate to it. */ on_menu_click: function(menu_item) { - this._navigate_to_menu_item(menu_item); - }, - - _navigate_to_menu_item: function(menu_item) { - - if (menu_item.entity) { - // entity pages - routing.navigate([ - 'entity', - menu_item.entity, - menu_item.facet, - menu_item.pkeys, - menu_item.args]); - } else if (menu_item.facet) { - // concrete facets - routing.navigate(['generic', menu_item.facet, menu_item.args]); - } else { - // categories, select first posible child, it may be the last - var children = this.menu.query({parent: menu_item.name }); - if (children.total) { - var success = false; - for (var i=0; i', { - href: '#'+key, + href: '#' + entity_hash, text: key, click: function() { - - var pkeys = that.facet.get_pkeys(); - pkeys.push(key); - - var args = { - info: info, - key: key - }; - navigation.show_entity(that.entity.name, 'details', pkeys, args); return false; } diff --git a/install/ui/src/freeipa/facet.js b/install/ui/src/freeipa/facet.js index ed09fd118..d7702695d 100644 --- a/install/ui/src/freeipa/facet.js +++ b/install/ui/src/freeipa/facet.js @@ -1639,7 +1639,9 @@ exp.FacetGroupsWidget = declare([], { $('', { text: tab.tab_label, 'class': 'tab-link', - href: "#" + navigation.create_hash(tab, {}), + href: "#" + navigation.create_hash(tab, { + pkeys: self.facet.get_pkeys() + }), name: tab.name }).appendTo(el); @@ -2383,16 +2385,15 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) { }; /** + * Returns path to an entity details page * - * Method which will be called after clicking on pkey in table. + * It can be overridden by child classes. * - * It can be overridden by child classes for changing afterclick behavior. - * - * @param {String} value automatically filed by clicking - * @param {entity.entity} table entity - * @return {boolean} false + * @param {String} value - table column value + * @param {entity.entity} entity + * @return {Array} path to given entity */ - that.on_column_link_click = function(value, entity) { + that.get_column_entity_path = function(value, entity) { var pkeys = [value]; var args; @@ -2408,8 +2409,9 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) { pkeys.push(value); } - navigation.show_entity(entity.name, that.details_facet_name, pkeys, args); - return false; + return navigation.get_entity_path( + entity.name, that.details_facet_name, pkeys, args + ); }; /** @@ -2453,8 +2455,8 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) { } if (column.link && column.primary_key) { - column.link_handler = function(value) { - return that.on_column_link_click(value, entity); + column.get_entity_path = function(value) { + return that.get_column_entity_path(value, entity); }; } diff --git a/install/ui/src/freeipa/navigation.js b/install/ui/src/freeipa/navigation.js index 1797a5e92..20d202ba8 100644 --- a/install/ui/src/freeipa/navigation.js +++ b/install/ui/src/freeipa/navigation.js @@ -109,6 +109,20 @@ define([ } }, + /** + * Returns path to an entity details page base on routing params + */ + get_entity_path: function(entity_name, arg1, arg2, arg3) { + var params = {}; + this.set_params(params, arg1); + this.set_params(params, arg2); + this.set_params(params, arg3); + + return [ + 'entity', entity_name, params.facet, params.pkeys, params.args + ]; + }, + /** * Show entity facet * @@ -117,18 +131,32 @@ define([ * pkeys as Array * args as Object * @method show_entity - * @param String Enity name + * @param String entity_name * @param {Object|facet.facet|string|Function} arg1 * @param {Object|facet.facet|string|Function} arg2 * @param {Object|facet.facet|string|Function} arg3 */ show_entity: function(entity_name, arg1, arg2, arg3) { - var params = {}; - this.set_params(params, arg1); - this.set_params(params, arg2); - this.set_params(params, arg3); - return routing.navigate(['entity', entity_name, params.facet, - params.pkeys, params.args]); + var path = this.get_entity_path(entity_name, arg1, arg2, arg3); + return routing.navigate(path); + }, + + /** + * Return URL hash which refers to entity facet + * + * arg1,arg2,arg3 are: + * facet name as String + * pkeys as Array + * args as Object + * @method get_entity_hash + * @param String entity_name + * @param {Object|facet.facet|string|Function} arg1 + * @param {Object|facet.facet|string|Function} arg2 + * @param {Object|facet.facet|string|Function} arg3 + */ + get_entity_hash: function(entity_name, arg1, arg2, arg3) { + var path = this.get_entity_path(entity_name, arg1, arg2, arg3); + return path ? routing.get_hash(path): ''; }, /** diff --git a/install/ui/src/freeipa/navigation/routing.js b/install/ui/src/freeipa/navigation/routing.js index 89a323dd5..8cef39b8c 100644 --- a/install/ui/src/freeipa/navigation/routing.js +++ b/install/ui/src/freeipa/navigation/routing.js @@ -158,6 +158,19 @@ var routing = { return nav.navigate.apply(nav, path); }, + /** + * Return URL hash for a specific path + * + * @param {Array} path, e.g. ['entity', 'user', 'search'] + * @return {String} + */ + get_hash: function(path) { + path = path.slice(0); + var nav_name = path.shift(); + var nav = this.get_navigator(nav_name); + return nav.get_hash.apply(nav, path); + }, + /** * Navigate to specific facet with give options * @param {facets.Facet} facet @@ -428,12 +441,23 @@ routing.Navigator = declare([], { var facet = reg.facet.get(facet_name); if (!facet) { - routing.router._error('Unknown facet', 'navigation', { facet: facet_name}); + routing.router._error( + 'Unknown facet', 'navigation', { facet: facet_name} + ); return false; } if (!args) args = facet.get_state(); return routing.navigate_to_facet(facet, args); + }, + + get_hash: function(facet_name, args) { + var facet = reg.facet.get(facet_name); + + if (!facet) return ''; + if (!args) args = facet.get_state(); + + return routing.create_hash(facet, args); } }); @@ -449,20 +473,31 @@ routing.EntityNavigator = declare([routing.Navigator], { name: 'entity', - navigate: function(entity_name, facet_name, pkeys, args) { - + _get_facet: function(entity_name, facet_name) { var entity = reg.entity.get(entity_name); if (!entity) { - routing.router._error('Unknown entity', 'navigation', { entity: entity_name}); - return false; + routing.router._error( + 'Unknown entity', 'navigation', { entity: entity_name } + ); + return null; } var facet = entity.get_facet(facet_name); if (!facet) { - routing.router._error('Unknown facet', 'navigation', { facet: facet_name}); - return false; + routing.router._error( + 'Unknown facet', 'navigation', { facet: facet_name} + ); + return null; } + return facet; + }, + + navigate: function(entity_name, facet_name, pkeys, args) { + var facet = this._get_facet(entity_name, facet_name); + + if (!facet) return false; + // Use current state if none supplied if (!pkeys && !args) { args = facet.get_state(); @@ -473,6 +508,21 @@ routing.EntityNavigator = declare([routing.Navigator], { args.pkeys = facet.get_pkeys(pkeys); return routing.navigate_to_facet(facet, args); + }, + + get_hash: function(entity_name, facet_name, pkeys, args) { + var facet = this._get_facet(entity_name, facet_name); + + if (!facet) return ''; + + // Use current state if none supplied + if (!pkeys && !args) args = facet.get_state(); + args = args || {}; + + // Facets may be nested and require more pkeys than supplied. + args.pkeys = facet.get_pkeys(pkeys); + + return routing.create_hash(facet, args); } }); diff --git a/install/ui/src/freeipa/topology.js b/install/ui/src/freeipa/topology.js index 01a30d09c..bf2c82e46 100644 --- a/install/ui/src/freeipa/topology.js +++ b/install/ui/src/freeipa/topology.js @@ -666,11 +666,10 @@ topology.serverroles_nested_search_facet = function(spec) { return { 'role_servrole': that.get_pkey() }; }; - that.on_column_link_click = function(value, entity) { - var pkeys = [value]; - - navigation.show_entity('server', that.details_facet_name, pkeys); - return false; + that.get_column_entity_path = function(value, entity) { + return navigation.get_entity_path( + 'server', that.details_facet_name, [value] + ); }; that.filter_records = function(records_map, pkey, record) { diff --git a/install/ui/src/freeipa/widget.js b/install/ui/src/freeipa/widget.js index 194870593..ec2d10503 100644 --- a/install/ui/src/freeipa/widget.js +++ b/install/ui/src/freeipa/widget.js @@ -39,6 +39,7 @@ define(['dojo/_base/array', './jquery', './metadata', './navigation', + './navigation/routing', './phases', './reg', './rpc', @@ -48,7 +49,8 @@ define(['dojo/_base/array', ], function(array, lang, construct, Evented, has, keys, on, string, topic, builder, config, datetime, entity_mod, IPA, $, - metadata, navigation, phases, reg, rpc, text, util, exp) { + metadata, navigation, routing, phases, reg, rpc, text, + util, exp) { /** * Widget module @@ -3529,7 +3531,7 @@ IPA.column = function (spec) { var c; if (that.link && !suppress_link) { c = $('', { - href: '#'+value, + href: '#' + routing.get_hash(that.get_entity_path(value)), click: function() { return that.link_handler(value); } @@ -3555,10 +3557,22 @@ IPA.column = function (spec) { // very simple implementation which doesn't handle navigation to // nested entities - navigation.show_entity(that.target_entity, that.target_facet, [value]); + var entity_path = that.get_entity_path(value); + routing.navigate(entity_path); return false; }; + /** + * Returns path to an entity details page + * + * @param {String} value - column value + * @return {Array} path to given entity + */ + that.get_entity_path = function(value) { + return navigation.get_entity_path( + that.target_entity, that.target_facet, [value] + ); + }; /*column initialization*/ if (that.entity && !that.label) { diff --git a/install/ui/src/freeipa/widgets/APIBrowserWidget.js b/install/ui/src/freeipa/widgets/APIBrowserWidget.js index ff1c8ee3f..85a654e33 100644 --- a/install/ui/src/freeipa/widgets/APIBrowserWidget.js +++ b/install/ui/src/freeipa/widgets/APIBrowserWidget.js @@ -74,7 +74,7 @@ widgets.APIBrowserWidget = declare([Stateful, Evented], { 'param': '@mo-param:' }, - _to_list: function(objects) { + _to_list: function(objects, type) { var names = []; for (name in objects) { if (objects.hasOwnProperty(name)) { @@ -86,6 +86,7 @@ widgets.APIBrowserWidget = declare([Stateful, Evented], { var o; for (var i=0,l=names.length; i