summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--install/static/Makefile.am1
-rw-r--r--install/static/add.js143
-rw-r--r--install/static/associate.js201
-rw-r--r--install/static/details.js290
-rw-r--r--install/static/develop.js4
-rw-r--r--install/static/entity.js461
-rwxr-xr-xinstall/static/hbac.js214
-rw-r--r--install/static/hostgroup.js3
-rw-r--r--install/static/index.xhtml1
-rw-r--r--install/static/ipa.js132
-rw-r--r--install/static/navigation.js23
-rw-r--r--install/static/netgroup.js2
-rw-r--r--install/static/policy.js112
-rw-r--r--install/static/search.js205
-rw-r--r--install/static/serverconfig.js3
-rw-r--r--install/static/service.js123
-rw-r--r--install/static/test/details_tests.js19
-rw-r--r--install/static/test/entity_tests.html2
-rw-r--r--install/static/test/entity_tests.js160
-rw-r--r--install/static/test/ipa_tests.js16
-rw-r--r--install/static/test/navigation_tests.js2
-rw-r--r--install/static/user.js4
-rw-r--r--install/static/webui.js46
23 files changed, 1409 insertions, 758 deletions
diff --git a/install/static/Makefile.am b/install/static/Makefile.am
index ef16a2e99..7097a1f6a 100644
--- a/install/static/Makefile.am
+++ b/install/static/Makefile.am
@@ -18,6 +18,7 @@ app_DATA = \
jquery-ui.css \
certificate.js \
group.js \
+ hbac.js \
host.js \
hostgroup.js \
index.xhtml \
diff --git a/install/static/add.js b/install/static/add.js
index 71d08338e..b5f9c16d4 100644
--- a/install/static/add.js
+++ b/install/static/add.js
@@ -1,5 +1,6 @@
/* Authors:
* Pavel Zuna <pzuna@redhat.com>
+ * Endi Sukma Dewata <edewata@redhat.com>
*
* Copyright (C) 2010 Red Hat
* see file 'COPYING' for use and warranty information
@@ -23,40 +24,108 @@
var IPA_ADD_POPULATE = 1;
var IPA_ADD_UPDATE = 2;
-function add_dialog_create(obj_name, adl)
-{
- var add_dialog = $('<div></div>');
+function ipa_add_field(spec) {
- function add(evt, called_from_add_and_edit) {
+ spec = spec || {};
+
+ var that = {};
+ that.name = spec.name;
+ that.label = spec.label;
+
+ that.init = spec.init;
+ that.setup = spec.setup;
+
+ return that;
+}
+
+function ipa_add_dialog(spec) {
+
+ spec = spec || {};
+
+ var that = {};
+ that.name = spec.name;
+ that.title = spec.title;
+ that.entity_name = spec.entity_name;
+
+ that.init = spec.init;
+
+ that.fields = [];
+ that.fields_by_name = {};
+
+ var dialog = $('<div/>');
+
+ that.get_fields = function() {
+ return that.fields;
+ };
+
+ that.get_field = function(name) {
+ return that.fields_by_name[name];
+ };
+
+ that.add_field = function(field) {
+ that.fields.push(field);
+ that.fields_by_name[field.name] = field;
+ };
+
+ that.create_field = function(spec) {
+ var field = ipa_add_field(spec);
+ that.add_field(field);
+ return field;
+ };
+
+ that.open = function() {
+ dialog.empty();
+ dialog.attr('id', that.name);
+ dialog.attr('title', that.title);
+
+ for (var i = 0; i < that.fields.length; ++i) {
+ var field = that.fields[i];
+ if (field.setup) {
+ field.setup(dialog, IPA_ADD_POPULATE);
+ } else {
+ dialog.append('<label>' + field.label + '</label>');
+ dialog.append('<input type="text" name="' + field.name + '" />');
+ }
+ }
+
+ dialog.dialog({
+ modal: true,
+ buttons: {
+ 'Add': that.add,
+ 'Add and edit': that.add_and_edit,
+ 'Cancel': that.cancel
+ }
+ });
+ };
+
+ that.add = function(evt, called_from_add_and_edit) {
var pkey = [];
var options = {};
- var pkey_name = ipa_objs[obj_name].primary_key;
+ var pkey_name = IPA.metadata[that.entity_name].primary_key;
function add_win(data, text_status, xhr) {
if (called_from_add_and_edit) {
var state = {};
- state[obj_name + '-facet'] = 'details';
- state[obj_name + '-pkey'] = pkey[0];
+ state[that.entity_name + '-facet'] = 'details';
+ state[that.entity_name + '-pkey'] = pkey[0];
$.bbq.pushState(state);
}
- };
-
- var fields = adl[2];
- for (var i = 0; i < fields.length; ++i) {
- var f = fields[i];
- var attr = f[0];
- if (typeof f[2] == 'function') {
- var value = f[2](add_dialog, IPA_ADD_UPDATE);
+ }
+
+ for (var i = 0; i < that.fields.length; ++i) {
+ var field = that.fields[i];
+ if (field.setup) {
+ var value = field.setup(dialog, IPA_ADD_UPDATE);
if (value != null) {
- if (attr == pkey_name)
+ if (field.name == pkey_name)
pkey = [value];
else
- options[attr] = value;
+ options[field.name] = value;
}
}
}
- add_dialog.find('input').each(function () {
+ dialog.find('input').each(function () {
var jobj = $(this);
var attr = jobj.attr('name');
var value = jobj.val();
@@ -68,40 +137,20 @@ function add_dialog_create(obj_name, adl)
}
});
- ipa_cmd('add', pkey, options, add_win, null, obj_name);
- add_dialog.dialog('close');
+ ipa_cmd('add', pkey, options, add_win, null, that.entity_name);
};
- function add_and_edit(evt) {
- add(evt, true);
- add_dialog.dialog('close');
+ that.add_and_edit = function(evt) {
+ that.add(evt, true);
+ dialog.dialog('close');
};
- function cancel() {
- add_dialog.dialog('close');
+ that.cancel = function() {
+ dialog.dialog('close');
};
- add_dialog.attr('id', adl[0]);
- add_dialog.attr('title', adl[1]);
-
- var fields = adl[2];
- for (var i = 0; i < fields.length; ++i) {
- var f = fields[i];
- if (typeof f[2] == 'function') {
- f[2](add_dialog, IPA_ADD_POPULATE);
- } else {
- add_dialog.append('<label>' + f[1] + '</label>');
- add_dialog.append('<input type="text" name="' + f[0] + '" />');
- }
- }
-
- add_dialog.dialog({
- modal: true,
- buttons: {
- 'Add': add,
- 'Add and edit': add_and_edit,
- 'Cancel': cancel
- }
- });
+ if (that.init) that.init();
+
+ return that;
}
diff --git a/install/static/associate.js b/install/static/associate.js
index be189963f..a99fd907b 100644
--- a/install/static/associate.js
+++ b/install/static/associate.js
@@ -44,13 +44,13 @@ function SerialAssociator(form, manyObjPkeys, on_success)
ipa_cmd( form.method,args, options ,
function(data, text_status, xhr) {
if (data.error){
- alert("error adding member: "+data.error.message);
+ alert('error adding member: '+data.error.message);
}else{
associator.associateNext();
}
},
function(xhr, text_status, error_thrown) {
- alert("associateFailure");
+ alert('associateFailure');
},
form.manyObj );
}else{
@@ -74,11 +74,11 @@ function BulkAssociator(form, manyObjPkeys, on_success)
var form = this.form;
var option = manyObjPkeys.shift();
while(manyObjPkeys.length > 0) {
- option += "," + manyObjPkeys.shift();
+ option += ',' + manyObjPkeys.shift();
}
var options = {
- "all":true
+ 'all':true
};
options[form.manyObj] = option;
@@ -87,13 +87,13 @@ function BulkAssociator(form, manyObjPkeys, on_success)
ipa_cmd( form.method,args, options ,
function(data, text_status, xhr) {
if (data.error){
- alert("error adding member: "+data.error.message);
+ alert('error adding member: '+data.error.message);
}else{
associator.on_success();
}
},
function(xhr, text_status, error_thrown) {
- alert("associateFailure");
+ alert('associateFailure');
},
form.oneObj );
}
@@ -127,7 +127,7 @@ function AssociationForm(oneObj, pkey, manyObj, on_success, associatorConstructo
this.associatorConstructor = BulkAssociator;
this.setup = function() {
- var label = ipa_objs[form.manyObj].label;
+ var label = IPA.metadata[form.manyObj].label;
form.dialog.attr('title', 'Enroll '+form.oneObj+' '+form.pkey+' in '+label);
@@ -139,20 +139,20 @@ function AssociationForm(oneObj, pkey, manyObj, on_success, associatorConstructo
var enrollments = $('#enrollments', form.dialog);
enrollments.html('');
- $("#addToList", form.dialog).click(function(){
+ $('#addToList', form.dialog).click(function(){
$('#availableList :selected', form.dialog).each(function(i, selected){
enrollments.append(selected);
});
$('#availableList :selected', form.dialog).remove();
});
- $("#removeFromList", form.dialog).click(function(){
+ $('#removeFromList', form.dialog).click(function(){
$('#enrollments :selected', form.dialog).each(function(i, selected){
availableList.append(selected);
});
$('#enrollments :selected', form.dialog).remove();
});
- $("#find", form.dialog).click(function(){
+ $('#find', form.dialog).click(function(){
form.search();
});
@@ -170,29 +170,29 @@ function AssociationForm(oneObj, pkey, manyObj, on_success, associatorConstructo
this.close = function() {
form.dialog.dialog('close');
- }
+ };
this.search = function() {
function search_on_win(data, text_status, xhr) {
var results = data.result;
- var list = $("#availableList", form.dialog);
- list.html("");
+ var list = $('#availableList', form.dialog);
+ list.html('');
- var searchColumn = ipa_objs[form.manyObj].primary_key;
+ var searchColumn = IPA.metadata[form.manyObj].primary_key;
for (var i =0; i != results.count; i++){
var result = results.result[i];
- $("<option></option>",{
+ $('<option></option>',{
value: result[searchColumn][0],
html: result[searchColumn][0]
}).appendTo(list);
}
- };
+ }
function search_on_fail(xhr, text_status, errow_thrown) {
- alert("associationSearchFailure");
- };
+ alert('associationSearchFailure');
+ }
var queryFilter = $('#associateFilter', form.dialog).val();
ipa_cmd('find', [queryFilter], {}, search_on_win, null, form.manyObj);
@@ -209,32 +209,109 @@ function AssociationForm(oneObj, pkey, manyObj, on_success, associatorConstructo
};
}
-/**
- A modfied version of search. It shows the associations for an object.
-*/
-function AssociationList(obj, pkey, manyObj, associationColumns, jobj, associationConstructor, method)
-{
- var form = this;
+function ipa_association_config(spec) {
+ spec = spec || {};
- this.obj = obj;
- this.pkey = pkey;
- this.associationColumns = associationColumns;
- this.manyObj = manyObj;
- this.container = jobj;
- this.associationConstructor = associationConstructor;
- this.method = method;
+ var that = {};
+
+ that.name = spec.name;
+ that.associator = spec.associator;
+ that.method = spec.method;
+
+ return that;
+}
+
+function ipa_association_facet(spec) {
+
+ spec = spec || {};
+
+ var that = ipa_facet(spec);
+
+ that.configs = [];
+ that.configs_by_name = {};
+
+ that.other_entity = null;
+
+ that.get_configs = function() {
+ return that.configs;
+ };
+
+ that.get_config = function(name) {
+ return that.configs_by_name[name];
+ };
+
+ that.add_config = function(config) {
+ that.configs.push(config);
+ that.configs_by_name[config.name] = config;
+ };
+
+ that.create_config = function(spec) {
+ var config = ipa_association_config(spec);
+ that.add_config(config);
+ return config;
+ };
+
+ that.is_dirty = function() {
+ var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
+ var other_entity = $.bbq.getState(that.entity_name + '-enroll', true) || '';
+ return pkey != that.pkey || other_entity != that.other_entity;
+ };
+
+ that.setup = function(container, unspecified) {
- this.refresh = function() {
+ that.pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
+ that.other_entity = $.bbq.getState(that.entity_name + '-enroll', true) || '';
+
+ that.member_attrribute = ipa_get_member_attribute(that.entity_name, that.other_entity);
+ that.columns = [
+ {
+ 'title': IPA.metadata[that.other_entity].label,
+ 'column': that.member_attrribute + '_' + that.other_entity
+ }
+ ];
+
+ var config = that.get_config(that.other_entity);
+ that.associator = config ? config.associator : null;
+ that.method = config ? config.method : null;
+
+ that.setup_views(container);
+
+ //TODO I18N
+ var header_message = that.other_entity + '(s) enrolled in ' +
+ that.entity_name + ' ' + that.pkey;
+ container.append($('<h2/>',{html: header_message }) );
+ association_list_create(that.entity_name, container);
+ container.find('.search-filter').css('display', 'none');
+ container.find('.search-buttons').html('');
+
+ $('<input/>', {
+ type: 'button',
+ value: 'enroll',
+ click: function() {
+ that.show_enrollment_dialog();
+ }
+ }).appendTo(container.find('.search-buttons'));
+
+ var header = $('<tr></tr>').appendTo(container.find('.search-table thead:last'));
+ for (var i =0 ; i != that.columns.length ;i++){
+ $('<th></th>',{
+ html: that.columns[i].title
+ }).appendTo(header);
+ }
+ that.refresh(container);
+ };
+
+ that.refresh = function(container) {
function refresh_on_success(data, text_status, xhr) {
- var tbody = form.container.find('.search-table tbody');
+ var tbody = container.find('.search-table tbody');
tbody.empty();
- var associationList = data.result.result[form.associationColumns[0].column];
+ var associationList = data.result.result[that.columns[0].column];
for (var j = 0; j < associationList.length; j++){
- var row = $("<tr/>").appendTo(tbody);
- for (var k = 0; k < associationColumns.length ;k++){
- var column = form.associationColumns[k].column;
- $("<td></td>",{
+ var row = $('<tr/>').appendTo(tbody);
+ for (var k = 0; k < that.columns.length ;k++){
+ var column = that.columns[k].column;
+ $('<td></td>',{
html: data.result.result[column][j]
}).appendTo(row);
}
@@ -242,54 +319,32 @@ function AssociationList(obj, pkey, manyObj, associationColumns, jobj, associati
}
function refresh_on_error(xhr, text_status, error_thrown) {
- var search_results = $('.search-results', jobj).empty();
+ var search_results = $('.search-results', container).empty();
search_results.append('<p>Error: '+error_thrown.name+'</p>');
search_results.append('<p>URL: '+this.url+'</p>');
search_results.append('<p>'+error_thrown.message+'</p>');
}
- ipa_cmd('show', [this.pkey], {}, refresh_on_success, refresh_on_error, form.obj);
- }
-
- this.setup = function() {
- //TODO I18N
- var header_message = manyObj + "(s) enrolled in " +
- this.obj + " " + pkey;
- this.container.append($("<h2/>",{html: header_message }) );
- association_list_create(this.obj, this.container);
- this.container.find(".search-filter").css("display", "none");
- this.container.find(".search-buttons").html("");
- $("<input/>", {
- type: 'button',
- value: 'enroll',
- click: function() {
- form.show_enrollment_dialog();
- }
- }).appendTo(this.container.find(".search-buttons"));
- var header = $("<tr></tr>").appendTo(this.container.find('.search-table thead:last'));
- for (var i =0 ; i != associationColumns.length ;i++){
- $("<th></th>",{
- html: associationColumns[i].title
- }).appendTo(header);
- }
- this.refresh();
- }
+ ipa_cmd('show', [that.pkey], {}, refresh_on_success, refresh_on_error, that.entity_name);
+ };
- this.show_enrollment_dialog = function() {
+ that.show_enrollment_dialog = function() {
var enrollment_dialog = new AssociationForm(
- this.obj,
- this.pkey,
- this.manyObj,
+ that.entity_name,
+ that.pkey,
+ that.other_entity,
function() {
- form.refresh();
+ that.refresh();
enrollment_dialog.close();
},
- this.associationConstructor,
- this.method
+ that.associator,
+ that.method
);
enrollment_dialog.setup();
- }
+ };
+
+ return that;
}
diff --git a/install/static/details.js b/install/static/details.js
index d0688f55d..d4593d82e 100644
--- a/install/static/details.js
+++ b/install/static/details.js
@@ -25,134 +25,222 @@
/* REQUIRES: ipa.js */
var ipa_details_cache = {};
-var ipa_entity_details_list = {};
+function ipa_details_field(spec) {
+
+ spec = spec || {};
-function ipa_stanza(spec){
var that = {};
+ that.name = spec.name;
+ that.label = spec.label;
+
+ that.setup = spec.setup || setup;
+ that.load = spec.load || load;
+ that.save = spec.save || save;
+
+ function setup(container, dl, section) {
+
+ var obj_name = container.attr('title');
+ var title = this.name;
+ var label = '';
+ var param_info = ipa_get_param_info(obj_name, this.name);
+ if (param_info)
+ label = param_info['label'];
+ if (!label)
+ label = this.label;
+ $('<dt></dt>', {
+ id: this.name,
+ title: title,
+ html: label + ':'
+ }).appendTo(dl);
+ }
- that.name = spec.name || '';
- that.label = spec.label || '';
+ function load(container, dt, entry_attrs) {
- function input(spec){
+ var obj_name = container.attr('id');
+ var multivalue = false;
+ var hint_span = null;
+ var dd;
- /*Was ipa_details_field_setup*/
- function setup(container, dl, section) {
-
- var obj_name = container.attr('title');
- var title = this.name;
- var label = '';
- var param_info = ipa_get_param_info(obj_name, this.name);
- if (param_info)
- label = param_info['label'];
- if (!label)
- label = this.label;
- $('<dt></dt>', {
- id: this.name,
- title: title,
- html: label + ':'
- }).appendTo(dl);
+ var param_info = ipa_get_param_info(obj_name, this.name);
+ if (param_info) {
+ if (param_info['multivalue'] || param_info['class'] == 'List')
+ multivalue = true;
+ var hint = param_info['hint'];
+ if (hint){
+ hint_span = $('<span />',{
+ 'class': 'attrhint',
+ 'html': 'Hint: ' + hint});
+ }
}
- /*Was ipa_details_field_load*/
- function load(container, dt, entry_attrs) {
-
- var obj_name = container.attr('id');
- var multivalue = false;
- var hint_span = null;
- var dd;
-
- var param_info = ipa_get_param_info(obj_name, this.name);
- if (param_info) {
- if (param_info['multivalue'] || param_info['class'] == 'List')
- multivalue = true;
- var hint = param_info['hint'];
- if (hint){
- hint_span = $('<span />',{
- 'class': 'attrhint',
- 'html': 'Hint: ' + hint});
- }
+ var value = entry_attrs[this.name];
+ if (value) {
+ dd = ipa_create_first_dd(
+ this.name, ipa_create_input(obj_name, this.name, value[0],hint_span)
+ );
+ dt.after(dd);
+ var last_dd = dd;
+ for (var i = 1; i < value.length; ++i) {
+ dd = ipa_create_other_dd(
+ this.name, ipa_create_input(obj_name, this.name, value[i],hint_span)
+ );
+ last_dd.after(dd);
+ last_dd = dd;
}
-
- var value = entry_attrs[this.name];
- if (value) {
+ if (multivalue) {
+ dd = ipa_create_other_dd(
+ this.name, _ipa_a_add_template.replace('A', this.name)
+ );
+ last_dd.after(dd);
+ }
+ } else {
+ if (multivalue) {
dd = ipa_create_first_dd(
- this.name, ipa_create_input(obj_name, this.name, value[0],hint_span)
+ this.name, _ipa_a_add_template.replace('A', this.name) /*.append(hint_span)*/
);
dt.after(dd);
- var last_dd = dd;
- for (var i = 1; i < value.length; ++i) {
- dd = ipa_create_other_dd(
- this.name, ipa_create_input(obj_name, this.name, value[i],hint_span)
- );
- last_dd.after(dd);
- last_dd = dd;
- }
- if (multivalue) {
- dd = ipa_create_other_dd(
- this.name, _ipa_a_add_template.replace('A', this.name)
- );
- last_dd.after(dd);
- }
} else {
- if (multivalue) {
- dd = ipa_create_first_dd(
- this.name, _ipa_a_add_template.replace('A', this.name) /*.append(hint_span)*/
- );
- dt.after(dd);
- } else {
- dd = ipa_create_first_dd(
- this.name, ipa_create_input(obj_name, this.name, '') /*.append(hint_span)*/
- );
- dt.after(dd);
- }
+ dd = ipa_create_first_dd(
+ this.name, ipa_create_input(obj_name, this.name, '') /*.append(hint_span)*/
+ );
+ dt.after(dd);
}
}
- /*Was ipa_details_field_save*/
- function save(container) {
- var field = this;
- var values = [];
+ }
- var dd = $('dd[title='+field.name+']', container);
- dd.each(function () {
- var input = $('input', $(this));
- if (!input.length) return;
+ function save(container) {
+ var field = this;
+ var values = [];
- if (input.is('.strikethrough')) return;
+ var dd = $('dd[title='+field.name+']', container);
+ dd.each(function () {
+ var input = $('input', $(this));
+ if (!input.length) return;
- var value = $.trim(input.val());
- if (!value) value = '';
+ if (input.is('.strikethrough')) return;
+ var value = $.trim(input.val());
+ if (!value) value = '';
- values.push(value);
- });
+ values.push(value);
+ });
- return values;
- }
+ return values;
+ }
- that.fields.push(spec);
- that.controls[spec.name] = spec;
+ return that;
+}
- if (!spec.setup){
- spec.setup = setup;
- }
- if (!spec.load){
- spec.load = load;
- }
+function ipa_details_section(spec){
- if (!spec.save){
- spec.save = save;
- }
+ spec = spec || {};
- return that;
+ var that = {};
+ that.name = spec.name || '';
+ that.label = spec.label || '';
+
+ that.fields = [];
+ that.fields_by_name = {};
+
+ that.get_fields = function() {
+ return that.fields;
+ };
+
+ that.get_field = function(name) {
+ return that.fields_by_name[name];
+ };
+
+ that.add_field = function(field) {
+ that.fields.push(field);
+ that.fields_by_name[field.name] = field;
+ };
+
+ that.create_field = function(spec) {
+ var field = ipa_details_field(spec);
+ that.add_field(field);
+ return field;
};
+
+ // Deprecated: Used for backward compatibility only.
+ function input(spec){
+ that.create_field(spec);
+ return that;
+ }
+
that.input = input;
- that.fields = [];
- that.controls={};
+
return that;
-};
+}
+
+// Deprecated: Used for backward compatibility only.
+function ipa_stanza(spec) {
+ return ipa_details_section(spec);
+}
+
+function ipa_details_facet(spec) {
+ spec = spec || {};
+
+ var that = ipa_facet(spec);
+
+ that.init = spec.init;
+ that.setup = spec.setup || setup;
+
+ that.sections = [];
+ that.sections_by_name = {};
+
+ that.get_sections = function() {
+ return that.sections;
+ };
+ that.get_section = function(name) {
+ return that.sections_by_name[name];
+ };
+
+ that.add_section = function(section) {
+ that.sections.push(section);
+ that.sections_by_name[section.name] = section;
+ };
+
+ that.create_section = function(spec) {
+ var section = ipa_stanza(spec);
+ that.add_section(section);
+ return section;
+ };
+
+ that.is_dirty = function() {
+ var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
+ return pkey != that.pkey;
+ };
+
+ function setup(container, unspecified) {
+
+ that.pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
+
+ that.setup_views(container);
+ ipa_details_create(container, that.sections);
+
+ container.find('.details-reset').click(function() {
+ ipa_details_reset(container);
+ return false;
+ });
+
+ container.find('.details-update').click(function() {
+ var pkey_name = IPA.metadata[that.entity_name].primary_key;
+ ipa_details_update(container, ipa_details_cache[that.entity_name][pkey_name][0]);
+ return false;
+ });
+
+ if (that.pkey||unspecified){
+ ipa_details_load(container, that.pkey, null, null);
+ }
+ }
+
+ if (that.init) that.init();
+
+ return that;
+}
function ipa_make_button(which,text,details_class){
@@ -286,7 +374,8 @@ function ipa_details_update(container, pkey, on_win, on_fail)
var modlist = {'all': true, 'setattr': [], 'addattr': []};
var attrs_wo_option = {};
- var sections = ipa_entity_get_details_sections(obj_name);
+ var facet = ipa_entity_get_details_facet(obj_name);
+ var sections = facet.get_sections();
for (var i=0; i<sections.length; i++) {
var section = sections[i];
var fields = section.fields;
@@ -355,7 +444,8 @@ function ipa_details_display(container, entry_attrs)
$('dd', container).remove();
/* go through all <dt> tags and pair them with newly created <dd>s */
- var sections = ipa_entity_get_details_sections(obj_name);
+ var facet = ipa_entity_get_details_facet(obj_name);
+ var sections = facet.get_sections();
for (var i=0; i<sections.length; i++) {
var section = sections[i];
var fields = section.fields;
diff --git a/install/static/develop.js b/install/static/develop.js
index f161f7826..251be0faf 100644
--- a/install/static/develop.js
+++ b/install/static/develop.js
@@ -1,4 +1,4 @@
if (window.location.protocol == 'file:') {
- ipa_json_url = "test/data";
- ipa_use_static_files = true;
+ IPA.json_url = "test/data";
+ IPA.use_static_files = true;
}
diff --git a/install/static/entity.js b/install/static/entity.js
index f63296421..f26f219b7 100644
--- a/install/static/entity.js
+++ b/install/static/entity.js
@@ -21,262 +21,298 @@
/* REQUIRES: ipa.js, details.js, search.js, add.js */
-var ipa_entity_search_list = {};
-var ipa_entity_add_list = {};
+function ipa_facet(spec) {
-//moving this to details
-//var ipa_entity_details_list = {};
-var ipa_entity_association_list = {};
+ spec = spec || {};
-var ipa_entity_facet_list = {};
+ var that = {};
+ that.name = spec.name;
+ that.label = spec.label;
+ that.entity_name = spec.entity_name;
-function ipa_facet(spec){
- return spec;
-};
+ that.init = spec.init;
+ that.setup = spec.setup;
+ that.setup_views = ipa_facet_setup_views;
+
+ return that;
+}
+
+function ipa_entity(spec) {
+
+ spec = spec || {};
+
+ var that = {};
+ that.name = spec.name;
+ that.label = spec.label;
+
+ that.setup = spec.setup;
+
+ that.add_dialog = null;
+
+ that.facets = [];
+ that.facets_by_name = {};
+
+ this.facet_name = null;
+
+ that.get_add_dialog = function() {
+ return that.add_dialog;
+ };
+
+ that.create_add_dialog = function(spec) {
+ spec.entity_name = that.name;
+ that.add_dialog = ipa_add_dialog(spec);
+ return that.add_dialog;
+ };
+
+ that.get_facets = function() {
+ return that.facets;
+ };
+
+ that.get_facet = function(name) {
+ return that.facets_by_name[name];
+ };
+
+ that.add_facet = function(facet) {
+ that.facets.push(facet);
+ that.facets_by_name[facet.name] = facet;
+ };
+
+ that.create_search_facet = function(spec) {
+ spec.entity_name = that.name;
+ var facet = ipa_search_facet(spec);
+ that.add_facet(facet);
+ return facet;
+ };
+
+ that.create_details_facet = function(spec) {
+ spec.entity_name = that.name;
+ var facet = ipa_details_facet(spec);
+ that.add_facet(facet);
+ return facet;
+ };
+
+ that.create_association_facet = function(spec) {
+ spec.entity_name = that.name;
+ var facet = ipa_association_facet(spec);
+ that.add_facet(facet);
+ return facet;
+ };
+
+ return that;
+}
/* use this to track individual changes between two hashchange events */
var window_hash_cache = {};
-function ipa_entity_set_search_definition(obj_name, data)
-{
- ipa_entity_search_list[obj_name] = data;
-}
+function ipa_get_entity(entity_name) {
-function ipa_entity_set_add_definition(obj_name, data)
-{
- ipa_entity_add_list[obj_name] = data;
-}
+ var entity = IPA.get_entity(entity_name);
+ if (entity) return entity;
+
+ entity = ipa_entity({
+ 'name': entity_name
+ });
-function ipa_entity_set_details_definition(obj_name, data)
-{
- ipa_entity_details_list[obj_name] = data;
+ IPA.add_entity(entity);
+ return entity;
}
-function ipa_entity_get_details_sections(obj_name)
-{
- var sections = ipa_entity_details_list[obj_name];
- if (sections) return sections;
- return [];
+function ipa_entity_get_search_facet(entity_name) {
+
+ var entity = ipa_get_entity(entity_name);
+
+ var facet = entity.get_facet('search');
+ if (facet) return facet;
+
+ facet = entity.create_search_facet({
+ 'name': 'search',
+ 'label': 'Search'
+ });
+
+ return facet;
}
-function ipa_entity_set_association_definition(obj_name, data)
-{
- ipa_entity_association_list[obj_name] = data;
+function ipa_entity_set_search_definition(entity_name, data) {
+
+ var facet = ipa_entity_get_search_facet(entity_name);
+
+ for (var i=0; i<data.length; i++) {
+ var defn = data[i];
+ facet.create_column({
+ 'name': defn[0],
+ 'label': defn[1],
+ 'setup': defn[2]
+ });
+ }
}
+function ipa_entity_set_add_definition(entity_name, data) {
-function ipa_entity_set_facet_definition(obj_name, data)
-{
- function facet(spec){
- return spec;
+ var entity = ipa_get_entity(entity_name);
+
+ var dialog = entity.create_add_dialog({
+ 'name': data[0],
+ 'title': data[1]
+ });
+
+ for (var i=0; i<data[2].length; i++) {
+ var field = data[2][i];
+ dialog.create_field({
+ name: field[0],
+ label: field[1],
+ setup: field[2]
+ });
}
+}
- ipa_entity_facet_list[obj_name] = data;
+function ipa_entity_get_add_dialog(entity_name) {
+
+ var entity = ipa_get_entity(entity_name);
+ return entity.get_add_dialog();
}
+function ipa_entity_get_details_facet(entity_name) {
-function ipa_details_only_setup(container){
- ipa_entity_setup(container, 'details');
+ var entity = ipa_get_entity(entity_name);
+
+ var facet = entity.get_facet('details');
+ if (facet) return facet;
+
+ facet = entity.create_details_facet({
+ 'name': 'details',
+ 'label': 'Details'
+ });
+
+ return facet;
}
-function ipa_entity_setup(container, unspecified)
-{
-
- var id = container.attr('id');
- var state = id + '-facet';
- var facet = $.bbq.getState(state, true) || unspecified || 'search';
- var last_facet = window_hash_cache[state];
-
- var facet_renders = {
- search : function(){
- state = id + '-filter';
- var filter = $.bbq.getState(state, true);
- var last_filter = window_hash_cache[state];
- if (filter == last_filter) return;
- _ipa_entity_setup(container);
- window_hash_cache[state] = filter;
-
- },
- details : function (){
- state = id + '-pkey';
- var pkey = $.bbq.getState(state, true);
- var last_pkey = window_hash_cache[state];
- if (pkey == last_pkey) return;
- _ipa_entity_setup(container);
- window_hash_cache[state] = pkey;
- },
- associate : function () {
- state = id + '-enroll';
- var enroll = $.bbq.getState(state, true);
- var last_enroll = window_hash_cache[state];
- if (enroll == last_enroll) return;
- _ipa_entity_setup(container);
- window_hash_cache[state] = enroll;
- },
- records : function () {
- state = id + '-record';
- var records = $.bbq.getState(state, true);
- var last_records = window_hash_cache[state];
- if (records == last_records) return;
- _ipa_entity_setup(container);
- window_hash_cache[state] = record;
- }
- };
+function ipa_entity_set_details_definition(entity_name, sections) {
- if (facet != last_facet) {
- _ipa_entity_setup(container,unspecified);
- window_hash_cache[state] = facet;
- } else{
- var render = facet_renders[facet];
- if (render) {
- render();
- }
- //TODO handle error.
+ var facet = ipa_entity_get_details_facet(entity_name);
+
+ for (var i=0; i<sections.length; i++) {
+ var section = sections[i];
+ facet.add_section(section);
}
+}
+
+function ipa_entity_get_association_facet(entity_name) {
+
+ var entity = ipa_get_entity(entity_name);
+
+ var facet = entity.get_facet('associate');
+ if (facet) return facet;
+ facet = entity.create_association_facet({
+ 'name': 'associate'
+ });
+
+ return facet;
}
-function _ipa_entity_setup(container, unspecified) {
+function ipa_entity_set_association_definition(entity_name, data) {
- var obj_name = container.attr('id');
+ var facet = ipa_entity_get_association_facet(entity_name);
- function reset_on_click() {
- ipa_details_reset(container);
- return (false);
+ for (var other_entity in data) {
+ var config = data[other_entity];
+ facet.create_config({
+ 'name': other_entity,
+ 'associator': config.associator,
+ 'method': config.method
+ });
}
+}
- function update_on_click() {
- var pkey_name = ipa_objs[obj_name].primary_key;
- ipa_details_update(container, ipa_details_cache[obj_name][pkey_name][0]);
- return (false);
- }
+function ipa_entity_set_facet_definition(entity_name, list) {
- function new_on_click() {
- add_dialog_create(obj_name, ipa_entity_add_list[obj_name]);
- return (false);
- }
+ var entity = ipa_get_entity(entity_name);
- function switch_view() {
- var enroll_obj_name = $(this).attr('title');
- var state = {};
- if (enroll_obj_name != 'search' &&
- enroll_obj_name != 'details' &&
- enroll_obj_name != 'records') {
- state[obj_name + '-facet'] = 'associate';
- state[obj_name + '-enroll'] = enroll_obj_name;
- } else {
- state[obj_name + '-facet'] = enroll_obj_name;
- state[obj_name + '-enroll'] = '';
- }
- $.bbq.pushState(state);
+ for (var i=0; i<list.length; i++) {
+ var facet = list[i];
+ facet.entity_name = entity_name;
+ entity.add_facet(facet);
}
+}
- var facet_setups = {
- search : function (unspecified) {
- var filter = $.bbq.getState(obj_name + '-filter', true) || '';
- search_create(obj_name, ipa_entity_search_list[obj_name], container);
- ipa_make_button( 'ui-icon-plus',ipa_messages.button.add).
- click(new_on_click).
- appendTo($( "div#" + obj_name + " > div.search-controls"))
- search_load(container, filter);
- },
-
- details : function(unspecified) {
- var pkey = $.bbq.getState(obj_name + '-pkey', true);
- ipa_entity_generate_views(obj_name, container, switch_view);
- var sections = ipa_entity_get_details_sections(obj_name);
- ipa_details_create(container, sections);
- container.find('.details-reset').click(reset_on_click);
- container.find('.details-update').click(update_on_click);
- if (pkey||unspecified){
- ipa_details_load(container, pkey, null, null);
- }
- },
-
- associate : function facet(unspecified) {
- var pkey = $.bbq.getState(obj_name + '-pkey', true) || '';
- var enroll_obj_name = $.bbq.getState(obj_name + '-enroll', true) || '';
- var attr = ipa_get_member_attribute(obj_name, enroll_obj_name);
- var columns = [
- {
- title: ipa_objs[enroll_obj_name].label,
- column: attr + '_' + enroll_obj_name
- }
- ];
- var association = ipa_entity_association_list[obj_name];
- var association_config = association ? association[enroll_obj_name] : null;
- var associator = association_config ? association_config.associator : null;
- var method = association_config ? association_config.method : null;
- var frm = new AssociationList(
- obj_name, pkey, enroll_obj_name, columns, container,
- associator, method
- );
- ipa_entity_generate_views(obj_name, container, switch_view);
- frm.setup();
- },
-
- records: function(unspecified) {
- records_facet.setup(obj_name, container, switch_view );
- }
+function ipa_details_only_setup(container){
+ ipa_entity_setup.call(this, container, 'details');
+}
- }
+function ipa_entity_setup(container, unspecified) {
+ var entity = this;
container.empty();
- var facet = $.bbq.getState(obj_name + '-facet', true) ||
- unspecified || 'search';
+ var facet_name = $.bbq.getState(entity.name + '-facet', true) || unspecified || 'search';
- var facet_setup_function = facet_setups[facet];
- if (facet_setup_function){
- facet_setup_function(unspecified);
- }
-}
+ var facet = entity.get_facet(facet_name);
+ if (!facet) return;
-function ipa_entity_generate_views(obj_name, container, switch_view)
-{
- var ul = $('<ul></ul>', {'class': 'entity-views'});
-
- //TODO for single instance entites, don't display search
- ul.append($('<li></li>', {
- title: 'search',
- text: 'Search',
- click: switch_view
- }));
-
- ul.append($('<li></li>', {
- text: 'Details',
- title: 'details',
- click: switch_view
- }).prepend('| '));
-
- var attribute_members = ipa_objs[obj_name].attribute_members;
- for (attr in attribute_members) {
- var objs = attribute_members[attr];
- for (var i = 0; i < objs.length; ++i) {
- var m = objs[i];
- var label = ipa_objs[m].label;
+ if (IPA.entity_name == entity.name) {
+ if (entity.facet_name == facet_name) {
+ if (!facet.is_dirty()) return;
- ul.append($('<li></li>', {
- title: m,
- text:label,
- click: switch_view
- }).prepend('| '));
+ } else {
+ entity.facet_name = facet_name;
}
+ } else {
+ IPA.entity_name = entity.name;
}
- //TODO Additional facets go here
-
- var facets = ipa_entity_facet_list[obj_name];
- if (facets){
- for (var f = 0; f < facets.length; f += 1){
- var facet = facets[f];
- ul.append($('<li></li>', {
- text: facet.name,
- title: facet.name,
- click: switch_view
- }).prepend('| '));
+ if (facet.setup) {
+ facet.setup(container, unspecified);
+ }
+}
+
+function ipa_facet_setup_views(container) {
+
+ var facet = this;
+
+ var ul = $('<ul/>', {'class': 'entity-views'});
+
+ var entity = IPA.get_entity(facet.entity_name);
+ var facets = entity.get_facets();
+
+ for (var i=0; i<facets.length; i++) {
+ var other_facet = facets[i];
+ var facet_name = other_facet.name;
+
+ if (other_facet.label) {
+
+ var label = other_facet.label;
+ if (i > 0) label = '| '+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); }
+ }(facet.entity_name, facet_name)
+ }));
+
+ } else { // For now empty label indicates an association facet
+
+ var attribute_members = IPA.metadata[facet.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;
+
+ if (i > 0 || j > 0) label = '| ' + 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); }
+ }(facet.entity_name, facet_name, other_entity)
+ }));
+ }
+ }
}
}
@@ -286,11 +322,10 @@ function ipa_entity_generate_views(obj_name, container, switch_view)
function ipa_entity_quick_links(tr, attr, value, entry_attrs) {
var obj_name = tr.closest('.search-container').attr('title');
- var pkey = ipa_objs[obj_name].primary_key;
+ var pkey = IPA.metadata[obj_name].primary_key;
var pkey_value = entry_attrs[pkey][0];
- var td = $("<td/>");
- tr.append(td);
+ var td = $("<td/>").appendTo(tr);
$("<a/>", {
href: "#details",
@@ -304,12 +339,12 @@ function ipa_entity_quick_links(tr, attr, value, entry_attrs) {
}
}).appendTo(td);
- var attribute_members = ipa_objs[obj_name].attribute_members;
+ var attribute_members = IPA.metadata[obj_name].attribute_members;
for (attr_name in attribute_members) {
var objs = attribute_members[attr_name];
for (var i = 0; i < objs.length; ++i) {
var m = objs[i];
- var label = ipa_objs[m].label;
+ var label = IPA.metadata[m].label;
$("<a/>", {
href: '#'+m,
diff --git a/install/static/hbac.js b/install/static/hbac.js
new file mode 100755
index 000000000..94b05fbd4
--- /dev/null
+++ b/install/static/hbac.js
@@ -0,0 +1,214 @@
+/* Authors:
+ * Endi Sukma Dewata <edewata@redhat.com>
+ *
+ * Copyright (C) 2010 Red Hat
+ * see file 'COPYING' for use and warranty information
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; version 2 only
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
+
+function ipa_hbac() {
+
+ var that = ipa_entity({
+ 'name': 'hbac'
+ });
+
+ that.init = function() {
+ that.create_add_dialog({
+ 'name': 'add',
+ 'title': 'Add New Rule',
+ 'init': ipa_hbac_add_init
+ });
+
+ that.create_search_facet({
+ 'name': 'search',
+ 'label': 'Search',
+ 'init': ipa_hbac_search_init,
+ 'setup': ipa_hbac_search_setup
+ });
+
+ that.create_details_facet({
+ 'name': 'details',
+ 'label': 'Details',
+ 'init': ipa_hbac_details_init,
+ 'setup': ipa_hbac_details_setup
+ });
+
+ that.create_association_facet({
+ 'name': 'associate'
+ });
+ };
+
+ that.init();
+
+ return that;
+}
+
+IPA.add_entity(ipa_hbac());
+
+function ipa_hbac_add_init() {
+ this.create_field({name:'cn', label:'Rule Name'});
+}
+
+function ipa_hbac_search_init() {
+
+ this.create_column({name:'cn', label:'Rule Name'});
+ this.create_column({name:'usercategory', label:'Who'});
+ this.create_column({name:'hostcategory', label:'Accessing'});
+ this.create_column({name:'servicecategory', label:'Via Service'});
+ this.create_column({name:'sourcehostcategory', label:'From'});
+ this.create_column({name:'ipaenabledflag', label:'Active'});
+
+ this.create_column({
+ name: 'quick_links',
+ label: 'Quick Links',
+ setup: ipa_hbac_quick_links
+ });
+}
+
+function ipa_hbac_search_setup(container) {
+
+ var facet = this;
+
+ facet.filter = $.bbq.getState(facet.entity_name + '-filter', true) || '';
+
+ var toolbar = $('<span/>').appendTo(container);
+
+ $('<input/>', {
+ 'type': 'button',
+ 'value': 'Troubleshoot Rules',
+ 'click': function() {
+ }
+ }).appendTo(toolbar);
+
+ $('<input/>', {
+ 'type': 'button',
+ 'value': 'Cull Disabled Rules',
+ 'click': function() {
+ }
+ }).appendTo(toolbar);
+
+ $('<input/>', {
+ 'type': 'button',
+ 'value': 'Login Services',
+ 'click': function() {
+ }
+ }).appendTo(toolbar);
+
+ $('<input/>', {
+ 'type': 'button',
+ 'value': 'Login Svc Groups',
+ 'click': function() {
+ }
+ }).appendTo(toolbar);
+
+ search_create(facet.entity_name, facet.columns, container);
+
+ ipa_make_button('ui-icon-plus', IPA.messages.button.add).
+ click(function() {
+ var entity = IPA.get_entity(facet.entity_name);
+ entity.add_dialog.open();
+ return false;
+ }).
+ appendTo($('.search-controls', container));
+
+ search_load(container, facet.filter);
+}
+
+function ipa_hbac_quick_links(tr, attr, value, entry_attrs) {
+
+ var column = this;
+ var facet = column.facet;
+
+ var pkey = IPA.metadata[facet.entity_name].primary_key;
+ var pkey_value = entry_attrs[pkey][0];
+
+ var td = $('<td/>').appendTo(tr);
+
+ $('<a/>', {
+ 'href': '#details',
+ 'title': 'Details',
+ 'text': 'Details',
+ 'click': function() {
+ var state = {};
+ state[facet.entity_name+'-facet'] = 'details';
+ state[facet.entity_name+'-pkey'] = pkey_value;
+ nav_push_state(state);
+ return false;
+ }
+ }).appendTo(td);
+
+ td.append(' | ');
+
+ $('<a/>', {
+ 'href': '#test-rule',
+ 'title': 'Test Rule',
+ 'text': 'Test Rule',
+ 'click': function() {
+ var state = {};
+ state[facet.entity_name+'-facet'] = 'test-rule';
+ state[facet.entity_name+'-pkey'] = pkey_value;
+ nav_push_state(state);
+ return false;
+ }
+ }).appendTo(td);
+}
+
+function ipa_hbac_details_init() {
+
+ var section = this.create_section({name:'general', label:'General'});
+ section.create_field({name:'cn', label:'Name'});
+ section.create_field({name:'accessruletype', label:'Rule Type'});
+ section.create_field({name:'description', label:'Description'});
+ section.create_field({name:'ipaenabledflag', label:'Enabled'});
+
+ section = this.create_section({name:'user', label:'Who'});
+ section.create_field({name:'usercategory', label:'User Category'});
+
+ section = this.create_section({name:'host', label:'Accessing'});
+ section.create_field({name:'hostcategory', label:'Host Category'});
+
+ section = this.create_section({name:'service', label:'Via Service'});
+ section.create_field({name:'servicecategory', label:'Service Category'});
+
+ section = this.create_section({name:'sourcehost', label:'From'});
+ section.create_field({name:'sourcehostcategory', label:'Source Host Category'});
+}
+
+function ipa_hbac_details_setup(container, unspecified) {
+
+ var facet = this;
+
+ var pkey = $.bbq.getState(facet.entity_name + '-pkey', true);
+ var pkey_name = IPA.metadata[facet.entity_name].primary_key;
+
+ facet.setup_views(container);
+
+ var sections = facet.get_sections();
+ ipa_details_create(container, sections);
+
+ container.find('.details-reset').click(function() {
+ ipa_details_reset(container);
+ return false;
+ });
+
+ container.find('.details-update').click(function() {
+ ipa_details_update(container, ipa_details_cache[facet.entity_name][pkey_name][0]);
+ return false;
+ });
+
+ ipa_details_load(container, pkey, null, null);
+}
diff --git a/install/static/hostgroup.js b/install/static/hostgroup.js
index 37af6d6e5..02418bf05 100644
--- a/install/static/hostgroup.js
+++ b/install/static/hostgroup.js
@@ -38,3 +38,6 @@ ipa_entity_set_details_definition('hostgroup', [
input({name:'cn', label:'Name'}).
input({name: 'description', label:'Description'})
]);
+
+ipa_entity_set_association_definition('hostgroup', {
+});
diff --git a/install/static/index.xhtml b/install/static/index.xhtml
index 58c631e8c..bcb7cd0bb 100644
--- a/install/static/index.xhtml
+++ b/install/static/index.xhtml
@@ -22,6 +22,7 @@
<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="host.js"></script>
<script type="text/javascript" src="hostgroup.js"></script>
<script type="text/javascript" src="netgroup.js"></script>
diff --git a/install/static/ipa.js b/install/static/ipa.js
index 74fde9299..9da693051 100644
--- a/install/static/ipa.js
+++ b/install/static/ipa.js
@@ -22,48 +22,82 @@
var IPA_DEFAULT_JSON_URL = '/ipa/json';
-var ipa_json_url;
-var ipa_use_static_files;
-
-var ipa_ajax_options = {
- type: 'POST',
- contentType: 'application/json',
- dataType: 'json',
- async: true,
- processData: false
-};
-
/* JSON-RPC ID counter */
var ipa_jsonrpc_id = 0;
-/* IPA objects data in JSON format */
-var ipa_messages = {};
-var ipa_objs = {};
+var IPA = function() {
-var ipa_dialog = $('<div/>', {id: 'ipa_dialog'});
+ var that = {};
-/* initialize the IPA JSON-RPC helper
- * arguments:
- * url - JSON-RPC URL to use (optional) */
-function ipa_init(url, use_static_files, on_win, on_error)
-{
- if (url)
- ipa_json_url = url;
-
- if (use_static_files)
- ipa_use_static_files = use_static_files;
-
- $.ajaxSetup(ipa_ajax_options);
-
- ipa_cmd('json_metadata', [], {},
- function(data, text_status, xhr) {
- ipa_objs = data.result.metadata;
- ipa_messages = data.result.messages;
- if (on_win) on_win(data, text_status, xhr);
- },
- on_error
- );
-}
+ that.json_url = null;
+ that.use_static_files = false;
+
+ that.ajax_options = {
+ type: 'POST',
+ contentType: 'application/json',
+ dataType: 'json',
+ async: true,
+ processData: false
+ };
+
+ that.messages = {};
+ that.metadata = {};
+
+ that.entities = [];
+ that.entities_by_name = {};
+
+ that.error_dialog = $('<div/>', {
+ id: 'error_dialog'
+ });
+
+ /* initialize the IPA JSON-RPC helper
+ * arguments:
+ * url - JSON-RPC URL to use (optional) */
+ that.init = function(url, use_static_files, on_success, on_error) {
+ if (url)
+ that.json_url = url;
+
+ if (use_static_files)
+ that.use_static_files = use_static_files;
+
+ $.ajaxSetup(that.ajax_options);
+
+ ipa_cmd('json_metadata', [], {},
+ function(data, text_status, xhr) {
+ that.metadata = data.result.metadata;
+ that.messages = data.result.messages;
+ if (on_success) on_success(data, text_status, xhr);
+ },
+ on_error
+ );
+ };
+
+ that.get_entities = function() {
+ return that.entities;
+ };
+
+ that.get_entity = function(name) {
+ return that.entities_by_name[name];
+ };
+
+ that.add_entity = function(entity) {
+ that.entities.push(entity);
+ that.entities_by_name[entity.name] = entity;
+ };
+
+ that.show_page = function(entity_name, facet_name, other_entity) {
+
+ var entity = IPA.get_entity(entity_name);
+ var facet = entity.get_facet(facet_name);
+
+ var state = {};
+ state[entity_name + '-facet'] = facet_name;
+ state[entity_name + '-enroll'] = other_entity ? other_entity : '';
+ $.bbq.pushState(state);
+ };
+
+ return that;
+}();
/* call an IPA command over JSON-RPC
* arguments:
@@ -96,26 +130,26 @@ function ipa_cmd(name, args, options, win_callback, fail_callback, objname)
}
function ipa_error_handler(xhr, text_status, error_thrown) {
- ipa_dialog.empty();
- ipa_dialog.attr('title', 'Error: '+error_thrown.name);
+ IPA.error_dialog.empty();
+ IPA.error_dialog.attr('title', 'Error: '+error_thrown.name);
- ipa_dialog.append('<p>URL: '+this.url+'</p>');
+ IPA.error_dialog.append('<p>URL: '+this.url+'</p>');
if (error_thrown.message) {
- ipa_dialog.append('<p>'+error_thrown.message+'</p>');
+ IPA.error_dialog.append('<p>'+error_thrown.message+'</p>');
}
var that = this;
- ipa_dialog.dialog({
+ IPA.error_dialog.dialog({
modal: true,
width: 400,
buttons: {
'Retry': function() {
- ipa_dialog.dialog('close');
+ IPA.error_dialog.dialog('close');
ipa_cmd(name, args, options, win_callback, fail_callback, objname);
},
'Cancel': function() {
- ipa_dialog.dialog('close');
+ IPA.error_dialog.dialog('close');
fail_callback.call(that, xhr, text_status, error_thrown);
}
}
@@ -129,12 +163,12 @@ function ipa_cmd(name, args, options, win_callback, fail_callback, objname)
if (objname)
method_name = objname + '_' + name;
- var url = ipa_json_url;
+ var url = IPA.json_url;
if (!url)
url = IPA_DEFAULT_JSON_URL;
- if (ipa_use_static_files)
+ if (IPA.use_static_files)
url += '/' + method_name + '.json';
var data = {
@@ -182,7 +216,7 @@ function ipa_parse_qs(qs)
/* helper function used to retrieve information about an attribute */
function ipa_get_param_info(obj_name, attr)
{
- var ipa_obj = ipa_objs[obj_name];
+ var ipa_obj = IPA.metadata[obj_name];
if (!ipa_obj) return null;
var takes_params = ipa_obj.takes_params;
@@ -200,10 +234,10 @@ function ipa_get_param_info(obj_name, attr)
/* helper function used to retrieve attr name with members of type `member` */
function ipa_get_member_attribute(obj_name, member)
{
- var ipa_obj = ipa_objs[obj_name];
+ var ipa_obj = IPA.metadata[obj_name];
if (!ipa_obj) return null;
- var attribute_members = ipa_obj.attribute_members
+ var attribute_members = ipa_obj.attribute_members;
for (var a in attribute_members) {
var objs = attribute_members[a];
for (var i = 0; i < objs.length; ++i) {
diff --git a/install/static/navigation.js b/install/static/navigation.js
index 4135cb44b..72b58ee09 100644
--- a/install/static/navigation.js
+++ b/install/static/navigation.js
@@ -71,21 +71,25 @@ function nav_generate_tabs(nls, container, tabclass, depth)
container.append(ul);
for (var i = 0; i < nls.length; ++i) {
- var n = nls[i];
+ var tab = nls[i];
- var name = n.name;
- if ((ipa_objs[n.name]) && (ipa_objs[n.name].label)){
- name = ipa_objs[n.name].label;
+ var label = tab.name;
+ if ((IPA.metadata[tab.name]) && (IPA.metadata[tab.name].label)){
+ label = IPA.metadata[tab.name].label;
}
- var li = nav_create_tab_li(n.name, name);
+ var li = nav_create_tab_li(tab.name, label);
ul.append(li);
- var div = nav_create_tab_div(n.name);
+ var div = nav_create_tab_div(tab.name);
container.append(div);
- if (n.children) {
- nav_generate_tabs(n.children, div, tabclass, depth +1 );
+ if (tab.children) {
+ nav_generate_tabs(tab.children, div, tabclass, depth +1 );
+ } else {
+ var entity = ipa_get_entity(tab.name);
+ entity.label = tab.label;
+ entity.setup = tab.setup;
}
}
}
@@ -126,6 +130,7 @@ function _nav_update_tabs(nls, container)
_nav_update_tabs(tab.children, container2);
} else if (tab.setup) {
- tab.setup(container2);
+ var entity = IPA.get_entity(tab.name);
+ entity.setup(container2);
}
}
diff --git a/install/static/netgroup.js b/install/static/netgroup.js
index 9a738877d..5bedc9357 100644
--- a/install/static/netgroup.js
+++ b/install/static/netgroup.js
@@ -40,3 +40,5 @@ ipa_entity_set_details_definition('netgroup', [
input({name:'nisdomainname', label:'NIS Domain'})
]);
+ipa_entity_set_association_definition('netgroup', {
+});
diff --git a/install/static/policy.js b/install/static/policy.js
index 4d30c5732..dd5447718 100644
--- a/install/static/policy.js
+++ b/install/static/policy.js
@@ -20,33 +20,6 @@
/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
-ipa_entity_set_search_definition('hbac', [
- ['cn', 'Name', null],
- ['description', 'description', null],
- ['quick_links', 'Quick Links', ipa_entity_quick_links]
-]);
-
-ipa_entity_set_add_definition('hbac', [
- 'dialog-add-hbac', 'Add New Zone', [
- ['cn', 'Name', null]
- ]
-]);
-
-ipa_entity_set_details_definition('hbac', [
- ipa_stanza({name:'identity', label:'HBAC Details'}).
- input({name:'cn', label:'HBAC Name'}).
- input({name:'accessruletype', label:'Rule Type'}).
- input({name:'description', label:'Description'}).
- input({name:'hostcategory', label:'Host Category'}).
- input({name:'ipaenabledflag', label:'Enabled'}).
- input({name:'servicecategory', label:'Service Category'}).
- input({name:'sourcehostcategory', label:'Source Host Category'}).
- input({name:'usercategory', label:'User Category'})
-]);
-
-ipa_entity_set_association_definition('hbac', {
-});
-
/* DNS */
ipa_entity_set_search_definition('dns', [
['idnsname', 'Zone Name', null],
@@ -84,12 +57,19 @@ ipa_entity_set_association_definition('dns', {
ipa_entity_set_facet_definition('dns', [
- ipa_facet({name:'records'})]
+ ipa_records_facet({
+ 'name': 'records',
+ 'label': 'Records'
+ })]
);
-function create_records_facet(){
+function ipa_records_facet(spec){
- var that = {};
+ spec = spec || {};
+
+ var that = ipa_facet(spec);
+
+ that.record = null;
var record_types =[ 'a', 'aaaa', 'dname', 'cname', 'mx', 'ns', 'ptr',
'srv', 'txt', 'a6', 'afsdb', 'cert', 'ds', 'hinfo',
@@ -149,10 +129,10 @@ function create_records_facet(){
reload();
if (called_from_add_and_edit) {
}
- };
+ }
function add_fail(data, text_status, xhr) {
- };
+ }
params.push( $.bbq.getState('dns-pkey', true));
params.push(add_dialog.find('#dns-record-resource').val());
@@ -161,16 +141,16 @@ function create_records_facet(){
ipa_cmd('dns_add_rr', params, options, add_win, add_fail);
//add_dialog.dialog('close');
- };
+ }
function add_and_close(evt) {
add(evt, true);
add_dialog.dialog('close');
- };
+ }
function cancel() {
add_dialog.dialog('close');
- };
+ }
add_dialog.dialog({
@@ -199,8 +179,8 @@ function create_records_facet(){
var delete_dialog = $('<div/>', {
- title: ipa_messages.button.delete,
- 'class': 'search-dialog-delete',
+ title: IPA.messages.button.delete,
+ 'class': 'search-dialog-delete'
});
var to_delete_table =
$('<table class="search-table" >'+
@@ -240,40 +220,49 @@ function create_records_facet(){
ipa_cmd('dns_del_rr',delete_list[i],{},
delete_complete,delete_complete);
}
- };
+ }
function cancel_on_click() {
delete_dialog.dialog('close');
- };
+ }
if (delete_list.length == 0)
return;
delete_dialog.append($('<P/>',
- {text:ipa_messages.search.delete_confirm}));
+ {text: IPA.messages.search.delete_confirm}));
delete_dialog.dialog({
modal: true,
buttons: {
'Delete': delete_on_click,
- 'Cancel': cancel_on_click,
- },
+ 'Cancel': cancel_on_click
+ }
});
}
- function setup(obj_name, container,switch_view){
+ that.is_dirty = function() {
+ var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
+ var record = $.bbq.getState(that.entity_name + '-record', true) || '';
+ return pkey != that.pkey || record != that.record;
+ };
+
+ function setup(container, unspecified){
+
+ that.pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
+ that.record = $.bbq.getState(that.entity_name + '-record', true) || '';
+
that.container = container;
- var pkey = $.bbq.getState('dns' + '-pkey', true);
- ipa_entity_generate_views(obj_name, container, switch_view);
+ that.setup_views(container);
- container.attr('title', obj_name);
+ container.attr('title', that.entity_name);
container.addClass('search-container');
var h2 = $('<h2></h2>',{
- text: "Records for DNS Zone:" + pkey
+ text: "Records for DNS Zone:" + that.pkey
}).appendTo(container);
@@ -286,7 +275,7 @@ function create_records_facet(){
control_span.append($('<input />',{
type: "text",
id: 'dns-record-resource-filter',
- name: 'search-' + obj_name + '-filter'
+ name: 'search-' + that.entity_name + '-filter'
}));
control_span.append('Type');
@@ -302,13 +291,13 @@ function create_records_facet(){
//}));
- ipa_make_button('ui-icon-search',ipa_messages.button.find).
+ ipa_make_button('ui-icon-search', IPA.messages.button.find).
click(function(){load(container)}).appendTo(control_span);
- ipa_make_button('ui-icon-plus',ipa_messages.button.add).
+ ipa_make_button('ui-icon-plus', IPA.messages.button.add).
click(add_click).appendTo(control_span);
- ipa_make_button('ui-icon-trash',ipa_messages.button.delete).
+ ipa_make_button('ui-icon-trash', IPA.messages.button.delete).
click(function(){delete_records(records_table);}).
appendTo(control_span);
@@ -316,16 +305,16 @@ function create_records_facet(){
div.append('<span class="records-buttons"></span>');
var records_results = $('<div/>', {
- class: 'records-results'
+ 'class': 'records-results'
}).appendTo(container);
var records_table = $('<table/>', {
- class: 'search-table',
+ 'class': 'search-table'
}).appendTo(records_results);
var thead = $('<thead><tr></tr></thead>').appendTo(records_table);
- var tbody = $('<tbody></tbody>').appendTo(records_table);;
- var tfoot = $('<tfoot></tfoot>').appendTo(records_table);;
+ var tbody = $('<tbody></tbody>').appendTo(records_table);
+ var tfoot = $('<tfoot></tfoot>').appendTo(records_table);
var tr = thead.find('tr');
tr.append($('<th style="width: 15px" />').append(
@@ -363,17 +352,17 @@ function create_records_facet(){
var options = {};
var resource_filter = container.find("#dns-record-resource-filter")
- .val()
+ .val();
if (resource_filter){
options.idnsname = resource_filter;
}
- var type_filter = container.find("#dns-record-type-filter").val()
+ var type_filter = container.find("#dns-record-type-filter").val();
if (type_filter){
options.type = type_filter;
}
- var data_filter = container.find("#dns-record-data-filter").val()
+ var data_filter = container.find("#dns-record-data-filter").val();
if (data_filter){
options.data = data_filter;
}
@@ -454,12 +443,7 @@ function create_records_facet(){
that.load = load;
return that;
-};
-
-
-var records_facet = create_records_facet();
-
-
+}
/**Automount*/
diff --git a/install/static/search.js b/install/static/search.js
index e4efcb0ef..fd123c094 100644
--- a/install/static/search.js
+++ b/install/static/search.js
@@ -21,30 +21,127 @@
/* REQUIRES: ipa.js */
-function search_create(obj_name, scl, container)
-{
- if (!scl){
- scl = [];
+function ipa_search_column(spec) {
+
+ spec = spec || {};
+
+ var that = {};
+
+ that.name = spec.name;
+ that.label = spec.label || that.name;
+ that.facet = spec.facet;
+
+ that.init = spec.init || init;
+ that.setup = spec.setup || setup;
+
+ function init() {
+ }
+
+ function setup(tr, attr, value, entry_attrs) {
+ search_generate_td(tr, attr, value, entry_attrs);
}
+ return that;
+}
+
+function ipa_search_facet(spec) {
+
+ spec = spec || {};
+
+ var that = ipa_facet(spec);
+
+ that.init = spec.init || init;
+ that.setup = spec.setup || setup;
+
+ that.columns = [];
+ that.columns_by_name = {};
+
+ that.get_columns = function() {
+ return that.columns;
+ };
+
+ that.get_column = function(name) {
+ return that.columns_by_name[name];
+ };
+
+ that.add_column = function(column) {
+ that.columns.push(column);
+ that.columns_by_name[column.name] = column;
+ };
+
+ that.create_column = function(spec) {
+ spec.facet = that;
+ var column = ipa_search_column(spec);
+ that.add_column(column);
+ return column;
+ };
+
+ function init() {
+ }
+
+ that.is_dirty = function() {
+ var filter = $.bbq.getState(that.entity_name + '-filter', true) || '';
+ return filter != that.filter;
+ };
+
+ function setup(container, unspecified) {
+
+ that.filter = $.bbq.getState(that.entity_name + '-filter', true) || '';
+
+ search_create(that.entity_name, that.columns, container);
+
+ ipa_make_button('ui-icon-plus', IPA.messages.button.add).
+ click(function() {
+ var entity = IPA.get_entity(that.entity_name);
+ if (entity) {
+ entity.add_dialog.open();
+ return false;
+ }
+
+ var dialog = ipa_entity_get_add_dialog(that.entity_name);
+ dialog.open();
+
+ return false;
+ }).
+ appendTo($('.search-controls', container));
+
+ search_load(container, that.filter);
+ }
+
+ if (spec.columns) {
+ for (var i=0; i<spec.columns.length; i++) {
+ var column = spec.columns[i];
+ column.facet = that;
+ that.add_column(column);
+ }
+ }
+
+ that.init();
+
+ return that;
+}
+
+
+function search_create(entity_name, columns, container) {
+
function find_on_click() {
var filter = $(this).prev('input[type=text]').val();
var state = {};
- state[obj_name + '-filter'] = filter;
+ state[entity_name + '-filter'] = filter;
$.bbq.pushState(state);
- };
+ }
function delete_on_click_outer() {
var delete_list = [];
var delete_dialog = $('<div></div>', {
- title: ipa_messages.button.delete,
- 'class': 'search-dialog-delete',
+ title: IPA.messages.button.delete,
+ 'class': 'search-dialog-delete'
});
function delete_on_click() {
- ipa_cmd('del', delete_list, {}, delete_on_win, null, obj_name);
+ ipa_cmd('del', delete_list, {}, delete_on_win, null, entity_name);
delete_dialog.dialog('close');
- };
+ }
function delete_on_win() {
for (var i = 0; i < delete_list.length; ++i) {
@@ -54,11 +151,11 @@ function search_create(obj_name, scl, container)
if (chk)
chk.closest('tr').remove();
}
- };
+ }
function cancel_on_click() {
delete_dialog.dialog('close');
- };
+ }
container.find('.search-selector').each(function () {
var jobj = $(this);
@@ -69,45 +166,52 @@ function search_create(obj_name, scl, container)
if (delete_list.length == 0)
return;
- delete_dialog.text(ipa_messages.search.delete_confirm);
+ delete_dialog.text(IPA.messages.search.delete_confirm);
delete_dialog.dialog({
modal: true,
buttons: {
'Delete': delete_on_click,
- 'Cancel': cancel_on_click,
- },
+ 'Cancel': cancel_on_click
+ }
});
- };
+ }
if (!container) {
alert('ERROR: search_create: Second argument "container" missing!');
- return;
+ return null;
}
- container.attr('title', obj_name);
+ container.attr('title', entity_name);
container.addClass('search-container');
- container.append('<div class="search-controls"></div>');
- var div = container.children().last();
- div.append('<span class="search-filter"></span>');
- var jobj = div.children().last();
- jobj.append('<input type="text" />');
- jobj.children().last().attr('name', 'search-' + obj_name + '-filter')
- ipa_make_button('ui-icon-search',ipa_messages.button.find).
- click(find_on_click).appendTo(jobj);
+ var search_controls = $('<div/>', {
+ 'class': 'search-controls'
+ }).appendTo(container);
+
+ var search_filter = $('<span/>', {
+ 'class': 'search-filter'
+ }).appendTo(search_controls);
+
+ var filter = $('<input/>', {
+ 'type': 'text',
+ 'name': 'search-' + entity_name + '-filter'
+ }).appendTo(search_filter);
- ipa_make_button('ui-icon-trash',ipa_messages.button.delete).
- click(delete_on_click_outer).appendTo(jobj);
+ ipa_make_button('ui-icon-search', IPA.messages.button.find).
+ click(find_on_click).appendTo(search_filter);
- div.append('<span class="search-buttons"></span>');
+ ipa_make_button('ui-icon-trash',IPA.messages.button.delete).
+ click(delete_on_click_outer).appendTo(search_filter);
+
+ search_controls.append('<span class="search-buttons"></span>');
var search_results = $('<div/>', {
- class: 'search-results'
+ 'class': 'search-results'
}).appendTo(container);
var search_table = $('<table/>', {
- class: 'search-table'
+ 'class': 'search-table'
}).appendTo(search_results);
search_table.append('<thead><tr></tr></thead>');
@@ -116,9 +220,9 @@ function search_create(obj_name, scl, container)
var tr = search_table.find('tr');
search_insert_checkbox_th(tr);
- for (var i = 0; i < scl.length; ++i) {
- var c = scl[i];
- search_insert_th(tr, obj_name, c[0], c[1], c[2]);
+ for (var i = 0; i < columns.length; ++i) {
+ var c = columns[i];
+ search_insert_th(tr, entity_name, c.name, c.label, c.setup);
}
}
@@ -144,7 +248,7 @@ function search_insert_checkbox_th(jobj)
var checkbox = $('<input />', {
type: 'checkbox',
- title: 'Select All',
+ title: 'Select All'
});
checkbox.click(select_all_on_click);
@@ -174,39 +278,42 @@ function search_insert_th(jobj, obj_name, attr, name, render_call)
jobj.append(th);
}
-function search_load(jobj, criteria, on_win, on_fail)
+function search_load(container, criteria, on_win, on_fail)
{
- var obj_name = jobj.attr('id');
+ var entity_name = container.attr('id');
function search_on_success(data, text_status, xhr) {
if (on_win)
on_win(data, text_status, xhr);
if (data.error)
return;
- search_display(obj_name, data);
- };
+ search_display(entity_name, data);
+ }
function search_on_error(xhr, text_status, error_thrown) {
if (on_fail)
on_fail(xhr, text_status, error_thrown);
- var search_results = $('.search-results', jobj);
+ var search_results = $('.search-results', container);
search_results.append('<p>Error: '+error_thrown.name+'</p>');
search_results.append('<p>URL: '+this.url+'</p>');
search_results.append('<p>'+error_thrown.message+'</p>');
}
ipa_cmd(
- 'find', [criteria], {all: true}, search_on_success, search_on_error, obj_name
+ 'find', [criteria], {all: true}, search_on_success, search_on_error, entity_name
);
}
function search_generate_tr(thead, tbody, entry_attrs)
{
var obj_name = tbody.closest('.search-container').attr('title');
- var pkey = ipa_objs[obj_name].primary_key;
+ var pkey = IPA.metadata[obj_name].primary_key;
var pkey_value = entry_attrs[pkey];
+ var entity = IPA.get_entity(obj_name);
+ var facet = entity ? entity.get_facet('search') : null;
+
tbody.append('<tr></tr>');
var tr = tbody.children().last();
search_generate_checkbox_td(tr, pkey_value);
@@ -217,11 +324,17 @@ function search_generate_tr(thead, tbody, entry_attrs)
var attr = jobj.attr('abbr');
var value = entry_attrs[attr];
+ var column = facet ? facet.get_column(attr) : null;
var render_call = window[jobj.attr('title')];
- if (typeof render_call == 'function') {
+
+ if (column && column.setup) {
+ column.setup(tr, attr, value, entry_attrs);
+
+ } else if (typeof render_call == 'function') {
render_call(tr, attr, value, entry_attrs);
+
} else
- search_generate_td(tr, attr, value);
+ search_generate_td(tr, attr, value, entry_attrs);
}
tbody.find('.search-a-pkey').click(function () {
@@ -242,7 +355,7 @@ function search_generate_checkbox_td(tr, pkey)
name: pkey,
title: pkey,
type: 'checkbox',
- 'class': 'search-selector',
+ 'class': 'search-selector'
});
var td = $('<td></td>');
@@ -253,7 +366,7 @@ function search_generate_checkbox_td(tr, pkey)
var _search_td_template = '<td title="A">V</td>';
var _search_a_pkey_template = '<a href="jslink" class="search-a-pkey">V</a>';
-function search_generate_td(tr, attr, value)
+function search_generate_td(tr, attr, value, entry_attrs)
{
var obj_name = tr.closest('.search-container').attr('title');
diff --git a/install/static/serverconfig.js b/install/static/serverconfig.js
index a73eb1349..cb61265ee 100644
--- a/install/static/serverconfig.js
+++ b/install/static/serverconfig.js
@@ -66,6 +66,9 @@ ipa_entity_set_details_definition('taskgroup', [
input({name:'description', label:'Description'})
]);
+ipa_entity_set_association_definition('taskgroup', {
+});
+
ipa_entity_set_association_definition('rolegroup', {
'rolegroup': { associator: BulkAssociator }
});
diff --git a/install/static/service.js b/install/static/service.js
index 620c1babe..21b2d0b92 100644
--- a/install/static/service.js
+++ b/install/static/service.js
@@ -20,34 +20,101 @@
/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
-ipa_entity_set_search_definition('service', [
- ['krbprincipalname', 'Principal', null],
- ['quick_links', 'Quick Links', ipa_entity_quick_links]
-]);
-
-ipa_entity_set_add_definition('service', [
- 'dialog-add-service', 'Add New Service', [
- ['krbprincipalname', 'Principal', service_add_krbprincipalname],
- ['service', 'Service', null],
- ['host', 'Host Name', null]
- ]
-]);
-
-ipa_entity_set_details_definition('service', [
- ipa_stanza({name:'details', label:'Service Details'}).
- input({name:'krbprincipalname',
- label:'Principal',
- setup:service_krbprincipalname_setup,
- load:service_krbprincipalname_load}).
- input({name:'service', label:'Service', load:service_service_load}).
- input({name:'host', label:'Host Name', load:service_host_load}),
- ipa_stanza({name:'provisioning', label:'Provisioning'}).
- input({name:'provisioning_status', label:'Status',
- load:service_provisioning_status_load}),
- ipa_stanza({name:'certificate', label:'Service Certificate'}).
- input({name:'certificate_status', label:'Status',
- load:service_usercertificate_load})
-]);
+function ipa_service() {
+
+ var that = ipa_entity({
+ 'name': 'service'
+ });
+
+ that.init = function() {
+ that.create_add_dialog({
+ 'name': 'add',
+ 'title': 'Add New Service',
+ 'init': ipa_service_add_init
+ });
+
+ that.create_search_facet({
+ 'name': 'search',
+ 'label': 'Search',
+ 'init': ipa_service_search_init
+ });
+
+ that.create_details_facet({
+ 'name': 'details',
+ 'label': 'Details',
+ 'init': ipa_service_details_init
+ });
+ };
+
+ that.init();
+
+ return that;
+}
+
+IPA.add_entity(ipa_service());
+
+function ipa_service_add_init() {
+
+ this.create_field({
+ name: 'krbprincipalname',
+ label: 'Principal',
+ setup: service_add_krbprincipalname
+ });
+
+ this.create_field({name:'service', label:'Service'});
+ this.create_field({name:'host', label:'Host Name'});
+}
+
+function ipa_service_search_init() {
+
+ this.create_column({name:'krbprincipalname', label:'Principal'});
+
+ this.create_column({
+ name: 'quick_links',
+ label: 'Quick Links',
+ setup: ipa_entity_quick_links
+ });
+}
+
+function ipa_service_details_init() {
+
+ var section = this.create_section({name:'details', label:'Service Details'});
+
+ section.create_field({
+ name: 'krbprincipalname',
+ label: 'Principal',
+ setup: service_krbprincipalname_setup,
+ load: service_krbprincipalname_load
+ });
+
+ section.create_field({
+ name: 'service',
+ label: 'Service',
+ load: service_service_load
+ });
+
+ section.create_field({
+ name: 'host',
+ label: 'Host Name',
+ load: service_host_load
+ });
+
+ section = this.create_section({name:'provisioning', label:'Provisioning'});
+
+ section.create_field({
+ name: 'provisioning_status',
+ label: 'Status',
+ load: service_provisioning_status_load
+ });
+
+ section = this.create_section({name:'certificate', label:'Service Certificate'});
+
+ section.create_field({
+ name: 'certificate_status',
+ label: 'Status',
+ load: service_usercertificate_load
+ });
+}
function service_add_krbprincipalname(add_dialog, mode) {
if (mode == IPA_ADD_UPDATE) {
diff --git a/install/static/test/details_tests.js b/install/static/test/details_tests.js
index 78d633634..4a60216ef 100644
--- a/install/static/test/details_tests.js
+++ b/install/static/test/details_tests.js
@@ -114,7 +114,10 @@ test("Testing details lifecycle:setup, load, save ().", function(){
input({name:'carlicense', label:'Car License'})
]);
- ipa_details_create(container, ipa_entity_details_list[obj_name]);
+ var entity = ipa_get_entity(obj_name);
+ var facet = entity.get_facet('details');
+ var sections = facet.get_sections();
+ ipa_details_create(container, sections);
var contact = container.find('dl#contact.entryattrs');
ok(contact);
@@ -126,10 +129,10 @@ test("Testing details lifecycle:setup, load, save ().", function(){
same('initials',dts[5].title);
//TODO extract into Fixture
- ipa_ajax_options["async"] = false;
- $.ajaxSetup(ipa_ajax_options);
- ipa_json_url = './data';
- ipa_use_static_files = true;
+ IPA.ajax_options.async = false;
+ $.ajaxSetup(IPA.ajax_options);
+ IPA.json_url = './data';
+ IPA.use_static_files = true;
container.attr('id','user');
@@ -139,7 +142,7 @@ test("Testing details lifecycle:setup, load, save ().", function(){
ipa_details_load(container,
'kfrog',
function(){load_success_called = true},
- function(){load_failure_called = true})
+ function(){load_failure_called = true});
ok (load_success_called,'load success called');
ok (!load_failure_called,'load failure not called');
@@ -151,13 +154,13 @@ test("Testing details lifecycle:setup, load, save ().", function(){
ipa_details_load(container,
'kfrog',
function(){load_success_called = true},
- function(){load_failure_called = true})
+ function(){load_failure_called = true});
ipa_details_update(container,
'kfrog',
function(){update_success_called = true},
- function(){update_failure_called = true})
+ function(){update_failure_called = true});
ok (update_success_called,'update success called');
ok (!update_failure_called,'update failure not called');
diff --git a/install/static/test/entity_tests.html b/install/static/test/entity_tests.html
index b8da0f444..0f7962952 100644
--- a/install/static/test/entity_tests.html
+++ b/install/static/test/entity_tests.html
@@ -5,10 +5,12 @@
<link rel="stylesheet" href="qunit.css" type="text/css" media="screen">
<script type="text/javascript" src="qunit.js"></script>
<script type="text/javascript" src="../jquery.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="../details.js"></script>
<script type="text/javascript" src="../search.js"></script>
<script type="text/javascript" src="../add.js"></script>
+ <script type="text/javascript" src="../associate.js"></script>
<script type="text/javascript" src="../navigation.js"></script>
<script type="text/javascript" src="../entity.js"></script>
<script type="text/javascript" src="entity_tests.js"></script>
diff --git a/install/static/test/entity_tests.js b/install/static/test/entity_tests.js
index 09967c2c5..cc43b8798 100644
--- a/install/static/test/entity_tests.js
+++ b/install/static/test/entity_tests.js
@@ -18,110 +18,102 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-test("Testing ipa_entity_set_search_definition().", function() {
+test('Testing ipa_entity_set_search_definition().', function() {
var uid_callback = function() {
return true;
};
- ipa_entity_set_search_definition("user", [
- ["uid", "Login", uid_callback],
+ ipa_entity_set_search_definition('user', [
+ ['uid', 'Login', uid_callback]
]);
- var list = ipa_entity_search_list["user"];
+ var facet = ipa_entity_get_search_facet('user');
ok(
- list,
- "ipa_entity_search_list[\"user\"] is not null"
+ facet,
+ 'ipa_entity_get_search_facet(\'user\') is not null'
);
- var attr = list[0];
+ var column = facet.get_columns()[0];
ok(
- attr,
- "ipa_entity_search_list[\"user\"][0] is not null"
+ column,
+ 'column is not null'
);
equals(
- attr[0], "uid",
- "ipa_entity_search_list[\"user\"][0][0]"
+ column.name, 'uid',
+ 'column.name'
);
equals(
- attr[1], "Login",
- "ipa_entity_search_list[\"user\"][0][1]"
+ column.label, 'Login',
+ 'column.label'
);
- var callback = attr[2];
ok(
- callback,
- "ipa_entity_search_list[\"user\"][0][2] not null"
+ column.setup,
+ 'column.setup not null'
);
ok(
- callback(),
- "ipa_entity_search_list[\"user\"][0][2]() works"
+ column.setup(),
+ 'column.setup() works'
);
});
-test("Testing ipa_entity_generate_views().", function() {
+test('Testing ipa_entity_generate_views().', function() {
- ipa_ajax_options["async"] = false;
+ var orig_show_page = IPA.show_page;
+ IPA.ajax_options.async = false;
- ipa_init(
- "data",
+ IPA.init(
+ 'data',
true,
function(data, text_status, xhr) {
- ok(true, "ipa_init() succeeded.");
+ ok(true, 'ipa_init() succeeded.');
},
function(xhr, text_status, error_thrown) {
- ok(false, "ipa_init() failed: "+error_thrown);
+ ok(false, 'ipa_init() failed: '+error_thrown);
}
);
- var container = $("<div/>");
+ var entity = ipa_entity({
+ 'name': 'user'
+ });
+
+ IPA.add_entity(entity);
+
+ var facet = entity.create_association_facet({
+ 'name': 'associate'
+ });
+
+ var container = $('<div/>');
var counter = 0;
- var callback = function() {
+ IPA.show_page = function(entity_name, facet_name, other_entity) {
counter++;
};
- ipa_entity_generate_views("user", container, callback);
+ facet.setup_views(container);
var list = container.children();
- var facets = list.children();
-
- equals(
- facets.length, 6,
- "Checking number of facets"
- )
-
- var search = facets.first();
+ var views = list.children();
equals(
- search.attr("title"), "search",
- "Checking the search facet"
- )
-
- search.click();
-
- var details = search.next();
-
- equals(
- details.attr("title"), "details",
- "Checking the details facet"
- )
-
- details.click();
+ views.length, 4,
+ 'Checking number of views'
+ );
- var facet = details.next();
- var attribute_members = ipa_objs["user"].attribute_members;
+ facet = views.first();
+ 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.attr('title'), object,
+ 'Checking the '+object+' facet'
);
facet.click();
@@ -131,12 +123,14 @@ test("Testing ipa_entity_generate_views().", function() {
}
equals(
- counter, 6,
- "Checking callback invocations"
+ counter, 4,
+ 'Checking callback invocations'
);
+
+ IPA.show_page = orig_show_page;
});
-test("Testing ipa_entity_quick_links().", function() {
+test('Testing ipa_entity_quick_links().', function() {
var orig_push_state = nav_push_state;
var orig_get_state = nav_get_state;
@@ -154,37 +148,37 @@ test("Testing ipa_entity_quick_links().", function() {
delete state[key];
};
- ipa_ajax_options["async"] = false;
+ IPA.ajax_options.async = false;
- ipa_init(
- "data",
+ IPA.init(
+ 'data',
true,
function(data, text_status, xhr) {
- ok(true, "ipa_init() succeeded.");
+ ok(true, 'ipa_init() succeeded.');
},
function(xhr, text_status, error_thrown) {
- ok(false, "ipa_init() failed: "+error_thrown);
+ ok(false, 'ipa_init() failed: '+error_thrown);
}
);
- var obj_name = "user";
- var pkey = ipa_objs[obj_name].primary_key;
- var pkey_value = "test";
+ var obj_name = 'user';
+ var pkey = IPA.metadata[obj_name].primary_key;
+ var pkey_value = 'test';
var entry_attrs = {};
entry_attrs[pkey] = [pkey_value];
- var container = $("<div/>", {
+ var container = $('<div/>', {
title: obj_name,
- class: "search-container"
+ class: 'search-container'
});
var search_table = $('<table/>', {
class: 'search-table'
}).appendTo(container);
- var tbody = $("<tbody/>").appendTo(search_table);
- var tr = $("<tr/>").appendTo(tbody);
+ var tbody = $('<tbody/>').appendTo(search_table);
+ var tr = $('<tr/>').appendTo(tbody);
ipa_entity_quick_links(tr, null, null, entry_attrs);
@@ -192,23 +186,23 @@ test("Testing ipa_entity_quick_links().", function() {
var link = td.children().first();
equals(
- link.attr("href"), "#details",
- "Checking details link"
+ link.attr('href'), '#details',
+ 'Checking details link'
);
link.click();
equals(
- state[obj_name+"-facet"], "details",
- "Checking state[\""+obj_name+"-facet\"]"
+ state[obj_name+'-facet'], 'details',
+ 'Checking state[\''+obj_name+'-facet\']'
);
equals(
- state[obj_name+"-pkey"], pkey_value,
- "Checking state[\""+obj_name+"-pkey\"]"
+ state[obj_name+'-pkey'], pkey_value,
+ 'Checking state[\''+obj_name+'-pkey\']'
);
- var attribute_members = ipa_objs[obj_name].attribute_members;
+ var attribute_members = IPA.metadata[obj_name].attribute_members;
for (attr_name in attribute_members) {
var objs = attribute_members[attr_name];
for (var i = 0; i < objs.length; ++i) {
@@ -217,25 +211,25 @@ test("Testing ipa_entity_quick_links().", function() {
link = link.next();
equals(
- link.attr("href"), "#"+m,
- "Checking "+m+" link"
+ link.attr('href'), '#'+m,
+ 'Checking '+m+' link'
);
link.click();
equals(
- state[obj_name+"-facet"], "associate",
- "Checking state[\""+obj_name+"-facet\"]"
+ state[obj_name+'-facet'], 'associate',
+ 'Checking state[\''+obj_name+'-facet\']'
);
equals(
- state[obj_name+"-enroll"], m,
- "Checking state[\""+obj_name+"-enroll\"]"
+ state[obj_name+'-enroll'], m,
+ 'Checking state[\''+obj_name+'-enroll\']'
);
equals(
- state[obj_name+"-pkey"], pkey_value,
- "Checking state[\""+obj_name+"-pkey\"]"
+ state[obj_name+'-pkey'], pkey_value,
+ 'Checking state[\''+obj_name+'-pkey\']'
);
}
}
diff --git a/install/static/test/ipa_tests.js b/install/static/test/ipa_tests.js
index 58315585d..7124aa764 100644
--- a/install/static/test/ipa_tests.js
+++ b/install/static/test/ipa_tests.js
@@ -22,9 +22,9 @@ test("Testing ipa_init().", function() {
expect(1);
- ipa_ajax_options["async"] = false;
+ IPA.ajax_options.async = false;
- ipa_init(
+ IPA.init(
"data",
true,
function(data, text_status, xhr) {
@@ -153,7 +153,7 @@ test("Testing successful ipa_cmd().", function() {
"Checking ajax invocation counter"
);
- var dialog = ipa_dialog.parent('.ui-dialog');
+ var dialog = IPA.error_dialog.parent('.ui-dialog');
ok(
!dialog.length,
@@ -223,7 +223,7 @@ test("Testing unsuccessful ipa_cmd().", function() {
ipa_cmd(method, args, options, success_handler, error_handler, object);
- var dialog = ipa_dialog.parent('.ui-dialog');
+ var dialog = IPA.error_dialog.parent('.ui-dialog');
equals(
ajax_counter, 1,
@@ -231,7 +231,7 @@ test("Testing unsuccessful ipa_cmd().", function() {
);
ok(
- dialog.length == 1 && ipa_dialog.dialog('isOpen'),
+ dialog.length == 1 && IPA.error_dialog.dialog('isOpen'),
"The dialog box is created and open."
);
@@ -256,7 +256,7 @@ test("Testing unsuccessful ipa_cmd().", function() {
// search the retry button from the beginning again because the dialog
// has been recreated
- dialog = ipa_dialog.parent('.ui-dialog');
+ dialog = IPA.error_dialog.parent('.ui-dialog');
retry = $('button', dialog).first();
retry.trigger('click');
@@ -272,7 +272,7 @@ test("Testing unsuccessful ipa_cmd().", function() {
// search the cancel button from the beginning because the dialog has
// been recreated
- dialog = ipa_dialog.parent('.ui-dialog');
+ dialog = IPA.error_dialog.parent('.ui-dialog');
var cancel = $('button', dialog).first().next();
cancel.trigger('click');
@@ -282,7 +282,7 @@ test("Testing unsuccessful ipa_cmd().", function() {
);
ok(
- !ipa_dialog.dialog('isOpen'),
+ !IPA.error_dialog.dialog('isOpen'),
"After cancel, the dialog box is closed."
);
diff --git a/install/static/test/navigation_tests.js b/install/static/test/navigation_tests.js
index 318ac664d..68d4694f6 100644
--- a/install/static/test/navigation_tests.js
+++ b/install/static/test/navigation_tests.js
@@ -40,7 +40,7 @@ test("Testing nav_create().", function() {
same(jobj[0].nodeName,'DIV','group Div');
}
- ipa_objs= {};
+ IPA.metadata = {};
var navigation = $('<div id="navigation"/>').appendTo(document.body);
var user_mock_called = false;
var group_mock_called = false;
diff --git a/install/static/user.js b/install/static/user.js
index 926cdf00a..3ac828fe1 100644
--- a/install/static/user.js
+++ b/install/static/user.js
@@ -90,12 +90,12 @@ function toggle_on_click(obj)
if (val == 'Active') {
ipa_cmd(
'lock', [qs['pkey']], {}, on_lock_win, on_fail,
- ipa_objs['user']['name']
+ IPA.metadata['user']['name']
);
} else {
ipa_cmd(
'unlock', [qs['pkey']], {}, on_lock_win, on_fail,
- ipa_objs['user']['name']
+ IPA.metadata['user']['name']
);
}
return (false);
diff --git a/install/static/webui.js b/install/static/webui.js
index 60ccc25e6..42c559dce 100644
--- a/install/static/webui.js
+++ b/install/static/webui.js
@@ -59,41 +59,37 @@ var ipa_whoami_pkey;
/* main (document onready event handler) */
$(function() {
-
function whoami_on_win(data, text_status, xhr) {
$(window).bind('hashchange', window_hashchange);
- if (!data.error){
- var whoami = data.result.result[0];
- ipa_whoami_pkey=whoami.uid[0];
- $('#loggedinas').find('strong').text(whoami.krbprincipalname[0]);
- $('#loggedinas a').fragment(
- {'user-facet':'details', 'user-pkey':ipa_whoami_pkey},2);
-
- var navigation = $('#navigation');
- if (whoami.hasOwnProperty('memberof_rolegroup') &&
- whoami.memberof_rolegroup.length > 0){
- nav_create(admin_tab_set, navigation, 'tabs');
+ var whoami = data.result.result[0];
+ ipa_whoami_pkey=whoami.uid[0];
+ $('#loggedinas').find('strong').text(whoami.krbprincipalname[0]);
+ $('#loggedinas a').fragment(
+ {'user-facet':'details', 'user-pkey':ipa_whoami_pkey},2);
- }else{
- nav_create(self_serv_tab_set, navigation, 'tabs');
+ var navigation = $('#navigation');
- var state = {'user-pkey':ipa_whoami_pkey ,
- 'user-facet': jQuery.bbq.getState('user-facet') ||
- 'details'};
- $.bbq.pushState(state);
- }
+ if (whoami.hasOwnProperty('memberof_rolegroup') &&
+ whoami.memberof_rolegroup.length > 0){
+ nav_create(admin_tab_set, navigation, 'tabs');
+ } else {
+ nav_create(self_serv_tab_set, navigation, 'tabs');
- $('#login_header').html(ipa_messages.login.header);
- }else{
- alert("Unable to find prinicpal for logged in user");
+ var state = {'user-pkey':ipa_whoami_pkey ,
+ 'user-facet': jQuery.bbq.getState('user-facet') ||
+ 'details'};
+ $.bbq.pushState(state);
}
- };
+
+
+ $('#login_header').html(IPA.messages.login.header);
+ }
function init_on_win(data, text_status, xhr) {
ipa_cmd('user_find', [], {"whoami":"true","all":"true"}, whoami_on_win, init_on_error, null);
- };
+ }
function init_on_error(xhr, text_status, error_thrown) {
var navigation = $('#navigation').empty();
@@ -102,7 +98,7 @@ $(function() {
navigation.append('<p>'+error_thrown.message+'</p>');
}
- ipa_init(null, null, init_on_win, init_on_error);
+ IPA.init(null, null, init_on_win, init_on_error);
});
/* main loop (hashchange event handler) */