Code cleanup of HBAC, Sudo rules

https://fedorahosted.org/freeipa/ticket/1515
This commit is contained in:
Petr Vobornik
2011-11-29 13:36:07 +01:00
committed by Endi S. Dewata
parent fdee0892f1
commit ab667912cf
6 changed files with 1053 additions and 1214 deletions

View File

@@ -432,6 +432,7 @@ IPA.association_table_widget = function (spec) {
$('.action-button', that.table).addClass('action-button-disabled'); $('.action-button', that.table).addClass('action-button-disabled');
that.unselect_all(); that.unselect_all();
} }
that.enabled = enabled;
}; };
that.select_changed = function() { that.select_changed = function() {
@@ -483,11 +484,13 @@ IPA.association_table_widget = function (spec) {
that.load = function(result) { that.load = function(result) {
that.values = result[that.name] || []; that.values = result[that.name] || [];
that.reset(); that.update();
that.unselect_all(); that.unselect_all();
}; };
that.update = function() { that.update = function(values) {
if(values) that.values = values;
that.empty(); that.empty();

View File

@@ -577,6 +577,44 @@ IPA.link_field = function(spec) {
return that; return that;
}; };
IPA.enable_field = function(spec) {
spec = spec || {};
var that = IPA.radio_field(spec);
that.enable_method = spec.enable_method || 'enable';
that.disable_method = spec.enable_method || 'disable';
that.enable_option = spec.enable_option || 'TRUE';
that.get_update_info = function() {
var info = IPA.update_info_builder.new_update_info();
if(that.test_dirty()) {
var values = that.save();
var method = that.disable_method;
if(values[0] === that.enable_option) {
method = that.enable_method;
}
var command = IPA.command({
entity: that.entity.name,
method: method,
args: that.entity.get_primary_key(),
options: {all: true, rights: true}
});
info.append_command(command, that.priority);
}
return info;
};
return that;
};
IPA.field_container = function(spec) { IPA.field_container = function(spec) {
spec = spec || {}; spec = spec || {};
@@ -686,3 +724,4 @@ IPA.field_factories['textarea'] = IPA.field;
IPA.field_factories['entity_select'] = IPA.combobox_field; IPA.field_factories['entity_select'] = IPA.combobox_field;
IPA.field_factories['combobox'] = IPA.combobox_field; IPA.field_factories['combobox'] = IPA.combobox_field;
IPA.field_factories['link'] = IPA.link_field; IPA.field_factories['link'] = IPA.link_field;
IPA.field_factories['enable'] = IPA.enable_field;

View File

@@ -23,7 +23,11 @@
/* REQUIRES: ipa.js, details.js, search.js, add.js, facet.js, entity.js */ /* REQUIRES: ipa.js, details.js, search.js, add.js, facet.js, entity.js */
IPA.hbac = {}; IPA.hbac = {
//priority of commands in details facet
remove_method_priority: IPA.config.default_priority - 1,
enable_priority: IPA.config.default_priority + 1
};
IPA.hbac.rule_entity = function(spec) { IPA.hbac.rule_entity = function(spec) {
@@ -40,7 +44,9 @@ IPA.hbac.rule_entity = function(spec) {
] ]
}). }).
details_facet({ details_facet({
factory: IPA.hbacrule_details_facet factory: IPA.hbacrule_details_facet,
entity: that,
command_mode: 'info'
}). }).
adder_dialog({ adder_dialog({
fields: [ 'cn' ] fields: [ 'cn' ]
@@ -70,7 +76,7 @@ IPA.hbac.service_entity = function(spec) {
fields: [ fields: [
'cn', 'cn',
{ {
factory: IPA.textarea_widget, type: 'textarea',
name: 'description' name: 'description'
} }
] ]
@@ -105,7 +111,7 @@ IPA.hbac.service_entity = function(spec) {
fields: [ fields: [
'cn', 'cn',
{ {
factory: IPA.textarea_widget, type: 'textarea',
name: 'description' name: 'description'
} }
] ]
@@ -135,7 +141,7 @@ IPA.hbac.service_group_entity = function(spec) {
fields: [ fields: [
'cn', 'cn',
{ {
factory: IPA.textarea_widget, type: 'textarea',
name: 'description' name: 'description'
} }
] ]
@@ -169,7 +175,7 @@ IPA.hbac.service_group_entity = function(spec) {
fields: [ fields: [
'cn', 'cn',
{ {
factory: IPA.textarea_widget, type: 'textarea',
name: 'description' name: 'description'
} }
] ]
@@ -181,395 +187,341 @@ IPA.hbac.service_group_entity = function(spec) {
IPA.hbacrule_details_facet = function(spec) { IPA.hbacrule_details_facet = function(spec) {
spec = spec || {}; var entity_name = spec.entity.name;
//
// General
//
spec.fields = [
{
name: 'cn',
read_only: true,
widget: 'general.cn'
},
{
type: 'textarea',
name: 'description',
widget: 'general.description'
},
{
type: 'enable',
name: 'ipaenabledflag',
priority: IPA.sudo.enable_priority,
widget: 'general.ipaenabledflag'
}
];
spec.widgets = [
{
type: 'details_table_section',
name: 'general',
label: IPA.messages.details.general,
widgets: [
{
name: 'cn'
},
{
type: 'textarea',
name: 'description'
},
{
type: 'enable',
name: 'ipaenabledflag',
options: [
{ value: 'TRUE', label: IPA.get_message('true') },
{ value: 'FALSE', label: IPA.get_message('false') }
]
}
]
}
];
//
// Users
//
spec.fields.push(
{
type: 'radio',
name: 'usercategory',
widget: 'user.rule.usercategory'
},
{
type: 'rule_association_table',
name: 'memberuser_user',
widget: 'user.rule.memberuser_user',
priority: IPA.hbac.remove_method_priority
},
{
type: 'rule_association_table',
name: 'memberuser_group',
widget: 'user.rule.memberuser_group',
priority: IPA.hbac.remove_method_priority
}
);
spec.widgets.push(
{
factory: IPA.collapsible_section,
name: 'user',
label: IPA.messages.objects.hbacrule.user,
widgets: [
{
factory: IPA.rule_details_widget,
name: 'rule',
radio_name: 'usercategory',
options: [
{ value: 'all',
label: IPA.messages.objects.hbacrule.anyone },
{ value: '',
label: IPA.messages.objects.hbacrule.specified_users }
],
tables: [
{ name: 'memberuser_user' },
{ name: 'memberuser_group' }
],
widgets: [
{
type: 'rule_association_table',
id: entity_name+'-memberuser_user',
name: 'memberuser_user',
add_method: 'add_user',
remove_method: 'remove_user',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
},
{
type: 'rule_association_table',
id: entity_name+'-memberuser_group',
name: 'memberuser_group',
add_method: 'add_user',
remove_method: 'remove_user',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
}
]
}
]
}
);
//
// Hosts
//
spec.fields.push(
{
type: 'radio',
name: 'hostcategory',
widget: 'host.rule.hostcategory'
},
{
type: 'rule_association_table',
name: 'memberhost_host',
widget: 'host.rule.memberhost_host',
priority: IPA.hbac.remove_method_priority
},
{
type: 'rule_association_table',
name: 'memberhost_hostgroup',
widget: 'host.rule.memberhost_hostgroup',
priority: IPA.hbac.remove_method_priority
}
);
spec.widgets.push(
{
factory: IPA.collapsible_section,
name: 'host',
label: IPA.messages.objects.hbacrule.host,
widgets: [
{
factory: IPA.rule_details_widget,
name: 'rule',
radio_name: 'hostcategory',
options: [
{
'value': 'all',
'label': IPA.messages.objects.hbacrule.any_host
},
{
'value': '',
'label': IPA.messages.objects.hbacrule.specified_hosts
}
],
tables: [
{ 'name': 'memberhost_host' },
{ 'name': 'memberhost_hostgroup' }
],
widgets: [
{
type: 'rule_association_table',
id: entity_name+'-memberuser_user',
name: 'memberhost_host',
add_method: 'add_host',
remove_method: 'remove_host',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
},
{
type: 'rule_association_table',
id: entity_name+'-memberuser_group',
name: 'memberhost_hostgroup',
add_method: 'add_host',
remove_method: 'remove_host',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
}
]
}
]
}
);
//
// Service
//
spec.fields.push(
{
type: 'radio',
name: 'servicecategory',
widget: 'service.rule.servicecategory'
},
{
type: 'rule_association_table',
name: 'memberservice_hbacsvc',
widget: 'service.rule.memberservice_hbacsvc',
priority: IPA.hbac.remove_method_priority
},
{
type: 'rule_association_table',
name: 'memberservice_hbacsvcgroup',
widget: 'service.rule.memberservice_hbacsvcgroup',
priority: IPA.hbac.remove_method_priority
}
);
spec.widgets.push(
{
factory: IPA.collapsible_section,
name: 'service',
label: IPA.messages.objects.hbacrule.service,
widgets: [
{
factory: IPA.rule_details_widget,
name: 'rule',
radio_name: 'servicecategory',
options: [
{ 'value': 'all', 'label': IPA.messages.objects.hbacrule.any_host },
{ 'value': '', 'label': IPA.messages.objects.hbacrule.specified_hosts }
],
tables: [
{ 'name': 'memberservice_hbacsvc' },
{ 'name': 'memberservice_hbacsvcgroup' }
],
widgets: [
{
type: 'rule_association_table',
id: entity_name+'-memberuser_user',
name: 'memberservice_hbacsvc',
add_method: 'add_service',
remove_method: 'remove_service',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
},
{
type: 'rule_association_table',
id: entity_name+'-memberuser_group',
name: 'memberservice_hbacsvcgroup',
add_method: 'add_service',
remove_method: 'remove_service',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
}
]
}
]
}
);
//
// Source host
//
spec.fields.push(
{
type: 'radio',
name: 'sourcehostcategory',
widget: 'sourcehost.rule.sourcehostcategory'
},
{
type: 'rule_association_table',
name: 'sourcehost_host',
widget: 'sourcehost.rule.sourcehost_host',
priority: IPA.hbac.remove_method_priority
},
{
type: 'rule_association_table',
name: 'sourcehost_hostgroup',
widget: 'sourcehost.rule.sourcehost_hostgroup',
priority: IPA.hbac.remove_method_priority
}
);
spec.widgets.push(
{
factory: IPA.collapsible_section,
name: 'sourcehost',
label: IPA.messages.objects.hbacrule.sourcehost,
widgets: [
{
factory: IPA.rule_details_widget,
name: 'rule',
radio_name: 'sourcehostcategory',
options: [
{ 'value': 'all', 'label': IPA.messages.objects.hbacrule.any_host },
{ 'value': '', 'label': IPA.messages.objects.hbacrule.specified_hosts }
],
tables: [
{ 'name': 'sourcehost_host' },
{ 'name': 'sourcehost_hostgroup' }
],
widgets: [
{
type: 'rule_association_table',
id: entity_name+'-memberuser_user',
name: 'sourcehost_host',
add_method: 'add_sourcehost',
remove_method: 'remove_sourcehost',
add_title: IPA.messages.association.add.sourcehost,
remove_title: IPA.messages.association.remove.sourcehost
},
{
type: 'rule_association_table',
id: entity_name+'-memberuser_group',
name: 'sourcehost_hostgroup',
add_method: 'add_sourcehost',
remove_method: 'remove_sourcehost',
add_title: IPA.messages.association.add.sourcehost,
remove_title: IPA.messages.association.remove.sourcehost
}
]
}
]
}
);
var that = IPA.details_facet(spec); var that = IPA.details_facet(spec);
function general_section(){ that.on_update_success = function(data, text_status, xhr) {
var section = IPA.details_table_section({ that.refresh();
name: 'general',
entity: that.entity,
label: IPA.messages.details.general
});
section.text({
name: 'cn'
});
section.textarea({
name: 'description'
});
section.radio({
name: 'ipaenabledflag',
options: [
{ value: 'TRUE', label: IPA.get_message('true') },
{ value: 'FALSE', label: IPA.get_message('false') }
]
});
return section;
}
function user_category_section(){
var section = IPA.rule_details_section({
name: 'user',
entity: that.entity,
label: IPA.messages.objects.hbacrule.user,
field_name: 'usercategory',
options: [
{ value: 'all', label: IPA.messages.objects.hbacrule.anyone },
{ value: '',
label: IPA.messages.objects.hbacrule.specified_users }
],
tables: [
{ field_name: 'memberuser_user' },
{ field_name: 'memberuser_group' }
]
});
section.add_field(IPA.radio_widget({
name: 'usercategory'
}));
section.add_field(IPA.association_table_widget({
id: that.entity.name+'-memberuser_user',
name: 'memberuser_user',
entity: that.entity,
add_method: 'add_user',
remove_method: 'remove_user',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
}));
section.add_field(IPA.association_table_widget({
id: that.entity.name+'-memberuser_group',
name: 'memberuser_group',
entity: that.entity,
add_method: 'add_user',
remove_method: 'remove_user',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
}));
return section;
}
function hostcategory_section(){
var section = IPA.rule_details_section({
name: 'host',
label: IPA.messages.objects.hbacrule.host,
entity: that.entity,
field_name: 'hostcategory',
options: [
{ value: 'all', label: IPA.messages.objects.hbacrule.any_host },
{ value: '',
label: IPA.messages.objects.hbacrule.specified_hosts }
],
tables: [
{ field_name: 'memberhost_host' },
{ field_name: 'memberhost_hostgroup' }
]
});
section.add_field(IPA.radio_widget({
name: 'hostcategory'
}));
section.add_field(IPA.association_table_widget({
id: that.entity.name+'-memberhost_host',
name: 'memberhost_host',
entity: that.entity,
add_method: 'add_host',
remove_method: 'remove_host',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
}));
section.add_field(IPA.association_table_widget({
id: that.entity.name+'-memberhost_hostgroup',
name: 'memberhost_hostgroup',
entity: that.entity,
add_method: 'add_host',
remove_method: 'remove_host',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
}));
return section;
}
function servicecategory_section(){
var section = IPA.rule_details_section({
name: 'service',
entity: that.entity,
label: IPA.messages.objects.hbacrule.service,
field_name: 'servicecategory',
options: [
{ value: 'all',
label: IPA.messages.objects.hbacrule.any_service },
{ value: '',
label: IPA.messages.objects.hbacrule.specified_services }
],
tables: [
{ field_name: 'memberservice_hbacsvc' },
{ field_name: 'memberservice_hbacsvcgroup' }
]
});
section.add_field(IPA.radio_widget({
name: 'servicecategory'
}));
section.add_field(IPA.association_table_widget({
id: that.entity.name+'-memberservice_hbacsvc',
name: 'memberservice_hbacsvc',
entity: that.entity,
add_method: 'add_service',
remove_method: 'remove_service',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
}));
section.add_field(IPA.association_table_widget({
id: that.entity.name+'-memberservice_hbacsvcgroup',
name: 'memberservice_hbacsvcgroup',
entity: that.entity,
add_method: 'add_service',
remove_method: 'remove_service',
add_title: IPA.messages.association.add.member,
remove_title: IPA.messages.association.remove.member
}));
return section;
}
function sourcehostcategory_section(){
var section = IPA.rule_details_section({
name: 'sourcehost',
entity: that.entity,
label: IPA.messages.objects.hbacrule.sourcehost,
field_name: 'sourcehostcategory',
options: [
{ value: 'all', label: IPA.messages.objects.hbacrule.any_host },
{ value: '',
label: IPA.messages.objects.hbacrule.specified_hosts }
],
tables: [
{ field_name: 'sourcehost_host' },
{ field_name: 'sourcehost_hostgroup' }
]
});
section.add_field(IPA.radio_widget({
name: 'sourcehostcategory'
}));
section.add_field(IPA.association_table_widget({
id: that.entity.name+'-sourcehost_host',
name: 'sourcehost_host',
entity: that.entity,
add_method: 'add_sourcehost',
remove_method: 'remove_sourcehost',
add_title: IPA.messages.association.add.sourcehost,
remove_title: IPA.messages.association.remove.sourcehost
}));
section.add_field(IPA.association_table_widget({
id: that.entity.name+'-sourcehost_hostgroup',
name: 'sourcehost_hostgroup',
entity: that.entity,
add_method: 'add_sourcehost',
remove_method: 'remove_sourcehost',
add_title: IPA.messages.association.add.sourcehost,
remove_title: IPA.messages.association.remove.sourcehost
}));
return section;
}
that.update = function(on_success, on_error) {
var args = that.get_primary_key();
var modify_operation = {
'execute': false,
'command': IPA.command({
entity: that.entity.name,
method: 'mod',
args: args,
options: {all: true, rights: true}
})
};
var categories = {
'usercategory': {
'remove_values': false
},
'hostcategory': {
'remove_values': false
},
'servicecategory': {
'remove_values': false
},
'sourcehostcategory': {
'remove_values': false
}
};
var member_operations = {
'memberuser': {
'category': 'usercategory',
'has_values': false,
'command': IPA.command({
entity: that.entity.name,
method: 'remove_user',
args: args,
options: {all: true, rights: true}
})
},
'memberhost': {
'category': 'hostcategory',
'has_values': false,
'command': IPA.command({
entity: that.entity.name,
method: 'remove_host',
args: args,
options: {all: true, rights: true}
})
},
'memberservice': {
'category': 'servicecategory',
'has_values': false,
'command': IPA.command({
entity: that.entity.name,
method: 'remove_service',
args: args,
options: {all: true, rights: true}
})
},
'sourcehost': {
'category': 'sourcehostcategory',
'has_values': false,
'command': IPA.command({
entity: that.entity.name,
method: 'remove_sourcehost',
args: args,
options: {all: true, rights: true}
})
}
};
var enable_operation = {
'execute': false,
'command': IPA.command({
entity: that.entity.name,
method: 'enable',
args: args,
options: {all: true, rights: true}
})
};
var record = {};
that.save(record);
var sections = that.sections.values;
for (var i=0; i<sections.length; i++) {
var section = sections[i];
var section_fields = section.fields.values;
for (var j=0; j<section_fields.length; j++) {
var field = section_fields[j];
// association tables are never dirty, so call
// is_dirty() after checking table values
var values = record[field.name];
if (!values) continue;
var metadata = field.metadata;
// skip primary key
if (metadata && metadata.primary_key) continue;
var p = field.name.indexOf('_');
if (p >= 0) {
// prepare command to remove members if needed
var attribute = field.name.substring(0, p);
var other_entity = field.name.substring(p+1);
if (values.length) {
member_operations[attribute].command.set_option(other_entity, values.join(','));
member_operations[attribute].has_values = true;
}
continue;
}
// skip unchanged field
if (!field.is_dirty()) continue;
// check enable/disable
if (field.name == 'ipaenabledflag') {
if (values[0] == 'FALSE') enable_operation.command.method = 'disable';
enable_operation.execute = true;
continue;
}
if (categories[field.name]) {
if (values[0] == 'all') {
categories[field.name].remove_values = true;
}
}
if (metadata) {
if (values.length == 1) {
modify_operation.command.set_option(field.name, values[0]);
} else if (field.join) {
modify_operation.command.set_option(field.name, values.join(','));
} else {
modify_operation.command.set_option(field.name, values);
}
} else {
if (values.length) {
modify_operation.command.set_option('setattr', field.name+'='+values[0]);
} else {
modify_operation.command.set_option('setattr', field.name+'=');
}
for (var l=1; l<values.length; l++) {
modify_operation.command.set_option('addattr', field.name+'='+values[l]);
}
}
modify_operation.execute = true;
}
}
var batch = IPA.batch_command({
'name': 'hbac_details_update',
'on_success': function(data, text_status, xhr) {
that.refresh();
if (on_success) on_success.call(this, data, text_status, xhr);
},
'on_error': function(xhr, text_status, error_thrown) {
that.refresh();
if (on_error) on_error.call(this, xhr, text_status, error_thrown);
}
});
for (var member_attribute in member_operations) {
var member_operation = member_operations[member_attribute];
if (member_operation.has_values &&
categories[member_operation.category].remove_values) {
batch.add_command(member_operations[member_attribute].command);
}
}
if (modify_operation.execute) batch.add_command(modify_operation.command);
if (enable_operation.execute) batch.add_command(enable_operation.command);
if (!batch.commands.length) {
that.refresh();
return;
}
batch.execute();
}; };
/*initialization*/ that.on_update_error = function(xhr, text_status, error_thrown) {
that.add_section(general_section()); that.refresh();
that.add_section(user_category_section()); };
that.add_section(hostcategory_section());
that.add_section(servicecategory_section());
that.add_section(sourcehostcategory_section());
return that; return that;
}; };

View File

@@ -22,84 +22,187 @@
/* REQUIRES: ipa.js, details.js, search.js, add.js, facet.js, entity.js */ /* REQUIRES: ipa.js, details.js, search.js, add.js, facet.js, entity.js */
IPA.rule_details_section = function(spec) { IPA.rule_details_widget = function(spec) {
spec = spec || {}; spec = spec || {};
var that = IPA.details_section(spec); var that = IPA.composite_widget(spec);
that.field_name = spec.field_name; that.radio_name = spec.radio_name;
that.options = spec.options || []; that.options = spec.options || [];
that.tables = spec.tables || []; that.tables = spec.tables || [];
that.columns = spec.columns; that.columns = spec.columns;
that.init = function() {
that.enable_radio = IPA.radio_widget({
name: that.radio_name,
options: that.options
});
that.widgets.add_widget(that.enable_radio);
that.enable_radio.value_changed.attach(that.on_enable_radio_changed);
};
that.on_enable_radio_changed = function(value) {
if(value.length > 0) {
var enabled = ('' === value[0]);
for (var i=0; i<that.tables.length; i++) {
var table = that.tables[i];
var table_widget = that.widgets.get_widget(table.name);
table_widget.set_enabled(enabled);
}
}
};
that.create = function(container) { that.create = function(container) {
that.container = container; that.container = container;
var field = that.fields.get_field(that.field_name); //enable radios
var metadata = IPA.get_entity_param(that.entity.name, that.field_name); var param_info = IPA.get_entity_param(that.entity.name, that.radio_name);
var title = param_info ? param_info.doc : that.radio_name;
container.append(metadata.doc+':'); var enable_radio_container = $('<div/>', {
name: that.radio_name,
var span = $('<span/>', { title: title,
name: that.field_name,
title: metadata.doc,
'class': 'field' 'class': 'field'
}).appendTo(container); }).appendTo(container);
enable_radio_container.append(title+': ');
that.enable_radio.create(enable_radio_container);
//tables
function update_tables(value) {
var enabled = ('' === value);
for (var i=0; i<that.tables.length; i++) {
var table = that.tables[i];
var field = that.fields.get_field(table.field_name);
field.set_enabled(enabled);
}
}
if (that.options.length) {
var category = that.fields.get_field(that.field_name);
category.options=that.options;
category.reset = function() {
category.widget_reset();
var values = category.save();
if (values.length === 0){
return;
}
var value = values[0];
update_tables(value);
};
category.create(span);
var inputs = $('input[name='+that.field_name+']', container);
inputs.change(function() {
var input = $(this);
var value = input.val();
update_tables(value);
});
}
for (var j=0; j<that.tables.length; j++) { for (var j=0; j<that.tables.length; j++) {
var table = that.tables[j]; var table = that.tables[j];
metadata = IPA.get_entity_param(that.entity.name, table.field_name); var metadata = IPA.get_entity_param(that.entity.name, table.name);
var table_span = $('<span/>', { var table_container = $('<div/>', {
name: table.field_name, name: table.name,
title: metadata ? metadata.doc : table.field_name, title: metadata ? metadata.doc : table.name,
'class': 'field' 'class': 'field'
}).appendTo(span); }).appendTo(container);
field = that.fields.get_field(table.field_name); var widget = that.widgets.get_widget(table.name);
field.create(table_span); widget.create(table_container);
} }
};
that.init();
return that;
};
IPA.rule_association_table_widget = function(spec) {
spec = spec || {};
var that = IPA.association_table_widget(spec);
that.external = spec.external;
that.enabled = spec.enabled !== undefined ? spec.enabled : true;
that.create_add_dialog = function() {
var entity_label = that.entity.metadata.label_singular;
var pkey = IPA.nav.get_state(that.entity.name+'-pkey');
var other_entity_label = IPA.metadata.objects[that.other_entity].label;
var title = that.add_title;
title = title.replace('${entity}', entity_label);
title = title.replace('${primary_key}', pkey);
title = title.replace('${other_entity}', other_entity_label);
return IPA.rule_association_adder_dialog({
title: title,
pkey: pkey,
other_entity: that.other_entity,
attribute_member: that.attribute_member,
entity: that.entity,
external: that.external,
exclude: that.values
});
};
return that;
};
IPA.rule_association_table_field = function(spec) {
spec = spec || {};
var that = IPA.field(spec);
that.load = function(result) {
that.values = result[that.name] || [];
if (that.external) {
var external_values = result[that.external] || [];
$.merge(that.values, external_values);
}
that.widget.update(that.values);
that.widget.unselect_all();
};
that.get_update_info = function() {
var update_info = IPA.update_info_builder.new_update_info();
//association_table_widget performs basic add and remove operation
//immediately. Rule association field test if its enabled and if not it
//performs delete operation.
if (!that.widget.enabled) {
var values = that.save();
if (values.length > 0) { //no need to delete if has no values
var command = IPA.command({
entity: that.entity.name,
method: that.widget.remove_method,
args: that.entity.get_primary_key(),
options: {all: true, rights: true}
});
command.set_option(that.widget.other_entity, values.join(','));
update_info.append_command(command, that.priority);
}
}
return update_info;
};
return that;
};
IPA.widget_factories['rule_association_table'] = IPA.rule_association_table_widget;
IPA.field_factories['rule_association_table'] = IPA.rule_association_table_field;
IPA.rule_association_adder_dialog = function(spec) {
spec = spec || {};
var that = IPA.association_adder_dialog(spec);
that.external = spec.external;
that.add = function() {
var rows = that.available_table.remove_selected_rows();
that.selected_table.add_rows(rows);
if (that.external) {
var pkey_name = IPA.metadata.objects[that.other_entity].primary_key;
var value = that.external_field.val();
if (!value) return;
var record = {};
record[pkey_name] = value;
that.selected_table.add_record(record);
that.external_field.val('');
}
}; };
return that; return that;

File diff suppressed because it is too large Load Diff

View File

@@ -1951,6 +1951,36 @@ IPA.details_table_section_nc = function(spec) {
return that; return that;
}; };
IPA.enable_widget = function(spec) {
spec = spec || {};
var that = IPA.radio_widget(spec);
return that;
};
IPA.header_widget = function(spec) {
spec = spec || {};
var that = IPA.widget(spec);
that.level = spec.level || 3;
that.text = spec.text;
that.description = spec.description;
that.create = function(container) {
container.append($('<h'+that.level+' />', {
text: that.text,
title: that.description
}));
};
return that;
};
IPA.observer = function(spec) { IPA.observer = function(spec) {
var that = {}; var that = {};
@@ -2151,3 +2181,4 @@ IPA.widget_factories['combobox'] = IPA.combobox_widget;
IPA.widget_factories['link'] = IPA.link_widget; IPA.widget_factories['link'] = IPA.link_widget;
IPA.widget_factories['details_table_section'] = IPA.details_table_section; IPA.widget_factories['details_table_section'] = IPA.details_table_section;
IPA.widget_factories['details_table_section_nc'] = IPA.details_table_section_nc; IPA.widget_factories['details_table_section_nc'] = IPA.details_table_section_nc;
IPA.widget_factories['enable'] = IPA.enable_widget;