summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--install/ui/Makefile.am1
-rw-r--r--install/ui/field.js384
-rw-r--r--install/ui/index.html1
-rw-r--r--install/ui/jsl.conf3
-rw-r--r--install/ui/widget.js308
5 files changed, 422 insertions, 275 deletions
diff --git a/install/ui/Makefile.am b/install/ui/Makefile.am
index 2e5b3998e..8b613666c 100644
--- a/install/ui/Makefile.am
+++ b/install/ui/Makefile.am
@@ -22,6 +22,7 @@ app_DATA = \
extension.js \
facet.js \
favicon.ico \
+ field.js \
group.js \
hbac.js \
host.js \
diff --git a/install/ui/field.js b/install/ui/field.js
new file mode 100644
index 000000000..2e6a5e9a3
--- /dev/null
+++ b/install/ui/field.js
@@ -0,0 +1,384 @@
+/*jsl:import ipa.js */
+/* Authors:
+ * Endi Sukma Dewata <edewata@redhat.com>
+ * Adam Young <ayoung@redhat.com>
+ * Pavel Zuna <pzuna@redhat.com>
+ * Petr Vobornik <pvoborni@redhat.com>
+ *
+ * Copyright (C) 2011 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, widget.js */
+
+IPA.field = function(spec) {
+ spec = spec || {};
+
+ var that = {};
+
+ that.entity = spec.entity;
+ that.container = null;
+ that.name = spec.name;
+ that.label = spec.label;
+ that.tooltip = spec.tooltip;
+
+ that.widget = null;
+ that.widget_name = spec.widget;
+
+ // override the required flag in metadata
+ that.required = spec.required;
+
+ // read_only is set when widget is created
+ that.read_only = spec.read_only;
+
+ // writable is set during load
+ that.writable = true;
+
+ that.undo = spec.undo === undefined ? true : spec.undo;
+ that.join = spec.join;
+
+ that.metadata = spec.metadata;
+
+ that.priority = spec.priority;
+
+ that.values = [];
+ that.dirty = false;
+ that.valid = true;
+
+ that.dirty_changed = IPA.observer();
+
+ var init = function() {
+ if (!that.metadata && that.entity) {
+ that.metadata = IPA.get_entity_param(that.entity.name, that.name);
+ }
+ if (that.metadata) {
+ if (that.label === undefined) {
+ that.label = that.metadata.label;
+ }
+ if (that.tooltip === undefined) {
+ that.tooltip = that.metadata.doc;
+ }
+ }
+ };
+
+ that.is_required = function() {
+ if (that.read_only) return false;
+ if (!that.writable) return false;
+
+ if (that.required !== undefined) return that.required;
+ return that.metadata && that.metadata.required;
+ };
+
+ that.set_required = function(required) {
+ that.required = required;
+
+ that.update_required();
+ };
+
+ that.update_required = function() {
+ if(that.widget) {
+ that.widget.set_required(that.is_required());
+ }
+ };
+
+ that.validate_required = function() {
+ var values = that.save();
+ if (!values || !values.length || values[0] === '') {
+ if (that.is_required()) {
+ that.valid = false;
+ that.show_error(IPA.messages.widget.validation.required);
+ return false;
+ }
+ }
+ return true;
+ };
+
+ /*returns true and clears the error message if the field value passes
+ * the validation pattern. If the field value does not pass validation,
+ * displays the error message and returns false. */
+ that.validate = function() {
+ that.hide_error();
+ that.valid = true;
+
+ var values = that.save();
+ if (!values) {
+ return that.valid;
+ }
+ if (values.length === 0) {
+ return that.valid;
+ }
+ var value = values[0];
+ if (!value) {
+ return that.valid;
+ }
+
+ if (!that.metadata) {
+ return that.valid;
+ }
+
+ var message;
+
+ if (that.metadata.type == 'int') {
+ if (!value.match(/^-?\d+$/)) {
+ that.valid = false;
+ that.show_error(IPA.messages.widget.validation.integer);
+ return that.valid;
+ }
+
+ if (that.metadata.minvalue !== undefined && value < that.metadata.minvalue) {
+ that.valid = false;
+ message = IPA.messages.widget.validation.min_value;
+ message = message.replace('${value}', that.metadata.minvalue);
+ that.show_error(message);
+ return that.valid;
+ }
+
+ if (that.metadata.maxvalue !== undefined && value > that.metadata.maxvalue) {
+ that.valid = false;
+ message = IPA.messages.widget.validation.max_value;
+ message = message.replace('${value}', that.metadata.maxvalue);
+ that.show_error(message);
+ return that.valid;
+ }
+ }
+
+ if (that.metadata.pattern) {
+ var regex = new RegExp(that.metadata.pattern);
+ if (!value.match(regex)) {
+ that.valid = false;
+ that.show_error(that.metadata.pattern_errmsg);
+ return that.valid;
+ }
+ }
+
+ return that.valid;
+ };
+
+ /**
+ * This function stores the entire record and the values
+ * of the field, then invoke reset() to update the UI.
+ */
+ that.load = function(record) {
+ that.record = record;
+
+ var value = record[that.name];
+ if (value instanceof Array) {
+ that.values = value;
+ } else {
+ that.values = value !== undefined ? [value] : [];
+ }
+
+ if (!that.values.length) {
+ that.values = [''];
+ }
+
+ that.writable = true;
+
+ if (that.metadata) {
+ if (that.metadata.primary_key) {
+ that.writable = false;
+ }
+
+ if (that.metadata.flags && 'no_update' in that.metadata.flags) {
+ that.writable = false;
+ }
+ }
+
+ if (that.record.attributelevelrights) {
+ var rights = that.record.attributelevelrights[that.name];
+ if (!rights || rights.indexOf('w') < 0) {
+ that.writable = false;
+ }
+ }
+
+ that.reset();
+ };
+
+ that.reset = function() {
+ that.update_required();
+ that.update();
+ that.validate();
+ that.set_dirty(false);
+ };
+
+ that.update = function() {
+ if(that.widget && that.widget.update) that.widget.update(that.values);
+ };
+
+ that.get_update_info = function() {
+
+ var update_info = IPA.update_info_builder.new_update_info();
+ if(that.is_dirty()) {
+ update_info.fields.push(IPA.update_info_builder.new_field_info(
+ that,
+ that.save()));
+ }
+ return update_info;
+ };
+
+ /**
+ * This function saves the values entered in the UI.
+ * It returns the values in an array, or null if
+ * the field should not be saved.
+ */
+ that.save = function(record) {
+
+ var values = that.values;
+
+ if(that.widget) {
+ values = that.widget.save();
+ }
+
+ if(record) {
+ record[that.name] = values;
+ }
+
+ return values;
+ };
+
+ /**
+ * This function compares the original values and the
+ * values entered in the UI. If the values have changed
+ * it will return true.
+ */
+ that.test_dirty = function() {
+
+ if (that.read_only) {
+ return false;
+ }
+
+ var values = that.save();
+
+ if (!values) { // ignore null values
+ return false;
+ }
+
+ if (!that.values) {
+
+ if (values instanceof Array) {
+
+ if ((values.length === 0) ||
+ (values.length === 1) &&
+ (values[0] === '')) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ if (values.length != that.values.length) {
+ return true;
+ }
+
+ values.sort();
+ that.values.sort();
+
+ for (var i=0; i<values.length; i++) {
+ if (values[i] != that.values[i]) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ /**
+ * This function compares the original values and the
+ * values entered in the UI. If the values have changed
+ * it will return true.
+ */
+ that.is_dirty = function() {
+ return that.dirty;
+ };
+
+ that.set_dirty = function(dirty) {
+ var old = that.dirty;
+ that.dirty = dirty;
+ if (that.undo) {
+ that.show_undo(dirty);
+ }
+
+ if(old !== dirty) {
+ that.dirty_changed.notify([], that);
+ }
+ };
+
+
+ that.show_error = function(message) {
+ if(that.widget) that.widget.show_error(message);
+ };
+
+ that.hide_error = function() {
+ if(that.widget) that.widget.hide_error();
+ };
+
+ that.show_undo = function(value) {
+ if(that.widget) {
+ if(value) { that.widget.show_undo(); }
+ else { that.widget.hide_undo();}
+ }
+ };
+
+ that.set_enabled = function() {
+ };
+
+ that.refresh = function() {
+ };
+
+ that.set_widget_flags = function() {
+
+ that.widget.label = that.label;
+ that.widget.title = that.title;
+ that.widget.undo = that.undo;
+ that.widget.writable = that.writable;
+ that.widget.read_only = that.read_only;
+ };
+
+ that.widgets_created = function() {
+
+ that.widget = that.container.widgets.get_widget(that.widget_name);
+
+ if(that.widget) {
+ that.set_widget_flags();
+
+ that.widget.value_changed.attach(that.widget_value_changed);
+ that.widget.undo_clicked.attach(that.widget_undo_clicked);
+ }
+ };
+
+ that.widget_value_changed = function() {
+ that.set_dirty(that.test_dirty());
+ that.validate();
+ };
+
+ that.widget_undo_clicked = function() {
+ that.reset();
+ };
+
+ init();
+
+ // methods that should be invoked by subclasses
+ that.field_load = that.load;
+ that.field_reset = that.reset;
+ that.field_save = that.save;
+ that.field_set_dirty = that.set_dirty;
+ that.field_show_error = that.show_error;
+ that.field_test_dirty = that.test_dirty;
+ that.field_widgets_created = that.widgets_created;
+
+ return that;
+}; \ No newline at end of file
diff --git a/install/ui/index.html b/install/ui/index.html
index 4b21bf38c..b6552eb2d 100644
--- a/install/ui/index.html
+++ b/install/ui/index.html
@@ -13,6 +13,7 @@
<script type="text/javascript" src="ipa.js"></script>
<script type="text/javascript" src="widget.js"></script>
+ <script type="text/javascript" src="field.js"></script>
<script type="text/javascript" src="dialog.js"></script>
<script type="text/javascript" src="search.js"></script>
<script type="text/javascript" src="details.js"></script>
diff --git a/install/ui/jsl.conf b/install/ui/jsl.conf
index a49279263..d4bbf770f 100644
--- a/install/ui/jsl.conf
+++ b/install/ui/jsl.conf
@@ -115,7 +115,7 @@
+define window
+define document
+define alert
-+define $
++define $
+define JSON
+define jQuery
@@ -128,6 +128,7 @@
+process jquery.ordered-map.js
+process ipa.js
+process widget.js
++process field.js
+process dialog.js
+process search.js
+process details.js
diff --git a/install/ui/widget.js b/install/ui/widget.js
index e9fffaf19..59a4091d3 100644
--- a/install/ui/widget.js
+++ b/install/ui/widget.js
@@ -32,55 +32,43 @@ IPA.widget = function(spec) {
var that = {};
-
- that.entity = spec.entity;
- that.id = spec.id;
that.name = spec.name;
+ that.id = spec.id;
that.label = spec.label;
that.tooltip = spec.tooltip;
+ that.entity = spec.entity; //some old widgets still need it
- that.disabled = spec.disabled;
- that.hidden = spec.hidden;
+ that.create = function(container) {
+ container.addClass('widget');
+ that.container = container;
+ };
- // override the required flag in metadata
- that.required = spec.required;
+ that.clear = function() {
+ };
- // read_only is set when widget is created
- that.read_only = spec.read_only;
+ that.widget_create = that.create;
- // writable is set during load
- that.writable = true;
+ return that;
+};
- that.width = spec.width;
- that.height = spec.height;
+IPA.input_widget = function(spec) {
- that.undo = spec.undo === undefined ? true : spec.undo;
- that.join = spec.join;
+ spec = spec || {};
- that.metadata = spec.metadata;
+ var that = IPA.widget(spec);
- that.priority = spec.priority;
+ that.width = spec.width;
+ that.height = spec.height;
- that.values = [];
- that.dirty = false;
- that.valid = true;
+ that.undo = spec.undo === undefined ? true : spec.undo;
+ that.writable = spec.writable;
+ that.read_only = spec.read_only;
- that.dirty_changed = IPA.observer();
+ //events
+ //each widget can contain several events
that.value_changed = IPA.observer();
+ that.undo_clicked = IPA.observer();
- var init = function() {
- if (!that.metadata && that.entity) {
- that.metadata = IPA.get_entity_param(that.entity.name, that.name);
- }
- if (that.metadata) {
- if (that.label === undefined) {
- that.label = that.metadata.label;
- }
- if (that.tooltip === undefined) {
- that.tooltip = that.metadata.doc;
- }
- }
- };
that.create_error_link = function(container) {
container.append(' ');
@@ -101,225 +89,16 @@ IPA.widget = function(spec) {
}).appendTo(container);
};
- that.is_required = function() {
- if (that.read_only) return false;
- if (!that.writable) return false;
-
- if (that.required !== undefined) return that.required;
- return that.metadata && that.metadata.required;
- };
-
- that.set_required = function(required) {
- that.required = required;
-
- that.update_required();
- };
-
- that.update_required = function() {
- if (that.required_indicator) {
- that.required_indicator.css('display', that.is_required() ? 'inline' : 'none');
- }
- };
-
- that.validate_required = function() {
- var values = that.save();
- if (!values || !values.length || values[0] === '') {
- if (that.is_required()) {
- that.valid = false;
- that.show_error(IPA.messages.widget.validation.required);
- return false;
- }
- }
- return true;
- };
-
- /*returns true and clears the error message if the field value passes
- the validation pattern. If the field value does not pass validation,
- displays the error message and returns false. */
- that.validate = function() {
- that.hide_error();
- that.valid = true;
-
- var values = that.save();
- if (!values) {
- return that.valid;
- }
- if (values.length === 0) {
- return that.valid;
- }
- var value = values[0];
- if (!value) {
- return that.valid;
- }
-
- if (!that.metadata) {
- return that.valid;
- }
-
- var message;
-
- if (that.metadata.type == 'int') {
- if (!value.match(/^-?\d+$/)) {
- that.valid = false;
- that.show_error(IPA.messages.widget.validation.integer);
- return that.valid;
- }
-
- if (that.metadata.minvalue !== undefined && value < that.metadata.minvalue) {
- that.valid = false;
- message = IPA.messages.widget.validation.min_value;
- message = message.replace('${value}', that.metadata.minvalue);
- that.show_error(message);
- return that.valid;
- }
-
- if (that.metadata.maxvalue !== undefined && value > that.metadata.maxvalue) {
- that.valid = false;
- message = IPA.messages.widget.validation.max_value;
- message = message.replace('${value}', that.metadata.maxvalue);
- that.show_error(message);
- return that.valid;
- }
- }
-
- if (that.metadata.pattern) {
- var regex = new RegExp(that.metadata.pattern);
- if (!value.match(regex)) {
- that.valid = false;
- that.show_error(that.metadata.pattern_errmsg);
- return that.valid;
- }
- }
-
- return that.valid;
- };
-
-
- /**
- * This function compares the original values and the
- * values entered in the UI. If the values have changed
- * it will return true.
- */
- that.test_dirty = function() {
-
- if (that.read_only) {
- return false;
- }
-
- var values = that.save();
-
- if (!values) { // ignore null values
- return false;
- }
-
- if (!that.values) {
-
- if (values instanceof Array) {
-
- if ((values.length === 0) ||
- (values.length === 1) &&
- (values[0] === '')) {
- return false;
- }
- }
-
- return true;
- }
-
- if (values.length != that.values.length) {
- return true;
- }
-
- values.sort();
- that.values.sort();
-
- for (var i=0; i<values.length; i++) {
- if (values[i] != that.values[i]) {
- return true;
- }
- }
-
- return false;
- };
-
- that.create = function(container) {
- container.addClass('widget');
- that.container = container;
- };
-
- /**
- * This function stores the entire record and the values
- * of the field, then invoke reset() to update the UI.
- */
- that.load = function(record) {
- that.record = record;
-
- var value = record[that.name];
- if (value instanceof Array) {
- that.values = value;
- } else {
- that.values = value ? [value] : [];
- }
-
- that.writable = true;
-
- if (that.metadata) {
- if (that.metadata.primary_key) {
- that.writable = false;
- }
-
- if (that.metadata.flags && 'no_update' in that.metadata.flags) {
- that.writable = false;
- }
- }
-
- if (that.record.attributelevelrights) {
- var rights = that.record.attributelevelrights[that.name];
- if (!rights || rights.indexOf('w') < 0) {
- that.writable = false;
- }
- }
-
- that.reset();
- };
-
- that.reset = function() {
- that.update_required();
- that.update();
- that.validate();
- that.set_dirty(false);
- };
-
that.update = function() {
};
- that.get_update_info = function() {
-
- var update_info = IPA.update_info_builder.new_update_info();
- if(that.is_dirty()) {
- update_info.fields.push(IPA.update_info_builder.new_field_info(
- that,
- that.save()));
- }
- return update_info;
- };
-
/**
* This function saves the values entered in the UI.
* It returns the values in an array, or null if
* the field should not be saved.
*/
that.save = function() {
- return that.values;
- };
-
- /**
- * This function compares the original values and the
- * values entered in the UI. If the values have changed
- * it will return true.
- */
- that.is_dirty = function() {
- return that.dirty;
+ return [];
};
/**
@@ -341,7 +120,7 @@ IPA.widget = function(spec) {
if(on_undo === undefined) {
on_undo = function() {
- that.reset();
+ that.undo_clicked.notify([], that);
};
}
@@ -350,28 +129,12 @@ IPA.widget = function(spec) {
}
};
- that.set_dirty = function(dirty) {
- var old = that.dirty;
- that.dirty = dirty;
- if (that.undo) {
- if (dirty) {
- that.show_undo();
- } else {
- that.hide_undo();
- }
- }
-
- if(old !== dirty) {
- that.dirty_changed.notify([], that);
- }
- };
-
that.get_undo = function() {
return $(that.undo_span);
};
that.show_undo = function() {
- $(that.undo_span).css('display', 'inline');
+ that.get_undo().css('display', 'inline');
};
that.hide_undo = function() {
@@ -393,26 +156,23 @@ IPA.widget = function(spec) {
error_link.css('display', 'none');
};
- that.clear = function() {
- };
+ that.set_required = function(required) {
- that.set_enabled = function() {
- };
+ that.required = required;
- that.refresh = function() {
+ if (that.required_indicator) {
+ that.required_indicator.css('display', that.required ? 'inline' : 'none');
+ }
};
- init();
+ that.focus_input = function() {};
+ that.set_deleted = function() {};
+
+
// methods that should be invoked by subclasses
- that.widget_create = that.create;
that.widget_hide_error = that.hide_error;
- that.widget_load = that.load;
- that.widget_reset = that.reset;
- that.widget_save = that.save;
- that.widget_set_dirty = that.set_dirty;
that.widget_show_error = that.show_error;
- that.widget_test_dirty = that.test_dirty;
return that;
};