From 4568a68d836d7370adfdf623f7e431a4fe5f811f Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Wed, 17 Nov 2021 14:05:20 +0100 Subject: [PATCH 1/7] CsDhcp.py: fix runtests.sh error (#5671) $ cd systemvm/test $ bash -x runtests.sh ...... ../debian/opt/cloud/bin/cs/CsDhcp.py:114:25: E266 too many leading '#' for block comment + '[' 1 -gt 0 ']' + echo 'pycodestyle failed, please check your code' --- systemvm/debian/opt/cloud/bin/cs/CsDhcp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/systemvm/debian/opt/cloud/bin/cs/CsDhcp.py b/systemvm/debian/opt/cloud/bin/cs/CsDhcp.py index 964cf7a860d..bfa17404697 100755 --- a/systemvm/debian/opt/cloud/bin/cs/CsDhcp.py +++ b/systemvm/debian/opt/cloud/bin/cs/CsDhcp.py @@ -111,7 +111,7 @@ class CsDhcp(CsDataBag): if self.config.is_dhcp() and not self.config.use_extdns(): guest_ip = self.config.address().get_guest_ip() if guest_ip and guest_ip in dns_list and ip not in dns_list: - ## Replace the default guest IP in VR with the ip in additional IP ranges, if shared network has multiple IP ranges. + # Replace the default guest IP in VR with the ip in additional IP ranges, if shared network has multiple IP ranges. dns_list.remove(guest_ip) dns_list.insert(0, ip) line = "dhcp-option=tag:interface-%s-%s,6,%s" % (device, idx, ','.join(dns_list)) From 0684aff5295e78a4c442e3888191c64bda0c8dfe Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Date: Thu, 18 Nov 2021 15:12:24 +0700 Subject: [PATCH 2/7] ui: fix incorrect auto-select (#5693) --- ui/src/views/compute/InstanceTab.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/views/compute/InstanceTab.vue b/ui/src/views/compute/InstanceTab.vue index 437410a092d..e9e599a2737 100644 --- a/ui/src/views/compute/InstanceTab.vue +++ b/ui/src/views/compute/InstanceTab.vue @@ -159,7 +159,7 @@ - - - - - {{ provider }} - - - +
+ + + + + {{ provider }} + + + +
diff --git a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue index 69e61bb271d..eb18181aa88 100644 --- a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue +++ b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue @@ -1340,6 +1340,7 @@ export default { url = this.rbdURL(rbdmonitor, rbdpool, rbdid, rbdsecret) } else if (protocol === 'Linstor') { url = this.linstorURL(server) + params.provider = 'Linstor' params['details[0].resourceGroup'] = this.prefillContent.primaryStorageLinstorResourceGroup.value } else if (protocol === 'vmfs' || protocol === 'datastorecluster') { let path = this.prefillContent.primaryStorageVmfsDatacenter.value From c95f8e263a2ddd9a5b63f6e1cba14a5dbbba86d6 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 18 Nov 2021 09:15:37 +0100 Subject: [PATCH 5/7] server: set network rate for additional public IPs (#5670) This PR fixes #5669 --- api/src/main/java/com/cloud/vm/NicProfile.java | 2 +- .../cloudstack/engine/orchestration/NetworkOrchestrator.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/com/cloud/vm/NicProfile.java b/api/src/main/java/com/cloud/vm/NicProfile.java index 7ac5342ee16..ebbe6d88bfe 100644 --- a/api/src/main/java/com/cloud/vm/NicProfile.java +++ b/api/src/main/java/com/cloud/vm/NicProfile.java @@ -147,7 +147,7 @@ public class NicProfile implements InternalIdentity, Serializable { return networkId; } - public void setNetworId(long networkId){ + public void setNetworkId(long networkId){ this.networkId = networkId; } diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index f6e80f3a38b..136c2a7d766 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -2055,7 +2055,6 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra //Create nic profile for migration s_logger.debug("Creating nic profile for migration. BroadcastUri: "+broadcastUri.toString()+" NetworkId: "+ntwkId+" Vm: "+vm.getId()); final NetworkVO network = _networksDao.findById(ntwkId); - _networkModel.getNetworkRate(network.getId(), vm.getId()); final NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, network.getGuruName()); final NicProfile profile = new NicProfile(); profile.setDeviceId(255); //dummyId @@ -2069,7 +2068,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra profile.setIsolationUri(Networks.IsolationType.Vlan.toUri(publicIp.getVlanTag())); profile.setSecurityGroupEnabled(_networkModel.isSecurityGroupSupportedInNetwork(network)); profile.setName(_networkModel.getNetworkTag(vm.getHypervisorType(), network)); - profile.setNetworId(network.getId()); + profile.setNetworkRate(_networkModel.getNetworkRate(network.getId(), vm.getId())); + profile.setNetworkId(network.getId()); guru.updateNicProfile(profile, network); vm.addNic(profile); From dd458feeb891a18aa9fc8509743f7ad09dbf0e58 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 18 Nov 2021 09:23:55 +0100 Subject: [PATCH 6/7] IPv6: fix deploy vm issue in ipv6-only networks without VR (#5648) * IPv6: fix deploy vm issue in ipv6-only networks * Update #5648: add method setNicPropertiesFromNetwork --- .../com/cloud/network/Ipv6AddressManager.java | 2 +- .../com/cloud/network/Ipv6AddressManagerImpl.java | 15 ++++++++++++++- .../com/cloud/network/Ipv6AddressManagerTest.java | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/com/cloud/network/Ipv6AddressManager.java b/server/src/main/java/com/cloud/network/Ipv6AddressManager.java index 7dcba11a00a..60770415c66 100644 --- a/server/src/main/java/com/cloud/network/Ipv6AddressManager.java +++ b/server/src/main/java/com/cloud/network/Ipv6AddressManager.java @@ -31,6 +31,6 @@ public interface Ipv6AddressManager extends Manager { public String acquireGuestIpv6Address(Network network, String requestedIpv6) throws InsufficientAddressCapacityException; - public void setNicIp6Address(final NicProfile nic, final DataCenter dc, final Network network); + public void setNicIp6Address(final NicProfile nic, final DataCenter dc, final Network network) throws InsufficientAddressCapacityException; } diff --git a/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java b/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java index adfc3d29dce..c1f3f39dced 100644 --- a/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java @@ -195,13 +195,15 @@ public class Ipv6AddressManagerImpl extends ManagerBase implements Ipv6AddressMa * address information. */ @Override - public void setNicIp6Address(final NicProfile nic, final DataCenter dc, final Network network) { + public void setNicIp6Address(final NicProfile nic, final DataCenter dc, final Network network) throws InsufficientAddressCapacityException { if (network.getIp6Gateway() != null) { if (nic.getIPv6Address() == null) { s_logger.debug("Found IPv6 CIDR " + network.getIp6Cidr() + " for Network " + network); nic.setIPv6Cidr(network.getIp6Cidr()); nic.setIPv6Gateway(network.getIp6Gateway()); + setNicPropertiesFromNetwork(nic, network); + IPv6Address ipv6addr = NetUtils.EUI64Address(network.getIp6Cidr(), nic.getMacAddress()); s_logger.info("Calculated IPv6 address " + ipv6addr + " using EUI-64 for NIC " + nic.getUuid()); nic.setIPv6Address(ipv6addr.toString()); @@ -217,4 +219,15 @@ public class Ipv6AddressManagerImpl extends ManagerBase implements Ipv6AddressMa } } + private void setNicPropertiesFromNetwork(NicProfile nic, Network network) throws InsufficientAddressCapacityException { + if (nic.getBroadcastType() == null) { + nic.setBroadcastType(network.getBroadcastDomainType()); + } + if (nic.getBroadCastUri() == null) { + nic.setBroadcastUri(network.getBroadcastUri()); + } + if (nic.getMacAddress() == null) { + nic.setMacAddress(_networkModel.getNextAvailableMacAddressInNetwork(network.getId())); + } + } } diff --git a/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java b/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java index 3f082d53516..bd1484d588a 100644 --- a/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java +++ b/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java @@ -229,7 +229,7 @@ public class Ipv6AddressManagerTest { } @Test - public void setNICIPv6AddressTest() { + public void setNICIPv6AddressTest() throws InsufficientAddressCapacityException { NicProfile nic = new NicProfile(); Network network = mock(Network.class); DataCenter dc = mock(DataCenter.class); From babf94f801f08e3e7ec1a826ade4884aab8a8a0b Mon Sep 17 00:00:00 2001 From: Apurv Gupta <53378650+apurv-1@users.noreply.github.com> Date: Thu, 18 Nov 2021 14:01:22 +0530 Subject: [PATCH 7/7] UI: Autoscroll to Error Field (#5200) Fixes #4798 --- ui/src/components/view/ResourceLimitTab.vue | 2 +- ui/src/components/view/SearchView.vue | 2 +- ui/src/views/AutogenView.vue | 6 +++--- ui/src/views/auth/Login.vue | 6 +++--- ui/src/views/compute/AttachIso.vue | 2 +- ui/src/views/compute/CreateKubernetesCluster.vue | 7 ++++++- ui/src/views/compute/CreateSSHKeyPair.vue | 2 +- ui/src/views/compute/CreateSnapshotWizard.vue | 2 +- ui/src/views/compute/DeployVM.vue | 7 ++++++- ui/src/views/compute/DestroyVM.vue | 2 +- ui/src/views/compute/EditVM.vue | 2 +- ui/src/views/compute/MigrateVMStorage.vue | 2 +- ui/src/views/compute/ScaleKubernetesCluster.vue | 2 +- ui/src/views/compute/StartVirtualMachine.vue | 2 +- ui/src/views/compute/UpgradeKubernetesCluster.vue | 2 +- ui/src/views/compute/backup/FormSchedule.vue | 2 +- ui/src/views/iam/AddAccount.vue | 7 ++++++- ui/src/views/iam/AddLdapAccount.vue | 2 +- ui/src/views/iam/AddUser.vue | 2 +- ui/src/views/iam/ChangeUserPassword.vue | 2 +- ui/src/views/iam/ConfigureSamlSsoAuth.vue | 2 +- ui/src/views/iam/CreateRole.vue | 2 +- ui/src/views/iam/DomainActionForm.vue | 2 +- ui/src/views/iam/EditUser.vue | 2 +- ui/src/views/iam/ImportRole.vue | 2 +- ui/src/views/image/AddKubernetesSupportedVersion.vue | 2 +- ui/src/views/image/IsoZones.vue | 2 +- ui/src/views/image/RegisterOrUploadIso.vue | 7 ++++++- ui/src/views/image/RegisterOrUploadTemplate.vue | 2 +- ui/src/views/image/TemplateZones.vue | 2 +- ui/src/views/image/UpdateKubernetesSupportedVersion.vue | 2 +- ui/src/views/infra/AddPrimaryStorage.vue | 2 +- ui/src/views/infra/AddSecondaryStorage.vue | 2 +- ui/src/views/infra/InfraSummary.vue | 2 +- ui/src/views/infra/MigrateData.vue | 2 +- ui/src/views/infra/PodAdd.vue | 2 +- ui/src/views/infra/network/DedicatedVLANTab.vue | 2 +- ui/src/views/infra/network/EditTrafficLabel.vue | 2 +- ui/src/views/infra/network/IpRangesTabManagement.vue | 2 +- ui/src/views/infra/network/IpRangesTabPublic.vue | 2 +- ui/src/views/infra/network/IpRangesTabStorage.vue | 2 +- ui/src/views/infra/network/ServiceProvidersTab.vue | 2 +- ui/src/views/infra/network/providers/AddF5LoadBalancer.vue | 2 +- .../infra/network/providers/AddNetscalerLoadBalancer.vue | 2 +- .../views/infra/network/providers/AddNiciraNvpDevice.vue | 2 +- .../views/infra/network/providers/AddPaloAltoFirewall.vue | 2 +- ui/src/views/infra/network/providers/AddSrxFirewall.vue | 2 +- ui/src/views/infra/routers/RouterHealthCheck.vue | 2 +- ui/src/views/infra/zone/AdvancedGuestTrafficForm.vue | 2 +- ui/src/views/infra/zone/IpAddressRangeForm.vue | 2 +- ui/src/views/infra/zone/StaticInputsForm.vue | 2 +- .../infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue | 2 +- ui/src/views/infra/zone/ZoneWizardZoneDetailsStep.vue | 2 +- ui/src/views/infra/zone/ZoneWizardZoneTypeStep.vue | 2 +- ui/src/views/network/AclListRulesTab.vue | 6 +++--- ui/src/views/network/CreateIsolatedNetworkForm.vue | 7 ++++++- ui/src/views/network/CreateL2NetworkForm.vue | 2 +- ui/src/views/network/CreateSharedNetworkForm.vue | 7 ++++++- ui/src/views/network/CreateVlanIpRange.vue | 2 +- ui/src/views/network/CreateVpc.vue | 2 +- ui/src/views/network/CreateVpnCustomerGateway.vue | 7 ++++++- ui/src/views/network/FirewallRules.vue | 2 +- ui/src/views/network/IngressEgressRuleConfigure.vue | 2 +- ui/src/views/network/LoadBalancing.vue | 4 ++-- ui/src/views/network/PortForwarding.vue | 2 +- ui/src/views/network/StaticRoutesTab.vue | 2 +- ui/src/views/network/VpcTab.vue | 6 +++--- ui/src/views/network/VpcTiersTab.vue | 4 ++-- ui/src/views/offering/AddComputeOffering.vue | 2 +- ui/src/views/offering/AddDiskOffering.vue | 7 ++++++- ui/src/views/offering/AddNetworkOffering.vue | 7 ++++++- ui/src/views/offering/AddVpcOffering.vue | 2 +- ui/src/views/offering/ImportBackupOffering.vue | 2 +- ui/src/views/offering/UpdateOfferingAccess.vue | 2 +- ui/src/views/plugins/quota/EditTariffValueWizard.vue | 2 +- ui/src/views/project/AddAccountOrUserToProject.vue | 4 ++-- ui/src/views/project/InvitationTokenTemplate.vue | 2 +- ui/src/views/project/iam/ProjectRoleTab.vue | 4 ++-- ui/src/views/storage/AttachVolume.vue | 2 +- ui/src/views/storage/CreateSnapshotFromVMSnapshot.vue | 2 +- ui/src/views/storage/CreateVolume.vue | 2 +- ui/src/views/storage/FormSchedule.vue | 2 +- ui/src/views/storage/ResizeVolume.vue | 2 +- ui/src/views/storage/RestoreAttachBackupVolume.vue | 2 +- ui/src/views/storage/TakeSnapshot.vue | 2 +- ui/src/views/storage/UploadLocalVolume.vue | 2 +- ui/src/views/tools/ImportUnmanagedInstance.vue | 2 +- 87 files changed, 144 insertions(+), 99 deletions(-) diff --git a/ui/src/components/view/ResourceLimitTab.vue b/ui/src/components/view/ResourceLimitTab.vue index fefe93770f7..93cce68fd7b 100644 --- a/ui/src/components/view/ResourceLimitTab.vue +++ b/ui/src/components/view/ResourceLimitTab.vue @@ -119,7 +119,7 @@ export default { if (this.formLoading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/components/view/SearchView.vue b/ui/src/components/view/SearchView.vue index 9d5271bafd9..6876c2009be 100644 --- a/ui/src/components/view/SearchView.vue +++ b/ui/src/components/view/SearchView.vue @@ -512,7 +512,7 @@ export default { handleSubmit (e) { e.preventDefault() this.paramsFilter = {} - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/AutogenView.vue b/ui/src/views/AutogenView.vue index 24eedf9f49b..4c128a78090 100644 --- a/ui/src/views/AutogenView.vue +++ b/ui/src/views/AutogenView.vue @@ -1201,7 +1201,7 @@ export default { this.modalInfo.title = this.currentAction.label this.modalInfo.docHelp = this.currentAction.docHelp } - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (!err) { this.actionLoading = true const itemsNameMap = {} @@ -1295,7 +1295,7 @@ export default { }, execSubmit (e) { e.preventDefault() - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } @@ -1528,7 +1528,7 @@ export default { if (!confirmPasswordVal || confirmPasswordVal.length === 0) { callback() } else if (value && this.confirmDirty) { - form.validateFields(['confirmpassword'], { force: true }) + form.validateFieldsAndScroll(['confirmpassword'], { force: true }) callback() } else { callback() diff --git a/ui/src/views/auth/Login.vue b/ui/src/views/auth/Login.vue index c43f434bc45..95630d0253b 100644 --- a/ui/src/views/auth/Login.vue +++ b/ui/src/views/auth/Login.vue @@ -229,7 +229,7 @@ export default { handleSubmit (e) { e.preventDefault() const { - form: { validateFields }, + form: { validateFieldsAndScroll }, state, customActiveKey, Login @@ -238,9 +238,9 @@ export default { state.loginBtn = true - const validateFieldsKey = customActiveKey === 'cs' ? ['username', 'password', 'domain'] : ['idp'] + const validateFieldsAndScrollKey = customActiveKey === 'cs' ? ['username', 'password', 'domain'] : ['idp'] - validateFields(validateFieldsKey, { force: true }, (err, values) => { + validateFieldsAndScroll(validateFieldsAndScrollKey, { force: true }, (err, values) => { if (!err) { if (this.$config.multipleServer) { this.axios.defaults.baseURL = (this.server.apiHost || '') + this.server.apiBase diff --git a/ui/src/views/compute/AttachIso.vue b/ui/src/views/compute/AttachIso.vue index b4c52e22caf..3410e494b2b 100644 --- a/ui/src/views/compute/AttachIso.vue +++ b/ui/src/views/compute/AttachIso.vue @@ -117,7 +117,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/compute/CreateKubernetesCluster.vue b/ui/src/views/compute/CreateKubernetesCluster.vue index 9bd9516f6c5..6b6b81f6791 100644 --- a/ui/src/views/compute/CreateKubernetesCluster.vue +++ b/ui/src/views/compute/CreateKubernetesCluster.vue @@ -432,7 +432,12 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + const options = { + scroll: { + offsetTop: 10 + } + } + this.form.validateFieldsAndScroll(options, (err, values) => { if (err) { return } diff --git a/ui/src/views/compute/CreateSSHKeyPair.vue b/ui/src/views/compute/CreateSSHKeyPair.vue index 2aa67314676..15a6f9797e8 100644 --- a/ui/src/views/compute/CreateSSHKeyPair.vue +++ b/ui/src/views/compute/CreateSSHKeyPair.vue @@ -146,7 +146,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/compute/CreateSnapshotWizard.vue b/ui/src/views/compute/CreateSnapshotWizard.vue index af2765f44b0..ed4fbc9e975 100644 --- a/ui/src/views/compute/CreateSnapshotWizard.vue +++ b/ui/src/views/compute/CreateSnapshotWizard.vue @@ -112,7 +112,7 @@ export default { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) return const params = {} diff --git a/ui/src/views/compute/DeployVM.vue b/ui/src/views/compute/DeployVM.vue index 00ed65f6c20..bb480b50dca 100644 --- a/ui/src/views/compute/DeployVM.vue +++ b/ui/src/views/compute/DeployVM.vue @@ -1475,9 +1475,14 @@ export default { }, handleSubmit (e) { console.log('wizard submit') + const options = { + scroll: { + offsetTop: 90 + } + } e.preventDefault() if (this.loading.deploy) return - this.form.validateFields(async (err, values) => { + this.form.validateFieldsAndScroll(options, async (err, values) => { if (err) { if (err.licensesaccepted) { this.$notification.error({ diff --git a/ui/src/views/compute/DestroyVM.vue b/ui/src/views/compute/DestroyVM.vue index 8cd8d8dfc0e..166e4ca56a5 100644 --- a/ui/src/views/compute/DestroyVM.vue +++ b/ui/src/views/compute/DestroyVM.vue @@ -104,7 +104,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/compute/EditVM.vue b/ui/src/views/compute/EditVM.vue index 19afdc36c61..656c13a0589 100644 --- a/ui/src/views/compute/EditVM.vue +++ b/ui/src/views/compute/EditVM.vue @@ -200,7 +200,7 @@ export default { }, handleSubmit (e) { e.preventDefault() - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) return const params = {} diff --git a/ui/src/views/compute/MigrateVMStorage.vue b/ui/src/views/compute/MigrateVMStorage.vue index 0a22f1023cd..c994b56d629 100644 --- a/ui/src/views/compute/MigrateVMStorage.vue +++ b/ui/src/views/compute/MigrateVMStorage.vue @@ -122,7 +122,7 @@ export default { }, handleSubmit (e) { e.preventDefault() - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/compute/ScaleKubernetesCluster.vue b/ui/src/views/compute/ScaleKubernetesCluster.vue index e6139c097aa..d173c30785e 100644 --- a/ui/src/views/compute/ScaleKubernetesCluster.vue +++ b/ui/src/views/compute/ScaleKubernetesCluster.vue @@ -214,7 +214,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/compute/StartVirtualMachine.vue b/ui/src/views/compute/StartVirtualMachine.vue index 8c905f6df68..db8412c8e61 100644 --- a/ui/src/views/compute/StartVirtualMachine.vue +++ b/ui/src/views/compute/StartVirtualMachine.vue @@ -206,7 +206,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/compute/UpgradeKubernetesCluster.vue b/ui/src/views/compute/UpgradeKubernetesCluster.vue index 57e9fac9a6a..7e9dbb94c26 100644 --- a/ui/src/views/compute/UpgradeKubernetesCluster.vue +++ b/ui/src/views/compute/UpgradeKubernetesCluster.vue @@ -140,7 +140,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/compute/backup/FormSchedule.vue b/ui/src/views/compute/backup/FormSchedule.vue index d816f2b8f48..1220315097a 100644 --- a/ui/src/views/compute/backup/FormSchedule.vue +++ b/ui/src/views/compute/backup/FormSchedule.vue @@ -260,7 +260,7 @@ export default { }, handleSubmit (e) { if (this.actionLoading) return - this.form.validateFields((error, values) => { + this.form.validateFieldsAndScroll((error, values) => { if (error) { return } diff --git a/ui/src/views/iam/AddAccount.vue b/ui/src/views/iam/AddAccount.vue index 89ebcb68a85..940addeaafb 100644 --- a/ui/src/views/iam/AddAccount.vue +++ b/ui/src/views/iam/AddAccount.vue @@ -310,7 +310,12 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + const options = { + scroll: { + offsetTop: 10 + } + } + this.form.validateFieldsAndScroll(options, (err, values) => { if (err) { return } diff --git a/ui/src/views/iam/AddLdapAccount.vue b/ui/src/views/iam/AddLdapAccount.vue index 2290c63a271..982cebdd676 100644 --- a/ui/src/views/iam/AddLdapAccount.vue +++ b/ui/src/views/iam/AddLdapAccount.vue @@ -364,7 +364,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/iam/AddUser.vue b/ui/src/views/iam/AddUser.vue index ec0e1b87ef2..f57585c60f7 100644 --- a/ui/src/views/iam/AddUser.vue +++ b/ui/src/views/iam/AddUser.vue @@ -287,7 +287,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/iam/ChangeUserPassword.vue b/ui/src/views/iam/ChangeUserPassword.vue index c9f21d216d9..ae7453583db 100644 --- a/ui/src/views/iam/ChangeUserPassword.vue +++ b/ui/src/views/iam/ChangeUserPassword.vue @@ -115,7 +115,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/iam/ConfigureSamlSsoAuth.vue b/ui/src/views/iam/ConfigureSamlSsoAuth.vue index 546cf9a0ecb..63ba49afedf 100644 --- a/ui/src/views/iam/ConfigureSamlSsoAuth.vue +++ b/ui/src/views/iam/ConfigureSamlSsoAuth.vue @@ -98,7 +98,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/iam/CreateRole.vue b/ui/src/views/iam/CreateRole.vue index 34a8897ee88..9b80397c138 100644 --- a/ui/src/views/iam/CreateRole.vue +++ b/ui/src/views/iam/CreateRole.vue @@ -144,7 +144,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/iam/DomainActionForm.vue b/ui/src/views/iam/DomainActionForm.vue index b3803d7ff8e..b9796867106 100644 --- a/ui/src/views/iam/DomainActionForm.vue +++ b/ui/src/views/iam/DomainActionForm.vue @@ -185,7 +185,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.action.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/iam/EditUser.vue b/ui/src/views/iam/EditUser.vue index 5a7f26f910e..7009e01b364 100644 --- a/ui/src/views/iam/EditUser.vue +++ b/ui/src/views/iam/EditUser.vue @@ -160,7 +160,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/iam/ImportRole.vue b/ui/src/views/iam/ImportRole.vue index 26a1ca65cc1..b285ace6564 100644 --- a/ui/src/views/iam/ImportRole.vue +++ b/ui/src/views/iam/ImportRole.vue @@ -145,7 +145,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/image/AddKubernetesSupportedVersion.vue b/ui/src/views/image/AddKubernetesSupportedVersion.vue index d699d061016..4364749c3ff 100644 --- a/ui/src/views/image/AddKubernetesSupportedVersion.vue +++ b/ui/src/views/image/AddKubernetesSupportedVersion.vue @@ -192,7 +192,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/image/IsoZones.vue b/ui/src/views/image/IsoZones.vue index bf98cc33b7a..f838262a21b 100644 --- a/ui/src/views/image/IsoZones.vue +++ b/ui/src/views/image/IsoZones.vue @@ -430,7 +430,7 @@ export default { handleCopyIsoSubmit (e) { e.preventDefault() if (this.copyLoading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/image/RegisterOrUploadIso.vue b/ui/src/views/image/RegisterOrUploadIso.vue index 191ee6b0cd5..e4ab9703e7f 100644 --- a/ui/src/views/image/RegisterOrUploadIso.vue +++ b/ui/src/views/image/RegisterOrUploadIso.vue @@ -307,7 +307,12 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + const options = { + scroll: { + offsetTop: 10 + } + } + this.form.validateFieldsAndScroll(options, (err, values) => { if (err) { return } diff --git a/ui/src/views/image/RegisterOrUploadTemplate.vue b/ui/src/views/image/RegisterOrUploadTemplate.vue index a9415add755..c4116019d4f 100644 --- a/ui/src/views/image/RegisterOrUploadTemplate.vue +++ b/ui/src/views/image/RegisterOrUploadTemplate.vue @@ -829,7 +829,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err || this.zoneError !== '') { return } diff --git a/ui/src/views/image/TemplateZones.vue b/ui/src/views/image/TemplateZones.vue index 8ee7cf4f2b4..ca83293a5d8 100644 --- a/ui/src/views/image/TemplateZones.vue +++ b/ui/src/views/image/TemplateZones.vue @@ -529,7 +529,7 @@ export default { handleCopyTemplateSubmit (e) { e.preventDefault() if (this.copyLoading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/image/UpdateKubernetesSupportedVersion.vue b/ui/src/views/image/UpdateKubernetesSupportedVersion.vue index 80bb5c9c199..c3cf6edfc35 100644 --- a/ui/src/views/image/UpdateKubernetesSupportedVersion.vue +++ b/ui/src/views/image/UpdateKubernetesSupportedVersion.vue @@ -113,7 +113,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/infra/AddPrimaryStorage.vue b/ui/src/views/infra/AddPrimaryStorage.vue index 043e3d0f4a4..dbab19ea9e2 100644 --- a/ui/src/views/infra/AddPrimaryStorage.vue +++ b/ui/src/views/infra/AddPrimaryStorage.vue @@ -590,7 +590,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/infra/AddSecondaryStorage.vue b/ui/src/views/infra/AddSecondaryStorage.vue index e229bb78f3d..0d34e6f4575 100644 --- a/ui/src/views/infra/AddSecondaryStorage.vue +++ b/ui/src/views/infra/AddSecondaryStorage.vue @@ -245,7 +245,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/infra/InfraSummary.vue b/ui/src/views/infra/InfraSummary.vue index dbbb4b40498..5656dc58a44 100644 --- a/ui/src/views/infra/InfraSummary.vue +++ b/ui/src/views/infra/InfraSummary.vue @@ -265,7 +265,7 @@ export default { if (this.sslFormSubmitting) return this.sslFormSubmitting = true - this.form.validateFields(errors => { + this.form.validateFieldsAndScroll(errors => { if (errors) { this.sslFormSubmitting = false return diff --git a/ui/src/views/infra/MigrateData.vue b/ui/src/views/infra/MigrateData.vue index a1cb693bb32..6ebe6531969 100644 --- a/ui/src/views/infra/MigrateData.vue +++ b/ui/src/views/infra/MigrateData.vue @@ -127,7 +127,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/infra/PodAdd.vue b/ui/src/views/infra/PodAdd.vue index b1fe3152284..1fffa560f08 100644 --- a/ui/src/views/infra/PodAdd.vue +++ b/ui/src/views/infra/PodAdd.vue @@ -187,7 +187,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) return this.loading = true diff --git a/ui/src/views/infra/network/DedicatedVLANTab.vue b/ui/src/views/infra/network/DedicatedVLANTab.vue index 74fd444956d..a2b5e55c2ed 100644 --- a/ui/src/views/infra/network/DedicatedVLANTab.vue +++ b/ui/src/views/infra/network/DedicatedVLANTab.vue @@ -371,7 +371,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.formLoading) return - this.form.validateFields(errors => { + this.form.validateFieldsAndScroll(errors => { if (errors) return this.formLoading = true diff --git a/ui/src/views/infra/network/EditTrafficLabel.vue b/ui/src/views/infra/network/EditTrafficLabel.vue index 706131bc682..a56165ed19e 100644 --- a/ui/src/views/infra/network/EditTrafficLabel.vue +++ b/ui/src/views/infra/network/EditTrafficLabel.vue @@ -150,7 +150,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/infra/network/IpRangesTabManagement.vue b/ui/src/views/infra/network/IpRangesTabManagement.vue index 22ef9ff4cbd..f8a75d8b4c4 100644 --- a/ui/src/views/infra/network/IpRangesTabManagement.vue +++ b/ui/src/views/infra/network/IpRangesTabManagement.vue @@ -298,7 +298,7 @@ export default { }, handleAddIpRange (e) { if (this.componentLoading) return - this.form.validateFields((error, values) => { + this.form.validateFieldsAndScroll((error, values) => { if (error) return this.componentLoading = true diff --git a/ui/src/views/infra/network/IpRangesTabPublic.vue b/ui/src/views/infra/network/IpRangesTabPublic.vue index 1e4e03c8804..ff1976f71e6 100644 --- a/ui/src/views/infra/network/IpRangesTabPublic.vue +++ b/ui/src/views/infra/network/IpRangesTabPublic.vue @@ -516,7 +516,7 @@ export default { }, handleAddIpRange (e) { if (this.componentLoading) return - this.form.validateFields((error, values) => { + this.form.validateFieldsAndScroll((error, values) => { if (error) return this.componentLoading = true diff --git a/ui/src/views/infra/network/IpRangesTabStorage.vue b/ui/src/views/infra/network/IpRangesTabStorage.vue index 7b6735f7fa4..7250c51e005 100644 --- a/ui/src/views/infra/network/IpRangesTabStorage.vue +++ b/ui/src/views/infra/network/IpRangesTabStorage.vue @@ -279,7 +279,7 @@ export default { }, handleAddIpRange (e) { if (this.componentLoading) return - this.form.validateFields((error, values) => { + this.form.validateFieldsAndScroll((error, values) => { if (error) return this.componentLoading = true diff --git a/ui/src/views/infra/network/ServiceProvidersTab.vue b/ui/src/views/infra/network/ServiceProvidersTab.vue index 5c7f0d682f7..101762197c1 100644 --- a/ui/src/views/infra/network/ServiceProvidersTab.vue +++ b/ui/src/views/infra/network/ServiceProvidersTab.vue @@ -1170,7 +1170,7 @@ export default { await this.executeConfirmAction() return } - await this.form.validateFields(async (err, values) => { + await this.form.validateFieldsAndScroll(async (err, values) => { if (err) { return } diff --git a/ui/src/views/infra/network/providers/AddF5LoadBalancer.vue b/ui/src/views/infra/network/providers/AddF5LoadBalancer.vue index 0332ad2b15b..227520c8880 100644 --- a/ui/src/views/infra/network/providers/AddF5LoadBalancer.vue +++ b/ui/src/views/infra/network/providers/AddF5LoadBalancer.vue @@ -166,7 +166,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields(async (err, values) => { + this.form.validateFieldsAndScroll(async (err, values) => { if (err) { return } diff --git a/ui/src/views/infra/network/providers/AddNetscalerLoadBalancer.vue b/ui/src/views/infra/network/providers/AddNetscalerLoadBalancer.vue index aa0699acbe8..7e12f545d46 100644 --- a/ui/src/views/infra/network/providers/AddNetscalerLoadBalancer.vue +++ b/ui/src/views/infra/network/providers/AddNetscalerLoadBalancer.vue @@ -198,7 +198,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields(async (err, values) => { + this.form.validateFieldsAndScroll(async (err, values) => { if (err) { return } diff --git a/ui/src/views/infra/network/providers/AddNiciraNvpDevice.vue b/ui/src/views/infra/network/providers/AddNiciraNvpDevice.vue index 01c21fb3fd7..60a33b52f3a 100644 --- a/ui/src/views/infra/network/providers/AddNiciraNvpDevice.vue +++ b/ui/src/views/infra/network/providers/AddNiciraNvpDevice.vue @@ -130,7 +130,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields(async (err, values) => { + this.form.validateFieldsAndScroll(async (err, values) => { if (err) { return } diff --git a/ui/src/views/infra/network/providers/AddPaloAltoFirewall.vue b/ui/src/views/infra/network/providers/AddPaloAltoFirewall.vue index fe6a11378d3..aff9d57f3ed 100644 --- a/ui/src/views/infra/network/providers/AddPaloAltoFirewall.vue +++ b/ui/src/views/infra/network/providers/AddPaloAltoFirewall.vue @@ -213,7 +213,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields(async (err, values) => { + this.form.validateFieldsAndScroll(async (err, values) => { if (err) { return } diff --git a/ui/src/views/infra/network/providers/AddSrxFirewall.vue b/ui/src/views/infra/network/providers/AddSrxFirewall.vue index e50e14f0909..8a61d5fd5d6 100644 --- a/ui/src/views/infra/network/providers/AddSrxFirewall.vue +++ b/ui/src/views/infra/network/providers/AddSrxFirewall.vue @@ -191,7 +191,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields(async (err, values) => { + this.form.validateFieldsAndScroll(async (err, values) => { if (err) { return } diff --git a/ui/src/views/infra/routers/RouterHealthCheck.vue b/ui/src/views/infra/routers/RouterHealthCheck.vue index 2ddccb79fe1..e01d26e0cab 100644 --- a/ui/src/views/infra/routers/RouterHealthCheck.vue +++ b/ui/src/views/infra/routers/RouterHealthCheck.vue @@ -151,7 +151,7 @@ export default { handleGetHealthChecksSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/infra/zone/AdvancedGuestTrafficForm.vue b/ui/src/views/infra/zone/AdvancedGuestTrafficForm.vue index 916c5025861..86fa78d0e65 100644 --- a/ui/src/views/infra/zone/AdvancedGuestTrafficForm.vue +++ b/ui/src/views/infra/zone/AdvancedGuestTrafficForm.vue @@ -135,7 +135,7 @@ export default { }, handleSubmit (e) { e.preventDefault() - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { this.validStatus = '' this.validMessage = '' if (err) { diff --git a/ui/src/views/infra/zone/IpAddressRangeForm.vue b/ui/src/views/infra/zone/IpAddressRangeForm.vue index 21e27ab3f28..3480a1b334d 100644 --- a/ui/src/views/infra/zone/IpAddressRangeForm.vue +++ b/ui/src/views/infra/zone/IpAddressRangeForm.vue @@ -229,7 +229,7 @@ export default { methods: { handleAddRange (e) { e.preventDefault() - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (!err) { this.ipRanges.push({ key: this.ipRanges.length.toString(), diff --git a/ui/src/views/infra/zone/StaticInputsForm.vue b/ui/src/views/infra/zone/StaticInputsForm.vue index 565557f3db8..97590a320ab 100644 --- a/ui/src/views/infra/zone/StaticInputsForm.vue +++ b/ui/src/views/infra/zone/StaticInputsForm.vue @@ -187,7 +187,7 @@ export default { }, handleSubmit (e) { e.preventDefault() - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue b/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue index 52f891a1515..6c8bdf06fd0 100644 --- a/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue +++ b/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue @@ -489,7 +489,7 @@ export default { this.emitPhysicalNetworks() }, updateTrafficLabel (trafficInEdit) { - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (!err) { this.showEditTraffic = false if (this.hypervisor === 'VMware') { diff --git a/ui/src/views/infra/zone/ZoneWizardZoneDetailsStep.vue b/ui/src/views/infra/zone/ZoneWizardZoneDetailsStep.vue index d81af54e1f3..641f6356f7a 100644 --- a/ui/src/views/infra/zone/ZoneWizardZoneDetailsStep.vue +++ b/ui/src/views/infra/zone/ZoneWizardZoneDetailsStep.vue @@ -548,7 +548,7 @@ export default { }, handleSubmit (e) { e.preventDefault() - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/infra/zone/ZoneWizardZoneTypeStep.vue b/ui/src/views/infra/zone/ZoneWizardZoneTypeStep.vue index 9c20651b6d6..3df2a7045e7 100644 --- a/ui/src/views/infra/zone/ZoneWizardZoneTypeStep.vue +++ b/ui/src/views/infra/zone/ZoneWizardZoneTypeStep.vue @@ -127,7 +127,7 @@ export default { methods: { handleSubmit (e) { e.preventDefault() - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (!err) { this.$emit('nextPressed') } diff --git a/ui/src/views/network/AclListRulesTab.vue b/ui/src/views/network/AclListRulesTab.vue index dbe11caee15..673d33862a7 100644 --- a/ui/src/views/network/AclListRulesTab.vue +++ b/ui/src/views/network/AclListRulesTab.vue @@ -385,7 +385,7 @@ export default { this.tagsLoading = true e.preventDefault() - this.newTagsForm.validateFields((err, values) => { + this.newTagsForm.validateFieldsAndScroll((err, values) => { if (err) { this.tagsLoading = false return @@ -471,7 +471,7 @@ export default { }, handleEditRule (e) { e.preventDefault() - this.ruleForm.validateFields((err, values) => { + this.ruleForm.validateFieldsAndScroll((err, values) => { if (err) return this.fetchLoading = true @@ -561,7 +561,7 @@ export default { }, handleAddRule (e) { e.preventDefault() - this.ruleForm.validateFields((err, values) => { + this.ruleForm.validateFieldsAndScroll((err, values) => { if (err) return this.fetchLoading = true diff --git a/ui/src/views/network/CreateIsolatedNetworkForm.vue b/ui/src/views/network/CreateIsolatedNetworkForm.vue index 9ebde9a36c3..292e33fc449 100644 --- a/ui/src/views/network/CreateIsolatedNetworkForm.vue +++ b/ui/src/views/network/CreateIsolatedNetworkForm.vue @@ -403,7 +403,12 @@ export default { }, handleSubmit (e) { if (this.actionLoading) return - this.form.validateFields((error, values) => { + const options = { + scroll: { + offsetTop: 10 + } + } + this.form.validateFieldsAndScroll(options, (error, values) => { if (error) { return } diff --git a/ui/src/views/network/CreateL2NetworkForm.vue b/ui/src/views/network/CreateL2NetworkForm.vue index 7109c2664c5..7fdcd6f9466 100644 --- a/ui/src/views/network/CreateL2NetworkForm.vue +++ b/ui/src/views/network/CreateL2NetworkForm.vue @@ -365,7 +365,7 @@ export default { }, handleSubmit (e) { if (this.actionLoading) return - this.form.validateFields((error, values) => { + this.form.validateFieldsAndScroll((error, values) => { if (error) { return } diff --git a/ui/src/views/network/CreateSharedNetworkForm.vue b/ui/src/views/network/CreateSharedNetworkForm.vue index 19a6e1796d6..4b06b8a089f 100644 --- a/ui/src/views/network/CreateSharedNetworkForm.vue +++ b/ui/src/views/network/CreateSharedNetworkForm.vue @@ -694,7 +694,12 @@ export default { }, handleSubmit (e) { if (this.actionLoading) return - this.form.validateFields((error, values) => { + const options = { + scroll: { + offsetTop: 10 + } + } + this.form.validateFieldsAndScroll(options, (error, values) => { if (error) { return } diff --git a/ui/src/views/network/CreateVlanIpRange.vue b/ui/src/views/network/CreateVlanIpRange.vue index 61f7f87560b..71a7f06dbb8 100644 --- a/ui/src/views/network/CreateVlanIpRange.vue +++ b/ui/src/views/network/CreateVlanIpRange.vue @@ -224,7 +224,7 @@ export default { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/network/CreateVpc.vue b/ui/src/views/network/CreateVpc.vue index 53f3cace9ac..72f202cda83 100644 --- a/ui/src/views/network/CreateVpc.vue +++ b/ui/src/views/network/CreateVpc.vue @@ -173,7 +173,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/network/CreateVpnCustomerGateway.vue b/ui/src/views/network/CreateVpnCustomerGateway.vue index b931645ee8b..56dfceede00 100644 --- a/ui/src/views/network/CreateVpnCustomerGateway.vue +++ b/ui/src/views/network/CreateVpnCustomerGateway.vue @@ -325,7 +325,12 @@ export default { handleSubmit (e) { e.preventDefault() if (this.isSubmitted) return - this.form.validateFields((err, values) => { + const options = { + scroll: { + offsetTop: 10 + } + } + this.form.validateFieldsAndScroll(options, (err, values) => { if (err) { return } diff --git a/ui/src/views/network/FirewallRules.vue b/ui/src/views/network/FirewallRules.vue index 21f9f951b97..c290f1f7dd4 100644 --- a/ui/src/views/network/FirewallRules.vue +++ b/ui/src/views/network/FirewallRules.vue @@ -448,7 +448,7 @@ export default { if (this.addTagLoading) return this.addTagLoading = true - this.newTagsForm.validateFields((err, values) => { + this.newTagsForm.validateFieldsAndScroll((err, values) => { if (err) { this.tagsLoading = false return diff --git a/ui/src/views/network/IngressEgressRuleConfigure.vue b/ui/src/views/network/IngressEgressRuleConfigure.vue index 060399b68de..babc7b8ed93 100644 --- a/ui/src/views/network/IngressEgressRuleConfigure.vue +++ b/ui/src/views/network/IngressEgressRuleConfigure.vue @@ -415,7 +415,7 @@ export default { this.tagsLoading = true e.preventDefault() - this.newTagsForm.validateFields((err, values) => { + this.newTagsForm.validateFieldsAndScroll((err, values) => { if (err) { this.tagsLoading = false return diff --git a/ui/src/views/network/LoadBalancing.vue b/ui/src/views/network/LoadBalancing.vue index 8f1582bd4e1..b86c91ee569 100644 --- a/ui/src/views/network/LoadBalancing.vue +++ b/ui/src/views/network/LoadBalancing.vue @@ -765,7 +765,7 @@ export default { this.tagsModalLoading = true e.preventDefault() - this.newTagsForm.validateFields((err, values) => { + this.newTagsForm.validateFieldsAndScroll((err, values) => { if (err) { this.tagsModalLoading = false return @@ -926,7 +926,7 @@ export default { if (this.stickinessModalLoading) return this.stickinessModalLoading = true e.preventDefault() - this.stickinessPolicyForm.validateFields((err, values) => { + this.stickinessPolicyForm.validateFieldsAndScroll((err, values) => { if (err) { this.stickinessModalLoading = false return diff --git a/ui/src/views/network/PortForwarding.vue b/ui/src/views/network/PortForwarding.vue index 81e2fe8faad..361708ed531 100644 --- a/ui/src/views/network/PortForwarding.vue +++ b/ui/src/views/network/PortForwarding.vue @@ -664,7 +664,7 @@ export default { this.tagsModalLoading = true e.preventDefault() - this.newTagsForm.validateFields((err, values) => { + this.newTagsForm.validateFieldsAndScroll((err, values) => { if (err) { this.tagsModalLoading = false return diff --git a/ui/src/views/network/StaticRoutesTab.vue b/ui/src/views/network/StaticRoutesTab.vue index bf93d30fd64..154594e8fcf 100644 --- a/ui/src/views/network/StaticRoutesTab.vue +++ b/ui/src/views/network/StaticRoutesTab.vue @@ -251,7 +251,7 @@ export default { this.tagsLoading = true e.preventDefault() - this.newTagsForm.validateFields((err, values) => { + this.newTagsForm.validateFieldsAndScroll((err, values) => { if (err) { this.tagsLoading = false return diff --git a/ui/src/views/network/VpcTab.vue b/ui/src/views/network/VpcTab.vue index a295cf1b261..7d5fedcad02 100644 --- a/ui/src/views/network/VpcTab.vue +++ b/ui/src/views/network/VpcTab.vue @@ -637,7 +637,7 @@ export default { if (this.modals.gatewayLoading) return this.modals.gatewayLoading = true - this.gatewayForm.validateFields(errors => { + this.gatewayForm.validateFieldsAndScroll(errors => { if (errors) { this.modals.gatewayLoading = false return @@ -693,7 +693,7 @@ export default { this.fetchLoading = true this.modals.vpnConnection = false - this.vpnConnectionForm.validateFields((errors, values) => { + this.vpnConnectionForm.validateFieldsAndScroll((errors, values) => { if (errors) { this.fetchLoading = false return @@ -737,7 +737,7 @@ export default { this.fetchLoading = true this.modals.networkAcl = false - this.networkAclForm.validateFields((errors, values) => { + this.networkAclForm.validateFieldsAndScroll((errors, values) => { if (errors) { this.fetchLoading = false } diff --git a/ui/src/views/network/VpcTiersTab.vue b/ui/src/views/network/VpcTiersTab.vue index e6a4b798e62..25dee1260cd 100644 --- a/ui/src/views/network/VpcTiersTab.vue +++ b/ui/src/views/network/VpcTiersTab.vue @@ -637,7 +637,7 @@ export default { this.fetchLoading = true this.modalLoading = true - this.form.validateFields((errors, values) => { + this.form.validateFieldsAndScroll((errors, values) => { if (errors) { this.fetchLoading = false this.modalLoading = false @@ -681,7 +681,7 @@ export default { if (this.modalLoading) return this.fetchLoading = true this.modalLoading = true - this.form.validateFields((errors, values) => { + this.form.validateFieldsAndScroll((errors, values) => { if (errors) { this.fetchLoading = false this.modalLoading = false diff --git a/ui/src/views/offering/AddComputeOffering.vue b/ui/src/views/offering/AddComputeOffering.vue index 2778e5558d6..be4081640f1 100644 --- a/ui/src/views/offering/AddComputeOffering.vue +++ b/ui/src/views/offering/AddComputeOffering.vue @@ -735,7 +735,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/offering/AddDiskOffering.vue b/ui/src/views/offering/AddDiskOffering.vue index 4c398a1ce09..71d5c2d10c8 100644 --- a/ui/src/views/offering/AddDiskOffering.vue +++ b/ui/src/views/offering/AddDiskOffering.vue @@ -483,7 +483,12 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + const options = { + scroll: { + offsetTop: 10 + } + } + this.form.validateFieldsAndScroll(options, (err, values) => { if (err) { return } diff --git a/ui/src/views/offering/AddNetworkOffering.vue b/ui/src/views/offering/AddNetworkOffering.vue index aa2bbb3235c..d0263caf04d 100644 --- a/ui/src/views/offering/AddNetworkOffering.vue +++ b/ui/src/views/offering/AddNetworkOffering.vue @@ -707,7 +707,12 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + const options = { + scroll: { + offsetTop: 10 + } + } + this.form.validateFieldsAndScroll(options, (err, values) => { if (err) { return } diff --git a/ui/src/views/offering/AddVpcOffering.vue b/ui/src/views/offering/AddVpcOffering.vue index 826c3cc2150..e889b9d2749 100644 --- a/ui/src/views/offering/AddVpcOffering.vue +++ b/ui/src/views/offering/AddVpcOffering.vue @@ -312,7 +312,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/offering/ImportBackupOffering.vue b/ui/src/views/offering/ImportBackupOffering.vue index d675059ca1c..24f83909e14 100644 --- a/ui/src/views/offering/ImportBackupOffering.vue +++ b/ui/src/views/offering/ImportBackupOffering.vue @@ -155,7 +155,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/offering/UpdateOfferingAccess.vue b/ui/src/views/offering/UpdateOfferingAccess.vue index e35c305b19a..8234b2f30f1 100644 --- a/ui/src/views/offering/UpdateOfferingAccess.vue +++ b/ui/src/views/offering/UpdateOfferingAccess.vue @@ -259,7 +259,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/plugins/quota/EditTariffValueWizard.vue b/ui/src/views/plugins/quota/EditTariffValueWizard.vue index 250a79e31e0..ef02b0c8164 100644 --- a/ui/src/views/plugins/quota/EditTariffValueWizard.vue +++ b/ui/src/views/plugins/quota/EditTariffValueWizard.vue @@ -102,7 +102,7 @@ export default { submitTariff (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((error, values) => { + this.form.validateFieldsAndScroll((error, values) => { if (error) return const params = {} diff --git a/ui/src/views/project/AddAccountOrUserToProject.vue b/ui/src/views/project/AddAccountOrUserToProject.vue index b7fe75d1883..32ae8dc4124 100644 --- a/ui/src/views/project/AddAccountOrUserToProject.vue +++ b/ui/src/views/project/AddAccountOrUserToProject.vue @@ -230,7 +230,7 @@ export default { addAccountToProject (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } @@ -264,7 +264,7 @@ export default { addUserToProject (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/project/InvitationTokenTemplate.vue b/ui/src/views/project/InvitationTokenTemplate.vue index 2a140553999..10121d318b9 100644 --- a/ui/src/views/project/InvitationTokenTemplate.vue +++ b/ui/src/views/project/InvitationTokenTemplate.vue @@ -67,7 +67,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/project/iam/ProjectRoleTab.vue b/ui/src/views/project/iam/ProjectRoleTab.vue index 2ac2349c450..befbd69b3c3 100644 --- a/ui/src/views/project/iam/ProjectRoleTab.vue +++ b/ui/src/views/project/iam/ProjectRoleTab.vue @@ -213,7 +213,7 @@ export default { updateProjectRole (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } @@ -253,7 +253,7 @@ export default { createProjectRole (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/storage/AttachVolume.vue b/ui/src/views/storage/AttachVolume.vue index ce3af4bce02..d6f2a08f984 100644 --- a/ui/src/views/storage/AttachVolume.vue +++ b/ui/src/views/storage/AttachVolume.vue @@ -105,7 +105,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/storage/CreateSnapshotFromVMSnapshot.vue b/ui/src/views/storage/CreateSnapshotFromVMSnapshot.vue index d9ed976f4f2..84f04883f73 100644 --- a/ui/src/views/storage/CreateSnapshotFromVMSnapshot.vue +++ b/ui/src/views/storage/CreateSnapshotFromVMSnapshot.vue @@ -98,7 +98,7 @@ export default { }, handleSubmit (e) { if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/storage/CreateVolume.vue b/ui/src/views/storage/CreateVolume.vue index 67cdd9b0234..045b500b0db 100644 --- a/ui/src/views/storage/CreateVolume.vue +++ b/ui/src/views/storage/CreateVolume.vue @@ -194,7 +194,7 @@ export default { }, handleSubmit (e) { if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/storage/FormSchedule.vue b/ui/src/views/storage/FormSchedule.vue index 273a62f51ac..441632860ea 100644 --- a/ui/src/views/storage/FormSchedule.vue +++ b/ui/src/views/storage/FormSchedule.vue @@ -351,7 +351,7 @@ export default { }, handleSubmit (e) { if (this.actionLoading) return - this.form.validateFields((error, values) => { + this.form.validateFieldsAndScroll((error, values) => { if (error) { return } diff --git a/ui/src/views/storage/ResizeVolume.vue b/ui/src/views/storage/ResizeVolume.vue index 9b0771a3295..8c23fa3606b 100644 --- a/ui/src/views/storage/ResizeVolume.vue +++ b/ui/src/views/storage/ResizeVolume.vue @@ -99,7 +99,7 @@ export default { }, handleSubmit (e) { if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/storage/RestoreAttachBackupVolume.vue b/ui/src/views/storage/RestoreAttachBackupVolume.vue index 4b92f58ea04..07b18d9ed20 100644 --- a/ui/src/views/storage/RestoreAttachBackupVolume.vue +++ b/ui/src/views/storage/RestoreAttachBackupVolume.vue @@ -137,7 +137,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.actionLoading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/storage/TakeSnapshot.vue b/ui/src/views/storage/TakeSnapshot.vue index 26afc9e87e8..b726e7c0645 100644 --- a/ui/src/views/storage/TakeSnapshot.vue +++ b/ui/src/views/storage/TakeSnapshot.vue @@ -139,7 +139,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.actionLoading) return - this.form.validateFields((error, values) => { + this.form.validateFieldsAndScroll((error, values) => { if (error) { return } diff --git a/ui/src/views/storage/UploadLocalVolume.vue b/ui/src/views/storage/UploadLocalVolume.vue index dfb2cb0bfdb..c4f1d569014 100644 --- a/ui/src/views/storage/UploadLocalVolume.vue +++ b/ui/src/views/storage/UploadLocalVolume.vue @@ -171,7 +171,7 @@ export default { handleSubmit (e) { e.preventDefault() if (this.loading) return - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return } diff --git a/ui/src/views/tools/ImportUnmanagedInstance.vue b/ui/src/views/tools/ImportUnmanagedInstance.vue index 6edb065ef14..ecde62fb4e4 100644 --- a/ui/src/views/tools/ImportUnmanagedInstance.vue +++ b/ui/src/views/tools/ImportUnmanagedInstance.vue @@ -621,7 +621,7 @@ export default { }, handleSubmit (e) { e.preventDefault() - this.form.validateFields((err, values) => { + this.form.validateFieldsAndScroll((err, values) => { if (err) { return }