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

dahn 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 1ef0833e7a3 UI: Add filter to list encrypted volumes (#9548)
1ef0833e7a3 is described below

commit 1ef0833e7a37d98927edb0195828417740c0db61
Author: Pearl Dsilva <pearl1...@gmail.com>
AuthorDate: Tue Aug 20 10:34:37 2024 -0400

    UI: Add filter to list encrypted volumes (#9548)
---
 ui/public/locales/en.json             |  1 +
 ui/src/components/view/SearchView.vue | 30 +++++++++++++++++++++++++++++-
 ui/src/config/section/storage.js      |  2 +-
 3 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json
index b42899fc631..cda4e34618a 100644
--- a/ui/public/locales/en.json
+++ b/ui/public/locales/en.json
@@ -1166,6 +1166,7 @@
 "label.isdedicated": "Dedicated",
 "label.isdefault": "Is default",
 "label.isdynamicallyscalable": "Dynamically scalable",
+"label.isencrypted": "Encrypted",
 "label.istagarule": "Tag as JS rule",
 "label.isextractable": "Extractable",
 "label.isfeatured": "Featured",
diff --git a/ui/src/components/view/SearchView.vue 
b/ui/src/components/view/SearchView.vue
index 7883b162d66..07e2d14e8bc 100644
--- a/ui/src/components/view/SearchView.vue
+++ b/ui/src/components/view/SearchView.vue
@@ -111,6 +111,10 @@
                       <tooltip-button :tooltip="$t('label.clear')" 
icon="close-outlined" size="small" @onClick="inputKey = inputValue = ''" />
                     </a-input-group>
                   </div>
+                  <a-switch
+                    v-else-if="field.type==='boolean'"
+                    v-model:checked="form[field.name]"
+                  />
                   <a-auto-complete
                     v-else-if="field.type==='autocomplete'"
                     v-model:value="form[field.name]"
@@ -294,7 +298,9 @@ export default {
         if (item === 'usagetype' && !('listUsageTypes' in 
this.$store.getters.apis)) {
           return true
         }
-
+        if (item === 'isencrypted' && !('listVolumes' in 
this.$store.getters.apis)) {
+          return true
+        }
         if (['zoneid', 'domainid', 'imagestoreid', 'storageid', 'state', 
'account', 'hypervisor', 'level',
           'clusterid', 'podid', 'groupid', 'entitytype', 'accounttype', 
'systemvmtype', 'scope', 'provider',
           'type', 'scope', 'managementserverid', 'serviceofferingid', 
'diskofferingid', 'usagetype'].includes(item)
@@ -304,6 +310,8 @@ export default {
           type = 'tag'
         } else if (item === 'resourcetype') {
           type = 'autocomplete'
+        } else if (item === 'isencrypted') {
+          type = 'boolean'
         }
 
         this.fields.push({
@@ -420,6 +428,7 @@ export default {
       let serviceOfferingIndex = -1
       let diskOfferingIndex = -1
       let usageTypeIndex = -1
+      let volumeIndex = -1
 
       if (arrayField.includes('type')) {
         if (this.$route.path === '/alert') {
@@ -511,6 +520,12 @@ export default {
         promises.push(await this.fetchUsageTypes())
       }
 
+      if (arrayField.includes('isencrypted')) {
+        volumeIndex = this.fields.findIndex(item => item.name === 
'isencrypted')
+        this.fields[volumeIndex].loading = true
+        promises.push(await this.fetchVolumes(searchKeyword))
+      }
+
       Promise.all(promises).then(response => {
         if (typeIndex > -1) {
           const types = response.filter(item => item.type === 'type')
@@ -884,6 +899,19 @@ export default {
         })
       }
     },
+    fetchVolumes (searchKeyword) {
+      return new Promise((resolve, reject) => {
+        api('listvolumes', { listAll: true, isencrypted: searchKeyword 
}).then(json => {
+          const volumes = json.listvolumesresponse.volume
+          resolve({
+            type: 'isencrypted',
+            data: volumes
+          })
+        }).catch(error => {
+          reject(error.response.headers['x-description'])
+        })
+      })
+    },
     fetchManagementServers (searchKeyword) {
       return new Promise((resolve, reject) => {
         api('listManagementServers', { listAll: true, keyword: searchKeyword 
}).then(json => {
diff --git a/ui/src/config/section/storage.js b/ui/src/config/section/storage.js
index 28c451105a1..4c76ebf8db3 100644
--- a/ui/src/config/section/storage.js
+++ b/ui/src/config/section/storage.js
@@ -91,7 +91,7 @@ export default {
         }
       ],
       searchFilters: () => {
-        var filters = ['name', 'zoneid', 'domainid', 'account', 'state', 
'tags', 'serviceofferingid', 'diskofferingid']
+        var filters = ['name', 'zoneid', 'domainid', 'account', 'state', 
'tags', 'serviceofferingid', 'diskofferingid', 'isencrypted']
         if (['Admin', 
'DomainAdmin'].includes(store.getters.userInfo.roletype)) {
           filters.push('storageid')
         }

Reply via email to