blob: 6d7fe11851b10abd1aa34b5b4469b2e7ae51bfdf [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 = {};
27 this._parse(element.value);
28
29 return this;
30 },
31
32
33 // Parse a value and populate states
34 _parse : function (value) {
35 if (value === undefined || value === '')
36 return;
37
38
39
Akron25cd9282021-11-22 16:50:27 +010040 this._states = JSON.parse('{' + value + '}');
Akronb7aab872021-11-04 17:11:04 +010041 },
42
43
44 // Return the string representation of all states
45 toString : function () {
Akron25cd9282021-11-22 16:50:27 +010046
47 if (this._states.size === 0)
48 return undefined;
49
50 return JSON.stringify(this._states).slice(1,-1);
Akronb7aab872021-11-04 17:11:04 +010051 },
52
53
54 // Update the query component for states
55 _update : function () {
56 this._e.value = this.toString();
57 },
58
59
60 // Create new state that is automatically associated
61 // with the state manager
62 newState : function (name, values) {
63
64 const t = this;
65 let s = stateClass.create(values);
66
67 // Load state
68 if (t._states[name] !== undefined) {
69 s.set(t._states[name]);
70 };
71
72 // Associate with dummy object
73 s.associate({
74 setState : function (value) {
75 t._states[name] = value;
76 t._update();
77 }
78 });
79
80 return s;
81 }
82 };
83});