summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--install/ui/doc/categories.json3
-rw-r--r--install/ui/doc/config.json2
-rw-r--r--install/ui/src/freeipa/FormMixin.js204
3 files changed, 207 insertions, 2 deletions
diff --git a/install/ui/doc/categories.json b/install/ui/doc/categories.json
index ec0776687..e8ae56b79 100644
--- a/install/ui/doc/categories.json
+++ b/install/ui/doc/categories.json
@@ -123,7 +123,8 @@
"details.command_info",
"details.field_info",
"details.update_info_builder",
- "details.command_builder"
+ "details.command_builder",
+ "FormMixin"
]
},
{
diff --git a/install/ui/doc/config.json b/install/ui/doc/config.json
index c744fd6aa..6a200f9ae 100644
--- a/install/ui/doc/config.json
+++ b/install/ui/doc/config.json
@@ -5,7 +5,7 @@
"--css": ["doc.css"],
"--external": ["jQuery", "Store", "QueryResult", "Stateful", "Evented",
"XMLHttpRequest", "Promise"],
- "--warnings": ["-link", "-no_doc"],
+ "--warnings": ["-link", "-nodoc"],
"--": [
"../src/freeipa/"
],
diff --git a/install/ui/src/freeipa/FormMixin.js b/install/ui/src/freeipa/FormMixin.js
new file mode 100644
index 000000000..ef594733a
--- /dev/null
+++ b/install/ui/src/freeipa/FormMixin.js
@@ -0,0 +1,204 @@
+/* Authors:
+ * Petr Vobornik <pvoborni@redhat.com>
+ *
+ * Copyright (C) 2013 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/>.
+*/
+
+define(['dojo/_base/declare',
+ 'dojo/_base/lang',
+ 'dojo/on',
+ './builder',
+ './field',
+ './ordered-map'
+ ],
+ function(declare, lang, on, builder, field_mod, ordered_map) {
+
+ /**
+ * Form mixin
+ *
+ * Manages fields and related logic.
+ *
+ * Expects that this mixin will be mixed in a class which will implement
+ * `Stateful`.
+ *
+ * @class FormMixin
+ */
+ var FormMixin = declare([], {
+
+ /**
+ * Some field is dirty
+ * @property {boolean}
+ */
+ dirty: null,
+
+ /**
+ * Fields
+ * @property {ordered_map}
+ */
+ fields: null,
+
+ /**
+ * Builds fields on add if not already built
+ *
+ * @property {field.field_builder}
+ */
+ field_builder: null,
+
+ /**
+ * Raised when `dirty` state changes
+ * @event dirty-change
+ */
+
+ /**
+ * Raised after fields reset
+ * @event reset
+ */
+
+ /**
+ * Get field by name
+ * @param {string} name
+ */
+ get_field: function(name) {
+ return this.fields.get(name);
+ },
+
+ /**
+ * Get all fields
+ * @return {Array.<IPA.field>}
+ */
+ get_fields: function() {
+ return this.fields.values;
+ },
+
+ /**
+ * Add field
+ * @param {IPA.field|Object|String} field
+ * Field or field spec
+ */
+ add_field: function(field) {
+ field.container = this;
+ var built = this.field_builder.build_field(field);
+ this.register_field_listeners(built);
+ this.fields.put(field.name, built);
+ return built;
+ },
+
+ /**
+ * Add multiple fields
+ * @param {Array} fields
+ */
+ add_fields: function(fields) {
+
+ if (!fields) return [];
+
+ var built = [];
+ for (var i=0; i<fields.length; i++) {
+ var f = this.add_field(fields[i]);
+ built.push(f);
+ }
+ return built;
+ },
+
+ /**
+ * Registers listeners for field events
+ * @param {IPA.field} field
+ * @protected
+ */
+ register_field_listeners: function(field) {
+
+ on(field, 'dirty-change', lang.hitch(this, this.on_field_dirty_change));
+ },
+
+ /**
+ * Field's dirty-change handler
+ * @param {Object} event
+ * @protected
+ * @fires dirty-change
+ */
+ on_field_dirty_change: function(event) {
+
+ var old = this.dirty;
+
+ if (event.dirty) {
+ this.dirty = true;
+ } else {
+ this.dirty = this.is_dirty();
+ }
+
+ if (old !== this.dirty) {
+ this.emit('dirty-change', { source: this, dirty: this.dirty });
+ }
+ },
+
+ /**
+ * Perform check if any field is dirty
+ *
+ * @return {boolean}
+ * - true: some field is dirty
+ * - false: all field's aren't dirty
+ */
+ is_dirty: function() {
+ var fields = this.get_fields();
+ for (var i=0; i<fields.length; i++) {
+ if (fields[i].enabled && fields[i].dirty) {
+ return true;
+ }
+ }
+ return false;
+ },
+
+ /**
+ * Reset all fields
+ * @fires reset
+ */
+ reset: function() {
+
+ var fields = this.get_fields();
+ for (var i=0; i<fields.length; i++) {
+ var field = fields[i];
+ field.reset();
+ }
+
+ this.emit('reset', { source: this });
+ },
+
+ /**
+ * Validate all fields
+ * @return {boolean} true when all fields are valid
+ */
+ validate: function() {
+ var valid = true;
+ var fields = this.get_fields();
+ for (var i=0; i<fields.length; i++) {
+ var field = fields[i];
+ valid = field.validate() && field.validate_required() && valid;
+ }
+ return valid;
+ },
+
+ /** Constructor */
+ constructor: function(spec) {
+
+ this.fields = ordered_map();
+ var builder_spec = spec.field_builder || field_mod.field_builder;
+ this.field_builder = builder.build(null, builder_spec);
+ this.dirty = false;
+ }
+ });
+
+ return FormMixin;
+}); \ No newline at end of file