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