From 17e9e071623c29278fdb656a9233b9e1d61085f5 Mon Sep 17 00:00:00 2001
From: chenghx <chenghx@nfex.com>
Date: Thu, 26 Jul 2018 18:06:23 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=9F=A5=E8=AF=A2=E5=88=97?=
 =?UTF-8?q?=E8=A1=A8QueryList?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/components/list/QueryList.vue      | 76 +++++++++++++++++++++++---
 src/components/table/StandardTable.vue | 65 ++++++++++++++++++++--
 2 files changed, 128 insertions(+), 13 deletions(-)

diff --git a/src/components/list/QueryList.vue b/src/components/list/QueryList.vue
index 6e8c417..cc77c23 100644
--- a/src/components/list/QueryList.vue
+++ b/src/components/list/QueryList.vue
@@ -79,8 +79,24 @@
       </a-form>
     </div>
     <div>
+      <div class="operator">
+        <a-button @click="addNew" type="primary">新建</a-button>
+        <a-button >批量操作</a-button>
+        <a-dropdown>
+          <a-menu @click="handleMenuClick" slot="overlay">
+            <a-menu-item key="delete">删除</a-menu-item>
+            <a-menu-item key="audit">审批</a-menu-item>
+          </a-menu>
+          <a-button>
+            更多操作 <a-icon type="down" />
+          </a-button>
+        </a-dropdown>
+      </div>
       <standard-table
         :columns="columns"
+        :dataSource="dataSource"
+        :selectedRows="selectedRows"
+        @change="onchange"
       />
     </div>
   </a-card>
@@ -99,8 +115,11 @@ import ADatePicker from 'vue-antd-ui/es/date-picker/index'
 import AButton from 'vue-antd-ui/es/button/button'
 import AIcon from 'vue-antd-ui/es/icon/icon'
 import StandardTable from '../table/StandardTable'
+import ADropdown from 'vue-antd-ui/es/dropdown'
+import AMenu from 'vue-antd-ui/es/menu/index'
 
 const ASelectOption = ASelect.Option
+const AMenuItem = AMenu.Item
 
 const columns = [
   {
@@ -115,26 +134,40 @@ const columns = [
     title: '服务调用次数',
     dataIndex: 'callNo',
     sorter: true,
-    needTotal: true
+    needTotal: true,
+    customRender: (text) => text + ' 次'
   },
   {
     title: '状态',
-    dataIndex: 'status'
+    dataIndex: 'status',
+    needTotal: true
   },
   {
     title: '更新时间',
     dataIndex: 'updatedAt',
     sorter: true
-  },
-  {
-    title: '操作',
-    key: 'action'
   }
 ]
 
+const dataSource = []
+
+for (let i = 0; i < 100; i++) {
+  dataSource.push({
+    key: i,
+    no: 'NO ' + i,
+    description: '这是一段描述',
+    callNo: Math.floor(Math.random() * 1000),
+    status: Math.floor(Math.random() * 10) % 4,
+    updatedAt: '2018-07-26'
+  })
+}
+
 export default {
   name: 'QueryList',
   components: {
+    AMenuItem,
+    AMenu,
+    ADropdown,
     StandardTable,
     AIcon,
     AButton,
@@ -151,12 +184,38 @@ export default {
   data () {
     return {
       advanced: true,
-      columns: columns
+      columns: columns,
+      dataSource: dataSource,
+      selectedRowKeys: [],
+      selectedRows: []
     }
   },
   methods: {
     toggleAdvanced () {
       this.advanced = !this.advanced
+    },
+    onchange (selectedRowKeys, selectedRows) {
+      this.selectedRowKeys = selectedRowKeys
+      this.selectedRows = selectedRows
+    },
+    remove () {
+      this.dataSource = this.dataSource.filter(item => this.selectedRowKeys.indexOf(item.key) < 0)
+      this.selectedRows = this.selectedRows.filter(item => this.selectedRowKeys.indexOf(item.key) < 0)
+    },
+    addNew () {
+      this.dataSource.unshift({
+        key: this.dataSource.length,
+        no: 'NO ' + this.dataSource.length,
+        description: '这是一段描述',
+        callNo: Math.floor(Math.random() * 1000),
+        status: Math.floor(Math.random() * 10) % 4,
+        updatedAt: '2018-07-26'
+      })
+    },
+    handleMenuClick (e) {
+      if (e.key === 'delete') {
+        this.remove()
+      }
     }
   }
 }
@@ -170,6 +229,9 @@ export default {
     width: calc(100% - 216px);
     display: inline-block
   }
+  .operator{
+    margin-bottom: 18px;
+  }
   @media screen and (max-width: 900px) {
     .fold {
       width: 100%;
diff --git a/src/components/table/StandardTable.vue b/src/components/table/StandardTable.vue
index 76fe27d..341e3be 100644
--- a/src/components/table/StandardTable.vue
+++ b/src/components/table/StandardTable.vue
@@ -1,11 +1,16 @@
 <template>
   <div class="standard-table">
     <div class="alert">
-      <a-alert type="info">
+      <a-alert type="info" :show-icon="true">
         <div slot="message">
-          已选择<span></span>项
-          服务调用总计<span></span>
-          <a>清空</a>
+          已选择&nbsp;<a style="font-weight: 600">{{selectedRows.length}}</a>&nbsp;项&nbsp;&nbsp;
+          <template  v-for="(item, index) in needTotalList" v-if="item.needTotal">
+            {{item.title}}总计&nbsp;
+            <a :key="index" style="font-weight: 600">
+            {{item.customRender ? item.customRender(item.total) : item.total}}
+            </a>&nbsp;&nbsp;
+          </template>
+          <a style="margin-left: 24px">清空</a>
         </div>
       </a-alert>
     </div>
@@ -16,17 +21,65 @@
       :dataSource="dataSource"
       :rowKey="rowKey"
       :pagination="pagination"
-    />
+      :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: updateSelect}"
+    >
+    </a-table>
   </div>
 </template>
 
 <script>
 import AAlert from 'vue-antd-ui/es/alert/index'
 import ATable from 'vue-antd-ui/es/table'
+
 export default {
   name: 'StandardTable',
   components: {ATable, AAlert},
-  props: ['bordered', 'loading', 'columns', 'dataSource', 'rowKey', 'pagination']
+  props: ['bordered', 'loading', 'columns', 'dataSource', 'rowKey', 'pagination', 'selectedRows'],
+  data () {
+    return {
+      needTotalList: [],
+      selectedRowKeys: []
+    }
+  },
+  methods: {
+    updateSelect (selectedRowKeys, selectedRows) {
+      this.selectedRowKeys = selectedRowKeys
+      let list = this.needTotalList
+      this.needTotalList = list.map(item => {
+        return {
+          ...item,
+          total: selectedRows.reduce((sum, val) => {
+            return sum + val[item.dataIndex]
+          }, 0)
+        }
+      })
+      this.$emit('change', selectedRowKeys, selectedRows)
+    },
+    initTotalList (columns) {
+      const totalList = []
+      columns.forEach(column => {
+        if (column.needTotal) {
+          totalList.push({...column, total: 0})
+        }
+      })
+      return totalList
+    }
+  },
+  created () {
+    this.needTotalList = this.initTotalList(this.columns)
+  },
+  watch: {
+    'selectedRows': function (selectedRows) {
+      this.needTotalList = this.needTotalList.map(item => {
+        return {
+          ...item,
+          total: selectedRows.reduce((sum, val) => {
+            return sum + val[item.dataIndex]
+          }, 0)
+        }
+      })
+    }
+  }
 }
 </script>