to add/remove/show directories that are available for shared
filesystems.

and added /map/dirs/ path to PermPathStore.

Signed-off-by: Markus Frank <m.fr...@proxmox.com>
---
 www/manager6/Makefile              |   1 +
 www/manager6/data/PermPathStore.js |   3 +
 www/manager6/node/Config.js        |  12 ++
 www/manager6/node/SharedFiles.js   | 177 +++++++++++++++++++++++++++++
 4 files changed, 193 insertions(+)
 create mode 100644 www/manager6/node/SharedFiles.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 2b577c8e..bce14fdb 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -199,6 +199,7 @@ JSSRC=                                                      
\
        node/CmdMenu.js                                 \
        node/Config.js                                  \
        node/Directory.js                               \
+       node/SharedFiles.js                             \
        node/LVM.js                                     \
        node/LVMThin.js                                 \
        node/StatusView.js                              \
diff --git a/www/manager6/data/PermPathStore.js 
b/www/manager6/data/PermPathStore.js
index cf702c03..d83f9e12 100644
--- a/www/manager6/data/PermPathStore.js
+++ b/www/manager6/data/PermPathStore.js
@@ -13,6 +13,7 @@ Ext.define('PVE.data.PermPathStore', {
        { 'value': '/sdn/zones' },
        { 'value': '/storage' },
        { 'value': '/vms' },
+       { 'value': '/map/dirs' },
     ],
 
     constructor: function(config) {
@@ -39,6 +40,8 @@ Ext.define('PVE.data.PermPathStore', {
                    break;
                case 'pool': path = '/pool/' + record.get('pool');
                    break;
+               case 'dirs': path = '/map/dirs/' + record.get('dirs');
+                   break;
            }
            if (path !== undefined && !donePaths[path]) {
                me.add({ value: path });
diff --git a/www/manager6/node/Config.js b/www/manager6/node/Config.js
index 0cc23fb4..b35d5abc 100644
--- a/www/manager6/node/Config.js
+++ b/www/manager6/node/Config.js
@@ -410,6 +410,18 @@ Ext.define('PVE.node.Config', {
                });
        }
 
+       if (caps.map['Map.Modify']) {
+           me.items.push(
+               {
+                   xtype: 'pveSharedFilesList',
+                   title: gettext('Shared Files'),
+                   iconCls: 'fa fa-folder',
+                   onlineHelp: 'qm_sharedfiles',
+                   itemId: 'sharedFiles',
+               },
+           );
+       }
+
        me.items.push(
            {
                title: gettext('Task History'),
diff --git a/www/manager6/node/SharedFiles.js b/www/manager6/node/SharedFiles.js
new file mode 100644
index 00000000..4152de1b
--- /dev/null
+++ b/www/manager6/node/SharedFiles.js
@@ -0,0 +1,177 @@
+Ext.define('PVE.node.CreateSharedFiles', {
+    extend: 'Proxmox.window.Edit',
+    xtype: 'pveCreateSharedFiles',
+
+    subject: "Shared Directory",
+
+    onlineHelp: 'qm_sharedfiles',
+
+    initComponent: function() {
+        var me = this;
+
+       if (!me.nodename) {
+           throw "no node name specified";
+       }
+
+       me.isCreate = true;
+
+        Ext.applyIf(me, {
+           url: "/nodes/" + me.nodename + "/dirs",
+           method: 'POST',
+           items: [
+               {
+                   xtype: 'proxmoxtextfield',
+                   name: 'dirid',
+                   fieldLabel: gettext('Directory ID'),
+                   allowBlank: false,
+               },
+               {
+                   xtype: 'proxmoxtextfield',
+                   name: 'path',
+                   fieldLabel: gettext('Directory Path'),
+                   allowBlank: false,
+               },
+            ],
+        });
+
+        me.callParent();
+    },
+});
+
+Ext.define('PVE.node.SharedFilesList', {
+    extend: 'Ext.grid.Panel',
+    xtype: 'pveSharedFilesList',
+
+    viewModel: {
+       data: {
+           path: '',
+       },
+       formulas: {
+           dirid: (get) => get('dirid'),
+       },
+    },
+
+    controller: {
+       xclass: 'Ext.app.ViewController',
+
+       removeDirectory: function() {
+           let me = this;
+           let vm = me.getViewModel();
+           let view = me.getView();
+
+           const dirid = vm.get('dirid');
+
+           if (!view.nodename) {
+               throw "no node name specified";
+           }
+
+           if (!dirid) {
+               throw "no directory name specified";
+           }
+           Ext.create('Proxmox.window.SafeDestroy', {
+               url: `/nodes/${view.nodename}/dirs`,
+               item: { id: dirid },
+               params: { dirid: dirid },
+               taskName: 'Remove Directory from Shared Files',
+               autoShow: true,
+               listeners: {
+                   destroy: () => view.reload(),
+               },
+           }).show();
+       },
+    },
+
+    stateful: true,
+    stateId: 'grid-node-directory',
+    columns: [
+       {
+           text: gettext('Directory ID'),
+           dataIndex: 'dirid',
+           flex: 1,
+       },
+       {
+           text: gettext('Directory Path'),
+           dataIndex: 'path',
+           flex: 1,
+       },
+    ],
+
+    rootVisible: false,
+    useArrows: true,
+
+    tbar: [
+       {
+           text: gettext('Reload'),
+           iconCls: 'fa fa-refresh',
+           handler: function() {
+               this.up('panel').reload();
+           },
+       },
+       {
+           text: `${gettext('Create')}: ${gettext('Directory')}`,
+           handler: function() {
+               let view = this.up('panel');
+               Ext.create('PVE.node.CreateSharedFiles', {
+                   nodename: view.nodename,
+                   listeners: {
+                       destroy: () => view.reload(),
+                   },
+                   autoShow: true,
+               });
+           },
+       },
+       {
+           text: gettext('Remove'),
+           itemId: 'removeDir',
+           handler: 'removeDirectory',
+           disabled: true,
+           bind: {
+               disabled: '{!dirid}',
+           },
+       },
+    ],
+
+    reload: function() {
+       let me = this;
+       me.store.load();
+       me.store.sort();
+    },
+
+    listeners: {
+       activate: function() {
+           this.reload();
+       },
+       selectionchange: function(model, selected) {
+           let me = this;
+           let vm = me.getViewModel();
+
+           vm.set('dirid', selected[0]?.data.dirid || '');
+       },
+    },
+
+    initComponent: function() {
+        let me = this;
+
+       me.nodename = me.pveSelNode.data.node;
+       if (!me.nodename) {
+           throw "no node name specified";
+       }
+
+       Ext.apply(me, {
+           store: {
+               fields: ['dirid', 'path'],
+               proxy: {
+                   type: 'proxmox',
+                   url: `/api2/json/nodes/${me.nodename}/dirs`,
+               },
+               sorters: 'dirid',
+           },
+       });
+
+       me.callParent();
+
+       Proxmox.Utils.monStoreErrors(me, me.getStore(), true);
+       me.reload();
+    },
+});
+
-- 
2.30.2



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to