/* * @Author: code4eat awesomedema@gmail.com * @Date: 2023-03-03 11:30:33 * @LastEditors: code4eat awesomedema@gmail.com * @LastEditTime: 2024-07-19 15:53:18 * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/index.tsx * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ import BMSPagecontainer from '@/components/BMSPageContainer'; import { BMSTable } from '@/components/BMSTable'; import { createFromIconfontCN } from '@ant-design/icons'; import { ActionType, useRefFunction } from '@ant-design/pro-components'; import { ModalForm, ProFormDigit, ProFormRadio, ProFormSelect, ProFormText } from '@ant-design/pro-form'; import { ProColumns } from '@ant-design/pro-table'; import { Dropdown, Input, MenuProps, message, Modal, Switch, Tooltip } from 'antd'; import { ColumnsType, TableRowSelection } from 'antd/es/table/interface'; import Transfer, { TransferItem, TransferProps } from 'antd/es/transfer'; import React from 'react'; import { useEffect, useImperativeHandle, useRef, useState } from 'react'; import difference from 'lodash/difference'; import { getReportColumn, getClolumnTableData, addReport, editReport, editReportTbaleData, delLeftReportData } from './service'; import './style.less'; import { addReportTableList, getReportListTableData, getReportListType } from '../reportListMana/service'; import { SortableContainer, SortableElement, SortableHandle } from 'react-sortable-hoc'; import '../../../../utils/zhongtaiB' import { arrayMoveImmutable } from 'array-move'; import { ReportListManaUpDataActBtn } from '../reportListMana/UpDataActBtn'; const IconFont = createFromIconfontCN({ scriptUrl: '', }); var temp_dataSource: any[] = []; let _currentSelectedType: any = undefined; const ReportSetting = () => { const [tableDataFilterParams, set_tableDataFilterParams] = useState(); const [tableDataSearchKeywords, set_tableDataSearchKeywords] = useState(''); const [typeList, set_typeList] = useState([]); const [showTypeListArr, set_showTypeListArr] = useState([]); const [currentSelectedType, set_currentSelectedType] = useState(undefined); const [dataSource, setDataSource] = useState([]); const SortableItem = SortableElement((props: any) => ); const SortContainer = SortableContainer((props: any) => ); const [currentEditLeftData, set_currentEditLeftData] = useState(undefined); const [currentEditRow,set_currentEditRow] = useState(undefined); const [ifEditTable, set_ifEditTable] = useState(false); const tableRef = useRef(); const DragHandle = SortableHandle(() => ); const column: ProColumns[] = [ { title: '列名称', width: 120, ellipsis: true, dataIndex: 'columnName', }, { title: '列标题', width: 160, dataIndex: 'columnHeaderText', }, { title: '列宽', width: 120, dataIndex: 'width', render: (num: any, record: any) => { let inputNum:any = 0; return (
{currentEditRow&¤tEditRow.id == record.id&&} {(!currentEditRow||(currentEditRow.id != record.id))&&
{num}
} {ifEditTable && editColWid(record,inputNum)} />}
) } }, { title: '主键', width: 120, dataIndex: 'primaryKey', render: (_: any, record: any) => { return switchChangeHandle(bool, record, 'primaryKey')} /> } }, { title: '隐藏', width: 120, dataIndex: 'hide', render: (_: any, record: any) => { return switchChangeHandle(bool, record, 'hide')} /> } }, { title: '固定', width: 120, dataIndex: 'freeze', render: (_: any, record: any) => { return switchChangeHandle(bool, record, 'freeze')} /> } }, { title: '排序', width: 120, dataIndex: 'sortStatus', render: (_: any, record: any) => { return switchChangeHandle(bool, record, 'sortStatus')} /> } }, { title: '检索', width: 120, dataIndex: 'search', render: (_: any, record: any) => { return switchChangeHandle(bool, record, 'search')} /> } }, { title: '操作', key: 'option', width: 90, fixed:'right', valueType: 'option', render: (_: any, record: any) => { return [ {getTableData({ reportCode: _currentSelectedType.code });}} key={'act'} record={{...record,id:null,request:true}} type='EDIT' />, ] }, }, ] const [tableColumn, set_tableColumn] = useState(column); const editColWid = (record:any,num:number)=>{ set_currentEditRow(currentEditRow?undefined:record); if(currentEditRow){ const newData = temp_dataSource.map((a: any) => { if (a.id == record.id) { return { ...a, width:num} } return a }); setDataSource([...newData]); } } const getTableData = async (params: any) => { const { reportCode } = params; if (reportCode) { const resp = await getClolumnTableData(params); if (resp) { //const dataSorted = resp.sort((prev:any,cur:any)=>prev.sort - cur.sort); setDataSource(resp); temp_dataSource = [...resp]; } } } const switchChangeHandle = (checked: boolean, record: any, key: string) => { const newData = temp_dataSource.map((a: any) => { if (a.id == record.id) { return { ...a, [`${key}`]: checked ? 1 : 0 } } return a }); setDataSource([...newData]); } //获取左侧单元 const getPageLeftReports = async () => { const resp = await getReportColumn(); if (resp) { set_typeList(resp); set_showTypeListArr(resp); } } const updateTable = async (formVal: any, type: 'EDIT' | "ADD" | 'ADD_LEFTDATA' | 'EDIT_LEFTDATA') => { // console.log({formVal,type}); if (type == 'ADD_LEFTDATA') { const resp = await addReport({ reportName: formVal.reportName, reportShortName: formVal.reportShortName, reportType: formVal.reportType, dateType:formVal.dateType }); if (resp) { getPageLeftReports(); } } if (type == 'EDIT_LEFTDATA') { const resp = await editReport({ id: formVal.id, reportName: formVal.reportName, reportShortName: formVal.reportShortName, reportType: formVal.reportType, dateType:formVal.dateType }); if (resp) { getPageLeftReports(); } } if (type == 'EDIT') { let newDataSource = dataSource.map((a: any, index: number) => { //更新排序 return { ...a, sort: index + 1 } }) const resp = await editReportTbaleData(newDataSource); set_ifEditTable(false); if (resp) { getTableData({ reportCode: currentSelectedType.code }); } } return true; } const UpDataActBtn = ({ record, type }: { record: any, type: 'EDIT' | 'ADD' | 'ADD_LEFTDATA' | 'EDIT_LEFTDATA' }) => { const getTrriger = () => { if (type == 'ADD') { return 新增 } if (type == 'EDIT') { return 编辑 } if (type == 'ADD_LEFTDATA') { return (
) } if (type == 'EDIT_LEFTDATA') { return 编辑 } } return ( { return updateTable(type == 'EDIT_LEFTDATA' ? { ...record, ...val } : val, type); }} > { const resp = await getReportListType(); if (resp) { return resp.list.map((a: any) => ({ label: a.name, value: a.code })) } }} rules={[{ required: true, message: '列类型不能为空!' }]} /> ) } interface DataType { key: string; title: string; description: string; disabled: boolean; tag: string; } interface TableTransferProps extends TransferProps { dataSource: DataType[]; leftColumns: ColumnsType; rightColumns: ColumnsType; record: any } const transferTableColumn: any[] = [ { title: '列名称', dataIndex: 'name', with: 100, ellipsis: true, key: 'name', }, { title: '列标题', width: 120, dataIndex: 'headerText', key: 'headerText', ellipsis: true }, ]; const addReportColumnHandle = () => { const ref = React.createRef<{ save: any; }>(); Modal.confirm({ title: `选择报表列`, icon: <>, width: 750, centered: true, okText: '确定', cancelText: '取消', content: , onOk: () => { return ref.current && ref.current.save(); } }) } const TableTransfer = React.forwardRef(({ leftColumns, rightColumns, record, ...restProps }: TableTransferProps, ref) => { const [targetKeys, setTargetKeys] = useState([]); const [datasource, set_datasource] = useState([]); const [selectedKeys, setSelectedKeys] = useState([]); //获取报表列管理 const getFuncList = async () => { const resp = await getReportListTableData({ pageSize: 100000, current: 1 }); if (resp) { set_datasource(resp.list); const defaultSelctedkeys = dataSource.map((item: any) => item.columnCode); setTargetKeys(defaultSelctedkeys); } } const onChange = (nextTargetKeys: string[]) => { setTargetKeys(nextTargetKeys); }; const onSelectChange = (sourceSelectedKeys: string[], targetSelectedKeys: string[]) => { //console.log('sourceSelectedKeys:', sourceSelectedKeys,'targetSelectedKeys:',targetSelectedKeys); setSelectedKeys([...sourceSelectedKeys, ...targetSelectedKeys]); }; useImperativeHandle(ref, () => ({ save: async () => { const needData = datasource.filter(item => targetKeys.includes(item.code)); const result = needData.map((a, index) => { const hasEditedInfo = dataSource.filter((c: any) => c.columnCode == a.code); return { reportCode: currentSelectedType.code, columnCode: a.code, columnHeaderText: a.headerText, columnName: a.name, sort: hasEditedInfo.length > 0 ? hasEditedInfo[0].sort : dataSource.length + 1, primaryKey: hasEditedInfo.length > 0 ? hasEditedInfo[0].primaryKey : 0, hide: hasEditedInfo.length > 0 ? hasEditedInfo[0].hide : 0, freeze: hasEditedInfo.length > 0 ? hasEditedInfo[0].freeze : 0, } }); const resp = await addReportTableList(result); if (resp) { message.success('添加成功!'); getTableData({ reportCode: currentSelectedType.code }); } } })); useEffect(() => { getFuncList(); }, []) return ( record.code} targetKeys={targetKeys} selectedKeys={selectedKeys} filterOption={(inputValue, item) => { return item.headerText!.indexOf(inputValue) !== -1 }} > {({ direction, filteredItems, onItemSelectAll, onItemSelect, selectedKeys: listSelectedKeys, disabled: listDisabled, }) => { // console.log({ filteredItems, listSelectedKeys,direction }); const columns = direction === 'left' ? leftColumns : rightColumns; const rowSelection: TableRowSelection = { getCheckboxProps: (item) => ({ disabled: listDisabled || item.disabled }), onSelectAll(selected, selectedRows) { const treeSelectedKeys = selectedRows.map(({ code }) => code); const diffKeys = selected ? difference(treeSelectedKeys, listSelectedKeys) : difference(listSelectedKeys, treeSelectedKeys); onItemSelectAll(diffKeys as string[], selected); }, onSelect({ code }, selected) { onItemSelect(code as string, selected); }, selectedRowKeys: listSelectedKeys, }; return ( false }} style={{ pointerEvents: listDisabled ? 'none' : undefined }} onRow={({ code, disabled: itemDisabled }) => ({ onClick: () => { if (itemDisabled || listDisabled) return; onItemSelect(code as string, !listSelectedKeys.includes(code as string)); }, })} /> ); }} ) }) const moreItems: MenuProps['items'] = [ { key: '1', label: , }, { key: '2', label: ( { e.preventDefault(); const resp = await delLeftReportData(currentEditLeftData.id); if (resp) { getPageLeftReports(); } }}> 删除 ), }, { key: '3', label: ( { e.preventDefault(); // 选取要复制的文本 const textToCopy = currentEditLeftData.code; // 创建一个临时的textarea元素 const tempTextArea = document.createElement("textarea"); tempTextArea.value = textToCopy; document.body.appendChild(tempTextArea); // 选中并复制文本 tempTextArea.select(); document.execCommand("copy"); // 移除临时元素 document.body.removeChild(tempTextArea); message.success('复制成功!'); }}> 复制报表code ), }, ]; const onSortEnd = useRefFunction( ({ oldIndex, newIndex }: { oldIndex: number; newIndex: number }) => { if (oldIndex !== newIndex) { const newData = arrayMoveImmutable([...dataSource], oldIndex, newIndex).filter((el) => !!el); const updatedSortArr = newData.map((item: any, index: number) => ({ ...item, sort: index })) setDataSource([...updatedSortArr]); } }, ); const DraggableContainer = (props: any) => ( ); const DraggableBodyRow = (props: any) => { const { className, style, ...restProps } = props; // function findIndex base on Table rowKey props and should always be a right array index const index = dataSource.findIndex((x) => x.id === restProps['data-row-key']); return ; }; useEffect(() => { if (currentSelectedType) { set_tableDataFilterParams({ ...tableDataFilterParams, reportCode: currentSelectedType.code }); getTableData({ reportCode: currentSelectedType.code }); } }, [currentSelectedType]) useEffect(() => { if (showTypeListArr.length > 0) { set_currentSelectedType(showTypeListArr[0]); _currentSelectedType = showTypeListArr[0]; set_tableDataFilterParams({ ...tableDataFilterParams, reportCode: showTypeListArr[0].code }); } }, [showTypeListArr]); useEffect(() => { if (ifEditTable) { set_tableColumn([{ title: '排序', dataIndex: 'sort', width: 60, className: 'drag-visible', render: () => }, ...column, ]) } else { set_tableColumn(column); } }, [ifEditTable,currentEditRow]); useEffect(() => { temp_dataSource = [...dataSource]; }, [dataSource]) useEffect(() => { getPageLeftReports(); }, []) return (
} style={{ width: 156 }} onChange={(e) => { const result = typeList.filter(item => item.reportName.indexOf(e.target.value) != -1); set_showTypeListArr(result); }} />
{ showTypeListArr.map((item, index) => { return (
{ if (ifEditTable) { //编辑状态还未保存 Modal.confirm({ title: '当前存在编辑未保存,请保存后再操作!', okText: '放弃编辑', cancelText: '继续编辑', onOk(...args) { set_ifEditTable(false); set_currentSelectedType(item); _currentSelectedType = item; getTableData({ reportCode: item.code }); }, }) } else { set_currentSelectedType(item); _currentSelectedType = item; } }} >
{item.reportName}
{item.reportTypeName}
{ bool && set_currentEditLeftData(item) }}>
) }) }
{!ifEditTable && set_ifEditTable(true)}>管理列} { ifEditTable && (
updateTable(undefined, 'EDIT')}>保存 addReportColumnHandle()}>添加列
) }
{currentSelectedType && }
) } export default ReportSetting;