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