index.tsx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /*
  2. * @Author: code4eat awesomedema@gmail.com
  3. * @Date: 2022-06-29 11:05:04
  4. * @LastEditors: code4eat awesomedema@gmail.com
  5. * @LastEditTime: 2022-07-01 11:07:09
  6. * @FilePath: /KC-MiddlePlatform/src/components/NavSelecter/index.tsx
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. */
  9. import { Tabs, Checkbox, Button } from 'antd';
  10. import React, { useEffect, useState } from 'react';
  11. import './style.less';
  12. const { TabPane } = Tabs;
  13. export type NavSelecterItemType = {
  14. name: string;
  15. menuId: number|string;
  16. path:string;
  17. systemId:string;
  18. }
  19. export type NavSelecterData = {
  20. name: string;
  21. menuId: number|string;
  22. path:string;
  23. systemId:string;
  24. child?: NavSelecterData[]
  25. }
  26. export interface NavSelecter {
  27. onVisibleChange?: (t: boolean) => void;
  28. onChecked?:(t:NavSelecterItemType[]) => void;
  29. value?:NavSelecterItemType[];
  30. data?: NavSelecterData[];
  31. }
  32. const NavSelecter = (props: NavSelecter) => {
  33. const { onVisibleChange, data,value=[],onChecked } = props;
  34. const [checkedIds,set_checkedIds] = useState<(string|number)[]>([]);
  35. const [checkedItems,set_checkedItems] = useState<NavSelecterItemType[]>([]);
  36. const onChange = (tab:NavSelecterItemType) => {
  37. let _checkedIds = checkedIds;
  38. let _checkedItems = [...checkedItems];
  39. if(_checkedIds.includes(tab.menuId)){
  40. _checkedIds.splice(checkedIds.indexOf(tab.menuId),1);
  41. _checkedItems.splice(_checkedItems.findIndex(t=>t.menuId == tab.menuId),1);
  42. set_checkedIds([..._checkedIds]);
  43. set_checkedItems([..._checkedItems]);
  44. }else{
  45. _checkedIds.push(tab.menuId);
  46. _checkedItems.push(tab);
  47. set_checkedItems([..._checkedItems]);
  48. set_checkedIds([..._checkedIds]);
  49. }
  50. };
  51. const onMaskClick = (e: React.MouseEvent) => {
  52. onVisibleChange && onVisibleChange(false);
  53. }
  54. const onCommit = ()=>{
  55. onChecked&&onChecked(checkedItems);
  56. onVisibleChange && onVisibleChange(false);
  57. }
  58. const onReset = ()=>{
  59. set_checkedItems([]);
  60. set_checkedIds([]);
  61. }
  62. useEffect(()=>{
  63. set_checkedIds(value?.map(t=>t.menuId));
  64. set_checkedItems(value);
  65. },[value]);
  66. return (
  67. <div className="navSelecter" onClick={(e) => onMaskClick(e)}>
  68. <div className='container'>
  69. <div className='content' onClick={(e) => e.stopPropagation()}>
  70. <Tabs defaultActiveKey="1" >
  71. {
  72. data?.map((val) => (
  73. <TabPane tab={val.name} key={val.menuId}>
  74. {
  75. val.child?.map((item) => (
  76. <div className='row' key={item.menuId}>
  77. <div className='rowName'>{item.name}</div>
  78. <div className='rowWrap'>
  79. {
  80. item.child?.map(a => (
  81. <div className='tab' key={a.menuId}>
  82. <Checkbox onChange={() => onChange({
  83. name: a.name,
  84. menuId:a.menuId ,
  85. path:a.path,
  86. systemId:a.systemId
  87. })} checked={checkedIds.includes(a.menuId)} ></Checkbox>
  88. <span style={{ marginLeft: 8 }}>{a.name}</span>
  89. </div>
  90. ))
  91. }
  92. </div>
  93. </div>
  94. ))
  95. }
  96. </TabPane>
  97. ))
  98. }
  99. </Tabs>
  100. </div>
  101. <div className='footer' onClick={e=>e.stopPropagation()}>
  102. <span className='count'>{`已选中${checkedIds.length}项`}</span>
  103. <div className='btnGroup'>
  104. <Button style={{marginRight:8}} onClick={onReset}>重置</Button>
  105. <Button type="primary" onClick={onCommit}>确定</Button>
  106. </div>
  107. </div>
  108. </div>
  109. </div>
  110. )
  111. }
  112. export default NavSelecter;