]>
Commit | Line | Data |
---|---|---|
48295db4 DM |
1 | Ext.define('PVE.Page', { |
2 | extend: 'Ext.Container', | |
3 | alias: 'widget.pvePage', | |
4 | ||
5 | statics: { | |
6 | pathMatch: function(loc) { | |
7 | throw "implement this in subclass"; | |
8 | } | |
9 | }, | |
10 | ||
11 | config: { | |
12 | layout: 'vbox', | |
13 | appUrl: undefined | |
14 | } | |
15 | }); | |
16 | ||
17 | Ext.define('PVE.ErrorPage', { | |
18 | extend: 'Ext.Panel', | |
19 | ||
20 | config: { | |
21 | html: "no such page", | |
22 | padding: 10, | |
23 | layout: { | |
24 | type: 'vbox', | |
25 | pack: 'center', | |
26 | align: 'stretch' | |
27 | }, | |
28 | items: [ | |
7853a5ff TL |
29 | { |
30 | xtype: 'pveTitleBar', | |
60d08d80 | 31 | pveReloadButton: false, |
7853a5ff | 32 | title: gettext('Error') |
48295db4 DM |
33 | } |
34 | ] | |
35 | } | |
36 | }); | |
37 | ||
38 | Ext.define('PVE.Workspace', { statics: { | |
39 | // this class only contains static functions | |
40 | ||
41 | loginData: null, // Data from last login call | |
42 | ||
43 | appWindow: null, | |
44 | ||
45 | history: null, | |
46 | ||
47 | pages: [ | |
617c5801 TL |
48 | 'PVE.LXCMigrate', |
49 | 'PVE.LXCSummary', | |
48295db4 DM |
50 | 'PVE.QemuMigrate', |
51 | 'PVE.QemuSummary', | |
52 | 'PVE.NodeSummary', | |
53 | 'PVE.ClusterTaskList', | |
54 | 'PVE.NodeTaskList', | |
55 | 'PVE.TaskViewer', | |
56 | 'PVE.Datacenter' | |
57 | ], | |
58 | ||
59 | setHistory: function(h) { | |
60 | PVE.Workspace.history = h; | |
61 | ||
62 | PVE.Workspace.history.setUpdateUrl(true); | |
63 | ||
64 | PVE.Workspace.loadPage(PVE.Workspace.history.getToken()); | |
65 | PVE.Workspace.history.on('change', function(loc) { | |
66 | PVE.Workspace.loadPage(loc); | |
67 | }); | |
68 | }, | |
69 | ||
abfdd685 TL |
70 | goBack: function() { |
71 | var actions = PVE.Workspace.history.getActions(), | |
72 | lastAction = actions[actions.length - 2]; | |
73 | ||
74 | var url = ''; | |
75 | if(lastAction) { | |
76 | actions.pop(); | |
77 | url = lastAction.getUrl(); | |
78 | } | |
79 | ||
80 | // use loadPage directly so we don't cause new additions to the history | |
81 | PVE.Workspace.loadPage(url); | |
82 | }, | |
83 | ||
48295db4 DM |
84 | __setAppWindow: function(comp, dir) { |
85 | ||
86 | var old = PVE.Workspace.appWindow; | |
87 | ||
88 | PVE.Workspace.appWindow = comp; | |
89 | ||
90 | if (old) { | |
91 | if (dir === 'noanim') { | |
92 | Ext.Viewport.setActiveItem(PVE.Workspace.appWindow); | |
93 | } else { | |
94 | var anim = { type: 'slide', direction: dir || 'left' }; | |
95 | Ext.Viewport.animateActiveItem(PVE.Workspace.appWindow, anim); | |
96 | } | |
97 | // remove old after anim (hack, because anim.after does not work in 2.3.1a) | |
98 | Ext.Function.defer(function(){ | |
99 | if (comp !== old) { | |
100 | Ext.Viewport.remove(old); | |
101 | } | |
102 | }, 500); | |
103 | } else { | |
abfdd685 | 104 | Ext.Viewport.setActiveItem(PVE.Workspace.appWindow); |
48295db4 DM |
105 | } |
106 | }, | |
107 | ||
108 | updateLoginData: function(loginData) { | |
109 | PVE.Workspace.loginData = loginData; | |
110 | PVE.CSRFPreventionToken = loginData.CSRFPreventionToken; | |
111 | PVE.UserName = loginData.username; | |
112 | ||
113 | // creates a session cookie (expire = null) | |
114 | // that way the cookie gets deleted after browser window close | |
115 | Ext.util.Cookies.set('PVEAuthCookie', loginData.ticket, null, '/', null, true); | |
116 | ||
117 | PVE.Workspace.gotoPage(''); | |
118 | }, | |
119 | ||
120 | showLogin: function() { | |
e7ade592 | 121 | Proxmox.Utils.authClear(); |
48295db4 DM |
122 | PVE.UserName = null; |
123 | PVE.Workspace.loginData = null; | |
124 | ||
125 | PVE.Workspace.gotoPage(''); | |
126 | }, | |
127 | ||
128 | gotoPage: function(loc) { | |
129 | var match; | |
130 | ||
131 | var old = PVE.Workspace.appWindow; | |
132 | ||
133 | if (old.getAppUrl) { | |
134 | var old_loc = old.getAppUrl(); | |
135 | if (old_loc !== loc) { | |
136 | PVE.Workspace.history.add(Ext.create('Ext.app.Action', { url: loc })); | |
137 | } else { | |
138 | PVE.Workspace.loadPage(loc); | |
139 | } | |
140 | } else { | |
141 | PVE.Workspace.history.add(Ext.create('Ext.app.Action', { url: loc })); | |
142 | } | |
143 | }, | |
144 | ||
145 | loadPage: function(loc) { | |
146 | loc = loc || ''; | |
147 | ||
148 | var comp; | |
149 | ||
e7ade592 | 150 | if (!Proxmox.Utils.authOK()) { |
48295db4 DM |
151 | comp = Ext.create('PVE.Login', {}); |
152 | } else { | |
153 | Ext.Array.each(PVE.Workspace.pages, function(p, index) { | |
154 | var c = Ext.ClassManager.get(p); | |
155 | var match = c.pathMatch(loc); | |
156 | if (match) { | |
157 | comp = Ext.create(p, { appUrl: loc }); | |
158 | return false; // stop iteration | |
159 | } | |
160 | }); | |
161 | if (!comp) { | |
162 | comp = Ext.create('PVE.ErrorPage', {}); | |
163 | } | |
164 | } | |
165 | ||
166 | PVE.Workspace.__setAppWindow(comp, 'noanim'); | |
167 | }, | |
168 | ||
169 | obj_to_kv: function(d, names) { | |
170 | var kv = []; | |
171 | var done = { digest: 1 }; | |
172 | var pushItem = function(item) { | |
173 | if (done[item.key]) return; | |
174 | done[item.key] = 1; | |
175 | if (item.value) kv.push(item); | |
176 | } | |
177 | ||
178 | var keys = Ext.Array.sort(Ext.Object.getKeys(d)); | |
179 | Ext.Array.each(names, function(k) { | |
180 | if (typeof(k) === 'object') { | |
181 | Ext.Array.each(keys, function(n) { | |
182 | if (k.test(n)) { | |
183 | pushItem({ key: n, value: d[n] }); | |
184 | } | |
185 | }); | |
186 | } else { | |
187 | ||
188 | pushItem({ key: k, value: d[k] }); | |
189 | } | |
190 | }); | |
191 | Ext.Array.each(keys, function(k) { | |
192 | pushItem({ key: k, value: d[k] }); | |
193 | }); | |
194 | return kv; | |
195 | } | |
196 | ||
197 | }}); |