import React, { Component } from 'react' import { Button, Card, Form, Input, message as Message, Popconfirm } from 'antd' import { AntIcon, Auth, Container, ModalForm, QueryTable, QueryTableActions, QueryTreeLayout, } from 'components' import { api } from 'common/api' import auth from 'components/authorized/handler' import { toCamelCase } from 'util/format' import { isEqual } from 'lodash' import getDictData from 'util/dic' import FormBody from './form' const apiAction = { tree: api.getAreaTree, page: api.sysAreaPage, add: api.sysAreaAdd, edit: api.sysAreaEdit, delete: api.sysAreaDelete, } const name = '区域' export default class index extends Component { state = { codes: { areacodeType: [], }, } // 表格实例 table = React.createRef() // 新增窗口实例 addForm = React.createRef() // 编辑窗口实例 editForm = React.createRef() // 树选中节点 selectCode = undefined columns = [ { title: '区域类型', dataIndex: 'levelType', sorter: true, width: 100, render: text => <>{this.bindCodeValue(text, 'areacode_type')}, }, { title: '区域名称', dataIndex: 'name', width: 100, sorter: true, }, { title: '区域编号', dataIndex: 'code', width: 100, sorter: true, }, { title: '行政编号', dataIndex: 'adCode', width: 100, sorter: true, defaultSortOrder: 'ascend', }, { title: '描述', dataIndex: 'note', width: 200, sorter: false, }, { title: '排序', dataIndex: 'sort', width: 80, sorter: true, }, ] /** * 构造函数,在渲染前动态添加操作字段等 * @param {*} props */ constructor(props) { super(props) const flag = auth({ sysArea: [['edit'], ['delete']] }) if (flag) { this.columns.push({ title: '操作', width: 150, dataIndex: 'actions', render: (text, record) => ( this.onOpen(this.editForm, record)}>编辑 this.onDelete(record)} > 删除 ), }) } } /** * 阻止外部组件引发的渲染,提升性能 * 可自行添加渲染条件 * [必要] * @param {*} props * @param {*} state * @returns */ shouldComponentUpdate(props, state) { return !isEqual(this.state, state) } /** * 加载字典数据,之后开始加载表格数据 * 如果必须要加载字典数据,可直接对表格设置autoLoad=true */ componentDidMount() { this.table.current.onLoading() getDictData('areacode_type').then(res => { this.setState( { codes: res, }, () => { this.table.current.onLoadData() } ) }) } /** * 调用加载数据接口,可在调用前对query进行处理 * [异步,必要] * @param {*} params * @param {*} query * @returns */ loadData = async (params, query) => { query = { ...query, pcode: this.selectCode, } //首次加载根据code列升序排序 if (!params.sortField) { params.sortField = 'code' params.sortOrder = 'ascend' } const { data } = await apiAction.page({ ...params, ...query, }) return data } /** * 调用树结构数据接口 * [异步,必要] * @returns */ loadTreeData = async () => { const { data } = await apiAction.tree() return data } /** * 树节点选中事件 * [必要] * @param {*} id */ onSelectTree(code) { this.selectCode = code this.table.current.onReloadData() } /** * 绑定字典数据 * @param {*} code * @param {*} name * @returns */ bindCodeValue(code, name) { name = toCamelCase(name) const codes = this.state.codes[name] if (codes) { const c = codes.find(p => +p.code === code) if (c) { return c.value } } return null } /** * 打开新增/编辑弹窗 * @param {*} modal * @param {*} record */ onOpen(modal, record) { modal.current.open({ pcode: this.pcode, record, }) } /** * 对表格上的操作进行统一处理 * [异步] * @param {*} action * @param {*} successMessage */ async onAction(action, successMessage) { this.table.current.onLoading() try { await action Message.success(successMessage) this.table.current.onReloadData() } catch { this.table.current.onLoaded() } } /** * 删除 * @param {*} record */ onDelete(record) { this.onAction(apiAction.delete(record), '删除成功') } render() { return ( this.onSelectTree(key)} replaceFields={{ value: 'code', title: 'name', children: 'children' }} > } operator={ } > this.table.current.onReloadData()} > this.table.current.onReloadData()} > ) } }