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> + 已选择 <a style="font-weight: 600">{{selectedRows.length}}</a> 项 + <template v-for="(item, index) in needTotalList" v-if="item.needTotal"> + {{item.title}}总计 + <a :key="index" style="font-weight: 600"> + {{item.customRender ? item.customRender(item.total) : item.total}} + </a> + </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>