blob: 136310bfa1bfa91caa878405275bda9022132b7f [file] [log] [blame]
/**
* Create a state manager object, that can deserialize and
* serialize states of associated states.
* At the moment this requires an element for serialization,
* but it may very well serialize in a cookie.
*
* @author Nils Diewald
*/
"use strict";
define(['state'], function(stateClass) {
return {
// Create new state amanger.
// Expects an object with a value
// to contain the serialization of all states.
create : function (element) {
return Object.create(this)._init(element);
},
// Initialize state manager
_init : function (element) {
this._e = element;
this._states = {};
this._defaults = {};
this._parse(element.value);
return this;
},
// Parse a value and populate states
_parse : function (value) {
if (value == null || value == undefined || value == '')
return;
this._states = JSON.parse('{' + value + '}');
},
// Return the string representation of all states
toString : function () {
if (this._states.size === 0)
return undefined;
return JSON.stringify(this._states).slice(1,-1);
},
// Update the query component for states
_update : function () {
this._e.setAttribute("value", this.toString());
},
// Create new state that is automatically associated
// with the state manager
newState : function (name, values, defValue) {
const t = this;
let s = stateClass.create(values);
if (this._states[name] != undefined) {
if (values.includes(this._states[name]))
s.setIfNotYet(this._states[name]);
};
// Set default value
// TODO: It would be better to make this part
// of the state and serialize correctly using TOJSON()
if (defValue !== undefined) {
s.setIfNotYet(defValue);
t._defaults[name] = defValue;
};
// Associate with dummy object
s.associate({
setState : function (value) {
if (t._defaults[name] !== undefined && t._defaults[name] == value) {
delete t._states[name];
} else {
t._states[name] = value;
};
t._update();
}
});
// Load state
if (t._states[name] !== undefined) {
s.set(t._states[name]);
};
return s;
}
};
});