diff options
-rw-r--r-- | install/ui/Makefile.am | 1 | ||||
-rw-r--r-- | install/ui/field.js | 384 | ||||
-rw-r--r-- | install/ui/index.html | 1 | ||||
-rw-r--r-- | install/ui/jsl.conf | 3 | ||||
-rw-r--r-- | install/ui/widget.js | 308 |
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; }; |