From 632639b62ddad72e31daa62ef21f992299ec0b8e Mon Sep 17 00:00:00 2001 From: Adam Young Date: Mon, 15 Nov 2010 16:41:21 -0500 Subject: action select if exactly one entity is selected, it enables the entity-facet links in the action panel, and sets the pkey in bbq to the pkey of the selected --- install/static/entity.js | 73 ++++++++++++++++++++++++------------- install/static/index.html | 57 +++++++++++++++++++++++++++++ install/static/ipa.css | 21 ++++++++++- install/static/ipa.js | 14 +++++++ install/static/search.js | 24 ++++++++++++ install/static/test/entity_tests.js | 46 +++++++++++++++++------ install/static/widget.js | 12 ++++++ 7 files changed, 208 insertions(+), 39 deletions(-) create mode 100644 install/static/index.html (limited to 'install/static') diff --git a/install/static/entity.js b/install/static/entity.js index 74a07d009..e68ed3f2a 100644 --- a/install/static/entity.js +++ b/install/static/entity.js @@ -26,6 +26,7 @@ function ipa_facet(spec) { spec = spec || {}; var that = {}; + that.display_class = spec.display_class || 'entity-facet'; that.name = spec.name; that.label = spec.label; that._entity_name = spec.entity_name; @@ -290,11 +291,16 @@ function ipa_details_only_setup(container){ ipa_entity_setup.call(this, container, 'details'); } +function ipa_current_facet(entity){ + return $.bbq.getState(entity.name + '-facet', true) || entity.default_facet || 'search'; +} + function ipa_entity_setup(container) { var entity = this; - var facet_name = $.bbq.getState(entity.name + '-facet', true) || entity.default_facet || 'search'; + var facet_name = ipa_current_facet(entity); + var facet = entity.get_facet(facet_name); if (!facet) return; @@ -321,54 +327,69 @@ function ipa_entity_setup(container) { function action_panel(entity_name){ + + function build_link(other_facet,label,other_entity){ + var li = $('
  • ', { + "class" : other_facet.display_class, + title: other_entity, + text: label, + click: function(entity_name, other_facet_name) { + return function() { + if($(this).hasClass('entity-facet-disabled')){ + return false; + } + var this_pkey = $('.action-panel input[id=pkey]').val(); + IPA.switch_and_show_page( + entity_name, other_facet_name, + this_pkey, other_entity); + + return false; + }; + }(entity_name, other_facet_name) + }); + return li; + } + var div = $('
    ', { "class":"action-panel", html: $('

    Actions

    ') }); + + /*Note, for debugging purposes, it is useful to set var pkey_type = 'text';*/ + var pkey_type = 'hidden'; + $('', + {'type': pkey_type, + id:'pkey', + name:'pkey'}).appendTo(div); + var ul = $('
      ', {'class': 'action'}).appendTo(div); var entity = IPA.get_entity(entity_name); + var facet_name = ipa_current_facet(entity); for (var i=0; i', { - title: other_facet.name, - text: label, - click: function(entity_name, facet_name) { - return function() { - IPA.show_page(entity_name, facet_name); - }; - }(entity_name, facet_name) - })); - + ul.append(build_link(other_facet,other_facet.label)); } else { // For now empty label indicates an association facet - var attribute_members = IPA.metadata[entity_name].attribute_members; for (var attribute_member in attribute_members) { var other_entities = attribute_members[attribute_member]; for (var j = 0; j < other_entities.length; j++) { var other_entity = other_entities[j]; var label = IPA.metadata[other_entity].label; - - ul.append($('
    • ', { - title: other_entity, - text: label, - click: function(entity_name, facet_name, other_entity) { - return function() { - IPA.show_page(entity_name, facet_name, other_entity); - }; - }(entity_name, facet_name, other_entity) - })); + ul.append(build_link(other_facet,label,other_entity)); } } } } + /*When we land on the search page, disable all facets + that require a pkey until one is selected*/ + if (facet_name === 'search'){ + $('.entity-facet', div).addClass('entity-facet-disabled'); + } return div; } diff --git a/install/static/index.html b/install/static/index.html new file mode 100644 index 000000000..73a84caa7 --- /dev/null +++ b/install/static/index.html @@ -0,0 +1,57 @@ + + + + + IPA: Identity Policy Audit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/install/static/ipa.css b/install/static/ipa.css index 3843424fd..58428ebe4 100644 --- a/install/static/ipa.css +++ b/install/static/ipa.css @@ -289,7 +289,6 @@ span.main-separator{ .action-panel { position:relative; - left: -1.2em; border-width: thin; border-style: solid; @@ -313,6 +312,26 @@ span.main-separator{ padding: 0.2em; } +.action-panel li.search-facet { + color: black; + text-decoration: underline; + cursor: pointer; +} + +.action-panel li.entity-facet { + color: black; + text-decoration: underline; + cursor: pointer; +} + +.action-panel li.entity-facet-disabled { + color: gray; + cursor: default; + text-decoration: none; +} + + + .client { margin-top: 0.4em; float: left; diff --git a/install/static/ipa.js b/install/static/ipa.js index 4a01d9fb8..6ba8b67ec 100644 --- a/install/static/ipa.js +++ b/install/static/ipa.js @@ -101,6 +101,7 @@ var IPA = ( function () { that.entities_by_name[entity.name] = entity; }; + that.show_page = function (entity_name, facet_name, other_entity) { var state = {}; @@ -109,6 +110,19 @@ var IPA = ( function () { $.bbq.pushState(state); }; + that.switch_and_show_page = function ( + this_entity, facet_name, pkey, other_entity) { + if (!pkey){ + that.show_page(this_entity, facet_name, other_entity); + return; + } + var state = {}; + state[this_entity+'-pkey'] = pkey; + state[this_entity + '-facet'] = facet_name; + state[this_entity + '-enroll'] = other_entity ? other_entity : ''; + $.bbq.pushState(state); + }; + return that; }()); diff --git a/install/static/search.js b/install/static/search.js index 040508734..a107209b1 100644 --- a/install/static/search.js +++ b/install/static/search.js @@ -100,6 +100,28 @@ function ipa_search_widget(spec) { return false; }; + that.select_changed = function(){ + var count = 0; + var pkey; + $('input[name=select]:checked', that.tbody).each(function(input){ + count += 1; + pkey = $(this).val(); + }); + if(count == 1){ + $('.action-panel li.entity-facet'). + removeClass('entity-facet-disabled'); + var state = {}; + $('.action-panel input[id=pkey]').val(pkey); + }else{ + $('.action-panel li.entity-facet'). + addClass('entity-facet-disabled'); + $('.action-panel input').val(null); + + } + return false; + } + + that.remove = function(container) { var values = that.get_selected_values(); @@ -199,6 +221,8 @@ function ipa_search_facet(spec) { spec = spec || {}; + spec.display_class = 'search-facet'; + var that = ipa_facet(spec); that.init = spec.init || init; diff --git a/install/static/test/entity_tests.js b/install/static/test/entity_tests.js index 970f9a89b..c431031de 100644 --- a/install/static/test/entity_tests.js +++ b/install/static/test/entity_tests.js @@ -63,7 +63,7 @@ test('Testing ipa_entity_set_search_definition().', function() { test('Testing ipa_facet_setup_views().', function() { - var orig_show_page = IPA.show_page; + var orig_switch_and_show_page = IPA.switch_and_show_page; IPA.ajax_options.async = false; IPA.init( @@ -83,6 +83,12 @@ test('Testing ipa_facet_setup_views().', function() { IPA.add_entity(entity); + entity.add_facet(ipa_search_facet({ + 'name': 'search', + 'label': 'Search' + })); + + var facet = ipa_association_facet({ 'name': 'associate' }); @@ -91,7 +97,7 @@ test('Testing ipa_facet_setup_views().', function() { var container = $('
      '); var counter = 0; - IPA.show_page = function(entity_name, facet_name, other_entity) { + IPA.switch_and_show_page = function(entity_name, facet_name, other_entity) { counter++; }; @@ -102,33 +108,49 @@ test('Testing ipa_facet_setup_views().', function() { var views = list.children(); equals( - views.length, 4, + views.length, 5, 'Checking number of views' ); facet = views.first(); + ok( facet.hasClass('entity-search', + 'Checking the search facet' + ); + + facet = facet.next(); + var attribute_members = IPA.metadata['user'].attribute_members; for (attribute_member in attribute_members) { var objects = attribute_members[attribute_member]; for (var i = 0; i < objects.length; i++) { var object = objects[i]; - equals( facet.attr('title'), object, 'Checking the '+object+' facet' ); - - facet.click(); - facet = facet.next(); } } - equals( - counter, 4, - 'Checking callback invocations' - ); + var action_panel = $('.action-panel', container); + ok(action_panel.length, 'action panel exists'); + var pkey_input = $('input[name=pkey]', action_panel); + ok(pkey_input.length,'pkey input exists'); + var search_facets = $('li.search-facet', action_panel); + equals(search_facets.length,1,'one search facet in action panel'); + var entity_facets = $('li.entity-facet', action_panel); + equals(entity_facets.length,4,'4 entity facets in action panel'); - IPA.show_page = orig_show_page; + + for ( var entity_facet = entity_facets.first(); + entity_facet.length; + entity_facet = entity_facet.next()){ + entity_facet.click(); + } + +// equals(4, counter,'four clicks'); + + IPA.switch_and_show_page = orig_switch_and_show_page; }); + diff --git a/install/static/widget.js b/install/static/widget.js index 84b1d9aeb..1b99831e9 100755 --- a/install/static/widget.js +++ b/install/static/widget.js @@ -544,6 +544,11 @@ function ipa_table_widget(spec) { }).appendTo(td); }; + + that.select_changed = function(){ + } + + that.setup = function(container) { that.widget_setup(container); @@ -563,6 +568,8 @@ function ipa_table_widget(spec) { for (var i=0; i