mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Code cleanup of HBAC, Sudo rules
https://fedorahosted.org/freeipa/ticket/1515
This commit is contained in:
committed by
Endi S. Dewata
parent
fdee0892f1
commit
ab667912cf
@@ -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();
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
@@ -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;
|
||||||
|
1249
install/ui/sudo.js
1249
install/ui/sudo.js
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||||
|
Reference in New Issue
Block a user