|
|
@@ -1,4 +1,9 @@
|
|
|
-import { defineComponent, ref } from 'vue'
|
|
|
+import {
|
|
|
+ TableColumnProps, Table, Row, Col, Space, Tooltip, Dropdown, Menu,
|
|
|
+ Button, DropdownButton, PaginationProps
|
|
|
+} from 'ant-design-vue'
|
|
|
+import { DownOutlined } from '@ant-design/icons-vue'
|
|
|
+import { PropType, computed, defineComponent, reactive, ref } from 'vue'
|
|
|
|
|
|
// interface Methods {
|
|
|
// get: string
|
|
|
@@ -7,52 +12,145 @@ import { defineComponent, ref } from 'vue'
|
|
|
// del: string
|
|
|
// }
|
|
|
|
|
|
+/**
|
|
|
+ * @description Table Pro 超级table 将各种业务与操作融合起来
|
|
|
+ */
|
|
|
+
|
|
|
+interface GenericListProps<T> {
|
|
|
+ dataSource: T;
|
|
|
+}
|
|
|
+
|
|
|
export default defineComponent({
|
|
|
name: 'table-pro-v2',
|
|
|
props: {
|
|
|
- methods: {
|
|
|
- type: Object,
|
|
|
- required: true,
|
|
|
- default: () => ({
|
|
|
- get: '',
|
|
|
- post: '',
|
|
|
- put: '',
|
|
|
- del: ''
|
|
|
- }),
|
|
|
- validator: function (keys: 'get' | 'post' | 'put' | 'del') {
|
|
|
- return keys === 'get'
|
|
|
- }
|
|
|
- },
|
|
|
columns: {
|
|
|
- type: Array,
|
|
|
+ type: Array as PropType<TableColumnProps[]>,
|
|
|
default: () => [],
|
|
|
required: true
|
|
|
},
|
|
|
pagination: {
|
|
|
- type: Object || false,
|
|
|
+ type: Object as PropType<PaginationProps> || false,
|
|
|
required: true,
|
|
|
- default: false
|
|
|
- // validator: function (keys: 'page' | 'pageSize' | 'total' | 'delete') {
|
|
|
- // return keys === 'page'
|
|
|
- // }
|
|
|
+ default: () => {
|
|
|
+ return {
|
|
|
+ page: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ total: 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ request: {
|
|
|
+ type: Object as PropType<{get: Function, params: Object}>,
|
|
|
+ default: () => {
|
|
|
+ return {
|
|
|
+ params: {},
|
|
|
+ get: () => {}
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
+ emits: ['reload', 'add'],
|
|
|
setup (props, ctx) {
|
|
|
- const loading = ref<boolean>(false)
|
|
|
- // const { get, post, put, del } = props.methods
|
|
|
+ const { request, columns } = props
|
|
|
+
|
|
|
+ const columnsPro = ref<TableColumnProps & {hidden: boolean} []>(columns.map(column => ({ ...column, hidden: false })))
|
|
|
+
|
|
|
+ const rowCustomized = computed(() => props.columns.map(item => ({ title: item.title, key: item.key })))
|
|
|
+
|
|
|
+ const loading = ref<Boolean>(false)
|
|
|
+
|
|
|
+ const dataSource = ref([])
|
|
|
+
|
|
|
+ const pagination = reactive<PaginationProps>(Object.assign({}, {
|
|
|
+ current: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ total: 0,
|
|
|
+ onChange: (page: number, pageSize: number) => onChangePage(page, pageSize)
|
|
|
+ }, { ...props.pagination }))
|
|
|
+
|
|
|
+ const opraMeun = (
|
|
|
+ <Menu>
|
|
|
+ <Menu.item key={0} onClick={ctx.emit('add')} > 新增 </Menu.item>
|
|
|
+ <Menu.item key={2} onClick={() => exportExcel()}> 导出 </Menu.item>
|
|
|
+ <Menu.item key={3} onClick={() => pure()}> 纯净 </Menu.item>
|
|
|
+ </Menu>
|
|
|
+ )
|
|
|
+
|
|
|
+ const exportExcel = () => {}
|
|
|
+
|
|
|
+ const pure = () => {}
|
|
|
+
|
|
|
+ const onChangePage = (page: number, pageSize: number) => {
|
|
|
+ pagination.current = page
|
|
|
+ pagination.pageSize = pageSize
|
|
|
+ dispatchRequest()
|
|
|
+ }
|
|
|
+
|
|
|
+ const dispatchRequest = async () => {
|
|
|
+ loading.value = true
|
|
|
+ const { data, sum } = await request.get({
|
|
|
+ ...request.params,
|
|
|
+ page: pagination.current,
|
|
|
+ pageSize: pagination.pageSize
|
|
|
+ })
|
|
|
+ loading.value = false
|
|
|
+ pagination.total = sum
|
|
|
+ dataSource.value = data
|
|
|
+ }
|
|
|
+
|
|
|
+ const init = () => {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ init()
|
|
|
+
|
|
|
return () => (
|
|
|
<>
|
|
|
- <a-row>
|
|
|
- <a-col></a-col>
|
|
|
- <a-col></a-col>
|
|
|
- </a-row>
|
|
|
- {/* <a-table
|
|
|
- columns={props.columns}
|
|
|
+ <Row gutter={[8, 8]}>
|
|
|
+ <Col>
|
|
|
+ <solt name="search" ></solt>
|
|
|
+ </Col>
|
|
|
+ <Col>
|
|
|
+ <Space>
|
|
|
+ <Tooltip title='列表定制' >
|
|
|
+ {/* @click.prevent */}
|
|
|
+ {/* <a class="ant-dropdown-link"> <menu-outlined /> </a> */}
|
|
|
+ <Dropdown
|
|
|
+ trigger={['click']}
|
|
|
+ overlay={
|
|
|
+ <Menu>
|
|
|
+ {
|
|
|
+ rowCustomized.value.map(item => (
|
|
|
+ <Menu.item key={item.key}>
|
|
|
+ {item.title}
|
|
|
+ </Menu.item>
|
|
|
+ ))
|
|
|
+ }
|
|
|
+ </Menu>}
|
|
|
+ >
|
|
|
+ </Dropdown>
|
|
|
+ </Tooltip>
|
|
|
+ {/* @click.prevent */}
|
|
|
+ {/* <a class="ant-dropdown-link"> <menu-outlined /> </a> */}
|
|
|
+ <DropdownButton
|
|
|
+ trigger={['click']}
|
|
|
+ overlay={opraMeun}
|
|
|
+ icon={<DownOutlined />}
|
|
|
+ onClick={dispatchRequest}
|
|
|
+ >
|
|
|
+ <Button>操作</Button>
|
|
|
+ </DropdownButton>
|
|
|
+ </Space>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Table
|
|
|
+ columns={columns}
|
|
|
loading={loading}
|
|
|
- pagination={props.pagination}
|
|
|
+ pagination={pagination}
|
|
|
+ dataSource={dataSource}
|
|
|
>
|
|
|
-
|
|
|
- </a-table> */}
|
|
|
+ <slot name='action'></slot>
|
|
|
+ </Table>
|
|
|
</>
|
|
|
)
|
|
|
}
|