]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/StateProvider.js
1 /* This state provider keeps part of the state inside the browser history.
3 * We compress (shorten) url using dictionary based compression, i.e., we use
4 * column separated list instead of url encoded hash:
6 * := indicates string values
7 * :\d+ lookup value in dictionary hash
8 * #v1:=value1:5:=value2:=value3:...
11 Ext
.define('PVE.StateProvider', {
12 extend
: 'Ext.state.LocalStorageProvider',
15 setHV: function(name
, newvalue
, fireEvents
) {
19 let oldtext
= Ext
.encode(me
.UIState
[name
]);
20 let newtext
= Ext
.encode(newvalue
);
21 if (newtext
!== oldtext
) {
23 me
.UIState
[name
] = newvalue
;
25 me
.fireEvent("statechange", me
, name
, { value
: newvalue
});
33 // order is important for notifications
68 'firewall-options': 36,
70 'firewall-aliases': 34,
107 decodeHToken: function(token
) {
112 me
.hslist
.forEach(([k
, v
]) => { state
[k
] = v
; });
116 let [prefix
, ...items
] = token
.split(':');
118 if (prefix
!== me
.hprefix
) {
119 return me
.decodeHToken();
122 Ext
.Array
.each(me
.hslist
, function(rec
) {
123 let value
= items
.shift();
125 if (value
[0] === '=') {
126 value
= decodeURIComponent(value
.slice(1));
128 for (const [key
, hash
] of Object
.entries(me
.compDict
)) {
129 if (String(value
) === String(hash
)) {
135 state
[rec
[0]] = value
;
141 encodeHToken: function(state
) {
144 let ctoken
= me
.hprefix
;
145 Ext
.Array
.each(me
.hslist
, function(rec
) {
146 let value
= state
[rec
[0]];
147 if (!Ext
.isDefined(value
)) {
150 value
= encodeURIComponent(value
);
153 } else if (Ext
.isDefined(me
.compDict
[value
])) {
154 ctoken
+= ":" + me
.compDict
[value
];
156 ctoken
+= ":=" + value
;
163 constructor: function(config
) {
166 me
.callParent([config
]);
168 me
.UIState
= me
.decodeHToken(); // set default
170 let history_change_cb = function(token
) {
176 let newstate
= me
.decodeHToken(token
);
177 Ext
.Array
.each(me
.hslist
, function(rec
) {
178 if (typeof newstate
[rec
[0]] === "undefined") {
181 me
.setHV(rec
[0], newstate
[rec
[0]], true);
185 let start_token
= Ext
.History
.getToken();
187 history_change_cb(start_token
);
189 let htext
= me
.encodeHToken(me
.UIState
);
190 Ext
.History
.add(htext
);
193 Ext
.History
.on('change', history_change_cb
);
196 get: function(name
, defaultValue
) {
200 if (typeof me
.UIState
[name
] !== "undefined") {
201 data
= { value
: me
.UIState
[name
] };
203 data
= me
.callParent(arguments
);
204 if (!data
&& name
=== 'GuiCap') {
218 clear: function(name
) {
221 if (typeof me
.UIState
[name
] !== "undefined") {
222 me
.UIState
[name
] = null;
224 me
.callParent(arguments
);
227 set: function(name
, value
, fireevent
) {
230 if (typeof me
.UIState
[name
] !== "undefined") {
231 var newvalue
= value
? value
.value
: null;
232 if (me
.setHV(name
, newvalue
, fireevent
)) {
233 let htext
= me
.encodeHToken(me
.UIState
);
234 Ext
.History
.add(htext
);
237 me
.callParent(arguments
);