diff options
-rw-r--r-- | install/ui/association.js | 21 | ||||
-rw-r--r-- | install/ui/entity.js | 3 | ||||
-rw-r--r-- | install/ui/navigation.js | 140 |
3 files changed, 105 insertions, 59 deletions
diff --git a/install/ui/association.js b/install/ui/association.js index 5354117d0..9f315a0e1 100644 --- a/install/ui/association.js +++ b/install/ui/association.js @@ -762,13 +762,17 @@ IPA.association_facet = function (spec) { that.table.prev_page = function() { if (that.table.current_page > 1) { - IPA.nav.push_state({ page: that.table.current_page-1 }); + var state = {}; + state[that.entity_name+'-page'] = that.table.current_page - 1; + IPA.nav.push_state(state); } }; that.table.next_page = function() { if (that.table.current_page < that.table.total_pages) { - IPA.nav.push_state({ page: that.table.current_page+1 }); + var state = {}; + state[that.entity_name+'-page'] = that.table.current_page + 1; + IPA.nav.push_state(state); } }; @@ -778,16 +782,21 @@ IPA.association_facet = function (spec) { } else if (page > that.total_pages) { page = that.total_pages; } - IPA.nav.push_state({ page: page }); + var state = {}; + state[that.entity_name+'-page'] = page; + IPA.nav.push_state(state); }; that.table.refresh = function() { - var page = parseInt(IPA.nav.get_state('page'), 10) || 1; + var state = {}; + var page = parseInt(IPA.nav.get_state(that.entity_name+'-page'), 10) || 1; if (page < 1) { - IPA.nav.push_state({ page: 1 }); + state[that.entity_name+'-page'] = 1; + IPA.nav.push_state(state); return; } else if (page > that.table.total_pages) { - IPA.nav.push_state({ page: that.table.total_pages }); + state[that.entity_name+'-page'] = that.table.total_pages; + IPA.nav.push_state(state); return; } that.table.current_page = page; diff --git a/install/ui/entity.js b/install/ui/entity.js index 83687fe7e..a2386b816 100644 --- a/install/ui/entity.js +++ b/install/ui/entity.js @@ -48,6 +48,8 @@ IPA.facet = function (spec) { // facet group name that.facet_group = spec.facet_group; + that.state = {}; + that.__defineGetter__('entity_name', function() { return that._entity_name; }); @@ -467,6 +469,7 @@ IPA.entity = function (spec) { that.redirect_facet = spec.redirect_facet; that.containing_entity = null; + that.get_dialog = function(name) { return that.dialogs.get(name); }; diff --git a/install/ui/navigation.js b/install/ui/navigation.js index 2f39d8b31..605a36125 100644 --- a/install/ui/navigation.js +++ b/install/ui/navigation.js @@ -39,6 +39,8 @@ IPA.navigation = function(spec) { that.tabs = []; that.tabs_by_name = {}; + that.path = {}; + that.set_tabs = function(tabs) { that.tabs = tabs; that.tabs_by_name = {}; @@ -96,16 +98,30 @@ IPA.navigation = function(spec) { return path_state; }; - var state = $.bbq.getState(); - that.push_state = function(params) { - if (IPA.current_entity) { - var facet = IPA.current_entity.get_facet(); + var param_path = {}; + var param_state = {}; + + for (var key in params) { + var value = params[key]; + if (key.indexOf('-') < 0) { + param_path[key] = value; + } else { + param_state[key] = value; + } + } + + var state = {}; + + var prev_entity = IPA.current_entity; + var prev_facet = prev_entity ? prev_entity.facet : null; - if (facet.is_dirty()) { + if (prev_facet) { + + if (prev_facet.is_dirty()) { var dialog = IPA.dirty_dialog({ - facet: facet + facet: prev_facet }); dialog.callback = function() { @@ -117,57 +133,68 @@ IPA.navigation = function(spec) { return false; } - } - for ( var param in params){ - state[param] = params[param]; + // get prev facet state + $.extend(state, prev_facet.state); } - var url_state ={}; - var key = that.root; - while(state[key]){ - var value = state[key]; - url_state[key] = value; - key = value; + // merge existing path with new path + $.extend(that.path, param_path); + + // find the tab pointed by the path + var tab = that.get_current_tab(that.path); + + // find the active tab at the lowest level + while (!tab.entity) { + var index = tab.container.tabs('option', 'selected'); + tab = tab.children[index]; } - /*We are at the leaf node, which is the sleected entity.*/ - var entity = value; - for (var key2 in state){ - if ((key2 === entity) || (key2.search('^'+entity +'-') > -1)){ - url_state[key2] = state[key2]; - } + var facet_name; + if (tab.entity == prev_entity) { + // merge prev facet state with new state to find new facet name + $.extend(state, param_state); + facet_name = state[tab.entity.name+'-facet']; + + } else { + // find new facet name in the new state + facet_name = param_state[tab.entity.name+'-facet']; } - /* - Trace back up the nested entities for their pkeys as well - */ - var current_entity = IPA.get_entity(entity); - while(current_entity !== null){ - var key_names = current_entity.get_key_names(); - for (var j = 0; j < key_names.length; j+= 1){ - var key_name = key_names[j]; - if (state[key_name]){ - url_state[key_name] = state[key_name]; - } + var facet = tab.entity.get_facet(facet_name); + + // update new facet state with new state + $.extend(facet.state, param_state); + + var entity = tab.entity.containing_entity; + while (entity) { + var facet2 = entity.get_facet(); + + var key_names = entity.get_key_names(); + for (var i=0; i<key_names.length; i++) { + var key_name = key_names[i]; + var key_value = param_state[key_name]; + if (!key_value) key_value = facet2.state[key_name]; + if (key_value) facet.state[key_name] = key_value; } - current_entity = current_entity.containing_entity; + + entity = entity.containing_entity; } - $.bbq.pushState(url_state,2); + // push entity path and facet state + state = {}; + $.extend(state, that.get_path_state(tab.entity.name)); + $.extend(state, facet.state); + $.bbq.pushState(state, 2); + return true; }; that.get_state = function(key) { - var url_state = $.bbq.getState(key); - if (!url_state){ - url_state = state[key]; - } - return url_state; + return $.bbq.getState(key); }; that.remove_state = function(key) { - delete state[key]; $.bbq.removeState(key); }; @@ -201,7 +228,7 @@ IPA.navigation = function(spec) { } } - that.push_state(state); + return that.push_state(state); }; @@ -219,7 +246,7 @@ IPA.navigation = function(spec) { var panel = $(ui.panel); var name = panel.attr('name'); - var state = $.bbq.getState(); + var state = that.get_state(); var tab = that.get_current_tab(state); if (tab && tab.name == name) { // hash change @@ -234,6 +261,9 @@ IPA.navigation = function(spec) { that._create = function(tabs, container, depth) { + var parent_name = container.attr('name'); + that.path[parent_name] = tabs[0].name; + container.addClass(that.tab_class); container.addClass('tabs'+depth); @@ -242,6 +272,8 @@ IPA.navigation = function(spec) { for (var i=0; i<tabs.length; i++) { var tab = tabs[i]; + tab.container = container; + var tab_id = that.root+'-'+tab.name; if (tab.entity) { @@ -258,34 +290,34 @@ IPA.navigation = function(spec) { } } - var tab_li =$('<li/>').append($('<a/>', { + var tab_li = $('<li/>').append($('<a/>', { href: '#'+tab_id, title: tab.label, html: tab.label })); - if (tab.hidden){ - tab_li.css('display','none'); + if (tab.hidden) { + tab_li.css('display', 'none'); } - tab.container = $('<div/>', { + tab.children_container = $('<div/>', { id: tab_id, name: tab.name }); if (tab.children && tab.children.length) { var kids = - that._create(tab.children, tab.container, depth+1); + that._create(tab.children, tab.children_container, depth+1); /*If there are no child tabs, remove the container */ - if (kids === 0){ - tabs.splice(i,1); + if (kids === 0) { + tabs.splice(i, 1); i -= 1; continue; } } created_count += 1; tab_li.appendTo(ul); - tab.container.appendTo(container); + tab.children_container.appendTo(container); } return created_count; }; @@ -305,6 +337,8 @@ IPA.navigation = function(spec) { var parent_name = container.attr('name'); var tab_name = that.get_state(parent_name); + if (!tab_name) tab_name = that.path[parent_name]; + that.path[parent_name] = tab_name; var index = 0; while (index < tabs.length && tabs[index].name != tab_name) index++; @@ -313,13 +347,13 @@ IPA.navigation = function(spec) { container.tabs('select', index); var tab = tabs[index]; - if (tab.hidden){ - depth = depth -1; + if (tab.hidden) { + depth--; } if (tab.children && tab.children.length) { var next_depth = depth + 1; - that._update(tab.children, tab.container, next_depth); + that._update(tab.children, tab.children_container, next_depth); } else if (tab.entity) { |