X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=www%2FNavigationTree.js;h=6524a5c39612ce03eebed196c9b5c10041d91bfd;hb=2565fdd075c84fcec4148219e4e22ae4d43246f2;hp=d36e25e8f90b17115e0ee014631bbba32577d6cc;hpb=58f950c546233b6174c7d5e3dcf56af103cbf58e;p=proxmox-backup.git diff --git a/www/NavigationTree.js b/www/NavigationTree.js index d36e25e8..6524a5c3 100644 --- a/www/NavigationTree.js +++ b/www/NavigationTree.js @@ -1,3 +1,13 @@ +Ext.define('pbs-datastore-list', { + extend: 'Ext.data.Model', + fields: ['name', 'comment'], + proxy: { + type: 'proxmox', + url: "/api2/json/admin/datastore", + }, + idProperty: 'store', +}); + Ext.define('PBS.store.NavigationStore', { extend: 'Ext.data.TreeStore', @@ -10,7 +20,7 @@ Ext.define('PBS.store.NavigationStore', { text: gettext('Dashboard'), iconCls: 'fa fa-tachometer', path: 'pbsDashboard', - leaf: true + leaf: true, }, { text: gettext('Configuration'), @@ -22,13 +32,13 @@ Ext.define('PBS.store.NavigationStore', { text: gettext('User Management'), iconCls: 'fa fa-user', path: 'pbsUserView', - leaf: true + leaf: true, }, { text: gettext('Permissions'), iconCls: 'fa fa-unlock', path: 'pbsACLView', - leaf: true + leaf: true, }, { text: gettext('Remotes'), @@ -36,19 +46,13 @@ Ext.define('PBS.store.NavigationStore', { path: 'pbsRemoteView', leaf: true, }, - { - text: gettext('Sync Jobs'), - iconCls: 'fa fa-refresh', - path: 'pbsSyncJobView', - leaf: true, - }, { text: gettext('Subscription'), iconCls: 'fa fa-support', path: 'pbsSubscription', - leaf: true - } - ] + leaf: true, + }, + ], }, { text: gettext('Administration'), @@ -75,19 +79,28 @@ Ext.define('PBS.store.NavigationStore', { path: 'pbsZFSList', leaf: true, }, - ] - } - ] + ], + }, + ], }, { text: gettext('Datastore'), iconCls: 'fa fa-archive', - path: 'pbsDataStoreConfig', + id: 'datastores', expanded: true, - leaf: false + expandable: false, + leaf: false, + children: [ + { + text: gettext('Add Datastore'), + iconCls: 'fa fa-plus-circle', + leaf: true, + id: 'addbutton', + }, + ], }, - ] - } + ], + }, }); Ext.define('PBS.view.main.NavigationTree', { @@ -98,12 +111,12 @@ Ext.define('PBS.view.main.NavigationTree', { xclass: 'Ext.app.ViewController', init: function(view) { - view.rstore = Ext.create('Proxmox.data.UpdateStore', { autoStart: true, interval: 15 * 1000, + storeId: 'pbs-datastore-list', storeid: 'pbs-datastore-list', - model: 'pbs-datastore-list' + model: 'pbs-datastore-list', }); view.rstore.on('load', this.onLoad, this); @@ -116,51 +129,88 @@ Ext.define('PBS.view.main.NavigationTree', { let root = view.getStore().getRoot(); - // FIXME: newly added always get appended to the end.. - records.sort((a, b) => { - if (a.id > b.id) return 1; - if (a.id < b.id) return -1; - return 0; - }); + records.sort((a, b) => a.id.localeCompare(b.id)); - var list = root.findChild('path', 'pbsDataStoreConfig', false); + var list = root.findChild('id', 'datastores', false); var length = records.length; var lookup_hash = {}; - for (var i = 0; i < length; i++) { - var name = records[i].id; + let j = 0; + for (let i = 0; i < length; i++) { + let name = records[i].id; lookup_hash[name] = true; - if (!list.findChild('text', name, false)) { - list.appendChild({ + + while (name.localeCompare(list.getChildAt(j).data.text) > 0 && + (j + 1) < list.childNodes.length) { + j++; + } + + if (list.getChildAt(j).data.text.localeCompare(name) !== 0) { + list.insertChild(j, { text: name, path: `DataStore-${name}`, iconCls: 'fa fa-database', - leaf: true + leaf: true, }); } } var erase_list = []; list.eachChild(function(node) { - var name = node.data.text; - if (!lookup_hash[name]) { + let name = node.data.text; + if (!lookup_hash[name] && node.data.id !== 'addbutton') { erase_list.push(node); } }); - Ext.Array.forEach(erase_list, function(node) { node.erase(); }); + Ext.Array.forEach(erase_list, function(node) { list.removeChild(node, true); }); - } + if (view.pathToSelect !== undefined) { + let path = view.pathToSelect; + delete view.pathToSelect; + view.select(path, true); + } + }, }, - select: function(path) { + listeners: { + itemclick: function(tl, info) { + if (info.node.data.id === 'datastores') { + return false; + } + if (info.node.data.id === 'addbutton') { + let me = this; + Ext.create('PBS.DataStoreEdit', { + listeners: { + destroy: function() { + me.rstore.reload(); + }, + }, + }).show(); + return false; + } + return true; + }, + }, + + select: function(path, silent) { var me = this; - var item = me.getStore().findRecord('path', path, 0, false, true, true); - me.setSelection(item); + if (me.rstore.isLoaded()) { + if (silent) { + me.suspendEvents(false); + } + var item = me.getStore().findRecord('path', path, 0, false, true, true); + me.setSelection(item); + if (silent) { + me.resumeEvents(true); + } + } else { + me.pathToSelect = path; + } }, animation: false, expanderOnly: true, expanderFirst: false, store: 'NavigationStore', - ui: 'nav' + ui: 'nav', });