this patch re-works the validation the in the subnit edit panel to
also validate whether the ip address version in a range match each
other.

Signed-off-by: Stefan Sterz <s.st...@proxmox.com>
---
not super proud of this, but couldn't really find another way to
properly validate accross two columns and also have the panel still work
as intended.

 www/manager6/sdn/SubnetEdit.js | 85 ++++++++++++++++++++++++++++++----
 1 file changed, 76 insertions(+), 9 deletions(-)

diff --git a/www/manager6/sdn/SubnetEdit.js b/www/manager6/sdn/SubnetEdit.js
index 8fc3f52b..cba80d8f 100644
--- a/www/manager6/sdn/SubnetEdit.js
+++ b/www/manager6/sdn/SubnetEdit.js
@@ -59,6 +59,49 @@ Ext.define('PVE.sdn.SubnetInputPanel', {
     ],
 });

+Ext.define('PVE.sdn.model.DhcpRange', {
+    extend: 'Ext.data.Model',
+    fields: [
+        { name: 'startAddress' },
+        { name: 'endAddress' },
+       {
+           name: 'rangeErrors',
+           depends: ['startAddress', 'endAddress'],
+           calculate: (data) => {
+               let errors = [];
+               let sV4 = Proxmox.Utils.IP4_match.test(data.startAddress);
+               let sV6 = Proxmox.Utils.IP6_match.test(data.startAddress);
+               let eV4 = Proxmox.Utils.IP4_match.test(data.endAddress);
+               let eV6 = Proxmox.Utils.IP6_match.test(data.endAddress);
+
+               if (!((sV4 && eV4) || (sV6 && eV6))) {
+                   errors.push("IP address versions do not match.");
+               }
+
+               return errors;
+           },
+       },
+       {
+           name: 'rangeErrorsClass',
+           depends: ['rangeErrors'],
+           calculate: (data) => {
+               if (data.rangeErrors.length !== 0) {
+                   return ['x-form-trigger-wrap-default', 
'x-form-trigger-wrap-invalid'];
+               }
+
+               return [];
+           }
+       }
+    ],
+
+    validators: {
+        startAddress: (value, record) =>
+           Ext.form.VTypes.IP64Address(value) || gettext("Not a valid IP 
address."),
+       endAddress: (value, record) =>
+           Ext.form.VTypes.IP64Address(value) || gettext("Not a valid IP 
address."),
+    },
+});
+
 Ext.define('PVE.sdn.SubnetDhcpRangePanel', {
     extend: 'Ext.form.FieldContainer',
     mixins: ['Ext.form.field.Field'],
@@ -86,8 +129,8 @@ Ext.define('PVE.sdn.SubnetDhcpRangePanel', {
                // needs a deep copy otherwise we run in to ExtJS reference
                // shenaningans
                value.push({
-                   'start-address': item.data['start-address'],
-                   'end-address': item.data['end-address'],
+                   'start-address': item.data.startAddress,
+                   'end-address': item.data.endAddress,
                });
            });

@@ -121,8 +164,10 @@ Ext.define('PVE.sdn.SubnetDhcpRangePanel', {
            // needs a deep copy otherwise we run in to ExtJS reference
            // shenaningans
            data.push({
-               'start-address': item['start-address'],
-               'end-address': item['end-address'],
+               startAddress: item['start-address'],
+               endAddress: item['end-address'],
+               rangeErrors: [],
+               rangeErrorsClass: [],
            });
        });

@@ -133,6 +178,18 @@ Ext.define('PVE.sdn.SubnetDhcpRangePanel', {
        let me = this;
         let errors = [];

+       let grid = me.lookup('grid');
+
+       grid.getStore().data.each((row, index) => {
+           if (!row.isValid()) {
+               errors.push(gettext("An entry in the DHCP Range is not a valid 
IP address!"));
+           }
+
+           if (row.data.rangeErrors.length !== 0) {
+               row.data.rangeErrors.forEach((error) => errors.push(error));
+           }
+       });
+
        return errors;
     },

@@ -182,27 +239,37 @@ Ext.define('PVE.sdn.SubnetDhcpRangePanel', {
            reference: 'grid',
            scrollable: true,
            store: {
-               fields: ['start-address', 'end-address'],
+               model: 'PVE.sdn.model.DhcpRange',
+           },
+           itemConfig: {
+               viewModel: true,
            },
+           modelValidation: true,
            columns: [
                {
                    text: gettext('Start Address'),
                    xtype: 'widgetcolumn',
-                   dataIndex: 'start-address',
                    flex: 1,
                    widget: {
                        xtype: 'textfield',
-                       vtype: 'IP64Address',
+                       bind: {
+                           value: '{record.startAddress}',
+                           error: '{record.rangeErrors}',
+                           userCls: '{record.rangeErrorsClass}',
+                       },
                    },
                },
                {
                    text: gettext('End Address'),
                    xtype: 'widgetcolumn',
-                   dataIndex: 'end-address',
                    flex: 1,
                    widget: {
                        xtype: 'textfield',
-                       vtype: 'IP64Address',
+                       bind: {
+                           value: '{record.endAddress}',
+                           error: '{record.rangeErrors}',
+                           userCls: '{record.rangeErrorsClass}',
+                       },
                    },
                },
                {
--
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