]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/Workspace.js
Revert "add beta text with link to bugtracker"
[pve-manager.git] / www / manager6 / Workspace.js
index 62f31bac657d7c57aea2a6e606ab44a0d4f7c185..d05b1e49db24fc2632a192868baf7ce7b030af84 100644 (file)
@@ -13,29 +13,34 @@ Ext.define('PVE.Workspace', {
 
     loginData: null, // Data from last login call
 
-    onLogin: function(loginData) {},
+    onLogin: function(loginData) {
+       // override me
+    },
 
     // private
     updateLoginData: function(loginData) {
-       var me = this;
+       let me = this;
        me.loginData = loginData;
        Proxmox.Utils.setAuthData(loginData);
 
-       var rt = me.down('pveResourceTree');
+       let rt = me.down('pveResourceTree');
        rt.setDatacenterText(loginData.clustername);
+       PVE.ClusterName = loginData.clustername;
 
        if (loginData.cap) {
            Ext.state.Manager.set('GuiCap', loginData.cap);
        }
+       me.response401count = 0;
 
        me.onLogin(loginData);
     },
 
     // private
     showLogin: function() {
-       var me = this;
+       let me = this;
 
        Proxmox.Utils.authClear();
+       Ext.state.Manager.clear('GuiCap');
        Proxmox.UserName = null;
        me.loginData = null;
 
@@ -44,23 +49,28 @@ Ext.define('PVE.Workspace', {
                handler: function(data) {
                    me.login = null;
                    me.updateLoginData(data);
-                   Proxmox.Utils.checked_command(function() {}); // display subscription status
-               }
+                   Proxmox.Utils.checked_command(Ext.emptyFn); // display subscription status
+               },
            });
        }
        me.onLogin(null);
         me.login.show();
     },
 
-    initComponent : function() {
-       var me = this;
+    initComponent: function() {
+       let me = this;
 
        Ext.tip.QuickTipManager.init();
 
        // fixme: what about other errors
        Ext.Ajax.on('requestexception', function(conn, response, options) {
-           if (response.status == 401 && !PVE.Utils.silenceAuthFailures) { // auth failure
-               me.showLogin();
+           if ((response.status === 401 || response.status === '401') && !PVE.Utils.silenceAuthFailures) { // auth failure
+               // don't immediately show as logged out to cope better with some big
+               // upgrades, which may temporarily produce a false positive 401 err
+               me.response401count++;
+               if (me.response401count > 5) {
+                   me.showLogin();
+               }
            }
        });
 
@@ -68,36 +78,33 @@ Ext.define('PVE.Workspace', {
 
         if (!Proxmox.Utils.authOK()) {
            me.showLogin();
-       } else { 
-           if (me.loginData) {
-               me.onLogin(me.loginData);
-           }
+       } else if (me.loginData) {
+           me.onLogin(me.loginData);
        }
 
        Ext.TaskManager.start({
            run: function() {
-               var ticket = Proxmox.Utils.authOK();
+               let ticket = Proxmox.Utils.authOK();
                if (!ticket || !Proxmox.UserName) {
                    return;
                }
 
                Ext.Ajax.request({
-                   params: { 
+                   params: {
                        username: Proxmox.UserName,
-                       password: ticket
+                       password: ticket,
                    },
                    url: '/api2/json/access/ticket',
                    method: 'POST',
                    success: function(response, opts) {
-                       var obj = Ext.decode(response.responseText);
+                       let obj = Ext.decode(response.responseText);
                        me.updateLoginData(obj.data);
-                   }
+                   },
                });
            },
-           interval: 15*60*1000
+           interval: 15 * 60 * 1000,
        });
-
-    }
+    },
 });
 
 Ext.define('PVE.StdWorkspace', {
@@ -107,40 +114,35 @@ Ext.define('PVE.StdWorkspace', {
 
     // private
     setContent: function(comp) {
-       var me = this;
-       
-       var cont = me.child('#content');
+       let me = this;
 
-       var lay = cont.getLayout();
-
-       var cur = lay.getActiveItem();
+       let view = me.child('#content');
+       let layout = view.getLayout();
+       let current = layout.getActiveItem();
 
        if (comp) {
-           Proxmox.Utils.setErrorMask(cont, false);
+           Proxmox.Utils.setErrorMask(view, false);
            comp.border = false;
-           cont.add(comp);
-           if (cur !== null && lay.getNext()) {
-               lay.next();
-               var task = Ext.create('Ext.util.DelayedTask', function(){
-                   cont.remove(cur);
+           view.add(comp);
+           if (current !== null && layout.getNext()) {
+               layout.next();
+               let task = Ext.create('Ext.util.DelayedTask', function() {
+                   view.remove(current);
                });
                task.delay(10);
            }
-       }
-       else {
-           // helper for cleaning the content when logging out
-           cont.removeAll();
+       } else {
+           view.removeAll(); // helper for cleaning the content when logging out
        }
     },
 
     selectById: function(nodeid) {
-       var me = this;
-       var tree = me.down('pveResourceTree');
-       tree.selectById(nodeid);
+       let me = this;
+       me.down('pveResourceTree').selectById(nodeid);
     },
 
     onLogin: function(loginData) {
-       var me = this;
+       let me = this;
 
        me.updateUserInfo();
 
@@ -153,25 +155,57 @@ Ext.define('PVE.StdWorkspace', {
                success: function(response) {
                    PVE.VersionInfo = response.result.data;
                    me.updateVersionInfo();
-               }
+               },
+           });
+
+           Proxmox.Utils.API2Request({
+               url: '/cluster/sdn',
+               method: 'GET',
+               success: function(response) {
+                   PVE.SDNInfo = response.result.data;
+               },
+               failure: function(response) {
+                   PVE.SDNInfo = null;
+                   let ui = Ext.ComponentQuery.query('treelistitem[text="SDN"]')[0];
+                   if (ui) {
+                       ui.addCls('x-hidden-display');
+                   }
+               },
+           });
+
+           Proxmox.Utils.API2Request({
+               url: '/access/domains',
+               method: 'GET',
+               success: function(response) {
+                   let [_username, realm] = Proxmox.Utils.parse_userid(Proxmox.UserName);
+                   response.result.data.forEach((domain) => {
+                       if (domain.realm === realm) {
+                           let schema = PVE.Utils.authSchema[domain.type];
+                           if (schema) {
+                               me.query('#tfaitem')[0].setHidden(!schema.tfa);
+                               me.query('#passworditem')[0].setHidden(!schema.pwchange);
+                           }
+                       }
+                   });
+               },
            });
        }
     },
 
     updateUserInfo: function() {
-       var me = this;
-       var ui = me.query('#userinfo')[0];
-       ui.setText(Proxmox.UserName || '');
+       let me = this;
+       let ui = me.query('#userinfo')[0];
+       ui.setText(Ext.String.htmlEncode(Proxmox.UserName || ''));
        ui.updateLayout();
     },
 
     updateVersionInfo: function() {
-       var me = this;
+       let me = this;
 
-       var ui = me.query('#versioninfo')[0];
+       let ui = me.query('#versioninfo')[0];
 
        if (PVE.VersionInfo) {
-           var version = PVE.VersionInfo.version;
+           let version = PVE.VersionInfo.version;
            ui.update('Virtual Environment ' + version);
        } else {
            ui.update('Virtual Environment');
@@ -179,60 +213,59 @@ Ext.define('PVE.StdWorkspace', {
        ui.updateLayout();
     },
 
-    initComponent : function() {
-       var me = this;
+    initComponent: function() {
+       let me = this;
 
        Ext.History.init();
 
-       var sprovider = Ext.create('PVE.StateProvider');
-       Ext.state.Manager.setProvider(sprovider);
+       let appState = Ext.create('PVE.StateProvider');
+       Ext.state.Manager.setProvider(appState);
 
-       var selview = Ext.create('PVE.form.ViewSelector');
+       let selview = Ext.create('PVE.form.ViewSelector');
 
-       var rtree = Ext.createWidget('pveResourceTree', {
+       let rtree = Ext.createWidget('pveResourceTree', {
            viewFilter: selview.getViewFilter(),
            flex: 1,
            selModel: {
                selType: 'treemodel',
                listeners: {
                    selectionchange: function(sm, selected) {
-                       if (selected.length > 0) {
-                           var n = selected[0];
-                           var tlckup = {
-                               root: 'PVE.dc.Config',
-                               node: 'PVE.node.Config',
-                               qemu: 'PVE.qemu.Config',
-                               lxc: 'PVE.lxc.Config',
-                               storage: 'PVE.storage.Browser',
-                               pool: 'pvePoolConfig'
-                           };
-                           var comp = {
-                               xtype: tlckup[n.data.type || 'root'] || 
-                                   'pvePanelConfig',
-                               showSearch: (n.data.id === 'root') ||
-                                   Ext.isDefined(n.data.groupbyid),
-                               pveSelNode: n,
-                               workspace: me,
-                               viewFilter: selview.getViewFilter()
-                           };
-                           PVE.curSelectedNode = n;
-                           me.setContent(comp);
+                       if (selected.length <= 0) {
+                           return;
                        }
-                   }
-               }
-           }
+                       let treeNode = selected[0];
+                       let treeTypeToClass = {
+                           root: 'PVE.dc.Config',
+                           node: 'PVE.node.Config',
+                           qemu: 'PVE.qemu.Config',
+                           lxc: 'PVE.lxc.Config',
+                           storage: 'PVE.storage.Browser',
+                           sdn: 'PVE.sdn.Browser',
+                           pool: 'pvePoolConfig',
+                       };
+                       PVE.curSelectedNode = treeNode;
+                       me.setContent({
+                           xtype: treeTypeToClass[treeNode.data.type || 'root'] || 'pvePanelConfig',
+                           showSearch: treeNode.data.id === 'root' || Ext.isDefined(treeNode.data.groupbyid),
+                           pveSelNode: treeNode,
+                           workspace: me,
+                           viewFilter: selview.getViewFilter(),
+                       });
+                   },
+               },
+           },
        });
 
-       selview.on('select', function(combo, records) { 
+       selview.on('select', function(combo, records) {
            if (records) {
-               var view = combo.getViewFilter();
+               let view = combo.getViewFilter();
                rtree.setViewFilter(view);
            }
        });
 
-       var caps = sprovider.get('GuiCap');
+       let caps = appState.get('GuiCap');
 
-       var createVM = Ext.createWidget('button', {
+       let createVM = Ext.createWidget('button', {
            pack: 'end',
            margin: '3 5 0 0',
            baseCls: 'x-btn',
@@ -240,12 +273,12 @@ Ext.define('PVE.StdWorkspace', {
            text: gettext("Create VM"),
            disabled: !caps.vms['VM.Allocate'],
            handler: function() {
-               var wiz = Ext.create('PVE.qemu.CreateWizard', {});
+               let wiz = Ext.create('PVE.qemu.CreateWizard', {});
                wiz.show();
-           } 
+           },
        });
 
-       var createCT = Ext.createWidget('button', {
+       let createCT = Ext.createWidget('button', {
            pack: 'end',
            margin: '3 5 0 0',
            baseCls: 'x-btn',
@@ -253,12 +286,12 @@ Ext.define('PVE.StdWorkspace', {
            text: gettext("Create CT"),
            disabled: !caps.vms['VM.Allocate'],
            handler: function() {
-               var wiz = Ext.create('PVE.lxc.CreateWizard', {});
+               let wiz = Ext.create('PVE.lxc.CreateWizard', {});
                wiz.show();
-           } 
+           },
        });
 
-       sprovider.on('statechange', function(sp, key, value) {
+       appState.on('statechange', function(sp, key, value) {
            if (key === 'GuiCap' && value) {
                caps = value;
                createVM.setDisabled(!caps.vms['VM.Allocate']);
@@ -272,36 +305,31 @@ Ext.define('PVE.StdWorkspace', {
            items: [
                {
                    region: 'north',
-                   layout: { 
+                   layout: {
                        type: 'hbox',
-                       align: 'middle'
+                       align: 'middle',
                    },
-                   baseCls: 'x-plain',         
+                   baseCls: 'x-plain',
                    defaults: {
-                       baseCls: 'x-plain'                      
+                       baseCls: 'x-plain',
                    },
                    border: false,
                    margin: '2 0 2 5',
                    items: [
                        {
-                           html: '<a class="x-unselectable" target=_blank href="http://www.proxmox.com">' +
-                               '<img style="padding-top:4px;padding-right:5px" src="/pve2/images/proxmox_logo.png"/></a>'
+                           xtype: 'proxmoxlogo',
                        },
                        {
                            minWidth: 150,
                            id: 'versioninfo',
-                           html: 'Virtual Environment'
-                       },
-                       {
-                           padding: 5,
-                           html: '<a href="https://bugzilla.proxmox.com" target="_blank">BETA</a>'
+                           html: 'Virtual Environment',
                        },
                        {
                            xtype: 'pveGlobalSearchField',
-                           tree: rtree
+                           tree: rtree,
                        },
                        {
-                           flex: 1
+                           flex: 1,
                        },
                        {
                            xtype: 'proxmoxHelpButton',
@@ -311,9 +339,9 @@ Ext.define('PVE.StdWorkspace', {
                            listenToGlobalEvent: false,
                            onlineHelp: 'pve_documentation_index',
                            text: gettext('Documentation'),
-                           margin: '0 5 0 0'
+                           margin: '0 5 0 0',
                        },
-                       createVM, 
+                       createVM,
                        createCT,
                        {
                            pack: 'end',
@@ -324,7 +352,7 @@ Ext.define('PVE.StdWorkspace', {
                            style: {
                                // proxmox dark grey p light grey as border
                                backgroundColor: '#464d4d',
-                               borderColor: '#ABBABA'
+                               borderColor: '#ABBABA',
                            },
                            iconCls: 'fa fa-user',
                            menu: [
@@ -334,27 +362,37 @@ Ext.define('PVE.StdWorkspace', {
                                    handler: function() {
                                        var win = Ext.create('PVE.window.Settings');
                                        win.show();
-                                   }
+                                   },
                                },
                                {
                                    text: gettext('Password'),
+                                   itemId: 'passworditem',
                                    iconCls: 'fa fa-fw fa-key',
                                    handler: function() {
                                        var win = Ext.create('Proxmox.window.PasswordEdit', {
-                                           userid: Proxmox.UserName
+                                           userid: Proxmox.UserName,
                                        });
                                        win.show();
-                                   }
+                                   },
                                },
                                {
                                    text: 'TFA',
+                                   itemId: 'tfaitem',
                                    iconCls: 'fa fa-fw fa-lock',
                                    handler: function(btn, event, rec) {
-                                       var win = Ext.create('PVE.window.TFAEdit',{
-                                           userid: Proxmox.UserName
+                                       var win = Ext.create('PVE.window.TFAEdit', {
+                                           userid: Proxmox.UserName,
                                        });
                                        win.show();
-                                   }
+                                   },
+                               },
+                               {
+                                   iconCls: 'fa fa-language',
+                                   text: gettext('Language'),
+                                   handler: function() {
+                                       Ext.create('Proxmox.window.LanguageEditWindow')
+                                           .show();
+                                   },
                                },
                                '-',
                                {
@@ -375,11 +413,11 @@ Ext.define('PVE.StdWorkspace', {
                                                comp.getStore().loadData([], false);
                                            }
                                        });
-                                   }
-                               }
-                           ]
-                       }
-                   ]
+                                   },
+                               },
+                           ],
+                       },
+                   ],
                },
                {
                    region: 'center',
@@ -392,7 +430,7 @@ Ext.define('PVE.StdWorkspace', {
                    layout: { type: 'card' },
                    border: false,
                    margin: '0 5 0 0',
-                   items: []
+                   items: [],
                },
                {
                    region: 'west',
@@ -405,15 +443,15 @@ Ext.define('PVE.StdWorkspace', {
                    margin: '0 0 0 5',
                    split: true,
                    width: 200,
-                   items: [ selview, rtree ],
+                   items: [selview, rtree],
                    listeners: {
                        resize: function(panel, width, height) {
                            var viewWidth = me.getSize().width;
                            if (width > viewWidth - 100) {
                                panel.setWidth(viewWidth - 100);
                            }
-                       }
-                   }
+                       },
+                   },
                },
                {
                    xtype: 'pveStatusPanel',
@@ -421,22 +459,22 @@ Ext.define('PVE.StdWorkspace', {
                    stateId: 'pvesouth',
                    itemId: 'south',
                    region: 'south',
-                   margin:'0 5 5 5',
+                   margin: '0 5 5 5',
                    title: gettext('Logs'),
                    collapsible: true,
                    header: false,
                    height: 200,
-                   split:true,
+                   split: true,
                    listeners: {
                        resize: function(panel, width, height) {
                            var viewHeight = me.getSize().height;
-                           if (height > (viewHeight - 150)) {
+                           if (height > viewHeight - 150) {
                                panel.setHeight(viewHeight - 150);
                            }
-                       }
-                   }
-               }
-           ]
+                       },
+                   },
+               },
+           ],
        });
 
        me.callParent();
@@ -444,14 +482,12 @@ Ext.define('PVE.StdWorkspace', {
        me.updateUserInfo();
 
        // on resize, center all modal windows
-       Ext.on('resize', function(){
-           var wins = Ext.ComponentQuery.query('window[modal]');
-           if (wins.length > 0) {
-               wins.forEach(function(win){
-                   win.alignTo(me, 'c-c');
-               });
+       Ext.on('resize', function() {
+           let modalWindows = Ext.ComponentQuery.query('window[modal]');
+           if (modalWindows.length > 0) {
+               modalWindows.forEach(win => win.alignTo(me, 'c-c'));
            }
        });
-    }
+    },
 });