index.tsx 30 KB

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