tableSelector.tsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import React, { Key, useEffect, useState } from "react";
  2. import { Input, Select } from 'antd'
  3. import { KCIMTable } from "@/components/KCIMTable";
  4. import { createFromIconfontCN } from "@ant-design/icons";
  5. import { ModalForm, ProColumns, ProFormSelect, ProFormText } from "@ant-design/pro-components";
  6. import { set } from "lodash";
  7. import { getAddableTableData } from "./service";
  8. // import './style.less';
  9. interface TableSelecterProps {
  10. record: any
  11. }
  12. const IconFont = createFromIconfontCN({
  13. scriptUrl: '',
  14. });
  15. const TableSelecter = ({ record, open, title, onVisibleChange, rowKey = 'id', request, onFinish, defaultSelectedKeys }: {
  16. record: any, open: boolean, title: string, onVisibleChange: (bool: boolean) => void, defaultSelectedKeys: Key[],
  17. rowKey?: string, request?: (params: any) => Promise<any>, onFinish?: (selectedKeys: React.Key[], selectedRows: any[]) => void
  18. }) => {
  19. const Table = React.forwardRef(({ }: TableSelecterProps, ref) => {
  20. const [datasource, set_datasource] = useState<any[]>([]);
  21. const [selectedKeys, setSelectedKeys] = useState<React.Key[]>([]);
  22. const [selectedRows, set_selectedRows] = useState<any[]>([]);
  23. const [showList, set_showList] = useState<any[]>([]);
  24. const [type, set_type] = useState<number>(3);
  25. const [keyword, set_keyword] = useState<string | undefined>(undefined);
  26. const columns: ProColumns[] = [
  27. {
  28. title: '收费项目代码',
  29. ellipsis:true,
  30. dataIndex: 'itemCode',
  31. },
  32. {
  33. title: '收费项目名称',
  34. ellipsis:true,
  35. dataIndex: 'itemName',
  36. }
  37. ];
  38. const onSelectChange = (newSelectedRowKeys: React.Key[], selectedRows: any) => {
  39. setSelectedKeys([...newSelectedRowKeys]);
  40. set_selectedRows([...selectedRows]);
  41. };
  42. const saveHandle = async () => {
  43. const selectedRowCodes = selectedRows.map((a) => a[`${rowKey}`]);
  44. const rows = datasource.filter((a) => selectedRowCodes.includes(a[`${rowKey}`]));
  45. onFinish && onFinish(selectedKeys, rows);
  46. }
  47. const getTableData = async () => {
  48. const resp = await getAddableTableData(type);
  49. let selectedCodes: string[] = [];
  50. let selectedRows: any[] = [];
  51. if (resp) {
  52. const data = resp.map((a: any) => {
  53. if (defaultSelectedKeys.includes(a[`${rowKey}`])) {
  54. selectedCodes.push(a[`${rowKey}`]);
  55. selectedRows.push(a);
  56. const needItem = record.departList.filter((b: any) => a[`${rowKey}`] == b[`${rowKey}`]);
  57. return {
  58. ...a,
  59. flag: needItem[0].isManager ? true : false
  60. }
  61. } else {
  62. return a
  63. }
  64. });
  65. set_showList(data);
  66. set_selectedRows([...selectedRows]);
  67. setSelectedKeys([...selectedCodes]);
  68. set_datasource([...datasource, ...data]);
  69. }
  70. return Promise.resolve([]);
  71. }
  72. useEffect(() => {
  73. // console.log({code, keyword});
  74. const result = datasource.filter((a) => {
  75. return a.itemName.indexOf(keyword) != -1
  76. });
  77. set_showList([...result]);
  78. }, [keyword]);
  79. useEffect(()=>{
  80. getTableData()
  81. },[type]);
  82. return (
  83. <div >
  84. <div className="filter" style={{marginBottom:8,display:'flex',flexDirection:'row',alignItems:'center'}}>
  85. <ProFormSelect
  86. noStyle
  87. style={{marginRight:8}}
  88. options={[
  89. {label:'药品',value:1},
  90. {label:'材料',value:2},
  91. {label:'项目',value:3}
  92. ]}
  93. fieldProps={{
  94. defaultValue:3,
  95. onChange(value, option) {
  96. set_type(value);
  97. set_keyword('');
  98. },
  99. }}
  100. />
  101. <ProFormText noStyle placeholder={'项目名称'}
  102. fieldProps={{
  103. value:keyword,
  104. suffix: <IconFont style={{ color: '#99A6BF' }} type="iconsousuo" />,
  105. onChange: (e) => {
  106. if (e.target.value.length != 0) {
  107. set_keyword(e.target.value);
  108. } else {
  109. set_keyword('');
  110. }
  111. }
  112. }}
  113. />
  114. </div>
  115. <KCIMTable columns={columns}
  116. options={{
  117. density: true,
  118. setting: {
  119. listsHeight: 100,
  120. },
  121. }}
  122. rowKey={rowKey}
  123. scroll={{ y: 400 }}
  124. tableAlertRender={false}
  125. rowSelection={{
  126. // 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom
  127. // 注释该行则默认不显示下拉选项
  128. // selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT],
  129. selectedRowKeys: selectedKeys,
  130. onChange: onSelectChange,
  131. }}
  132. pagination={{ showTitle: false, showSizeChanger: true,simple:true }}
  133. dataSource={showList}
  134. />
  135. <div className='footer'>
  136. <span className='cancel' onClick={() => close()}>取消</span>
  137. <span className='ok' onClick={() => saveHandle()}>{`确认(${selectedKeys.length > 0 && selectedKeys.length})`}</span>
  138. </div>
  139. </div>
  140. )
  141. });
  142. const close = () => {
  143. onVisibleChange && onVisibleChange(false);
  144. }
  145. return (
  146. <ModalForm className="TableSelecter" title={title} width={400} submitter={{
  147. render: false
  148. }} open={open} modalProps={{
  149. closable: false,
  150. }}>
  151. <Table
  152. // ref={tableSelecterRef}
  153. record={undefined}
  154. ></Table>
  155. </ModalForm>
  156. )
  157. }
  158. export default TableSelecter