/*jsl:import ipa.js */ /* Authors: * Endi Sukma Dewata * Adam Young * Pavel Zuna * Petr Vobornik * * 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 . */ /* 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.enabled = spec.enabled === undefined ? true : spec.enabled; 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.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.load_writable(record); that.reset(); }; that.load_writable = function(record) { 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 (record.attributelevelrights) { var rights = record.attributelevelrights[that.name]; if (!rights || rights.indexOf('w') < 0) { that.writable = false; } } }; that.reset = function() { that.set_widget_flags(); 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.enabled) return ['']; 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(); //check for empty value: null, [''], '', [] var orig_empty = that.is_empty(that.values); var new_empty= that.is_empty(values); if (orig_empty && new_empty) return false; if (orig_empty != new_empty) return true; //strict equality - checks object's ref equality, numbers, strings if (values === that.values) return false; //compare values in array if (values.length !== that.values.length) return true; values.sort(); that.values.sort(); for (var i=0; i