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