kn-cli 1.0.131 → 1.0.134

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/build/shellUtil.sh +2 -2
  2. package/build/start.sh +3 -2
  3. package/build/vite.config.js +1 -1
  4. package/package.json +2 -1
  5. package/src/create.js +2 -0
  6. package/templates/template_admin_antd5/.vscode/settings.json +28 -0
  7. package/templates/template_admin_antd5/build.sh +8 -0
  8. package/templates/template_admin_antd5/cli.config.js +35 -0
  9. package/templates/template_admin_antd5/dev.sh +33 -0
  10. package/templates/template_admin_antd5/frontend_build.sh +48 -0
  11. package/templates/template_admin_antd5/init/prepare-commit-msg +5 -0
  12. package/templates/template_admin_antd5/init.sh +24 -0
  13. package/templates/template_admin_antd5/jsconfig.json +17 -0
  14. package/templates/template_admin_antd5/package.json +27 -0
  15. package/templates/template_admin_antd5/public/404.html +26 -0
  16. package/templates/template_admin_antd5/public/favicon.png +0 -0
  17. package/templates/template_admin_antd5/public/index.html +48 -0
  18. package/templates/template_admin_antd5/public/src/_antd.less +37 -0
  19. package/templates/template_admin_antd5/public/src/_mixin.module.less +79 -0
  20. package/templates/template_admin_antd5/public/src/_reset.module.less +134 -0
  21. package/templates/template_admin_antd5/public/src/_variable.module.less +85 -0
  22. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.eot +0 -0
  23. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.module.less +109 -0
  24. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.svg +75 -0
  25. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.ttf +0 -0
  26. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.woff +0 -0
  27. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.woff2 +0 -0
  28. package/templates/template_admin_antd5/public/src/assets/images/arrow.png +0 -0
  29. package/templates/template_admin_antd5/public/src/assets/images/avatar.png +0 -0
  30. package/templates/template_admin_antd5/public/src/assets/images/icon-notice.png +0 -0
  31. package/templates/template_admin_antd5/public/src/assets/images/icon-user.png +0 -0
  32. package/templates/template_admin_antd5/public/src/assets/images/loadFail.png +0 -0
  33. package/templates/template_admin_antd5/public/src/assets/images/loading.svg +40 -0
  34. package/templates/template_admin_antd5/public/src/assets/images/login/bg.png +0 -0
  35. package/templates/template_admin_antd5/public/src/assets/images/login/logo.png +0 -0
  36. package/templates/template_admin_antd5/public/src/assets/images/login/slogan.png +0 -0
  37. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-dep-active.png +0 -0
  38. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-dep.png +0 -0
  39. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-log-active.png +0 -0
  40. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-log.png +0 -0
  41. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-loginlog-active.png +0 -0
  42. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-loginlog.png +0 -0
  43. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-role-active.png +0 -0
  44. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-role.png +0 -0
  45. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-user-active.png +0 -0
  46. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-user.png +0 -0
  47. package/templates/template_admin_antd5/public/src/assets/images/nav/nav-toggle.png +0 -0
  48. package/templates/template_admin_antd5/public/src/assets/images/nav/slogan.png +0 -0
  49. package/templates/template_admin_antd5/public/src/assets/images/noData.png +0 -0
  50. package/templates/template_admin_antd5/public/src/assets/images/noSelect.png +0 -0
  51. package/templates/template_admin_antd5/public/src/assets/images/permission/403.png +0 -0
  52. package/templates/template_admin_antd5/public/src/assets/images/permission/404.png +0 -0
  53. package/templates/template_admin_antd5/public/src/assets/images/permission/503.png +0 -0
  54. package/templates/template_admin_antd5/public/src/assets/images/play.png +0 -0
  55. package/templates/template_admin_antd5/public/src/components/_table/column.jsx +47 -0
  56. package/templates/template_admin_antd5/public/src/components/_table/column.module.less +12 -0
  57. package/templates/template_admin_antd5/public/src/components/_table/index.jsx +71 -0
  58. package/templates/template_admin_antd5/public/src/components/_table/index.module.less +15 -0
  59. package/templates/template_admin_antd5/public/src/components/antd/antProvider.jsx +21 -0
  60. package/templates/template_admin_antd5/public/src/components/antd/index.jsx +146 -0
  61. package/templates/template_admin_antd5/public/src/components/antd/select/index.jsx +296 -0
  62. package/templates/template_admin_antd5/public/src/components/antd/select/index.module.less +21 -0
  63. package/templates/template_admin_antd5/public/src/components/antd/theme.js +173 -0
  64. package/templates/template_admin_antd5/public/src/components/antd/tooltip/detail/index.jsx +70 -0
  65. package/templates/template_admin_antd5/public/src/components/antd/tooltip/detail/index.module.less +12 -0
  66. package/templates/template_admin_antd5/public/src/components/antd/tooltip/index.jsx +69 -0
  67. package/templates/template_admin_antd5/public/src/components/antd/tooltip/index.module.less +28 -0
  68. package/templates/template_admin_antd5/public/src/components/auth/index.jsx +123 -0
  69. package/templates/template_admin_antd5/public/src/components/auth/index.module.less +7 -0
  70. package/templates/template_admin_antd5/public/src/components/auth/navCheck.jsx +27 -0
  71. package/templates/template_admin_antd5/public/src/components/badge/index.jsx +47 -0
  72. package/templates/template_admin_antd5/public/src/components/badge/index.module.less +44 -0
  73. package/templates/template_admin_antd5/public/src/components/button/index.jsx +17 -0
  74. package/templates/template_admin_antd5/public/src/components/debug/index.jsx +28 -0
  75. package/templates/template_admin_antd5/public/src/components/debug/index.module.less +10 -0
  76. package/templates/template_admin_antd5/public/src/components/empty/index.jsx +28 -0
  77. package/templates/template_admin_antd5/public/src/components/empty/index.module.less +20 -0
  78. package/templates/template_admin_antd5/public/src/components/error/index.jsx +39 -0
  79. package/templates/template_admin_antd5/public/src/components/icon/index.jsx +128 -0
  80. package/templates/template_admin_antd5/public/src/components/icon/playVideo/index.jsx +21 -0
  81. package/templates/template_admin_antd5/public/src/components/icon/playVideo/index.module.less +16 -0
  82. package/templates/template_admin_antd5/public/src/components/iconFont/index.jsx +20 -0
  83. package/templates/template_admin_antd5/public/src/components/iconFont/index.module.less +5 -0
  84. package/templates/template_admin_antd5/public/src/components/image/index.jsx +73 -0
  85. package/templates/template_admin_antd5/public/src/components/image/index.module.less +117 -0
  86. package/templates/template_admin_antd5/public/src/components/image/preview.jsx +85 -0
  87. package/templates/template_admin_antd5/public/src/components/layout/basic/index.jsx +49 -0
  88. package/templates/template_admin_antd5/public/src/components/layout/basic/index.module.less +76 -0
  89. package/templates/template_admin_antd5/public/src/components/layout/index.jsx +39 -0
  90. package/templates/template_admin_antd5/public/src/components/layout/index.module.less +63 -0
  91. package/templates/template_admin_antd5/public/src/components/layout/provider/index.jsx +32 -0
  92. package/templates/template_admin_antd5/public/src/components/leftMenu/index.jsx +106 -0
  93. package/templates/template_admin_antd5/public/src/components/leftMenu/index.module.less +42 -0
  94. package/templates/template_admin_antd5/public/src/components/link/index.jsx +39 -0
  95. package/templates/template_admin_antd5/public/src/components/link/index.module.less +11 -0
  96. package/templates/template_admin_antd5/public/src/components/menuIcon/index.jsx +33 -0
  97. package/templates/template_admin_antd5/public/src/components/menuIcon/index.module.less +49 -0
  98. package/templates/template_admin_antd5/public/src/components/page/pageLoading/index.jsx +51 -0
  99. package/templates/template_admin_antd5/public/src/components/page/pageLoading/index.module.less +29 -0
  100. package/templates/template_admin_antd5/public/src/components/popup/index.jsx +60 -0
  101. package/templates/template_admin_antd5/public/src/components/popup/index.module.less +18 -0
  102. package/templates/template_admin_antd5/public/src/components/react/index.jsx +13 -0
  103. package/templates/template_admin_antd5/public/src/components/resizeBox/index.jsx +144 -0
  104. package/templates/template_admin_antd5/public/src/components/resizeBox/index.module.css +90 -0
  105. package/templates/template_admin_antd5/public/src/components/select/defaultServicesSelect/index.jsx +182 -0
  106. package/templates/template_admin_antd5/public/src/components/select/dictSelect/index.jsx +84 -0
  107. package/templates/template_admin_antd5/public/src/components/select/index.jsx +7 -0
  108. package/templates/template_admin_antd5/public/src/components/select/useSelectList.jsx +217 -0
  109. package/templates/template_admin_antd5/public/src/components/table/aliTable/index.jsx +250 -0
  110. package/templates/template_admin_antd5/public/src/components/table/aliTable/index.module.less +105 -0
  111. package/templates/template_admin_antd5/public/src/components/table/column.jsx +128 -0
  112. package/templates/template_admin_antd5/public/src/components/table/column.module.less +50 -0
  113. package/templates/template_admin_antd5/public/src/components/table/imageTable/index.jsx +302 -0
  114. package/templates/template_admin_antd5/public/src/components/table/imageTable/index.module.less +196 -0
  115. package/templates/template_admin_antd5/public/src/components/table/imageTable/radio.jsx +15 -0
  116. package/templates/template_admin_antd5/public/src/components/table/imageTable/radio.module.less +18 -0
  117. package/templates/template_admin_antd5/public/src/components/table/index.jsx +475 -0
  118. package/templates/template_admin_antd5/public/src/components/table/index.module.less +133 -0
  119. package/templates/template_admin_antd5/public/src/components/text/index.jsx +98 -0
  120. package/templates/template_admin_antd5/public/src/components/text/index.module.less +13 -0
  121. package/templates/template_admin_antd5/public/src/components/toast/index.jsx +79 -0
  122. package/templates/template_admin_antd5/public/src/components/toast/index.module.less +43 -0
  123. package/templates/template_admin_antd5/public/src/components/topMenu/index.jsx +102 -0
  124. package/templates/template_admin_antd5/public/src/components/topMenu/index.module.less +89 -0
  125. package/templates/template_admin_antd5/public/src/components/topMenu/topBar/index.jsx +81 -0
  126. package/templates/template_admin_antd5/public/src/components/topMenu/topBar/index.module.less +97 -0
  127. package/templates/template_admin_antd5/public/src/components/video/index.jsx +96 -0
  128. package/templates/template_admin_antd5/public/src/components/video/index.module.less +132 -0
  129. package/templates/template_admin_antd5/public/src/components/video/preview.jsx +38 -0
  130. package/templates/template_admin_antd5/public/src/config.js +31 -0
  131. package/templates/template_admin_antd5/public/src/declarations.d.ts +1 -0
  132. package/templates/template_admin_antd5/public/src/dictionary/dictionary.js +289 -0
  133. package/templates/template_admin_antd5/public/src/dictionary/index.jsx +64 -0
  134. package/templates/template_admin_antd5/public/src/enum.js +41 -0
  135. package/templates/template_admin_antd5/public/src/hooks/index.jsx +29 -0
  136. package/templates/template_admin_antd5/public/src/hooks/useDebounceFn.jsx +33 -0
  137. package/templates/template_admin_antd5/public/src/hooks/useDelay.jsx +34 -0
  138. package/templates/template_admin_antd5/public/src/hooks/useEsc.jsx +98 -0
  139. package/templates/template_admin_antd5/public/src/hooks/useImageLoader.jsx +26 -0
  140. package/templates/template_admin_antd5/public/src/hooks/useInToView.jsx +58 -0
  141. package/templates/template_admin_antd5/public/src/hooks/useLoading.jsx +46 -0
  142. package/templates/template_admin_antd5/public/src/hooks/usePreload.jsx +67 -0
  143. package/templates/template_admin_antd5/public/src/hooks/useRouteMenu.jsx +263 -0
  144. package/templates/template_admin_antd5/public/src/hooks/useScrollTop.jsx +44 -0
  145. package/templates/template_admin_antd5/public/src/hooks/useSearch.jsx +163 -0
  146. package/templates/template_admin_antd5/public/src/hooks/useTableRowSelect.jsx +310 -0
  147. package/templates/template_admin_antd5/public/src/hooks/useThrottole.jsx +68 -0
  148. package/templates/template_admin_antd5/public/src/hooks/useTimer.jsx +42 -0
  149. package/templates/template_admin_antd5/public/src/hooks/useUpdate.jsx +16 -0
  150. package/templates/template_admin_antd5/public/src/hooks/useWatchServices.jsx +124 -0
  151. package/templates/template_admin_antd5/public/src/index.jsx +89 -0
  152. package/templates/template_admin_antd5/public/src/menuConfig/auth.jsx +92 -0
  153. package/templates/template_admin_antd5/public/src/menuConfig/dashboard.jsx +25 -0
  154. package/templates/template_admin_antd5/public/src/menuConfig/dna.jsx +76 -0
  155. package/templates/template_admin_antd5/public/src/menuConfig/index.jsx +17 -0
  156. package/templates/template_admin_antd5/public/src/mock/auth.js +33 -0
  157. package/templates/template_admin_antd5/public/src/mock/demo.js +122 -0
  158. package/templates/template_admin_antd5/public/src/mock/index.js +65 -0
  159. package/templates/template_admin_antd5/public/src/mock/utils.js +33 -0
  160. package/templates/template_admin_antd5/public/src/pages/antdComponents/index.jsx +142 -0
  161. package/templates/template_admin_antd5/public/src/pages/auth/user/create/index.jsx +47 -0
  162. package/templates/template_admin_antd5/public/src/pages/auth/user/create/index.module.less +6 -0
  163. package/templates/template_admin_antd5/public/src/pages/auth/user/dialog/index.jsx +96 -0
  164. package/templates/template_admin_antd5/public/src/pages/auth/user/index.jsx +214 -0
  165. package/templates/template_admin_antd5/public/src/pages/components/layout/index.jsx +75 -0
  166. package/templates/template_admin_antd5/public/src/pages/components/layout/index.module.less +78 -0
  167. package/templates/template_admin_antd5/public/src/pages/components/layout/titleBar/index.jsx +28 -0
  168. package/templates/template_admin_antd5/public/src/pages/components/layout/titleBar/index.module.less +44 -0
  169. package/templates/template_admin_antd5/public/src/pages/components/select/user.jsx +18 -0
  170. package/templates/template_admin_antd5/public/src/pages/demo/page1.jsx +21 -0
  171. package/templates/template_admin_antd5/public/src/pages/demo/page2.jsx +21 -0
  172. package/templates/template_admin_antd5/public/src/pages/demo/page3.jsx +21 -0
  173. package/templates/template_admin_antd5/public/src/pages/error/403.jsx +15 -0
  174. package/templates/template_admin_antd5/public/src/pages/error/404.jsx +15 -0
  175. package/templates/template_admin_antd5/public/src/pages/error/503.jsx +15 -0
  176. package/templates/template_admin_antd5/public/src/pages/error/permission.jsx +40 -0
  177. package/templates/template_admin_antd5/public/src/pages/error/permission.module.less +16 -0
  178. package/templates/template_admin_antd5/public/src/pages/home.jsx +90 -0
  179. package/templates/template_admin_antd5/public/src/pages/home.module.less +6 -0
  180. package/templates/template_admin_antd5/public/src/pages/login/index.jsx +113 -0
  181. package/templates/template_admin_antd5/public/src/pages/login/index.module.less +153 -0
  182. package/templates/template_admin_antd5/public/src/pages/pageTemplate.jsx +28 -0
  183. package/templates/template_admin_antd5/public/src/provider/app.jsx +201 -0
  184. package/templates/template_admin_antd5/public/src/provider/loading.jsx +47 -0
  185. package/templates/template_admin_antd5/public/src/provider/menu.jsx +161 -0
  186. package/templates/template_admin_antd5/public/src/provider/menu.module.less +35 -0
  187. package/templates/template_admin_antd5/public/src/route.jsx +127 -0
  188. package/templates/template_admin_antd5/public/src/services/demo.js +85 -0
  189. package/templates/template_admin_antd5/public/src/services/excel.js +43 -0
  190. package/templates/template_admin_antd5/public/src/services/http/index.js +155 -0
  191. package/templates/template_admin_antd5/public/src/services/index.js +126 -0
  192. package/templates/template_admin_antd5/public/src/services/interceptor/index.js +67 -0
  193. package/templates/template_admin_antd5/public/src/services/login.js +37 -0
  194. package/templates/template_admin_antd5/public/src/services/socket/index.jsx +99 -0
  195. package/templates/template_admin_antd5/public/src/services/token/index.js +41 -0
  196. package/templates/template_admin_antd5/public/src/type.js +67 -0
  197. package/templates/template_admin_antd5/public/src/utils/event.js +58 -0
  198. package/templates/template_admin_antd5/public/src/utils/format.js +135 -0
  199. package/templates/template_admin_antd5/public/src/utils/index.js +727 -0
  200. package/templates/template_admin_antd5/public/src/utils/menu.js +33 -0
  201. package/templates/template_admin_antd5/public/src/utils/rule.js +277 -0
  202. package/templates/template_admin_antd5/public/src/utils/storage.js +30 -0
  203. package/templates/template_admin_antd5/public/static/about.html +1 -0
  204. package/templates/template_admin_antd5/public/static/kssoLogin.html +22 -0
  205. package/templates/template_admin_antd5/readme.md +84 -0
  206. package/templates/template_admin_antd5/renamejstojsx.js +45 -0
  207. package/templates/template_admin_antd5/renameless.js +53 -0
  208. package/templates/template_admin_antd5/report.sh +25 -0
  209. package/templates/template_admin_antd5/shellUtil.sh +110 -0
  210. package/templates/template_admin_antd5/versionPublish.sh +16 -0
  211. package/templates/template_admin_antd5/webpack.api.js +105 -0
@@ -0,0 +1,182 @@
1
+
2
+ import React, { useEffect, useRef, forwardRef, useImperativeHandle, useState } from 'react';
3
+ // @ts-ignore
4
+ import { Select } from "@/components/antd";
5
+ import useSelectList from '../useSelectList';
6
+
7
+ /**
8
+ * @typedef SelectItemOption
9
+ * @property {string} label - 显示的名称
10
+ * @property {string} value - 唯一值
11
+ * @property {object} [data] - 原始数据
12
+ *
13
+ */
14
+
15
+ /**
16
+ * @typedef DefaultServicesSelectProps
17
+ * @property {string} [name] - 调试用的名称
18
+ * @property {object} services - api接口 符合输出的结果为{id:'',name:''}结构
19
+ * @property {object} [servicesProps={}] - 接口传参
20
+ * @property {(item:object)=>SelectItemOption} [formatOptionItem] - 用户格式化接口返回的数据成标准option数据
21
+ * @property {(list:object[]|object)=>SelectItemOption[]} [formatOptionList] - 对整个response处理返回option
22
+ */
23
+
24
+ /**
25
+ * 从字典生成下拉框
26
+ * @param {import('../useSelectList').SelectListProps & DefaultServicesSelectProps} props
27
+ * @returns {JSX.Element}
28
+ */
29
+ const DefaultServicesSelect=(props,ref)=>{
30
+ const {
31
+ mode='single',
32
+ value:_value,
33
+ style:_style={},
34
+ placeholder='请选择',
35
+ onChange,
36
+ canChange,
37
+ disabled=false,
38
+ services,
39
+ servicesProps={},
40
+ formatOptionItem=(item)=>{
41
+ const {id,name} = item;
42
+ return {
43
+ label:`${name}`,
44
+ value:`${id}`,
45
+ data:item
46
+ }
47
+ },
48
+ formatOptionList,
49
+ onDefaultSelect,
50
+ onListUpdate,
51
+ name,
52
+ required=false
53
+ } = props;
54
+
55
+ // 单选框默认带一键删除
56
+ const allowClear = props.allowClear??((required==false)?true:false);
57
+
58
+ const refDestory = useRef(false);
59
+ const selectList = useSelectList(props);
60
+ const [requestParams,setRequestParams] = useState(servicesProps)
61
+ const refInitList=useRef([]);
62
+
63
+ // 初始化加载下拉框数据
64
+ const init = async ()=>{
65
+ const req = await services(servicesProps);
66
+ if(refDestory.current){return;}
67
+ let values=[];
68
+ if(req?.code==0){
69
+ let data=[];
70
+ if(formatOptionList){
71
+ data = formatOptionList(req.data);
72
+ }else{
73
+ data= req.data.map(item=>{
74
+ return formatOptionItem(item)
75
+ })
76
+ }
77
+ values=data;
78
+ }
79
+ if(onListUpdate){
80
+ onListUpdate(values);
81
+ }
82
+ if(onDefaultSelect){
83
+ let defaultItem = onDefaultSelect(values);
84
+ if(defaultItem){
85
+ onValueChange(defaultItem.value,defaultItem,true)
86
+ }
87
+ }
88
+ const t= await selectList.init(values);
89
+ if(refDestory.current){return;}
90
+ refInitList.current.shift();
91
+ if( refInitList.current.length >0 ){
92
+ let fn = refInitList.current[0]
93
+ fn();
94
+ }
95
+ return t;
96
+ }
97
+ const onFilter=(input,option)=>{
98
+ const {label,value}= option;
99
+ if( `${label}`.toLocaleLowerCase().indexOf(input.toLocaleLowerCase()) >=0 ){
100
+ return true;
101
+ }
102
+ return false;
103
+ }
104
+
105
+ const onValueChange= async (newValue,options,force=false)=>{
106
+ if(!force && canChange){
107
+ let req = await canChange(newValue,options);
108
+ if(!req)return;
109
+ }
110
+ if(onChange)onChange(newValue,options);
111
+ }
112
+
113
+
114
+ useEffect(()=>{
115
+ if(refInitList.current.length<=0){
116
+ refInitList.current.push(init)
117
+ init();
118
+ }else{
119
+ refInitList.current.push(init);
120
+ }
121
+ },[requestParams,services]);
122
+
123
+ useEffect(()=>{
124
+ let keys = Object.keys(servicesProps)
125
+ if(keys.length<=0)return;
126
+ let changes = keys.some(key=>{
127
+ if(servicesProps[key] != requestParams[key]){
128
+ return true;
129
+ }
130
+ return false;
131
+ })
132
+ if(changes){
133
+ setRequestParams(servicesProps)
134
+ }
135
+
136
+ },[servicesProps])
137
+ useEffect(()=>{
138
+ return ()=>{
139
+ refDestory.current=true
140
+ }
141
+ },[])
142
+
143
+
144
+ useImperativeHandle(ref, () => ({
145
+ getSelectList:()=>{
146
+ return selectList;
147
+ },
148
+ }));
149
+
150
+ let className=''
151
+ if(selectList.props.className){
152
+ className = selectList.props.className;
153
+ }
154
+ if(selectList.props.maxTagCount){
155
+ if(Array.isArray(className)){
156
+ className.push('antd-show-tag')
157
+ }else{
158
+ className+= ' antd-show-tag';
159
+ }
160
+ }
161
+ return (
162
+ <Select
163
+ // getPopupContainer={trigger => trigger?.parentElement||document.body}
164
+ loading={selectList.list===null}
165
+ disabled={selectList.list===null || disabled}
166
+ style={{..._style}}
167
+ placeholder={placeholder}
168
+ allowClear={allowClear}
169
+ // @ts-ignore
170
+ mode={mode}
171
+ showSearch
172
+ value={selectList.value}
173
+ options={selectList.list}
174
+ onChange={onValueChange}
175
+ filterOption={onFilter}
176
+ {...selectList.props}
177
+ className={className}
178
+ />
179
+ );
180
+ }
181
+
182
+ export default forwardRef(DefaultServicesSelect);
@@ -0,0 +1,84 @@
1
+
2
+ import React, { useEffect, useRef } from 'react';
3
+ // @ts-ignore
4
+ import { Select } from "@/components/antd";
5
+ import useSelectList from '../useSelectList';
6
+
7
+ /**
8
+ * @typedef DictSelectProps
9
+ * @property {object} emDict - 字典对象
10
+ */
11
+
12
+ /**
13
+ * 从字典生成下拉框
14
+ * @param {import('../useSelectList').SelectListProps & DictSelectProps} props
15
+ * @returns {JSX.Element}
16
+ */
17
+ const DictSelect=(props)=>{
18
+ const {
19
+ mode='single',
20
+ value:_value,
21
+ style:_style={},
22
+ placeholder='请选择',
23
+ onChange,
24
+ disabled=false,
25
+ emDict,
26
+ required=false,
27
+ } = props;
28
+
29
+ const allowClear = props.allowClear??((mode=='single'&&required==false)?true:false);
30
+
31
+ const refDestory = useRef(false);
32
+ const selectList = useSelectList(props);
33
+
34
+ // 初始化加载下拉框数据
35
+ const init = async ()=>{
36
+ if(refDestory.current)return;
37
+ let values=[];
38
+ const data = emDict.list.map(item=>{
39
+ return {
40
+ label:item.label,
41
+ value:`${item.id}`,
42
+ data:item
43
+ }
44
+ })
45
+ values=data;
46
+ return await selectList.init(values);
47
+ }
48
+ const onFilter=(input,option)=>{
49
+ const {label,value}= option;
50
+ if( `${label}`.indexOf(input) >=0 ){
51
+ return true;
52
+ }
53
+ return false;
54
+ }
55
+ const onValueChange=(newValue,options)=>{
56
+ if(onChange)onChange(newValue,options);
57
+ }
58
+
59
+ useEffect(()=>{
60
+ init();
61
+ return ()=>{refDestory.current=true}
62
+ },[])
63
+
64
+
65
+ return (
66
+ <Select
67
+ loading={selectList.list===null}
68
+ disabled={selectList.list===null || disabled}
69
+ style={{..._style}}
70
+ placeholder={placeholder}
71
+ allowClear={allowClear?true:false}
72
+ // @ts-ignore
73
+ mode={mode}
74
+ showSearch
75
+ value={selectList.value}
76
+ options={selectList.list}
77
+ onChange={onValueChange}
78
+ filterOption={onFilter}
79
+ {...selectList.props}
80
+ />
81
+ );
82
+ }
83
+
84
+ export default DictSelect;
@@ -0,0 +1,7 @@
1
+ import DictSelect from './dictSelect';
2
+ import DefaultServicesSelect from './defaultServicesSelect';
3
+
4
+ export {DictSelect};
5
+ export {DefaultServicesSelect};
6
+
7
+ export default {DictSelect,DefaultServicesSelect};
@@ -0,0 +1,217 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ // @ts-ignore
3
+ import {Tooltip} from "@/components/antd";
4
+
5
+
6
+
7
+ /**
8
+ * 各类选择框组件
9
+ * @typedef SelectListProps
10
+ * @property {string} [name] - 调试名称
11
+ * @property {'single'|'multiple'} [mode='single'] - 单选/多选模式
12
+ * @property {(value:string|string[],items:object|object[])=>void} [onChange] - 选择发生变化时的回调
13
+ * @property {string|string[]} [value] - 选择发生变化时的回调
14
+ * @property {object} [style={}] - 样式
15
+ * @property {string} [placeholder] - 提示
16
+ * @property {boolean} [allowClear=false] - 一键删除按钮
17
+ * @property {boolean} [showAll=false] - 是否第一个展示全部选项
18
+ * @property {string} [allValue=''] - 定义全部选项的值是哪种类型,''代表空字符串
19
+ * @property {(id:string)=>SelectItem} [onNoMatchData] - 当没有匹配到数据时的回调
20
+ * @property {{id:number|string,label:string}[]} [noMatchList] - 为匹配到数据时的备用匹配数据
21
+ * @property {string} [onNoMatchDataLabel] - 当单选时,默认选中的数据没有匹配到合法数据时展示的label
22
+ * @property {object} [params={}] - 扩展参数
23
+ * @property {boolean} [disabled=false] - 是否禁止编辑
24
+ * @property {boolean} [noCheckNotFound=false] 是否禁止做不匹配数据的检查补全
25
+ * @property {string} [className='']
26
+ * @property {number} [maxTagCount] - 多选时最多支持的标签数量
27
+ * @property {JSX.Element|string} [suffixIcon] 选择框尾部的icon
28
+ * @property {(value:string|string[],items:object|object[])=>Promise<boolean>} [canChange] - 用于在切换选项时拦截决定是否允许变更
29
+ * @property {boolean} [required=false] - 是否为必选,必选的话不允许allowClear
30
+ * @property {(list:SelectItem[])=>object} [onDefaultSelect] - 初始化后如果需要有默认选中项的计算的话,可以通过这里拦截
31
+ * @property {(list:SelectItem[])=>void} [onListUpdate] - 每当列表内的数据更新时回调
32
+ *
33
+ */
34
+
35
+ /**
36
+ * @typedef SelectItem
37
+ * @property {string} label - 文本下拉框里展示的文本
38
+ * @property {string} value - 文本下拉框里选项的值
39
+ * @property {any} data - 文本下拉框里选项对应的原始数据
40
+ *
41
+ */
42
+
43
+ /**
44
+ * @typedef UseSelectList
45
+ * @property {(list:SelectItem[])=>Promise<boolean>} init - 初始化函数
46
+ * @property {string|number|string[]|number[]} value - 值发生变化时的回调
47
+ * @property {SelectItem[]} list - 选择的数据列表
48
+ * @property {(value)=>void} setValue - 设置当前值
49
+ * @property {object} props - 继承给Select组件的通用属性
50
+ * @property {(value:string|string[])=>object[]} getItemByValue - 通过ID获取到所有匹配的对象数据
51
+ *
52
+ */
53
+
54
+ /**
55
+ * 通用的管理选择下拉框数据的hooks
56
+ * @param {SelectListProps} props
57
+ * @returns {UseSelectList}
58
+ */
59
+ const useSelectList=(props)=>{
60
+ const {
61
+ mode='single',
62
+ value:_value,
63
+ style:_style={},
64
+ showAll=false,
65
+ allValue='',
66
+ onNoMatchData,
67
+ onNoMatchDataLabel,
68
+ noCheckNotFound=false,
69
+ noMatchList=[],
70
+ } = props;
71
+
72
+ const [list,setList]= useState(null);
73
+ const [value,setValue]=useState(mode=='single'?'':[]);
74
+ const [maxTagCount] = useState(()=>{
75
+ if(mode=='multiple'){
76
+ if(props.maxTagCount == 0){
77
+ return undefined;
78
+ }
79
+ if(props.maxTagCount){
80
+ return props.maxTagCount;
81
+ }
82
+ return 'responsive';
83
+ }
84
+ return undefined;
85
+ })
86
+
87
+ const [suffixIcon] = useState(props.suffixIcon||undefined)
88
+
89
+ /**
90
+ * 初始化加载下拉框数据
91
+ * @param {{label:string,value:string,data:any}[]} values
92
+ */
93
+ const init = async (values)=>{
94
+ if(showAll && values?.length>0){
95
+ let value =allValue;
96
+ values =[{label:'全部',value,data:values},...values]
97
+ }
98
+ setList(values);
99
+ return true;
100
+ }
101
+
102
+ /**
103
+ * 通过值获取到选项对象
104
+ * @param {string|string[]} value
105
+ * @returns {object[]}
106
+ */
107
+ const getItemByValue=(value)=>{
108
+ if(!value)return [];
109
+ let finder = [];
110
+ if(Array.isArray(value)==false){
111
+ finder = [value];
112
+ }else{
113
+ finder= [...value];
114
+ }
115
+ let req=[];
116
+ list.filter(item=>{
117
+ for(let i=0;i<finder.length;i++){
118
+ if(finder[i]==item.value){
119
+ req.push(item.data);
120
+ finder.splice(i,1);
121
+ break;
122
+ }
123
+ }
124
+ })
125
+ return req;
126
+ }
127
+ /**
128
+ * 在备用数据内匹配数据
129
+ * @param {number} id
130
+ */
131
+ const matchBackupList=(id)=>{
132
+ if(!noMatchList||noMatchList.length<=0){return null}
133
+ let matchData = noMatchList.filter(data=>data.id==id);
134
+ if(matchData&&matchData[0]){
135
+ return {value:''+id,label:matchData[0].label,data:null}
136
+ }
137
+ return null;
138
+ }
139
+
140
+ // 当数据变动时,检查当前选择值是否有匹配不到的数据,并处理
141
+ const checkNoFindData=()=>{
142
+ if(noCheckNotFound)return;
143
+ if(list === null)return;
144
+ if( [undefined,null].includes(value))return;
145
+ let noFindItems=[];
146
+ if(!Array.isArray(value)){
147
+ if(value==='')return;
148
+ noFindItems = [value]
149
+ }else{
150
+ noFindItems = [...value];
151
+ }
152
+ if(noFindItems.length<=0)return;
153
+
154
+ for(let i=0;i<list.length;i++){
155
+ let id = list[i].value;
156
+ let idx = noFindItems.indexOf(id);
157
+ // 找到了则移除
158
+ if( idx >= 0 ){
159
+ noFindItems.splice(idx,1);
160
+ }
161
+ }
162
+ if(noFindItems.length<=0)return;
163
+ noFindItems.forEach(id=>{
164
+ let matchData = matchBackupList(id);
165
+ if(matchData){
166
+ list.push(matchData);
167
+ return;
168
+ }
169
+ if(onNoMatchData){
170
+ let data = onNoMatchData(id);
171
+ if(data){
172
+ list.splice(0,0,data);
173
+ return;
174
+ }
175
+ }
176
+ if(onNoMatchDataLabel){
177
+ list.splice(0,0,{value:id,label:onNoMatchDataLabel,data:null});
178
+ return;
179
+ }
180
+ list.splice(0,0,{value:id,label:`${id}[不可用]`,data:null});
181
+ })
182
+ setList([...list]);
183
+ }
184
+
185
+ useEffect(()=>{
186
+ if(_value==null||_value==undefined){
187
+ setValue(undefined);
188
+ return;
189
+ }
190
+ let req;
191
+ if(mode=='multiple' && Array.isArray(_value)){
192
+ req= _value.map(id=>`${id}`)
193
+ }else{
194
+ req = `${_value}`
195
+ }
196
+ setValue(req);
197
+ },[_value]);
198
+
199
+ useEffect(()=>{
200
+ checkNoFindData();
201
+ },[value,list,noMatchList])
202
+
203
+ return {init,value,list,setValue,getItemByValue,props:{maxTagCount,suffixIcon,
204
+ maxTagPlaceholder:(omittedValues) => (
205
+ <Tooltip
206
+ overlayStyle={{
207
+ pointerEvents: 'none',
208
+ }}
209
+ title={omittedValues.map(({ label }) => label).join(', ')}
210
+ >
211
+ <span className='antd-show-tag-more-label'><i></i><i></i><i></i></span>
212
+ </Tooltip>
213
+ )
214
+
215
+ }}
216
+ }
217
+ export default useSelectList;