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
This commit is contained in:
Adam Young 2010-11-15 16:41:21 -05:00 committed by Endi Sukma Dewata
parent 7abd8c6ecb
commit 632639b62d
7 changed files with 208 additions and 39 deletions

View File

@ -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 = $('<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 = $('<div/>', {
"class":"action-panel",
html: $('<h3>Actions</h3>')
});
/*Note, for debugging purposes, it is useful to set var pkey_type = 'text';*/
var pkey_type = 'hidden';
$('<input/>',
{'type': pkey_type,
id:'pkey',
name:'pkey'}).appendTo(div);
var ul = $('<ul/>', {'class': 'action'}).appendTo(div);
var entity = IPA.get_entity(entity_name);
var facet_name = ipa_current_facet(entity);
for (var i=0; i<entity.facets.length; i++) {
var other_facet = entity.facets[i];
var facet_name = other_facet.name;
var other_facet_name = other_facet.name;
if (other_facet.label) {
var label = other_facet.label;
ul.append($('<li/>', {
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($('<li/>', {
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;
}

57
install/static/index.html Normal file
View File

@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>IPA: Identity Policy Audit</title>
<script type="text/javascript" src="json2.js"></script>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.cookie.js"></script>
<script type="text/javascript" src="jquery-ui.js"></script>
<script type="text/javascript" src="jquery.ba-bbq.js"></script>
<script type="text/javascript" src="ipa.js"></script>
<script type="text/javascript" src="widget.js"></script>
<script type="text/javascript" src="search.js"></script>
<script type="text/javascript" src="details.js"></script>
<script type="text/javascript" src="add.js"></script>
<script type="text/javascript" src="associate.js"></script>
<script type="text/javascript" src="entity.js"></script>
<script type="text/javascript" src="navigation.js"></script>
<script type="text/javascript" src="certificate.js"></script>
<script type="text/javascript" src="user.js"></script>
<script type="text/javascript" src="group.js"></script>
<script type="text/javascript" src="hbac.js"></script>
<script type="text/javascript" src="hbacsvc.js"></script>
<script type="text/javascript" src="hbacsvcgroup.js"></script>
<script type="text/javascript" src="host.js"></script>
<script type="text/javascript" src="hostgroup.js"></script>
<script type="text/javascript" src="netgroup.js"></script>
<script type="text/javascript" src="service.js"></script>
<script type="text/javascript" src="serverconfig.js"></script>
<script type="text/javascript" src="policy.js"></script>
<script type="text/javascript" src="develop.js"></script>
<script type="text/javascript" src="webui.js"></script>
<link rel="stylesheet" type="text/css" href="jquery-ui.css" />
<link rel="stylesheet" type="text/css" href="ipa.css" />
</head>
<body>
<div class="header" >
<span class="header-logo">
<a href="#"><img src="ipalogo.png" /></a>
</span>
<span id="loggedinas" class="header-loggedinas">
<a href="#"><span id="login_header">Logged in as</span>: <strong>user@FREEIP.ORG</strong></a>
</span>
</div>
<div id="navigation" class="tabs"></div>
</body>
</html>

View File

@ -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;

View File

@ -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;
}());

View File

@ -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;

View File

@ -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 = $('<div/>');
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;
});

View File

@ -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<checkboxes.length; i++) {
checkboxes[i].checked = checked;
}
that.select_changed();
return false;
});
that.row = that.tbody.children().first();
@ -627,6 +634,11 @@ function ipa_table_widget(spec) {
if (column.primary_key) {
// set checkbox value
$('input[name="select"]', tr).val(value);
$('input[name="select"]', tr).click(function(){
that.select_changed();
});
}
column.setup(tr, name, value, record);