webui: stageusers, display page elements based on user state

Reviewed-By: David Kupka <dkupka@redhat.com>
Reviewed-By: Thierry Bordaz <tbordaz@redhat.com>
This commit is contained in:
Petr Vobornik 2015-05-14 13:30:49 +02:00
parent 52647285f6
commit 99d282d38d
7 changed files with 222 additions and 29 deletions

View File

@ -144,6 +144,8 @@
"classes": [ "classes": [
"*facet_policy", "*facet_policy",
"IPA.hide_empty_row_policy", "IPA.hide_empty_row_policy",
"IPA.user.preserved_user_policy",
"IPA.user.stageuser_sidebar_policy",
"aci.permission_target_policy", "aci.permission_target_policy",
"aci.permission_managed_policy" "aci.permission_managed_policy"
] ]
@ -158,8 +160,8 @@
"name": "Evaluators & Summaries", "name": "Evaluators & Summaries",
"classes": [ "classes": [
"*_evaluator", "*_evaluator",
"details.enabled_summary_cond", "facet.summary_cond",
"details.disabled_summary_cond" "*_summary_cond"
] ]
}, },

View File

@ -504,6 +504,16 @@ table.scrollable tbody {
margin-right: 5px; margin-right: 5px;
} }
.facet-title.preserved .header-icon:before {
content: "\f014";
margin-right: 5px;
}
.facet-title.staging .header-icon:before {
content: "\f0ad";
margin-right: 5px;
}
.facet-title.disabled h1, .facet-title.disabled h1,
.facet-title.disabled h1 .facet-pkey{ .facet-title.disabled h1 .facet-pkey{
color: gray; color: gray;

View File

@ -34,7 +34,8 @@ define([
'./widget', './widget',
'./facet', './facet',
'./add'], './add'],
function(lang, builder, IPA, $, phases, reg, rpc, su, text, widget_mod) { function(lang, builder, IPA, $, phases, reg, rpc, su, text, widget_mod,
facet_mod) {
/** /**
* Details module * Details module
@ -1957,11 +1958,11 @@ exp.delete_action = IPA.delete_action = function(spec) {
* *
* @class details.enabled_summary_cond * @class details.enabled_summary_cond
* @alternateClassName IPA.enabled_summary_cond * @alternateClassName IPA.enabled_summary_cond
* @extends facet.summary_cond
*/ */
exp.enabled_summary_cond = IPA.enabled_summary_cond = function() { exp.enabled_summary_cond = IPA.enabled_summary_cond = function() {
var that = IPA.object(); var that = facet_mod.summary_cond ({
lang.mixin(that, {
pos: ['enabled'], pos: ['enabled'],
neg: [], neg: [],
description: text.get('@i18n:status.enabled'), description: text.get('@i18n:status.enabled'),
@ -1975,10 +1976,10 @@ exp.enabled_summary_cond = IPA.enabled_summary_cond = function() {
* *
* @class details.disabled_summary_cond * @class details.disabled_summary_cond
* @alternateClassName IPA.disabled_summary_cond * @alternateClassName IPA.disabled_summary_cond
* @extends facet.summary_cond
*/ */
exp.disabled_summary_cond = IPA.disabled_summary_cond = function() { exp.disabled_summary_cond = IPA.disabled_summary_cond = function() {
var that = IPA.object(); var that = facet_mod.summary_cond({
lang.mixin(that, {
pos: [], pos: [],
neg: ['enabled'], neg: ['enabled'],
description: text.get('@i18n:status.disabled'), description: text.get('@i18n:status.disabled'),

View File

@ -2716,7 +2716,8 @@ exp.state = IPA.state = function(spec) {
* Summary conditions * Summary conditions
* @property {Array.<Object>} * @property {Array.<Object>}
*/ */
that.summary_conditions = builder.build('', spec.summary_conditions) || []; that.summary_conditions = builder.build('', spec.summary_conditions, {},
{ $factory: exp.summary_cond }) || [];
/** /**
* Initializes evaluators * Initializes evaluators
@ -2794,6 +2795,42 @@ exp.state = IPA.state = function(spec) {
return that; return that;
}; };
/**
* Summary condition base class
*
* @class facet.summary_cond
*/
exp.summary_cond = function(spec) {
var that = IPA.object();
/**
* State which must be present in order to be positively evaluated
* @property {string[]}
*/
that.pos = spec.pos || [];
/**
* State which must not be present in order to be positively evaluated
* @property {string[]}
*/
that.neg = spec.neg || [];
/**
* States which will be set in positive evaluation
* @property {string[]}
*/
that.state = spec.state || [];
/**
* Description which will be set in positive evaluation
* @property {string}
*/
that.description = spec.description || '';
return that;
};
/** /**
* Summary evaluator for {@link facet.state} * Summary evaluator for {@link facet.state}
* @class facet.summary_evaluator * @class facet.summary_evaluator
@ -2926,6 +2963,37 @@ exp.state_evaluator = IPA.state_evaluator = function(spec) {
return that; return that;
}; };
/**
* Noop evaluator always sets the state on post_load on the first time
* @class facet.noop_state_evaluator
* @extends facet.state_evaluator
* @alternateClassName IPA.noop_state_evaluator
*/
exp.noop_state_evaluator = IPA.noop_state_evaluator = function(spec) {
spec = spec || {};
spec.event = spec.event || 'post_load';
var that = IPA.state_evaluator(spec);
that.name = spec.name || 'noop_state_evaluator';
/**
* States to be set
* @property {string[]}
*/
that.state = spec.state || [];
/**
* @inheritDoc
*/
that.on_event = function() {
that.notify_on_change(that.state);
};
return that;
};
/** /**
* Sets 'dirty' state when facet is dirty * Sets 'dirty' state when facet is dirty
* @class facet.dirty_state_evaluator * @class facet.dirty_state_evaluator

View File

@ -1494,7 +1494,9 @@ reg.set('validator', field.validator_builder.registry);
field.adapter_builder = builder.get('adapter'); field.adapter_builder = builder.get('adapter');
field.adapter_builder.ctor = field.Adapter; field.adapter_builder.ctor = field.Adapter;
field.adapter_builder.post_ops.push(function(obj, spec, context) { field.adapter_builder.post_ops.push(function(obj, spec, context) {
obj.context = context.context; if (context.context) {
obj.context = context.context;
}
return obj; return obj;
} }
); );

View File

@ -78,6 +78,9 @@ return {
label: '@i18n:buttons.activate', label: '@i18n:buttons.activate',
icon: 'fa-check' icon: 'fa-check'
} }
],
policies: [
mod_user.stageuser_sidebar_policy
] ]
}, },
{ {
@ -209,22 +212,16 @@ return {
state: { state: {
evaluators: [ evaluators: [
{ {
$factory: IPA.enable_state_evaluator, $factory: mod_facet.noop_state_evaluator,
field: 'nsaccountlock', state: ['staging']
adapter: { $type: 'batch', result_index: 0 }, }
invert_value: true
},
{
$factory: IPA.acl_state_evaluator,
name: 'reset_password_acl_evaluator',
adapter: { $type: 'batch', result_index: 0 },
attribute: 'userpassword'
},
IPA.user.self_service_other_user_evaluator
], ],
summary_conditions: [ summary_conditions: [
IPA.enabled_summary_cond, {
IPA.disabled_summary_cond pos: ['staging'],
state: ['staging'],
description: 'Staging user'
}
] ]
} }
} }
@ -302,6 +299,9 @@ stageuser.search_preserved_facet_spec = {
label: '@i18n:buttons.restore', label: '@i18n:buttons.restore',
icon: 'fa-heart' icon: 'fa-heart'
} }
],
policies: [
mod_user.stageuser_sidebar_policy
] ]
}; };

View File

@ -117,6 +117,9 @@ return {
icon: 'fa-check' icon: 'fa-check'
} }
], ],
policies: [
IPA.user.stageuser_sidebar_policy
],
deleter_dialog: { deleter_dialog: {
$factory: IPA.user.deleter_dialog $factory: IPA.user.deleter_dialog
} }
@ -302,22 +305,40 @@ return {
} }
], ],
actions: [ actions: [
'add_otptoken', {
'enable', $type: 'add_otptoken',
'disable', hide_cond: ['preserved-user']
},
{
$type: 'enable',
hide_cond: ['preserved-user']
},
{
$type: 'disable',
hide_cond: ['preserved-user']
},
{
$type: 'enable',
hide_cond: ['preserved-user']
},
'delete', 'delete',
'reset_password', {
$type: 'reset_password',
hide_cond: ['preserved-user']
},
{ {
$factory: IPA.object_action, $factory: IPA.object_action,
name: 'unlock', name: 'unlock',
method: 'unlock', method: 'unlock',
label: '@i18n:objects.user.unlock', label: '@i18n:objects.user.unlock',
needs_confirm: true, needs_confirm: true,
hide_cond: ['preserved-user'],
confirm_msg: '@i18n:objects.user.unlock_confirm' confirm_msg: '@i18n:objects.user.unlock_confirm'
}, },
{ {
$type: 'automember_rebuild', $type: 'automember_rebuild',
name: 'automember_rebuild', name: 'automember_rebuild',
hide_cond: ['preserved-user'],
label: '@i18n:actions.automember_rebuild' label: '@i18n:actions.automember_rebuild'
} }
], ],
@ -336,13 +357,23 @@ return {
adapter: { $type: 'batch', result_index: 0 }, adapter: { $type: 'batch', result_index: 0 },
attribute: 'userpassword' attribute: 'userpassword'
}, },
IPA.user.self_service_other_user_evaluator IPA.user.self_service_other_user_evaluator,
IPA.user.preserved_user_evaluator
], ],
summary_conditions: [ summary_conditions: [
{
pos: ['preserved-user'],
neg: [],
state: ['preserved'],
description: 'Preserved user'
},
IPA.enabled_summary_cond, IPA.enabled_summary_cond,
IPA.disabled_summary_cond IPA.disabled_summary_cond
] ]
} },
policies: [
IPA.user.preserved_user_policy
]
}, },
{ {
$type: 'association', $type: 'association',
@ -695,6 +726,85 @@ IPA.user.self_service_other_user_evaluator = function(spec) {
return that; return that;
}; };
/**
* Evaluates if user is "preserved" user
* @class IPA.user.preserved_user_evaluator
*/
IPA.user.preserved_user_evaluator = function(spec) {
spec = spec || {};
spec.event = spec.event || 'post_load';
var that = IPA.state_evaluator(spec);
that.name = spec.name || 'preserved_user_evaluator';
that.param = spec.param || 'dn';
that.adapter = builder.build('adapter', { $type: 'adapter'}, { context: that });
/**
* Evaluates if user is preserved, i.e. is in provisioning tree
*/
that.on_event = function(data) {
var old_state = that.state;
that.state = [];
var dn = that.adapter.load(data)[0];
if (dn.indexOf('cn=provisioning') > 0) {
that.state.push('preserved-user');
}
that.notify_on_change(old_state);
};
return that;
};
/**
* Change breadcrumb navigation and therefore also target facet on first
* navigation item based on user state (active/preserved)
* @class
*/
IPA.user.preserved_user_policy = function(spec) {
var that = IPA.facet_policy(spec);
that.post_load = function(data) {
var adapter = builder.build('adapter', {
$type: 'adapter',
result_index: 0,
context: { param: 'dn' }
});
var dn = adapter.load(data)[0];
var preserved_user = dn.indexOf('cn=provisioning') > 0;
var details_facet = that.container;
details_facet.set_tabs_visible(!preserved_user);
details_facet.redirect_info = { entity: 'user', facet: 'search' };
if (preserved_user) {
details_facet.redirect_info.facet = 'search_preserved';
}
details_facet.header.update_breadcrumb();
};
return that;
};
/**
* Display sidebar (facet tabs) only if user can view stage and preserved user.
* Atm. the sidebar is hidden only in self-service. Should be extended by a
* check if user can actually read it.
* @class
*/
IPA.user.stageuser_sidebar_policy = function(spec) {
var that = IPA.facet_policy(spec);
that.post_create = function(data) {
that.container.set_tabs_visible(!IPA.is_selfservice);
};
return that;
};
IPA.user.deleter_dialog = function(spec) { IPA.user.deleter_dialog = function(spec) {
spec = spec || {}; spec = spec || {};