@_tc/template-core 0.0.1-bate.9 → 0.0.2

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 (589) hide show
  1. package/README.md +1108 -0
  2. package/cjs/_virtual/_rolldown/runtime.js +1 -0
  3. package/cjs/app/controller/base.js +1 -21
  4. package/cjs/app/controller/project.js +1 -50
  5. package/cjs/app/controller/view.js +1 -14
  6. package/cjs/app/data/signKey.js +1 -4
  7. package/cjs/app/extend/$fetch.js +1 -0
  8. package/cjs/app/extend/db.js +1 -12
  9. package/cjs/app/extend/generateErrorMessage.js +1 -14
  10. package/cjs/app/extend/logger.js +1 -72
  11. package/cjs/app/extend/parsingParamsOnUrl.js +1 -22
  12. package/cjs/app/extend/render-view.js +1 -21
  13. package/cjs/app/middleware/api-params-verify.js +1 -63
  14. package/cjs/app/middleware/api-sign-verify.js +1 -28
  15. package/cjs/app/middleware/error-handle.js +1 -33
  16. package/cjs/app/middleware/project-handler.js +1 -21
  17. package/cjs/app/middleware.js +1 -60
  18. package/cjs/app/router/project.js +1 -8
  19. package/cjs/app/router/view.js +1 -5
  20. package/cjs/app/router-schema/project.js +1 -33
  21. package/cjs/app/service/base.js +1 -0
  22. package/cjs/app/service/project.js +1 -42
  23. package/cjs/app/type.js +1 -2
  24. package/cjs/app/typings.js +1 -2
  25. package/cjs/bundler/defaultAlias.js +1 -0
  26. package/cjs/bundler/dev.js +1 -68
  27. package/cjs/bundler/index.js +1 -18
  28. package/cjs/bundler/prod.js +1 -19
  29. package/cjs/bundler/state.js +1 -0
  30. package/cjs/bundler/utils.js +1 -127
  31. package/cjs/index.js +1 -21
  32. package/cjs/packages/common/LRUCache.js +1 -0
  33. package/cjs/packages/common/array/index.js +1 -0
  34. package/cjs/packages/common/cache/LRUCache.js +1 -0
  35. package/cjs/packages/common/cache/index.js +1 -0
  36. package/cjs/packages/common/guards/index.js +1 -0
  37. package/cjs/packages/common/http/index.js +1 -0
  38. package/cjs/packages/common/i18n/default.js +1 -0
  39. package/cjs/packages/common/i18n/en-US.js +1 -0
  40. package/cjs/packages/common/i18n/index.js +1 -0
  41. package/cjs/packages/common/i18n/locales.js +1 -0
  42. package/cjs/packages/common/i18n/types.js +1 -0
  43. package/cjs/packages/common/index.js +1 -0
  44. package/cjs/packages/common/log/index.js +2 -0
  45. package/cjs/packages/common/number/index.js +1 -0
  46. package/cjs/packages/common/object/filterEmpty.js +1 -0
  47. package/cjs/packages/common/object/filtereEmpty.js +1 -0
  48. package/cjs/packages/common/object/index.js +1 -0
  49. package/cjs/packages/common/string/index.js +1 -0
  50. package/cjs/packages/common/types/index.js +1 -0
  51. package/cjs/packages/core/env.js +1 -25
  52. package/cjs/packages/core/index.js +1 -116
  53. package/cjs/packages/core/loader/config.js +1 -45
  54. package/cjs/packages/core/loader/controller.js +1 -40
  55. package/cjs/packages/core/loader/extend.js +1 -41
  56. package/cjs/packages/core/loader/middleware.js +1 -38
  57. package/cjs/packages/core/loader/model.js +1 -132
  58. package/cjs/packages/core/loader/router-schema.js +1 -35
  59. package/cjs/packages/core/loader/router.js +1 -62
  60. package/cjs/packages/core/loader/service.js +1 -30
  61. package/cjs/packages/core/paths.js +1 -10
  62. package/cjs/packages/core/types.js +1 -2
  63. package/cjs/packages/utils/getAllFilesInFolder.js +1 -45
  64. package/cjs/packages/utils/getAllFnReturnValue.js +1 -6
  65. package/cjs/packages/utils/index.js +1 -20
  66. package/cjs/packages/utils/loadFile.js +1 -65
  67. package/cjs/packages/utils/path.js +1 -64
  68. package/cjs/packages/utils/runFileFn.js +1 -5
  69. package/esm/_virtual/_rolldown/runtime.js +20 -0
  70. package/esm/app/controller/base.js +26 -21
  71. package/esm/app/controller/project.js +52 -42
  72. package/esm/app/controller/view.js +23 -12
  73. package/esm/app/data/signKey.js +8 -1
  74. package/esm/app/extend/$fetch.js +15 -0
  75. package/esm/app/extend/db.js +5 -8
  76. package/esm/app/extend/generateErrorMessage.js +6 -11
  77. package/esm/app/extend/logger.js +25 -36
  78. package/esm/app/extend/parsingParamsOnUrl.js +13 -19
  79. package/esm/app/extend/render-view.js +18 -15
  80. package/esm/app/middleware/api-params-verify.js +55 -57
  81. package/esm/app/middleware/api-sign-verify.js +17 -22
  82. package/esm/app/middleware/error-handle.js +23 -30
  83. package/esm/app/middleware/project-handler.js +14 -18
  84. package/esm/app/middleware.js +17 -54
  85. package/esm/app/router/project.js +6 -5
  86. package/esm/app/router/view.js +6 -2
  87. package/esm/app/router-schema/project.js +14 -30
  88. package/esm/app/service/base.js +14 -0
  89. package/esm/app/service/project.js +23 -34
  90. package/esm/app/type.js +0 -1
  91. package/esm/app/typings.js +0 -1
  92. package/esm/bundler/defaultAlias.js +4 -0
  93. package/esm/bundler/dev.js +11 -28
  94. package/esm/bundler/index.js +17 -13
  95. package/esm/bundler/prod.js +13 -15
  96. package/esm/bundler/state.js +10 -0
  97. package/esm/bundler/utils.js +191 -82
  98. package/esm/index.js +15 -12
  99. package/esm/packages/common/LRUCache.js +2 -0
  100. package/esm/packages/common/array/index.js +27 -0
  101. package/esm/packages/common/cache/LRUCache.js +39 -0
  102. package/esm/packages/common/cache/index.js +2 -0
  103. package/esm/packages/common/guards/index.js +8 -0
  104. package/esm/packages/common/http/index.js +256 -0
  105. package/esm/packages/common/i18n/default.js +88 -0
  106. package/esm/packages/common/i18n/en-US.js +88 -0
  107. package/esm/packages/common/i18n/index.js +91 -0
  108. package/esm/packages/common/i18n/locales.js +9 -0
  109. package/esm/packages/common/index.js +14 -0
  110. package/esm/packages/common/log/index.js +93 -0
  111. package/esm/packages/common/number/index.js +10 -0
  112. package/esm/packages/common/object/filterEmpty.js +23 -0
  113. package/esm/packages/common/object/filtereEmpty.js +2 -0
  114. package/esm/packages/common/object/index.js +17 -0
  115. package/esm/packages/common/string/index.js +4 -0
  116. package/esm/packages/common/types/index.js +0 -0
  117. package/esm/packages/core/env.js +24 -23
  118. package/esm/packages/core/index.js +51 -108
  119. package/esm/packages/core/loader/config.js +26 -42
  120. package/esm/packages/core/loader/controller.js +12 -37
  121. package/esm/packages/core/loader/extend.js +22 -38
  122. package/esm/packages/core/loader/middleware.js +15 -35
  123. package/esm/packages/core/loader/model.js +65 -124
  124. package/esm/packages/core/loader/router-schema.js +18 -32
  125. package/esm/packages/core/loader/router.js +35 -56
  126. package/esm/packages/core/loader/service.js +12 -27
  127. package/esm/packages/core/paths.js +7 -4
  128. package/esm/packages/core/types.js +0 -1
  129. package/esm/packages/utils/getAllFilesInFolder.js +8 -7
  130. package/esm/packages/utils/getAllFnReturnValue.js +0 -6
  131. package/esm/packages/utils/index.js +5 -4
  132. package/esm/packages/utils/loadFile.js +33 -62
  133. package/esm/packages/utils/path.js +14 -25
  134. package/esm/packages/utils/runFileFn.js +45 -1
  135. package/fe/frontend/apps/dash/Dashboard.d.ts +6 -0
  136. package/fe/frontend/apps/dash/Dashboard.js +75 -0
  137. package/fe/frontend/apps/dash/dash.entry.d.ts +2 -0
  138. package/fe/frontend/apps/dash/dash.entry.js +80 -0
  139. package/fe/frontend/apps/dash/types.d.ts +17 -0
  140. package/fe/frontend/apps/testPage/index.d.ts +3 -0
  141. package/fe/frontend/apps/testPage/index.js +6 -0
  142. package/fe/frontend/apps/testPage/testPage.entry.d.ts +2 -0
  143. package/fe/frontend/apps/testPage/testPage.entry.js +6 -0
  144. package/fe/frontend/extended/SchemaForm/data.d.ts +13 -0
  145. package/fe/frontend/extended/SchemaForm/data.js +8 -0
  146. package/fe/frontend/src/api/baseInfo.d.ts +31 -0
  147. package/fe/frontend/src/api/baseInfo.js +15 -0
  148. package/fe/frontend/src/common/CRUD/CRUD.d.ts +3 -0
  149. package/fe/frontend/src/common/CRUD/CRUD.js +2 -0
  150. package/fe/frontend/src/common/CRUD/index.d.ts +2 -0
  151. package/fe/frontend/src/common/CRUD/index.js +1 -0
  152. package/fe/frontend/src/common/auth/index.d.ts +7 -0
  153. package/fe/frontend/src/common/auth/index.js +20 -0
  154. package/fe/frontend/src/common/fetchErrorShow.d.ts +3 -0
  155. package/fe/frontend/src/common/fetchErrorShow.js +8 -0
  156. package/fe/frontend/src/common/generateMenuData.d.ts +4 -0
  157. package/fe/frontend/src/common/generateMenuData.js +12 -0
  158. package/fe/frontend/src/common/importComponent.d.ts +5 -0
  159. package/fe/frontend/src/common/importComponent.js +8 -0
  160. package/fe/frontend/src/common/language.d.ts +2 -0
  161. package/fe/frontend/src/common/language.js +9 -0
  162. package/fe/frontend/src/common/logFn/index.d.ts +5 -0
  163. package/fe/frontend/src/common/logFn/index.js +9 -0
  164. package/fe/frontend/src/common/menu.d.ts +34 -0
  165. package/fe/frontend/src/common/menu.js +101 -0
  166. package/fe/frontend/src/common/request.d.ts +37 -0
  167. package/fe/frontend/src/common/request.js +217 -0
  168. package/fe/frontend/src/components/AsyncSelect/AsyncSelect.d.ts +8 -0
  169. package/fe/frontend/src/components/AsyncSelect/AsyncSelect.js +32 -0
  170. package/fe/frontend/src/components/AsyncSelect/index.d.ts +4 -0
  171. package/fe/frontend/src/components/AsyncSelect/index.js +3 -0
  172. package/fe/frontend/src/components/BasePage/HeaderView.d.ts +9 -0
  173. package/fe/frontend/src/components/BasePage/HeaderView.js +14 -0
  174. package/fe/frontend/src/components/Router/index.d.ts +9 -0
  175. package/fe/frontend/src/components/Router/index.js +11 -0
  176. package/fe/frontend/src/components/Router/type.d.ts +2 -0
  177. package/fe/frontend/src/components/Router/type.js +1 -0
  178. package/fe/frontend/src/defaultPages/Iframe/index.d.ts +3 -0
  179. package/fe/frontend/src/defaultPages/Iframe/index.js +14 -0
  180. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/DetailPanel.d.ts +7 -0
  181. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/DetailPanel.js +94 -0
  182. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/PopFrom.d.ts +13 -0
  183. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/PopFrom.js +124 -0
  184. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/builtIn.d.ts +44 -0
  185. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/builtIn.js +7 -0
  186. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/data.d.ts +4 -0
  187. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/data.js +6 -0
  188. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaSearch/index.d.ts +3 -0
  189. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaSearch/index.js +63 -0
  190. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/index.d.ts +11 -0
  191. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/index.js +188 -0
  192. package/fe/frontend/src/defaultPages/SchemaPage/data/eventInfo.d.ts +8 -0
  193. package/fe/frontend/src/defaultPages/SchemaPage/data/eventInfo.js +6 -0
  194. package/fe/frontend/src/defaultPages/SchemaPage/data/index.d.ts +3 -0
  195. package/fe/frontend/src/defaultPages/SchemaPage/data/index.js +1 -0
  196. package/fe/frontend/src/defaultPages/SchemaPage/hooks/useComConfig.d.ts +10 -0
  197. package/fe/frontend/src/defaultPages/SchemaPage/hooks/useComConfig.js +14 -0
  198. package/fe/frontend/src/defaultPages/SchemaPage/index.css +167 -0
  199. package/fe/frontend/src/defaultPages/SchemaPage/index.d.ts +4 -0
  200. package/fe/frontend/src/defaultPages/SchemaPage/index.js +75 -0
  201. package/fe/frontend/src/defaultPages/SchemaPage/schemaType.d.ts +51 -0
  202. package/fe/frontend/src/defaultPages/SchemaPage/schemaType.js +4 -0
  203. package/fe/frontend/src/defaultPages/SchemaPage/utils/permissions.d.ts +3 -0
  204. package/fe/frontend/src/defaultPages/SchemaPage/utils/permissions.js +3 -0
  205. package/fe/frontend/src/defaultPages/SchemaPage/utils/schemaConversion.d.ts +3 -0
  206. package/fe/frontend/src/defaultPages/SchemaPage/utils/schemaConversion.js +115 -0
  207. package/fe/frontend/src/defaultPages/SchemaPage/utils/validator.d.ts +7 -0
  208. package/fe/frontend/src/defaultPages/SchemaPage/utils/validator.js +36 -0
  209. package/fe/frontend/src/defaultPages/SidebarSlotPage/SidebarSlotContainer.d.ts +10 -0
  210. package/fe/frontend/src/defaultPages/SidebarSlotPage/SidebarSlotContainer.js +38 -0
  211. package/fe/frontend/src/defaultPages/SidebarSlotPage/index.d.ts +3 -0
  212. package/fe/frontend/src/defaultPages/SidebarSlotPage/index.js +16 -0
  213. package/fe/frontend/src/defaultPages/SidebarSlotPageTmp.d.ts +3 -0
  214. package/fe/frontend/src/defaultPages/SidebarSlotPageTmp.js +17 -0
  215. package/fe/frontend/src/defaultPages/SlotPage/index.d.ts +3 -0
  216. package/fe/frontend/src/defaultPages/SlotPage/index.js +26 -0
  217. package/fe/frontend/src/exportStore.d.ts +17 -0
  218. package/fe/frontend/src/exportStore.js +16 -0
  219. package/fe/frontend/src/hooks/useCurrentMenuData.d.ts +19 -0
  220. package/fe/frontend/src/hooks/useCurrentMenuData.js +28 -0
  221. package/fe/frontend/src/hooks/useRouterParams.d.ts +5 -0
  222. package/fe/frontend/src/hooks/useRouterParams.js +11 -0
  223. package/fe/frontend/src/index.d.ts +16 -0
  224. package/fe/frontend/src/index.js +13 -0
  225. package/fe/frontend/src/main.css +96 -0
  226. package/fe/frontend/src/main.d.ts +27 -0
  227. package/fe/frontend/src/main.js +72 -0
  228. package/fe/frontend/src/stores/apiFreezer.d.ts +93 -0
  229. package/fe/frontend/src/stores/apiFreezer.js +49 -0
  230. package/fe/frontend/src/stores/mode.d.ts +19 -0
  231. package/fe/frontend/src/stores/mode.js +37 -0
  232. package/fe/frontend/src/stores/schemaEventBus.d.ts +42 -0
  233. package/fe/frontend/src/stores/schemaEventBus.js +70 -0
  234. package/fe/frontend/src/stores/schemaStore.d.ts +47 -0
  235. package/fe/frontend/src/stores/schemaStore.js +26 -0
  236. package/fe/frontend/src/typing/scalability.d.ts +47 -0
  237. package/fe/frontend/src/typing/scalability.js +1 -0
  238. package/fe/frontend/src/typing/window.d.ts +7 -0
  239. package/fe/frontend/src/typing/window.js +1 -0
  240. package/fe/model/types/data/button.d.ts +32 -0
  241. package/fe/model/types/data/button.js +16 -0
  242. package/fe/model/types/data/component.d.ts +40 -0
  243. package/fe/model/types/data/component.js +11 -0
  244. package/fe/model/types/data/fetchInfo.d.ts +20 -0
  245. package/fe/model/types/data/fetchInfo.js +1 -0
  246. package/fe/model/types/data/schema.d.ts +98 -0
  247. package/fe/model/types/data/schema.js +1 -0
  248. package/fe/model/types/data/search.d.ts +7 -0
  249. package/fe/model/types/data/search.js +1 -0
  250. package/fe/model/types/menuType.d.ts +73 -0
  251. package/fe/model/types/menuType.js +1 -0
  252. package/fe/model/types/model.d.ts +33 -0
  253. package/fe/model/types/model.js +1 -0
  254. package/fe/packages/common/array/index.d.ts +7 -0
  255. package/fe/packages/common/array/index.js +40 -0
  256. package/fe/packages/common/cache/LRUCache.d.ts +13 -0
  257. package/fe/packages/common/cache/LRUCache.js +47 -0
  258. package/fe/packages/common/cache/index.d.ts +2 -0
  259. package/fe/packages/common/cache/index.js +1 -0
  260. package/fe/packages/common/guards/index.d.ts +9 -0
  261. package/fe/packages/common/guards/index.js +24 -0
  262. package/fe/packages/common/http/index.d.ts +90 -0
  263. package/fe/packages/common/http/index.js +310 -0
  264. package/fe/packages/common/i18n/default.d.ts +92 -0
  265. package/fe/packages/common/i18n/default.js +90 -0
  266. package/fe/packages/common/i18n/en-US.d.ts +92 -0
  267. package/fe/packages/common/i18n/en-US.js +90 -0
  268. package/fe/packages/common/i18n/index.d.ts +43 -0
  269. package/fe/packages/common/i18n/index.js +173 -0
  270. package/fe/packages/common/i18n/locales.d.ts +8 -0
  271. package/fe/packages/common/i18n/locales.js +10 -0
  272. package/fe/packages/common/i18n/types.d.ts +71 -0
  273. package/fe/packages/common/i18n/types.js +1 -0
  274. package/fe/packages/common/index.d.ts +11 -0
  275. package/fe/packages/common/index.js +10 -0
  276. package/fe/packages/common/log/index.d.ts +33 -0
  277. package/fe/packages/common/log/index.js +176 -0
  278. package/fe/packages/common/number/index.d.ts +3 -0
  279. package/fe/packages/common/number/index.js +10 -0
  280. package/fe/packages/common/object/filterEmpty.d.ts +3 -0
  281. package/fe/packages/common/object/filterEmpty.js +33 -0
  282. package/fe/packages/common/object/index.d.ts +5 -0
  283. package/fe/packages/common/object/index.js +25 -0
  284. package/fe/packages/common/string/index.d.ts +4 -0
  285. package/fe/packages/common/string/index.js +17 -0
  286. package/fe/packages/common/types/index.d.ts +4 -0
  287. package/fe/packages/common/types/index.js +1 -0
  288. package/fe/packages/ui/react/components/Button/Button.d.ts +29 -10
  289. package/fe/packages/ui/react/components/Button/Button.js +53 -23
  290. package/fe/packages/ui/react/components/Button/SumbitButton.d.ts +2 -2
  291. package/fe/packages/ui/react/components/Button/SumbitButton.js +3 -10
  292. package/fe/packages/ui/react/components/Button/index.d.ts +1 -1
  293. package/fe/packages/ui/react/components/Checkbox/Checkbox.d.ts +1 -1
  294. package/fe/packages/ui/react/components/Checkbox/Checkbox.js +5 -3
  295. package/fe/packages/ui/react/components/ConfirmDialog/ConfirmDialog.js +11 -0
  296. package/fe/packages/ui/react/components/ConfirmDialog/index.d.ts +2 -0
  297. package/fe/packages/ui/react/components/ConfirmDialog/index.js +1 -0
  298. package/fe/packages/ui/react/components/DataTable/ActionBtn.d.ts +3 -1
  299. package/fe/packages/ui/react/components/DataTable/ActionBtn.js +87 -4
  300. package/fe/packages/ui/react/components/DataTable/{data-table.d.ts → index.d.ts} +12 -4
  301. package/fe/packages/ui/react/components/DataTable/index.js +187 -0
  302. package/fe/packages/ui/react/components/Date/Calendar.js +4 -3
  303. package/fe/packages/ui/react/components/Date/Date.d.ts +5 -3
  304. package/fe/packages/ui/react/components/Date/Date.js +71 -48
  305. package/fe/packages/ui/react/components/Date/TimePicker.js +3 -1
  306. package/fe/packages/ui/react/components/Date/dropdownPositioning.d.ts +3 -0
  307. package/fe/packages/ui/react/components/Date/dropdownPositioning.js +12 -0
  308. package/fe/packages/ui/react/components/Date/locales.d.ts +1 -0
  309. package/fe/packages/ui/react/components/Date/locales.js +7 -38
  310. package/fe/packages/ui/react/components/Drawer/Drawer.d.ts +29 -0
  311. package/fe/packages/ui/react/components/Drawer/Drawer.js +100 -0
  312. package/fe/packages/ui/react/components/Drawer/index.d.ts +3 -0
  313. package/fe/packages/ui/react/components/Drawer/index.js +1 -0
  314. package/fe/packages/ui/react/components/Dropdown/Dropdown.d.ts +26 -0
  315. package/fe/packages/ui/react/components/Dropdown/Dropdown.js +49 -0
  316. package/fe/packages/ui/react/components/Dropdown/index.d.ts +2 -0
  317. package/fe/packages/ui/react/components/Dropdown/index.js +1 -0
  318. package/fe/packages/ui/react/components/Form/Form.js +1 -1
  319. package/fe/packages/ui/react/components/Form/FormItem.js +1 -1
  320. package/fe/packages/ui/react/components/Form/SchemaForm/data.d.ts +40 -0
  321. package/fe/packages/ui/react/components/Form/SchemaForm/data.js +18 -0
  322. package/fe/packages/ui/react/components/Form/{SchemeForm → SchemaForm}/index.d.ts +15 -14
  323. package/fe/packages/ui/react/components/Form/SchemaForm/index.js +79 -0
  324. package/fe/packages/ui/react/components/Form/index.d.ts +1 -1
  325. package/fe/packages/ui/react/components/Form/index.js +1 -1
  326. package/fe/packages/ui/react/components/ImagePreview/ImagePreview.js +15 -12
  327. package/fe/packages/ui/react/components/ImagePreview/PreviewImage.js +5 -2
  328. package/fe/packages/ui/react/components/Input/Input.d.ts +5 -1
  329. package/fe/packages/ui/react/components/Input/Input.js +5 -4
  330. package/fe/packages/ui/react/components/InputNumber/InputNumber.d.ts +28 -0
  331. package/fe/packages/ui/react/components/InputNumber/InputNumber.js +144 -0
  332. package/fe/packages/ui/react/components/InputNumber/index.d.ts +2 -0
  333. package/fe/packages/ui/react/components/InputNumber/index.js +1 -0
  334. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.d.ts +30 -0
  335. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.js +63 -0
  336. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.test.d.ts +2 -0
  337. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.test.js +27 -0
  338. package/fe/packages/ui/react/components/Label/Label.js +2 -2
  339. package/fe/packages/ui/react/components/Menu/Menu.d.ts +18 -0
  340. package/fe/packages/ui/react/components/Menu/Menu.js +102 -0
  341. package/fe/packages/ui/react/components/Menu/MenuContext.d.ts +39 -0
  342. package/fe/packages/ui/react/components/Menu/MenuContext.js +97 -0
  343. package/fe/packages/ui/react/components/Menu/MenuItem.d.ts +3 -0
  344. package/fe/packages/ui/react/components/Menu/MenuItem.js +33 -0
  345. package/fe/packages/ui/react/components/Menu/SubMenu.d.ts +10 -0
  346. package/fe/packages/ui/react/components/Menu/SubMenu.js +169 -0
  347. package/fe/packages/ui/react/components/Menu/index.d.ts +9 -0
  348. package/fe/packages/ui/react/components/Menu/index.js +5 -0
  349. package/fe/packages/ui/react/components/Menu/menuTypes.d.ts +59 -0
  350. package/fe/packages/ui/react/components/Menu/menuTypes.js +1 -0
  351. package/fe/packages/ui/react/components/Menu/utils.d.ts +2 -0
  352. package/fe/packages/ui/react/components/Menu/utils.js +7 -0
  353. package/fe/packages/ui/react/components/Message/Message.js +4 -1
  354. package/fe/packages/ui/react/components/Modal/Modal.d.ts +3 -1
  355. package/fe/packages/ui/react/components/Modal/Modal.js +6 -43
  356. package/fe/packages/ui/react/components/Modal/ModalManager.js +4 -3
  357. package/fe/packages/ui/react/components/Overlay/Overlay.d.ts +23 -0
  358. package/fe/packages/ui/react/components/Overlay/Overlay.js +53 -0
  359. package/fe/packages/ui/react/components/Overlay/index.d.ts +3 -0
  360. package/fe/packages/ui/react/components/Overlay/index.js +1 -0
  361. package/fe/packages/ui/react/components/{Pagination.js → Pagination/Pagination.js} +4 -4
  362. package/fe/packages/ui/react/components/Pagination/index.d.ts +2 -0
  363. package/fe/packages/ui/react/components/Pagination/index.js +1 -0
  364. package/fe/packages/ui/react/components/Popup/Popup.d.ts +26 -0
  365. package/fe/packages/ui/react/components/Popup/Popup.js +81 -0
  366. package/fe/packages/ui/react/components/Popup/index.d.ts +2 -0
  367. package/fe/packages/ui/react/components/Popup/index.js +1 -0
  368. package/fe/packages/ui/react/components/Search/Search.d.ts +2 -2
  369. package/fe/packages/ui/react/components/Search/Search.js +3 -3
  370. package/fe/packages/ui/react/components/Select/Select.d.ts +5 -0
  371. package/fe/packages/ui/react/components/Select/Select.js +52 -109
  372. package/fe/packages/ui/react/components/Select/dropdownPositioning.d.ts +3 -0
  373. package/fe/packages/ui/react/components/Select/dropdownPositioning.js +13 -0
  374. package/fe/packages/ui/react/components/Skeleton/Skeleton.js +2 -2
  375. package/fe/packages/ui/react/components/Switch/Switch.js +3 -1
  376. package/fe/packages/ui/react/components/TableSearch/TableSearch.d.ts +5 -4
  377. package/fe/packages/ui/react/components/TableSearch/TableSearch.js +23 -21
  378. package/fe/packages/ui/react/components/TableSearch/lang.js +5 -14
  379. package/fe/packages/ui/react/components/{Textarea.d.ts → Textarea/Textarea.d.ts} +11 -3
  380. package/fe/packages/ui/react/components/Textarea/Textarea.js +37 -0
  381. package/fe/packages/ui/react/components/Textarea/index.d.ts +2 -0
  382. package/fe/packages/ui/react/components/Textarea/index.js +1 -0
  383. package/fe/packages/ui/react/components/{Tooltip.d.ts → Tooltip/Tooltip.d.ts} +2 -2
  384. package/fe/packages/ui/react/components/Tooltip/Tooltip.js +79 -0
  385. package/fe/packages/ui/react/components/Tooltip/index.d.ts +2 -0
  386. package/fe/packages/ui/react/components/Tooltip/index.js +1 -0
  387. package/fe/packages/ui/react/components/{TreeSelect.js → TreeSelect/TreeSelect.js} +9 -11
  388. package/fe/packages/ui/react/components/TreeSelect/index.d.ts +2 -0
  389. package/fe/packages/ui/react/components/TreeSelect/index.js +1 -0
  390. package/fe/packages/ui/react/components/Upload/ImageUpload.js +18 -6
  391. package/fe/packages/ui/react/components/Upload/Upload.js +2 -1
  392. package/fe/packages/ui/react/components/{breadcrumb.js → breadcrumb/breadcrumb.js} +15 -12
  393. package/fe/packages/ui/react/components/breadcrumb/index.d.ts +2 -0
  394. package/fe/packages/ui/react/components/breadcrumb/index.js +1 -0
  395. package/fe/packages/ui/react/components/hooks/useDropdownPositioning.d.ts +49 -0
  396. package/fe/packages/ui/react/components/hooks/useDropdownPositioning.js +137 -0
  397. package/fe/packages/ui/react/components/index.d.ts +7 -1
  398. package/fe/packages/ui/react/components/index.js +7 -1
  399. package/fe/packages/ui/react/components/table/index.d.ts +2 -0
  400. package/fe/packages/ui/react/components/table/index.js +1 -0
  401. package/fe/packages/ui/react/components/{table.d.ts → table/table.d.ts} +12 -2
  402. package/fe/packages/ui/react/components/table/table.js +116 -0
  403. package/fe/packages/ui/react/components/testPage/MenuTestPage.d.ts +2 -0
  404. package/fe/packages/ui/react/components/testPage/MenuTestPage.js +104 -0
  405. package/fe/packages/ui/react/components/testPage/index.js +300 -81
  406. package/fe/packages/ui/react/hooks/useExecuteOnce.d.ts +30 -0
  407. package/fe/packages/ui/react/hooks/useExecuteOnce.js +57 -0
  408. package/fe/packages/ui/react/hooks/useInit.d.ts +1 -1
  409. package/fe/packages/ui/react/hooks/useInit.js +1 -1
  410. package/fe/packages/ui/react/hooks/useLanguage.d.ts +1 -6
  411. package/fe/packages/ui/react/hooks/useRefState.d.ts +30 -0
  412. package/fe/packages/ui/react/hooks/useRefState.js +29 -0
  413. package/fe/packages/ui/react/hooks/useWatch.d.ts +23 -0
  414. package/fe/packages/ui/react/hooks/useWatch.js +87 -0
  415. package/fe/packages/ui/react/hooks/useWatch.test.d.ts +2 -0
  416. package/fe/packages/ui/react/hooks/useWatch.test.js +22 -0
  417. package/fe/packages/ui/react/i18n/I18nProvider.d.ts +31 -0
  418. package/fe/packages/ui/react/i18n/I18nProvider.js +25 -0
  419. package/fe/packages/ui/react/i18n/index.d.ts +4 -0
  420. package/fe/packages/ui/react/i18n/index.js +3 -0
  421. package/fe/packages/ui/react/i18n/useI18n.d.ts +13 -0
  422. package/fe/packages/ui/react/i18n/useI18n.js +18 -0
  423. package/fe/packages/ui/react/index.css +238 -0
  424. package/fe/packages/ui/react/index.d.ts +2 -0
  425. package/fe/packages/ui/react/index.js +2 -0
  426. package/fe/packages/ui/react/lib/createStoreHook.d.ts +9 -0
  427. package/fe/packages/ui/react/lib/createStoreHook.js +6 -0
  428. package/fe/packages/ui/react/lib/export.d.ts +2 -2
  429. package/fe/packages/ui/react/stores/language.d.ts +3 -12
  430. package/fe/packages/ui/react/stores/language.js +2 -51
  431. package/fe/typings/type.d.ts +5 -0
  432. package/fe/typings/type.js +1 -0
  433. package/model/index.d.ts +2 -0
  434. package/model/test.d.ts +2 -0
  435. package/model/types/data/button.d.ts +32 -0
  436. package/model/types/data/component.d.ts +40 -0
  437. package/model/types/data/fetchInfo.d.ts +20 -0
  438. package/model/types/data/schema.d.ts +98 -0
  439. package/model/types/data/search.d.ts +7 -0
  440. package/model/types/index.d.ts +3 -0
  441. package/model/types/menuType.d.ts +73 -0
  442. package/model/types/model.d.ts +33 -0
  443. package/package.json +36 -17
  444. package/{cjs → types}/app/controller/base.d.ts +4 -5
  445. package/types/app/controller/project.d.ts +22 -0
  446. package/{cjs → types}/app/controller/view.d.ts +1 -2
  447. package/types/app/extend/$fetch.d.ts +8 -0
  448. package/{cjs → types}/app/extend/db.d.ts +1 -1
  449. package/{cjs → types}/app/extend/logger.d.ts +1 -1
  450. package/{cjs → types}/app/extend/render-view.d.ts +1 -2
  451. package/{cjs → types}/app/middleware/api-params-verify.d.ts +1 -2
  452. package/{cjs → types}/app/middleware/api-sign-verify.d.ts +1 -2
  453. package/{esm/app/middleware/api-sign-verify.d.ts → types/app/middleware/error-handle.d.ts} +1 -3
  454. package/{cjs → types}/app/middleware/project-handler.d.ts +2 -2
  455. package/{cjs → types}/app/middleware.d.ts +0 -2
  456. package/{cjs/app/router/view.d.ts → types/app/router/project.d.ts} +1 -1
  457. package/types/app/router/view.d.ts +3 -0
  458. package/{cjs → types}/app/router-schema/project.d.ts +1 -1
  459. package/types/app/service/base.d.ts +9 -0
  460. package/types/app/service/project.d.ts +57 -0
  461. package/types/app/type.d.ts +5 -0
  462. package/{cjs → types}/app/typings.d.ts +17 -23
  463. package/types/bundler/defaultAlias.d.ts +3 -0
  464. package/types/bundler/index.d.ts +2 -0
  465. package/types/bundler/state.d.ts +18 -0
  466. package/types/bundler/utils.d.ts +9 -0
  467. package/types/config/config.default.d.ts +14 -0
  468. package/types/index.d.ts +28 -0
  469. package/types/packages/common/LRUCache.d.ts +1 -0
  470. package/types/packages/common/array/index.d.ts +6 -0
  471. package/types/packages/common/cache/LRUCache.d.ts +12 -0
  472. package/types/packages/common/cache/index.d.ts +1 -0
  473. package/types/packages/common/guards/index.d.ts +8 -0
  474. package/types/packages/common/http/index.d.ts +89 -0
  475. package/types/packages/common/i18n/default.d.ts +91 -0
  476. package/types/packages/common/i18n/en-US.d.ts +91 -0
  477. package/types/packages/common/i18n/index.d.ts +42 -0
  478. package/types/packages/common/i18n/locales.d.ts +7 -0
  479. package/types/packages/common/i18n/types.d.ts +70 -0
  480. package/types/packages/common/index.d.ts +10 -0
  481. package/types/packages/common/log/index.d.ts +32 -0
  482. package/types/packages/common/number/index.d.ts +2 -0
  483. package/types/packages/common/object/filterEmpty.d.ts +2 -0
  484. package/types/packages/common/object/filtereEmpty.d.ts +1 -0
  485. package/types/packages/common/object/index.d.ts +4 -0
  486. package/types/packages/common/string/index.d.ts +3 -0
  487. package/types/packages/common/types/index.d.ts +3 -0
  488. package/{cjs → types}/packages/core/index.d.ts +1 -1
  489. package/{cjs → types}/packages/core/loader/config.d.ts +1 -1
  490. package/{cjs → types}/packages/core/loader/controller.d.ts +2 -2
  491. package/{cjs → types}/packages/core/loader/middleware.d.ts +1 -1
  492. package/{esm → types}/packages/core/loader/model.d.ts +2 -3
  493. package/{cjs → types}/packages/core/loader/router-schema.d.ts +2 -2
  494. package/{cjs → types}/packages/core/loader/router.d.ts +1 -1
  495. package/{cjs → types}/packages/core/loader/service.d.ts +2 -2
  496. package/{cjs → types}/packages/core/types.d.ts +42 -3
  497. package/types/packages/utils/getAllFnReturnValue.d.ts +0 -0
  498. package/types/packages/utils/runFileFn.d.ts +7 -0
  499. package/types/typings/type.d.ts +4 -0
  500. package/cjs/app/controller/project.d.ts +0 -11
  501. package/cjs/app/middleware/error-handle.d.ts +0 -5
  502. package/cjs/app/router/project.d.ts +0 -4
  503. package/cjs/app/service/bese.d.ts +0 -10
  504. package/cjs/app/service/bese.js +0 -17
  505. package/cjs/app/service/project.d.ts +0 -27
  506. package/cjs/app/type.d.ts +0 -2
  507. package/cjs/bundler/index.d.ts +0 -1
  508. package/cjs/bundler/utils.d.ts +0 -7
  509. package/cjs/index.d.ts +0 -28
  510. package/cjs/packages/core/loader/model.d.ts +0 -36
  511. package/cjs/packages/utils/runFileFn.d.ts +0 -5
  512. package/cjs/typings/type.d.ts +0 -4
  513. package/cjs/typings/type.js +0 -2
  514. package/esm/app/controller/base.d.ts +0 -14
  515. package/esm/app/controller/project.d.ts +0 -12
  516. package/esm/app/controller/view.d.ts +0 -9
  517. package/esm/app/data/signKey.d.ts +0 -2
  518. package/esm/app/extend/db.d.ts +0 -3
  519. package/esm/app/extend/generateErrorMessage.d.ts +0 -8
  520. package/esm/app/extend/logger.d.ts +0 -12
  521. package/esm/app/extend/parsingParamsOnUrl.d.ts +0 -3
  522. package/esm/app/extend/render-view.d.ts +0 -5
  523. package/esm/app/middleware/api-params-verify.d.ts +0 -6
  524. package/esm/app/middleware/error-handle.d.ts +0 -6
  525. package/esm/app/middleware/project-handler.d.ts +0 -5
  526. package/esm/app/middleware.d.ts +0 -6
  527. package/esm/app/router/project.d.ts +0 -5
  528. package/esm/app/router/view.d.ts +0 -5
  529. package/esm/app/router-schema/project.d.ts +0 -4
  530. package/esm/app/service/bese.d.ts +0 -11
  531. package/esm/app/service/bese.js +0 -12
  532. package/esm/app/service/project.d.ts +0 -28
  533. package/esm/app/type.d.ts +0 -3
  534. package/esm/app/typings.d.ts +0 -50
  535. package/esm/bundler/dev.d.ts +0 -2
  536. package/esm/bundler/index.d.ts +0 -2
  537. package/esm/bundler/prod.d.ts +0 -2
  538. package/esm/bundler/utils.d.ts +0 -8
  539. package/esm/index.d.ts +0 -29
  540. package/esm/packages/core/env.d.ts +0 -16
  541. package/esm/packages/core/index.d.ts +0 -7
  542. package/esm/packages/core/loader/config.d.ts +0 -10
  543. package/esm/packages/core/loader/controller.d.ts +0 -18
  544. package/esm/packages/core/loader/extend.d.ts +0 -9
  545. package/esm/packages/core/loader/middleware.d.ts +0 -12
  546. package/esm/packages/core/loader/router-schema.d.ts +0 -19
  547. package/esm/packages/core/loader/router.d.ts +0 -9
  548. package/esm/packages/core/loader/service.d.ts +0 -18
  549. package/esm/packages/core/paths.d.ts +0 -12
  550. package/esm/packages/core/types.d.ts +0 -75
  551. package/esm/packages/utils/getAllFilesInFolder.d.ts +0 -10
  552. package/esm/packages/utils/getAllFnReturnValue.d.ts +0 -1
  553. package/esm/packages/utils/index.d.ts +0 -5
  554. package/esm/packages/utils/loadFile.d.ts +0 -21
  555. package/esm/packages/utils/path.d.ts +0 -25
  556. package/esm/packages/utils/runFileFn.d.ts +0 -6
  557. package/esm/typings/type.d.ts +0 -5
  558. package/fe/frontend/main.d.ts +0 -3
  559. package/fe/frontend/main.js +0 -6
  560. package/fe/packages/ui/react/components/ConfirmDialog.js +0 -9
  561. package/fe/packages/ui/react/components/DataTable/data-table.js +0 -141
  562. package/fe/packages/ui/react/components/Dropdown.d.ts +0 -16
  563. package/fe/packages/ui/react/components/Dropdown.js +0 -54
  564. package/fe/packages/ui/react/components/Form/SchemeForm/data.d.ts +0 -51
  565. package/fe/packages/ui/react/components/Form/SchemeForm/data.js +0 -8
  566. package/fe/packages/ui/react/components/Form/SchemeForm/index.js +0 -69
  567. package/fe/packages/ui/react/components/Textarea.js +0 -35
  568. package/fe/packages/ui/react/components/Tooltip.js +0 -118
  569. package/fe/packages/ui/react/components/table.js +0 -20
  570. package/fe/packages/ui/react/locales/index.d.ts +0 -8
  571. package/fe/packages/ui/react/locales/index.js +0 -6
  572. /package/{cjs/packages/utils/getAllFnReturnValue.d.ts → esm/packages/common/i18n/types.js} +0 -0
  573. /package/{esm/typings/type.js → fe/frontend/apps/dash/types.js} +0 -0
  574. /package/fe/packages/ui/react/components/{ConfirmDialog.d.ts → ConfirmDialog/ConfirmDialog.d.ts} +0 -0
  575. /package/fe/packages/ui/react/components/{Pagination.d.ts → Pagination/Pagination.d.ts} +0 -0
  576. /package/fe/packages/ui/react/components/{TreeSelect.d.ts → TreeSelect/TreeSelect.d.ts} +0 -0
  577. /package/fe/packages/ui/react/components/{breadcrumb.d.ts → breadcrumb/breadcrumb.d.ts} +0 -0
  578. /package/{cjs → types}/app/data/signKey.d.ts +0 -0
  579. /package/{cjs → types}/app/extend/generateErrorMessage.d.ts +0 -0
  580. /package/{cjs → types}/app/extend/parsingParamsOnUrl.d.ts +0 -0
  581. /package/{cjs → types}/bundler/dev.d.ts +0 -0
  582. /package/{cjs → types}/bundler/prod.d.ts +0 -0
  583. /package/{cjs → types}/packages/core/env.d.ts +0 -0
  584. /package/{cjs → types}/packages/core/loader/extend.d.ts +0 -0
  585. /package/{cjs → types}/packages/core/paths.d.ts +0 -0
  586. /package/{cjs → types}/packages/utils/getAllFilesInFolder.d.ts +0 -0
  587. /package/{cjs → types}/packages/utils/index.d.ts +0 -0
  588. /package/{cjs → types}/packages/utils/loadFile.d.ts +0 -0
  589. /package/{cjs → types}/packages/utils/path.d.ts +0 -0
@@ -1,13 +1,96 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../../lib/utils';
2
3
  import { MoreHorizontal } from 'lucide-react';
4
+ import { useCallback, useLayoutEffect, useRef, useState } from 'react';
5
+ import { Button } from '../Button';
3
6
  import { Dropdown } from '../Dropdown';
4
- export const ActionBtn = ({ actions }) => {
7
+ const isInlineAction = (action) => !('render' in action);
8
+ const renderActionLabel = (action) => (_jsxs(_Fragment, { children: [action.icon && _jsx("span", { className: "flex-shrink-0", children: action.icon }), _jsx("span", { className: "truncate", children: action.label })] }));
9
+ const canShowInlineActions = (actions) => actions.every(isInlineAction);
10
+ const InlineActions = ({ actions }) => (_jsx("div", { className: "tc-ui-action-btn-list inline-flex max-w-full items-center justify-center gap-1 whitespace-nowrap", children: actions.map((action) => isInlineAction(action) ? (_jsx(Button, { type: "button", onClick: action.onClick, className: cn('tc-ui-action-btn inline-flex h-8 max-w-full items-center justify-center gap-1 rounded px-2 text-sm transition-colors', action.danger
11
+ ? 'text-destructive hover:bg-destructive/10'
12
+ : 'text-table-action-text hover:bg-background/60'), children: renderActionLabel(action) }, action.key)) : null) }));
13
+ const DropdownActions = ({ actions }) => (_jsx(Dropdown, { items: actions, placement: "bottom-end", children: _jsx(Button, { type: "button", state: "ghost", variant: "text", "aria-label": "More actions", className: "inline-flex h-8 w-8 items-center justify-center rounded-md text-table-action-text transition-colors hover:bg-background/60 focus-visible:ring-border", children: _jsx(MoreHorizontal, { className: "h-5 w-5 opacity-70" }) }) }));
14
+ const AutoActionBtn = ({ actions }) => {
15
+ const containerRef = useRef(null);
16
+ const measureRef = useRef(null);
17
+ const [canShowInline, setCanShowInline] = useState(false);
18
+ const updateOverflow = useCallback(() => {
19
+ const container = containerRef.current;
20
+ const measure = measureRef.current;
21
+ if (!container || !measure) {
22
+ setCanShowInline(false);
23
+ return;
24
+ }
25
+ const containerWidth = container.clientWidth;
26
+ const actionsWidth = measure.scrollWidth;
27
+ setCanShowInline(containerWidth > 0 && actionsWidth <= containerWidth);
28
+ }, []);
29
+ useLayoutEffect(() => {
30
+ if (!canShowInlineActions(actions))
31
+ return;
32
+ if (actions.length <= 1)
33
+ return;
34
+ updateOverflow();
35
+ let rafId = 0;
36
+ const scheduleUpdate = () => {
37
+ cancelAnimationFrame(rafId);
38
+ rafId = requestAnimationFrame(updateOverflow);
39
+ };
40
+ if (typeof ResizeObserver === 'undefined') {
41
+ window.addEventListener('resize', scheduleUpdate);
42
+ return () => {
43
+ cancelAnimationFrame(rafId);
44
+ window.removeEventListener('resize', scheduleUpdate);
45
+ };
46
+ }
47
+ const observer = new ResizeObserver(scheduleUpdate);
48
+ if (containerRef.current) {
49
+ observer.observe(containerRef.current);
50
+ }
51
+ if (measureRef.current) {
52
+ observer.observe(measureRef.current);
53
+ }
54
+ window.addEventListener('resize', scheduleUpdate);
55
+ return () => {
56
+ cancelAnimationFrame(rafId);
57
+ observer.disconnect();
58
+ window.removeEventListener('resize', scheduleUpdate);
59
+ };
60
+ }, [actions, updateOverflow]);
5
61
  if (actions.length === 0) {
6
62
  return '-';
7
63
  }
64
+ if (actions.length === 1) {
65
+ if (!canShowInlineActions(actions)) {
66
+ return _jsx(DropdownActions, { actions: actions });
67
+ }
68
+ return _jsx(InlineActions, { actions: actions });
69
+ }
70
+ if (!canShowInlineActions(actions)) {
71
+ return _jsx(DropdownActions, { actions: actions });
72
+ }
73
+ return (_jsxs("div", { ref: containerRef, className: "relative w-full min-w-0", children: [_jsx("div", { ref: measureRef, "aria-hidden": "true", className: "pointer-events-none invisible absolute left-0 top-0 w-max max-w-none", children: _jsx(InlineActions, { actions: actions }) }), canShowInline ? _jsx(InlineActions, { actions: actions }) : _jsx(DropdownActions, { actions: actions })] }));
74
+ };
75
+ export const ActionBtn = ({ actions, overflow }) => {
76
+ if (overflow === 'dropdown') {
77
+ return actions.length === 0 ? '-' : _jsx(DropdownActions, { actions: actions });
78
+ }
79
+ if (overflow === 'auto') {
80
+ return _jsx(AutoActionBtn, { actions: actions });
81
+ }
82
+ if (actions.length === 0) {
83
+ return '-';
84
+ }
85
+ if (overflow === 'inline') {
86
+ return canShowInlineActions(actions) ? (_jsx(InlineActions, { actions: actions })) : (_jsx(DropdownActions, { actions: actions }));
87
+ }
8
88
  if (actions.length === 1) {
9
89
  const action = actions[0];
10
- return (_jsx("button", { onClick: action.onClick, className: "inline-flex items-center justify-center w-8 h-8 rounded transition-colors", children: action.label }));
90
+ if (!isInlineAction(action)) {
91
+ return _jsx(DropdownActions, { actions: actions });
92
+ }
93
+ return (_jsx(Button, { type: "button", onClick: action.onClick, className: "tc-ui-action-btn inline-flex items-center justify-center w-8 h-8 rounded transition-colors", children: action.label }));
11
94
  }
12
- return (_jsx(Dropdown, { items: actions, children: _jsx("button", { className: "inline-flex items-center justify-center w-8 h-8 rounded transition-colors", children: _jsx(MoreHorizontal, { className: "h-5 w-5 text-gray-600" }) }) }));
95
+ return _jsx(DropdownActions, { actions: actions });
13
96
  };
@@ -1,7 +1,15 @@
1
1
  import { type ReactNode } from 'react';
2
+ import type { DropdownItem } from '../Dropdown';
2
3
  import { type PaginationProps } from '../Pagination';
4
+ import { type TableFixed } from '../table';
3
5
  import type { ColumnDef } from '../types/baseType';
4
- export type { ColumnDef } from '../types/baseType';
6
+ import { type ActionOverflow } from './ActionBtn';
7
+ type DataTableActionColumnOptions<T> = {
8
+ actions?: DropdownItem[] | ((value: unknown, record: T, index: number) => DropdownItem[]);
9
+ actionOverflow?: ActionOverflow;
10
+ fixed?: TableFixed;
11
+ };
12
+ type TableColumnDef<T = Record<string, unknown>> = ColumnDef<T> & DataTableActionColumnOptions<T>;
5
13
  type RowSelection<T> = {
6
14
  /**
7
15
  * 受控用法:完全由外部维护选中 keys
@@ -25,7 +33,7 @@ type RowSelection<T> = {
25
33
  beforeCheckboxNode?: ReactNode;
26
34
  };
27
35
  interface DataTableProps<T = Record<string, unknown>> {
28
- columns: ColumnDef<T>[];
36
+ columns: TableColumnDef<T>[];
29
37
  data: T[];
30
38
  rowKey?: keyof T | ((record: T, index: number) => string | number);
31
39
  rowSelection?: RowSelection<T>;
@@ -40,5 +48,5 @@ interface DataTableProps<T = Record<string, unknown>> {
40
48
  export declare function DataTable<T = Record<string, unknown>>({ columns, data: pData, loading, rowKey, rowSelection, defaultColumnWidth, pagination: pPagination, }: DataTableProps<T>): import("react/jsx-runtime").JSX.Element;
41
49
  export { ActionBtn } from './ActionBtn';
42
50
  export type { ActionBtnProps } from './ActionBtn';
43
- export type { DataTableProps, RowSelection };
44
- //# sourceMappingURL=data-table.d.ts.map
51
+ export type { DataTableProps, RowSelection, TableColumnDef };
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,187 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import noResult from '@tc/ui-react/assets/table/no-result.svg';
3
+ import { useI18n } from '../../i18n';
4
+ import { useMemo, useState } from 'react';
5
+ import { Checkbox } from '../Checkbox';
6
+ import { Pagination } from '../Pagination';
7
+ import { Skeleton } from '../Skeleton';
8
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../table';
9
+ import { ActionBtn } from './ActionBtn';
10
+ const defaultRowKey = 'id';
11
+ const rowSelectionColumnWidth = 48;
12
+ const actionColumnWidth = 96;
13
+ const zeroOffset = '0px';
14
+ const getRowKey = (record, index, rowKey = defaultRowKey) => {
15
+ if (typeof rowKey === 'function') {
16
+ return rowKey(record, index);
17
+ }
18
+ const key = record[rowKey];
19
+ return typeof key === 'string' || typeof key === 'number' ? key : index;
20
+ };
21
+ const renderCellContent = (column, value, record, rowIndex, hasAction) => {
22
+ if (hasAction && column.actions) {
23
+ const actions = typeof column.actions === 'function' ? column.actions(value, record, rowIndex) : column.actions;
24
+ return (_jsx("div", { className: "flex w-full min-w-0 justify-center", children: _jsx(ActionBtn, { actions: actions, overflow: column.actionOverflow ?? 'auto' }) }));
25
+ }
26
+ return column.render ? column.render(value, record, rowIndex) : value;
27
+ };
28
+ const getColumnWidth = (column, defaultColumnWidth) => {
29
+ const hasAction = column.isAction ?? column.key === 'action';
30
+ if (column.width) {
31
+ return column.width;
32
+ }
33
+ return `${hasAction ? actionColumnWidth : defaultColumnWidth}px`;
34
+ };
35
+ const getColumnStyle = (column, defaultColumnWidth) => {
36
+ const hasAction = column.isAction ?? column.key === 'action';
37
+ if (column.width || hasAction) {
38
+ const width = getColumnWidth(column, defaultColumnWidth);
39
+ return { width, minWidth: width };
40
+ }
41
+ return { minWidth: defaultColumnWidth };
42
+ };
43
+ const getFixedOffset = (widths) => {
44
+ if (widths.length === 0)
45
+ return zeroOffset;
46
+ if (widths.length === 1)
47
+ return widths[0];
48
+ return `calc(${widths.join(' + ')})`;
49
+ };
50
+ export function DataTable({ columns, data: pData, loading, rowKey = defaultRowKey, rowSelection, defaultColumnWidth = 100, pagination: pPagination, }) {
51
+ const t = useI18n();
52
+ const getCellValue = (record, column) => record[(column.dataIndex || column.key)];
53
+ const isControlled = rowSelection && Array.isArray(rowSelection.selectedRowKeys);
54
+ const [innerSelectedRowKeys, setInnerSelectedRowKeys] = useState(rowSelection?.defaultSelectedRowKeys ?? []);
55
+ const selectedRowKeys = (isControlled ? rowSelection?.selectedRowKeys : innerSelectedRowKeys) ?? [];
56
+ const selectedKeySet = new Set(selectedRowKeys);
57
+ const [currentPage, setCurrentPage] = useState(1);
58
+ const { showPagination, pagination, data, pageStartIndex } = useMemo(() => {
59
+ let pagination;
60
+ let data = pData;
61
+ let showPagination;
62
+ let pageStartIndex = 0;
63
+ // 使用外部
64
+ if (pPagination) {
65
+ pagination = pPagination;
66
+ showPagination = pagination.total > 0;
67
+ }
68
+ // 使用内部
69
+ else {
70
+ pagination = {
71
+ onChange(v) {
72
+ setCurrentPage(v);
73
+ },
74
+ current: currentPage,
75
+ pageSize: 10,
76
+ total: pData.length,
77
+ };
78
+ showPagination = pData.length > pagination.pageSize;
79
+ pageStartIndex = (pagination.current - 1) * pagination.pageSize;
80
+ data = pData.slice(pageStartIndex, pagination.current * pagination.pageSize);
81
+ }
82
+ return {
83
+ showPagination,
84
+ pagination,
85
+ data,
86
+ pageStartIndex,
87
+ };
88
+ }, [currentPage, pData, pPagination]);
89
+ const pageRowKeys = data.map((record, index) => getRowKey(record, pageStartIndex + index, rowKey));
90
+ const handleRowSelectChange = (key) => {
91
+ if (!rowSelection)
92
+ return;
93
+ const nextSelectedKeys = selectedKeySet.has(key)
94
+ ? selectedRowKeys.filter((k) => k !== key)
95
+ : [...selectedRowKeys, key];
96
+ const nextSelectedKeySet = new Set(nextSelectedKeys);
97
+ const selectedRows = pData.filter((record, index) => nextSelectedKeySet.has(getRowKey(record, index, rowKey)));
98
+ if (!isControlled) {
99
+ setInnerSelectedRowKeys(nextSelectedKeys);
100
+ }
101
+ rowSelection.onChange?.(nextSelectedKeys, selectedRows, false);
102
+ };
103
+ const handleSelectAllChange = (event) => {
104
+ if (!rowSelection)
105
+ return;
106
+ const checked = event.target.checked;
107
+ let nextSelectedKeys;
108
+ if (checked) {
109
+ const pageKeySet = new Set(pageRowKeys);
110
+ nextSelectedKeys = Array.from(new Set([
111
+ ...selectedRowKeys,
112
+ //
113
+ ...pageRowKeys.filter((key) => !selectedKeySet.has(key)),
114
+ ]))
115
+ //
116
+ .filter((key) => pageKeySet.has(key) || selectedKeySet.has(key));
117
+ }
118
+ else {
119
+ const pageKeySet = new Set(pageRowKeys);
120
+ nextSelectedKeys = selectedRowKeys.filter((key) => !pageKeySet.has(key));
121
+ }
122
+ const nextSelectedKeySet = new Set(nextSelectedKeys);
123
+ const selectedRows = pData.filter((record, index) => nextSelectedKeySet.has(getRowKey(record, index, rowKey)));
124
+ if (!isControlled) {
125
+ setInnerSelectedRowKeys(nextSelectedKeys);
126
+ }
127
+ rowSelection.onChange?.(nextSelectedKeys, selectedRows, checked);
128
+ };
129
+ const allChecked = rowSelection
130
+ ? (rowSelection.isAll ?? (pageRowKeys.length > 0 && pageRowKeys.every((key) => selectedKeySet.has(key))))
131
+ : false;
132
+ const partiallyChecked = rowSelection ? pageRowKeys.some((key) => selectedKeySet.has(key)) && !allChecked : false;
133
+ const fixedColumns = useMemo(() => {
134
+ const columnsWithFixed = columns.map((column, index) => {
135
+ const hasAction = column.isAction ?? column.key === 'action';
136
+ return {
137
+ column,
138
+ index,
139
+ fixed: column.fixed ?? (hasAction ? 'right' : undefined),
140
+ width: getColumnWidth(column, defaultColumnWidth),
141
+ };
142
+ });
143
+ const leftOffsetWidths = rowSelection ? [`${rowSelectionColumnWidth}px`] : [];
144
+ const leftOffsets = new Map();
145
+ for (const item of columnsWithFixed) {
146
+ if (item.fixed !== 'left')
147
+ continue;
148
+ leftOffsets.set(item.index, getFixedOffset(leftOffsetWidths));
149
+ leftOffsetWidths.push(item.width);
150
+ }
151
+ const rightOffsetWidths = [];
152
+ const rightOffsets = new Map();
153
+ for (const item of [...columnsWithFixed].reverse()) {
154
+ if (item.fixed !== 'right')
155
+ continue;
156
+ rightOffsets.set(item.index, getFixedOffset(rightOffsetWidths));
157
+ rightOffsetWidths.push(item.width);
158
+ }
159
+ return columnsWithFixed.map((item) => ({
160
+ ...item,
161
+ fixedOffset: item.fixed === 'left'
162
+ ? leftOffsets.get(item.index)
163
+ : item.fixed === 'right'
164
+ ? rightOffsets.get(item.index)
165
+ : undefined,
166
+ }));
167
+ }, [columns, defaultColumnWidth, rowSelection]);
168
+ return (_jsxs("div", { className: "tc-ui-data-table bg-background rounded-[20px] overflow-hidden relative", children: [_jsxs(Table, { containerClassName: "rounded-b-none overflow-x-auto", children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [rowSelection && (_jsxs(TableHead, { fixed: "left", style: {
169
+ width: '48px',
170
+ minWidth: '48px',
171
+ }, children: [rowSelection.beforeCheckboxNode, _jsx(Checkbox, { checked: allChecked, "aria-label": "Select all rows", indeterminate: partiallyChecked, onChange: (_, event) => handleSelectAllChange(event) })] })), fixedColumns.map(({ column, fixed, fixedOffset }) => {
172
+ const hasAction = column.isAction ?? column.key === 'action';
173
+ return (_jsx(TableHead, { isAction: hasAction, fixed: fixed, fixedOffset: fixedOffset, style: getColumnStyle(column, defaultColumnWidth), children: column.title }, column.key));
174
+ })] }) }), _jsx(TableBody, { children: data.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: columns.length + (rowSelection ? 1 : 0), className: "text-muted-foreground", children: _jsxs("div", { className: "flex flex-col items-center w-full gap-2.5", children: [_jsx("img", { src: noResult, alt: t('components.dataTable.noData'), className: " w-24 h-24" }), t('components.dataTable.noData')] }) }) })) : (data.map((record, rowIndex) => {
175
+ const absoluteRowIndex = pageStartIndex + rowIndex;
176
+ const recordKey = getRowKey(record, absoluteRowIndex, rowKey);
177
+ return (_jsxs(TableRow, { children: [rowSelection && (_jsx(TableCell, { fixed: "left", style: {
178
+ width: '48px',
179
+ minWidth: '48px',
180
+ }, children: _jsx(Checkbox, { checked: selectedKeySet.has(recordKey), "aria-label": "Select row", onChange: () => handleRowSelectChange(recordKey) }) })), fixedColumns.map(({ column, fixed, fixedOffset }) => {
181
+ const value = getCellValue(record, column);
182
+ const hasAction = column.isAction ?? column.key === 'action';
183
+ return (_jsx(TableCell, { isAction: hasAction, fixed: fixed, fixedOffset: fixedOffset, style: getColumnStyle(column, defaultColumnWidth), children: renderCellContent(column, value, record, rowIndex, hasAction) }, column.key));
184
+ })] }, recordKey));
185
+ })) })] }), loading && (_jsx("div", { className: "absolute inset-0 rounded-[20px] bg-background/70 text-sm text-gray-600 z-[100]", children: _jsx(Skeleton, { mode: "tableloading", rows: 8 }) })), showPagination && (_jsx("div", { className: "px-6 pb-6 mt-6", children: _jsx(Pagination, { ...pagination }) }))] }));
186
+ }
187
+ export { ActionBtn } from './ActionBtn';
@@ -4,6 +4,7 @@ import { addMonths, addYears, eachDayOfInterval, endOfDay, endOfMonth, endOfWeek
4
4
  import { zhCN } from 'date-fns/locale';
5
5
  import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react';
6
6
  import { useMemo, useState } from 'react';
7
+ import { Button } from '../Button';
7
8
  import { ModeType } from './data';
8
9
  import { useDateLocale } from './LocaleContext';
9
10
  import { TimePicker } from './TimePicker';
@@ -190,13 +191,13 @@ export function Calendar({ mode = ModeType.Single, value, onChange, disabledDate
190
191
  const handleTimeChangeInternal = (date) => {
191
192
  setPendingValue(date);
192
193
  };
193
- return (_jsxs("div", { className: cn('p-3', showTime || isRangeMode ? 'flex flex-col' : 'w-[280px]', className), children: [_jsxs("div", { className: cn('flex', (showTime || isRangeMode) && 'gap-4'), children: [isRangeMode && (_jsxs("div", { className: "w-[140px] pr-3 border-r border-border", children: [_jsx("div", { className: "text-xs font-medium text-muted-foreground mb-2", children: locale.quickRanges }), _jsx("div", { className: "space-y-1", children: quickRangePresets.map((preset) => (_jsx("button", { type: "button", onClick: () => handleQuickRangeClick(preset.getRange), className: cn('w-full text-left text-xs px-2 py-1 rounded', 'text-foreground hover:bg-muted transition-colors'), children: preset.label }, preset.label))) })] })), _jsxs("div", { className: "w-[280px]", children: [_jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx("button", { onClick: prevYear, className: "p-1 hover:bg-muted rounded text-muted-foreground hover:text-foreground transition-colors", type: "button", children: _jsx(ChevronsLeft, { size: 16 }) }), _jsx("button", { onClick: prevMonth, className: "p-1 hover:bg-muted rounded text-muted-foreground hover:text-foreground transition-colors", type: "button", children: _jsx(ChevronLeft, { size: 16 }) })] }), _jsx("div", { className: "font-medium text-sm", children: format(currentMonth, 'yyyy年 M月', { locale: zhCN }) }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("button", { onClick: nextMonth, className: "p-1 hover:bg-muted rounded text-muted-foreground hover:text-foreground transition-colors", type: "button", children: _jsx(ChevronRight, { size: 16 }) }), _jsx("button", { onClick: nextYear, className: "p-1 hover:bg-muted rounded text-muted-foreground hover:text-foreground transition-colors", type: "button", children: _jsx(ChevronsRight, { size: 16 }) })] })] }), _jsx("div", { className: "grid grid-cols-7 mb-2", children: weekDays.map((day) => (_jsx("div", { className: "text-center text-xs text-muted-foreground font-medium py-1", children: day }, day))) }), _jsx("div", { className: "grid grid-cols-7 gap-y-1", onMouseLeave: () => setHoverDate(null), children: days.map((date, i) => {
194
+ return (_jsxs("div", { className: cn('tc-ui-calendar p-3', showTime || isRangeMode ? 'flex flex-col' : 'w-[280px]', className), children: [_jsxs("div", { className: cn('flex', (showTime || isRangeMode) && 'gap-4'), children: [isRangeMode && (_jsxs("div", { className: "w-[140px] pr-3 border-r border-border", children: [_jsx("div", { className: "text-xs font-medium text-muted-foreground mb-2", children: locale.quickRanges }), _jsx("div", { className: "space-y-1", children: quickRangePresets.map((preset) => (_jsx(Button, { variant: "text", type: "button", onClick: () => handleQuickRangeClick(preset.getRange), className: cn('w-full justify-start text-left text-xs px-2 py-1 rounded', 'text-foreground hover:bg-muted transition-colors'), children: preset.label }, preset.label))) })] })), _jsxs("div", { className: "w-[280px]", children: [_jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { variant: "text", onClick: prevYear, className: "p-1 hover:bg-muted rounded text-muted-foreground hover:text-foreground transition-colors", type: "button", children: _jsx(ChevronsLeft, { size: 16 }) }), _jsx(Button, { variant: "text", onClick: prevMonth, className: "p-1 hover:bg-muted rounded text-muted-foreground hover:text-foreground transition-colors", type: "button", children: _jsx(ChevronLeft, { size: 16 }) })] }), _jsx("div", { className: "font-medium text-sm", children: format(currentMonth, locale.monthFormat, { locale: zhCN }) }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { variant: "text", onClick: nextMonth, className: "p-1 hover:bg-muted rounded text-muted-foreground hover:text-foreground transition-colors", type: "button", children: _jsx(ChevronRight, { size: 16 }) }), _jsx(Button, { variant: "text", onClick: nextYear, className: "p-1 hover:bg-muted rounded text-muted-foreground hover:text-foreground transition-colors", type: "button", children: _jsx(ChevronsRight, { size: 16 }) })] })] }), _jsx("div", { className: "grid grid-cols-7 mb-2", children: weekDays.map((day) => (_jsx("div", { className: "text-center text-xs text-muted-foreground font-medium py-1", children: day }, day))) }), _jsx("div", { className: "grid grid-cols-7 gap-y-1", onMouseLeave: () => setHoverDate(null), children: days.map((date, i) => {
194
195
  const selected = isSelected(date);
195
196
  const inRange = isInRange(date);
196
197
  const isToday = isSameDay(date, new Date());
197
198
  const isCurrentMonth = isSameMonth(date, currentMonth);
198
199
  const isDisabled = disabledDate?.(date);
199
- return (_jsx("div", { className: "flex justify-center p-0", children: _jsx("button", { type: "button", onClick: () => handleDateClick(date), onMouseEnter: () => setHoverDate(date), disabled: isDisabled, className: cn('w-8 h-8 flex items-center justify-center rounded text-sm transition-colors relative z-10', !isCurrentMonth && 'text-muted-foreground/40', isCurrentMonth && !selected && !inRange && !isDisabled && 'text-foreground hover:bg-muted', selected && 'bg-theme text-theme-foreground hover:bg-theme/90', inRange && !selected && 'bg-theme/10 text-theme', !selected && !inRange && isToday && 'border border-theme text-theme', isDisabled && 'text-muted-foreground cursor-not-allowed hover:bg-transparent opacity-50'), children: format(date, 'd') }) }, i));
200
+ return (_jsx("div", { className: "flex justify-center p-0", children: _jsx(Button, { variant: "text", type: "button", onClick: () => handleDateClick(date), onMouseEnter: () => setHoverDate(date), disabled: isDisabled, className: cn('w-8 h-8 flex items-center justify-center rounded text-sm transition-colors relative z-10', !isCurrentMonth && 'text-muted-foreground/40', isCurrentMonth && !selected && !inRange && !isDisabled && 'text-foreground hover:bg-muted', selected && 'bg-theme text-theme-foreground hover:bg-theme/90', inRange && !selected && 'bg-theme/10 text-theme', !selected && !inRange && isToday && 'border border-theme text-theme', isDisabled && 'text-muted-foreground cursor-not-allowed hover:bg-transparent opacity-50'), children: format(date, 'd') }) }, i));
200
201
  }) })] }), showTime && (_jsx("div", { className: "flex flex-col border-l border-border pl-4", children: mode === ModeType.Single ? (_jsxs("div", { className: "flex flex-col justify-center h-full", children: [_jsx("div", { className: "text-xs font-medium text-muted-foreground mb-3 text-center", children: locale.selectTime }), _jsx(TimePicker, { value: pendingValue instanceof Date ? pendingValue : undefined, onChange: handleTimeChangeInternal, className: "border-0" })] })) : (
201
202
  // Range mode: show two time pickers
202
203
  _jsxs("div", { className: "space-y-4 flex flex-col justify-center h-full", children: [_jsxs("div", { children: [_jsx("div", { className: "text-xs font-medium text-muted-foreground mb-2 text-center", children: locale.startTime }), _jsx(TimePicker, { value: pendingValue && 'from' in pendingValue && pendingValue.from ? pendingValue.from : undefined, onChange: (newDate) => {
@@ -211,5 +212,5 @@ export function Calendar({ mode = ModeType.Single, value, onChange, disabledDate
211
212
  from: range?.from,
212
213
  to: newDate,
213
214
  });
214
- }, className: "border-0" })] }))] })) }))] }), showTime && (_jsx("div", { className: "pt-3 mt-3 border-t border-border", children: _jsx("button", { type: "button", onClick: handleConfirm, className: cn('w-full py-2 px-4 rounded', 'bg-theme text-theme-foreground', 'hover:bg-theme/90 transition-colors', 'text-sm font-medium'), children: locale.confirm }) }))] }));
215
+ }, className: "border-0" })] }))] })) }))] }), showTime && (_jsx("div", { className: "pt-3 mt-3 border-t border-border", children: _jsx(Button, { variant: "primary", type: "button", onClick: handleConfirm, className: cn('w-full py-2 px-4 rounded', 'bg-theme text-theme-foreground', 'hover:bg-theme/90 transition-colors', 'text-sm font-medium'), children: locale.confirm }) }))] }));
215
216
  }
@@ -1,6 +1,6 @@
1
- import { type DateRange, type QuickRangePreset } from './Calendar';
2
- import { ModeType } from './data';
3
- import { type DateLocaleConfig } from './locales';
1
+ import { type DateRange, type QuickRangePreset } from "./Calendar";
2
+ import { ModeType } from "./data";
3
+ import { type DateLocaleConfig } from "./locales";
4
4
  export type DateChangeStrValue = [string, string] | string;
5
5
  type DateBaseValue = Date | DateRange;
6
6
  type Dates = DateBaseValue | [Date, Date];
@@ -29,6 +29,8 @@ export type DatePickerProps = {
29
29
  * 不传则使用默认预设
30
30
  */
31
31
  quickRanges?: QuickRangePreset[];
32
+ /** 自定义弹出容器,不传则默认挂载到 document.body */
33
+ getPopupContainer?: () => HTMLElement;
32
34
  };
33
35
  declare const DatePicker: import("react").ForwardRefExoticComponent<DatePickerProps & import("react").RefAttributes<HTMLDivElement>>;
34
36
  export { DatePicker };
@@ -1,17 +1,22 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { cn } from '../../lib/utils';
3
- import { format as formatDate, isValid, parse } from 'date-fns';
4
- import { Calendar as CalendarIcon, X } from 'lucide-react';
5
- import { forwardRef, useEffect, useMemo, useRef, useState } from 'react';
6
- import { Calendar } from './Calendar';
7
- import { ModeType } from './data';
8
- import { useDateLocale } from './LocaleContext';
2
+ import { cn } from "../../lib/utils";
3
+ import { format as formatDate, isValid, parse } from "date-fns";
4
+ import { Calendar as CalendarIcon, X } from "lucide-react";
5
+ import { forwardRef, useEffect, useMemo, useRef, useState } from "react";
6
+ import { Button } from "../Button";
7
+ import { Input } from "../Input";
8
+ import { Popup } from "../Popup";
9
+ import { useDropdownPositioning } from "../hooks/useDropdownPositioning";
10
+ import { Calendar } from "./Calendar";
11
+ import { ModeType } from "./data";
12
+ import { getDatePickerDropdownPosition } from "./dropdownPositioning";
13
+ import { useDateLocale } from "./LocaleContext";
9
14
  const formatValue = (val, format) => {
10
15
  if (!val)
11
- return '';
16
+ return "";
12
17
  if (val instanceof Date)
13
18
  return formatDate(val, format);
14
- if ('from' in val) {
19
+ if ("from" in val) {
15
20
  if (val.from && val.to) {
16
21
  return `${formatDate(val.from, format)} - ${formatDate(val.to, format)}`;
17
22
  }
@@ -19,24 +24,26 @@ const formatValue = (val, format) => {
19
24
  return formatDate(val.from, format);
20
25
  }
21
26
  }
22
- return '';
27
+ return "";
23
28
  };
24
29
  const formatDateValue = (val, format) => {
25
30
  if (!val)
26
- return '';
31
+ return "";
27
32
  /**
28
33
  * 将 DateBaseValue 转为 yyyy-MM-dd | [yyyy-MM-dd, yyyy-MM-dd]
29
34
  */
30
35
  if (val instanceof Date)
31
36
  return formatDate(val, format);
32
- if ('from' in val) {
37
+ if ("from" in val) {
33
38
  if (val.from && val.to) {
34
39
  return [formatDate(val.from, format), formatDate(val.to, format)];
35
40
  }
36
41
  }
37
- return '';
42
+ return "";
38
43
  };
39
- const DatePicker = forwardRef(({ mode = ModeType.Single, className, format: customFormat, placeholder, allowClear = true, disabled = false, showTime = false, value: pValue, defaultValue: pDefaultValue, onChange, disabledDate, locale: customLocale, quickRanges, }, ref) => {
44
+ const DatePicker = forwardRef((props, ref) => {
45
+ const { mode = ModeType.Single, className, format: customFormat, placeholder, allowClear = true, disabled = false, showTime = false, value: pValue, defaultValue: pDefaultValue, onChange, disabledDate, locale: customLocale, quickRanges, getPopupContainer, } = props;
46
+ const isControlled = Object.prototype.hasOwnProperty.call(props, "value");
40
47
  const contextLocale = useDateLocale();
41
48
  const locale = { ...contextLocale, ...customLocale };
42
49
  // 如果没有传入 placeholder,根据模式自动选择
@@ -49,7 +56,7 @@ const DatePicker = forwardRef(({ mode = ModeType.Single, className, format: cust
49
56
  ? locale.placeholderRange
50
57
  : locale.placeholder);
51
58
  // Auto-adjust format based on showTime
52
- const format = customFormat || (showTime ? 'yyyy-MM-dd HH:mm' : 'yyyy-MM-dd');
59
+ const format = customFormat || (showTime ? "yyyy-MM-dd HH:mm" : "yyyy-MM-dd");
53
60
  const { value, defaultValue } = useMemo(() => {
54
61
  /**
55
62
  * 将 DateChangeStrValue 转为 Dates
@@ -61,10 +68,10 @@ const DatePicker = forwardRef(({ mode = ModeType.Single, className, format: cust
61
68
  if (val instanceof Date)
62
69
  return val;
63
70
  // Already a DateRange object
64
- if (typeof val === 'object' && 'from' in val)
71
+ if (typeof val === "object" && "from" in val)
65
72
  return val;
66
73
  // String value - single date
67
- if (typeof val === 'string') {
74
+ if (typeof val === "string") {
68
75
  try {
69
76
  const parsed = parse(val, format, new Date());
70
77
  return isValid(parsed) ? parsed : undefined;
@@ -76,7 +83,7 @@ const DatePicker = forwardRef(({ mode = ModeType.Single, className, format: cust
76
83
  // date range
77
84
  if (Array.isArray(val)) {
78
85
  // string
79
- if (typeof val[0] === 'string' && typeof val[1] === 'string') {
86
+ if (typeof val[0] === "string" && typeof val[1] === "string") {
80
87
  try {
81
88
  const from = parse(val[0], format, new Date());
82
89
  const to = parse(val[1], format, new Date());
@@ -97,40 +104,42 @@ const DatePicker = forwardRef(({ mode = ModeType.Single, className, format: cust
97
104
  defaultValue: convertValue(pDefaultValue),
98
105
  };
99
106
  }, [pDefaultValue, pValue, format]);
100
- const [selectedDate, setSelectedDate] = useState(value || defaultValue);
107
+ const initialValue = isControlled ? value : (value || defaultValue);
108
+ const [selectedDate, setSelectedDate] = useState(initialValue);
101
109
  const [isOpen, setIsOpen] = useState(false);
102
- const [inputValue, setInputValue] = useState(formatValue(value || defaultValue, format));
110
+ const [inputValue, setInputValue] = useState(formatValue(initialValue, format));
103
111
  const [isHover, setIsHover] = useState(false);
104
112
  const containerRef = useRef(null);
113
+ const dropdownContentRef = useRef(null);
105
114
  const inputRef = useRef(null);
115
+ const rangeDraftRef = useRef(false);
116
+ const positioning = useDropdownPositioning({
117
+ open: isOpen,
118
+ anchorRef: containerRef,
119
+ contentRef: dropdownContentRef,
120
+ placement: "bottom-start",
121
+ offset: 8,
122
+ matchAnchorWidth: false,
123
+ strategy: getDatePickerDropdownPosition,
124
+ });
106
125
  // 同步外部 value 变化
107
126
  useEffect(() => {
108
- if (value !== undefined) {
109
- // eslint-disable-next-line react-hooks/set-state-in-effect
110
- setSelectedDate(value);
111
- setInputValue(formatValue(value, format));
127
+ if (!isControlled)
128
+ return;
129
+ if (mode === ModeType.Range && rangeDraftRef.current && value === undefined) {
130
+ return;
112
131
  }
113
- }, [value, format]);
114
- // 点击外部关闭
115
- useEffect(() => {
116
- const handleClickOutside = (event) => {
117
- if (containerRef.current && !containerRef.current.contains(event.target)) {
118
- setIsOpen(false);
119
- }
120
- };
121
- if (isOpen) {
122
- document.addEventListener('mousedown', handleClickOutside);
123
- return () => document.removeEventListener('mousedown', handleClickOutside);
124
- }
125
- else {
126
- return () => { };
132
+ setSelectedDate(value);
133
+ setInputValue(formatValue(value, format));
134
+ if (mode !== ModeType.Range || !value || !('from' in value) || value.to) {
135
+ rangeDraftRef.current = false;
127
136
  }
128
- }, [isOpen]);
137
+ }, [isControlled, mode, value, format]);
129
138
  const handleSelect = (date) => {
130
139
  const newDate = date;
131
140
  if (mode === ModeType.Range) {
132
141
  // 如果是范围选择,只有当 from 和 to 都存在时才关闭
133
- if (date && 'from' in date && 'to' in date && date.from && date.to) {
142
+ if (date && "from" in date && "to" in date && date.from && date.to) {
134
143
  setIsOpen(false);
135
144
  }
136
145
  }
@@ -139,18 +148,24 @@ const DatePicker = forwardRef(({ mode = ModeType.Single, className, format: cust
139
148
  // (In showTime mode, this only happens when user clicks confirm button)
140
149
  setIsOpen(false);
141
150
  }
142
- setSelectedDate(newDate);
143
- setInputValue(formatValue(newDate, format));
144
- // 只在非受控模式下更新内部状态
145
- if (value === undefined) {
151
+ // range 选择需要保留内部草稿态,避免受控 value 把第一步点击抹掉
152
+ if (mode === ModeType.Range || !isControlled) {
146
153
  setSelectedDate(newDate);
154
+ setInputValue(formatValue(newDate, format));
147
155
  }
156
+ rangeDraftRef.current =
157
+ mode === ModeType.Range && !(newDate &&
158
+ typeof newDate === 'object' &&
159
+ 'from' in newDate &&
160
+ newDate.from &&
161
+ newDate.to);
148
162
  onChange?.(formatDateValue(newDate, format), newDate);
149
163
  };
150
164
  const handleClear = (e) => {
151
165
  e.stopPropagation();
166
+ rangeDraftRef.current = false;
152
167
  setSelectedDate(undefined);
153
- setInputValue('');
168
+ setInputValue("");
154
169
  onChange?.(undefined, undefined);
155
170
  inputRef.current?.focus();
156
171
  };
@@ -161,7 +176,7 @@ const DatePicker = forwardRef(({ mode = ModeType.Single, className, format: cust
161
176
  try {
162
177
  const parsedDate = parse(newValue, format, new Date());
163
178
  if (isValid(parsedDate)) {
164
- if (value === undefined)
179
+ if (!isControlled)
165
180
  setSelectedDate(parsedDate);
166
181
  onChange?.(formatDateValue(parsedDate, format), parsedDate);
167
182
  }
@@ -172,7 +187,15 @@ const DatePicker = forwardRef(({ mode = ModeType.Single, className, format: cust
172
187
  }
173
188
  };
174
189
  const showClearIcon = allowClear && selectedDate && !disabled && isHover;
175
- return (_jsx("div", { ref: ref, className: cn('relative w-full', mode === ModeType.Range ? 'min-w-[255px]' : '', className), children: _jsxs("div", { ref: containerRef, className: "relative", children: [_jsxs("div", { className: cn('flex items-center w-full rounded-lg px-4 py-3 text-sm', 'border transition-colors duration-200', 'bg-background cursor-pointer', disabled && 'cursor-not-allowed bg-muted border-border text-muted-foreground', !disabled && !selectedDate && !isOpen && 'border-border', !disabled && (selectedDate || isOpen) && 'border-theme'), onClick: () => !disabled && setIsOpen(!isOpen), onMouseEnter: () => setIsHover(true), onMouseLeave: () => setIsHover(false), children: [_jsx("input", { ref: inputRef, type: "text", value: inputValue, onChange: handleInputChange, placeholder: finalPlaceholder, disabled: disabled, readOnly: mode === ModeType.Range, className: cn('flex-1 bg-transparent border-0 outline-none', 'text-sm text-foreground placeholder:text-muted-foreground', disabled && 'cursor-not-allowed', mode === ModeType.Range && !disabled && 'cursor-pointer caret-transparent') }), showClearIcon ? (_jsx("button", { type: "button", onClick: handleClear, title: locale.clear, "aria-label": locale.clear, className: cn('ml-2 flex items-center justify-center', 'w-5 h-5 rounded-full', 'bg-muted hover:bg-muted/80', 'text-foreground transition-colors'), children: _jsx(X, { size: 12 }) })) : (_jsx(CalendarIcon, { size: 16, className: "ml-2 text-muted-foreground" }))] }), isOpen && !disabled && (_jsx("div", { className: cn('absolute z-50 mt-2', 'bg-background border border-border rounded-lg shadow-lg', 'overflow-hidden'), children: _jsx(Calendar, { mode: mode, value: selectedDate || null, onChange: handleSelect, disabledDate: disabledDate, showTime: showTime, locale: locale, quickRanges: quickRanges }) }))] }) }));
190
+ return (_jsx("div", { ref: ref, className: cn("tc-ui-date-picker relative w-full", mode === ModeType.Range ? "min-w-[255px]" : "", className), children: _jsxs("div", { ref: containerRef, className: "relative", children: [_jsxs("div", { className: cn("flex items-center w-full rounded-lg px-4 py-3 text-sm", "border transition-colors duration-200", "bg-background cursor-pointer", disabled &&
191
+ "cursor-not-allowed bg-muted border-border text-muted-foreground", !disabled && !selectedDate && !isOpen && "border-border", !disabled && (selectedDate || isOpen) && "border-theme"), onClick: () => !disabled && setIsOpen(!isOpen), onMouseEnter: () => setIsHover(true), onMouseLeave: () => setIsHover(false), children: [_jsx(Input, { ref: inputRef, type: "text", value: inputValue, onChange: (_, e) => handleInputChange(e), placeholder: finalPlaceholder, disabled: disabled, readOnly: mode === ModeType.Range, className: "flex-1", inputClassName: cn("flex-1 rounded-none border-0 bg-transparent px-0 py-0 outline-none", "text-sm text-foreground placeholder:text-muted-foreground", disabled && "cursor-not-allowed", mode === ModeType.Range &&
192
+ !disabled &&
193
+ "cursor-pointer caret-transparent") }), showClearIcon ? (_jsx(Button, { variant: "text", type: "button", onClick: handleClear, title: locale.clear, "aria-label": locale.clear, className: cn("ml-2 flex items-center justify-center", "w-5 h-5 rounded-full", "bg-muted hover:bg-muted/80", "text-foreground transition-colors", "cursor-pointer"), children: _jsx(X, { size: 12 }) })) : (_jsx(CalendarIcon, { size: 16, className: "ml-2 text-muted-foreground" }))] }), _jsx(Popup, { open: isOpen && !disabled, anchorRef: containerRef, contentRef: dropdownContentRef, positioning: positioning, keepMounted: true, onOpenChange: (nextOpen) => {
194
+ setIsOpen(nextOpen);
195
+ if (!nextOpen) {
196
+ rangeDraftRef.current = false;
197
+ }
198
+ }, className: cn("overflow-hidden"), container: getPopupContainer?.(), children: _jsx("div", { ref: dropdownContentRef, children: _jsx(Calendar, { mode: mode, value: selectedDate || null, onChange: handleSelect, disabledDate: disabledDate, showTime: showTime, locale: locale, quickRanges: quickRanges }) }) })] }) }));
176
199
  });
177
- DatePicker.displayName = 'DatePicker';
200
+ DatePicker.displayName = "DatePicker";
178
201
  export { DatePicker };
@@ -1,6 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from '../../lib/utils';
3
3
  import { ChevronDown, ChevronUp } from 'lucide-react';
4
+ import { Button } from '../Button';
5
+ import { Input } from '../Input';
4
6
  export function TimePicker({ value, onChange, className }) {
5
7
  // Derive time from value prop directly
6
8
  const hours = value?.getHours() ?? 0;
@@ -72,5 +74,5 @@ export function TimePicker({ value, onChange, className }) {
72
74
  }
73
75
  };
74
76
  const formatNumber = (num) => String(num).padStart(2, '0');
75
- return (_jsxs("div", { className: cn('flex items-center justify-center gap-3 py-3', className), children: [_jsxs("div", { className: "flex flex-col items-center gap-1", children: [_jsx("button", { type: "button", onClick: incrementHours, className: "p-1 hover:bg-muted rounded transition-colors text-muted-foreground hover:text-foreground", children: _jsx(ChevronUp, { size: 14 }) }), _jsx("input", { type: "text", value: formatNumber(hours), onChange: handleHoursInput, onKeyDown: handleHoursKeyDown, className: cn('w-12 h-9 text-center text-sm font-medium', 'border border-border rounded', 'bg-background text-foreground', 'focus:outline-none focus:border-theme', 'transition-colors'), maxLength: 2 }), _jsx("button", { type: "button", onClick: decrementHours, className: "p-1 hover:bg-muted rounded transition-colors text-muted-foreground hover:text-foreground", children: _jsx(ChevronDown, { size: 14 }) })] }), _jsx("div", { className: "text-lg font-medium text-foreground mb-1", children: ":" }), _jsxs("div", { className: "flex flex-col items-center gap-1", children: [_jsx("button", { type: "button", onClick: incrementMinutes, className: "p-1 hover:bg-muted rounded transition-colors text-muted-foreground hover:text-foreground", children: _jsx(ChevronUp, { size: 14 }) }), _jsx("input", { type: "text", value: formatNumber(minutes), onChange: handleMinutesInput, onKeyDown: handleMinutesKeyDown, className: cn('w-12 h-9 text-center text-sm font-medium', 'border border-border rounded', 'bg-background text-foreground', 'focus:outline-none focus:border-theme', 'transition-colors'), maxLength: 2 }), _jsx("button", { type: "button", onClick: decrementMinutes, className: "p-1 hover:bg-muted rounded transition-colors text-muted-foreground hover:text-foreground", children: _jsx(ChevronDown, { size: 14 }) })] })] }));
77
+ return (_jsxs("div", { className: cn('tc-ui-time-picker flex items-center justify-center gap-3 py-3', className), children: [_jsxs("div", { className: "flex flex-col items-center gap-1", children: [_jsx(Button, { variant: "text", type: "button", onClick: incrementHours, className: "p-1 hover:bg-muted rounded transition-colors text-muted-foreground hover:text-foreground", children: _jsx(ChevronUp, { size: 14 }) }), _jsx(Input, { type: "text", value: formatNumber(hours), onChange: (_, e) => handleHoursInput(e), onKeyDown: handleHoursKeyDown, className: "w-12", inputClassName: cn('w-12 h-9 px-0 py-0 text-center text-sm font-medium', 'border border-border rounded', 'bg-background text-foreground', 'focus:outline-none focus:border-theme', 'transition-colors'), maxLength: 2 }), _jsx(Button, { variant: "text", type: "button", onClick: decrementHours, className: "p-1 hover:bg-muted rounded transition-colors text-muted-foreground hover:text-foreground", children: _jsx(ChevronDown, { size: 14 }) })] }), _jsx("div", { className: "text-lg font-medium text-foreground mb-1", children: ":" }), _jsxs("div", { className: "flex flex-col items-center gap-1", children: [_jsx(Button, { variant: "text", type: "button", onClick: incrementMinutes, className: "p-1 hover:bg-muted rounded transition-colors text-muted-foreground hover:text-foreground", children: _jsx(ChevronUp, { size: 14 }) }), _jsx(Input, { type: "text", value: formatNumber(minutes), onChange: (_, e) => handleMinutesInput(e), onKeyDown: handleMinutesKeyDown, className: "w-12", inputClassName: cn('w-12 h-9 px-0 py-0 text-center text-sm font-medium', 'border border-border rounded', 'bg-background text-foreground', 'focus:outline-none focus:border-theme', 'transition-colors'), maxLength: 2 }), _jsx(Button, { variant: "text", type: "button", onClick: decrementMinutes, className: "p-1 hover:bg-muted rounded transition-colors text-muted-foreground hover:text-foreground", children: _jsx(ChevronDown, { size: 14 }) })] })] }));
76
78
  }