]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/Workspace.js
4 * popup login window when auth fails (call onLogin handler)
5 * update (re-login) ticket every 15 minutes
9 Ext
.define('PVE.Workspace', {
10 extend
: 'Ext.container.Viewport',
12 title
: 'Proxmox Virtual Environment',
14 loginData
: null, // Data from last login call
16 onLogin: function(loginData
) {},
19 updateLoginData: function(loginData
) {
21 me
.loginData
= loginData
;
22 Proxmox
.Utils
.setAuthData(loginData
);
24 var rt
= me
.down('pveResourceTree');
25 rt
.setDatacenterText(loginData
.clustername
);
26 PVE
.ClusterName
= loginData
.clustername
;
29 Ext
.state
.Manager
.set('GuiCap', loginData
.cap
);
31 me
.response401count
= 0;
33 me
.onLogin(loginData
);
37 showLogin: function() {
40 Proxmox
.Utils
.authClear();
41 Ext
.state
.Manager
.clear('GuiCap');
42 Proxmox
.UserName
= null;
46 me
.login
= Ext
.create('PVE.window.LoginWindow', {
47 handler: function(data
) {
49 me
.updateLoginData(data
);
50 Proxmox
.Utils
.checked_command(function() {}); // display subscription status
58 initComponent : function() {
61 Ext
.tip
.QuickTipManager
.init();
63 // fixme: what about other errors
64 Ext
.Ajax
.on('requestexception', function(conn
, response
, options
) {
65 if (response
.status
== 401 && !PVE
.Utils
.silenceAuthFailures
) { // auth failure
66 // don't immediately show as logged out to cope better with some big
67 // upgrades, which may temporarily produce a false positive 401 err
68 me
.response401count
++;
69 if (me
.response401count
> 5) {
77 if (!Proxmox
.Utils
.authOK()) {
81 me
.onLogin(me
.loginData
);
85 Ext
.TaskManager
.start({
87 var ticket
= Proxmox
.Utils
.authOK();
88 if (!ticket
|| !Proxmox
.UserName
) {
94 username
: Proxmox
.UserName
,
97 url
: '/api2/json/access/ticket',
99 success: function(response
, opts
) {
100 var obj
= Ext
.decode(response
.responseText
);
101 me
.updateLoginData(obj
.data
);
105 interval
: 15*60*1000,
111 Ext
.define('PVE.StdWorkspace', {
112 extend
: 'PVE.Workspace',
114 alias
: ['widget.pveStdWorkspace'],
117 setContent: function(comp
) {
120 var cont
= me
.child('#content');
122 var lay
= cont
.getLayout();
124 var cur
= lay
.getActiveItem();
127 Proxmox
.Utils
.setErrorMask(cont
, false);
130 if (cur
!== null && lay
.getNext()) {
132 var task
= Ext
.create('Ext.util.DelayedTask', function(){
139 // helper for cleaning the content when logging out
144 selectById: function(nodeid
) {
146 var tree
= me
.down('pveResourceTree');
147 tree
.selectById(nodeid
);
150 onLogin: function(loginData
) {
156 PVE
.data
.ResourceStore
.startUpdate();
158 Proxmox
.Utils
.API2Request({
161 success: function(response
) {
162 PVE
.VersionInfo
= response
.result
.data
;
163 me
.updateVersionInfo();
167 Proxmox
.Utils
.API2Request({
170 success: function(response
) {
171 PVE
.SDNInfo
= response
.result
.data
;
173 failure: function(response
) {
175 let ui
= Ext
.ComponentQuery
.query('treelistitem[text="SDN"]')[0];
177 ui
.addCls('x-hidden-display');
184 updateUserInfo: function() {
186 var ui
= me
.query('#userinfo')[0];
187 ui
.setText(Ext
.String
.htmlEncode(Proxmox
.UserName
|| ''));
191 updateVersionInfo: function() {
194 var ui
= me
.query('#versioninfo')[0];
196 if (PVE
.VersionInfo
) {
197 var version
= PVE
.VersionInfo
.version
;
198 ui
.update('Virtual Environment ' + version
);
200 ui
.update('Virtual Environment');
205 initComponent : function() {
210 var sprovider
= Ext
.create('PVE.StateProvider');
211 Ext
.state
.Manager
.setProvider(sprovider
);
213 var selview
= Ext
.create('PVE.form.ViewSelector');
215 var rtree
= Ext
.createWidget('pveResourceTree', {
216 viewFilter
: selview
.getViewFilter(),
219 selType
: 'treemodel',
221 selectionchange: function(sm
, selected
) {
222 if (selected
.length
> 0) {
225 root
: 'PVE.dc.Config',
226 node
: 'PVE.node.Config',
227 qemu
: 'PVE.qemu.Config',
228 lxc
: 'PVE.lxc.Config',
229 storage
: 'PVE.storage.Browser',
230 sdn
: 'PVE.sdn.Browser',
231 pool
: 'pvePoolConfig',
234 xtype
: tlckup
[n
.data
.type
|| 'root'] ||
236 showSearch
: (n
.data
.id
=== 'root') ||
237 Ext
.isDefined(n
.data
.groupbyid
),
240 viewFilter
: selview
.getViewFilter(),
242 PVE
.curSelectedNode
= n
;
250 selview
.on('select', function(combo
, records
) {
252 var view
= combo
.getViewFilter();
253 rtree
.setViewFilter(view
);
257 var caps
= sprovider
.get('GuiCap');
259 var createVM
= Ext
.createWidget('button', {
263 iconCls
: 'fa fa-desktop',
264 text
: gettext("Create VM"),
265 disabled
: !caps
.vms
['VM.Allocate'],
266 handler: function() {
267 var wiz
= Ext
.create('PVE.qemu.CreateWizard', {});
272 var createCT
= Ext
.createWidget('button', {
276 iconCls
: 'fa fa-cube',
277 text
: gettext("Create CT"),
278 disabled
: !caps
.vms
['VM.Allocate'],
279 handler: function() {
280 var wiz
= Ext
.create('PVE.lxc.CreateWizard', {});
285 sprovider
.on('statechange', function(sp
, key
, value
) {
286 if (key
=== 'GuiCap' && value
) {
288 createVM
.setDisabled(!caps
.vms
['VM.Allocate']);
289 createCT
.setDisabled(!caps
.vms
['VM.Allocate']);
294 layout
: { type
: 'border' },
311 xtype
: 'proxmoxlogo',
316 html
: 'Virtual Environment',
319 xtype
: 'pveGlobalSearchField',
326 xtype
: 'proxmoxHelpButton',
329 iconCls
: 'fa fa-book x-btn-icon-el-default-toolbar-small ',
330 listenToGlobalEvent
: false,
331 onlineHelp
: 'pve_documentation_index',
332 text
: gettext('Documentation'),
344 // proxmox dark grey p light grey as border
345 backgroundColor
: '#464d4d',
346 borderColor
: '#ABBABA',
348 iconCls
: 'fa fa-user',
351 iconCls
: 'fa fa-gear',
352 text
: gettext('My Settings'),
353 handler: function() {
354 var win
= Ext
.create('PVE.window.Settings');
359 text
: gettext('Password'),
360 iconCls
: 'fa fa-fw fa-key',
361 handler: function() {
362 var win
= Ext
.create('Proxmox.window.PasswordEdit', {
363 userid
: Proxmox
.UserName
,
370 iconCls
: 'fa fa-fw fa-lock',
371 handler: function(btn
, event
, rec
) {
372 var win
= Ext
.create('PVE.window.TFAEdit', {
373 userid
: Proxmox
.UserName
,
379 iconCls
: 'fa fa-language',
380 text
: gettext('Language'),
381 handler: function() {
382 Ext
.create('Proxmox.window.LanguageEditWindow')
388 iconCls
: 'fa fa-fw fa-sign-out',
389 text
: gettext("Logout"),
390 handler: function() {
391 PVE
.data
.ResourceStore
.loadData([], false);
394 var rt
= me
.down('pveResourceTree');
395 rt
.setDatacenterText(undefined);
398 // empty the stores of the StatusPanel child items
399 var statusPanels
= Ext
.ComponentQuery
.query('pveStatusPanel grid');
400 Ext
.Array
.forEach(statusPanels
, function(comp
) {
401 if (comp
.getStore()) {
402 comp
.getStore().loadData([], false);
414 stateId
: 'pvecenter',
419 layout
: { type
: 'card' },
431 layout
: { type
: 'vbox', align
: 'stretch' },
435 items
: [ selview
, rtree
],
437 resize: function(panel
, width
, height
) {
438 var viewWidth
= me
.getSize().width
;
439 if (width
> viewWidth
- 100) {
440 panel
.setWidth(viewWidth
- 100);
446 xtype
: 'pveStatusPanel',
452 title
: gettext('Logs'),
458 resize: function(panel
, width
, height
) {
459 var viewHeight
= me
.getSize().height
;
460 if (height
> (viewHeight
- 150)) {
461 panel
.setHeight(viewHeight
- 150);
473 // on resize, center all modal windows
474 Ext
.on('resize', function(){
475 var wins
= Ext
.ComponentQuery
.query('window[modal]');
476 if (wins
.length
> 0) {
477 wins
.forEach(function(win
){
478 win
.alignTo(me
, 'c-c');