]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/StateProvider.js
add missing state string
[pve-manager.git] / www / manager6 / StateProvider.js
1 /* This state provider keeps part of the state inside
2 * the browser history.
3 *
4 * We compress (shorten) url using dictionary based compression
5 * i.e. use column separated list instead of url encoded hash:
6 * #v\d* version/format
7 * := indicates string values
8 * :\d+ lookup value in dictionary hash
9 * #v1:=value1:5:=value2:=value3:...
10 */
11
12 Ext.define('PVE.StateProvider', {
13 extend: 'Ext.state.LocalStorageProvider',
14
15 // private
16 setHV: function(name, newvalue, fireEvents) {
17 var me = this;
18
19 var changes = false;
20 var oldtext = Ext.encode(me.UIState[name]);
21 var newtext = Ext.encode(newvalue);
22 if (newtext != oldtext) {
23 changes = true;
24 me.UIState[name] = newvalue;
25 //console.log("changed old " + name + " " + oldtext);
26 //console.log("changed new " + name + " " + newtext);
27 if (fireEvents) {
28 me.fireEvent("statechange", me, name, { value: newvalue });
29 }
30 }
31 return changes;
32 },
33
34 // private
35 hslist: [
36 // order is important for notifications
37 // [ name, default ]
38 ['view', 'server'],
39 ['rid', 'root'],
40 ['ltab', 'tasks'],
41 ['nodetab', ''],
42 ['storagetab', ''],
43 ['pooltab', ''],
44 ['kvmtab', ''],
45 ['lxctab', ''],
46 ['dctab', '']
47 ],
48
49 hprefix: 'v1',
50
51 compDict: {
52 monitor: 49,
53 'ha-fencing': 48,
54 'ha-groups': 47,
55 'ha-resources': 46,
56 'ceph-log': 45,
57 'ceph-crushmap':44,
58 'ceph-pools': 43,
59 'ceph-osdtree': 42,
60 'ceph-disklist': 41,
61 'ceph-monlist': 40,
62 'ceph-config': 39,
63 ceph: 38,
64 'firewall-fwlog': 37,
65 'firewall-options': 36,
66 'firewall-ipset': 35,
67 'firewall-aliases': 34,
68 'firewall-sg': 33,
69 firewall: 32,
70 apt: 31,
71 members: 30,
72 snapshot: 29,
73 ha: 28,
74 support: 27,
75 pools: 26,
76 syslog: 25,
77 ubc: 24,
78 initlog: 23,
79 openvz: 22,
80 backup: 21,
81 resources: 20,
82 content: 19,
83 root: 18,
84 domains: 17,
85 roles: 16,
86 groups: 15,
87 users: 14,
88 time: 13,
89 dns: 12,
90 network: 11,
91 services: 10,
92 options: 9,
93 console: 8,
94 hardware: 7,
95 permissions: 6,
96 summary: 5,
97 tasks: 4,
98 clog: 3,
99 storage: 2,
100 folder: 1,
101 server: 0
102 },
103
104 decodeHToken: function(token) {
105 var me = this;
106
107 var state = {};
108 if (!token) {
109 Ext.Array.each(me.hslist, function(rec) {
110 state[rec[0]] = rec[1];
111 });
112 return state;
113 }
114
115 // return Ext.urlDecode(token);
116
117 var items = token.split(':');
118 var prefix = items.shift();
119
120 if (prefix != me.hprefix) {
121 return me.decodeHToken();
122 }
123
124 Ext.Array.each(me.hslist, function(rec) {
125 var value = items.shift();
126 if (value) {
127 if (value[0] === '=') {
128 value = decodeURIComponent(value.slice(1));
129 } else {
130 Ext.Object.each(me.compDict, function(key, cv) {
131 if (value == cv) {
132 value = key;
133 return false;
134 }
135 });
136 }
137 }
138 state[rec[0]] = value;
139 });
140
141 return state;
142 },
143
144 encodeHToken: function(state) {
145 var me = this;
146
147 // return Ext.urlEncode(state);
148
149 var ctoken = me.hprefix;
150 Ext.Array.each(me.hslist, function(rec) {
151 var value = state[rec[0]];
152 if (!Ext.isDefined(value)) {
153 value = rec[1];
154 }
155 value = encodeURIComponent(value);
156 if (!value) {
157 ctoken += ':';
158 } else {
159 var comp = me.compDict[value];
160 if (Ext.isDefined(comp)) {
161 ctoken += ":" + comp;
162 } else {
163 ctoken += ":=" + value;
164 }
165 }
166 });
167
168 return ctoken;
169 },
170
171 constructor: function(config){
172 var me = this;
173
174 me.callParent([config]);
175
176 me.UIState = me.decodeHToken(); // set default
177
178 var history_change_cb = function(token) {
179 //console.log("HC " + token);
180 if (!token) {
181 var res = window.confirm(gettext('Are you sure you want to navigate away from this page?'));
182 if (res){
183 // process text value and close...
184 Ext.History.back();
185 } else {
186 Ext.History.forward();
187 }
188 return;
189 }
190
191 var newstate = me.decodeHToken(token);
192 Ext.Array.each(me.hslist, function(rec) {
193 if (typeof newstate[rec[0]] == "undefined") {
194 return;
195 }
196 me.setHV(rec[0], newstate[rec[0]], true);
197 });
198 };
199
200 var start_token = Ext.History.getToken();
201 if (start_token) {
202 history_change_cb(start_token);
203 } else {
204 var htext = me.encodeHToken(me.UIState);
205 Ext.History.add(htext);
206 }
207
208 Ext.History.on('change', history_change_cb);
209 },
210
211 get: function(name, defaultValue){
212 /*jslint confusion: true */
213 var me = this;
214 var data;
215
216 if (typeof me.UIState[name] != "undefined") {
217 data = { value: me.UIState[name] };
218 } else {
219 data = me.callParent(arguments);
220 if (!data && name === 'GuiCap') {
221 data = { vms: {}, storage: {}, access: {}, nodes: {}, dc: {} };
222 }
223 }
224
225 //console.log("GET " + name + " " + Ext.encode(data));
226 return data;
227 },
228
229 clear: function(name){
230 var me = this;
231
232 if (typeof me.UIState[name] != "undefined") {
233 me.UIState[name] = null;
234 }
235
236 me.callParent(arguments);
237 },
238
239 set: function(name, value){
240 var me = this;
241
242 //console.log("SET " + name + " " + Ext.encode(value));
243 if (typeof me.UIState[name] != "undefined") {
244 var newvalue = value ? value.value : null;
245 if (me.setHV(name, newvalue, false)) {
246 var htext = me.encodeHToken(me.UIState);
247 Ext.History.add(htext);
248 }
249 } else {
250 me.callParent(arguments);
251 }
252 }
253 });