index.tsx 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  1. /*
  2. * @Author: code4eat awesomedema@gmail.com
  3. * @Date: 2023-03-03 11:30:33
  4. * @LastEditors: code4eat awesomedema@gmail.com
  5. * @LastEditTime: 2024-07-19 15:53:18
  6. * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/index.tsx
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. */
  9. import BMSPagecontainer from '@/components/BMSPageContainer';
  10. import { BMSTable } from '@/components/BMSTable';
  11. import { createFromIconfontCN } from '@ant-design/icons';
  12. import { ActionType, useRefFunction } from '@ant-design/pro-components';
  13. import { ModalForm, ProFormDigit, ProFormRadio, ProFormSelect, ProFormText } from '@ant-design/pro-form';
  14. import { ProColumns } from '@ant-design/pro-table';
  15. import { Dropdown, Input, MenuProps, message, Modal, Switch, Tooltip } from 'antd';
  16. import { ColumnsType, TableRowSelection } from 'antd/es/table/interface';
  17. import Transfer, { TransferItem, TransferProps } from 'antd/es/transfer';
  18. import React from 'react';
  19. import { useEffect, useImperativeHandle, useRef, useState } from 'react';
  20. import difference from 'lodash/difference';
  21. import { getReportColumn, getClolumnTableData, addReport, editReport, editReportTbaleData, delLeftReportData } from './service';
  22. import './style.less';
  23. import { addReportTableList, getReportListTableData, getReportListType } from '../reportListMana/service';
  24. import { SortableContainer, SortableElement, SortableHandle } from 'react-sortable-hoc';
  25. import '../../../../utils/zhongtaiB'
  26. import { arrayMoveImmutable } from 'array-move';
  27. import { ReportListManaUpDataActBtn } from '../reportListMana/UpDataActBtn';
  28. const IconFont = createFromIconfontCN({
  29. scriptUrl: '',
  30. });
  31. var temp_dataSource: any[] = [];
  32. let _currentSelectedType: any = undefined;
  33. const ReportSetting = () => {
  34. const [tableDataFilterParams, set_tableDataFilterParams] = useState<any | undefined>();
  35. const [tableDataSearchKeywords, set_tableDataSearchKeywords] = useState<string>('');
  36. const [typeList, set_typeList] = useState<any[]>([]);
  37. const [showTypeListArr, set_showTypeListArr] = useState<any[]>([]);
  38. const [currentSelectedType, set_currentSelectedType] = useState<any | undefined>(undefined);
  39. const [dataSource, setDataSource] = useState<any[]>([]);
  40. const SortableItem = SortableElement((props: any) => <tr {...props} />);
  41. const SortContainer = SortableContainer((props: any) => <tbody {...props} />);
  42. const [currentEditLeftData, set_currentEditLeftData] = useState<any | undefined>(undefined);
  43. const [currentEditRow,set_currentEditRow] = useState<any>(undefined);
  44. const [ifEditTable, set_ifEditTable] = useState(false);
  45. const tableRef = useRef<ActionType>();
  46. const DragHandle = SortableHandle(() => <img width={16} style={{ cursor: 'pointer' }} src={require('../../../../../static/tuozhuai_icon.png')} alt="" />);
  47. const column: ProColumns[] = [
  48. {
  49. title: '列名称',
  50. width: 120,
  51. ellipsis: true,
  52. dataIndex: 'columnName',
  53. },
  54. {
  55. title: '列标题',
  56. width: 160,
  57. dataIndex: 'columnHeaderText',
  58. },
  59. {
  60. title: '列宽',
  61. width: 120,
  62. dataIndex: 'width',
  63. render: (num: any, record: any) => {
  64. let inputNum:any = 0;
  65. return (
  66. <div style={{display:'flex',flexDirection:'row',justifyContent:'flex-start',alignItems:'center'}}>
  67. {currentEditRow&&currentEditRow.id == record.id&&<ProFormDigit noStyle width={70} fieldProps={{
  68. defaultValue:num,
  69. onChange(value) {
  70. inputNum = value?value:100
  71. },
  72. }} />}
  73. {(!currentEditRow||(currentEditRow.id != record.id))&&<div style={{width:70}}>{num}</div>}
  74. {ifEditTable && <IconFont style={{color:'#17181A',cursor:'pointer',marginLeft:10}} type={(currentEditRow&&currentEditRow.id == record.id)?'icon-queren':'icon-xiugai'} onClick={()=>editColWid(record,inputNum)} />}
  75. </div>
  76. )
  77. }
  78. },
  79. {
  80. title: '主键',
  81. width: 120,
  82. dataIndex: 'primaryKey',
  83. render: (_: any, record: any) => {
  84. return <Switch disabled={!ifEditTable} size='small' checked={_} onChange={(bool) => switchChangeHandle(bool, record, 'primaryKey')} />
  85. }
  86. },
  87. {
  88. title: '隐藏',
  89. width: 120,
  90. dataIndex: 'hide',
  91. render: (_: any, record: any) => {
  92. return <Switch disabled={!ifEditTable} size='small' checked={_} onChange={(bool) => switchChangeHandle(bool, record, 'hide')} />
  93. }
  94. },
  95. {
  96. title: '固定',
  97. width: 120,
  98. dataIndex: 'freeze',
  99. render: (_: any, record: any) => {
  100. return <Switch disabled={!ifEditTable} size='small' checked={_ == '1'} onChange={(bool) => switchChangeHandle(bool, record, 'freeze')} />
  101. }
  102. },
  103. {
  104. title: '排序',
  105. width: 120,
  106. dataIndex: 'sortStatus',
  107. render: (_: any, record: any) => {
  108. return <Switch disabled={!ifEditTable} size='small' checked={_ == '1'} onChange={(bool) => switchChangeHandle(bool, record, 'sortStatus')} />
  109. }
  110. },
  111. {
  112. title: '检索',
  113. width: 120,
  114. dataIndex: 'search',
  115. render: (_: any, record: any) => {
  116. return <Switch disabled={!ifEditTable} size='small' checked={_ == '1'} onChange={(bool) => switchChangeHandle(bool, record, 'search')} />
  117. }
  118. },
  119. {
  120. title: '操作',
  121. key: 'option',
  122. width: 90,
  123. fixed:'right',
  124. valueType: 'option',
  125. render: (_: any, record: any) => {
  126. return [
  127. <ReportListManaUpDataActBtn onFinishedhandle={()=>{getTableData({ reportCode: _currentSelectedType.code });}} key={'act'} record={{...record,id:null,request:true}} type='EDIT' />,
  128. ]
  129. },
  130. },
  131. ]
  132. const [tableColumn, set_tableColumn] = useState<ProColumns[] | any[]>(column);
  133. const editColWid = (record:any,num:number)=>{
  134. set_currentEditRow(currentEditRow?undefined:record);
  135. if(currentEditRow){
  136. const newData = temp_dataSource.map((a: any) => {
  137. if (a.id == record.id) {
  138. return { ...a, width:num}
  139. }
  140. return a
  141. });
  142. setDataSource([...newData]);
  143. }
  144. }
  145. const getTableData = async (params: any) => {
  146. const { reportCode } = params;
  147. if (reportCode) {
  148. const resp = await getClolumnTableData(params);
  149. if (resp) {
  150. //const dataSorted = resp.sort((prev:any,cur:any)=>prev.sort - cur.sort);
  151. setDataSource(resp);
  152. temp_dataSource = [...resp];
  153. }
  154. }
  155. }
  156. const switchChangeHandle = (checked: boolean, record: any, key: string) => {
  157. const newData = temp_dataSource.map((a: any) => {
  158. if (a.id == record.id) {
  159. return { ...a, [`${key}`]: checked ? 1 : 0 }
  160. }
  161. return a
  162. });
  163. setDataSource([...newData]);
  164. }
  165. //获取左侧单元
  166. const getPageLeftReports = async () => {
  167. const resp = await getReportColumn();
  168. if (resp) {
  169. set_typeList(resp);
  170. set_showTypeListArr(resp);
  171. }
  172. }
  173. const updateTable = async (formVal: any, type: 'EDIT' | "ADD" | 'ADD_LEFTDATA' | 'EDIT_LEFTDATA') => {
  174. // console.log({formVal,type});
  175. if (type == 'ADD_LEFTDATA') {
  176. const resp = await addReport({
  177. reportName: formVal.reportName,
  178. reportShortName: formVal.reportShortName,
  179. reportType: formVal.reportType,
  180. dateType:formVal.dateType
  181. });
  182. if (resp) {
  183. getPageLeftReports();
  184. }
  185. }
  186. if (type == 'EDIT_LEFTDATA') {
  187. const resp = await editReport({
  188. id: formVal.id,
  189. reportName: formVal.reportName,
  190. reportShortName: formVal.reportShortName,
  191. reportType: formVal.reportType,
  192. dateType:formVal.dateType
  193. });
  194. if (resp) {
  195. getPageLeftReports();
  196. }
  197. }
  198. if (type == 'EDIT') {
  199. let newDataSource = dataSource.map((a: any, index: number) => {
  200. //更新排序
  201. return { ...a, sort: index + 1 }
  202. })
  203. const resp = await editReportTbaleData(newDataSource);
  204. set_ifEditTable(false);
  205. if (resp) {
  206. getTableData({ reportCode: currentSelectedType.code });
  207. }
  208. }
  209. return true;
  210. }
  211. const UpDataActBtn = ({ record, type }: { record: any, type: 'EDIT' | 'ADD' | 'ADD_LEFTDATA' | 'EDIT_LEFTDATA' }) => {
  212. const getTrriger = () => {
  213. if (type == 'ADD') {
  214. return <span className='add'>新增</span>
  215. }
  216. if (type == 'EDIT') {
  217. return <a key="edit" >编辑</a>
  218. }
  219. if (type == 'ADD_LEFTDATA') {
  220. return (
  221. <div className='add'>
  222. <img src={require('../../../../../static/addIcon_black.png')} alt="" />
  223. </div>
  224. )
  225. }
  226. if (type == 'EDIT_LEFTDATA') {
  227. return <a key="edit" >编辑</a>
  228. }
  229. }
  230. return (
  231. <ModalForm
  232. title={type == 'ADD_LEFTDATA' ? `新增报表` : `编辑报表`}
  233. width={352}
  234. initialValues={type == 'EDIT_LEFTDATA' ? { ...record } : {}}
  235. trigger={
  236. getTrriger()
  237. }
  238. onFinish={(val) => {
  239. return updateTable(type == 'EDIT_LEFTDATA' ? { ...record, ...val } : val, type);
  240. }}
  241. >
  242. <ProFormText
  243. label='报表名称:'
  244. name='reportName'
  245. rules={[{ required: true, message: '报表名称不能为空!' }]}
  246. />
  247. <ProFormText
  248. label='报表简称:'
  249. name='reportShortName'
  250. rules={[{ required: true, message: '报表简称不能为空!' }]}
  251. />
  252. <ProFormSelect
  253. name="reportType"
  254. label="报表类型:"
  255. placeholder="请选择"
  256. request={async () => {
  257. const resp = await getReportListType();
  258. if (resp) {
  259. return resp.list.map((a: any) => ({ label: a.name, value: a.code }))
  260. }
  261. }}
  262. rules={[{ required: true, message: '列类型不能为空!' }]}
  263. />
  264. <ProFormRadio.Group
  265. name="dateType"
  266. label="日期类型:"
  267. options={[
  268. {
  269. label: '单个月份',
  270. value: 0,
  271. },
  272. {
  273. label: '月份区间 ',
  274. value: 1,
  275. },
  276. {
  277. label: '日期区间',
  278. value: 2,
  279. },
  280. ]}
  281. rules={[{ required: true, message: '日期类型不能为空!' }]}
  282. />
  283. </ModalForm>
  284. )
  285. }
  286. interface DataType {
  287. key: string;
  288. title: string;
  289. description: string;
  290. disabled: boolean;
  291. tag: string;
  292. }
  293. interface TableTransferProps extends TransferProps<TransferItem> {
  294. dataSource: DataType[];
  295. leftColumns: ColumnsType<DataType>;
  296. rightColumns: ColumnsType<DataType>;
  297. record: any
  298. }
  299. const transferTableColumn: any[] = [
  300. {
  301. title: '列名称',
  302. dataIndex: 'name',
  303. with: 100,
  304. ellipsis: true,
  305. key: 'name',
  306. },
  307. {
  308. title: '列标题',
  309. width: 120,
  310. dataIndex: 'headerText',
  311. key: 'headerText',
  312. ellipsis: true
  313. },
  314. ];
  315. const addReportColumnHandle = () => {
  316. const ref = React.createRef<{ save: any; }>();
  317. Modal.confirm({
  318. title: `选择报表列`,
  319. icon: <></>,
  320. width: 750,
  321. centered: true,
  322. okText: '确定',
  323. cancelText: '取消',
  324. content: <TableTransfer
  325. ref={ref}
  326. record={undefined}
  327. leftColumns={transferTableColumn}
  328. rightColumns={transferTableColumn} dataSource={[]}
  329. ></TableTransfer>,
  330. onOk: () => {
  331. return ref.current && ref.current.save();
  332. }
  333. })
  334. }
  335. const TableTransfer = React.forwardRef(({ leftColumns, rightColumns, record, ...restProps }: TableTransferProps, ref) => {
  336. const [targetKeys, setTargetKeys] = useState<string[]>([]);
  337. const [datasource, set_datasource] = useState<any[]>([]);
  338. const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
  339. //获取报表列管理
  340. const getFuncList = async () => {
  341. const resp = await getReportListTableData({ pageSize: 100000, current: 1 });
  342. if (resp) {
  343. set_datasource(resp.list);
  344. const defaultSelctedkeys = dataSource.map((item: any) => item.columnCode);
  345. setTargetKeys(defaultSelctedkeys);
  346. }
  347. }
  348. const onChange = (nextTargetKeys: string[]) => {
  349. setTargetKeys(nextTargetKeys);
  350. };
  351. const onSelectChange = (sourceSelectedKeys: string[], targetSelectedKeys: string[]) => {
  352. //console.log('sourceSelectedKeys:', sourceSelectedKeys,'targetSelectedKeys:',targetSelectedKeys);
  353. setSelectedKeys([...sourceSelectedKeys, ...targetSelectedKeys]);
  354. };
  355. useImperativeHandle(ref, () => ({
  356. save: async () => {
  357. const needData = datasource.filter(item => targetKeys.includes(item.code));
  358. const result = needData.map((a, index) => {
  359. const hasEditedInfo = dataSource.filter((c: any) => c.columnCode == a.code);
  360. return {
  361. reportCode: currentSelectedType.code,
  362. columnCode: a.code,
  363. columnHeaderText: a.headerText,
  364. columnName: a.name,
  365. sort: hasEditedInfo.length > 0 ? hasEditedInfo[0].sort : dataSource.length + 1,
  366. primaryKey: hasEditedInfo.length > 0 ? hasEditedInfo[0].primaryKey : 0,
  367. hide: hasEditedInfo.length > 0 ? hasEditedInfo[0].hide : 0,
  368. freeze: hasEditedInfo.length > 0 ? hasEditedInfo[0].freeze : 0,
  369. }
  370. });
  371. const resp = await addReportTableList(result);
  372. if (resp) {
  373. message.success('添加成功!');
  374. getTableData({ reportCode: currentSelectedType.code });
  375. }
  376. }
  377. }));
  378. useEffect(() => {
  379. getFuncList();
  380. }, [])
  381. return (
  382. <Transfer className='TableTransfer' showSearch
  383. titles={['待选项', '已选项']}
  384. locale={{
  385. itemUnit: '项',
  386. itemsUnit: '项',
  387. searchPlaceholder: '请输入'
  388. }}
  389. onChange={onChange}
  390. onSelectChange={onSelectChange}
  391. dataSource={datasource}
  392. rowKey={record => record.code}
  393. targetKeys={targetKeys}
  394. selectedKeys={selectedKeys}
  395. filterOption={(inputValue, item) => {
  396. return item.headerText!.indexOf(inputValue) !== -1
  397. }}
  398. >
  399. {({
  400. direction,
  401. filteredItems,
  402. onItemSelectAll,
  403. onItemSelect,
  404. selectedKeys: listSelectedKeys,
  405. disabled: listDisabled,
  406. }) => {
  407. // console.log({ filteredItems, listSelectedKeys,direction });
  408. const columns = direction === 'left' ? leftColumns : rightColumns;
  409. const rowSelection: TableRowSelection<TransferItem> = {
  410. getCheckboxProps: (item) => ({ disabled: listDisabled || item.disabled }),
  411. onSelectAll(selected, selectedRows) {
  412. const treeSelectedKeys = selectedRows.map(({ code }) => code);
  413. const diffKeys = selected
  414. ? difference(treeSelectedKeys, listSelectedKeys)
  415. : difference(listSelectedKeys, treeSelectedKeys);
  416. onItemSelectAll(diffKeys as string[], selected);
  417. },
  418. onSelect({ code }, selected) {
  419. onItemSelect(code as string, selected);
  420. },
  421. selectedRowKeys: listSelectedKeys,
  422. };
  423. return (
  424. <BMSTable
  425. rowSelection={rowSelection}
  426. columns={columns as TransferItem[]}
  427. dataSource={filteredItems}
  428. size="small"
  429. rowKey={'code'}
  430. scroll={{ y: 830 }}
  431. tableAlertRender={false}
  432. pagination={{ simple: true, pageSize: 9, showTotal: () => false }}
  433. style={{ pointerEvents: listDisabled ? 'none' : undefined }}
  434. onRow={({ code, disabled: itemDisabled }) => ({
  435. onClick: () => {
  436. if (itemDisabled || listDisabled) return;
  437. onItemSelect(code as string, !listSelectedKeys.includes(code as string));
  438. },
  439. })}
  440. />
  441. );
  442. }}
  443. </Transfer>
  444. )
  445. })
  446. const moreItems: MenuProps['items'] = [
  447. {
  448. key: '1',
  449. label: <UpDataActBtn key={'act'} record={currentEditLeftData} type='EDIT_LEFTDATA' />,
  450. },
  451. {
  452. key: '2',
  453. label: (
  454. <a onClick={async (e) => {
  455. e.preventDefault();
  456. const resp = await delLeftReportData(currentEditLeftData.id);
  457. if (resp) {
  458. getPageLeftReports();
  459. }
  460. }}>
  461. 删除
  462. </a>
  463. ),
  464. },
  465. {
  466. key: '3',
  467. label: (<a onClick={async (e) => {
  468. e.preventDefault();
  469. // 选取要复制的文本
  470. const textToCopy = currentEditLeftData.code;
  471. // 创建一个临时的textarea元素
  472. const tempTextArea = document.createElement("textarea");
  473. tempTextArea.value = textToCopy;
  474. document.body.appendChild(tempTextArea);
  475. // 选中并复制文本
  476. tempTextArea.select();
  477. document.execCommand("copy");
  478. // 移除临时元素
  479. document.body.removeChild(tempTextArea);
  480. message.success('复制成功!');
  481. }}>
  482. 复制报表code
  483. </a>),
  484. },
  485. ];
  486. const onSortEnd = useRefFunction(
  487. ({ oldIndex, newIndex }: { oldIndex: number; newIndex: number }) => {
  488. if (oldIndex !== newIndex) {
  489. const newData = arrayMoveImmutable([...dataSource], oldIndex, newIndex).filter((el) => !!el);
  490. const updatedSortArr = newData.map((item: any, index: number) => ({ ...item, sort: index }))
  491. setDataSource([...updatedSortArr]);
  492. }
  493. },
  494. );
  495. const DraggableContainer = (props: any) => (
  496. <SortContainer
  497. useDragHandle
  498. disableAutoscroll
  499. helperClass="row-dragging"
  500. onSortEnd={onSortEnd}
  501. {...props}
  502. />
  503. );
  504. const DraggableBodyRow = (props: any) => {
  505. const { className, style, ...restProps } = props;
  506. // function findIndex base on Table rowKey props and should always be a right array index
  507. const index = dataSource.findIndex((x) => x.id === restProps['data-row-key']);
  508. return <SortableItem index={index} {...restProps} />;
  509. };
  510. useEffect(() => {
  511. if (currentSelectedType) {
  512. set_tableDataFilterParams({ ...tableDataFilterParams, reportCode: currentSelectedType.code });
  513. getTableData({ reportCode: currentSelectedType.code });
  514. }
  515. }, [currentSelectedType])
  516. useEffect(() => {
  517. if (showTypeListArr.length > 0) {
  518. set_currentSelectedType(showTypeListArr[0]);
  519. _currentSelectedType = showTypeListArr[0];
  520. set_tableDataFilterParams({ ...tableDataFilterParams, reportCode: showTypeListArr[0].code });
  521. }
  522. }, [showTypeListArr]);
  523. useEffect(() => {
  524. if (ifEditTable) {
  525. set_tableColumn([{
  526. title: '排序',
  527. dataIndex: 'sort',
  528. width: 60,
  529. className: 'drag-visible',
  530. render: () => <DragHandle />
  531. }, ...column,
  532. ])
  533. } else {
  534. set_tableColumn(column);
  535. }
  536. }, [ifEditTable,currentEditRow]);
  537. useEffect(() => {
  538. temp_dataSource = [...dataSource];
  539. }, [dataSource])
  540. useEffect(() => {
  541. getPageLeftReports();
  542. }, [])
  543. return (
  544. <BMSPagecontainer title={false} className='ReportSetting'>
  545. <div className='left'>
  546. <div className='toolbar'>
  547. <Input placeholder={'报表名称'} allowClear
  548. suffix={
  549. <IconFont type="iconsousuo" />
  550. }
  551. style={{ width: 156 }}
  552. onChange={(e) => {
  553. const result = typeList.filter(item => item.reportName.indexOf(e.target.value) != -1);
  554. set_showTypeListArr(result);
  555. }}
  556. />
  557. <UpDataActBtn key={'act'} record={undefined} type='ADD_LEFTDATA' />
  558. </div>
  559. <div className='wrap'>
  560. {
  561. showTypeListArr.map((item, index) => {
  562. return (
  563. <div className={currentSelectedType ? currentSelectedType.id == item.id ? 'type on' : 'type' : 'type'}
  564. key={index}
  565. onClick={() => {
  566. if (ifEditTable) {
  567. //编辑状态还未保存
  568. Modal.confirm({
  569. title: '当前存在编辑未保存,请保存后再操作!',
  570. okText: '放弃编辑',
  571. cancelText: '继续编辑',
  572. onOk(...args) {
  573. set_ifEditTable(false);
  574. set_currentSelectedType(item);
  575. _currentSelectedType = item;
  576. getTableData({ reportCode: item.code });
  577. },
  578. })
  579. } else {
  580. set_currentSelectedType(item);
  581. _currentSelectedType = item;
  582. }
  583. }}
  584. >
  585. <img className='icon' src={require('../../../../../static/reportIcon.png')} alt="" />
  586. <div className='content'>
  587. <Tooltip title={item.reportName} >
  588. <div className='name'>{item.reportName}</div>
  589. <div className='sub'>{item.reportTypeName}</div>
  590. </Tooltip>
  591. </div>
  592. <Dropdown menu={{ items: moreItems }} placement="bottom" onOpenChange={(bool) => { bool && set_currentEditLeftData(item) }}>
  593. <div className='more'>
  594. <img src={require('../../../../../static/more_point_gray.png')} alt="" />
  595. </div>
  596. </Dropdown>
  597. </div>
  598. )
  599. })
  600. }
  601. </div>
  602. </div>
  603. <div className='right'>
  604. <div className='toolBar'>
  605. <div className='filter'>
  606. </div>
  607. <div className='btnGroup'>
  608. {!ifEditTable && <span className='manaBtn' onClick={() => set_ifEditTable(true)}>管理列</span>}
  609. {
  610. ifEditTable && (
  611. <div className='inner'>
  612. <span className='save' onClick={() => updateTable(undefined, 'EDIT')}>保存</span>
  613. <span className='add' onClick={() => addReportColumnHandle()}>添加列</span>
  614. </div>
  615. )
  616. }
  617. </div>
  618. </div>
  619. <div style={{ marginTop: 16 }}>
  620. {currentSelectedType && <BMSTable actionRef={tableRef} columns={tableColumn}
  621. scroll={{ y: 500 }}
  622. rowKey='id' dataSource={dataSource}
  623. pagination={false}
  624. components={{
  625. body: {
  626. wrapper: DraggableContainer,
  627. row: DraggableBodyRow,
  628. },
  629. }}
  630. />}
  631. </div>
  632. </div>
  633. </BMSPagecontainer>
  634. )
  635. }
  636. export default ReportSetting;