blob: 136310bfa1bfa91caa878405275bda9022132b7f [file] [log] [blame]
Akronb7aab872021-11-04 17:11:04 +01001/**
2 * Create a state manager object, that can deserialize and
3 * serialize states of associated states.
4 * At the moment this requires an element for serialization,
5 * but it may very well serialize in a cookie.
6 *
7 * @author Nils Diewald
8 */
9
10"use strict";
11
12define(['state'], function(stateClass) {
13
14 return {
15 // Create new state amanger.
16 // Expects an object with a value
17 // to contain the serialization of all states.
18 create : function (element) {
19 return Object.create(this)._init(element);
20 },
21
22
23 // Initialize state manager
24 _init : function (element) {
25 this._e = element;
26 this._states = {};
Akrona8d45c42021-11-23 11:31:31 +010027 this._defaults = {};
Akronb7aab872021-11-04 17:11:04 +010028 this._parse(element.value);
29
30 return this;
31 },
32
33
34 // Parse a value and populate states
35 _parse : function (value) {
Akroned223be2024-12-10 13:01:46 +010036 if (value == null || value == undefined || value == '')
Akronb7aab872021-11-04 17:11:04 +010037 return;
Akroned223be2024-12-10 13:01:46 +010038
Akron25cd9282021-11-22 16:50:27 +010039 this._states = JSON.parse('{' + value + '}');
Akronb7aab872021-11-04 17:11:04 +010040 },
41
42
43 // Return the string representation of all states
44 toString : function () {
Akron25cd9282021-11-22 16:50:27 +010045
46 if (this._states.size === 0)
47 return undefined;
48
49 return JSON.stringify(this._states).slice(1,-1);
Akronb7aab872021-11-04 17:11:04 +010050 },
51
52
53 // Update the query component for states
54 _update : function () {
Akroned223be2024-12-10 13:01:46 +010055 this._e.setAttribute("value", this.toString());
Akronb7aab872021-11-04 17:11:04 +010056 },
57
58
59 // Create new state that is automatically associated
60 // with the state manager
Akrona8d45c42021-11-23 11:31:31 +010061 newState : function (name, values, defValue) {
Akronb7aab872021-11-04 17:11:04 +010062
63 const t = this;
64 let s = stateClass.create(values);
65
Akroned223be2024-12-10 13:01:46 +010066 if (this._states[name] != undefined) {
67 if (values.includes(this._states[name]))
68 s.setIfNotYet(this._states[name]);
69 };
70
Akrona8d45c42021-11-23 11:31:31 +010071 // Set default value
72 // TODO: It would be better to make this part
73 // of the state and serialize correctly using TOJSON()
74 if (defValue !== undefined) {
75 s.setIfNotYet(defValue);
76 t._defaults[name] = defValue;
77 };
Akronb7aab872021-11-04 17:11:04 +010078
79 // Associate with dummy object
80 s.associate({
81 setState : function (value) {
Akrona8d45c42021-11-23 11:31:31 +010082 if (t._defaults[name] !== undefined && t._defaults[name] == value) {
83 delete t._states[name];
84 } else {
85 t._states[name] = value;
86 };
Akronb7aab872021-11-04 17:11:04 +010087 t._update();
88 }
89 });
90
Akronda32e7a2021-11-16 17:28:57 +010091 // Load state
92 if (t._states[name] !== undefined) {
93 s.set(t._states[name]);
94 };
95
Akronb7aab872021-11-04 17:11:04 +010096 return s;
97 }
98 };
99});