index.tsx 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. /*
  2. * @Author: code4eat awesomedema@gmail.com
  3. * @Date: 2022-12-16 09:42:52
  4. * @LastEditors: code4eat awesomedema@gmail.com
  5. * @LastEditTime: 2023-11-10 10:25:38
  6. * @FilePath: /BudgetManaSystem/src/pages/budgetMana/monthlySet/index.tsx
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. */
  9. import { useEffect, useImperativeHandle, useRef, useState } from 'react';
  10. import './style.less';
  11. import { TreeProps, Input, Transfer, Popconfirm, Modal, TransferProps, Table } from 'antd';
  12. import { DataNode } from 'antd/es/tree';
  13. import expandedIcon from '../../../../../public/images/treenode_open.png';
  14. import closeIcon from '../../../../../public/images/treenode_collapse.png';
  15. import type { ColumnsType, TableRowSelection } from 'antd/es/table/interface';
  16. import { createFromIconfontCN } from '@ant-design/icons';
  17. import { addData, delData, editData, getMenuContentType, getMenuRelaActDic, getTableDataRequest, getTreeData, getTreeDataRespType, updateFuncDic } from './service';
  18. import { TransferDirection, TransferItem } from 'antd/es/transfer';
  19. import difference from 'lodash/difference';
  20. import 'dayjs/locale/zh-cn';
  21. import locale from 'antd/es/date-picker/locale/zh_CN';
  22. import React from 'react';
  23. import DirectoryTree from 'antd/es/tree/DirectoryTree';
  24. import { ActionType, ProColumns } from '@ant-design/pro-table';
  25. import KCTable from '@/components/kcTable';
  26. import { getDeepestTreeData } from '@/utils';
  27. import ProForm, { ModalForm, ProFormDependency, ProFormDigit, ProFormInstance, ProFormItem, ProFormRadio, ProFormSelect, ProFormText, ProFormTextArea } from '@ant-design/pro-form';
  28. import { KCInput } from '@/components/KCInput';
  29. import { UserRelaSeletDataListType } from '@/service/user';
  30. const IconFont = createFromIconfontCN({
  31. scriptUrl: '//at.alicdn.com/t/c/font_1927152_4nm5kxbv4m3.js',
  32. });
  33. const SearchIcon = createFromIconfontCN({
  34. scriptUrl: '//at.alicdn.com/t/c/font_1927152_g1njmm1kh7b.js',
  35. });
  36. export type TableListItem = {
  37. key: number;
  38. name: string;
  39. };
  40. const MonthlyInfoCheck: React.FC = () => {
  41. const [treeData, set_treeData] = useState<getTreeDataRespType[]>([]);
  42. const [currentSelectedTreeNode, set_currentSelectedTreeNode] = useState<any | undefined>();
  43. const [reload, set_reload] = useState(false);
  44. const [tableDataFilterParams, set_tableDataFilterParams] = useState<any | undefined>();
  45. const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);
  46. const [searchValue, setSearchValue] = useState('');
  47. const [autoExpandParent, setAutoExpandParent] = useState(true);
  48. const [tableDataSearchKeywords, set_tableDataSearchKeywords] = useState<string>('');
  49. const [currentOperateRow, set_currentOperateRow] = useState<any | undefined>(undefined); //当前操作的表格行数据
  50. const [contentType, set_contentType] = useState<any[]>([]); //菜单内容类型列表
  51. const tableRef = useRef<ActionType>();
  52. const formRef = useRef<ProFormInstance>();
  53. const transferTableColumn = [
  54. {
  55. title: '功能名称',
  56. dataIndex: 'name',
  57. key: 'name',
  58. },
  59. {
  60. title: '功能代码',
  61. dataIndex: 'code',
  62. key: 'code',
  63. },
  64. ];
  65. const columns: ProColumns[] = [
  66. {
  67. title: '名称',
  68. dataIndex: 'name',
  69. key: 'name',
  70. ellipsis: true,
  71. },
  72. {
  73. title: '类型',
  74. dataIndex: 'contentType',
  75. key: 'contentType',
  76. width: 100,
  77. render: (_: any, record: any) => {
  78. //console.log({ record });
  79. switch (record.type) {
  80. case 0:
  81. return '目录';
  82. case 1:
  83. return '菜单';
  84. case 2:
  85. return 'api';
  86. case 3:
  87. return '系统';
  88. case 4:
  89. return '有数bi';
  90. case 5:
  91. return '体系';
  92. case 6:
  93. return '中心层';
  94. case 7:
  95. return '平台层';
  96. default:
  97. break;
  98. }
  99. },
  100. },
  101. {
  102. title: 'Path',
  103. width: 300,
  104. dataIndex: 'path',
  105. key: 'path',
  106. ellipsis: true,
  107. },
  108. {
  109. title: '内容',
  110. dataIndex: 'contentType',
  111. key: 'contentType',
  112. width: 100,
  113. valueEnum: {
  114. 0: '一般',
  115. 1: '报告',
  116. 2: '大屏',
  117. 3: '填报',
  118. 4: '空白',
  119. 5: '静态',
  120. 6: '外部系统嵌入',
  121. },
  122. },
  123. {
  124. title: '功能',
  125. dataIndex: 'deptName',
  126. key: 'deptName',
  127. render: (_: any, record: any) => {
  128. if (record.functionList) {
  129. return record.functionList.reduce((prev: any, cur: any) => {
  130. return `${prev ? prev + ' | ' : prev}${cur.name}`;
  131. }, '');
  132. }
  133. return '-';
  134. },
  135. },
  136. {
  137. title: '操作',
  138. key: 'option',
  139. width: 120,
  140. fixed: 'right',
  141. valueType: 'option',
  142. render: (_: any, record: any) => {
  143. return record.type != 1 && record.type != 2 && record.type != 4
  144. ? [
  145. <UpDataActBtn key={'add'} record={record} type="ADD" />,
  146. <UpDataActBtn key={'act'} record={record} type="EDIT" />,
  147. <Popconfirm title="是否确认删除?" key="del" onConfirm={() => delMenuHandle(record)}>
  148. <a>删除</a>
  149. </Popconfirm>,
  150. ]
  151. : [
  152. <a key={'fuc'} onClick={() => addFuncHandle(record)}>
  153. 功能
  154. </a>,
  155. <UpDataActBtn key={'act'} record={record} type="EDIT" />,
  156. <Popconfirm title="是否确认删除?" key="del" onConfirm={() => delMenuHandle(record)}>
  157. <a>删除</a>
  158. </Popconfirm>,
  159. ];
  160. },
  161. },
  162. ];
  163. const onSelect: TreeProps['onSelect'] = (selectedKeys, info) => {
  164. //console.log('selected', selectedKeys, info);
  165. const { node } = info;
  166. set_currentSelectedTreeNode(node);
  167. };
  168. const getContentType = async () => {
  169. const currentSelectedTab = localStorage.getItem('currentSelectedTab');
  170. const { systemId } = JSON.parse(currentSelectedTab as string);
  171. const resp = await getMenuContentType(systemId);
  172. if (resp) {
  173. set_contentType(resp.list);
  174. }
  175. };
  176. const getTableData = async (params: any, sort: any, filter: any) => {
  177. set_reload(false);
  178. if (currentSelectedTreeNode) {
  179. const resp = await getTableDataRequest(params);
  180. if (resp) {
  181. return {
  182. data: resp,
  183. success: true,
  184. };
  185. }
  186. return {
  187. data: [],
  188. success: true,
  189. };
  190. }
  191. return [];
  192. };
  193. const addFuncHandle = (record: any) => {
  194. set_currentOperateRow(record);
  195. const ref = React.createRef<{ save: any }>();
  196. Modal.confirm({
  197. title: '菜单功能设置(核算单元管理)',
  198. icon: '',
  199. width: 672,
  200. okText: '确定',
  201. cancelText: '取消',
  202. content: <TableTransfer ref={ref} record={record} leftColumns={transferTableColumn} rightColumns={transferTableColumn} dataSource={[]}></TableTransfer>,
  203. onOk: () => {
  204. return ref.current && ref.current.save();
  205. },
  206. });
  207. };
  208. const delMenuHandle = async (record: any) => {
  209. const resp = await delData(record.menuId);
  210. resp && set_reload(true);
  211. };
  212. interface DataType {
  213. key: string;
  214. title: string;
  215. description: string;
  216. disabled: boolean;
  217. tag: string;
  218. }
  219. interface TableTransferProps extends TransferProps<TransferItem> {
  220. dataSource: DataType[];
  221. leftColumns: ColumnsType<DataType>;
  222. rightColumns: ColumnsType<DataType>;
  223. record: any;
  224. }
  225. const TableTransfer = React.forwardRef(({ leftColumns, rightColumns, record, ...restProps }: TableTransferProps, ref) => {
  226. const [_data, _set_data] = useState<any>();
  227. const [targetKeys, setTargetKeys] = useState<string[]>([]);
  228. const [datasource, set_datasource] = useState<any[]>([]);
  229. const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
  230. //获取页面权限字典
  231. const getFuncList = async () => {
  232. const resp = await getMenuRelaActDic();
  233. if (resp) {
  234. set_datasource(resp);
  235. if (record && record.functionList) {
  236. const defaultSelctedkeys = record.functionList.map((item: any) => item.code);
  237. setTargetKeys(defaultSelctedkeys);
  238. }
  239. }
  240. };
  241. const onChange = (nextTargetKeys: string[]) => {
  242. setTargetKeys(nextTargetKeys);
  243. };
  244. const onSelectChange = (sourceSelectedKeys: string[], targetSelectedKeys: string[]) => {
  245. //console.log('sourceSelectedKeys:', sourceSelectedKeys,'targetSelectedKeys:',targetSelectedKeys);
  246. setSelectedKeys([...sourceSelectedKeys, ...targetSelectedKeys]);
  247. };
  248. useImperativeHandle(ref, () => ({
  249. save: async () => {
  250. const data = datasource.filter((item) => targetKeys.includes(item.code));
  251. const resp = await updateFuncDic({
  252. menuId: record.menuId,
  253. function: data,
  254. });
  255. if (resp) {
  256. set_reload(true);
  257. }
  258. },
  259. }));
  260. useEffect(() => {
  261. getFuncList();
  262. }, []);
  263. return (
  264. <Transfer
  265. className="TableTransfer"
  266. showSearch
  267. titles={['待选项目', '已选项目']}
  268. locale={{
  269. itemUnit: '项',
  270. itemsUnit: '项',
  271. searchPlaceholder: '请输入',
  272. }}
  273. onChange={onChange}
  274. onSelectChange={onSelectChange}
  275. dataSource={datasource}
  276. rowKey={(record) => record.code}
  277. targetKeys={targetKeys}
  278. selectedKeys={selectedKeys}
  279. filterOption={(inputValue, item) => {
  280. return item.name!.indexOf(inputValue) !== -1;
  281. }}
  282. >
  283. {({ direction, filteredItems, onItemSelectAll, onItemSelect, selectedKeys: listSelectedKeys, disabled: listDisabled }) => {
  284. // console.log({ filteredItems, listSelectedKeys,direction });
  285. const columns = direction === 'left' ? leftColumns : rightColumns;
  286. const rowSelection: TableRowSelection<TransferItem> = {
  287. getCheckboxProps: (item) => ({ disabled: listDisabled || item.disabled }),
  288. onSelectAll(selected, selectedRows) {
  289. const treeSelectedKeys = selectedRows.map(({ code }) => code);
  290. const diffKeys = selected ? difference(treeSelectedKeys, listSelectedKeys) : difference(listSelectedKeys, treeSelectedKeys);
  291. onItemSelectAll(diffKeys as string[], selected);
  292. },
  293. onSelect({ code }, selected) {
  294. onItemSelect(code as string, selected);
  295. },
  296. selectedRowKeys: listSelectedKeys,
  297. };
  298. return (
  299. <Table
  300. rowSelection={rowSelection}
  301. columns={columns as TransferItem[]}
  302. dataSource={filteredItems}
  303. size="small"
  304. rowKey={'code'}
  305. style={{ pointerEvents: listDisabled ? 'none' : undefined }}
  306. onRow={({ code, disabled: itemDisabled }) => ({
  307. onClick: () => {
  308. if (itemDisabled || listDisabled) return;
  309. onItemSelect(code as string, !listSelectedKeys.includes(code as string));
  310. },
  311. })}
  312. />
  313. );
  314. }}
  315. </Transfer>
  316. );
  317. });
  318. const dataList: any[] = [];
  319. const getParentKey = (key: React.Key, tree: any[]): React.Key => {
  320. let parentKey: React.Key;
  321. for (let i = 0; i < tree.length; i++) {
  322. const node = tree[i];
  323. if (node.children) {
  324. if (node.children.some((item: { code: React.Key }) => item.code === key)) {
  325. parentKey = node.code;
  326. } else if (getParentKey(key, node.children)) {
  327. parentKey = getParentKey(key, node.children);
  328. }
  329. }
  330. }
  331. return parentKey!;
  332. };
  333. const onTreeSearchKeyChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  334. const { value } = e.target;
  335. const newExpandedKeys = dataList.map((item) => {
  336. if (item.name.indexOf(value) > -1) {
  337. return getParentKey(item.code, treeData);
  338. }
  339. return null;
  340. });
  341. const b = newExpandedKeys.filter((item, i, self) => item && self.indexOf(item) === i);
  342. setExpandedKeys(newExpandedKeys as React.Key[]);
  343. setSearchValue(value);
  344. setAutoExpandParent(true);
  345. };
  346. const onExpand = (newExpandedKeys: React.Key[]) => {
  347. setExpandedKeys(newExpandedKeys);
  348. setAutoExpandParent(false);
  349. };
  350. const generateList = (data: getTreeDataRespType[]) => {
  351. for (let i = 0; i < data.length; i++) {
  352. const node = data[i];
  353. const { code, name } = node;
  354. dataList.push({ code, name: name });
  355. if (node.children) {
  356. generateList(node.children);
  357. }
  358. }
  359. };
  360. generateList(treeData as any);
  361. const getTreeReqFunc = async (name?: string) => {
  362. const resp = await getTreeData();
  363. set_treeData(resp);
  364. };
  365. const tableDataSearchHandle = (paramName: string) => {
  366. set_tableDataFilterParams({
  367. ...tableDataFilterParams,
  368. [`${paramName}`]: tableDataSearchKeywords,
  369. });
  370. };
  371. const updateTable = async (type: 'EDIT' | 'ADD', formVal: any, record: any) => {
  372. if (type == 'ADD') {
  373. let data = undefined;
  374. if (record) {
  375. //添加操作
  376. data = { ...formVal, parentId: record.menuId, systemId: record.systemId };
  377. } else {
  378. //新增
  379. data = { ...formVal, parentId: currentSelectedTreeNode.code, systemId: currentSelectedTreeNode.code };
  380. }
  381. const resp = await addData({ ...data });
  382. if (resp) {
  383. set_reload(true);
  384. }
  385. }
  386. if (type == 'EDIT') {
  387. const resp = await editData({ ...record, ...formVal });
  388. if (resp) {
  389. set_reload(true);
  390. }
  391. }
  392. set_currentOperateRow(undefined);
  393. return true;
  394. };
  395. const UpDataActBtn = ({ record, type }: { record: any; type: 'EDIT' | 'ADD' }) => {
  396. return (
  397. <ModalForm
  398. className="systemNavManaForm"
  399. title={`${type == 'EDIT' ? '编辑' : '新增'}菜单`}
  400. width={688}
  401. initialValues={type == 'EDIT' ? { ...record } : { isHomepage: 0 }}
  402. trigger={type == 'EDIT' ? <a key="edit">编辑</a> : record ? <a className="add">添加</a> : <span>新增</span>}
  403. formRef={formRef}
  404. grid={true}
  405. onFinish={(val) => {
  406. set_currentOperateRow(record);
  407. return updateTable(type, val, record);
  408. }}
  409. >
  410. <ProFormText name="name" label="名称:" placeholder="请输入" colProps={{ span: 12 }} rules={[{ required: true, message: '名称不能为空!' }]} />
  411. <ProFormSelect
  412. name="type"
  413. label="类型:"
  414. placeholder="请输入"
  415. colProps={{ span: 12 }}
  416. options={[
  417. {
  418. label: '目录',
  419. value: 0,
  420. },
  421. {
  422. label: '菜单',
  423. value: 1,
  424. },
  425. ]}
  426. rules={[{ required: true, message: '类型不能为空!' }]}
  427. />
  428. <ProFormText name="path" label="Path:" placeholder="请输入" colProps={{ span: 12 }} rules={[{ required: true, message: 'Path不能为空!' }]} />
  429. <ProFormText
  430. name="icon"
  431. label="icon:"
  432. placeholder="请输入"
  433. colProps={{ span: 12 }}
  434. //rules={[{ required: true, message: '类型代码不能为空!' }]}
  435. />
  436. <ProFormDigit
  437. name="orderNum"
  438. label="顺序号:"
  439. width={'xs'}
  440. placeholder="请输入"
  441. colProps={{ span: 12 }}
  442. //rules={[{ required: true, message: '类型代码不能为空!' }]}
  443. />
  444. <ProFormDependency name={['type']}>
  445. {({ type }) =>
  446. type == 1 && (
  447. <ProFormRadio.Group
  448. name="isHomepage"
  449. label="是否首页:"
  450. width={'xs'}
  451. placeholder="请选择"
  452. colProps={{ span: 12 }}
  453. rules={[{ required: true, message: '是否为首页不能为空!' }]}
  454. options={[
  455. {
  456. label: '是',
  457. value: 1,
  458. },
  459. {
  460. label: '否',
  461. value: 0,
  462. },
  463. ]}
  464. //rules={[{ required: true, message: '类型代码不能为空!' }]}
  465. />
  466. )
  467. }
  468. </ProFormDependency>
  469. <ProFormDependency name={['type']}>
  470. {({ type }) =>
  471. type == 1 && (
  472. <ProForm.Group colProps={{ span: 12 }} align="start">
  473. <ProFormSelect
  474. name="contentType"
  475. label="内容类型:"
  476. placeholder="请输入"
  477. width={100}
  478. colProps={{ span: 8 }}
  479. request={async () => {
  480. if (contentType) {
  481. return contentType.map((a: any) => ({ label: a.name, value: Number(a.code) }));
  482. }
  483. return [];
  484. }}
  485. fieldProps={{
  486. onChange(value, option) {
  487. if (value == 1) {
  488. //报告页面
  489. const need = contentType.filter((item: any) => item.code == `${value}`);
  490. if (need.length > 0) formRef.current?.setFieldValue('url', need[0].value);
  491. }
  492. },
  493. }}
  494. // options={[
  495. // { label: '一般', value: 0 },
  496. // { label: '报告', value: 1 },
  497. // { label: '大屏', value: 2 },
  498. // { label: '填报', value: 3 },
  499. // { label: '空白', value: 4 },
  500. // { label: '静态', value: 5 },
  501. // ]}
  502. rules={[{ required: true, message: '类型不能为空!' }]}
  503. />
  504. <ProFormDependency name={['contentType']}>
  505. {({ contentType }) => {
  506. return (
  507. contentType == 1 && (
  508. <div style={{ position: 'relative', top: 24 }}>
  509. <ProFormText
  510. noStyle
  511. width={210}
  512. className="reportId"
  513. name="reportId"
  514. placeholder="请输入报告Id"
  515. colProps={{ span: 16 }}
  516. //rules={[{ required: true, message: '类型代码不能为空!' }]}
  517. />
  518. </div>
  519. )
  520. );
  521. }}
  522. </ProFormDependency>
  523. </ProForm.Group>
  524. )
  525. }
  526. </ProFormDependency>
  527. <ProFormDependency name={['type']}>
  528. {({ type }) =>
  529. type == 1 && (
  530. <ProFormText
  531. name="url"
  532. label="URL:"
  533. placeholder="请输入"
  534. colProps={{ span: 12 }}
  535. //rules={[{ required: true, message: '类型代码不能为空!' }]}
  536. />
  537. )
  538. }
  539. </ProFormDependency>
  540. <ProFormTextArea name="description" label="描述:" placeholder="请输入" colProps={{ span: 24 }} />
  541. </ModalForm>
  542. );
  543. };
  544. useEffect(() => {
  545. if (currentSelectedTreeNode) {
  546. set_tableDataFilterParams({ ...tableDataFilterParams, systemId: currentSelectedTreeNode.code });
  547. }
  548. }, [currentSelectedTreeNode]);
  549. useEffect(() => {
  550. //初始化左侧树结构数据后
  551. if (treeData?.length > 0) {
  552. if (treeData[0].children && treeData[0].children.length > 0) {
  553. const [node, nodeParent] = getDeepestTreeData(treeData[0], 'children');
  554. set_currentSelectedTreeNode(node);
  555. setExpandedKeys([nodeParent.code]);
  556. }
  557. }
  558. }, [treeData]);
  559. useEffect(() => {
  560. getTreeReqFunc();
  561. getContentType();
  562. }, []);
  563. return (
  564. <div className="SystemNavMana">
  565. <div className="leftTree">
  566. <div className="search">
  567. <Input className="searchInput" placeholder="请输入" size="small" allowClear style={{ marginBottom: 16 }} onChange={onTreeSearchKeyChange} suffix={<SearchIcon type="iconsousuo" />} />
  568. </div>
  569. {treeData && treeData.length > 0 && (
  570. <DirectoryTree
  571. fieldNames={{ title: 'name', key: 'code' }}
  572. rootStyle={{ overflowY: 'scroll', overflowX: 'hidden' }}
  573. onSelect={onSelect}
  574. onExpand={onExpand}
  575. expandedKeys={expandedKeys}
  576. autoExpandParent={autoExpandParent}
  577. selectedKeys={currentSelectedTreeNode ? [currentSelectedTreeNode.code] : []}
  578. blockNode={true}
  579. icon={() => null}
  580. titleRender={(nodeData: any) => {
  581. const strTitle = nodeData.name as string;
  582. const index = strTitle.indexOf(searchValue);
  583. const beforeStr = strTitle.substring(0, index);
  584. const afterStr = strTitle.slice(index + searchValue.length);
  585. const title =
  586. index > -1 ? (
  587. <span>
  588. {beforeStr}
  589. <span className="site-tree-search-value" style={{ color: 'red', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
  590. {searchValue}
  591. </span>
  592. {afterStr}
  593. </span>
  594. ) : (
  595. <span className="strTitle">{strTitle}</span>
  596. );
  597. return (
  598. <div
  599. style={{
  600. display: 'flex',
  601. flexDirection: 'row',
  602. width: '100%',
  603. justifyContent: 'flex-start',
  604. alignItems: 'center',
  605. height: 32,
  606. borderRadius: '4px',
  607. overflow: 'hidden',
  608. color: '#17181A',
  609. textOverflow: 'ellipsis',
  610. whiteSpace: 'nowrap',
  611. }}
  612. >
  613. {title}
  614. </div>
  615. );
  616. }}
  617. defaultSelectedKeys={[treeData[0].children[0].code]}
  618. treeData={treeData as unknown as DataNode[]}
  619. // treeData={treeDataNew}
  620. switcherIcon={(props: any) => {
  621. const { expanded } = props;
  622. //return <button className='site-table-row-expand-icon site-table-row-expand-icon-expanded'></button>
  623. return !expanded ? (
  624. <img style={{ width: 20, height: 20, position: 'relative', top: 5 }} src={expandedIcon} />
  625. ) : (
  626. <img style={{ width: 20, height: 20, position: 'relative', top: 5 }} src={closeIcon} />
  627. );
  628. }}
  629. />
  630. )}
  631. </div>
  632. {/* <div style={{width:16,height:'92vh',background:'#F5F7FA'}}></div> */}
  633. <div className="rightContent">
  634. <div className="tableToolbar">
  635. <div className="filter">
  636. <div className="filterItem">
  637. <span className="label">检索:</span>
  638. <KCInput
  639. placeholder={'请输入菜单名称'}
  640. style={{ width: 160 }}
  641. search
  642. allowClear
  643. onChange={(e) => {
  644. set_tableDataSearchKeywords(e.target.value);
  645. if (e.target.value.length == 0) {
  646. set_tableDataFilterParams({
  647. ...tableDataFilterParams,
  648. name: '',
  649. });
  650. }
  651. }}
  652. onSearch={() => tableDataSearchHandle('name')}
  653. />
  654. </div>
  655. </div>
  656. <div className={'btnGroup'}>
  657. <UpDataActBtn key={'act'} record={undefined} type="ADD" />
  658. </div>
  659. </div>
  660. {currentSelectedTreeNode && (
  661. <KCTable
  662. pagination={false}
  663. reload={reload}
  664. newVer
  665. params={tableDataFilterParams}
  666. rowKey="menuId"
  667. columns={columns as ProColumns[]}
  668. request={(params: any, sort: any, filter: any) => getTableData(params, sort, filter)}
  669. />
  670. )}
  671. </div>
  672. </div>
  673. );
  674. };
  675. export default MonthlyInfoCheck;