blob: 4376b270405bc8131136f5ba730d3ac3340deb1b [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) {
36 if (value === undefined || value === '')
37 return;
Akronb7aab872021-11-04 17:11:04 +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 () {
55 this._e.value = this.toString();
56 },
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
66 // Load state
67 if (t._states[name] !== undefined) {
68 s.set(t._states[name]);
69 };
Akrona8d45c42021-11-23 11:31:31 +010070
71 // 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
91 return s;
92 }
93 };
94});