This is an automated email from the ASF dual-hosted git repository.

pearl11594 pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.20 by this push:
     new 76e6de7f90e ui: fix form data double fetch/reset form data by 
ownership selection (#11705)
76e6de7f90e is described below

commit 76e6de7f90e5b741f3deb845ea722858101a7117
Author: Abhishek Kumar <[email protected]>
AuthorDate: Fri Jan 16 21:18:57 2026 +0530

    ui: fix form data double fetch/reset form data by ownership selection 
(#11705)
    
    * ui: fix form data double fetch/reset form data by ownership selection
    
    Fixes #10832
---
 ui/src/views/compute/DeployVM.vue                  |  4 ++-
 ui/src/views/compute/wizard/OwnershipSelection.vue | 30 ++++++++++++++++++----
 ui/src/views/network/CreateIsolatedNetworkForm.vue |  2 +-
 ui/src/views/network/CreateL2NetworkForm.vue       |  2 +-
 ui/src/views/storage/CreateSharedFS.vue            |  8 +++---
 ui/src/views/storage/CreateVolume.vue              |  4 ++-
 6 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/ui/src/views/compute/DeployVM.vue 
b/ui/src/views/compute/DeployVM.vue
index 97ef7bb5a96..72cb74399d1 100644
--- a/ui/src/views/compute/DeployVM.vue
+++ b/ui/src/views/compute/DeployVM.vue
@@ -2339,7 +2339,9 @@ export default {
         this.owner.domainid = null
         this.owner.projectid = OwnerOptions.selectedProject
       }
-      this.resetData()
+      if (OwnerOptions.initialized) {
+        this.resetData()
+      }
     },
     fetchZones (zoneId, listZoneAllow) {
       this.zones = []
diff --git a/ui/src/views/compute/wizard/OwnershipSelection.vue 
b/ui/src/views/compute/wizard/OwnershipSelection.vue
index a2c7ea4c1f8..b29069628db 100644
--- a/ui/src/views/compute/wizard/OwnershipSelection.vue
+++ b/ui/src/views/compute/wizard/OwnershipSelection.vue
@@ -19,7 +19,7 @@
   <a-form layout="vertical" >
     <a-form-item :label="$t('label.owner.type')">
       <a-select
-        @change="changeDomain"
+        @change="changeAccountTypeOrDomain"
         v-model:value="selectedAccountType"
         defaultValue="account"
         autoFocus
@@ -37,7 +37,7 @@
     </a-form-item>
     <a-form-item :label="$t('label.domain')" required>
       <a-select
-        @change="changeDomain"
+        @change="changeAccountTypeOrDomain"
         v-model:value="selectedDomain"
         showSearch
         optionFilterProp="label"
@@ -136,6 +136,7 @@ export default {
   components: { ResourceIcon },
   data () {
     return {
+      initialized: false,
       domains: [],
       accounts: [],
       projects: [],
@@ -143,7 +144,8 @@ export default {
       selectedDomain: null,
       selectedAccount: null,
       selectedProject: null,
-      loading: false
+      loading: false,
+      requestToken: 0
     }
   },
   props: {
@@ -177,7 +179,7 @@ export default {
           const domainIds = this.domains?.map(domain => domain.id)
           const ownerDomainId = this.$store.getters.project?.domainid || 
this.$store.getters.userInfo.domainid
           this.selectedDomain = domainIds?.includes(ownerDomainId) ? 
ownerDomainId : this.domains?.[0]?.id
-          this.changeDomain()
+          this.fetchOwnerData()
         })
         .catch((error) => {
           this.$notifyError(error)
@@ -186,8 +188,13 @@ export default {
           this.loading = false
         })
     },
+    incrementAndGetRequestToken () {
+      this.requestToken += 1
+      return this.requestToken
+    },
     fetchAccounts () {
       this.loading = true
+      const currentToken = this.incrementAndGetRequestToken()
       api('listAccounts', {
         response: 'json',
         domainId: this.selectedDomain,
@@ -196,6 +203,9 @@ export default {
         isrecursive: false
       })
         .then((response) => {
+          if (currentToken !== this.requestToken) {
+            return
+          }
           this.accounts = response.listaccountsresponse.account || []
           if (this.override?.accounts && this.accounts) {
             this.accounts = this.accounts.filter(item => 
this.override.accounts.has(item.name))
@@ -214,10 +224,12 @@ export default {
         })
         .finally(() => {
           this.loading = false
+          this.initialized = true
         })
     },
     fetchProjects () {
       this.loading = true
+      const currentToken = this.incrementAndGetRequestToken()
       api('listProjects', {
         response: 'json',
         domainId: this.selectedDomain,
@@ -227,6 +239,9 @@ export default {
         isrecursive: false
       })
         .then((response) => {
+          if (currentToken !== this.requestToken) {
+            return
+          }
           this.projects = response.listprojectsresponse.project
           if (this.override?.projects && this.projects) {
             this.projects = this.projects.filter(item => 
this.override.projects.has(item.id))
@@ -240,9 +255,14 @@ export default {
         })
         .finally(() => {
           this.loading = false
+          this.initialized = true
         })
     },
-    changeDomain () {
+    changeAccountTypeOrDomain () {
+      this.initialized = true
+      this.fetchOwnerData()
+    },
+    fetchOwnerData () {
       if (this.selectedAccountType === 'Account') {
         this.fetchAccounts()
       } else {
diff --git a/ui/src/views/network/CreateIsolatedNetworkForm.vue 
b/ui/src/views/network/CreateIsolatedNetworkForm.vue
index cbfc2f97cfc..78d4ef72f04 100644
--- a/ui/src/views/network/CreateIsolatedNetworkForm.vue
+++ b/ui/src/views/network/CreateIsolatedNetworkForm.vue
@@ -507,7 +507,7 @@ export default {
         this.owner.domainid = null
         this.owner.projectid = OwnerOptions.selectedProject
       }
-      if (isAdminOrDomainAdmin()) {
+      if (OwnerOptions.initialized && isAdminOrDomainAdmin()) {
         this.updateVPCCheckAndFetchNetworkOfferingData()
       }
     },
diff --git a/ui/src/views/network/CreateL2NetworkForm.vue 
b/ui/src/views/network/CreateL2NetworkForm.vue
index 897233c5260..2590269b333 100644
--- a/ui/src/views/network/CreateL2NetworkForm.vue
+++ b/ui/src/views/network/CreateL2NetworkForm.vue
@@ -309,7 +309,7 @@ export default {
         this.owner.domainid = null
         this.owner.projectid = OwnerOptions.selectedProject
       }
-      if (isAdminOrDomainAdmin()) {
+      if (OwnerOptions.initialized && this.isAdminOrDomainAdmin()) {
         this.updateVPCCheckAndFetchNetworkOfferingData()
       }
     },
diff --git a/ui/src/views/storage/CreateSharedFS.vue 
b/ui/src/views/storage/CreateSharedFS.vue
index fc9f43c704e..e3cd82996c9 100644
--- a/ui/src/views/storage/CreateSharedFS.vue
+++ b/ui/src/views/storage/CreateSharedFS.vue
@@ -272,23 +272,21 @@ export default {
     },
     fetchOwnerOptions (OwnerOptions) {
       this.owner = {}
-      console.log('fetching owner')
       if (OwnerOptions.selectedAccountType === 'Account') {
         if (!OwnerOptions.selectedAccount) {
           return
         }
-        console.log('fetched account')
         this.owner.account = OwnerOptions.selectedAccount
         this.owner.domainid = OwnerOptions.selectedDomain
       } else if (OwnerOptions.selectedAccountType === 'Project') {
         if (!OwnerOptions.selectedProject) {
           return
         }
-        console.log('fetched project')
         this.owner.projectid = OwnerOptions.selectedProject
       }
-      console.log('fetched owner')
-      this.fetchData()
+      if (OwnerOptions.initialized) {
+        this.fetchData()
+      }
     },
     fetchData () {
       this.minCpu = store.getters.features.sharedfsvmmincpucount
diff --git a/ui/src/views/storage/CreateVolume.vue 
b/ui/src/views/storage/CreateVolume.vue
index a0c04e7c0ab..b72799c4898 100644
--- a/ui/src/views/storage/CreateVolume.vue
+++ b/ui/src/views/storage/CreateVolume.vue
@@ -272,7 +272,9 @@ export default {
         }
         this.owner.projectid = OwnerOptions.selectedProject
       }
-      this.fetchData()
+      if (OwnerOptions.initialized) {
+        this.fetchData()
+      }
     },
     fetchData () {
       if (this.createVolumeFromSnapshot) {

Reply via email to