import { Empty, Table, List, Row, Col, Drawer, Spin } from "antd" import React, { CSSProperties, useEffect } from "react" import zh_cn from "antd/es/locale/zh_CN" import { BaseService } from "../../base" import { EventHandlerParams } from "../../../@types/Base" import { defaultClassName } from "../../../@types/Table" import { DragAndResize } from "./service/DragAndResize"; import { IObservableObject } from 'mobx' import { Base } from "./service/Base" import { QueryCondition } from "./service/QueryCondition" import { TableFooter } from "./service/TableFooter" import { TableHeader } from "./service/TableHeader" import { RowSelection } from "./service/RowSelection" import { observer } from 'mobx-react' import { StateManage } from "../../../service/state" import { PropertyService } from "../../../service/property" import { DeleteOutlined } from '@ant-design/icons' import cloneDeep from "lodash/cloneDeep" export class Service extends BaseService { mobx: IObservableObject orderBy: any[] filterCondition: any[] locale: object rowKey: string fullscreenStyle: CSSProperties initScroll: any customerColumns: object[] initDefaultCondition: any getRowKey: any toggleFullscreen: any renderDisableModal: any getQueryCondition: any updateQueryCondition: any invokeSearch: any onChangeEvent: any onClickRow: any renderRowButton: any renderDeleteTag: any deleteRows: any rowSelection: any getExpandableConfig: any getColumnsByButtonConfig: any getNewColumns: any renderHeader: any renderCustomerColumns: any renderCheckedUIbyCheckedRows: any renderFooter: any renderPagination: any draggableBodyContainer: any draggableBodyRow: any ResizeableTitle: any drawerModalState: any checkedDataList: any containerId: string // getDataSource: any deleteRows2: any searchInput: any fullscreenButton: any refreshButton: any headerButton: any filterSetting: any customerColumnsSetting: any getExpandedKeys: any constructor(props: any) { super(props) this.containerId = defaultClassName + "-" + (Math.random() * 100000).toFixed(0) this.mobx = props.mobx this.orderBy = [] this.filterCondition = [] this.rowKey = "" this.fullscreenStyle = { position: "fixed", zIndex: 1000, top: "0px", bottom: "0px", left: "0px", right: "0px", background: "#fff" } this.locale = { emptyText: , ...zh_cn.Table } const { scroll } = this.getProps() this.initScroll = scroll this.customerColumns = [] this.initDefaultCondition = Base.initDefaultCondition.bind(this) this.getProps = Base.getProps.bind(this) this.setProps = Base.setProps.bind(this) this.getRowKey = Base.getRowKey.bind(this) this.toggleFullscreen = Base.toggleFullscreen.bind(this) this.renderDisableModal = Base.renderDisableModal.bind(this) this.getExpandedKeys = Base.getExpandedKeys.bind(this) // this.getDataSource = Base.getDataSource.bind(this) this.getQueryCondition = QueryCondition.getQueryCondition.bind(this) this.updateQueryCondition = QueryCondition.updateQueryCondition.bind(this) this.invokeSearch = QueryCondition.invokeSearch.bind(this) this.onChangeEvent = QueryCondition.onChangeEvent.bind(this) this.onClickRow = RowSelection.onClickRow.bind(this) this.renderRowButton = RowSelection.renderRowButton.bind(this) this.renderDeleteTag = RowSelection.renderDeleteTag.bind(this) this.deleteRows = RowSelection.deleteRows.bind(this) this.renderDeleteTag = RowSelection.renderDeleteTag.bind(this) this.rowSelection = RowSelection.rowSelection.bind(this) this.getExpandableConfig = RowSelection.getExpandableConfig.bind(this) this.deleteRows2 = RowSelection.deleteRows2.bind(this) this.getColumnsByButtonConfig = TableHeader.getColumnsByButtonConfig.bind(this) this.getNewColumns = TableHeader.getNewColumns.bind(this) this.renderHeader = TableHeader.renderHeader.bind(this) this.renderCustomerColumns = TableHeader.renderCustomerColumns.bind(this) this.searchInput = TableHeader.searchInput.bind(this) this.fullscreenButton = TableHeader.fullscreenButton.bind(this) this.refreshButton = TableHeader.refreshButton.bind(this) this.headerButton = TableHeader.headerButton.bind(this) this.filterSetting = TableHeader.filterSetting.bind(this) this.customerColumnsSetting = TableHeader.customerColumnsSetting.bind(this) this.renderCheckedUIbyCheckedRows = TableFooter.renderCheckedUIbyCheckedRows.bind(this) this.renderFooter = TableFooter.renderFooter.bind(this) this.renderPagination = TableFooter.renderPagination.bind(this) this.draggableBodyContainer = DragAndResize.draggableBodyContainer.bind(this) this.draggableBodyRow = DragAndResize.draggableBodyRow.bind(this) this.ResizeableTitle = DragAndResize.ResizeableTitle.bind(this) this.drawerModalState = PropertyService.getObservableObj({ visible: false }) this.checkedDataList = PropertyService.getObservableObj({ checkedData: [] }) } /** * @description 获取类名 */ getClassName() { const { className } = this.getProps() let nextClassName = super.getClassName(defaultClassName) if (className) { nextClassName.push(className) } return nextClassName } /** * @description 事件处理 */ eventHandler(params: EventHandlerParams) { } /** * @description 已列表方式展示选中数据 */ showCheckedDataList(this: any) { const { footer = {} } = this.getProps() if (footer.show !== true) return const rowKey = this.getRowKey() const self = this const drawerModalState = this.drawerModalState const checkedDataList = this.checkedDataList const CheckedDataList = observer(function () { const { checkedData } = StateManage.get(checkedDataList) const deleteCheckedData = function (item: any) { const nextCheckedData = checkedData.filter((data: any) => data[rowKey] !== item[rowKey]) StateManage.set(checkedDataList, { checkedData: nextCheckedData }) } return }} renderItem={(item: any) => { return deleteCheckedData(item)} /> {footer.render ? footer.render({ record: item }) : item[footer.label]} }} /> }) const DrawerModal = observer(function () { const { visible } = StateManage.get(drawerModalState) const { checkedData } = StateManage.get(checkedDataList) const onClose = function () { StateManage.set(drawerModalState, { visible: false }) self.renderCheckedUIbyCheckedRows(checkedData) } if (!visible) return null return }) return } /** * @description 获取组件模板 */ getTemplate() { let { showHeader, className, scroll = {}, size, show, expandedKeys, bordered, loading, disabled, fullscreen, dataSource } = this.getProps() useEffect(() => { this.customerColumns = cloneDeep(this.getNewColumns()) const { httpConfig, footer: { label, key } } = this.getProps() const { rowSelection: { checkedKeys = [] } } = this.getProps() const { init } = httpConfig const rowKey = this.getRowKey() // 初始化 this.initDefaultCondition() this.setProps({ getQueryCondition: this.getQueryCondition.bind(this) }) if (init && typeof init === "function") { this.setProps({ loading: true }) init({ checkedKeys, rowKey }).then(({ data, total, checkedRows = [] }) => { const checkedTags = checkedRows.map(row => ({ key, label: row[label] })) const realCheckedKeys = checkedRows.map(row => row[rowKey]) this.setProps({ "rowSelection.checkedKeys": realCheckedKeys, "rowSelection.checkedRows": checkedRows, "rowSelection.checkedTags": checkedTags, dataSource: data, loading: false, "pagination.total": total || 0, "pagination.page": 1 }) }) } }, []) if (!show) return null className = this.getClassName() return
{disabled === true ? this.renderDisableModal() : null} column.show !== false)} rowKey={this.getRowKey()} loading={loading} pagination={this.renderPagination()} onChange={this.onChangeEvent.bind(this)} rowSelection={this.rowSelection.call(this) as any} scroll={{ ...scroll, scrollToFirstRowOnChange: scroll.isToTop === false ? false : true }} size={size} locale={this.locale} bordered={bordered} components={{ // body: { // wrapper: this.draggableBodyContainer.bind(this), // row: this.draggableBodyRow.bind(this), // }, // header: { // cell: this.ResizeableTitle, // } }} onRow={this.onClickRow.bind(this)} showHeader={showHeader} expandable={this.getExpandableConfig.call(this)} title={this.renderHeader.bind(this)} footer={this.renderFooter.bind(this)} expandedRowKeys={expandedKeys} /> {this.showCheckedDataList.call(this)} } }