UNPKG

fx-form-widget

Version:
371 lines (356 loc) 12.4 kB
import _Popconfirm from "antd/es/popconfirm"; import _message from "antd/es/message"; import _extends from "@babel/runtime/helpers/extends"; import _Button from "antd/es/button"; import React, { useCallback, useContext, useEffect, useRef, useState } from 'react'; import { PlusOutlined, CloudUploadOutlined } from '@ant-design/icons'; import { EditableProTable } from '@ant-design/pro-components'; import { setRules } from '../ContentWrap/renderWidget'; import { nanoid } from 'nanoid'; import { Widgets } from '../../widgets'; import { Context } from '../../index'; import BatchImportModal from '../BatchImportModal'; var DefaultWidgets = Widgets; var actions = { title: '操作', valueType: 'option', width: 80, render: function render() { return /*#__PURE__*/React.createElement(_Button, { type: "link" }); }, fixed: 'right', align: 'center' }; var serialNumber = { title: '序号', width: 80, editable: false, render: function render(_, __, index) { return index + 1; }, fixed: 'left', align: 'center' }; var renderTitle = function renderTitle(title, required) { // 外界自定义的节点,需要自己去加入星号以及其他操作 if (typeof title !== 'string') { return title; } // 渲染表格必填项 if (required) { return /*#__PURE__*/React.createElement("div", { className: "required-mask" }, title); } return title; }; var EditableTable = function EditableTable(props) { var ContentContext = useContext(Context); var onSchemaChange = ContentContext.onSchemaChange, formId = ContentContext.formId; var _props$schemaChildren = props.schemaChildrenData, schemaChildrenData = _props$schemaChildren === void 0 ? [] : _props$schemaChildren, _props$viewSchema = props.viewSchema, viewSchema = _props$viewSchema === void 0 ? {} : _props$viewSchema, _props$canEditable = props.canEditable, canEditable = _props$canEditable === void 0 ? true : _props$canEditable, schema = props.schema, wid = props.wid, value = props.value; var subFormAddButtonText = viewSchema.subFormAddButtonText, showActionButton = viewSchema.showActionButton, maxCountNumber = viewSchema.maxCountNumber, articlePageNumber = viewSchema.articlePageNumber, _viewSchema$showBulkI = viewSchema.showBulkImportButton, showBulkImportButton = _viewSchema$showBulkI === void 0 ? true : _viewSchema$showBulkI, title = viewSchema.title, readonly = viewSchema.readonly, showSerialNumberButton = viewSchema.showSerialNumberButton; var _useState = useState(false), visible = _useState[0], setVisible = _useState[1]; var _useState2 = useState([]), columns = _useState2[0], setColumns = _useState2[1]; var _useState3 = useState({}), dataColumns = _useState3[0], setDataColumns = _useState3[1]; var _useState4 = useState([]), dataSource = _useState4[0], setDataSource = _useState4[1]; var _useState5 = useState([]), editableKeys = _useState5[0], setEditableRowKeys = _useState5[1]; var formRef = useRef(); var _useState6 = useState(1), current = _useState6[0], setCurrent = _useState6[1]; var allDataSource = useRef(value || []); // 将所有的数据进行输出 var onDataChange = function onDataChange(value) { var newSchema = _extends({}, schema); newSchema.viewSchema.data = value; onSchemaChange('edit', newSchema); }; var onChange = function onChange(value) { var _props$onChange; setDataSource(value); removeDataSources(allDataSource.current, value); onDataChange(allDataSource.current); (_props$onChange = props.onChange) === null || _props$onChange === void 0 ? void 0 : _props$onChange.call(props, value); }; var removeDataSource = function removeDataSource(dataSource, column) { var editableId = column.editableId; var index = dataSource.findIndex(function (data) { return data.editableId === editableId; }); if (index < 0) { return; } dataSource.splice(index, 1, column); }; var removeDataSources = function removeDataSources(dataSource, columns) { columns.forEach(function (column) { removeDataSource(dataSource, column); }); }; // 将subform中的内容转化为tableClounm var renderSubForm2TablClounm = function renderSubForm2TablClounm(children, showActionButton, showSerialNumberButton) { var columns = children.map(function (schemaData) { var wid = schemaData.wid, widget = schemaData.widget, filename = schemaData.filename, viewSchema = schemaData.viewSchema; var _ref = viewSchema, title = _ref.title, required = _ref.required; var dataIndex = filename ? filename : wid; var Widget = DefaultWidgets[widget]; return { title: renderTitle(title, required), dataIndex: dataIndex, key: dataIndex, width: 150, formItemProps: { rules: required ? setRules(viewSchema) : [] }, renderFormItem: function renderFormItem() { if (!Widget) { return null; } return /*#__PURE__*/React.createElement(Widget, { schema: viewSchema }); } }; }); if (showActionButton) { columns.push(actions); } if (showSerialNumberButton) { columns.unshift(serialNumber); } setColumns(columns); }; // 如果当前页大于每一页,就向后前进一页,如果删除页当前数据为空前进一页 var gotoPrevPageOrNextPage = function gotoPrevPageOrNextPage(current, data) { // 前面一页添加满了以后第二页进行自动添加 if (data.length === +articlePageNumber) { setCurrent(current + 1); getSliceDataSource(current + 1); return; } // 当前页为一条数据,删除以后应该回到前面一页 if (data.length === 1 && current > 1) { setCurrent(current - 1); getSliceDataSource(current - 1); return; } if (data.length === 1 && current === 1) { setDataSource([]); } }; // 新增一行 var handleAddTabelColum = function handleAddTabelColum() { var newDataSource = [].concat(allDataSource.current, [_extends({}, dataColumns, { editableId: nanoid(6) })]); allDataSource.current = newDataSource; onDataChange(allDataSource.current); // message.success('新增成功'); var newEditableRowKeys = newDataSource.map(function (item) { return item.editableId; }); setEditableRowKeys(newEditableRowKeys); if (dataSource.length < +articlePageNumber) { getSliceDataSource(current); return; } gotoPrevPageOrNextPage(current, dataSource); }; // 批量导入 var handleAddTabelColumByBatchimport = function handleAddTabelColumByBatchimport() { // 计算本次导入还可以导入多少条 // const canBatchImportTotal = +maxCountNumber! - allDataSource.current.length; // if (canBatchImportTotal < 0) { // return; // } // // 批量导入接口返回的数据 // allDataSource.current = [...allDataSource.current,...[]]; // onDataChange(allDataSource.current); setVisible(true); }; // 全部导入 var handleAllExportByExcel = function handleAllExportByExcel() {}; useEffect(function () { renderSubForm2TablClounm(schemaChildrenData, showActionButton, showSerialNumberButton); }, [schemaChildrenData, showActionButton, showSerialNumberButton]); // 监听删除某一项数据 var onDeleteColunm = function onDeleteColunm(id) { var index = allDataSource.current.findIndex(function (dataSoure) { return dataSoure.editableId === id; }); var newEditableKeys = [].concat(editableKeys); var editableKeysIndex = newEditableKeys.findIndex(function (editableId) { return editableId === id; }); if (index < 0) { return; } allDataSource.current.splice(index, 1); onDataChange(allDataSource.current); if (editableKeysIndex < 0) { return; } newEditableKeys.splice(index, 1); setEditableRowKeys(newEditableKeys); _message.success('删除成功'); if (dataSource.length === 1) { gotoPrevPageOrNextPage(current, dataSource); return; } getSliceDataSource(current); }; var onCurrentePageChange = function onCurrentePageChange(current) { setCurrent(current); getSliceDataSource(current); }; // 获取分页以后的数据 var getSliceDataSource = function getSliceDataSource(current) { var prevTotal = (current - 1) * +articlePageNumber; var total = current * +articlePageNumber; var newDataSoure = allDataSource.current.slice(prevTotal, total); setDataSource(newDataSoure); }; // 缓存事件 var handleCloseClick = useCallback(function () { setVisible(false); }, []); var handleOkClick = useCallback(function (tableData) { setVisible(false); if (!tableData || !tableData.length) { return; } allDataSource.current = [].concat(tableData.slice(0, maxCountNumber - allDataSource.current.length), allDataSource.current); // 导入数据完成以后返回第一页 var newEditableRowKeys = allDataSource.current.map(function (item) { return item.editableId; }); setEditableRowKeys(newEditableRowKeys); onDataChange(allDataSource.current); getSliceDataSource(1); }, []); useEffect(function () { var dataColumns = {}; schemaChildrenData.forEach(function (schemaData) { var wid = schemaData.wid, filename = schemaData.filename; var dataIndex = filename ? filename : wid; dataColumns[dataIndex] = void 0; }); setDataColumns(dataColumns); }, [schemaChildrenData]); var renderButton = function renderButton(showActionButton, title, icon, onClick) { if (allDataSource.current.length >= maxCountNumber) { return null; } if (showActionButton) { return /*#__PURE__*/React.createElement(_Button, { ghost: true, disabled: readonly, size: "small", icon: icon, type: "primary", onClick: onClick }, title); } return null; }; useEffect(function () { if (!value) { return; } allDataSource.current = value; setDataSource(value.slice(0, Number(articlePageNumber))); var defalutEditableKeys = value.map(function (item) { return item.editableId; }); setEditableRowKeys(defalutEditableKeys); }, [value]); var pagination = { showSizeChanger: true, current: current, total: allDataSource.current.length, pageSize: articlePageNumber, pageSizeOptions: [articlePageNumber], onChange: onCurrentePageChange }; return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(EditableProTable, { bordered: true, columns: columns, rowKey: "editableId", value: dataSource, formRef: formRef, scroll: { x: true }, recordCreatorProps: false, headerTitle: title, maxLength: maxCountNumber, pagination: pagination, controlled: true, onChange: onChange, toolBarRender: function toolBarRender() { return [renderButton(true, subFormAddButtonText, /*#__PURE__*/React.createElement(PlusOutlined, null), handleAddTabelColum), renderButton(showBulkImportButton, '批量导入', /*#__PURE__*/React.createElement(CloudUploadOutlined, null), handleAddTabelColumByBatchimport)]; }, editable: { type: 'multiple', editableKeys: canEditable ? editableKeys : [], actionRender: function actionRender(record) { var editableId = record.editableId; var handleDeleteClick = function handleDeleteClick() { onDeleteColunm(editableId); }; return [/*#__PURE__*/React.createElement(_Popconfirm, { title: "\u5220\u9664\u6B64\u884C\uFF1F", onConfirm: handleDeleteClick, okText: "\u786E\u5B9A", key: "delete", cancelText: "\u53D6\u6D88" }, /*#__PURE__*/React.createElement(_Button, { type: "link" }, "\u5220\u9664"))]; } } }), /*#__PURE__*/React.createElement(BatchImportModal, { visible: visible, formId: formId, subformWid: wid, maxCount: maxCountNumber, onCancel: handleCloseClick, getImportData: handleOkClick })); }; export default EditableTable;