summaryrefslogtreecommitdiffstats
path: root/install/ui/facet.js
diff options
context:
space:
mode:
Diffstat (limited to 'install/ui/facet.js')
-rw-r--r--install/ui/facet.js370
1 files changed, 352 insertions, 18 deletions
diff --git a/install/ui/facet.js b/install/ui/facet.js
index 01e8a935..5e78d57f 100644
--- a/install/ui/facet.js
+++ b/install/ui/facet.js
@@ -42,6 +42,7 @@ IPA.facet = function(spec) {
that.disable_breadcrumb = spec.disable_breadcrumb;
that.disable_facet_tabs = spec.disable_facet_tabs;
+ that.action_list = spec.action_list;
that.header = spec.header || IPA.facet_header({ facet: that });
that._needs_update = spec.needs_update;
@@ -309,6 +310,23 @@ IPA.facet_header = function(spec) {
that.facet = spec.facet;
+ var init = function() {
+
+ if (that.facet.action_list) {
+
+ var widget_builder = IPA.widget_builder({
+ widget_options: {
+ entity: that.facet.entity
+ }
+ });
+
+ that.action_list = widget_builder.build_widget(that.facet.action_list);
+ that.action_list.init();
+ }
+
+ that.title_widget = IPA.facet_title();
+ };
+
that.select_tab = function() {
if (that.facet.disable_facet_tabs) return;
@@ -372,16 +390,14 @@ IPA.facet_header = function(spec) {
}).appendTo(that.path);
}
- that.title_container.empty();
- var h3 = $('<h3/>').appendTo(that.title_container);
- h3.append(that.facet.label);
- h3.append(': ');
+ var title_info = {
+ title: that.facet.label,
+ pkey: limited_value,
+ pkey_tooltip: value
+ };
+ that.title_widget.update(title_info);
- $('<span/>', {
- 'class': 'facet-pkey',
- title: value,
- text: limited_value
- }).appendTo(h3);
+ that.adjust_elements();
};
that.create_facet_link = function(container, other_facet) {
@@ -431,6 +447,8 @@ IPA.facet_header = function(spec) {
that.create = function(container) {
+ that.container = container;
+
if (!that.facet.disable_breadcrumb) {
that.breadcrumb = $('<div/>', {
'class': 'breadcrumb'
@@ -456,13 +474,16 @@ IPA.facet_header = function(spec) {
}).appendTo(that.breadcrumb);
}
- that.title_container = $('<div/>', {
- 'class': 'facet-title'
- }).appendTo(container);
+ that.title_widget.create(container);
+ that.title_widget.update({ title: that.facet.label });
- var span = $('<h3/>', {
- text: that.facet.label
- }).appendTo(that.title_container);
+ if (that.action_list) {
+ that.action_list_container = $('<div/>', {
+ 'class': 'facet-action-list'
+ }).appendTo(container);
+
+ that.action_list.create(that.action_list_container);
+ }
if (!that.facet.disable_facet_tabs) {
that.facet_tabs = $('<div/>', {
@@ -518,12 +539,112 @@ IPA.facet_header = function(spec) {
}
}
}
+
+ if (that.action_list) {
+ that.action_list.update(result);
+
+ var state = that.action_list.state;
+ var icon_tooltip = that.action_list.state_evaluator.get_description();
+ if (state.length > 0) {
+ var css_class = state.join(' ');
+ that.title_widget.set_class(css_class);
+ that.title_widget.set_icon_tooltip(icon_tooltip);
+ }
+ }
+
+ that.adjust_elements();
+ };
+
+ that.adjust_elements = function() {
+
+ if (that.action_list) {
+
+ var action_list = that.action_list.container;
+ var max_width = that.container.width();
+ var al_width = action_list.width();
+ var title_width = that.title_widget.title_container.width();
+ var title_max = max_width - al_width;
+
+ that.title_widget.set_max_width(title_max);
+ action_list.css('left', title_width + 'px');
+ }
};
that.clear = function() {
that.load();
};
+ init();
+
+ return that;
+};
+
+IPA.facet_title = function(spec) {
+
+ spec = spec || {};
+
+ var that = {};
+
+ that.update = function(data) {
+
+ var tooltip = data.tooltip || data.title;
+ var pkey_tooltip = data.pkey_tooltip || data.pkey;
+ var icon_tooltip = data.icon_tooltip || '';
+
+ that.title.text(data.title);
+ that.title.attr('title', tooltip);
+
+ if (data.pkey) {
+ that.title.text(data.title + ': ');
+ that.pkey.text(data.pkey);
+ that.pkey.attr('title', pkey_tooltip);
+ }
+
+ if (data.css_class) that.set_class(data.css_class);
+
+ that.set_icon_tooltip(icon_tooltip);
+ };
+
+ that.create = function(container) {
+
+ that.title_container = $('<div/>', {
+ 'class': 'facet-title'
+ }).appendTo(container);
+
+ that.icon = $('<div />', {
+ 'class': 'header-icon'
+ }).appendTo(that.title_container);
+
+ var h3 = $('<h3/>').appendTo(that.title_container);
+
+ that.title = $('<span/>').appendTo(h3);
+
+ that.pkey = $('<span/>', {
+ 'class': 'facet-pkey'
+ }).appendTo(h3);
+ };
+
+ that.set_max_width = function(width) {
+ that.title_container.css('max-width', width+'px');
+ };
+
+ that.set_class = function(css_class) {
+
+ if (that.css_class) {
+ that.title_container.removeClass(that.css_class);
+ }
+
+ if (css_class) {
+ that.title_container.addClass(css_class);
+ }
+
+ that.css_class = css_class;
+ };
+
+ that.set_icon_tooltip = function(tooltip) {
+ that.icon.attr('title', tooltip);
+ };
+
return that;
};
@@ -1025,7 +1146,7 @@ IPA.facet_builder = function(entity) {
(IPA.metadata.objects[spec.other_entity] ?
IPA.metadata.objects[spec.other_entity].label : spec.other_entity);
- if(that.has_indirect_attribute_member(spec)) {
+ if (that.has_indirect_attribute_member(spec)) {
spec.indirect_attribute_member = spec.attribute_member + 'indirect';
}
@@ -1042,8 +1163,8 @@ IPA.facet_builder = function(entity) {
that.has_indirect_attribute_member = function(spec) {
var indirect_members = entity.metadata.attribute_members[spec.attribute_member + 'indirect'];
- if(indirect_members) {
- if(indirect_members.indexOf(spec.other_entity) > -1) {
+ if (indirect_members) {
+ if (indirect_members.indexOf(spec.other_entity) > -1) {
return true;
}
}
@@ -1054,3 +1175,216 @@ IPA.facet_builder = function(entity) {
return that;
};
+
+IPA.action = function(spec) {
+
+ spec = spec || {};
+
+ var that = {};
+
+ that.name = spec.name;
+ that.label = spec.label;
+ that.enable_cond = spec.enable_cond || [];
+ that.disable_cond = spec.disable_cond || [];
+ that.handler = spec.handler;
+ that.needs_confirm = spec.needs_confirm !== undefined ? spec.needs_confirm : true;
+ that.confirm_msg = spec.confirm_msg || IPA.messages.actions.confirm;
+
+ that.execute = function(facet, on_success, on_error) {
+
+ if (that.handler) {
+ that.handler(facet, on_success, on_error);
+ }
+ };
+
+ return that;
+};
+
+IPA.action_builder = function(spec) {
+
+ spec = spec || {};
+ spec.factory = spec.factory || IPA.action;
+ var that = IPA.builder(spec);
+ return that;
+};
+
+IPA.state_evaluator = function(spec) {
+
+ spec = spec || {};
+
+ var that = {};
+
+ that.evaluate = function() {
+ that.state = [];
+ return that.state;
+ };
+
+ that.get_description = function() {
+ return that.description || '';
+ };
+
+ return that;
+};
+
+
+IPA.action_list_widget = function(spec) {
+
+ spec = spec || {};
+
+ spec.widgets = spec.widgets || [
+ {
+ type: 'html',
+ css_class: 'separator'
+ },
+ {
+ type: 'select',
+ name: 'action',
+ undo: false
+ },
+ {
+ type: 'button',
+ name: 'apply',
+ label: "Apply" //TODO: translate
+ }
+ ];
+
+ var that = IPA.composite_widget(spec);
+
+ that.actions = IPA.build(spec.actions, IPA.action_builder) || [];
+ that.state_evaluator = IPA.build(spec.state_evaluator);
+ that.state = [];
+
+ that.init = function() {
+ that.action_select = that.widgets.get_widget('action');
+ that.apply_button = that.widgets.get_widget('apply');
+
+ that.action_select.value_changed.attach(that.on_action_change);
+ that.apply_button.click = that.on_apply;
+
+ var options = [];
+
+ for (var i=0; i< that.actions.length; i++) {
+ var action = that.actions[i];
+ options.push({
+ label: action.label,
+ value: action.name
+ });
+ }
+
+ that.action_select.options = options;
+ };
+
+ that.on_action_change = function() {
+
+ var selected = that.action_select.save()[0];
+ var action = that.get_action(selected);
+ var enabled = that.action_enabled(action);
+ that.apply_button.set_enabled(enabled);
+ };
+
+ that.on_apply = function() {
+ var selected = that.action_select.save()[0];
+ var action = that.get_action(selected);
+ var enabled = that.action_enabled(action);
+ var facet = that.entity.get_facet();
+
+ if (enabled) {
+ action.execute(facet,
+ that.on_action_success,
+ that.on_action_error);
+ }
+ };
+
+ that.on_action_success = function() {
+ var facet = that.entity.get_facet();
+ facet.refresh();
+ };
+
+ that.on_action_error = function() {
+ var facet = that.entity.get_facet();
+ facet.refresh();
+ };
+
+ that.update = function(result) {
+
+ that.get_state(result);
+ var disabled = that.get_disabled();
+ that.action_select.enable_options();
+ that.action_select.disable_options(disabled);
+ that.select_first_enabled();
+ };
+
+ that.get_state = function(result) {
+
+ if (that.state_evaluator) {
+ that.state = that.state_evaluator.evaluate(result);
+ }
+ };
+
+ that.get_action = function(name) {
+
+ for (var i=0; i< that.actions.length; i++) {
+ var action = that.actions[i];
+ if (action.name === name) {
+ return action;
+ }
+ }
+ return null;
+ };
+
+ that.get_disabled = function() {
+
+ var disabled = [];
+
+ for (var i=0; i< that.actions.length; i++) {
+ var action = that.actions[i];
+ if (!that.action_enabled(action)) {
+ disabled.push(action.name);
+ }
+ }
+
+ return disabled;
+ };
+
+ that.action_enabled = function(action) {
+
+ var i, cond;
+
+ if (action.disable_cond) {
+ for (i=0; i<action.disable_cond.length; i++) {
+ cond = action.disable_cond[i];
+ if (that.state.indexOf(cond) > -1) {
+ return false;
+ }
+ }
+ }
+
+ if (action.enable_cond) {
+ for (i=0; i<action.enable_cond.length; i++) {
+ cond = action.enable_cond[i];
+ if (that.state.indexOf(cond) < 0) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ };
+
+ that.select_first_enabled = function() {
+
+ var first = that.actions[0].name;
+
+ for (var i=0; i< that.actions.length; i++) {
+ var action = that.actions[i];
+ if (that.action_enabled(action)) {
+ first = action.name;
+ break;
+ }
+ }
+
+ that.action_select.update([first]);
+ };
+
+ return that;
+}; \ No newline at end of file