@_tc/template-core 0.0.1-bate.36 → 0.0.1-bate.38

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 (419) hide show
  1. package/cjs/app/controller/base.js +3 -3
  2. package/cjs/app/controller/project.js +1 -1
  3. package/cjs/app/controller/view.js +16 -7
  4. package/cjs/app/middleware/api-params-verify.js +10 -1
  5. package/cjs/app/middleware/error-handle.js +9 -3
  6. package/cjs/app/middleware/project-handler.js +1 -1
  7. package/cjs/app/router/view.js +3 -1
  8. package/cjs/app/router-schema/project.js +1 -1
  9. package/cjs/app/service/project.js +5 -0
  10. package/cjs/bundler/defaultAlias.js +5 -0
  11. package/cjs/bundler/dev.js +4 -3
  12. package/cjs/bundler/index.js +2 -1
  13. package/cjs/bundler/prod.js +4 -3
  14. package/cjs/bundler/utils.js +52 -23
  15. package/cjs/packages/common/LRUCache.js +4 -0
  16. package/cjs/packages/common/array/index.js +43 -0
  17. package/cjs/packages/common/cache/LRUCache.js +45 -0
  18. package/cjs/packages/common/cache/index.js +4 -0
  19. package/cjs/packages/common/guards/index.js +34 -0
  20. package/cjs/packages/common/i18n/default.js +95 -0
  21. package/cjs/packages/common/i18n/en-US.js +95 -0
  22. package/cjs/packages/common/i18n/index.js +178 -0
  23. package/cjs/packages/common/i18n/locales.js +17 -0
  24. package/cjs/packages/common/i18n/types.js +1 -0
  25. package/cjs/packages/common/index.js +65 -0
  26. package/cjs/packages/common/log/index.js +160 -0
  27. package/cjs/packages/common/number/index.js +14 -0
  28. package/cjs/packages/common/object/filterEmpty.js +32 -0
  29. package/cjs/packages/common/object/filtereEmpty.js +5 -0
  30. package/cjs/packages/common/object/index.js +26 -0
  31. package/cjs/packages/common/string/index.js +17 -0
  32. package/cjs/packages/common/types/index.js +1 -0
  33. package/cjs/packages/core/index.js +18 -13
  34. package/cjs/packages/core/loader/config.js +4 -2
  35. package/cjs/packages/core/loader/controller.js +2 -3
  36. package/cjs/packages/core/loader/extend.js +1 -2
  37. package/cjs/packages/core/loader/middleware.js +2 -3
  38. package/cjs/packages/core/loader/model.js +10 -6
  39. package/cjs/packages/core/loader/router-schema.js +4 -2
  40. package/cjs/packages/core/loader/router.js +24 -11
  41. package/cjs/packages/core/loader/service.js +2 -2
  42. package/cjs/packages/utils/runFileFn.js +46 -1
  43. package/esm/app/controller/base.js +3 -3
  44. package/esm/app/controller/project.js +3 -3
  45. package/esm/app/controller/view.js +16 -7
  46. package/esm/app/middleware/api-params-verify.js +10 -1
  47. package/esm/app/middleware/error-handle.js +9 -3
  48. package/esm/app/middleware/project-handler.js +1 -1
  49. package/esm/app/router/view.js +3 -1
  50. package/esm/app/router-schema/project.js +1 -1
  51. package/esm/app/service/project.js +5 -0
  52. package/esm/bundler/defaultAlias.js +4 -0
  53. package/esm/bundler/dev.js +4 -3
  54. package/esm/bundler/index.js +2 -1
  55. package/esm/bundler/prod.js +4 -3
  56. package/esm/bundler/utils.js +52 -23
  57. package/esm/index.js +2 -2
  58. package/esm/packages/common/LRUCache.js +2 -0
  59. package/esm/packages/common/array/index.js +37 -0
  60. package/esm/packages/common/cache/LRUCache.js +43 -0
  61. package/esm/packages/common/cache/index.js +2 -0
  62. package/esm/packages/common/guards/index.js +26 -0
  63. package/esm/packages/common/i18n/default.js +93 -0
  64. package/esm/packages/common/i18n/en-US.js +93 -0
  65. package/esm/packages/common/i18n/index.js +162 -0
  66. package/esm/packages/common/i18n/locales.js +11 -0
  67. package/esm/packages/common/i18n/types.js +0 -0
  68. package/esm/packages/common/index.js +13 -0
  69. package/esm/packages/common/log/index.js +146 -0
  70. package/esm/packages/common/number/index.js +11 -0
  71. package/esm/packages/common/object/filterEmpty.js +29 -0
  72. package/esm/packages/common/object/filtereEmpty.js +2 -0
  73. package/esm/packages/common/object/index.js +20 -0
  74. package/esm/packages/common/string/index.js +13 -0
  75. package/esm/packages/common/types/index.js +0 -0
  76. package/esm/packages/core/index.js +18 -14
  77. package/esm/packages/core/loader/config.js +4 -3
  78. package/esm/packages/core/loader/controller.js +2 -4
  79. package/esm/packages/core/loader/extend.js +1 -3
  80. package/esm/packages/core/loader/middleware.js +2 -4
  81. package/esm/packages/core/loader/model.js +10 -7
  82. package/esm/packages/core/loader/router-schema.js +4 -3
  83. package/esm/packages/core/loader/router.js +24 -12
  84. package/esm/packages/core/loader/service.js +2 -3
  85. package/esm/packages/utils/runFileFn.js +47 -1
  86. package/fe/frontend/dash/Dashboard.d.ts +7 -0
  87. package/fe/frontend/dash/Dashboard.js +73 -0
  88. package/fe/frontend/dash/dash.entry.d.ts +2 -0
  89. package/fe/frontend/dash/dash.entry.js +80 -0
  90. package/fe/frontend/index.d.ts +3 -0
  91. package/fe/frontend/index.js +1 -0
  92. package/fe/frontend/main.css +2 -184
  93. package/fe/frontend/main.d.ts +10 -3
  94. package/fe/frontend/main.js +15 -4
  95. package/fe/frontend/testPage/testPage.entry.js +1 -2
  96. package/fe/frontend/typing/window.d.ts +7 -0
  97. package/fe/frontend/typing/window.js +1 -0
  98. package/fe/frontend/widgets/api/baseInfo.d.ts +31 -0
  99. package/fe/frontend/widgets/api/baseInfo.js +15 -0
  100. package/fe/frontend/widgets/common/CRUD/CRUD.d.ts +70 -0
  101. package/fe/frontend/widgets/common/CRUD/CRUD.js +208 -0
  102. package/fe/frontend/widgets/common/CRUD/index.d.ts +2 -0
  103. package/fe/frontend/widgets/common/CRUD/index.js +1 -0
  104. package/fe/frontend/widgets/common/auth/index.d.ts +7 -0
  105. package/fe/frontend/widgets/common/auth/index.js +20 -0
  106. package/fe/frontend/widgets/common/generateMenuData.d.ts +4 -0
  107. package/fe/frontend/widgets/common/generateMenuData.js +14 -0
  108. package/fe/frontend/widgets/common/importComponent.d.ts +5 -0
  109. package/fe/frontend/widgets/common/importComponent.js +8 -0
  110. package/fe/frontend/widgets/common/language.d.ts +2 -0
  111. package/fe/frontend/widgets/common/language.js +9 -0
  112. package/fe/frontend/widgets/common/logFn/index.d.ts +4 -0
  113. package/fe/frontend/widgets/common/logFn/index.js +8 -0
  114. package/fe/frontend/widgets/common/menu.d.ts +34 -0
  115. package/fe/frontend/widgets/common/menu.js +101 -0
  116. package/fe/frontend/widgets/common/request.d.ts +36 -0
  117. package/fe/frontend/widgets/common/request.js +133 -0
  118. package/fe/frontend/widgets/components/BasePage/HeaderView.d.ts +9 -0
  119. package/fe/frontend/widgets/components/BasePage/HeaderView.js +16 -0
  120. package/fe/frontend/widgets/components/Router/index.d.ts +9 -0
  121. package/fe/frontend/widgets/components/Router/index.js +11 -0
  122. package/fe/frontend/widgets/components/Router/type.d.ts +2 -0
  123. package/fe/frontend/widgets/components/Router/type.js +1 -0
  124. package/fe/frontend/widgets/defaultPages/Iframe/index.d.ts +3 -0
  125. package/fe/frontend/widgets/defaultPages/Iframe/index.js +14 -0
  126. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/DetailPanel.d.ts +7 -0
  127. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/DetailPanel.js +94 -0
  128. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/PopFrom.d.ts +13 -0
  129. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/PopFrom.js +124 -0
  130. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/data.d.ts +3 -0
  131. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/data.js +6 -0
  132. package/fe/frontend/widgets/defaultPages/Schema/components/SchemaSearch/index.d.ts +3 -0
  133. package/fe/frontend/widgets/defaultPages/Schema/components/SchemaSearch/index.js +63 -0
  134. package/fe/frontend/widgets/defaultPages/Schema/components/SchemaTable/index.d.ts +11 -0
  135. package/fe/frontend/widgets/defaultPages/Schema/components/SchemaTable/index.js +188 -0
  136. package/fe/frontend/widgets/defaultPages/Schema/data/eventInfo.d.ts +8 -0
  137. package/fe/frontend/widgets/defaultPages/Schema/data/eventInfo.js +6 -0
  138. package/fe/frontend/widgets/defaultPages/Schema/data/index.d.ts +3 -0
  139. package/fe/frontend/widgets/defaultPages/Schema/data/index.js +1 -0
  140. package/fe/frontend/widgets/defaultPages/Schema/hooks/useComConfig.d.ts +10 -0
  141. package/fe/frontend/widgets/defaultPages/Schema/hooks/useComConfig.js +14 -0
  142. package/fe/frontend/widgets/defaultPages/Schema/index.d.ts +3 -0
  143. package/fe/frontend/widgets/defaultPages/Schema/index.js +74 -0
  144. package/fe/frontend/widgets/defaultPages/Schema/schemaType.d.ts +50 -0
  145. package/fe/frontend/widgets/defaultPages/Schema/schemaType.js +4 -0
  146. package/fe/frontend/widgets/defaultPages/Schema/stores/schemaEventBus.d.ts +42 -0
  147. package/fe/frontend/widgets/defaultPages/Schema/stores/schemaEventBus.js +70 -0
  148. package/fe/frontend/widgets/defaultPages/Schema/stores/schemaStore.d.ts +47 -0
  149. package/fe/frontend/widgets/defaultPages/Schema/stores/schemaStore.js +26 -0
  150. package/fe/frontend/widgets/defaultPages/Schema/utils/fetchErrorShow.d.ts +3 -0
  151. package/fe/frontend/widgets/defaultPages/Schema/utils/fetchErrorShow.js +8 -0
  152. package/fe/frontend/widgets/defaultPages/Schema/utils/permissions.d.ts +3 -0
  153. package/fe/frontend/widgets/defaultPages/Schema/utils/permissions.js +3 -0
  154. package/fe/frontend/widgets/defaultPages/Schema/utils/schemaConversion.d.ts +3 -0
  155. package/fe/frontend/widgets/defaultPages/Schema/utils/schemaConversion.js +115 -0
  156. package/fe/frontend/widgets/defaultPages/Schema/utils/validator.d.ts +7 -0
  157. package/fe/frontend/widgets/defaultPages/Schema/utils/validator.js +36 -0
  158. package/fe/frontend/widgets/defaultPages/SidebarSlotPage/SidebarSlotContainer.d.ts +10 -0
  159. package/fe/frontend/widgets/defaultPages/SidebarSlotPage/SidebarSlotContainer.js +38 -0
  160. package/fe/frontend/widgets/defaultPages/SidebarSlotPage/index.d.ts +3 -0
  161. package/fe/frontend/widgets/defaultPages/SidebarSlotPage/index.js +16 -0
  162. package/fe/frontend/widgets/defaultPages/SidebarSlotPageTmp.d.ts +3 -0
  163. package/fe/frontend/widgets/defaultPages/SidebarSlotPageTmp.js +17 -0
  164. package/fe/frontend/widgets/defaultPages/SlotPage/index.d.ts +3 -0
  165. package/fe/frontend/widgets/defaultPages/SlotPage/index.js +26 -0
  166. package/fe/frontend/widgets/defaultPages/Todo.d.ts +3 -0
  167. package/fe/frontend/widgets/defaultPages/Todo.js +5 -0
  168. package/fe/frontend/widgets/hooks/useCurrentMenuData.d.ts +19 -0
  169. package/fe/frontend/widgets/hooks/useCurrentMenuData.js +28 -0
  170. package/fe/frontend/widgets/hooks/useRouterParams.d.ts +5 -0
  171. package/fe/frontend/widgets/hooks/useRouterParams.js +11 -0
  172. package/fe/frontend/widgets/store/mode.d.ts +19 -0
  173. package/fe/frontend/widgets/store/mode.js +37 -0
  174. package/fe/model/types/data/button.d.ts +32 -0
  175. package/fe/model/types/data/button.js +16 -0
  176. package/fe/model/types/data/component.d.ts +61 -0
  177. package/fe/model/types/data/component.js +11 -0
  178. package/fe/model/types/data/fetchInfo.d.ts +20 -0
  179. package/fe/model/types/data/fetchInfo.js +1 -0
  180. package/fe/model/types/data/schema.d.ts +98 -0
  181. package/fe/model/types/data/schema.js +1 -0
  182. package/fe/model/types/data/search.d.ts +7 -0
  183. package/fe/model/types/data/search.js +1 -0
  184. package/fe/model/types/menuType.d.ts +73 -0
  185. package/fe/model/types/menuType.js +1 -0
  186. package/fe/model/types/model.d.ts +33 -0
  187. package/fe/model/types/model.js +1 -0
  188. package/fe/packages/common/array/index.d.ts +7 -0
  189. package/fe/packages/common/array/index.js +40 -0
  190. package/fe/packages/common/cache/LRUCache.d.ts +13 -0
  191. package/fe/packages/common/cache/LRUCache.js +47 -0
  192. package/fe/packages/common/cache/index.d.ts +2 -0
  193. package/fe/packages/common/cache/index.js +1 -0
  194. package/fe/packages/common/guards/index.d.ts +9 -0
  195. package/fe/packages/common/guards/index.js +24 -0
  196. package/fe/packages/common/i18n/default.d.ts +92 -0
  197. package/fe/packages/common/i18n/default.js +90 -0
  198. package/fe/packages/common/i18n/en-US.d.ts +92 -0
  199. package/fe/packages/common/i18n/en-US.js +90 -0
  200. package/fe/packages/common/i18n/index.d.ts +43 -0
  201. package/fe/packages/common/i18n/index.js +173 -0
  202. package/fe/packages/common/i18n/locales.d.ts +8 -0
  203. package/fe/packages/common/i18n/locales.js +10 -0
  204. package/fe/packages/common/i18n/types.d.ts +71 -0
  205. package/fe/packages/common/i18n/types.js +1 -0
  206. package/fe/packages/common/index.d.ts +10 -0
  207. package/fe/packages/common/index.js +9 -0
  208. package/fe/packages/common/log/index.d.ts +33 -0
  209. package/fe/packages/common/log/index.js +176 -0
  210. package/fe/packages/common/number/index.d.ts +3 -0
  211. package/fe/packages/common/number/index.js +10 -0
  212. package/fe/packages/common/object/filterEmpty.d.ts +3 -0
  213. package/fe/packages/common/object/filterEmpty.js +33 -0
  214. package/fe/packages/common/object/index.d.ts +5 -0
  215. package/fe/packages/common/object/index.js +25 -0
  216. package/fe/packages/common/string/index.d.ts +4 -0
  217. package/fe/packages/common/string/index.js +17 -0
  218. package/fe/packages/common/types/index.d.ts +4 -0
  219. package/fe/packages/common/types/index.js +1 -0
  220. package/fe/packages/ui/react/components/Button/Button.d.ts +29 -10
  221. package/fe/packages/ui/react/components/Button/Button.js +53 -23
  222. package/fe/packages/ui/react/components/Button/SumbitButton.d.ts +2 -2
  223. package/fe/packages/ui/react/components/Button/SumbitButton.js +3 -10
  224. package/fe/packages/ui/react/components/Button/index.d.ts +1 -1
  225. package/fe/packages/ui/react/components/Checkbox/Checkbox.d.ts +1 -1
  226. package/fe/packages/ui/react/components/Checkbox/Checkbox.js +5 -3
  227. package/fe/packages/ui/react/components/ConfirmDialog/ConfirmDialog.js +11 -0
  228. package/fe/packages/ui/react/components/ConfirmDialog/index.d.ts +2 -0
  229. package/fe/packages/ui/react/components/ConfirmDialog/index.js +1 -0
  230. package/fe/packages/ui/react/components/DataTable/ActionBtn.d.ts +3 -1
  231. package/fe/packages/ui/react/components/DataTable/ActionBtn.js +85 -4
  232. package/fe/packages/ui/react/components/DataTable/{data-table.d.ts → index.d.ts} +10 -4
  233. package/fe/packages/ui/react/components/DataTable/{data-table.js → index.js} +58 -44
  234. package/fe/packages/ui/react/components/Date/Calendar.js +4 -3
  235. package/fe/packages/ui/react/components/Date/Date.d.ts +5 -3
  236. package/fe/packages/ui/react/components/Date/Date.js +71 -48
  237. package/fe/packages/ui/react/components/Date/TimePicker.js +3 -1
  238. package/fe/packages/ui/react/components/Date/dropdownPositioning.d.ts +3 -0
  239. package/fe/packages/ui/react/components/Date/dropdownPositioning.js +12 -0
  240. package/fe/packages/ui/react/components/Date/locales.d.ts +1 -0
  241. package/fe/packages/ui/react/components/Date/locales.js +7 -38
  242. package/fe/packages/ui/react/components/Drawer/Drawer.d.ts +29 -0
  243. package/fe/packages/ui/react/components/Drawer/Drawer.js +100 -0
  244. package/fe/packages/ui/react/components/Drawer/index.d.ts +3 -0
  245. package/fe/packages/ui/react/components/Drawer/index.js +1 -0
  246. package/fe/packages/ui/react/components/Dropdown/Dropdown.d.ts +25 -0
  247. package/fe/packages/ui/react/components/Dropdown/Dropdown.js +28 -0
  248. package/fe/packages/ui/react/components/Dropdown/index.d.ts +2 -0
  249. package/fe/packages/ui/react/components/Dropdown/index.js +1 -0
  250. package/fe/packages/ui/react/components/Form/Form.js +1 -1
  251. package/fe/packages/ui/react/components/Form/FormItem.js +1 -1
  252. package/fe/packages/ui/react/components/Form/SchemaForm/data.d.ts +45 -0
  253. package/fe/packages/ui/react/components/Form/{SchemeForm → SchemaForm}/data.js +9 -1
  254. package/fe/packages/ui/react/components/Form/{SchemeForm → SchemaForm}/index.d.ts +15 -14
  255. package/fe/packages/ui/react/components/Form/SchemaForm/index.js +79 -0
  256. package/fe/packages/ui/react/components/Form/index.d.ts +1 -1
  257. package/fe/packages/ui/react/components/Form/index.js +1 -1
  258. package/fe/packages/ui/react/components/ImagePreview/ImagePreview.js +15 -12
  259. package/fe/packages/ui/react/components/ImagePreview/PreviewImage.js +5 -2
  260. package/fe/packages/ui/react/components/Input/Input.d.ts +5 -1
  261. package/fe/packages/ui/react/components/Input/Input.js +5 -4
  262. package/fe/packages/ui/react/components/InputNumber/InputNumber.d.ts +28 -0
  263. package/fe/packages/ui/react/components/InputNumber/InputNumber.js +144 -0
  264. package/fe/packages/ui/react/components/InputNumber/index.d.ts +2 -0
  265. package/fe/packages/ui/react/components/InputNumber/index.js +1 -0
  266. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.d.ts +30 -0
  267. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.js +63 -0
  268. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.test.d.ts +2 -0
  269. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.test.js +27 -0
  270. package/fe/packages/ui/react/components/Label/Label.js +2 -2
  271. package/fe/packages/ui/react/components/Menu/Menu.d.ts +18 -0
  272. package/fe/packages/ui/react/components/Menu/Menu.js +102 -0
  273. package/fe/packages/ui/react/components/Menu/MenuContext.d.ts +39 -0
  274. package/fe/packages/ui/react/components/Menu/MenuContext.js +97 -0
  275. package/fe/packages/ui/react/components/Menu/MenuItem.d.ts +3 -0
  276. package/fe/packages/ui/react/components/Menu/MenuItem.js +33 -0
  277. package/fe/packages/ui/react/components/Menu/SubMenu.d.ts +10 -0
  278. package/fe/packages/ui/react/components/Menu/SubMenu.js +169 -0
  279. package/fe/packages/ui/react/components/Menu/index.d.ts +9 -0
  280. package/fe/packages/ui/react/components/Menu/index.js +5 -0
  281. package/fe/packages/ui/react/components/Menu/menuTypes.d.ts +59 -0
  282. package/fe/packages/ui/react/components/Menu/menuTypes.js +1 -0
  283. package/fe/packages/ui/react/components/Menu/utils.d.ts +2 -0
  284. package/fe/packages/ui/react/components/Menu/utils.js +7 -0
  285. package/fe/packages/ui/react/components/Message/Message.js +4 -1
  286. package/fe/packages/ui/react/components/Modal/Modal.d.ts +3 -1
  287. package/fe/packages/ui/react/components/Modal/Modal.js +6 -43
  288. package/fe/packages/ui/react/components/Modal/ModalManager.js +4 -3
  289. package/fe/packages/ui/react/components/Overlay/Overlay.d.ts +23 -0
  290. package/fe/packages/ui/react/components/Overlay/Overlay.js +53 -0
  291. package/fe/packages/ui/react/components/Overlay/index.d.ts +3 -0
  292. package/fe/packages/ui/react/components/Overlay/index.js +1 -0
  293. package/fe/packages/ui/react/components/{Pagination.js → Pagination/Pagination.js} +4 -4
  294. package/fe/packages/ui/react/components/Pagination/index.d.ts +2 -0
  295. package/fe/packages/ui/react/components/Pagination/index.js +1 -0
  296. package/fe/packages/ui/react/components/Popup/Popup.d.ts +26 -0
  297. package/fe/packages/ui/react/components/Popup/Popup.js +81 -0
  298. package/fe/packages/ui/react/components/Popup/index.d.ts +2 -0
  299. package/fe/packages/ui/react/components/Popup/index.js +1 -0
  300. package/fe/packages/ui/react/components/Search/Search.d.ts +2 -2
  301. package/fe/packages/ui/react/components/Search/Search.js +3 -3
  302. package/fe/packages/ui/react/components/Select/Select.d.ts +5 -0
  303. package/fe/packages/ui/react/components/Select/Select.js +52 -109
  304. package/fe/packages/ui/react/components/Select/dropdownPositioning.d.ts +3 -0
  305. package/fe/packages/ui/react/components/Select/dropdownPositioning.js +13 -0
  306. package/fe/packages/ui/react/components/Skeleton/Skeleton.js +2 -2
  307. package/fe/packages/ui/react/components/Switch/Switch.js +3 -1
  308. package/fe/packages/ui/react/components/TableSearch/TableSearch.d.ts +5 -4
  309. package/fe/packages/ui/react/components/TableSearch/TableSearch.js +23 -21
  310. package/fe/packages/ui/react/components/TableSearch/lang.js +5 -14
  311. package/fe/packages/ui/react/components/{Textarea.d.ts → Textarea/Textarea.d.ts} +11 -3
  312. package/fe/packages/ui/react/components/Textarea/Textarea.js +37 -0
  313. package/fe/packages/ui/react/components/Textarea/index.d.ts +2 -0
  314. package/fe/packages/ui/react/components/Textarea/index.js +1 -0
  315. package/fe/packages/ui/react/components/{Tooltip.d.ts → Tooltip/Tooltip.d.ts} +2 -2
  316. package/fe/packages/ui/react/components/Tooltip/Tooltip.js +79 -0
  317. package/fe/packages/ui/react/components/Tooltip/index.d.ts +2 -0
  318. package/fe/packages/ui/react/components/Tooltip/index.js +1 -0
  319. package/fe/packages/ui/react/components/{TreeSelect.js → TreeSelect/TreeSelect.js} +9 -11
  320. package/fe/packages/ui/react/components/TreeSelect/index.d.ts +2 -0
  321. package/fe/packages/ui/react/components/TreeSelect/index.js +1 -0
  322. package/fe/packages/ui/react/components/Upload/ImageUpload.js +18 -6
  323. package/fe/packages/ui/react/components/Upload/Upload.js +2 -1
  324. package/fe/packages/ui/react/components/{breadcrumb.js → breadcrumb/breadcrumb.js} +15 -12
  325. package/fe/packages/ui/react/components/breadcrumb/index.d.ts +2 -0
  326. package/fe/packages/ui/react/components/breadcrumb/index.js +1 -0
  327. package/fe/packages/ui/react/components/hooks/useDropdownPositioning.d.ts +49 -0
  328. package/fe/packages/ui/react/components/hooks/useDropdownPositioning.js +137 -0
  329. package/fe/packages/ui/react/components/index.d.ts +7 -1
  330. package/fe/packages/ui/react/components/index.js +7 -1
  331. package/fe/packages/ui/react/components/table/index.d.ts +2 -0
  332. package/fe/packages/ui/react/components/table/index.js +1 -0
  333. package/fe/packages/ui/react/components/table/table.js +20 -0
  334. package/fe/packages/ui/react/components/testPage/MenuTestPage.d.ts +2 -0
  335. package/fe/packages/ui/react/components/testPage/MenuTestPage.js +104 -0
  336. package/fe/packages/ui/react/components/testPage/index.js +277 -81
  337. package/fe/packages/ui/react/hooks/useExecuteOnce.d.ts +30 -0
  338. package/fe/packages/ui/react/hooks/useExecuteOnce.js +57 -0
  339. package/fe/packages/ui/react/hooks/useInit.d.ts +1 -1
  340. package/fe/packages/ui/react/hooks/useInit.js +1 -1
  341. package/fe/packages/ui/react/hooks/useLanguage.d.ts +1 -6
  342. package/fe/packages/ui/react/hooks/useRefState.d.ts +30 -0
  343. package/fe/packages/ui/react/hooks/useRefState.js +29 -0
  344. package/fe/packages/ui/react/hooks/useWatch.d.ts +23 -0
  345. package/fe/packages/ui/react/hooks/useWatch.js +87 -0
  346. package/fe/packages/ui/react/hooks/useWatch.test.d.ts +2 -0
  347. package/fe/packages/ui/react/hooks/useWatch.test.js +22 -0
  348. package/fe/packages/ui/react/i18n/I18nProvider.d.ts +31 -0
  349. package/fe/packages/ui/react/i18n/I18nProvider.js +25 -0
  350. package/fe/packages/ui/react/i18n/index.d.ts +4 -0
  351. package/fe/packages/ui/react/i18n/index.js +3 -0
  352. package/fe/packages/ui/react/i18n/useI18n.d.ts +13 -0
  353. package/fe/packages/ui/react/i18n/useI18n.js +18 -0
  354. package/fe/packages/ui/react/index.css +238 -0
  355. package/fe/packages/ui/react/index.d.ts +2 -0
  356. package/fe/packages/ui/react/index.js +2 -0
  357. package/fe/packages/ui/react/lib/createStoreHook.d.ts +9 -0
  358. package/fe/packages/ui/react/lib/createStoreHook.js +6 -0
  359. package/fe/packages/ui/react/lib/export.d.ts +2 -2
  360. package/fe/packages/ui/react/stores/language.d.ts +3 -12
  361. package/fe/packages/ui/react/stores/language.js +2 -51
  362. package/fe/typings/type.d.ts +5 -0
  363. package/fe/typings/type.js +1 -0
  364. package/model/index.d.ts +2 -0
  365. package/model/types/data/button.d.ts +32 -0
  366. package/model/types/data/component.d.ts +61 -0
  367. package/model/types/data/fetchInfo.d.ts +20 -0
  368. package/model/types/data/schema.d.ts +98 -0
  369. package/model/types/data/search.d.ts +7 -0
  370. package/model/types/index.d.ts +2 -0
  371. package/model/types/menuType.d.ts +73 -0
  372. package/model/types/model.d.ts +33 -0
  373. package/model/types/test.d.ts +2 -0
  374. package/package.json +20 -6
  375. package/types/app/controller/base.d.ts +3 -3
  376. package/types/app/router/view.d.ts +2 -3
  377. package/types/app/service/project.d.ts +29 -4
  378. package/types/app/type.d.ts +1 -0
  379. package/types/app/typings.d.ts +12 -21
  380. package/types/bundler/defaultAlias.d.ts +3 -0
  381. package/types/bundler/utils.d.ts +1 -1
  382. package/types/config/config.default.d.ts +14 -0
  383. package/types/packages/common/LRUCache.d.ts +1 -0
  384. package/types/packages/common/array/index.d.ts +6 -0
  385. package/types/packages/common/cache/LRUCache.d.ts +12 -0
  386. package/types/packages/common/cache/index.d.ts +1 -0
  387. package/types/packages/common/guards/index.d.ts +8 -0
  388. package/types/packages/common/i18n/default.d.ts +86 -0
  389. package/types/packages/common/i18n/en-US.d.ts +86 -0
  390. package/types/packages/common/i18n/index.d.ts +18 -0
  391. package/types/packages/common/i18n/locales.d.ts +7 -0
  392. package/types/packages/common/i18n/types.d.ts +46 -0
  393. package/types/packages/common/index.d.ts +9 -0
  394. package/types/packages/common/log/index.d.ts +32 -0
  395. package/types/packages/common/number/index.d.ts +2 -0
  396. package/types/packages/common/object/filterEmpty.d.ts +2 -0
  397. package/types/packages/common/object/filtereEmpty.d.ts +1 -0
  398. package/types/packages/common/object/index.d.ts +4 -0
  399. package/types/packages/common/string/index.d.ts +3 -0
  400. package/types/packages/common/types/index.d.ts +3 -0
  401. package/types/packages/core/index.d.ts +1 -1
  402. package/types/packages/core/loader/router.d.ts +1 -1
  403. package/types/packages/core/types.d.ts +12 -3
  404. package/types/packages/utils/runFileFn.d.ts +5 -3
  405. package/fe/packages/ui/react/components/ConfirmDialog.js +0 -9
  406. package/fe/packages/ui/react/components/Dropdown.d.ts +0 -16
  407. package/fe/packages/ui/react/components/Dropdown.js +0 -54
  408. package/fe/packages/ui/react/components/Form/SchemeForm/data.d.ts +0 -51
  409. package/fe/packages/ui/react/components/Form/SchemeForm/index.js +0 -69
  410. package/fe/packages/ui/react/components/Textarea.js +0 -35
  411. package/fe/packages/ui/react/components/Tooltip.js +0 -118
  412. package/fe/packages/ui/react/components/table.js +0 -20
  413. package/fe/packages/ui/react/locales/index.d.ts +0 -8
  414. package/fe/packages/ui/react/locales/index.js +0 -6
  415. /package/fe/packages/ui/react/components/{ConfirmDialog.d.ts → ConfirmDialog/ConfirmDialog.d.ts} +0 -0
  416. /package/fe/packages/ui/react/components/{Pagination.d.ts → Pagination/Pagination.d.ts} +0 -0
  417. /package/fe/packages/ui/react/components/{TreeSelect.d.ts → TreeSelect/TreeSelect.d.ts} +0 -0
  418. /package/fe/packages/ui/react/components/{breadcrumb.d.ts → breadcrumb/breadcrumb.d.ts} +0 -0
  419. /package/fe/packages/ui/react/components/{table.d.ts → table/table.d.ts} +0 -0
@@ -1,34 +1,47 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import noResult from '@tc/ui-react/assets/table/no-result.svg';
3
+ import { useI18n } from '../../i18n';
3
4
  import { useMemo, useState } from 'react';
5
+ import { Checkbox } from '../Checkbox';
4
6
  import { Pagination } from '../Pagination';
5
7
  import { Skeleton } from '../Skeleton';
6
8
  import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../table';
7
- export function DataTable({ columns, data: pData, loading, rowKey = 'id', rowSelection, defaultColumnWidth = 100, pagination: pPagination, }) {
8
- const getRowKey = (record, index) => {
9
- if (typeof rowKey === 'function') {
10
- return rowKey(record, index);
11
- }
12
- const key = record[rowKey];
13
- return typeof key === 'string' || typeof key === 'number' ? key : index;
14
- };
9
+ import { ActionBtn } from './ActionBtn';
10
+ const defaultRowKey = 'id';
11
+ const getRowKey = (record, index, rowKey = defaultRowKey) => {
12
+ if (typeof rowKey === 'function') {
13
+ return rowKey(record, index);
14
+ }
15
+ const key = record[rowKey];
16
+ return typeof key === 'string' || typeof key === 'number' ? key : index;
17
+ };
18
+ const renderCellContent = (column, value, record, rowIndex, hasAction) => {
19
+ if (hasAction && column.actions) {
20
+ const actions = typeof column.actions === 'function' ? column.actions(value, record, rowIndex) : column.actions;
21
+ return (_jsx("div", { className: "flex w-full min-w-0 justify-center", children: _jsx(ActionBtn, { actions: actions, overflow: column.actionOverflow ?? 'auto' }) }));
22
+ }
23
+ return column.render ? column.render(value, record, rowIndex) : value;
24
+ };
25
+ export function DataTable({ columns, data: pData, loading, rowKey = defaultRowKey, rowSelection, defaultColumnWidth = 100, pagination: pPagination, }) {
26
+ const t = useI18n();
15
27
  const getCellValue = (record, column) => record[(column.dataIndex || column.key)];
16
28
  const isControlled = rowSelection && Array.isArray(rowSelection.selectedRowKeys);
17
29
  const [innerSelectedRowKeys, setInnerSelectedRowKeys] = useState(rowSelection?.defaultSelectedRowKeys ?? []);
18
30
  const selectedRowKeys = (isControlled ? rowSelection?.selectedRowKeys : innerSelectedRowKeys) ?? [];
19
31
  const selectedKeySet = new Set(selectedRowKeys);
20
32
  const [currentPage, setCurrentPage] = useState(1);
21
- const { showPagination, pagination, data } = useMemo(() => {
33
+ const { showPagination, pagination, data, pageStartIndex } = useMemo(() => {
22
34
  let pagination;
23
35
  let data = pData;
24
36
  let showPagination;
37
+ let pageStartIndex = 0;
25
38
  // 使用外部
26
39
  if (pPagination) {
27
40
  pagination = pPagination;
28
41
  showPagination = pagination.total > 0;
29
42
  }
43
+ // 使用内部
30
44
  else {
31
- // 使用内部
32
45
  pagination = {
33
46
  onChange(v) {
34
47
  setCurrentPage(v);
@@ -38,16 +51,17 @@ export function DataTable({ columns, data: pData, loading, rowKey = 'id', rowSel
38
51
  total: pData.length,
39
52
  };
40
53
  showPagination = pData.length > pagination.pageSize;
41
- data = pData.slice((pagination.current - 1) * pagination.pageSize, pagination.current * pagination.pageSize);
54
+ pageStartIndex = (pagination.current - 1) * pagination.pageSize;
55
+ data = pData.slice(pageStartIndex, pagination.current * pagination.pageSize);
42
56
  }
43
57
  return {
44
58
  showPagination,
45
59
  pagination,
46
60
  data,
61
+ pageStartIndex,
47
62
  };
48
63
  }, [currentPage, pData, pPagination]);
49
- // TODO getRowKey 依赖剥离
50
- const pageRowKeys = pData.map((record, index) => getRowKey(record, index));
64
+ const pageRowKeys = data.map((record, index) => getRowKey(record, pageStartIndex + index, rowKey));
51
65
  const handleRowSelectChange = (key) => {
52
66
  if (!rowSelection)
53
67
  return;
@@ -55,7 +69,7 @@ export function DataTable({ columns, data: pData, loading, rowKey = 'id', rowSel
55
69
  ? selectedRowKeys.filter((k) => k !== key)
56
70
  : [...selectedRowKeys, key];
57
71
  const nextSelectedKeySet = new Set(nextSelectedKeys);
58
- const selectedRows = pData.filter((record, index) => nextSelectedKeySet.has(getRowKey(record, index)));
72
+ const selectedRows = pData.filter((record, index) => nextSelectedKeySet.has(getRowKey(record, index, rowKey)));
59
73
  if (!isControlled) {
60
74
  setInnerSelectedRowKeys(nextSelectedKeys);
61
75
  }
@@ -81,27 +95,23 @@ export function DataTable({ columns, data: pData, loading, rowKey = 'id', rowSel
81
95
  nextSelectedKeys = selectedRowKeys.filter((key) => !pageKeySet.has(key));
82
96
  }
83
97
  const nextSelectedKeySet = new Set(nextSelectedKeys);
84
- const selectedRows = pData.filter((record, index) => nextSelectedKeySet.has(getRowKey(record, index)));
98
+ const selectedRows = pData.filter((record, index) => nextSelectedKeySet.has(getRowKey(record, index, rowKey)));
85
99
  if (!isControlled) {
86
100
  setInnerSelectedRowKeys(nextSelectedKeys);
87
101
  }
88
102
  rowSelection.onChange?.(nextSelectedKeys, selectedRows, checked);
89
103
  };
90
104
  const allChecked = rowSelection
91
- ? rowSelection.isAll ?? (pageRowKeys.length > 0 && pageRowKeys.every((key) => selectedKeySet.has(key)))
105
+ ? (rowSelection.isAll ?? (pageRowKeys.length > 0 && pageRowKeys.every((key) => selectedKeySet.has(key))))
92
106
  : false;
93
107
  const partiallyChecked = rowSelection ? pageRowKeys.some((key) => selectedKeySet.has(key)) && !allChecked : false;
94
- return (_jsxs("div", { className: "bg-white 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, { className: "bg-table-header", style: {
108
+ 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, { className: "bg-table-header", style: {
95
109
  width: '48px',
96
110
  minWidth: '48px',
97
111
  position: 'sticky',
98
112
  left: 0,
99
113
  zIndex: 10,
100
- }, children: [rowSelection.beforeCheckboxNode, _jsx("input", { type: "checkbox", className: "w-4 h-4 rounded border-gray-300 accent-theme", checked: allChecked, "aria-label": "Select all rows", ref: (el) => {
101
- if (el) {
102
- el.indeterminate = partiallyChecked;
103
- }
104
- }, onChange: handleSelectAllChange })] })), columns.map((column) => {
114
+ }, children: [rowSelection.beforeCheckboxNode, _jsx(Checkbox, { checked: allChecked, "aria-label": "Select all rows", indeterminate: partiallyChecked, onChange: (_, event) => handleSelectAllChange(event) })] })), columns.map((column) => {
105
115
  const hasAction = column.isAction ?? column.key === 'action';
106
116
  return (_jsx(TableHead, { isAction: hasAction, style: {
107
117
  ...(hasAction
@@ -115,27 +125,31 @@ export function DataTable({ columns, data: pData, loading, rowKey = 'id', rowSel
115
125
  ? { width: column.width, minWidth: column.width }
116
126
  : { minWidth: defaultColumnWidth }),
117
127
  }, children: column.title }, column.key));
118
- })] }) }), _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: "\u6682\u65E0\u6570\u636E", className: " w-24 h-24" }), "No Data"] }) }) })) : (data.map((record, rowIndex) => (_jsxs(TableRow, { children: [rowSelection && (_jsx(TableCell, { className: "bg-white", style: {
119
- width: '48px',
120
- minWidth: '48px',
121
- position: 'sticky',
122
- left: 0,
123
- zIndex: 1,
124
- }, children: _jsx("input", { type: "checkbox", className: "w-4 h-4 rounded border-gray-300 accent-theme", checked: selectedKeySet.has(getRowKey(record, rowIndex)), "aria-label": "Select row", onChange: () => handleRowSelectChange(getRowKey(record, rowIndex)) }) })), columns.map((column) => {
125
- const value = getCellValue(record, column);
126
- const hasAction = column.isAction ?? column.key === 'action';
127
- return (_jsx(TableCell, { isAction: hasAction, style: {
128
- ...(hasAction
129
- ? {
130
- position: 'sticky',
131
- right: 0,
132
- zIndex: 1,
133
- }
134
- : undefined),
135
- ...(column.width
136
- ? { width: column.width, minWidth: column.width }
137
- : { minWidth: defaultColumnWidth }),
138
- }, children: column.render ? column.render(value, record, rowIndex) : value }, column.key));
139
- })] }, getRowKey(record, rowIndex))))) })] }), loading && (_jsx("div", { className: "absolute inset-0 rounded-[20px] bg-white/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 }) }))] }));
128
+ })] }) }), _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) => {
129
+ const absoluteRowIndex = pageStartIndex + rowIndex;
130
+ const recordKey = getRowKey(record, absoluteRowIndex, rowKey);
131
+ return (_jsxs(TableRow, { children: [rowSelection && (_jsx(TableCell, { className: "bg-background", style: {
132
+ width: '48px',
133
+ minWidth: '48px',
134
+ position: 'sticky',
135
+ left: 0,
136
+ zIndex: 1,
137
+ }, children: _jsx(Checkbox, { checked: selectedKeySet.has(recordKey), "aria-label": "Select row", onChange: () => handleRowSelectChange(recordKey) }) })), columns.map((column) => {
138
+ const value = getCellValue(record, column);
139
+ const hasAction = column.isAction ?? column.key === 'action';
140
+ return (_jsx(TableCell, { isAction: hasAction, style: {
141
+ ...(hasAction
142
+ ? {
143
+ position: 'sticky',
144
+ right: 0,
145
+ zIndex: 1,
146
+ }
147
+ : undefined),
148
+ ...(column.width
149
+ ? { width: column.width, minWidth: column.width }
150
+ : { minWidth: defaultColumnWidth }),
151
+ }, children: renderCellContent(column, value, record, rowIndex, hasAction) }, column.key));
152
+ })] }, recordKey));
153
+ })) })] }), 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 }) }))] }));
140
154
  }
141
155
  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
  }
@@ -0,0 +1,3 @@
1
+ import type { DropdownPositioningStrategy } from '../hooks/useDropdownPositioning';
2
+ export declare const getDatePickerDropdownPosition: DropdownPositioningStrategy;
3
+ //# sourceMappingURL=dropdownPositioning.d.ts.map
@@ -0,0 +1,12 @@
1
+ export const getDatePickerDropdownPosition = ({ anchorRect, contentRect, viewportHeight, offset, }) => {
2
+ const contentHeight = contentRect?.height ?? 360;
3
+ const spaceBelow = viewportHeight - anchorRect.bottom;
4
+ const spaceAbove = anchorRect.top;
5
+ const shouldFlipUp = spaceBelow < contentHeight && spaceAbove > spaceBelow;
6
+ return {
7
+ top: shouldFlipUp
8
+ ? anchorRect.top - contentHeight - offset
9
+ : anchorRect.bottom + offset,
10
+ left: anchorRect.left,
11
+ };
12
+ };
@@ -12,6 +12,7 @@ export interface DateLocaleConfig {
12
12
  startTime: string;
13
13
  endTime: string;
14
14
  confirm: string;
15
+ monthFormat: string;
15
16
  /**
16
17
  * 范围模式 - 快捷选择面板标题
17
18
  */
@@ -1,50 +1,19 @@
1
- /**
2
- * Date 组件文案配置
3
- * 支持外部修改文案内容
4
- */
1
+ import { defaultEnglishResources, defaultLanguageResources } from '../../../../common/i18n';
2
+ const dateDefaultLocale = defaultLanguageResources.components.date;
3
+ const dateDefaultEnglishLocale = defaultEnglishResources.components.date;
5
4
  /**
6
5
  * 默认中文文案
7
6
  */
8
7
  export const zhCNLocale = {
9
- placeholder: '请选择日期',
10
- placeholderDateTime: '请选择日期时间',
11
- placeholderRange: '选择日期范围',
12
- placeholderDateTimeRange: '选择日期时间范围',
13
- weekDays: ['日', '一', '二', '三', '四', '五', '六'],
14
- selectTime: '选择时间',
15
- startTime: '开始时间',
16
- endTime: '结束时间',
17
- confirm: '确认',
18
- quickRanges: '快速选择',
19
- quickRangeToday: '今天',
20
- quickRangeYesterday: '昨天',
21
- quickRangeLast7Days: '近7天',
22
- quickRangeLast30Days: '近30天',
23
- quickRangeThisMonth: '本月',
24
- quickRangeLastYear: '最近一年',
25
- clear: '清除',
8
+ ...dateDefaultLocale,
9
+ weekDays: [...dateDefaultLocale.weekDays],
26
10
  };
27
11
  /**
28
12
  * 默认英文文案
29
13
  */
30
14
  export const enUSLocale = {
31
- placeholder: 'Select date',
32
- placeholderDateTime: 'Select date and time',
33
- placeholderRange: 'Select date range',
34
- placeholderDateTimeRange: 'Select date and time range',
35
- weekDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
36
- selectTime: 'Select time',
37
- startTime: 'Start time',
38
- endTime: 'End time',
39
- confirm: 'Confirm',
40
- quickRanges: 'Quick ranges',
41
- quickRangeToday: 'Today',
42
- quickRangeYesterday: 'Yesterday',
43
- quickRangeLast7Days: 'Last 7 days',
44
- quickRangeLast30Days: 'Last 30 days',
45
- quickRangeThisMonth: 'This month',
46
- quickRangeLastYear: 'Last year',
47
- clear: 'Clear',
15
+ ...dateDefaultEnglishLocale,
16
+ weekDays: [...dateDefaultEnglishLocale.weekDays],
48
17
  };
49
18
  /**
50
19
  * 默认使用中文文案
@@ -0,0 +1,29 @@
1
+ import type { ReactNode } from 'react';
2
+ export type DrawerPlacement = 'top' | 'right' | 'bottom' | 'left';
3
+ export type DrawerProps = {
4
+ open?: boolean;
5
+ onClose?: () => void;
6
+ title?: ReactNode;
7
+ children?: ReactNode;
8
+ footer?: ReactNode;
9
+ className?: string;
10
+ contentClassName?: string;
11
+ mask?: boolean;
12
+ maskClosable?: boolean;
13
+ lockScroll?: boolean;
14
+ closable?: boolean;
15
+ placement?: DrawerPlacement;
16
+ width?: number | string;
17
+ height?: number | string;
18
+ zIndex?: number;
19
+ /**
20
+ * @default document.body
21
+ */
22
+ renderNode?: HTMLElement | (() => HTMLElement);
23
+ /**
24
+ * 是否支持键盘关闭 默认开启
25
+ */
26
+ keyboard?: boolean;
27
+ };
28
+ export declare function Drawer({ open, onClose, title, children, footer, className, contentClassName, mask, maskClosable, lockScroll, closable, placement, width, height, renderNode, keyboard, zIndex, }: DrawerProps): import("react/jsx-runtime").JSX.Element;
29
+ //# sourceMappingURL=Drawer.d.ts.map