summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Young <ayoung@redhat.com>2011-03-18 16:43:54 -0400
committerAdam Young <ayoung@redhat.com>2011-03-31 17:29:33 -0400
commit4270e26adb56b6d1b7a9e80433581b82519d9eec (patch)
treedcb0982b741d92c0be37e262e70b7cd0969e06d0
parentdb91321fd2c94680361ae8196ba9227615f92c39 (diff)
downloadfreeipa-4270e26adb56b6d1b7a9e80433581b82519d9eec.tar.gz
freeipa-4270e26adb56b6d1b7a9e80433581b82519d9eec.tar.xz
freeipa-4270e26adb56b6d1b7a9e80433581b82519d9eec.zip
define entities using builder and more declarative syntax
merged hbac and sudo in to single files associaton facet and table supports linking
-rw-r--r--install/ui/Makefile.am10
-rw-r--r--install/ui/aci.js397
-rw-r--r--install/ui/associate.js62
-rw-r--r--install/ui/automount.js45
-rw-r--r--install/ui/details.js29
-rw-r--r--install/ui/develop.js7
-rw-r--r--install/ui/dialog.js9
-rw-r--r--install/ui/dns.js531
-rw-r--r--install/ui/entity.js251
-rw-r--r--install/ui/group.js168
-rw-r--r--install/ui/hbac.js (renamed from install/ui/hbacrule.js)210
-rw-r--r--install/ui/hbacsvc.js116
-rw-r--r--install/ui/hbacsvcgroup.js188
-rw-r--r--install/ui/host.js241
-rw-r--r--install/ui/hostgroup.js58
-rw-r--r--install/ui/index.html10
-rw-r--r--install/ui/jsl.conf11
-rw-r--r--install/ui/netgroup.js62
-rw-r--r--install/ui/policy.js659
-rw-r--r--install/ui/search.js3
-rw-r--r--install/ui/serverconfig.js42
-rw-r--r--install/ui/service.js101
-rw-r--r--install/ui/sudo.js (renamed from install/ui/sudorule.js)392
-rw-r--r--install/ui/sudocmd.js271
-rw-r--r--install/ui/sudocmdgroup.js187
-rw-r--r--install/ui/test/details_tests.js99
-rw-r--r--install/ui/test/entity_tests.js169
-rw-r--r--install/ui/user.js132
-rw-r--r--install/ui/webui.js1
29 files changed, 1769 insertions, 2692 deletions
diff --git a/install/ui/Makefile.am b/install/ui/Makefile.am
index e8c11c25a..f9c82e150 100644
--- a/install/ui/Makefile.am
+++ b/install/ui/Makefile.am
@@ -11,10 +11,12 @@ app_DATA = \
aci.js \
add.js \
associate.js \
+ automount.js \
caution.png \
centered-bg.png \
check.png \
dialog.js \
+ dns.js \
ipa_logo_180x50.png \
ipa.js \
ipa.css \
@@ -25,9 +27,7 @@ app_DATA = \
jquery-ui.css \
certificate.js \
group.js \
- hbacrule.js \
- hbacsvc.js \
- hbacsvcgroup.js \
+ hbac.js \
host.js \
hostgroup.js \
index.html \
@@ -36,9 +36,7 @@ app_DATA = \
netgroup.js \
service.js \
serverconfig.js \
- sudorule.js \
- sudocmd.js \
- sudocmdgroup.js \
+ sudo.js \
policy.js \
search.js \
rule.js \
diff --git a/install/ui/aci.js b/install/ui/aci.js
index bb3bcbea4..d51741245 100644
--- a/install/ui/aci.js
+++ b/install/ui/aci.js
@@ -23,6 +23,170 @@
/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
+IPA.entity_factories.permission = function() {
+
+ return IPA.entity_builder().
+ entity('permission').
+ search_facet({
+ columns:['cn'],
+ add_fields:[
+ 'cn',
+ {
+ factory:IPA.rights_widget,
+ name: 'permissions',
+ join: true, undo: false
+ },
+ {
+ factory: IPA.target_section,
+ section: 'target',
+ label: IPA.messages.objects.permission.target,
+ undo: false
+ }]}).
+ details_facet([
+ {
+ section:'identity',
+ fields: [{
+ factory: IPA.text_widget,
+ name: 'cn',
+ read_only: true
+ }]
+ },
+ {
+ section:'rights',
+ factory:IPA.rights_section
+ },
+ {
+ section:'target',
+ factory:IPA.target_section,
+ label: IPA.messages.objects.permission.target
+ }]).
+ standard_associations().
+ build();
+};
+
+
+IPA.entity_factories.privilege = function() {
+ return IPA.entity_builder().
+ entity('privilege').
+ search_facet({
+ columns:['cn','description'],
+ add_fields:['cn', 'description']}).
+ details_facet([
+ {
+ section:'identity',
+ label: IPA.messages.details.identity,
+ fields:['cn','description']
+ }]).
+ association_facet({
+ name: 'member_role',
+ add_method: 'add_privilege',
+ remove_method: 'remove_privilege',
+ associator: IPA.serial_associator
+ }).
+ association_facet({
+ name: 'memberof_permission',
+ add_method: 'add_permission',
+ remove_method: 'remove_permission'
+ }).
+ standard_associations().
+ build();
+
+};
+
+
+IPA.entity_factories.role = function() {
+ return IPA.entity_builder().
+ entity('role').
+ search_facet({
+ columns:['cn','description'],
+ add_fields:['cn', 'description']}).
+ details_facet([
+ {
+ section:'identity',
+ label:IPA.messages.objects.role.identity,
+ fields:['cn','description']}]).
+ association_facet({
+ name: 'memberof_privilege',
+ add_method: 'add_privilege',
+ remove_method: 'remove_privilege'
+ }).
+ standard_associations().
+ build();
+};
+
+
+IPA.entity_factories.selfservice = function() {
+ return IPA.entity_builder().
+ entity('selfservice').
+ search_facet({
+ columns:['aciname'],
+ add_fields:[
+ 'aciname',
+ {factory:IPA.attributes_widget,
+ object_type:'user',
+ name:'attrs',
+ undo: false
+ }]}).
+ details_facet([
+ {
+ section:'general',
+ label: IPA.messages.details.general,
+ fields: [
+ 'aciname',
+ {
+ factory:IPA.attributes_widget,
+ object_type:'user',
+ name:'attrs'
+ }]}]).
+ build();
+};
+
+
+IPA.entity_factories.delegation = function() {
+ return IPA.entity_builder().
+ entity('delegation').
+ search_facet({
+ columns:['aciname'],
+ add_fields:[
+ 'aciname',
+ {
+ factory:IPA.entity_select_widget,
+ name: 'group', entity: 'group', undo: false
+ },
+ {
+ factory:IPA.entity_select_widget,
+ name: 'memberof', entity: 'group',
+ join: true, undo: false
+ },
+ {
+ factory:IPA.attributes_widget,
+ name: 'attrs', object_type: 'user',
+ join: true, undo: false
+ }]}).
+ details_facet([
+ {
+ section:'general',
+ label: IPA.messages.details.general,
+ fields:[
+ 'aciname',
+ {
+ factory:IPA.entity_select_widget,
+ name: 'group', entity: 'group'
+ },
+ {
+ factory:IPA.entity_select_widget,
+ name: 'memberof', entity: 'group',
+ join: true
+ },
+ {
+ factory:IPA.attributes_widget,
+ name: 'attrs', object_type: 'user',
+ join: true
+ }]}]).
+ standard_associations().
+ build();
+};
+
IPA.attributes_widget = function(spec) {
@@ -516,238 +680,5 @@ IPA.permission_details_facet = function(spec) {
var that = IPA.details_facet(spec);
- that.refresh = function() {
-
- var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
-
- var command = IPA.command({
- 'name': that.entity_name+'_show_'+pkey,
- 'method': that.entity_name+'_show',
- 'args': [pkey],
- 'options': { 'all': true, 'rights': true }
- });
-
- command.on_success = function(data, text_status, xhr) {
- that.load(data.result.result);
- };
-
- command.on_error = function(xhr, text_status, error_thrown) {
- var details = $('.details', that.container).empty();
- details.append('<p>Error: '+error_thrown.name+'</p>');
- details.append('<p>'+error_thrown.title+'</p>');
- details.append('<p>'+error_thrown.message+'</p>');
- };
-
- command.execute();
- };
-
- return that;
-};
-
-IPA.entity_factories.permission = function() {
-
- return IPA.entity({
- 'name': 'permission'
- }).
- facet(
- IPA.search_facet().
- column({name:'cn'}).
- dialog(
- IPA.add_dialog({
- name: 'add',
- title: IPA.messages.objects.permission.add,
- width: '700px'
- }).
- field(IPA.text_widget({name: 'cn', undo: false})).
- field(IPA.rights_widget({
- name: 'permissions',
- join: true, undo: false})).
- section(IPA.target_section({
- name: 'target',
- label: IPA.messages.objects.permission.target,
- undo: false
- })))).
- facet(
- IPA.permission_details_facet({ name: 'details' }).
- section(
- IPA.stanza({
- name:'identity',
- label: IPA.messages.objects.permission.identity
- }).
- input({name: 'cn', read_only: true})).
- section(IPA.rights_section()).
- section(IPA.target_section({
- name: 'target',
- label: IPA.messages.objects.permission.target
- }))).
- standard_associations();
-};
-
-
-IPA.entity_factories.privilege = function() {
- var that = IPA.entity({
- 'name': 'privilege'
- }).
- facet(
- IPA.search_facet().
- column({name:'cn'}).
- column({name:'description'}).
- dialog(
- IPA.add_dialog({
- name: 'add',
- title: IPA.messages.objects.privilege.add
- }).
- field(IPA.text_widget({ name: 'cn', undo: false})).
- field(IPA.text_widget(
- { name: 'description', undo: false})))).
- facet(
- IPA.details_facet({name:'details'}).
- section(
- IPA.stanza({
- name:'identity',
- label: IPA.messages.objects.privilege.identity
- }).
- input({name: 'cn'}).
- input({name: 'description'}))).
- facet(
- IPA.association_facet({
- name: 'member_role',
- add_method: 'add_privilege',
- remove_method: 'remove_privilege',
- associator: IPA.serial_associator
- })).
- facet(
- IPA.association_facet({
- name: 'memberof_permission',
- add_method: 'add_permission',
- remove_method: 'remove_permission'
- })).
-
- standard_associations();
-
return that;
};
-
-
-IPA.entity_factories.role = function() {
- return IPA.entity({
- 'name': 'role'
- }).
- facet(
- IPA.search_facet().
- column({name:'cn'}).
- column({name:'description'}).
- dialog(
- IPA.add_dialog({
- name: 'add',
- title: IPA.messages.objects.role.add
- }).
- field(IPA.text_widget({ name: 'cn', undo: false})).
- field(IPA.text_widget(
- { name: 'description', undo: false})))).
- facet(
- IPA.details_facet({name:'details'}).
- section(
- IPA.stanza({
- name:'identity',
- label:IPA.messages.objects.role.identity
- }).
- input({name: 'cn'}).
- input({name: 'description'}))).
- facet(
- IPA.association_facet({
- name: 'memberof_privilege',
- add_method: 'add_privilege',
- remove_method: 'remove_privilege'
- })).
-
- standard_associations();
-};
-
-
-IPA.entity_factories.selfservice = function() {
- return IPA.entity({
- 'name': 'selfservice'
- }).
- facet(
- IPA.search_facet().
- column({name:'aciname'}).
- dialog(
- IPA.add_dialog({
- name: 'add',
- title: IPA.messages.objects.selfservice.add
- }).
- field(IPA.text_widget({ name: 'aciname', undo: false})).
- field(IPA.attributes_widget({
- object_type:'user',
- name:'attrs', undo: false
- })))).
- facet(
- IPA.details_facet({'name':'details'}).
- section(
- IPA.stanza({
- name: 'general',
- label: IPA.messages.details.general
- }).
- input({name:'aciname'}).
- custom_input(IPA.attributes_widget({
- object_type:'user',
- name:'attrs'
- }))));
-};
-
-
-IPA.entity_factories.delegation = function() {
- var that = IPA.entity({
- 'name': 'delegation'
- }).
- facet(
- IPA.search_facet().
- column({name:'aciname'}).
- dialog(
- IPA.add_dialog({
- name: 'add',
- title: IPA.messages.objects.delegation.add,
- width: '700px'
- }).
- field(IPA.text_widget({
- name: 'aciname', undo: false
- })).
- field(IPA.entity_select_widget({
- name: 'group', entity: 'group', undo: false
- })).
- field(IPA.entity_select_widget({
- name: 'memberof', entity: 'group',
- join: true, undo: false
- })).
- field(IPA.attributes_widget({
- name: 'attrs', object_type: 'user',
- join: true, undo: false
- })))).
- facet(
- IPA.details_facet().
- section(
- IPA.stanza({
- name: 'general',
- label: IPA.messages.details.general
- }).
- input({name:'aciname'}).
- custom_input(IPA.entity_select_widget({
- name:'group', entity:'group'
- })).
- custom_input(IPA.entity_select_widget({
- name:'memberof',
- entity:'group', join: true
- })).
- custom_input(IPA.rights_widget({
- name: 'permissions',
- direction: 'horizontal', join: true
- })).
- custom_input(IPA.attributes_widget({
- name:'attrs', object_type:'user',
- join: true
- })))).
- standard_associations();
- return that;
-
-};
diff --git a/install/ui/associate.js b/install/ui/associate.js
index e8cb4d0b5..050d8f6db 100644
--- a/install/ui/associate.js
+++ b/install/ui/associate.js
@@ -270,6 +270,26 @@ IPA.association_config = function (spec) {
};
+IPA.association_pkey_setup = function (container, record) {
+ container.empty();
+ var value = record[this.name];
+ value = value ? value.toString() : '';
+ $('<a/>', {
+ 'href': '#'+value,
+ 'html': value,
+ 'click': function (value) {
+ return function() {
+ var state = IPA.tab_state(this.other_entity);
+ state[this.other_entity + '-facet'] = 'details';
+ state[this.other_entity + '-pkey'] = value;
+ $.bbq.pushState(state);
+ return false;
+ };
+ }(value)
+ }).appendTo(container);
+ };
+
+
IPA.association_table_widget = function (spec) {
spec = spec || {};
@@ -301,7 +321,28 @@ IPA.association_table_widget = function (spec) {
return column;
};
- that.init = function() {
+ that.super_create_column = that.create_column;
+
+ that.create_column = function(spec){
+ if (spec.link_entity){
+ spec.setup = IPA.association_pkey_setup;
+ }
+ return that.super_create_column(spec);
+ };
+ /*this is duplicated in the facet... should be unified*/
+ var i;
+ if (spec.columns){
+ for (i = 0; i < spec.columns.length; i+= 1){
+ that.create_column(spec.columns[i]);
+ }
+ }
+ if (spec.adder_columns){
+ for (i = 0; i < spec.adder_columns.length; i+= 1){
+ that.create_adder_column(spec.adder_columns[i]);
+ }
+ }
+
+ that.create = function(container) {
var entity = IPA.get_entity(that.entity_name);
var column;
@@ -326,9 +367,6 @@ IPA.association_table_widget = function (spec) {
}
that.table_init();
- };
-
- that.create = function(container) {
that.table_create(container);
@@ -634,6 +672,7 @@ IPA.association_facet = function (spec) {
that.adder_columns = [];
that.adder_columns_by_name = {};
+
that.get_column = function(name) {
return that.columns_by_name[name];
};
@@ -645,6 +684,9 @@ IPA.association_facet = function (spec) {
that.create_column = function(spec) {
var column = IPA.column(spec);
+ if (spec.link_entity){
+ column.setup = IPA.association_pkey_setup;
+ }
that.add_column(column);
return column;
};
@@ -664,6 +706,18 @@ IPA.association_facet = function (spec) {
return column;
};
+ var i;
+ if (spec.columns){
+ for (i = 0; i < spec.columns.length; i+= 1){
+ that.create_column(spec.columns[i]);
+ }
+ }
+ if (spec.adder_columns){
+ for (i = 0; i < spec.adder_columns.length; i+= 1){
+ that.create_adder_column(spec.adder_columns[i]);
+ }
+ }
+
that.init = function() {
that.facet_init();
diff --git a/install/ui/automount.js b/install/ui/automount.js
new file mode 100644
index 000000000..a0da4c8c1
--- /dev/null
+++ b/install/ui/automount.js
@@ -0,0 +1,45 @@
+/*jsl:import ipa.js */
+/*jsl:import search.js */
+
+/* Authors:
+ * Adam Young <ayoung@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, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
+
+
+/**Automount*/
+
+IPA.entity_factories.automountlocation = function() {
+ return IPA.entity_builder().
+ entity('automountlocation').
+ search_facet({
+ columns:['cn'],
+ add_fields:['cn']
+ }).
+ details_facet([{
+ section:'identity',
+ label: IPA.messages.objects.automountlocation.identity,
+ fields:['cn']
+ }]).
+ standard_associations().
+ build();
+};
+
+
diff --git a/install/ui/details.js b/install/ui/details.js
index 895c19aa1..1dccb830e 100644
--- a/install/ui/details.js
+++ b/install/ui/details.js
@@ -78,6 +78,7 @@ IPA.details_section = function(spec) {
};
that.multivalued_text = function(spec) {
+ spec.entity_name = that.entity_name;
var field = IPA.multivalued_text_widget(spec);
that.add_field(field);
return that;
@@ -256,29 +257,6 @@ IPA.details_list_section = function(spec) {
return that;
};
-
-/* shorthand notation used for declarative definitions of details pages */
-IPA.stanza = function(spec) {
-
- spec = spec || {};
-
- var that = IPA.details_list_section(spec);
-
- // This is to allow declarative style programming for details
- that.input = function(spec) {
- that.text(spec);
- return that;
- };
-
- that.custom_input = function(input) {
- that.add_field(input);
- return that;
- };
-
- return that;
-};
-
-
IPA.details_facet = function(spec) {
spec = spec || {};
@@ -600,6 +578,11 @@ IPA.details_refresh = function() {
args: [],
options: { 'all': true, 'rights': true }
});
+
+ if (IPA.refresh_devel_hook){
+ IPA.refresh_devel_hook(that.entity_name,command,that.pkey);
+ }
+
if (that.pkey){
command.args = [that.pkey];
diff --git a/install/ui/develop.js b/install/ui/develop.js
index 462253500..5095905d7 100644
--- a/install/ui/develop.js
+++ b/install/ui/develop.js
@@ -3,4 +3,11 @@
if (window.location.protocol == 'file:') {
IPA.json_url = "test/data";
IPA.use_static_files = true;
+
+ IPA.refresh_devel_hook = function(entity_name,command,pkey){
+ if ((entity_name === 'host')||(entity_name === 'permission')){
+ command.name = entity_name+'_show_'+pkey;
+ command.method = entity_name+'_show';
+ }
+ };
}
diff --git a/install/ui/dialog.js b/install/ui/dialog.js
index 1b2f3192a..17e78af6d 100644
--- a/install/ui/dialog.js
+++ b/install/ui/dialog.js
@@ -79,6 +79,15 @@ IPA.dialog = function(spec) {
return that;
};
+ that.text = function(name){
+ that.field(IPA.text_widget({
+ name: name,
+ undo: false,
+ entity_name : that.entity_name
+ }));
+ return that;
+ };
+
that.add_section = function(section) {
that.sections.push(section);
return that;
diff --git a/install/ui/dns.js b/install/ui/dns.js
new file mode 100644
index 000000000..e1fce532e
--- /dev/null
+++ b/install/ui/dns.js
@@ -0,0 +1,531 @@
+/*jsl:import ipa.js */
+/*jsl:import search.js */
+
+/* Authors:
+ * Adam Young <ayoung@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, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
+
+/* DNS */
+IPA.entity_factories.dnszone = function() {
+
+ return IPA.entity_builder().
+ entity('dnszone').
+ search_facet({
+ columns:['idnsname'],
+ add_fields: ['idnsname','idnssoamname','idnssoarname']
+ }).
+ details_facet([{
+ section:'identity',
+ fields:[
+ 'idnsname',
+ 'idnszoneactive',
+ 'idnssoamname',
+ 'idnssoarname',
+ 'idnssoaserial',
+ 'idnssoarefresh',
+ 'idnssoaretry',
+ 'idnssoaexpire',
+ 'idnssoaminimum',
+ 'dnsttl',
+ 'dnsclass',
+ 'idnsallowdynupdate',
+ 'idnsupdatepolicy']}]).
+ facet(IPA.records_facet({
+ 'name': 'records',
+ 'label': IPA.metadata.objects.dnsrecord.label
+ })).
+ standard_associations().
+ build();
+};
+
+
+IPA.records_facet = function (spec){
+
+ 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',
+ 'key', 'kx', 'loc', 'naptr', 'nsec',
+ 'rrsig', 'sshfp'];
+
+ function create_type_select(id,add_none) {
+ var type_select = $('<select/>',{
+ id: id
+ });
+
+ if (add_none){
+ type_select.append($('<option/>',{
+ text: '(any)',
+ value: ''
+ }));
+ }
+ for (var t = 0 ; t < record_types.length ; t += 1){
+ var record_type = record_types[t].toUpperCase();
+
+ type_select.append($('<option/>',{
+ text: record_type,
+ value: record_type
+ }));
+ }
+ return type_select;
+ }
+
+
+ var entry_attrs = {};
+
+
+ function add_click(){
+
+ var dialog = IPA.dialog({
+ title: IPA.messages.objects.dnsrecord.add
+ });
+
+ dialog.create = function() {
+
+ var dl = $('<dl/>').appendTo(dialog.container);
+
+ $('<dt/>', {
+ html: IPA.messages.objects.dnsrecord.resource
+ }).appendTo(dl);
+
+ var dd = $('<dd/>').appendTo(dl);
+
+ dialog.resource = $('<input/>', {
+ type: 'text'
+ }).appendTo(dd);
+
+ $('<dt/>', {
+ html: IPA.messages.objects.dnsrecord.type
+ }).appendTo(dl);
+
+ dd = $('<dd/>').appendTo(dl);
+
+ dialog.type = create_type_select('dns-record-type').appendTo(dd);
+
+ $('<dt/>', {
+ html: IPA.messages.objects.dnsrecord.data
+ }).appendTo(dl);
+
+ dd = $('<dd/>').appendTo(dl);
+
+ dialog.data = $('<textarea/>', {
+ rows: 8,
+ cols: 20
+ }).appendTo(dd);
+ };
+
+ dialog.add_button(IPA.messages.buttons.add_many, function() {
+ dialog.add();
+ });
+
+ dialog.add_button(IPA.messages.buttons.add_and_close, function() {
+ dialog.add();
+ dialog.close();
+ });
+
+ dialog.add_button(IPA.messages.buttons.cancel, function() {
+ dialog.close();
+ });
+
+ dialog.add = function() {
+
+ var pkey = $.bbq.getState(that.entity_name+'-pkey', true);
+ var resource = dialog.resource.val();
+
+ var options = {};
+ var key = dialog.type.val().toLowerCase()+'record';
+ options[key] = dialog.data.val();
+
+ var command = IPA.command({
+ method: 'dnsrecord_add',
+ args: [pkey, resource],
+ options: options,
+ on_success: function(data, text_status, xhr) {
+ reload();
+ }
+ });
+
+ command.execute();
+ };
+
+ dialog.init();
+
+ dialog.open(that.container);
+ }
+
+ function delete_records(records_table){
+
+ var zone = $.bbq.getState('dnszone-pkey', true);
+
+ var thead = records_table.find('thead');
+ thead.find("INPUT[type='checkbox']").
+ attr('checked', false);
+
+ var tbody = records_table.find('tbody');
+
+ var records = [];
+
+ $('input[type=checkbox]:checked', tbody).each(
+ function(index, input){
+ var tr = $(input).parents('tr');
+ var resource = $('[title=idnsname]', tr).text();
+ var type = $('[title=type]', tr).text().toLowerCase();
+ var data = $('[title=data]', tr).text();
+
+ records.push({
+ resource: resource,
+ type: type,
+ data: data
+ });
+ }
+ );
+
+ if (records.length === 0){
+ return;
+ }
+
+ var dialog = IPA.dialog({
+ title: IPA.messages.buttons.remove
+ });
+
+ dialog.create = function() {
+
+ var to_delete_table =
+ $('<table class="search-table" >'+
+ '<thead><tr><th>Resource</th><th>Type</th></tr></thead>'+
+ '<tbody></tbody></table>').appendTo(dialog.container);
+
+ var to_delete_body = to_delete_table.find('tbody');
+
+ for (var i=0; i<records.length; i++) {
+ var record = records[i];
+
+ var tr = $('<tr></tr>').appendTo(to_delete_body);
+
+ $('<td/>', {
+ html: record.resource
+ }).appendTo(tr);
+
+ $('<td/>', {
+ html: record.type
+ }).appendTo(tr);
+ }
+
+ $('<p/>', {
+ text: IPA.messages.search.delete_confirm
+ }).appendTo(dialog.container);
+ };
+
+ dialog.add_button(IPA.messages.buttons.remove, function() {
+
+ var batch = IPA.batch_command({
+ on_success: function() {
+ reload();
+ dialog.close();
+ },
+ on_error: function() {
+ reload();
+ dialog.close();
+ }
+ });
+
+ for (var i=0; i<records.length; i++) {
+ var record = records[i];
+
+ var command = IPA.command({
+ method: 'dnsrecord_del',
+ args: [zone, record.resource]
+ });
+
+ command.set_option(record.type+'record', record.data);
+
+ batch.add_command(command);
+ }
+
+ batch.execute();
+ });
+
+ dialog.add_button(IPA.messages.buttons.cancel, function() {
+ dialog.close();
+ });
+
+ dialog.init();
+
+ dialog.open(that.container);
+ }
+
+ 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 create(container) {
+
+ container.attr('title', that.entity_name);
+
+ $('<h1/>',{
+ }).append(IPA.create_network_spinner()).
+ appendTo(container);
+
+ var details = $('<div/>', {
+ 'class': 'content'
+ }).appendTo(container);
+
+ var div = $('<div class="search-controls"></div>').
+ appendTo(details);
+
+ var control_span =$('<span class="record-filter"></span>').appendTo(div);
+ control_span.append(IPA.messages.objects.dnsrecord.resource);
+ control_span.append($('<input />',{
+ type: "text",
+ id: 'dns-record-resource-filter',
+ name: 'search-' + that.entity_name + '-filter'
+ }));
+
+ /*
+ THe OLD DNS plugin allowed for search based on record type.
+ This one does not. If the plugin gets modified to support
+ Record type searches, uncomment the followin lines and
+ adjust the code that modifies the search parameters.
+
+ control_span.append('Type');
+ create_type_select('dns-record-type-filter',true).
+ appendTo(control_span);
+ */
+
+ IPA.button({
+ 'label': IPA.messages.buttons.find,
+ 'icon': 'ui-icon-search',
+ 'click': function(){refresh();}
+ }).appendTo(control_span);
+
+ var action_panel_ul = $('.action-panel .entity-facet', that.container).
+ last();
+
+ var action_controls = $('<li/>',{
+ "class":"action-controls"}).appendTo(action_panel_ul);
+
+
+ IPA.action_button({
+ label: IPA.messages.buttons.remove,
+ icon: 'ui-icon-trash',
+ click: function(){ delete_records(records_table); }
+ }).appendTo(action_controls);
+
+ IPA.action_button({
+ label: IPA.messages.buttons.add,
+ icon: 'ui-icon-plus',
+ click: add_click
+ }).appendTo(action_controls);
+
+ div.append('<span class="records-buttons"></span>');
+
+ var records_results = $('<div/>', {
+ 'class': 'records-results'
+ }).appendTo(details);
+
+ var records_table = $('<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 tr = thead.find('tr');
+ tr.append($('<th style="width: 15px" />').append(
+ $('<input />',{
+ type: 'checkbox',
+ click : function (evt){
+ tbody.find("INPUT[type='checkbox']").
+ attr('checked', this.checked);
+ }
+ })));
+ tr.append($('<th/>',{
+ text: IPA.get_entity_param("dnsrecord", "idnsname").label }));
+ tr.append($('<th>Record Type</th>'));
+ tr.append($('<th>Data</th>'));
+
+ }
+
+ function setup(container){
+
+ that.facet_setup(container);
+
+ that.pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
+ that.record = $.bbq.getState(that.entity_name + '-record', true) || '';
+
+
+ $('h1',container).
+ html("<span id='headerpkey' />"+IPA.messages.objects.dnsrecord.title+":" + that.pkey);
+
+
+ //commented out until data is searchable
+ //control_span.append('Data');
+ //control_span.append($('<input />',{
+ // type: "text",
+ // id: 'dns-record-data-filter',
+ // name: 'search-' + obj_name + '-filter'
+ //}));
+
+
+
+ refresh();
+ }
+
+
+ function load_on_win(data){
+ display(that.entity_name,data);
+ }
+
+ function load_on_fail(data){
+ display(that.entity_name,data);
+ }
+
+ function reload(){
+ refresh();
+ }
+
+
+ function refresh(){
+
+ var options = {};
+
+ var resource_filter = that.container.
+ find("#dns-record-resource-filter").val();
+// if (resource_filter){
+// options.idnsname = resource_filter;
+// }
+
+ var type_filter = that.container.find("#dns-record-type-filter").val();
+ if (type_filter){
+ options.type = type_filter;
+ }
+
+ var data_filter = that.container.find("#dns-record-data-filter").val();
+ if (data_filter){
+ options.data = data_filter;
+ }
+
+ var pkey = [$.bbq.getState(that.entity_name + '-pkey', true)];
+
+ if (resource_filter){
+ pkey.push(resource_filter);
+ }
+ IPA.cmd('dnsrecord_find',pkey,options,load_on_win, load_on_fail);
+
+ }
+
+
+ function generate_tr(thead, tbody, result){
+ function generate_checkbox_td(tr, pkey) {
+ var checkbox = $('<input />', {
+ name: pkey,
+ title: pkey,
+ type: 'checkbox',
+ 'class': 'search-selector'
+ });
+ var td = $('<td></td>');
+
+ td.append(checkbox);
+ tr.append(td);
+ }
+
+ var tr = $('<tr></tr>').appendTo(tbody);
+
+ generate_checkbox_td(tr, /*pkey_value*/ '');
+
+ //TODO get this fixed on the back end. For now, workaround
+
+ if (result.idnsname){
+ tr.append($('<td/>',{
+ title:'idnsname',
+ text: result.idnsname[0]
+ }));
+ }else{
+ tr.append($('<td/>',{
+ title:'idnsname',
+ text: result.dn.split(',')[0].split('=')[1]
+ }));
+
+ }
+
+ for (var i = 0; i < record_types.length; i += 1){
+ var field_name = record_types[i];
+ var field = result[field_name+'record'];
+ if ( field ){
+ var record_type = field_name;
+ var record_data = field[0];
+ break;
+ }
+ }
+
+ tr.append($('<td/>',{
+ title:'type',
+ text: record_type
+ }));
+ tr.append($('<td/>',{
+ title:'data',
+ text: record_data
+ }));
+ }
+
+ //TODO this is cut and pasted from search, we need to unify
+ function display(obj_name, data){
+ var selector = '.entity-container[title=' + obj_name + ']';
+ var thead = $(selector + ' thead');
+ var tbody = $(selector + ' tbody');
+ var tfoot = $(selector + ' tfoot');
+
+ tbody.find('tr').remove();
+
+ var result = data.result.result;
+ for (var i = 0; i < result.length; ++i){
+ generate_tr(thead, tbody, result[i]);
+ }
+
+ tfoot.find('td').remove();
+ if (data.result.truncated) {
+ var message = IPA.messages.search.truncated;
+ message = message.replace('${counter}', data.result.count);
+ tfoot.append($('<td />',{
+ colspan:2,
+ text:message}));
+ } else {
+ tfoot.append($('<td/>',{
+ colspan:2,
+ text:data.result.summary}));
+ }
+
+ }
+
+ that.create = create;
+ that.setup = setup;
+ that.refresh = refresh;
+
+ return that;
+};
+
diff --git a/install/ui/entity.js b/install/ui/entity.js
index f8e61af8e..c23ce500a 100644
--- a/install/ui/entity.js
+++ b/install/ui/entity.js
@@ -243,99 +243,6 @@ IPA.entity = function (spec) {
};
-/*renamed to avoid clash with IPA.get_entity*/
-IPA.fetch_entity = function (entity_name) {
-
- var entity = IPA.get_entity(entity_name);
-/*
- if (entity) return entity;
-
- entity = IPA.entity({
- 'name': entity_name
- });
-
- IPA.add_entity(entity);
-*/
- return entity;
-};
-
-
-IPA.entity_get_search_facet = function (entity_name) {
-
- var entity = IPA.fetch_entity(entity_name);
-
- var facet = entity.get_facet('search');
- if (facet) return facet;
-
- facet = IPA.search_facet({
- 'name': 'search',
- 'label': IPA.messages.facets.search
- });
- entity.add_facet(facet);
-
- return facet;
-};
-
-
-IPA.entity_set_search_definition = function (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]
- });
- }
-};
-
-
-IPA.entity_get_add_dialog = function (entity_name) {
-
- var entity = IPA.fetch_entity(entity_name);
- return entity.get_add_dialog();
-};
-
-
-IPA.entity_get_details_facet = function (entity_name) {
-
- var entity = IPA.fetch_entity(entity_name);
-
- var facet = entity.get_facet('details');
- if (facet) return facet;
-
- facet = IPA.details_facet({
- 'name': 'details'
- });
- entity.add_facet(facet);
-
- return facet;
-};
-
-
-IPA.entity_set_details_definition = function (entity_name, sections) {
-
- 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);
- }
-};
-
-IPA.entity_set_facet_definition = function (entity_name, list) {
-
- var entity = IPA.fetch_entity(entity_name);
-
- for (var i=0; i<list.length; i++) {
- var facet = list[i];
- entity.add_facet(facet);
- }
-};
-
-
IPA.current_facet = function (entity){
var facet_name = $.bbq.getState(entity.name + '-facet', true);
if (!facet_name && entity.facets.length) {
@@ -464,7 +371,6 @@ IPA.back_icon = '<span class="ipa-icon">&#x25C0;</span>';
IPA. facet_create_action_panel = function(container) {
-
function build_link(other_facet,label){
var li = $('<li/>', {
"class" : other_facet.display_class,
@@ -620,3 +526,160 @@ IPA. facet_create_action_panel = function(container) {
}
return action_panel;
};
+
+IPA.entity_builder = function(){
+
+ var that = {};
+
+ var entity_name ;
+ var entity = null;
+ var current_facet = null;
+
+
+ function section(spec){
+ var current_section = null;
+ spec.entity_name = entity_name;
+
+ if (spec.section){
+ spec.name = spec.section;
+ if (!spec.label){
+ var obj_messages = IPA.messages.objects[entity_name];
+ spec.label = obj_messages[spec.section];
+ }
+ }
+
+ if (spec.factory){
+ current_section = spec.factory(spec);
+ }else{
+ current_section = IPA.details_list_section(spec);
+ }
+
+ var fields = spec.fields;
+ if (fields){
+ var i;
+ var field;
+ for (i =0; i < fields.length; i += 1){
+ field = fields[i];
+ if (field instanceof Object){
+ field.entity_name = entity_name;
+ current_section.add_field(field.factory(field));
+ }else{
+ field = IPA.text_widget({
+ name:field,
+ entity_name:entity_name
+ });
+ current_section.add_field(field);
+ }
+ }
+ }
+ current_facet.add_section(current_section);
+ }
+
+ that.entity = function(name){
+ entity_name = name;
+ that.entity_name = name;
+ entity = IPA.entity({name: name});
+ return that;
+ };
+
+ that.dialog = function(value){
+ current_facet.dialog(value);
+ return that;
+ };
+
+ that.details_facet = function (sections){
+ current_facet =IPA.details_facet({entity_name:entity_name});
+ entity.facet(current_facet);
+
+ var i;
+ for ( i =0; i < sections.length; i += 1){
+ section(sections[i]);
+ }
+
+ return that;
+ };
+
+ that.get_current_facet = function(){
+ return current_facet;
+ };
+
+ that.facet = function (facet){
+ current_facet = facet;
+ entity.facet(facet);
+ return that;
+ };
+
+ that.search_facet = function (spec){
+ current_facet = IPA.search_facet({entity_name:that.entity_name});
+ //once everything usese this mechanism, inline the init code
+ current_facet.init();
+
+ var columns = spec.columns;
+ var i;
+ for (i = 0; i < columns.length; i +=1){
+ if(columns[i] instanceof Object){
+ current_facet.column(columns[i]);
+ }else{
+ current_facet.column({name:columns[i]});
+ }
+ }
+ var current_dialog =
+ IPA.add_dialog({
+ 'name': 'add',
+ 'title': IPA.messages.objects.user.add,
+ entity_name: entity_name
+ });
+
+ current_facet.dialog(current_dialog);
+
+ var add_fields = spec.add_fields;
+ for (i = 0; i < add_fields.length; i += 1){
+ var field = add_fields[i];
+ if (field instanceof Object){
+ /* This is a bit of a hack ,and is here to support ACI
+ permissions. The target section is a group of secveral
+ widgets together. It makes more sense to do them as a
+ seciont than as a widgit. However, since they can be mixed
+ into the flow with the other widgets, the section needs to
+ be definied here with the fields to get the order correct.*/
+ var factory;
+ if (field.section){
+ factory = field.factory;
+ field.factory = null;
+ field.name = field.section;
+ field.section = null;
+ current_dialog.add_section(factory(field));
+ }else{
+ field.entity_name = entity_name;
+ factory = field.factory;
+ current_dialog.field(factory(field));
+ }
+ }else{
+ current_dialog.text(add_fields[i]);
+ }
+ }
+
+ entity.facet(current_facet);
+ return that;
+ };
+
+
+ that.association_facet = function(spec){
+ spec.entity_name = entity_name;
+ entity.facet(IPA.association_facet(spec));
+ return that;
+ };
+
+ that.standard_associations = function(){
+ entity.standard_associations();
+ return that;
+ };
+
+ that.build = function(){
+ var item = entity;
+ entity = null;
+ return item;
+ };
+
+ return that;
+};
diff --git a/install/ui/group.js b/install/ui/group.js
index d2e35e258..cc443cc53 100644
--- a/install/ui/group.js
+++ b/install/ui/group.js
@@ -26,115 +26,65 @@
IPA.entity_factories.group = function () {
- return IPA.entity({
- 'name': 'group'
- }).
- facet(
- IPA.search_facet().
- column({name: 'cn'}).
- column({name: 'gidnumber'}).
- column({name: 'description'}).
- dialog(
- IPA.add_dialog({
- 'name': 'add',
- 'title': IPA.messages.objects.group.add
- }).
- field(IPA.text_widget({name: 'cn', undo: false})).
- field(IPA.text_widget({name: 'description', undo: false})).
- field(IPA.checkbox_widget({
- name: 'posix',
- label: IPA.messages.objects.group.posix,
- undo: false,
- checked: 'checked'})).
- field(IPA.text_widget({name: 'gidnumber', undo: false})))).
- facet(
- IPA.details_facet().
- section(
- IPA.stanza({
- name: 'details',
- label: IPA.messages.objects.group.details
- }).
- input({name: 'cn' }).
- input({name: 'description'}).
- input({name: 'gidnumber' }))).
- facet(
- IPA.group_member_user_facet({
- 'name': 'member_user'
- })).
- facet(
- IPA.association_facet({
+ return IPA.entity_builder().
+ entity('group').
+ search_facet({
+ columns:['cn','gidnumber','description'],
+ add_fields: [
+ 'cn',
+ 'description',
+ {
+ factory:IPA.checkbox_widget,
+ name: 'posix',
+ label: IPA.messages.objects.group.posix,
+ undo: false,
+ checked: 'checked'
+ },
+ 'gidnumber']
+ }).
+ details_facet(
+ [{
+ section:'details',
+ fields:['cn','description','gidnumber']
+ }]).
+ facet( IPA.association_facet({
+ 'name': 'member_user',
+ columns:[
+ {
+ name: 'uid',
+ primary_key: true,
+ link_entity: true
+ },
+ {name: 'uidnumber'},
+ {name: 'mail'},
+ {name: 'telephonenumber'},
+ {name: 'title'}
+ ],
+ adder_columns:[
+ {
+ name: 'cn',
+ width: '100px'
+ },
+ {
+ name: 'uid',
+ primary_key: true,
+ width: '100px'
+ }
+ ]
+
+ })).
+ association_facet({
name: 'memberof_group',
associator: IPA.serial_associator
- })).
- facet(
- IPA.association_facet({
- name: 'memberof_netgroup',
- associator: IPA.serial_associator
- })).
- facet(
- IPA.association_facet({
- name: 'memberof_role',
- associator: IPA.serial_associator
- })).
- standard_associations();
+ }).
+ association_facet({
+ name: 'memberof_netgroup',
+ associator: IPA.serial_associator
+ }).
+ association_facet({
+ name: 'memberof_role',
+ associator: IPA.serial_associator
+ }).
+ standard_associations().
+ build();
};
-
-
-IPA.group_member_user_facet = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.association_facet(spec);
-
- that.init = function() {
-
- that.create_column({name: 'cn'});
-
- var column = that.create_column({
- name: 'uid',
- primary_key: true
- });
-
- column.setup = function(container, record) {
- container.empty();
-
- var value = record[column.name];
- value = value ? value.toString() : '';
-
- $('<a/>', {
- 'href': '#'+value,
- 'html': value,
- 'click': function (value) {
- return function() {
- var state = IPA.tab_state(that.other_entity);
- state[that.other_entity + '-facet'] = 'details';
- state[that.other_entity + '-pkey'] = value;
- $.bbq.pushState(state);
- return false;
- };
- }(value)
- }).appendTo(container);
- };
-
- that.create_column({name: 'uidnumber'});
- that.create_column({name: 'mail'});
- that.create_column({name: 'telephonenumber'});
- that.create_column({name: 'title'});
-
- that.create_adder_column({
- name: 'cn',
- width: '100px'
- });
-
- that.create_adder_column({
- name: 'uid',
- primary_key: true,
- width: '100px'
- });
-
- that.association_facet_init();
- };
-
- return that;
-
-}; \ No newline at end of file
diff --git a/install/ui/hbacrule.js b/install/ui/hbac.js
index 743b9e0c5..4b9fe1ed3 100644
--- a/install/ui/hbacrule.js
+++ b/install/ui/hbac.js
@@ -23,113 +23,130 @@
/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
IPA.entity_factories.hbacrule = function () {
-
- var that = IPA.entity({
- 'name': 'hbacrule'
- });
-
- that.init = function() {
-
- var facet = IPA.hbacrule_search_facet({
- 'name': 'search',
- 'label': IPA.messages.facets.search
- });
-
- var dialog = IPA.hbacrule_add_dialog({
- 'name': 'add',
- 'title': IPA.messages.objects.hbacrule.add
- });
- facet.dialog(dialog);
-
- that.add_facet(facet);
-
- facet = IPA.hbacrule_details_facet({
+ return IPA.entity_builder().
+ entity('hbacrule').
+ search_facet({
+ columns:['cn','usercategory','hostcategory','ipaenabledflag',
+ 'servicecategory','sourcehostcategory'],
+ add_fields:[
+ 'cn',
+ {
+ factory: IPA.radio_widget,
+ 'name': 'accessruletype',
+ 'options': [
+ { 'value': 'allow',
+ 'label': IPA.messages.objects.hbacrule.allow
+ },
+ { 'value': 'deny',
+ 'label': IPA.messages.objects.hbacrule.deny
+ }],
+ 'undo': false
+ }]}).
+ facet(IPA.hbacrule_details_facet({
'name': 'details'
- });
- that.add_facet(facet);
-
- that.entity_init();
- };
-
- return that;
+ })).
+ build();
};
+IPA.entity_factories.hbacsvc = function () {
+ return IPA.entity_builder().
+ entity('hbacsvc').
+ search_facet({
+ columns:['cn','description'],
+ add_fields:['cn','description']}).
+ details_facet([{
+ section : 'general',
+ label: IPA.messages.details.general,
+ fields:[ 'cn', 'description']}]).
+ build();
+};
-
-IPA.hbacrule_add_dialog = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.add_dialog(spec);
-
- that.init = function() {
-
- that.add_field(IPA.text_widget({
- 'name': 'cn',
- 'undo': false
- }));
-
- that.add_field(IPA.radio_widget({
- 'name': 'accessruletype',
- 'options': [
- { 'value': 'allow', 'label': IPA.messages.objects.hbacrule.allow },
- { 'value': 'deny', 'label': IPA.messages.objects.hbacrule.deny }
- ],
- 'undo': false
- }));
-
- that.add_dialog_init();
- };
-
- return that;
+IPA.entity_factories.hbacsvcgroup = function () {
+ return IPA.entity_builder().
+ entity('hbacsvcgroup').
+ search_facet({
+ columns:['cn', 'description'],
+ add_fields:['cn', 'description']}).
+ details_facet([
+ {
+ section: 'general',
+ label: IPA.messages.details.general,
+ fields:['cn','description']
+ },
+ {
+ section: 'services',
+ label: IPA.messages.objects.hbacsvcgroup.services,
+ fields:[{
+ factory: IPA.hbacsvcgroup_member_hbacsvc_table_widget,
+ name: 'member_hbacsvc',
+ label: IPA.messages.objects.hbacsvcgroup.services,
+ other_entity: 'hbacsvc',
+ save_values: false
+ }]
+ }]).
+ build();
};
-
-IPA.hbacrule_search_facet = function (spec) {
+IPA.hbacsvcgroup_member_hbacsvc_table_widget = function (spec) {
spec = spec || {};
- var that = IPA.search_facet(spec);
+ var that = IPA.association_table_widget(spec);
that.init = function() {
- that.create_column({name:'cn'});
- that.create_column({name:'usercategory'});
- that.create_column({name:'hostcategory'});
- that.create_column({name:'ipaenabledflag'});
- that.create_column({name:'servicecategory'});
- that.create_column({name:'sourcehostcategory'});
-
- that.search_facet_init();
- };
-
- that.create = function(container) {
-
-/*
- // Not yet implemented
+ var column = that.create_column({
+ name: 'cn',
+ primary_key: true,
+ width: '150px'
+ });
- var left_buttons = $('<span/>', {
- 'style': 'float: left;'
- }).appendTo(container);
+ column.setup = function(container, record) {
+ container.empty();
+
+ var value = record[column.name];
+ value = value ? value.toString() : '';
+
+ $('<a/>', {
+ 'href': '#'+value,
+ 'html': value,
+ 'click': function (value) {
+ return function() {
+ var state = IPA.tab_state(that.other_entity);
+ state[that.other_entity + '-facet'] = 'details';
+ state[that.other_entity + '-pkey'] = value;
+ $.bbq.pushState(state);
+ return false;
+ };
+ }(value)
+ }).appendTo(container);
+ };
- left_buttons.append(IPA.button({
- 'label': 'Troubleshoot Rules'
- }));
+ that.create_column({
+ name: 'description',
+ width: '350px'
+ });
- left_buttons.append(IPA.button({
- 'label': 'Cull Disabled Rules'
- }));
-*/
+ that.create_adder_column({
+ name: 'cn',
+ primary_key: true,
+ width: '100px'
+ });
- that.search_facet_create(container);
+ that.create_adder_column({
+ name: 'description',
+ width: '100px'
+ });
+ that.association_table_widget_init();
};
return that;
};
+
IPA.hbacrule_details_facet = function (spec) {
spec = spec || {};
@@ -315,31 +332,6 @@ IPA.hbacrule_details_facet = function (spec) {
'name': 'sourcehost_hostgroup', 'category': category,
'other_entity': 'hostgroup', 'add_method': 'add_sourcehost', 'remove_method': 'remove_sourcehost'
}));
-/*
- if (IPA.layout) {
- section = that.create_section({
- 'name': 'accesstime',
- 'label': 'When',
- 'template': 'hbacrule-details-accesstime.html #contents'
- });
-
- } else {
- section = that.create_section({
- 'name': 'accesstime',
- 'label': 'When'
- });
- }
-
- section.add_field(ipa_hbacrule_accesstime_widget({
- 'id': 'accesstime',
- 'name': 'accesstime', 'label': 'Access Time',
- 'text': 'Rule applies when access is being requested at:',
- 'options': [
- { 'value': 'all', 'label': 'Any Time' },
- { 'value': '', 'label': 'Specified Times' }
- ]
- }));
-*/
that.details_facet_init();
};
@@ -532,8 +524,6 @@ IPA.hbacrule_details_facet = function (spec) {
return;
}
- //alert(JSON.stringify(batch.to_json()));
-
batch.execute();
};
diff --git a/install/ui/hbacsvc.js b/install/ui/hbacsvc.js
deleted file mode 100644
index 2112f3afe..000000000
--- a/install/ui/hbacsvc.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/*jsl:import ipa.js */
-
-/* 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
-
-IPA.entity_factories.hbacsvc = function () {
-
- var that = IPA.entity({
- 'name': 'hbacsvc'
- });
-
- that.init = function() {
-
- var facet = IPA.hbacsvc_search_facet({
- 'name': 'search',
- 'label': IPA.messages.facets.search
- });
-
- var dialog = IPA.hbacsvc_add_dialog({
- 'name': 'add',
- 'title': IPA.messages.objects.hbacsvc.add
- });
- facet.dialog(dialog);
-
- that.add_facet(facet);
-
- facet = IPA.hbacsvc_details_facet({
- 'name': 'details'
- });
- that.add_facet(facet);
-
- that.entity_init();
- };
-
- return that;
-};
-
-
-
-IPA.hbacsvc_add_dialog = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.add_dialog(spec);
-
- that.init = function() {
-
- that.add_field(IPA.text_widget({name:'cn', undo: false}));
- that.add_field(IPA.text_widget({name:'description', undo: false}));
-
- that.add_dialog_init();
- };
-
- return that;
-};
-
-
-IPA.hbacsvc_search_facet = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.search_facet(spec);
-
- that.init = function() {
-
- that.create_column({name:'cn', primary_key: true});
- that.create_column({name:'description'});
-
- that.search_facet_init();
- };
-
- return that;
-};
-
-
-IPA.hbacsvc_details_facet = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.details_facet(spec);
-
- that.init = function() {
-
- var section = IPA.details_list_section({
- 'name': 'general',
- 'label': IPA.messages.details.general
- });
- that.add_section(section);
-
- section.text({name: 'cn'});
- section.text({name: 'description'});
-
- that.details_facet_init();
- };
-
- return that;
-};
diff --git a/install/ui/hbacsvcgroup.js b/install/ui/hbacsvcgroup.js
deleted file mode 100644
index a69841397..000000000
--- a/install/ui/hbacsvcgroup.js
+++ /dev/null
@@ -1,188 +0,0 @@
-/*jsl:import ipa.js */
-
-/* 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
-
-IPA.entity_factories.hbacsvcgroup = function () {
-
- var that = IPA.entity({
- 'name': 'hbacsvcgroup'
- });
-
- that.init = function() {
-
- var facet = IPA.hbacsvcgroup_search_facet({
- 'name': 'search',
- 'label': IPA.messages.facets.search
- });
-
- var dialog = IPA.hbacsvcgroup_add_dialog({
- 'name': 'add',
- 'title': IPA.messages.objects.hbacsvcgroup.add
- });
- facet.dialog(dialog);
-
- that.add_facet(facet);
-
- facet = IPA.hbacsvcgroup_details_facet({
- 'name': 'details'
- });
- that.add_facet(facet);
-
- that.entity_init();
- };
-
- return that;
-};
-
-
-IPA.hbacsvcgroup_add_dialog = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.add_dialog(spec);
-
- that.init = function() {
-
- that.add_field(IPA.text_widget({name:'cn', undo: false}));
- that.add_field(IPA.text_widget({name:'description', undo: false}));
-
- that.add_dialog_init();
- };
-
- return that;
-};
-
-
-IPA.hbacsvcgroup_search_facet = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.search_facet(spec);
-
- that.init = function() {
-
- that.create_column({name:'cn', primary_key: true});
- that.create_column({name:'description'});
-
- that.search_facet_init();
- };
-
-
- return that;
-};
-
-
-IPA.hbacsvcgroup_details_facet = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.details_facet(spec);
-
- that.init = function() {
-
- var section = IPA.details_list_section({
- 'name': 'general',
- 'label': IPA.messages.details.general
- });
- that.add_section(section);
-
- section.text({name: 'cn'});
- section.text({name: 'description'});
-
- section = IPA.details_section({
- 'name': 'services',
- 'label': IPA.messages.objects.hbacsvcgroup.services
- });
- that.add_section(section);
-
- var field = IPA.hbacsvcgroup_member_hbacsvc_table_widget({
- 'name': 'member_hbacsvc',
- 'label': IPA.messages.objects.hbacsvcgroup.services,
- 'other_entity': 'hbacsvc',
- 'save_values': false
- });
- section.add_field(field);
-
- that.details_facet_init();
- };
-
- return that;
-};
-
-
-IPA.hbacsvcgroup_member_hbacsvc_table_widget = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.association_table_widget(spec);
-
- that.init = function() {
-
- var column = that.create_column({
- name: 'cn',
- primary_key: true,
- width: '150px'
- });
-
- column.setup = function(container, record) {
- container.empty();
-
- var value = record[column.name];
- value = value ? value.toString() : '';
-
- $('<a/>', {
- 'href': '#'+value,
- 'html': value,
- 'click': function (value) {
- return function() {
- var state = IPA.tab_state(that.other_entity);
- state[that.other_entity + '-facet'] = 'details';
- state[that.other_entity + '-pkey'] = value;
- $.bbq.pushState(state);
- return false;
- };
- }(value)
- }).appendTo(container);
- };
-
- that.create_column({
- name: 'description',
- width: '350px'
- });
-
- that.create_adder_column({
- name: 'cn',
- primary_key: true,
- width: '100px'
- });
-
- that.create_adder_column({
- name: 'description',
- width: '100px'
- });
-
- that.association_table_widget_init();
- };
-
- return that;
-};
diff --git a/install/ui/host.js b/install/ui/host.js
index 7d9e8f018..3f9c05d1d 100644
--- a/install/ui/host.js
+++ b/install/ui/host.js
@@ -26,90 +26,70 @@
IPA.entity_factories.host = function () {
- var that = IPA.entity({
- 'name': 'host'
- });
-
- that.init = function() {
-
- var facet = IPA.host_search_facet({
- 'name': 'search',
- 'label': IPA.messages.facets.search
- });
- that.add_facet(facet);
-
- var dialog = IPA.host_add_dialog({
- 'name': 'add',
- 'title': IPA.messages.objects.host.add
- });
- facet.dialog(dialog);
-
- facet = IPA.host_details_facet({
- 'name': 'details'
- });
- that.add_facet(facet);
-
- facet = IPA.host_managedby_host_facet({
+ return IPA.entity_builder().
+ entity('host').
+ search_facet({
+ columns:['fqdn','description',{
+ name: 'krblastpwdchange',
+ label: IPA.messages.objects.host.enrolled,
+ format: IPA.utc_date_column_format
+ }],
+ add_fields: ['fqdn', {factory:IPA.force_host_add_checkbox_widget}]
+ }).
+ details_facet([
+ {
+ section:'details',
+ fields: [
+ 'fqdn',
+ 'krbprincipalname',
+ {
+ factory: IPA.text_widget,
+ name: 'cn',
+ label: IPA.messages.objects.host.cn,
+ read_only: true
+ },
+ 'description' ]
+ },
+ {
+ section:'enrollment',
+ fields:[
+ {
+ factory: IPA.host_provisioning_status_widget,
+ 'name': 'provisioning_status',
+ label: IPA.messages.objects.host.status
+ }
+ ]
+ },
+ {
+ section :'certificate',
+ fields:[
+ {
+ factory: IPA.host_certificate_status_widget,
+ 'name': 'certificate_status',
+ label: IPA.messages.objects.host.status
+ }
+ ]
+ }]).
+ facet(IPA.host_managedby_host_facet({
name: 'managedby_host'
- });
- that.add_facet(facet);
-
- facet = IPA.association_facet({
+ })).
+ association_facet({
name: 'memberof_hostgroup',
associator: IPA.serial_associator
- });
- that.add_facet(facet);
-
- facet = IPA.association_facet({
+ }).
+ association_facet({
name: 'memberof_netgroup',
associator: IPA.serial_associator
- });
- that.add_facet(facet);
-
- facet = IPA.association_facet({
+ }).
+ association_facet({
name: 'memberof_role',
associator: IPA.serial_associator
- });
- that.add_facet(facet);
-
- that.create_association_facets();
-
- that.entity_init();
- };
-
- return that;
+ }).
+ standard_associations().
+ build();
};
-IPA.host_add_dialog = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.add_dialog(spec);
-
- that.init = function() {
-
- that.add_field(IPA.text_widget({
- name: 'fqdn',
- size: 40,
- undo: false
- }));
-
- var param_info = IPA.get_method_param('host_add', 'force');
-
- that.add_field(IPA.checkbox_widget({
- name: 'force',
- label: param_info.label,
- tooltip: param_info.doc,
- undo: false
- }));
-
- that.add_dialog_init();
- };
-
- return that;
-};
-
/* Take an LDAP format date in UTC and format it */
IPA.utc_date_column_format = function(value){
if (!value) {
@@ -137,115 +117,16 @@ IPA.utc_date_column_format = function(value){
return formated;
};
-IPA.host_search_facet = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.search_facet(spec);
-
- that.init = function() {
-
- that.create_column({name:'fqdn'});
- that.create_column({name:'description'});
- //TODO use the value of this field to set enrollment status
- that.create_column({
- name: 'krblastpwdchange',
- label: IPA.messages.objects.host.enrolled,
- format: IPA.utc_date_column_format
- });
- that.create_column({name:'nshostlocation'});
- that.search_facet_init();
- };
-
- return that;
-};
-
-
-IPA.host_details_facet = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.details_facet(spec);
-
- that.init = function() {
-
- var section = IPA.details_list_section({
- name: 'details',
- label: IPA.messages.objects.host.details
- });
- that.add_section(section);
-
- section.text({
- name: 'fqdn',
- label: IPA.messages.objects.host.fqdn
- });
-
- section.text({'name': 'krbprincipalname'});
-
- section.text({
- name: 'cn',
- label: IPA.messages.objects.host.cn,
- read_only: true
- });
-
- section.text({'name': 'description'});
-
- section = IPA.details_list_section({
- name: 'enrollment',
- label: IPA.messages.objects.host.enrollment
- });
- that.add_section(section);
-
- section.add_field(IPA.host_provisioning_status_widget({
- 'name': 'provisioning_status',
- label: IPA.messages.objects.host.status,
- 'facet': that
- }));
-
- section = IPA.details_list_section({
- name: 'certificate',
- label: IPA.messages.objects.host.status
- });
- that.add_section(section);
-
- section.add_field(IPA.host_certificate_status_widget({
- 'name': 'certificate_status',
- label: IPA.messages.objects.host.status
- }));
-
- that.details_facet_init();
- };
-
- that.refresh = function() {
-
- var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
-
- var command = IPA.command({
- 'name': that.entity_name+'_show_'+pkey,
- 'method': that.entity_name+'_show',
- 'args': [pkey],
- 'options': { 'all': true, 'rights': true }
- });
-
- command.on_success = function(data, text_status, xhr) {
- that.load(data.result.result);
- };
-
- command.on_error = function(xhr, text_status, error_thrown) {
- var details = $('.details', that.container).empty();
- details.append('<p>Error: '+error_thrown.name+'</p>');
- details.append('<p>'+error_thrown.title+'</p>');
- details.append('<p>'+error_thrown.message+'</p>');
- };
-
- command.execute();
- };
-
- return that;
+IPA.force_host_add_checkbox_widget = function (spec){
+ var param_info = IPA.get_method_param('host_add', 'force');
+ spec.name = 'force';
+ spec.label = param_info.label;
+ spec.tooltip = param_info.doc;
+ spec.undo = false;
+ return IPA.checkbox_widget(spec);
};
-
IPA.host_provisioning_status_widget = function (spec) {
spec = spec || {};
diff --git a/install/ui/hostgroup.js b/install/ui/hostgroup.js
index 4738a26d6..46f2ab68c 100644
--- a/install/ui/hostgroup.js
+++ b/install/ui/hostgroup.js
@@ -25,49 +25,21 @@
IPA.entity_factories.hostgroup = function() {
- var that = IPA.entity({
- 'name': 'hostgroup'
- });
-
- that.init = function() {
-
- that.facet(
- IPA.search_facet({
- name: 'search',
- label: IPA.messages.facets.search,
- entity_name: that.name
- }).
- column({name:'cn'}).
- column({name:'description'}).
- dialog(
- IPA.add_dialog({
- name: 'add',
- title: IPA.messages.objects.hostgroup.add
- }).
- field(IPA.text_widget({name: 'cn', undo: false})).
- field(IPA.text_widget({name: 'description', undo: false}))));
-
- that.facet(
- IPA.details_facet({name:'details'}).
- section(
- IPA.stanza({
- name: 'identity',
- label: IPA.messages.objects.hostgroup.identity
- }).
- input({name:'cn'}).
- input({name: 'description'})));
-
- that.facet(
- IPA.association_facet({
- name: 'memberof_hostgroup',
- associator: IPA.serial_associator
- }));
-
- that.create_association_facets();
- that.entity_init();
- };
-
- return that;
+ return IPA.entity_builder().
+ entity('hostgroup').
+ search_facet({columns:['cn','description'],
+ add_fields:['cn','description']}).
+ details_facet([{
+ section:'identity',
+ label: IPA.messages.objects.hostgroup.identity,
+ fields:['cn','description']
+ }]).
+ association_facet({
+ name: 'memberof_hostgroup',
+ associator: IPA.serial_associator
+ }).
+ standard_associations().
+ build();
};
diff --git a/install/ui/index.html b/install/ui/index.html
index bdeb4abfd..83f0fb0eb 100644
--- a/install/ui/index.html
+++ b/install/ui/index.html
@@ -21,20 +21,18 @@
<script type="text/javascript" src="navigation.js"></script>
<script type="text/javascript" src="rule.js"></script>
+ <script type="text/javascript" src="automount.js"></script>
+ <script type="text/javascript" src="dns.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="hbacrule.js"></script>
- <script type="text/javascript" src="hbacsvc.js"></script>
- <script type="text/javascript" src="hbacsvcgroup.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>
<script type="text/javascript" src="service.js"></script>
<script type="text/javascript" src="serverconfig.js"></script>
- <script type="text/javascript" src="sudorule.js"></script>
- <script type="text/javascript" src="sudocmd.js"></script>
- <script type="text/javascript" src="sudocmdgroup.js"></script>
+ <script type="text/javascript" src="sudo.js"></script>
<script type="text/javascript" src="policy.js"></script>
<script type="text/javascript" src="aci.js"></script>
diff --git a/install/ui/jsl.conf b/install/ui/jsl.conf
index 67cf84b12..a32d814b1 100644
--- a/install/ui/jsl.conf
+++ b/install/ui/jsl.conf
@@ -124,6 +124,7 @@
# To add a set of files, use "+process FileName", "+process Folder\Path\*.js",
# or "+process Folder\Path\*.htm".
#
++process core.js
+process ipa.js
+process widget.js
+process dialog.js
@@ -137,18 +138,16 @@
+process certificate.js
+process user.js
+process group.js
-+process hbacrule.js
-+process hbacsvc.js
-+process hbacsvcgroup.js
++process hbac.js
+process host.js
+process hostgroup.js
+process netgroup.js
+process service.js
+process serverconfig.js
-+process sudorule.js
-+process sudocmd.js
-+process sudocmdgroup.js
++process sudo.js
+process policy.js
+process aci.js
+process develop.js
++process dns.js
++process automount.js
+process webui.js
diff --git a/install/ui/netgroup.js b/install/ui/netgroup.js
index 251ffa4d2..9389d0197 100644
--- a/install/ui/netgroup.js
+++ b/install/ui/netgroup.js
@@ -23,52 +23,18 @@
/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
IPA.entity_factories.netgroup = function() {
-
- var that = IPA.entity({
- 'name': 'netgroup'
- });
-
- that.init = function() {
-
- that.facet(
- IPA.search_facet({
- name: 'search',
- label: IPA.messages.facets.search,
- entity_name: that.name
- }).
- column({name:'cn'}).
- column({name:'description'}).
- dialog(
- IPA.add_dialog({
- name: 'add',
- title: IPA.messages.objects.netgroup.add
- }).
- field(IPA.text_widget({ name: 'cn', undo: false})).
- field(IPA.text_widget({ name: 'description', undo: false}))));
-
- that.facet(
- IPA.details_facet({name: 'details'}).
- section(
- IPA.stanza({
- name: 'identity',
- label: IPA.messages.objects.netgroup.identity
- }).
- input({name: 'cn'}).
- input({name: 'description'}).
- input({name: 'nisdomainname'})));
-
- that.facet(
- IPA.association_facet({
- name: 'memberof_netgroup',
- associator: IPA.serial_associator
- }));
-
- that.create_association_facets();
- that.entity_init();
- };
-
- return that;
+ return IPA.entity_builder().
+ entity('netgroup').
+ search_facet({
+ columns:['cn','description'],
+ add_fields:['cn', 'description']}).
+ details_facet([{
+ section:'identity',
+ fields:['cn','description','nisdomainname']}]).
+ association_facet({
+ name: 'memberof_netgroup',
+ associator: IPA.serial_associator
+ }).
+ standard_associations().
+ build();
};
-
-
-
diff --git a/install/ui/policy.js b/install/ui/policy.js
index bbbf58049..ec202138c 100644
--- a/install/ui/policy.js
+++ b/install/ui/policy.js
@@ -23,652 +23,33 @@
/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
-/* DNS */
-IPA.entity_factories.dnszone = function() {
-
- var that = IPA.entity({
- name: 'dnszone'
- });
-
- that.init = function() {
-
- that.facet(
- IPA.search_facet({
- name: 'search',
- label: IPA.messages.facets.search,
- entity_name: that.name
- }).
- column({name:'idnsname'}).
- dialog(
- IPA.add_dialog({
- name: 'add',
- title: IPA.messages.objects.dnszone.add
- }).
- field(IPA.text_widget({ name: 'idnsname', undo: false})).
- field(IPA.text_widget({ name: 'idnssoamname', undo: false})).
- field(IPA.text_widget({ name: 'idnssoarname', undo: false}))));
-
- that.facet(
- IPA.details_facet({name:'details'}).
- section(
- IPA.stanza({
- name: 'identity',
- label: IPA.messages.objects.dnszone.identity
- }).
- input({name:'idnsname'}).
- input({name:'idnszoneactive'}).
- input({name:'idnssoamname'}).
- input({name:'idnssoarname'}).
- input({name:'idnssoaserial'}).
- input({name:'idnssoarefresh'}).
- input({name:'idnssoaretry'}).
- input({name:'idnssoaexpire'}).
- input({name:'idnssoaminimum'}).
- input({name:'dnsttl'}).
- input({name:'dnsclass'}).
- input({name:'idnsallowdynupdate'}).
- input({name:'idnsupdatepolicy'})));
-
- that.facet(
- IPA.records_facet({
- 'name': 'records',
- 'label': IPA.metadata.objects.dnsrecord.label
- }));
-
- that.create_association_facets();
- that.entity_init();
- };
-
- return that;
-};
-
-
-IPA.records_facet = function (spec){
-
- 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',
- 'key', 'kx', 'loc', 'naptr', 'nsec',
- 'rrsig', 'sshfp'];
-
- function create_type_select(id,add_none) {
- var type_select = $('<select/>',{
- id: id
- });
-
- if (add_none){
- type_select.append($('<option/>',{
- text: '(any)',
- value: ''
- }));
- }
- for (var t = 0 ; t < record_types.length ; t += 1){
- var record_type = record_types[t].toUpperCase();
-
- type_select.append($('<option/>',{
- text: record_type,
- value: record_type
- }));
- }
- return type_select;
- }
-
-
- var entry_attrs = {};
-
-
- function add_click(){
-
- var dialog = IPA.dialog({
- title: IPA.messages.objects.dnsrecord.add
- });
-
- dialog.create = function() {
-
- var dl = $('<dl/>').appendTo(dialog.container);
-
- $('<dt/>', {
- html: IPA.messages.objects.dnsrecord.resource
- }).appendTo(dl);
-
- var dd = $('<dd/>').appendTo(dl);
-
- dialog.resource = $('<input/>', {
- type: 'text'
- }).appendTo(dd);
-
- $('<dt/>', {
- html: IPA.messages.objects.dnsrecord.type
- }).appendTo(dl);
-
- dd = $('<dd/>').appendTo(dl);
-
- dialog.type = create_type_select('dns-record-type').appendTo(dd);
-
- $('<dt/>', {
- html: IPA.messages.objects.dnsrecord.data
- }).appendTo(dl);
-
- dd = $('<dd/>').appendTo(dl);
-
- dialog.data = $('<textarea/>', {
- rows: 8,
- cols: 20
- }).appendTo(dd);
- };
-
- dialog.add_button(IPA.messages.buttons.add_many, function() {
- dialog.add();
- });
-
- dialog.add_button(IPA.messages.buttons.add_and_close, function() {
- dialog.add();
- dialog.close();
- });
-
- dialog.add_button(IPA.messages.buttons.cancel, function() {
- dialog.close();
- });
-
- dialog.add = function() {
-
- var pkey = $.bbq.getState(that.entity_name+'-pkey', true);
- var resource = dialog.resource.val();
-
- var options = {};
- var key = dialog.type.val().toLowerCase()+'record';
- options[key] = dialog.data.val();
-
- var command = IPA.command({
- method: 'dnsrecord_add',
- args: [pkey, resource],
- options: options,
- on_success: function(data, text_status, xhr) {
- reload();
- }
- });
-
- command.execute();
- };
-
- dialog.init();
-
- dialog.open(that.container);
- }
-
- function delete_records(records_table){
-
- var zone = $.bbq.getState('dnszone-pkey', true);
-
- var thead = records_table.find('thead');
- thead.find("INPUT[type='checkbox']").
- attr('checked', false);
-
- var tbody = records_table.find('tbody');
-
- var records = [];
-
- $('input[type=checkbox]:checked', tbody).each(
- function(index, input){
- var tr = $(input).parents('tr');
- var resource = $('[title=idnsname]', tr).text();
- var type = $('[title=type]', tr).text().toLowerCase();
- var data = $('[title=data]', tr).text();
-
- records.push({
- resource: resource,
- type: type,
- data: data
- });
- }
- );
-
- if (records.length === 0){
- return;
- }
-
- var dialog = IPA.dialog({
- title: IPA.messages.buttons.remove
- });
-
- dialog.create = function() {
-
- var to_delete_table =
- $('<table class="search-table" >'+
- '<thead><tr><th>Resource</th><th>Type</th></tr></thead>'+
- '<tbody></tbody></table>').appendTo(dialog.container);
-
- var to_delete_body = to_delete_table.find('tbody');
-
- for (var i=0; i<records.length; i++) {
- var record = records[i];
-
- var tr = $('<tr></tr>').appendTo(to_delete_body);
-
- $('<td/>', {
- html: record.resource
- }).appendTo(tr);
-
- $('<td/>', {
- html: record.type
- }).appendTo(tr);
- }
-
- $('<p/>', {
- text: IPA.messages.search.delete_confirm
- }).appendTo(dialog.container);
- };
-
- dialog.add_button(IPA.messages.buttons.remove, function() {
-
- var batch = IPA.batch_command({
- on_success: function() {
- reload();
- dialog.close();
- },
- on_error: function() {
- reload();
- dialog.close();
- }
- });
-
- for (var i=0; i<records.length; i++) {
- var record = records[i];
-
- var command = IPA.command({
- method: 'dnsrecord_del',
- args: [zone, record.resource]
- });
-
- command.set_option(record.type+'record', record.data);
-
- batch.add_command(command);
- }
-
- batch.execute();
- });
-
- dialog.add_button(IPA.messages.buttons.cancel, function() {
- dialog.close();
- });
-
- dialog.init();
-
- dialog.open(that.container);
- }
-
- 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 create(container) {
-
- container.attr('title', that.entity_name);
-
- $('<h1/>',{
- }).append(IPA.create_network_spinner()).
- appendTo(container);
-
- var details = $('<div/>', {
- 'class': 'content'
- }).appendTo(container);
-
- var div = $('<div class="search-controls"></div>').
- appendTo(details);
-
- var control_span =$('<span class="record-filter"></span>').appendTo(div);
- control_span.append(IPA.messages.objects.dnsrecord.resource);
- control_span.append($('<input />',{
- type: "text",
- id: 'dns-record-resource-filter',
- name: 'search-' + that.entity_name + '-filter'
- }));
-
- /*
- THe OLD DNS plugin allowed for search based on record type.
- This one does not. If the plugin gets modified to support
- Record type searches, uncomment the followin lines and
- adjust the code that modifies the search parameters.
-
- control_span.append('Type');
- create_type_select('dns-record-type-filter',true).
- appendTo(control_span);
- */
-
- IPA.button({
- 'label': IPA.messages.buttons.find,
- 'icon': 'ui-icon-search',
- 'click': function(){refresh();}
- }).appendTo(control_span);
-
- var action_panel_ul = $('.action-panel .entity-facet', that.container).
- last();
-
- var action_controls = $('<li/>',{
- "class":"action-controls"}).appendTo(action_panel_ul);
-
-
- IPA.action_button({
- label: IPA.messages.buttons.remove,
- icon: 'ui-icon-trash',
- click: function(){ delete_records(records_table); }
- }).appendTo(action_controls);
-
- IPA.action_button({
- label: IPA.messages.buttons.add,
- icon: 'ui-icon-plus',
- click: add_click
- }).appendTo(action_controls);
-
- div.append('<span class="records-buttons"></span>');
-
- var records_results = $('<div/>', {
- 'class': 'records-results'
- }).appendTo(details);
-
- var records_table = $('<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 tr = thead.find('tr');
- tr.append($('<th style="width: 15px" />').append(
- $('<input />',{
- type: 'checkbox',
- click : function (evt){
- tbody.find("INPUT[type='checkbox']").
- attr('checked', this.checked);
- }
- })));
- tr.append($('<th/>',{
- text: IPA.get_entity_param("dnsrecord", "idnsname").label }));
- tr.append($('<th>Record Type</th>'));
- tr.append($('<th>Data</th>'));
-
- }
-
- function setup(container){
-
- that.facet_setup(container);
-
- that.pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
- that.record = $.bbq.getState(that.entity_name + '-record', true) || '';
-
-
- $('h1',container).
- html("<span id='headerpkey' />"+IPA.messages.objects.dnsrecord.title+":" + that.pkey);
-
-
- //commented out until data is searchable
- //control_span.append('Data');
- //control_span.append($('<input />',{
- // type: "text",
- // id: 'dns-record-data-filter',
- // name: 'search-' + obj_name + '-filter'
- //}));
-
-
-
- refresh();
- }
-
-
- function load_on_win(data){
- display(that.entity_name,data);
- }
-
- function load_on_fail(data){
- display(that.entity_name,data);
- }
-
- function reload(){
- refresh();
- }
-
-
- function refresh(){
-
- var options = {};
-
- var resource_filter = that.container.
- find("#dns-record-resource-filter").val();
-// if (resource_filter){
-// options.idnsname = resource_filter;
-// }
-
- var type_filter = that.container.find("#dns-record-type-filter").val();
- if (type_filter){
- options.type = type_filter;
- }
-
- var data_filter = that.container.find("#dns-record-data-filter").val();
- if (data_filter){
- options.data = data_filter;
- }
-
- var pkey = [$.bbq.getState(that.entity_name + '-pkey', true)];
-
- if (resource_filter){
- pkey.push(resource_filter);
- }
- IPA.cmd('dnsrecord_find',pkey,options,load_on_win, load_on_fail);
-
- }
-
-
- function generate_tr(thead, tbody, result){
- function generate_checkbox_td(tr, pkey) {
- var checkbox = $('<input />', {
- name: pkey,
- title: pkey,
- type: 'checkbox',
- 'class': 'search-selector'
- });
- var td = $('<td></td>');
-
- td.append(checkbox);
- tr.append(td);
- }
-
- var tr = $('<tr></tr>').appendTo(tbody);
-
- generate_checkbox_td(tr, /*pkey_value*/ '');
-
- //TODO get this fixed on the back end. For now, workaround
-
- if (result.idnsname){
- tr.append($('<td/>',{
- title:'idnsname',
- text: result.idnsname[0]
- }));
- }else{
- tr.append($('<td/>',{
- title:'idnsname',
- text: result.dn.split(',')[0].split('=')[1]
- }));
-
- }
-
- for (var i = 0; i < record_types.length; i += 1){
- var field_name = record_types[i];
- var field = result[field_name+'record'];
- if ( field ){
- var record_type = field_name;
- var record_data = field[0];
- break;
- }
- }
-
- tr.append($('<td/>',{
- title:'type',
- text: record_type
- }));
- tr.append($('<td/>',{
- title:'data',
- text: record_data
- }));
- }
-
- //TODO this is cut and pasted from search, we need to unify
- function display(obj_name, data){
- var selector = '.entity-container[title=' + obj_name + ']';
- var thead = $(selector + ' thead');
- var tbody = $(selector + ' tbody');
- var tfoot = $(selector + ' tfoot');
-
- tbody.find('tr').remove();
-
- var result = data.result.result;
- for (var i = 0; i < result.length; ++i){
- generate_tr(thead, tbody, result[i]);
- }
-
- tfoot.find('td').remove();
- if (data.result.truncated) {
- var message = IPA.messages.search.truncated;
- message = message.replace('${counter}', data.result.count);
- tfoot.append($('<td />',{
- colspan:2,
- text:message}));
- } else {
- tfoot.append($('<td/>',{
- colspan:2,
- text:data.result.summary}));
- }
-
- }
-
- that.create = create;
- that.setup = setup;
- that.refresh = refresh;
-
- return that;
-};
-
-
-/**Automount*/
-
-IPA.entity_factories.automountlocation = function() {
-
- var that = IPA.entity({
- name: 'automountlocation'
- });
-
- that.init = function() {
-
- that.facet(
- IPA.search_facet({
- name: 'search',
- label: IPA.messages.facets.search,
- entity_name: that.name
- }).
- column({name:'cn'}).
- dialog(
- IPA.add_dialog({
- name: 'add',
- title: IPA.messages.objects.automountlocation.add
- }).
- field(IPA.text_widget({ name: 'cn', undo: false}))));
-
- that.facet(
- IPA.details_facet({name:'details'}).
- section(
- IPA.stanza({
- name: 'identity',
- label: IPA.messages.objects.automountlocation.identity
- }).
- input({name:'cn'})));
-
- that.create_association_facets();
- that.entity_init();
- };
-
- return that;
-};
-
-
/**pwpolicy*/
-
-
IPA.entity_factories.pwpolicy = function() {
-
- var that = IPA.entity({
- name: 'pwpolicy'
- });
-
- that.init = function() {
-
- that.facet(
- IPA.search_facet({
- name: 'search',
- label: IPA.messages.facets.search,
- entity_name: that.name
- }).
- column({name:'cn'}).
- dialog(
- IPA.add_dialog({
- name: 'add',
- title: IPA.messages.objects.pwpolicy.add,
- entity_name:'pwpolicy'
- }).
- field(IPA.text_widget({name: 'cn', undo: false})).
- field(IPA.text_widget({name: 'cospriority',
- undo: false}))));
-
- that.facet(
- IPA.details_facet({name:'details'}).
- section(
- IPA.stanza({
- name: 'identity',
- label: IPA.messages.objects.pwpolicy.identity
- }).
- input({name:'krbmaxpwdlife'}).
- input({name:'krbminpwdlife'}).
- input({name:'krbpwdhistorylength'}).
- input({name:'krbpwdmindiffchars'}).
- input({name:'krbpwdminlength'})));
- that.create_association_facets();
- that.entity_init();
-
- };
-
- return that;
+ return IPA.entity_builder().
+ entity('pwpolicy').
+ search_facet({
+ columns:['cn'],
+ add_fields:['cn', 'cospriority']}).
+ details_facet([
+ {
+ section : 'identity',
+ fields:['krbmaxpwdlife','krbminpwdlife','krbpwdhistorylength',
+ 'krbpwdmindiffchars','krbpwdminlength']
+ }]).
+ standard_associations().
+ build();
};
-
-
/**
krbtpolicy
Does not have search
*/
IPA.entity_factories.krbtpolicy = function() {
-
- var that = IPA.entity({
- name: 'krbtpolicy'
- });
-
- that.facet(
- IPA.details_facet({
- name: 'details'
- }).
- section(
- IPA.stanza({
- name: 'identity',
- label: IPA.messages.objects.krbtpolicy.identity
- }).
- //input({name: 'uid',label:' '}).
- input({name: 'krbmaxrenewableage'}).
- input({name: 'krbmaxticketlife'})));
-
- return that;
+ return IPA.entity_builder().
+ entity('krbtpolicy').
+ details_facet([{
+ section: 'identity',
+ fields:[ 'krbmaxrenewableage','krbmaxticketlife' ]
+ }]).
+ build();
};
diff --git a/install/ui/search.js b/install/ui/search.js
index 101347f98..9d22dfcc4 100644
--- a/install/ui/search.js
+++ b/install/ui/search.js
@@ -30,6 +30,7 @@ IPA.search_widget = function (spec) {
var that = IPA.table_widget(spec);
+ that.entity_name = spec.entity_name;
that.facet = spec.facet;
that.create = function(container) {
@@ -286,6 +287,7 @@ IPA.search_facet = function(spec) {
var that = IPA.facet(spec);
+ that.entity_name = spec.entity_name;
that.columns = [];
that.columns_by_name = {};
@@ -406,6 +408,7 @@ IPA.search_facet = function(spec) {
that.search_facet_create = that.create;
that.search_facet_setup = that.setup;
+
return that;
};
diff --git a/install/ui/serverconfig.js b/install/ui/serverconfig.js
index 6f54bbabe..4d1042314 100644
--- a/install/ui/serverconfig.js
+++ b/install/ui/serverconfig.js
@@ -28,29 +28,21 @@
/* Configuration */
IPA.entity_factories.config = function(){
-
- var that = IPA.entity({
- name: 'config'
- }).facet(
- IPA.details_facet().
- section(
- IPA.stanza({
- name: 'ipaserver',
- label: IPA.messages.objects.config.ipaserver
- }).
- input({
- name: 'cn',
- label: IPA.messages.objects.config.cn
- }).
- input({name:'ipacertificatesubjectbase'}).
- input({name:'ipadefaultloginshell'}).
- input({name:'ipadefaultprimarygroup'}).
- input({name:'ipagroupsearchfields'}).
- input({name:'ipahomesrootdir'}).
- input({name:'ipamaxusernamelength'}).
- input({name:'ipamigrationenabled'}).
- input({name:'ipasearchrecordslimit'}).
- input({name:'ipasearchtimelimit'}).
- input({name:'ipausersearchfields'})));
- return that;
+ return IPA.entity_builder().
+ entity('config').
+ details_facet([{
+ section: 'ipaserver',
+ label: IPA.messages.objects.config.ipaserver,
+ fields:
+ [{
+ factory: IPA.text_widget,
+ name: 'cn',
+ label: IPA.messages.objects.config.cn
+ },
+ 'ipacertificatesubjectbase','ipadefaultloginshell',
+ 'ipadefaultprimarygroup','ipagroupsearchfields',
+ 'ipahomesrootdir','ipamaxusernamelength',
+ 'ipamigrationenabled','ipasearchrecordslimit',
+ 'ipasearchtimelimit','ipausersearchfields']}]).
+ build();
}; \ No newline at end of file
diff --git a/install/ui/service.js b/install/ui/service.js
index d8d8ad501..8590550ae 100644
--- a/install/ui/service.js
+++ b/install/ui/service.js
@@ -25,9 +25,8 @@
IPA.entity_factories.service = function() {
- return IPA.entity({
- name: 'service'
- }).
+ return IPA.entity_builder().
+ entity('service').
facet(
IPA.search_facet().
column({name: 'krbprincipalname'}).
@@ -37,13 +36,45 @@ IPA.entity_factories.service = function() {
title: IPA.messages.objects.service.add,
width: '450px'
}))).
- facet(IPA.service_details_facet()).
+ details_facet([
+ {
+ section: 'details',
+ fields:['krbprincipalname',
+ {
+ factory:IPA.service_name_widget,
+ name: 'service',
+ label: IPA.messages.objects.service.service,
+ read_only: true
+ },
+ {
+ factory:IPA.service_host_widget,
+ name: 'host',
+ label: IPA.messages.objects.service.host,
+ read_only: true
+ }]
+ },
+ {
+ section : 'provisioning',
+ fields:[{
+ factory:IPA.service_provisioning_status_widget,
+ name: 'provisioning_status',
+ label: IPA.messages.objects.service.status
+ }]
+ },
+ {
+ section: 'certificate',
+ fields:[{
+ factory:IPA.service_certificate_status_widget,
+ name: 'certificate_status',
+ label: IPA.messages.objects.service.status
+ }]
+ }]).
facet(IPA.service_managedby_host_facet({
name: 'managedby_host',
add_method: 'add_host',
remove_method: 'remove_host'
- })).
- standard_associations();
+ })).
+ standard_associations().build();
};
@@ -69,12 +100,9 @@ IPA.service_select_widget = function(spec) {
container.append(select_widget);
that.parent_create(container);
};
-
return that;
-
};
-
IPA.service_add_dialog = function(spec) {
spec = spec || {};
@@ -95,15 +123,12 @@ IPA.service_add_dialog = function(spec) {
label: IPA.messages.objects.service.host,
size: 40,
undo: false
- }));
-
- var param_info = IPA.get_method_param('service_add', 'force');
-
- that.field(
+ })).
+ field(
IPA.checkbox_widget({
name: 'force',
- label: param_info.label,
- tooltip: param_info.doc,
+ label: IPA.get_method_param('service_add', 'force').label,
+ tooltip: IPA.get_method_param('service_add', 'force').doc,
undo: false
}));
@@ -126,50 +151,6 @@ IPA.service_add_dialog = function(spec) {
};
-IPA.service_details_facet = function(spec) {
-
- spec = spec || {};
-
- var that = IPA.details_facet(spec).
- section(IPA.stanza({
- name: 'details',
- label: IPA.messages.objects.service.details
- }).
- input({
- name: 'krbprincipalname'
- }).
- custom_input(IPA.service_name_widget({
- name: 'service',
- label: IPA.messages.objects.service.service,
- read_only: true
- })).
- custom_input(IPA.service_host_widget({
- name: 'host',
- label: IPA.messages.objects.service.host,
- read_only: true
- }))).
- section(
- IPA.stanza({
- name: 'provisioning',
- label: IPA.messages.objects.service.provisioning
- }).
- custom_input(IPA.service_provisioning_status_widget({
- name: 'provisioning_status',
- label: IPA.messages.objects.service.status
- }))).
- section(
- IPA.stanza({
- name: 'certificate',
- label: IPA.messages.objects.service.certificate
- }).
- custom_input((IPA.service_certificate_status_widget({
- name: 'certificate_status',
- label: IPA.messages.objects.service.status
- }))));
-
-
- return that;
-};
IPA.service_name_widget = function(spec) {
diff --git a/install/ui/sudorule.js b/install/ui/sudo.js
index a97a7720a..742895a44 100644
--- a/install/ui/sudorule.js
+++ b/install/ui/sudo.js
@@ -22,175 +22,325 @@
/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
-IPA.sudo = {};
IPA.entity_factories.sudorule = function () {
- var that = IPA.entity({
- 'name': 'sudorule'
- });
+ return IPA.entity_builder().
+ entity('sudorule').
+ search_facet({
+ columns:['cn','description','cmdcategory'],
+ add_fields:['cn']
+ }).
+ facet(IPA.sudorule_details_facet({
+ 'name': 'details'
+ })).
+ build();
+};
- that.init = function() {
+IPA.entity_factories.sudocmd = function () {
+
+ return IPA.entity_builder().
+ entity( 'sudocmd').
+ search_facet({
+ columns:['sudocmd','description'],
+ add_fields:['sudocmd','description']}).
+ details_facet([
+ {
+ section : 'general',
+ label: IPA.messages.details.general,
+ fields:['sudocmd','description']
+ },
+ {
+ section: 'groups',
+ label: IPA.messages.objects.sudocmd.groups,
+ factory: IPA.details_section,
+ fields:[{
+ factory: IPA.sudocmd_member_sudocmdgroup_table_widget,
+ name: 'memberof_sudocmdgroup',
+ label: '',//IPA.messages.objects.sudocmd.groups,
+ other_entity: 'sudocmdgroup',
+ save_values: false,
+ columns:[
+ {
+ name: 'cn',
+ primary_key: true,
+ width: '150px',
+ link_entity: true
+ },
+ {
+ name: 'description',
+ width: '150px'
+ }
+ ],
+ adder_columns:[
+ {
+ name: 'cn',
+ primary_key: true,
+ width: '100px'
+ },
+ {
+ name: 'description',
+ width: '100px'
+ }
+ ]
+ }]
+ }]).
+ build();
- var facet = IPA.sudorule_search_facet({
- 'name': 'search',
- 'label': IPA.messages.facets.search
- });
+};
- var dialog = IPA.sudo.rule_add_dialog({
- 'name': 'add',
- 'title': IPA.messages.objects.sudorule.add
- });
- facet.dialog(dialog);
+IPA.entity_factories.sudocmdgroup = function () {
+ return IPA.entity_builder().
+ entity('sudocmdgroup').
+ search_facet({
+ columns:['cn','description'],
+ add_fields:['cn','description']
+ }).
+ details_facet([
+ {
+
+ section: 'general',
+ label: IPA.messages.dialogs.general,
+ fields:['cn','description']
+ },
+ {
+ section: 'commands',
+ factory: IPA.details_section,
+ fields: [{
+ factory: IPA.association_table_widget,
+ name: 'member_sudocmd',
+ label: IPA.messages.objects.sudocmdgroup.commands,
+ other_entity: 'sudocmd',
+ save_values: false,
+ columns:[
+ {
+ name: 'sudocmd',
+ primary_key: true,
+ width: '150px',
+ link_entity: true
+ },
+ {
+ name: 'description',
+ width: '150px'
+ }
+ ],
+ adder_columns: [
+ {
+ name: 'sudocmd',
+ primary_key: true,
+ width: '100px'
+ },
+ {
+ name: 'description',
+ width: '100px'
+ }
+ ]
+ }]
+ }]).
+ build();
+};
- that.add_facet(facet);
- facet = IPA.sudorule_details_facet({
- 'name': 'details'
+/*
+* TODO: user the serial associator to perform back end operations.
+*/
+IPA.sudocmd_member_sudocmdgroup_table_widget = function (spec) {
+
+ spec = spec || {};
+
+ var that = IPA.association_table_widget(spec);
+
+ that.association_table_widget_init();
+
+ that.get_records = function(on_success, on_error) {
+
+ if (!that.values.length) return;
+
+ var batch = IPA.batch_command({
+ 'name': that.entity_name+'_'+that.name+'_show',
+ 'on_success': on_success,
+ 'on_error': on_error
});
- that.add_facet(facet);
- that.entity_init();
+ for (var i=0; i<that.values.length; i++) {
+ var value = that.values[i];
+
+ var command = IPA.command({
+ 'method': that.other_entity+'_show',
+ 'args': [value],
+ 'options': {
+ 'all': true,
+ 'rights': true
+ }
+ });
+
+ batch.add_command(command);
+ }
+
+ batch.execute();
};
- return that;
-};
+ that.add = function(values, on_success, on_error) {
+ if (!values.length) return;
-IPA.sudo.rule_add_dialog = function (spec) {
+ var batch = IPA.batch_command({
+ 'name': that.entity_name+'_'+that.name+'_add',
+ 'on_success': on_success,
+ 'on_error': on_error
+ });
- spec = spec || {};
+ var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
- var that = IPA.add_dialog(spec);
+ for (var i=0; i<values.length; i++) {
+ var value = values[i];
- that.init = function() {
+ var command = IPA.command({
+ 'method': that.other_entity+'_add_member',
+ 'args': [value]
+ });
- that.add_field(IPA.text_widget({name: 'cn', undo: false}));
+ command.set_option('sudocmd', pkey);
+
+ batch.add_command(command);
+ }
- that.add_dialog_init();
+ batch.execute();
};
- return that;
-};
+ that.remove = function(values, on_success, on_error) {
+ if (!values.length) return;
-IPA.sudorule_search_facet = function (spec) {
+ var batch = IPA.batch_command({
+ 'name': that.entity_name+'_'+that.name+'_remove',
+ 'on_success': on_success,
+ 'on_error': on_error
+ });
- spec = spec || {};
+ var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
- var that = IPA.search_facet(spec);
+ for (var i=0; i<values.length; i++) {
+ var value = values[i];
- that.init = function() {
+ var command = IPA.command({
+ 'method': that.other_entity+'_remove_member',
+ 'args': [value]
+ });
+
+ command.set_option('sudocmd', pkey);
- that.create_column({name:'cn'});
- that.create_column({name:'description'});
- that.create_column({name:'cmdcategory'});
+ batch.add_command(command);
+ }
- that.search_facet_init();
+ batch.execute();
};
return that;
};
+IPA.sudo = {};
+
+
IPA.sudorule_details_facet = function (spec) {
spec = spec || {};
var that = IPA.details_facet(spec);
- that.init = function() {
-
- var section;
+ var section;
- if (IPA.layout) {
- section = that.create_section({
- 'name': 'general',
- 'label': IPA.messages.dialogs.general,
- 'template': 'sudorule-details-general.html #contents'
- });
-
- } else {
- section = IPA.sudo.rule_details_general_section({
- 'name': 'general',
- 'label': IPA.messages.dialogs.general
- });
- that.add_section(section);
- }
-
- section.text({name: 'cn', read_only: true});
- section.textarea({name: 'description'});
- section.radio({name: 'ipaenabledflag'});
-
- section = IPA.rule_details_section({
- 'name': 'user',
- 'label': IPA.messages.objects.sudorule.user,
- 'field_name': 'usercategory',
- 'options': [
- { 'value': 'all', 'label': IPA.messages.objects.sudorule.anyone },
- { 'value': '', 'label': IPA.messages.objects.sudorule.specified_users }
- ],
- 'tables': [
- { 'field_name': 'memberuser_user' },
- { 'field_name': 'memberuser_group' }
- ]
+ if (IPA.layout) {
+ section = that.create_section({
+ 'name': 'general',
+ 'label': IPA.messages.dialogs.general,
+ 'template': 'sudorule-details-general.html #contents'
});
- that.add_section(section);
-
- var category = section.radio({ name: 'usercategory' });
- section.add_field(IPA.sudorule_association_table_widget({
- 'id': that.entity_name+'-memberuser_user',
- 'name': 'memberuser_user', 'category': category,
- 'other_entity': 'user', 'add_method': 'add_user', 'remove_method': 'remove_user',
- 'external': 'externaluser'
- }));
- section.add_field(IPA.sudorule_association_table_widget({
- 'id': that.entity_name+'-memberuser_group',
- 'name': 'memberuser_group', 'category': category,
- 'other_entity': 'group', 'add_method': 'add_user', 'remove_method': 'remove_user'
- }));
-
- section = IPA.rule_details_section({
- 'name': 'host',
- 'label': IPA.messages.objects.sudorule.host,
- 'field_name': 'hostcategory',
- 'options': [
- { 'value': 'all', 'label': IPA.messages.objects.sudorule.any_host },
- { 'value': '', 'label': IPA.messages.objects.sudorule.specified_hosts }
- ],
- 'tables': [
- { 'field_name': 'memberhost_host' },
- { 'field_name': 'memberhost_hostgroup' }
- ]
+ } else {
+ section = IPA.sudo.rule_details_general_section({
+ 'name': 'general',
+ 'label': IPA.messages.dialogs.general
});
that.add_section(section);
+ }
+
+ section.text({name: 'cn', read_only: true});
+ section.textarea({name: 'description'});
+ section.radio({name: 'ipaenabledflag'});
+
+ section = IPA.rule_details_section({
+ 'name': 'user',
+ 'label': IPA.messages.objects.sudorule.user,
+ 'field_name': 'usercategory',
+ 'options': [
+ { 'value': 'all', 'label': IPA.messages.objects.sudorule.anyone },
+ { 'value': '', 'label': IPA.messages.objects.sudorule.specified_users }
+ ],
+ 'tables': [
+ { 'field_name': 'memberuser_user' },
+ { 'field_name': 'memberuser_group' }
+ ]
+ });
+ that.add_section(section);
+
+ var category = section.radio({ name: 'usercategory' });
+ section.add_field(IPA.sudorule_association_table_widget({
+ 'id': that.entity_name+'-memberuser_user',
+ 'name': 'memberuser_user', 'category': category,
+ 'other_entity': 'user', 'add_method': 'add_user', 'remove_method': 'remove_user',
+ 'external': 'externaluser'
+ }));
+ section.add_field(IPA.sudorule_association_table_widget({
+ 'id': that.entity_name+'-memberuser_group',
+ 'name': 'memberuser_group', 'category': category,
+ 'other_entity': 'group', 'add_method': 'add_user', 'remove_method': 'remove_user'
+ }));
+
+ section = IPA.rule_details_section({
+ 'name': 'host',
+ 'label': IPA.messages.objects.sudorule.host,
+ 'field_name': 'hostcategory',
+ 'options': [
+ { 'value': 'all', 'label': IPA.messages.objects.sudorule.any_host },
+ { 'value': '', 'label': IPA.messages.objects.sudorule.specified_hosts }
+ ],
+ 'tables': [
+ { 'field_name': 'memberhost_host' },
+ { 'field_name': 'memberhost_hostgroup' }
+ ]
+ });
+ that.add_section(section);
+
+ category = section.radio({ 'name': 'hostcategory' });
+ section.add_field(IPA.sudorule_association_table_widget({
+ 'id': that.entity_name+'-memberhost_host',
+ 'name': 'memberhost_host', 'category': category,
+ 'other_entity': 'host', 'add_method': 'add_host', 'remove_method': 'remove_host',
+ 'external': 'externalhost'
+ }));
+ section.add_field(IPA.sudorule_association_table_widget({
+ 'id': that.entity_name+'-memberhost_hostgroup',
+ 'name': 'memberhost_hostgroup', 'category': category,
+ 'other_entity': 'hostgroup', 'add_method': 'add_host', 'remove_method': 'remove_host'
+ }));
+
+ section = IPA.sudo.rule_details_command_section({
+ 'name': 'command',
+ 'label': IPA.messages.objects.sudorule.command
+ });
+ that.add_section(section);
- category = section.radio({ 'name': 'hostcategory' });
- section.add_field(IPA.sudorule_association_table_widget({
- 'id': that.entity_name+'-memberhost_host',
- 'name': 'memberhost_host', 'category': category,
- 'other_entity': 'host', 'add_method': 'add_host', 'remove_method': 'remove_host',
- 'external': 'externalhost'
- }));
- section.add_field(IPA.sudorule_association_table_widget({
- 'id': that.entity_name+'-memberhost_hostgroup',
- 'name': 'memberhost_hostgroup', 'category': category,
- 'other_entity': 'hostgroup', 'add_method': 'add_host', 'remove_method': 'remove_host'
- }));
+ section = IPA.sudo.rule_details_runas_section({
+ 'name': 'runas',
+ 'label': IPA.messages.objects.sudorule.runas
+ });
+ that.add_section(section);
- section = IPA.sudo.rule_details_command_section({
- 'name': 'command',
- 'label': IPA.messages.objects.sudorule.command
- });
- that.add_section(section);
+ that.details_facet_init();
- section = IPA.sudo.rule_details_runas_section({
- 'name': 'runas',
- 'label': IPA.messages.objects.sudorule.runas
- });
- that.add_section(section);
+ that.init = function() {
- that.details_facet_init();
};
that.update = function() {
diff --git a/install/ui/sudocmd.js b/install/ui/sudocmd.js
deleted file mode 100644
index 748ec4b88..000000000
--- a/install/ui/sudocmd.js
+++ /dev/null
@@ -1,271 +0,0 @@
-/*jsl:import ipa.js */
-
-/* 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js, sudorule.js */
-
-IPA.entity_factories.sudocmd = function () {
-
- var that = IPA.entity({
- 'name': 'sudocmd'
- });
-
- that.init = function() {
-
- var facet = IPA.sudocmd_search_facet({
- 'name': 'search',
- 'label': IPA.messages.facets.search
- });
-
- var dialog = IPA.sudo.cmd_add_dialog({
- 'name': 'add',
- 'title': IPA.messages.objects.sudocmd.add
- });
- facet.dialog(dialog);
-
- that.add_facet(facet);
-
- facet = IPA.sudocmd_details_facet({
- 'name': 'details'
- });
- that.add_facet(facet);
-
- that.entity_init();
- };
-
- return that;
-};
-
-
-IPA.sudo.cmd_add_dialog = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.add_dialog(spec);
-
- that.init = function() {
-
- that.add_field(IPA.text_widget({name:'sudocmd', undo: false}));
- that.add_field(IPA.text_widget({name:'description', undo: false}));
-
- that.add_dialog_init();
- };
-
- return that;
-};
-
-
-IPA.sudocmd_search_facet = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.search_facet(spec);
-
- that.init = function() {
-
- that.create_column({name:'sudocmd', primary_key: true});
- that.create_column({name:'description'});
-
- that.search_facet_init();
- };
-
- return that;
-};
-
-
-IPA.sudocmd_details_facet = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.details_facet(spec);
-
- that.init = function() {
-
- var section = IPA.details_list_section({
- 'name': 'general',
- 'label': IPA.messages.details.general
- });
- that.add_section(section);
-
- section.text({'name': 'sudocmd'});
- section.text({'name': 'description'});
-
- section = IPA.details_section({
- 'name': 'groups',
- 'label': IPA.messages.objects.sudocmd.groups
- });
- that.add_section(section);
-
- var field = IPA.sudocmd_member_sudocmdgroup_table_widget({
- 'name': 'memberof_sudocmdgroup',
- 'label': IPA.messages.objects.sudocmd.groups,
- 'other_entity': 'sudocmdgroup',
- 'save_values': false
- });
- section.add_field(field);
-
- that.details_facet_init();
- };
-
- return that;
-};
-
-
-IPA.sudocmd_member_sudocmdgroup_table_widget = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.association_table_widget(spec);
-
- that.init = function() {
-
- var column = that.create_column({
- name: 'cn',
- primary_key: true,
- width: '150px'
- });
-
- column.setup = function(container, record) {
- container.empty();
-
- var value = record[column.name];
- value = value ? value.toString() : '';
-
- $('<a/>', {
- 'href': '#'+value,
- 'click': function (value) {
- return function() {
- var state = IPA.tab_state(that.other_entity);
- state[that.other_entity + '-facet'] = 'details';
- state[that.other_entity + '-pkey'] = value;
- $.bbq.pushState(state);
- return false;
- };
- }(value),
- 'html': value
- }).appendTo(container);
- };
-
- that.create_column({
- name: 'description',
- width: '150px'
- });
-
- that.create_adder_column({
- name: 'cn',
- primary_key: true,
- width: '100px'
- });
-
- that.create_adder_column({
- name: 'description',
- width: '100px'
- });
-
- that.association_table_widget_init();
- };
-
- that.get_records = function(on_success, on_error) {
-
- if (!that.values.length) return;
-
- var batch = IPA.batch_command({
- 'name': that.entity_name+'_'+that.name+'_show',
- 'on_success': on_success,
- 'on_error': on_error
- });
-
- for (var i=0; i<that.values.length; i++) {
- var value = that.values[i];
-
- var command = IPA.command({
- 'method': that.other_entity+'_show',
- 'args': [value],
- 'options': {
- 'all': true,
- 'rights': true
- }
- });
-
- batch.add_command(command);
- }
-
- batch.execute();
- };
-
- that.add = function(values, on_success, on_error) {
-
- if (!values.length) return;
-
- var batch = IPA.batch_command({
- 'name': that.entity_name+'_'+that.name+'_add',
- 'on_success': on_success,
- 'on_error': on_error
- });
-
- var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
-
- for (var i=0; i<values.length; i++) {
- var value = values[i];
-
- var command = IPA.command({
- 'method': that.other_entity+'_add_member',
- 'args': [value]
- });
-
- command.set_option('sudocmd', pkey);
-
- batch.add_command(command);
- }
-
- batch.execute();
- };
-
- that.remove = function(values, on_success, on_error) {
-
- if (!values.length) return;
-
- var batch = IPA.batch_command({
- 'name': that.entity_name+'_'+that.name+'_remove',
- 'on_success': on_success,
- 'on_error': on_error
- });
-
- var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
-
- for (var i=0; i<values.length; i++) {
- var value = values[i];
-
- var command = IPA.command({
- 'method': that.other_entity+'_remove_member',
- 'args': [value]
- });
-
- command.set_option('sudocmd', pkey);
-
- batch.add_command(command);
- }
-
- batch.execute();
- };
-
- return that;
-};
diff --git a/install/ui/sudocmdgroup.js b/install/ui/sudocmdgroup.js
deleted file mode 100644
index 47be03d70..000000000
--- a/install/ui/sudocmdgroup.js
+++ /dev/null
@@ -1,187 +0,0 @@
-/*jsl:import ipa.js */
-
-/* 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js, sudorule.js */
-
-IPA.entity_factories.sudocmdgroup = function () {
-
- var that = IPA.entity({
- 'name': 'sudocmdgroup'
- });
-
- that.init = function() {
-
- var facet = IPA.sudocmdgroup_search_facet({
- 'name': 'search',
- 'label': IPA.messages.facets.search
- });
-
- var dialog = IPA.sudo.cmdgroup_add_dialog({
- 'name': 'add',
- 'title': IPA.messages.objects.sudocmdgroup.add
- });
- facet.dialog(dialog);
-
- that.add_facet(facet);
-
- facet = IPA.sudocmdgroup_details_facet({
- 'name': 'details'
- });
- that.add_facet(facet);
-
- that.entity_init();
- };
-
- return that;
-};
-
-
-IPA.sudo.cmdgroup_add_dialog = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.add_dialog(spec);
-
- that.init = function() {
-
- that.add_field(IPA.text_widget({name:'cn', undo: false}));
- that.add_field(IPA.text_widget({name:'description', undo: false}));
-
- that.add_dialog_init();
- };
-
- return that;
-};
-
-
-IPA.sudocmdgroup_search_facet = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.search_facet(spec);
-
- that.init = function() {
-
- that.create_column({name:'cn', primary_key: true});
- that.create_column({name:'description'});
-
- that.search_facet_init();
- };
-
- return that;
-};
-
-
-IPA.sudocmdgroup_details_facet = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.details_facet(spec);
-
- that.init = function() {
-
- var section = IPA.details_list_section({
- 'name': 'general',
- 'label': IPA.messages.dialogs.general
- });
- that.add_section(section);
-
- section.text({'name': 'cn'});
- section.text({'name': 'description'});
-
- section = IPA.details_section({
- 'name': 'commands',
- 'label': IPA.messages.objects.sudocmdgroup.commands
- });
- that.add_section(section);
-
- var field = IPA.sudocmdgroup_member_sudocmd_table_widget({
- 'name': 'member_sudocmd',
- 'label': IPA.messages.objects.sudocmdgroup.commands,
- 'other_entity': 'sudocmd',
- 'save_values': false
- });
- section.add_field(field);
-
- that.details_facet_init();
- };
-
- return that;
-};
-
-
-IPA.sudocmdgroup_member_sudocmd_table_widget = function (spec) {
-
- spec = spec || {};
-
- var that = IPA.association_table_widget(spec);
-
- that.init = function() {
-
- var column = that.create_column({
- name: 'sudocmd',
- primary_key: true,
- width: '150px'
- });
-
- column.setup = function(container, record) {
- container.empty();
-
- var value = record[column.name];
- value = value ? value.toString() : '';
-
- $('<a/>', {
- 'href': '#'+value,
- 'html': value,
- 'click': function (value) {
- return function() {
- var state = IPA.tab_state(that.other_entity);
- state[that.other_entity + '-facet'] = 'details';
- state[that.other_entity + '-pkey'] = value;
- $.bbq.pushState(state);
- return false;
- };
- }(value)
- }).appendTo(container);
- };
-
- that.create_column({
- name: 'description',
- width: '150px'
- });
-
- that.create_adder_column({
- name: 'sudocmd',
- primary_key: true,
- width: '100px'
- });
-
- that.create_adder_column({
- name: 'description',
- width: '100px'
- });
-
- that.association_table_widget_init();
- };
-
- return that;
-};
diff --git a/install/ui/test/details_tests.js b/install/ui/test/details_tests.js
index 039be0e61..6cc8fd72d 100644
--- a/install/ui/test/details_tests.js
+++ b/install/ui/test/details_tests.js
@@ -18,6 +18,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+var details_container;
+
module('details', {
setup: function() {
@@ -27,30 +29,39 @@ module('details', {
"data",
true,
function(data, text_status, xhr) {
+ IPA.metadata = data.result.results[0];
+ IPA.messages = data.result.results[1].messages;
+ IPA.whoami = data.result.results[2].result[0];
+ IPA.env = data.result.results[3].result;
+ IPA.dns_enabled = data.result.results[4].result;
},
function(xhr, text_status, error_thrown) {
ok(false, "ipa_init() failed: "+error_thrown);
}
);
+ details_container = $('<div id="details"/>').appendTo(document.body);
+
var obj_name = 'user';
- IPA.entity_factories.user=
+ IPA.entity_factories.user=
function(){
return IPA.entity({name:obj_name});
};
IPA.start_entities();
},
teardown: function() {
+ details_container.remove();
}
});
test("Testing IPA.details_section.create().", function() {
- var section = IPA.stanza({name:'IDIDID', label:'NAMENAMENAME'}).
- input({name:'cn'}).
- input({name:'uid'}).
- input({name:'mail'});
+ var section = IPA.details_list_section({
+ name:'IDIDID', label:'NAMENAMENAME'}).
+ text({name:'cn'}).
+ text({name:'uid'}).
+ text({name:'mail'});
section.entity_name = 'user';
section.init();
@@ -143,34 +154,57 @@ test("Testing details lifecycle: create, setup, load.", function(){
load_called = true;
}
- var container = $("<div/>");
+ var container = details_container;
var obj_name = 'user';
- var widget = IPA.widget({name: 'cn'});
-
- widget.setup = function(container) {
- setup_called = true;
- widget.widget_setup(container);
- };
-
- widget.load = function(record) {
- load_called = true;
- widget.widget_load(record);
- };
-
- widget.save = function() {
- save_called = true;
- widget.widget_save();
- };
+ function test_widget(){
+ var widget = IPA.widget({name: 'cn'});
+
+ widget.setup = function(container) {
+ setup_called = true;
+ widget.widget_setup(container);
+ };
+
+ widget.load = function(record) {
+ load_called = true;
+ widget.widget_load(record);
+ };
+
+ widget.save = function() {
+ save_called = true;
+ widget.widget_save();
+ };
+ return widget;
+ }
- IPA.entity_set_details_definition(obj_name, [
- IPA.stanza({name:'identity', label:'Identity Details'}).
- custom_input(widget)
- ]);
+ var entity = IPA.
+ entity_builder().
+ entity('user').
+ details_facet([
+ {
+ section: 'identity',
+ label: IPA.messages.details.identity,
+ fields:['title','givenname','sn','cn','displayname', 'initials']
+ },
+ {
+ section: 'contact',
+ label:'contact',
+ fields:
+ [ {factory: test_widget,name:'test'},
+ {factory: IPA.multivalued_text_widget, name:'mail'},
+ {factory: IPA.multivalued_text_widget,
+ name:'telephonenumber'},
+ {factory: IPA.multivalued_text_widget, name:'pager'},
+ {factory: IPA.multivalued_text_widget, name:'mobile'},
+ {factory: IPA.multivalued_text_widget,
+ name:'facsimiletelephonenumber'}]
+ },
+ ]).build();
+ entity.init();
- var entity = IPA.fetch_entity(obj_name);
var facet = entity.get_facet('details');
+ facet.init();
facet.create(container);
facet.setup(container);
facet.load(result);
@@ -192,7 +226,7 @@ test("Testing details lifecycle: create, setup, load.", function(){
var dts = identity.find('dt');
same(
- dts.length, 1,
+ dts.length, 6,
'Checking dt tags for identity'
);
@@ -219,10 +253,11 @@ test("Testing details lifecycle: create, setup, load.", function(){
test("Testing IPA.details_section_setup again()",function(){
- var section = IPA.stanza({name: 'IDIDID', label: 'NAMENAMENAME'}).
- input({name:'cn', label:'Entity Name'}).
- input({name:'description', label:'Description'}).
- input({name:'number', label:'Entity ID'});
+ var section = IPA.details_list_section({
+ name: 'IDIDID', label: 'NAMENAMENAME'}).
+ text({name:'cn', label:'Entity Name'}).
+ text({name:'description', label:'Description'}).
+ text({name:'number', label:'Entity ID'});
var fields = section.fields;
var container = $("<div title='entity'/>");
var details = $("<div/>");
diff --git a/install/ui/test/entity_tests.js b/install/ui/test/entity_tests.js
index c901c35dd..5f7ba9e73 100644
--- a/install/ui/test/entity_tests.js
+++ b/install/ui/test/entity_tests.js
@@ -18,13 +18,46 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+
+var entities_container;
+
module('entity',{
setup: function() {
- IPA.entity_factories.user = function(){
- return IPA.entity({name:'user'})};
- IPA.start_entities();
+
+ IPA.ajax_options.async = false;
+
+ IPA.init(
+ "data",
+ true,
+ function(data, text_status, xhr) {
+ IPA.metadata = data.result.results[0];
+ IPA.messages = data.result.results[1].messages;
+ IPA.whoami = data.result.results[2].result[0];
+ IPA.env = data.result.results[3].result;
+ IPA.dns_enabled = data.result.results[4].result;
+
+ IPA.entity_factories.user = function(){
+ return IPA.
+ entity_builder().
+ entity('user').
+ search_facet({
+ columns:['uid'],
+ add_fields:[]}).
+ build();
+ };
+ IPA.start_entities();
+ },
+ function(xhr, text_status, error_thrown) {
+ ok(false, "ipa_init() failed: "+error_thrown);
+ }
+ );
+
+ entities_container = $('<div id="entities"/>').appendTo(document.body);
+
},
teardown: function() {
+ entities_container.remove();
+
}
});
@@ -34,15 +67,21 @@ test('Testing IPA.entity_set_search_definition().', function() {
return true;
};
- IPA.entity_set_search_definition('user', [
- ['uid', 'Login', uid_callback]
- ]);
- var facet = IPA.entity_get_search_facet('user');
- ok(
- facet,
- 'IPA.entity_get_search_facet(\'user\') is not null'
- );
+ var entity = IPA.
+ entity_builder().
+ entity('user').
+ search_facet({
+ columns:['uid'],
+ add_fields:[]}).
+ build();
+ entity.init();
+
+ var facet = entity.get_facet('search');
+ facet.init();
+ facet.create(entities_container);
+ facet.setup(entities_container);
+
var column = facet.get_columns()[0];
ok(
@@ -56,7 +95,7 @@ test('Testing IPA.entity_set_search_definition().', function() {
);
equals(
- column.label, 'Login',
+ column.label, 'User login',
'column.label'
);
@@ -65,111 +104,5 @@ test('Testing IPA.entity_set_search_definition().', function() {
'column.setup not null'
);
- ok(
- column.setup(),
- 'column.setup() works'
- );
});
-test('Testing ipa_facet_setup_views().', function() {
-
- var orig_switch_and_show_page = IPA.switch_and_show_page;
- IPA.ajax_options.async = false;
-
- IPA.init(
- 'data',
- true,
- function(data, text_status, xhr) {
- ok(true, 'ipa_init() succeeded.');
- },
- function(xhr, text_status, error_thrown) {
- ok(false, 'ipa_init() failed: '+error_thrown);
- }
- );
-
-
- IPA.start_entities();
-
- var entity = IPA.get_entity('user');
- var facet = IPA.search_facet({
- 'name': 'search',
- 'label': 'Search'
- });
- entity.add_facet(facet);
- entity.create_association_facets();
-
-
- var container = $('<div/>');
-
- entity.init();
- entity.setup(container);
-
- var counter = 0;
- IPA.switch_and_show_page = function(entity_name, facet_name, pkey) {
- counter++;
- };
-
- //Container now has two divs, one for the action panel one for content
- var action_panel = facet.get_action_panel();
- ok(action_panel.length, 'action panel exists');
-
- var ul = $('ul', action_panel);
-
- var views = ul.children();
-
- /*6 Views:
- one for each of 3 associations
- one for search
- one for details
- a blank one for the action controls*/
- equals(
- views.length, 6,
- 'Checking number of views'
- );
-
- var li = views.first();
- ok( li.children().first().hasClass('action-controls'),
- 'Checking that first item in list is placement for controls'
- );
-
- li = li.next(); // skip action controls
- li = li.next(); // skip the header line for Member of
-
- var attribute_members = IPA.metadata.objects['user'].attribute_members;
- for (var attribute_member in attribute_members) {
- var objects = attribute_members[attribute_member];
- for (var i = 0; i < objects.length; i++) {
- var object = objects[i];
- var title = attribute_member+'_'+object;
-
- li = li.next();
- var value = li.attr('title');
- equals(
- value, title,
- 'Checking the '+title+' facet'
- );
- }
- }
-
- 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,0,'search facet should not show up in action panel');
- var entity_facets = $('li.entity-facet', action_panel);
- /*No longer automatically adding details, so ony the assoc. facets */
- equals(entity_facets.length,4,'4 hidden entity facets in action panel');
- entity_facets.each(function() {
- ok( $(this).hasClass('entity-facet-disabled'),
- 'entity facets are disabled');
- });
-
- for ( var entity_facet = entity_facets.first();
- entity_facet.length;
- entity_facet = entity_facet.next()){
- entity_facet.click();
- }
-
- equals(counter, 0, 'links are disabled');
-
- IPA.switch_and_show_page = orig_switch_and_show_page;
-});
diff --git a/install/ui/user.js b/install/ui/user.js
index 8e1cb3f91..0ea3acf29 100644
--- a/install/ui/user.js
+++ b/install/ui/user.js
@@ -23,81 +23,67 @@
/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
-IPA.entity_factories.user = function() {
- return IPA.entity({
- name: 'user'
- }).
- facet(
- IPA.search_facet().
- column({name:'uid'}).
- column({name:'cn'}).
- column({name:'uidnumber'}).
- column({name:'mail'}).
- column({name:'telephonenumber'}).
- column({name:'title'}).
- dialog(
- IPA.add_dialog({
- 'name': 'add',
- 'title': IPA.messages.objects.user.add
- }).
- field(IPA.text_widget({ name: 'uid', undo: false })).
- field(IPA.text_widget({ name: 'givenname', undo: false })).
- field(IPA.text_widget({ name: 'sn', undo: false })))).
- facet(IPA.details_facet().
- section(
- IPA.stanza({name: 'identity', label: IPA.messages.details.identity}).
- input({name:'title'}).
- input({name:'givenname'}).
- input({name:'sn'}).
- input({name:'cn'}).
- input({name:'displayname'}).
- input({name:'initials'})).
- section(
- IPA.stanza({name: 'account', label: IPA.messages.objects.user.account}).
- custom_input(IPA.user_status_widget({name:'nsaccountlock'})).
- input({name:'uid'}).
- custom_input(IPA.user_password_widget({name:'userpassword'})).
- input({name:'uidnumber'}).
- input({name:'gidnumber'}).
- input({name:'loginshell'}).
- input({name:'homedirectory'})).
- section(
- IPA.stanza({name: 'contact', label: IPA.messages.objects.user.contact}).
- multivalued_text({name:'mail'}).
- multivalued_text({name:'telephonenumber'}).
- multivalued_text({name:'pager'}).
- multivalued_text({name:'mobile'}).
- multivalued_text({name:'facsimiletelephonenumber'})).
- section(
- IPA.stanza({name: 'mailing', label: IPA.messages.objects.user.mailing}).
- input({name:'street'}).
- input({name:'l'}).
- input({name:'st'}).
- input({name:'postalcode'})).
- section(
- IPA.stanza({name: 'employee', label: IPA.messages.objects.user.employee}).
- input({name:'ou'}).
- input({name:'manager'})).
- section(
- IPA.stanza({name: 'misc', label: IPA.messages.objects.user.misc}).
- input({name:'carlicense'}))).
- facet(
- IPA.association_facet({
- name: 'memberof_group',
- associator: IPA.serial_associator
- })).
- facet(
- IPA.association_facet({
- name: 'memberof_netgroup',
- associator: IPA.serial_associator
- })).
- facet(
- IPA.association_facet({
- name: 'memberof_role',
- associator: IPA.serial_associator
- })).
+IPA.entity_factories.user = function() {
+ var builder = IPA.entity_builder();
+ builder.
+ entity('user').
+ search_facet({
+ columns:['uid','cn','uidnumber','mail','telephonenumber','title'],
+ add_fields: ['uid','givenname','sn']
+ }).
+ details_facet([
+ {
+ section: 'identity',
+ label: IPA.messages.details.identity,
+ fields:['title','givenname','sn','cn','displayname', 'initials']
+ },
+ {
+ section: 'account',
+ fields:[{factory:IPA.user_status_widget,name:'nsaccountlock'},
+ 'uid',
+ {factory: IPA.user_password_widget,name:'userpassword'},
+ 'uidnumber','gidnumber','loginshell','homedirectory']
+ },
+ {
+ section: 'contact',
+ fields:
+ [ {factory: IPA.multivalued_text_widget, name:'mail'},
+ {factory: IPA.multivalued_text_widget, name:'telephonenumber'},
+ {factory: IPA.multivalued_text_widget, name:'pager'},
+ {factory: IPA.multivalued_text_widget, name:'mobile'},
+ {factory: IPA.multivalued_text_widget, name:'facsimiletelephonenumber'}]
+ },
+ {
+ section: 'mailing',
+ fields: ['street','l','st','postalcode']
+ },
+ {
+ section: 'employee',
+ fields: ['ou','manager']
+ },
+ {
+ section: 'misc',
+ fields:['carlicense']
+ }]).
+ association_facet({
+ name: 'memberof_group',
+ associator: IPA.serial_associator
+ }).
+ association_facet({
+ name: 'memberof_netgroup',
+ associator: IPA.serial_associator
+ }).
+ association_facet({
+ name: 'memberof_role',
+ associator: IPA.serial_associator
+ }).
standard_associations();
+
+
+ var entity = builder.build();
+
+ return entity;
};
/* ATTRIBUTE CALLBACKS */
diff --git a/install/ui/webui.js b/install/ui/webui.js
index 3223cbf05..4e2c78c47 100644
--- a/install/ui/webui.js
+++ b/install/ui/webui.js
@@ -47,6 +47,7 @@ IPA.admin_tab_set = function () {
{name:'sudocmd', entity:'sudocmd'},
{name:'sudocmdgroup', entity:'sudocmdgroup'}
]},
+// {name:'automount', entity:'automountlocation'},
{name:'pwpolicy', entity:'pwpolicy'},
{name:'krbtpolicy', entity:'krbtpolicy'}
]},