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

rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack-primate.git


The following commit(s) were added to refs/heads/master by this push:
     new 47f169a  compute: Changing VM Snapshots and Backups to their own tabs 
if allowed (#501)
47f169a is described below

commit 47f169acf0a801120f5b4d627f072a78bee21ded
Author: davidjumani <dj.davidjumani1...@gmail.com>
AuthorDate: Tue Jul 7 18:20:12 2020 +0530

    compute: Changing VM Snapshots and Backups to their own tabs if allowed 
(#501)
    
    Fixes #487
---
 src/components/view/ListResourceTable.vue | 118 ++++++++++++++++++++++++++++++
 src/config/section/compute.js             |   9 ---
 src/views/compute/InstanceTab.vue         |  20 ++++-
 3 files changed, 136 insertions(+), 11 deletions(-)

diff --git a/src/components/view/ListResourceTable.vue 
b/src/components/view/ListResourceTable.vue
new file mode 100644
index 0000000..8bc7ad6
--- /dev/null
+++ b/src/components/view/ListResourceTable.vue
@@ -0,0 +1,118 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+<template>
+  <a-table
+    size="small"
+    :columns="fetchColumns()"
+    :dataSource="items"
+    :rowKey="item => item.id"
+    :loading="loading"
+    :pagination="false" >
+
+    <template v-if="routerlink" :slot="routerlink.name" slot-scope="text, 
item">
+      <router-link :to="{ path: routerlink.prefix + item.id }" 
v-if="routerlink.prefix">{{ text }}</router-link>
+      <span v-else>{{ text }}</span>
+    </template>
+    <template slot="state" slot-scope="text">
+      <status :text="text ? text : ''" />{{ text }}
+    </template>
+
+  </a-table>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'ListResourceTable',
+  components: {
+    Status
+  },
+  props: {
+    apiName: {
+      type: String,
+      required: true
+    },
+    routerlink: {
+      type: Object,
+      default: () => {}
+    },
+    params: {
+      type: Object,
+      required: true
+    },
+    columns: {
+      type: Array,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      items: []
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      var params = this.params
+      params.listall = true
+      params.response = 'json'
+      params.details = 'min'
+      api(this.apiName, this.params).then(json => {
+        var responseName
+        var objectName
+        for (const key in json) {
+          if (key.includes('response')) {
+            responseName = key
+            break
+          }
+        }
+        for (const key in json[responseName]) {
+          if (key === 'count') {
+            continue
+          }
+          objectName = key
+          break
+        }
+        this.items = json[responseName][objectName]
+        if (!this.items || this.items.length === 0) {
+          this.items = []
+        }
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchColumns () {
+      var columns = []
+      for (const col of this.columns) {
+        columns.push({
+          dataIndex: col,
+          title: this.$t('label.' + col),
+          scopedSlots: { customRender: col }
+        })
+      }
+      return columns
+    }
+  }
+}
+</script>
diff --git a/src/config/section/compute.js b/src/config/section/compute.js
index 27d056b..2931764 100644
--- a/src/config/section/compute.js
+++ b/src/config/section/compute.js
@@ -63,15 +63,6 @@ export default {
       },
       searchFilters: ['name', 'zoneid', 'domainid', 'account', 'tags'],
       details: ['displayname', 'name', 'id', 'state', 'ipaddress', 
'templatename', 'ostypename', 'serviceofferingname', 'isdynamicallyscalable', 
'haenable', 'hypervisor', 'boottype', 'bootmode', 'account', 'domain', 
'zonename'],
-      related: [{
-        name: 'vmsnapshot',
-        title: 'label.vm.snapshots',
-        param: 'virtualmachineid'
-      }, {
-        name: 'backup',
-        title: 'label.backup',
-        param: 'virtualmachineid'
-      }],
       tabs: [{
         component: () => import('@/views/compute/InstanceTab.vue')
       }],
diff --git a/src/views/compute/InstanceTab.vue 
b/src/views/compute/InstanceTab.vue
index e11bb19..8568d44 100644
--- a/src/views/compute/InstanceTab.vue
+++ b/src/views/compute/InstanceTab.vue
@@ -49,7 +49,7 @@
             </a-tag>
           </template>
           <template slot="state" slot-scope="text">
-            <status :text="text ? text : ''" displayText />
+            <status :text="text ? text : ''" />{{ text }}
           </template>
           <template slot="size" slot-scope="text, item">
             {{ parseFloat(item.size / (1024.0 * 1024.0 * 1024.0)).toFixed(2) 
}} GB
@@ -115,6 +115,20 @@
           </span>
         </NicsTable>
       </a-tab-pane>
+      <a-tab-pane :tab="$t('label.vm.snapshots')" key="vmsnapshots" 
v-if="'listVMSnapshot' in $store.getters.apis">
+        <ListResourceTable
+          apiName="listVMSnapshot"
+          :params="{virtualmachineid: this.resource.id}"
+          :columns="['name', 'state', 'type', 'created']"
+          :routerlink="{name: 'name', prefix: '/vmsnapshot/'}"/>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.backup')" key="backups" v-if="'listBackups' 
in $store.getters.apis">
+        <ListResourceTable
+          apiName="listBackups"
+          :params="{virtualmachineid: this.resource.id}"
+          :columns="['id', 'state', 'type', 'created']"
+          :routerlink="{name: 'id', prefix: '/backup/'}"/>
+      </a-tab-pane>
       <a-tab-pane :tab="$t('label.settings')" key="settings">
         <DetailSettings :resource="resource" :loading="loading" />
       </a-tab-pane>
@@ -203,6 +217,7 @@ import Status from '@/components/widgets/Status'
 import DetailsTab from '@/components/view/DetailsTab'
 import DetailSettings from '@/components/view/DetailSettings'
 import NicsTable from '@/views/network/NicsTable'
+import ListResourceTable from '@/components/view/ListResourceTable'
 
 export default {
   name: 'InstanceTab',
@@ -211,7 +226,8 @@ export default {
     DetailsTab,
     DetailSettings,
     NicsTable,
-    Status
+    Status,
+    ListResourceTable
   },
   mixins: [mixinDevice],
   props: {

Reply via email to