Files
freeipa/install/ui/automount.js
Petr Vobornik 18a6ab356a Inter-facet expiration
Problem:

When some facet perform action which modifies data, some other facet may become expired.

Example: User modifies group's description. Now group search facet contains old data and has to be refreshed.

Solution:

New event was added to facet: on_update. It should be executed when facet performs action which modifies data ie: details facet update or add entry to dnsrecord.

Then entity policies were introduced. Entity policies are a objects which are stored in entity.policies. They have similar function as facet_policies - performing communications and other functionality between facets. This way facets don't have to contain such logic and thus they aren't dependant on each other.

This patch adds IPA.facet_update_policy, IPA.adder_facet_update_policy, IPA.search_facet_update_policy, IPA.details_facet_update_policy.

IPA.facet_update_policy: On facets_created it bind itself to [current entity].[source facet].[event]. Default event is on_update. When the event is executed it sets expiration flag to [dest entity].[dest facet].

IPA.search_facet_update_policy: IPA.facet_update_policy where source facet = search, dest facet = details, dest entity = current entity. Its a default policy for updatein changes from search facet to details facet. Right now it isn't needed but it will be needed when action lists come to play.

IPA.details_facet_update_policy: same as IPA.search_facet_update_policy just reversed. Very important.

IPA.adder_facet_update_policy: similar functionality, just source of the event is dialog. Default event is added (new event in entity_adder_dialog).

Entity policies should be specified in entity's spec object. If none are specified a default ones are used. Default policies are: IPA.search_facet_update_policy and IPA.details_facet_update_policy.

https://fedorahosted.org/freeipa/ticket/2075
2012-03-29 13:39:53 +02:00

345 lines
10 KiB
JavaScript

/*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, facet.js, entity.js */
IPA.automount = {};
IPA.automount.location_entity = function(spec) {
var that = IPA.entity(spec);
that.init = function() {
that.entity_init();
that.builder.facet_groups([ 'automountmap', 'settings' ]).
search_facet({
title: IPA.metadata.objects.automountlocation.label,
columns:['cn']
}).
nested_search_facet({
facet_group: 'automountmap',
nested_entity: 'automountmap',
label: IPA.metadata.objects.automountmap.label,
name: 'maps',
columns: [ 'automountmapname' ]
}).
details_facet({
sections:[
{
name: 'identity',
label: IPA.messages.details.identity,
fields: [ 'cn' ]
}
]
}).
adder_dialog({
fields: [ 'cn' ]
});
};
return that;
};
IPA.automount.map_entity = function(spec) {
var that = IPA.entity(spec);
that.init = function() {
that.entity_init();
that.builder.containing_entity('automountlocation').
facet_groups([ 'automountkey', 'settings' ]).
nested_search_facet({
factory: IPA.automount.key_search_facet,
facet_group: 'automountkey',
nested_entity: 'automountkey',
search_all_entries: true,
label: IPA.metadata.objects.automountkey.label,
name: 'keys',
columns: [
{
factory: IPA.automount_key_column,
name: 'automountkey',
label: IPA.get_entity_param('automountkey', 'automountkey').label
},
'automountinformation'
]
}).
details_facet({
sections: [
{
name: 'identity',
label: IPA.messages.details.identity,
fields: [
'automountmapname',
{
type: 'textarea',
name: 'description'
}
]
}
]
}).
adder_dialog({
factory: IPA.automountmap_adder_dialog,
sections: [
{
name: 'general',
fields: [
{
type: 'radio',
name: 'method',
label: IPA.messages.objects.automountmap.map_type,
options: [
{
value: 'add',
label: IPA.messages.objects.automountmap.direct
},
{
value: 'add_indirect',
label: IPA.messages.objects.automountmap.indirect
}
]
},
'automountmapname',
{
type: 'textarea',
name: 'description'
}
]
},
{
name: 'indirect',
fields: [
{
name: 'key',
label: IPA.get_command_option(
'automountmap_add_indirect', 'key').label
},
{
name: 'parentmap',
label: IPA.get_command_option(
'automountmap_add_indirect', 'parentmap').label
}
]
}
]
});
};
return that;
};
IPA.automount.key_entity = function(spec) {
spec = spec || {};
spec.policies = spec.policies || [
IPA.facet_update_policy({
source_facet: 'details',
dest_entity: 'automountmap',
dest_facet: 'keys'
})
];
var that = IPA.entity(spec);
that.init = function() {
that.entity_init();
that.builder.containing_entity('automountmap').
details_facet({
factory: IPA.automount.key_details_facet,
sections: [
{
name:'identity',
label: IPA.messages.details.identity,
fields: [
{
name: 'automountkey',
read_only: true
},
'automountinformation'
]
}
],
disable_breadcrumb: false
}).
adder_dialog({
show_edit_page : function(entity, result){
var key = result.automountkey[0];
var info = result.automountinformation[0];
var state = IPA.nav.get_path_state(entity.name);
state[entity.name + '-facet'] = 'default';
state[entity.name + '-info'] = info;
state[entity.name + '-pkey'] = key;
IPA.nav.push_state(state);
return false;
},
fields:['automountkey','automountinformation']
});
};
return that;
};
IPA.automount.key_details_facet = function(spec) {
var that = IPA.details_facet(spec);
that.create_update_command = function() {
var command = that.details_facet_create_update_command();
command.args.pop();
var key = IPA.nav.get_state(that.entity.name + '-pkey');
var info = IPA.nav.get_state(that.entity.name + '-info');
command.options.newautomountinformation = command.options.automountinformation;
command.options.automountkey = key;
command.options.automountinformation = info;
return command;
};
that.create_refresh_command = function() {
var command = that.details_facet_create_refresh_command();
command.args.pop();
var key = IPA.nav.get_state(that.entity.name + '-pkey');
var info = IPA.nav.get_state(that.entity.name + '-info');
command.options.automountkey = key;
command.options.automountinformation = info;
return command;
};
return that;
};
IPA.automount_key_column = function(spec) {
var that = IPA.column(spec);
that.setup = function(container, record) {
container.empty();
var key = record.automountkey;
if (key instanceof Array) key = key[0];
var info = record.automountinformation;
if (info instanceof Array) info = info[0];
$('<a/>', {
href: '#'+key,
text: key,
click: function() {
var state = IPA.nav.get_path_state(that.entity.name);
state[that.entity.name + '-facet'] = 'default';
state[that.entity.name + '-info'] = info;
state[that.entity.name + '-pkey'] = key;
IPA.nav.push_state(state);
return false;
}
}).appendTo(container);
};
return that;
};
IPA.automountmap_adder_dialog = function(spec) {
var that = IPA.entity_adder_dialog(spec);
that.create = function() {
that.entity_adder_dialog_create();
var method_widget = that.widgets.get_widget('general.method');
var indirect_section = that.widgets.get_widget('indirect');
var key_field = that.fields.get_field('key');
var direct_input = $('input[value="add"]', method_widget.container);
direct_input.change(function() {
that.method = 'add';
key_field.set_required(false);
indirect_section.set_visible(false);
});
var indirect_input = $('input[value="add_indirect"]', method_widget.container);
indirect_input.change(function() {
that.method = 'add_indirect';
key_field.set_required(true);
indirect_section.set_visible(true);
});
direct_input.click();
};
that.reset = function() {
that.dialog_reset();
var method_widget = that.widgets.get_widget('general.method');
var direct_input = $('input[value="add"]', method_widget.container);
direct_input.click();
};
return that;
};
IPA.automount.key_search_facet = function(spec) {
var that = IPA.nested_search_facet(spec);
that.get_selected_values = function() {
var values = [];
$('input[name="description"]:checked', that.table.tbody).each(function() {
var value = {};
$('div', $(this).parent().parent()).each(function() {
var div = $(this);
var name = div.attr('name');
value[name] = div.text();
});
values.push(value);
});
return values;
};
return that;
};
IPA.register('automountlocation', IPA.automount.location_entity);
IPA.register('automountmap', IPA.automount.map_entity);
IPA.register('automountkey', IPA.automount.key_entity);