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

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


The following commit(s) were added to refs/heads/main by this push:
     new b0a9949775b ui: include domain and account field for createTemplate 
forms (#8257)
b0a9949775b is described below

commit b0a9949775b47bb589837dda40d9869aab01dff1
Author: Manoj Kumar <[email protected]>
AuthorDate: Tue Nov 28 13:32:44 2023 +0530

    ui: include domain and account field for createTemplate forms (#8257)
    
    This PR includes Domain and Account parameters in CreateTemplate form in UI 
for Admin account.
    It will expose optional parameters domainId and account in UI supported by 
createTemplate API #8210
---
 ui/src/config/section/storage.js        |  9 +++-
 ui/src/views/storage/CreateTemplate.vue | 92 ++++++++++++++++++++++++++++++++-
 2 files changed, 99 insertions(+), 2 deletions(-)

diff --git a/ui/src/config/section/storage.js b/ui/src/config/section/storage.js
index 269c1f81788..3c2bd30db9b 100644
--- a/ui/src/config/section/storage.js
+++ b/ui/src/config/section/storage.js
@@ -253,7 +253,14 @@ export default {
             ((record.type === 'ROOT' && record.vmstate === 'Stopped') ||
             (record.type !== 'ROOT' && !record.virtualmachineid && 
!['Allocated', 'Uploaded'].includes(record.state)))
           },
-          args: ['volumeid', 'name', 'displaytext', 'ostypeid', 'ispublic', 
'isfeatured', 'isdynamicallyscalable', 'requireshvm', 'passwordenabled'],
+          args: (record, store) => {
+            var fields = ['volumeid', 'name', 'displaytext', 'ostypeid', 
'ispublic', 'isfeatured', 'isdynamicallyscalable', 'requireshvm', 
'passwordenabled']
+            if (['Admin', 'DomainAdmin'].includes(store.userInfo.roletype)) {
+              fields.push('domainid')
+              fields.push('account')
+            }
+            return fields
+          },
           mapping: {
             volumeid: {
               value: (record) => { return record.id }
diff --git a/ui/src/views/storage/CreateTemplate.vue 
b/ui/src/views/storage/CreateTemplate.vue
index 294abe330cb..13ce75777fb 100644
--- a/ui/src/views/storage/CreateTemplate.vue
+++ b/ui/src/views/storage/CreateTemplate.vue
@@ -69,6 +69,48 @@
           </a-select-option>
         </a-select>
       </a-form-item>
+      <a-form-item name="domainid" ref="domainid" v-if="'listDomains' in 
$store.getters.apis">
+          <template #label>
+            <tooltip-label :title="$t('label.domainid')" 
:tooltip="apiParams.domainid.description"/>
+          </template>
+          <a-select
+            v-model:value="form.domainid"
+            showSearch
+            optionFilterProp="label"
+            :filterOption="(input, option) => {
+              return option.label.toLowerCase().indexOf(input.toLowerCase()) 
>= 0
+            }"
+            :loading="domainLoading"
+            :placeholder="apiParams.domainid.description"
+            @change="val => { handleDomainChange(val) }">
+            <a-select-option v-for="(opt, optIndex) in this.domains" 
:key="optIndex" :label="opt.path || opt.name || opt.description" 
:value="opt.id">
+              <span>
+                <resource-icon v-if="opt && opt.icon" 
:image="opt.icon.base64image" size="1x" style="margin-right: 5px"/>
+                <block-outlined v-else style="margin-right: 5px" />
+                {{ opt.path || opt.name || opt.description }}
+              </span>
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item name="account" ref="account" v-if="domainid">
+          <template #label>
+            <tooltip-label :title="$t('label.account')" 
:tooltip="apiParams.account.description"/>
+          </template>
+          <a-select
+            v-model:value="form.account"
+            showSearch
+            optionFilterProp="label"
+            :filterOption="(input, option) => {
+              return option.value.toLowerCase().indexOf(input.toLowerCase()) 
>= 0
+            }"
+            :placeholder="apiParams.account.description"
+            @change="val => { handleAccountChange(val) }">
+            <a-select-option v-for="(acc, index) in accounts" 
:value="acc.name" :key="index">
+              {{ acc.name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+
       <a-form-item
           name="ostypeid"
           ref="ostypeid"
@@ -158,7 +200,12 @@ export default {
       snapshotZoneIds: [],
       zones: [],
       osTypes: {},
-      loading: false
+      loading: false,
+      domains: [],
+      accounts: [],
+      domainLoading: false,
+      domainid: null,
+      account: null
     }
   },
   computed: {
@@ -188,6 +235,9 @@ export default {
     fetchData () {
       this.fetchOsTypes()
       this.fetchSnapshotZones()
+      if ('listDomains' in this.$store.getters.apis) {
+        this.fetchDomains()
+      }
     },
     fetchOsTypes () {
       this.osTypes.opts = []
@@ -237,6 +287,43 @@ export default {
         }
       })
     },
+    fetchDomains () {
+      const params = {}
+      params.listAll = true
+      params.showicon = true
+      params.details = 'min'
+      this.domainLoading = true
+      api('listDomains', params).then(json => {
+        this.domains = json.listdomainsresponse.domain
+      }).finally(() => {
+        this.domainLoading = false
+        this.handleDomainChange(null)
+      })
+    },
+    handleDomainChange (domain) {
+      this.domainid = domain
+      this.form.account = null
+      this.account = null
+      if ('listAccounts' in this.$store.getters.apis) {
+        this.fetchAccounts()
+      }
+    },
+    fetchAccounts () {
+      api('listAccounts', {
+        domainid: this.domainid
+      }).then(response => {
+        this.accounts = response.listaccountsresponse.account || []
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    handleAccountChange (acc) {
+      if (acc) {
+        this.account = acc.name
+      } else {
+        this.account = acc
+      }
+    },
     handleSubmit (e) {
       if (this.loading) return
       this.formRef.value.validate().then(() => {
@@ -277,6 +364,9 @@ export default {
     },
     closeModal () {
       this.$emit('close-action')
+    },
+    isAdminOrDomainAdmin () {
+      return ['Admin', 
'DomainAdmin'].includes(this.$store.getters.userInfo.roletype)
     }
   }
 }

Reply via email to