this.default = null;
this.size = null;
this.optional = false;
+ this.retain = false;
},
/**
* @default false
*/
+ /**
+ * If set to `true`, the underlying ui input widget value is not cleared
+ * from the configuration on unsatisfied depedencies. The default behavior
+ * is to remove the values of all options whose dependencies are not
+ * fulfilled.
+ *
+ * @name LuCI.form.AbstractValue.prototype#retain
+ * @type boolean
+ * @default false
+ */
+
/**
* Sets a default value to use when the underlying UCI option is not set.
*
* validation constraints.
*/
parse: function(section_id) {
- var active = this.isActive(section_id),
- cval = this.cfgvalue(section_id),
- fval = active ? this.formvalue(section_id) : null;
+ var active = this.isActive(section_id);
if (active && !this.isValid(section_id)) {
- var title = this.stripTags(this.title).trim();
- var error = this.getValidationError(section_id);
+ var title = this.stripTags(this.title).trim(),
+ error = this.getValidationError(section_id);
+
return Promise.reject(new TypeError(
_('Option "%s" contains an invalid input value.').format(title || this.option) + ' ' + error));
}
- if (fval != '' && fval != null) {
- if (this.forcewrite || !isEqual(cval, fval))
- return Promise.resolve(this.write(section_id, fval));
- }
- else {
- if (!active || this.rmempty || this.optional) {
- return Promise.resolve(this.remove(section_id));
+ if (active) {
+ var cval = this.cfgvalue(section_id),
+ fval = this.formvalue(section_id);
+
+ if (fval == null || fval == '') {
+ if (this.rmempty || this.optional) {
+ return Promise.resolve(this.remove(section_id));
+ }
+ else {
+ var title = this.stripTags(this.title).trim();
+
+ return Promise.reject(new TypeError(
+ _('Option "%s" must not be empty.').format(title || this.option)));
+ }
}
- else if (!isEqual(cval, fval)) {
- var title = this.stripTags(this.title).trim();
- return Promise.reject(new TypeError(_('Option "%s" must not be empty.').format(title || this.option)));
+ else if (this.forcewrite || !isEqual(cval, fval)) {
+ return Promise.resolve(this.write(section_id, fval));
}
}
+ else if (!this.retain) {
+ return Promise.resolve(this.remove(section_id));
+ }
return Promise.resolve();
},
else
return Promise.resolve(this.write(section_id, fval));
}
- else {
+ else if (!this.retain) {
return Promise.resolve(this.remove(section_id));
}
},