Signed-off-by: Markus Frank <m.fr...@proxmox.com>
---
 www/manager6/Makefile             |   1 +
 www/manager6/window/DirMapEdit.js | 222 ++++++++++++++++++++++++++++++
 2 files changed, 223 insertions(+)
 create mode 100644 www/manager6/window/DirMapEdit.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 2c3a822b..f6140562 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -137,6 +137,7 @@ JSSRC=                                                      
\
        window/TreeSettingsEdit.js                      \
        window/PCIMapEdit.js                            \
        window/USBMapEdit.js                            \
+       window/DirMapEdit.js                            \
        window/GuestImport.js                           \
        ha/Fencing.js                                   \
        ha/GroupEdit.js                                 \
diff --git a/www/manager6/window/DirMapEdit.js 
b/www/manager6/window/DirMapEdit.js
new file mode 100644
index 00000000..cda5824b
--- /dev/null
+++ b/www/manager6/window/DirMapEdit.js
@@ -0,0 +1,222 @@
+Ext.define('PVE.window.DirMapEditWindow', {
+    extend: 'Proxmox.window.Edit',
+
+    mixins: ['Proxmox.Mixin.CBind'],
+
+    cbindData: function(initialConfig) {
+       let me = this;
+       me.isCreate = !me.name;
+       me.method = me.isCreate ? 'POST' : 'PUT';
+       me.hideMapping = !!me.entryOnly;
+       me.hideComment = me.name && !me.entryOnly;
+       me.hideNodeSelector = me.nodename || me.entryOnly;
+       me.hideNode = !me.nodename || !me.hideNodeSelector;
+       return {
+           name: me.name,
+           nodename: me.nodename,
+       };
+    },
+
+    submitUrl: function(_url, data) {
+       let me = this;
+       let name = me.isCreate ? '' : me.name;
+       return `/cluster/mapping/dir/${name}`;
+    },
+
+    title: gettext('Add Dir mapping'),
+
+    onlineHelp: 'resource_mapping',
+
+    method: 'POST',
+
+    controller: {
+       xclass: 'Ext.app.ViewController',
+
+       onGetValues: function(values) {
+           let me = this;
+           let view = me.getView();
+           values.node ??= view.nodename;
+
+           let name = values.name;
+           let description = values.description;
+           let xattr = values.xattr;
+           let acl = values.acl;
+           let deletes = values.delete;
+
+           delete values.description;
+           delete values.name;
+           delete values.xattr;
+           delete values.acl;
+
+           let map = [];
+           if (me.originalMap) {
+               map = PVE.Parser.filterPropertyStringList(me.originalMap, (e) 
=> e.node !== values.node);
+           }
+           if (values.path) {
+               map.push(PVE.Parser.printPropertyString(values));
+           }
+
+           values = { map };
+           if (description) {
+               values.description = description;
+           }
+           if (xattr) {
+               values.xattr = xattr;
+           }
+           if (acl) {
+               values.acl = acl;
+           }
+           if (deletes) {
+               values.delete = deletes;
+           }
+
+           if (view.isCreate) {
+               values.id = name;
+           }
+           return values;
+       },
+
+       onSetValues: function(values) {
+           let me = this;
+           let view = me.getView();
+           me.originalMap = [...values.map];
+           let configuredNodes = [];
+           PVE.Parser.filterPropertyStringList(values.map, (e) => {
+               configuredNodes.push(e.node);
+               if (e.node === view.nodename) {
+                   values = e;
+               }
+               return false;
+           });
+
+           me.lookup('nodeselector').disallowedNodes = configuredNodes;
+
+           return values;
+       },
+
+       init: function(view) {
+           let me = this;
+
+           if (!view.nodename) {
+               //throw "no nodename given";
+           }
+       },
+    },
+
+    items: [
+       {
+           xtype: 'inputpanel',
+           onGetValues: function(values) {
+               return this.up('window').getController().onGetValues(values);
+           },
+
+           onSetValues: function(values) {
+               return this.up('window').getController().onSetValues(values);
+           },
+
+           columnT: [
+               {
+                   xtype: 'displayfield',
+                   reference: 'directory-hint',
+                   columnWidth: 1,
+                   value: 'Make sure the directory exists.',
+                   cbind: {
+                       disabled: '{hideMapping}',
+                       hidden: '{hideMapping}',
+                   },
+                   userCls: 'pmx-hint',
+               },
+           ],
+
+           column1: [
+               {
+                   xtype: 'pmxDisplayEditField',
+                   fieldLabel: gettext('Name'),
+                   cbind: {
+                       editable: '{!name}',
+                       value: '{name}',
+                       submitValue: '{isCreate}',
+                   },
+                   name: 'name',
+                   allowBlank: false,
+               },
+               {
+                   xtype: 'pveNodeSelector',
+                   reference: 'nodeselector',
+                   fieldLabel: gettext('Node'),
+                   name: 'node',
+                   cbind: {
+                       disabled: '{hideNodeSelector}',
+                       hidden: '{hideNodeSelector}',
+                   },
+                   allowBlank: false,
+               },
+           ],
+
+           column2: [
+               {
+                   xtype: 'fieldcontainer',
+                   defaultType: 'radiofield',
+                   layout: 'fit',
+                   cbind: {
+                       disabled: '{hideMapping}',
+                       hidden: '{hideMapping}',
+                   },
+                   items: [
+                       {
+                           xtype: 'textfield',
+                           name: 'path',
+                           reference: 'path',
+                           value: '',
+                           emptyText: gettext('/some/path'),
+                           cbind: {
+                               nodename: '{nodename}',
+                               disabled: '{hideMapping}',
+                           },
+                           allowBlank: false,
+                           fieldLabel: gettext('Path'),
+                       },
+                       {
+                           xtype: 'proxmoxcheckbox',
+                           name: 'submounts',
+                           fieldLabel: gettext('submounts'),
+                       },
+                   ],
+               },
+           ],
+
+           columnB: [
+               {
+                   xtype: 'fieldcontainer',
+                   defaultType: 'radiofield',
+                   layout: 'fit',
+                   cbind: {
+                       disabled: '{hideComment}',
+                       hidden: '{hideComment}',
+                   },
+                   items: [
+                       {
+                           xtype: 'proxmoxtextfield',
+                           fieldLabel: gettext('Comment'),
+                           submitValue: true,
+                           name: 'description',
+                           deleteEmpty: true,
+                       },
+                       {
+                           xtype: 'proxmoxcheckbox',
+                           fieldLabel: gettext('Use dir with xattr by 
default'),
+                           name: 'xattr',
+                           deleteEmpty: true,
+                       },
+                       {
+                           xtype: 'proxmoxcheckbox',
+                           fieldLabel: gettext('Use dir with acl by default'),
+                           name: 'acl',
+                           deleteEmpty: true,
+                       },
+                   ],
+               },
+           ],
+       },
+    ],
+});
-- 
2.39.2



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

Reply via email to