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