@_tc/template-core 0.2.1 → 0.2.3

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 (175) hide show
  1. package/AGENT_README.md +3 -0
  2. package/README.md +43 -1
  3. package/cjs/app/controller/view.js +1 -1
  4. package/cjs/app/middleware.js +1 -1
  5. package/cjs/config/config.default.js +1 -1
  6. package/esm/app/controller/view.js +1 -1
  7. package/esm/app/middleware.js +1 -1
  8. package/esm/config/config.default.js +2 -1
  9. package/fe/_virtual/_rolldown/runtime.js +13 -0
  10. package/fe/packages/react/ui/components/Date/Calendar.js +1 -5
  11. package/fe/packages/react/ui/components/Date/DateTestPage.js +15 -331
  12. package/fe/packages/react/ui/components/Date/LocaleContext.d.ts +1 -0
  13. package/fe/packages/react/ui/components/Date/index.js +2 -2
  14. package/fe/packages/react/ui/components/Date/locales.d.ts +5 -0
  15. package/fe/packages/react/ui/components/Date/locales.js +16 -1
  16. package/fe/packages/react/ui/components/testPage/DemoSection.d.ts +10 -0
  17. package/fe/packages/react/ui/components/testPage/DemoSection.js +73 -0
  18. package/fe/packages/react/ui/components/testPage/MenuTestPage.js +16 -389
  19. package/fe/packages/react/ui/components/testPage/demoRegistry.d.ts +4 -0
  20. package/fe/packages/react/ui/components/testPage/demoRegistry.js +217 -0
  21. package/fe/packages/react/ui/components/testPage/demos/core/BreadcrumbDemo.d.ts +6 -0
  22. package/fe/packages/react/ui/components/testPage/demos/core/BreadcrumbDemo.js +44 -0
  23. package/fe/packages/react/ui/components/testPage/demos/core/BreadcrumbDemo2.js +4 -0
  24. package/fe/packages/react/ui/components/testPage/demos/core/ButtonDemo.d.ts +6 -0
  25. package/fe/packages/react/ui/components/testPage/demos/core/ButtonDemo.js +85 -0
  26. package/fe/packages/react/ui/components/testPage/demos/core/ButtonDemo2.js +4 -0
  27. package/fe/packages/react/ui/components/testPage/demos/core/CardDemo.d.ts +6 -0
  28. package/fe/packages/react/ui/components/testPage/demos/core/CardDemo.js +52 -0
  29. package/fe/packages/react/ui/components/testPage/demos/core/CardDemo2.js +4 -0
  30. package/fe/packages/react/ui/components/testPage/demos/core/CheckboxDemo.d.ts +6 -0
  31. package/fe/packages/react/ui/components/testPage/demos/core/CheckboxDemo.js +41 -0
  32. package/fe/packages/react/ui/components/testPage/demos/core/CheckboxDemo2.js +4 -0
  33. package/fe/packages/react/ui/components/testPage/demos/core/ConfirmDialogDemo.d.ts +6 -0
  34. package/fe/packages/react/ui/components/testPage/demos/core/ConfirmDialogDemo.js +35 -0
  35. package/fe/packages/react/ui/components/testPage/demos/core/ConfirmDialogDemo2.js +4 -0
  36. package/fe/packages/react/ui/components/testPage/demos/core/DataTableDemo.d.ts +6 -0
  37. package/fe/packages/react/ui/components/testPage/demos/core/DataTableDemo.js +243 -0
  38. package/fe/packages/react/ui/components/testPage/demos/core/DataTableDemo2.js +4 -0
  39. package/fe/packages/react/ui/components/testPage/demos/core/DrawerDemo.d.ts +6 -0
  40. package/fe/packages/react/ui/components/testPage/demos/core/DrawerDemo.js +105 -0
  41. package/fe/packages/react/ui/components/testPage/demos/core/DrawerDemo2.js +4 -0
  42. package/fe/packages/react/ui/components/testPage/demos/core/DropdownDemo.d.ts +6 -0
  43. package/fe/packages/react/ui/components/testPage/demos/core/DropdownDemo.js +48 -0
  44. package/fe/packages/react/ui/components/testPage/demos/core/DropdownDemo2.js +4 -0
  45. package/fe/packages/react/ui/components/testPage/demos/core/FormDemo.d.ts +6 -0
  46. package/fe/packages/react/ui/components/testPage/demos/core/FormDemo.js +56 -0
  47. package/fe/packages/react/ui/components/testPage/demos/core/FormDemo2.js +4 -0
  48. package/fe/packages/react/ui/components/testPage/demos/core/ImageUploadDemo.d.ts +6 -0
  49. package/fe/packages/react/ui/components/testPage/demos/core/ImageUploadDemo.js +26 -0
  50. package/fe/packages/react/ui/components/testPage/demos/core/ImageUploadDemo2.js +4 -0
  51. package/fe/packages/react/ui/components/testPage/demos/core/InputDemo.d.ts +6 -0
  52. package/fe/packages/react/ui/components/testPage/demos/core/InputDemo.js +55 -0
  53. package/fe/packages/react/ui/components/testPage/demos/core/InputDemo2.js +4 -0
  54. package/fe/packages/react/ui/components/testPage/demos/core/InputNumberDemo.d.ts +6 -0
  55. package/fe/packages/react/ui/components/testPage/demos/core/InputNumberDemo.js +65 -0
  56. package/fe/packages/react/ui/components/testPage/demos/core/InputNumberDemo2.js +4 -0
  57. package/fe/packages/react/ui/components/testPage/demos/core/LabelDemo.d.ts +6 -0
  58. package/fe/packages/react/ui/components/testPage/demos/core/LabelDemo.js +33 -0
  59. package/fe/packages/react/ui/components/testPage/demos/core/LabelDemo2.js +4 -0
  60. package/fe/packages/react/ui/components/testPage/demos/core/LayoutDemo.d.ts +6 -0
  61. package/fe/packages/react/ui/components/testPage/demos/core/LayoutDemo.js +64 -0
  62. package/fe/packages/react/ui/components/testPage/demos/core/LayoutDemo2.js +4 -0
  63. package/fe/packages/react/ui/components/testPage/demos/core/LoadingDemo.d.ts +6 -0
  64. package/fe/packages/react/ui/components/testPage/demos/core/LoadingDemo.js +32 -0
  65. package/fe/packages/react/ui/components/testPage/demos/core/LoadingDemo2.js +4 -0
  66. package/fe/packages/react/ui/components/testPage/demos/core/MessageDemo.d.ts +6 -0
  67. package/fe/packages/react/ui/components/testPage/demos/core/MessageDemo.js +44 -0
  68. package/fe/packages/react/ui/components/testPage/demos/core/MessageDemo2.js +4 -0
  69. package/fe/packages/react/ui/components/testPage/demos/core/ModalDemo.d.ts +6 -0
  70. package/fe/packages/react/ui/components/testPage/demos/core/ModalDemo.js +61 -0
  71. package/fe/packages/react/ui/components/testPage/demos/core/ModalDemo2.js +4 -0
  72. package/fe/packages/react/ui/components/testPage/demos/core/NotificationDemo.d.ts +6 -0
  73. package/fe/packages/react/ui/components/testPage/demos/core/NotificationDemo.js +50 -0
  74. package/fe/packages/react/ui/components/testPage/demos/core/NotificationDemo2.js +4 -0
  75. package/fe/packages/react/ui/components/testPage/demos/core/PaginationDemo.d.ts +6 -0
  76. package/fe/packages/react/ui/components/testPage/demos/core/PaginationDemo.js +39 -0
  77. package/fe/packages/react/ui/components/testPage/demos/core/PaginationDemo2.js +4 -0
  78. package/fe/packages/react/ui/components/testPage/demos/core/PreviewImageDemo.d.ts +6 -0
  79. package/fe/packages/react/ui/components/testPage/demos/core/PreviewImageDemo.js +22 -0
  80. package/fe/packages/react/ui/components/testPage/demos/core/PreviewImageDemo2.js +4 -0
  81. package/fe/packages/react/ui/components/testPage/demos/core/RadioDemo.d.ts +6 -0
  82. package/fe/packages/react/ui/components/testPage/demos/core/RadioDemo.js +129 -0
  83. package/fe/packages/react/ui/components/testPage/demos/core/RadioDemo2.js +4 -0
  84. package/fe/packages/react/ui/components/testPage/demos/core/SchemaFormDemo.d.ts +6 -0
  85. package/fe/packages/react/ui/components/testPage/demos/core/SchemaFormDemo.js +52 -0
  86. package/fe/packages/react/ui/components/testPage/demos/core/SchemaFormDemo2.js +4 -0
  87. package/fe/packages/react/ui/components/testPage/demos/core/SearchDemo.d.ts +6 -0
  88. package/fe/packages/react/ui/components/testPage/demos/core/SearchDemo.js +52 -0
  89. package/fe/packages/react/ui/components/testPage/demos/core/SearchDemo2.js +4 -0
  90. package/fe/packages/react/ui/components/testPage/demos/core/SelectDemo.d.ts +6 -0
  91. package/fe/packages/react/ui/components/testPage/demos/core/SelectDemo.js +73 -0
  92. package/fe/packages/react/ui/components/testPage/demos/core/SelectDemo2.js +4 -0
  93. package/fe/packages/react/ui/components/testPage/demos/core/SkeletonDemo.d.ts +6 -0
  94. package/fe/packages/react/ui/components/testPage/demos/core/SkeletonDemo.js +46 -0
  95. package/fe/packages/react/ui/components/testPage/demos/core/SkeletonDemo2.js +4 -0
  96. package/fe/packages/react/ui/components/testPage/demos/core/SwitchDemo.d.ts +6 -0
  97. package/fe/packages/react/ui/components/testPage/demos/core/SwitchDemo.js +36 -0
  98. package/fe/packages/react/ui/components/testPage/demos/core/SwitchDemo2.js +4 -0
  99. package/fe/packages/react/ui/components/testPage/demos/core/TableDemo.d.ts +6 -0
  100. package/fe/packages/react/ui/components/testPage/demos/core/TableDemo.js +64 -0
  101. package/fe/packages/react/ui/components/testPage/demos/core/TableDemo2.js +4 -0
  102. package/fe/packages/react/ui/components/testPage/demos/core/TableSearchDemo.d.ts +6 -0
  103. package/fe/packages/react/ui/components/testPage/demos/core/TableSearchDemo.js +74 -0
  104. package/fe/packages/react/ui/components/testPage/demos/core/TableSearchDemo2.js +4 -0
  105. package/fe/packages/react/ui/components/testPage/demos/core/TabsDemo.d.ts +6 -0
  106. package/fe/packages/react/ui/components/testPage/demos/core/TabsDemo.js +56 -0
  107. package/fe/packages/react/ui/components/testPage/demos/core/TabsDemo2.js +4 -0
  108. package/fe/packages/react/ui/components/testPage/demos/core/TextareaDemo.d.ts +6 -0
  109. package/fe/packages/react/ui/components/testPage/demos/core/TextareaDemo.js +30 -0
  110. package/fe/packages/react/ui/components/testPage/demos/core/TextareaDemo2.js +4 -0
  111. package/fe/packages/react/ui/components/testPage/demos/core/ThemeSwitcher.d.ts +6 -0
  112. package/fe/packages/react/ui/components/testPage/demos/core/ThemeSwitcher.js +96 -0
  113. package/fe/packages/react/ui/components/testPage/demos/core/ThemeSwitcher2.js +4 -0
  114. package/fe/packages/react/ui/components/testPage/demos/core/TooltipDemo.d.ts +6 -0
  115. package/fe/packages/react/ui/components/testPage/demos/core/TooltipDemo.js +29 -0
  116. package/fe/packages/react/ui/components/testPage/demos/core/TooltipDemo2.js +4 -0
  117. package/fe/packages/react/ui/components/testPage/demos/core/TreeSelectDemo.d.ts +6 -0
  118. package/fe/packages/react/ui/components/testPage/demos/core/TreeSelectDemo.js +66 -0
  119. package/fe/packages/react/ui/components/testPage/demos/core/TreeSelectDemo2.js +4 -0
  120. package/fe/packages/react/ui/components/testPage/demos/date/DateBasicDemo.d.ts +6 -0
  121. package/fe/packages/react/ui/components/testPage/demos/date/DateBasicDemo.js +31 -0
  122. package/fe/packages/react/ui/components/testPage/demos/date/DateBasicDemo2.js +4 -0
  123. package/fe/packages/react/ui/components/testPage/demos/date/DateControlledDemo.d.ts +6 -0
  124. package/fe/packages/react/ui/components/testPage/demos/date/DateControlledDemo.js +67 -0
  125. package/fe/packages/react/ui/components/testPage/demos/date/DateControlledDemo2.js +4 -0
  126. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDateDemo.d.ts +6 -0
  127. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDateDemo.js +36 -0
  128. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDateDemo2.js +4 -0
  129. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDemo.d.ts +6 -0
  130. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDemo.js +35 -0
  131. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDemo2.js +4 -0
  132. package/fe/packages/react/ui/components/testPage/demos/date/DateFormatDemo.d.ts +6 -0
  133. package/fe/packages/react/ui/components/testPage/demos/date/DateFormatDemo.js +35 -0
  134. package/fe/packages/react/ui/components/testPage/demos/date/DateFormatDemo2.js +4 -0
  135. package/fe/packages/react/ui/components/testPage/demos/date/DateRangeDemo.d.ts +6 -0
  136. package/fe/packages/react/ui/components/testPage/demos/date/DateRangeDemo.js +76 -0
  137. package/fe/packages/react/ui/components/testPage/demos/date/DateRangeDemo2.js +4 -0
  138. package/fe/packages/react/ui/components/testPage/demos/date/DateTimeDemo.d.ts +7 -0
  139. package/fe/packages/react/ui/components/testPage/demos/date/DateTimeDemo.js +60 -0
  140. package/fe/packages/react/ui/components/testPage/demos/date/DateTimeDemo2.js +4 -0
  141. package/fe/packages/react/ui/components/testPage/demos/menu/MenuAccordionDemo.d.ts +7 -0
  142. package/fe/packages/react/ui/components/testPage/demos/menu/MenuAccordionDemo.js +78 -0
  143. package/fe/packages/react/ui/components/testPage/demos/menu/MenuAccordionDemo2.js +4 -0
  144. package/fe/packages/react/ui/components/testPage/demos/menu/MenuClickTriggerDemo.d.ts +7 -0
  145. package/fe/packages/react/ui/components/testPage/demos/menu/MenuClickTriggerDemo.js +79 -0
  146. package/fe/packages/react/ui/components/testPage/demos/menu/MenuClickTriggerDemo2.js +4 -0
  147. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedDemo.d.ts +7 -0
  148. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedDemo.js +82 -0
  149. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedDemo2.js +4 -0
  150. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedNoIconDemo.d.ts +7 -0
  151. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedNoIconDemo.js +44 -0
  152. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedNoIconDemo2.js +4 -0
  153. package/fe/packages/react/ui/components/testPage/demos/menu/MenuJsxDemo.d.ts +7 -0
  154. package/fe/packages/react/ui/components/testPage/demos/menu/MenuJsxDemo.js +64 -0
  155. package/fe/packages/react/ui/components/testPage/demos/menu/MenuJsxDemo2.js +4 -0
  156. package/fe/packages/react/ui/components/testPage/demos/menu/MenuLeftMultipleDemo.d.ts +7 -0
  157. package/fe/packages/react/ui/components/testPage/demos/menu/MenuLeftMultipleDemo.js +81 -0
  158. package/fe/packages/react/ui/components/testPage/demos/menu/MenuLeftMultipleDemo2.js +4 -0
  159. package/fe/packages/react/ui/components/testPage/demos/menu/MenuPopupDemo.d.ts +7 -0
  160. package/fe/packages/react/ui/components/testPage/demos/menu/MenuPopupDemo.js +56 -0
  161. package/fe/packages/react/ui/components/testPage/demos/menu/MenuPopupDemo2.js +4 -0
  162. package/fe/packages/react/ui/components/testPage/demos/menu/MenuStateDemo.d.ts +7 -0
  163. package/fe/packages/react/ui/components/testPage/demos/menu/MenuStateDemo.js +67 -0
  164. package/fe/packages/react/ui/components/testPage/demos/menu/MenuStateDemo2.js +4 -0
  165. package/fe/packages/react/ui/components/testPage/demos/menu/MenuTopDemo.d.ts +7 -0
  166. package/fe/packages/react/ui/components/testPage/demos/menu/MenuTopDemo.js +55 -0
  167. package/fe/packages/react/ui/components/testPage/demos/menu/MenuTopDemo2.js +4 -0
  168. package/fe/packages/react/ui/components/testPage/index.js +30 -1623
  169. package/fe/packages/react/ui/components/testPage/types.d.ts +17 -0
  170. package/fe/packages/react/ui/components/testPage/types.js +0 -0
  171. package/fe/packages/react/ui/i18n/I18nProvider.js +2 -1
  172. package/model/packages/react/ui/components/Date/LocaleContext.d.ts +1 -0
  173. package/model/packages/react/ui/components/Date/locales.d.ts +5 -0
  174. package/package.json +1 -1
  175. package/types/config/config.default.d.ts +6 -0
package/AGENT_README.md CHANGED
@@ -82,11 +82,14 @@ export default {
82
82
  ATKey: 'Authorization',
83
83
  RTKey: 'RT',
84
84
  },
85
+ resourceCacheTimeMs: 5 * 60 * 1000,
85
86
  }
86
87
  ```
87
88
 
88
89
  `auth.ATKey` / `auth.RTKey` 是业务鉴权中间件读取短 token 和刷新 token header 的默认约定;默认分别是 `Authorization` / `RT`。
89
90
 
91
+ `resourceCacheTimeMs` 控制生产环境静态资源缓存时间,单位是 ms,默认 5 分钟。
92
+
90
93
  访问内置后台:
91
94
 
92
95
  ```text
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  TemplateCore 是一个基于 TypeScript、Koa、React 的后台框架包。它把后端约定式加载、前端 Dashboard、Schema CRUD 页面、model 类型和类型扩展放到同一个 npm 包里,项目只需要按目录补充自己的 `app/`、`model/`、`frontend/`。
4
4
 
5
+ 组件预览地址:https://t-c-s-p.allomg.qzz.io/ui-components
6
+
5
7
  ## 安装
6
8
 
7
9
  ```bash
@@ -101,7 +103,7 @@ main().catch((error) => {
101
103
  | `homePage` | `string` | 否 | - | 应用首页路径 |
102
104
  | `additionalPublicPaths` | `string | string[]` | 否 | - | 追加静态资源目录;如需同时作为 Nunjucks 模板查找目录,建议传绝对路径数组 |
103
105
 
104
- 框架会自动读取 `config/config.default.ts` 中的配置(如 `port`、`env`、`auth` 等)。
106
+ 框架会自动读取 `config/config.default.ts` 中的配置(如 `port`、`env`、`auth`、`resourceCacheTimeMs` 等)。
105
107
 
106
108
  常用默认配置示例:
107
109
 
@@ -113,11 +115,14 @@ export default {
113
115
  ATKey: 'Authorization',
114
116
  RTKey: 'RT',
115
117
  },
118
+ resourceCacheTimeMs: 5 * 60 * 1000,
116
119
  }
117
120
  ```
118
121
 
119
122
  `auth.ATKey` / `auth.RTKey` 用于约定项目鉴权中间件读取短 token 和刷新 token 的 header 名;默认分别为 `Authorization` 和 `RT`。
120
123
 
124
+ `resourceCacheTimeMs` 控制生产环境静态资源缓存时间,单位是 ms,默认 5 分钟。
125
+
121
126
  服务端返回给前端的错误消息会按请求头里的语种翻译。当前优先读取 `x-tc-language`,也兼容 `tc_language`、`tc-language`、`language`、`lang`、`locale` 和 `accept-language`;如果没取到,默认按英文 `en-US` 处理。
122
127
 
123
128
  静态资源挂载顺序为:项目 `app/public`、框架 `app/public`、`additionalPublicPaths`。Nunjucks 模板查找顺序为:项目 `app/public/dist`、框架 `app/public/dist`、`additionalPublicPaths/dist`。这些目录由 `app.publicsPath` 统一维护。当 `buildFE` 输出到自定义目录时,可以用 `additionalPublicPaths` 把该目录交给 Koa 提供静态资源访问和模板渲染;如果需要模板查找也命中追加目录,请传绝对路径数组。
@@ -165,6 +170,11 @@ await buildFE('prod', { minifyHtml: true })
165
170
  // config/config.default.ts
166
171
  export default {
167
172
  port: 9000,
173
+ auth: {
174
+ ATKey: 'Authorization',
175
+ RTKey: 'RT',
176
+ },
177
+ resourceCacheTimeMs: 5 * 60 * 1000,
168
178
  }
169
179
  ```
170
180
 
@@ -457,6 +467,38 @@ setLanguage('ja-JP')
457
467
 
458
468
  `addLanguageResources()` 用于追加或新增某个语种的文案,默认会深合并同语种资源;传 `{ merge: false }` 可以替换该语种资源。`setResources(resources, { merge: true })` 可批量合并多语种资源。`LanguageSwitch` 默认会把已注册语种加入选项;需要自定义展示文案时仍可传入 `options`。
459
469
 
470
+ **覆盖组件内置文案**:
471
+
472
+ UI 组件库内置文案也在同一份资源里,统一放在 `components` 命名空间下。项目侧可以覆盖已有文案,也可以给新增语种补齐组件文案:
473
+
474
+ ```ts
475
+ import { addLanguageResources } from '@_tc/template-core/fe'
476
+
477
+ addLanguageResources('zh-CN', {
478
+ components: {
479
+ date: {
480
+ placeholder: '选择日期',
481
+ placeholderRange: '选择日期区间',
482
+ weekDays: ['日', '一', '二', '三', '四', '五', '六'],
483
+ monthFormat: 'yyyy年 M月',
484
+ },
485
+ tableSearch: {
486
+ search: '筛选',
487
+ reset: '清空',
488
+ },
489
+ },
490
+ })
491
+ ```
492
+
493
+ Date 组件除了文案,还依赖 `date-fns` locale 做月份格式化和周起止计算。新增非内置语种时同步注册:
494
+
495
+ ```ts
496
+ import { registerDateFnsLocale } from '@_tc/template-core/fe/rc/components/Date'
497
+ import { ja } from 'date-fns/locale'
498
+
499
+ registerDateFnsLocale('ja-JP', ja)
500
+ ```
501
+
460
502
  React 组件 render 中使用 `useText()` 读取文案。它会订阅语言和资源变化,调用 `setLanguage()` 后组件会自动重渲染。
461
503
 
462
504
  `useText()` / `getText()` 遇到 `$i18n::` 前缀会先去掉前缀再查语言资源;没有前缀时会直接把传入字符串作为 key 查询,查不到才原样返回:
@@ -1 +1 @@
1
- const e=require(`../../packages/common/string/index.js`);var t=e=>JSON.stringify(e).replace(/</g,`\\u003c`).replace(/>/g,`\\u003e`).replace(/&/g,`\\u0026`).replace(/\u2028/g,`\\u2028`).replace(/\u2029/g,`\\u2029`),n=(n=>class{async renderPage(r,i){let a=r.path;if(n.extends.localCacheHtmlEtag.keepFreshFEBuildKey(),a.includes(`${n.options.apiPrefix}/`))await i();else{n.extends.logger.log(` - render page: `+r.params.page);try{let i=r.query.projk;Array.isArray(i)&&(i=e.joinStr(...i));let a={projKey:i??``,name:n.options?.name??``,env:n.envs.get(),FEBasePage:t(`${n.options.pageBasePage}`),basePath:t(`${n.options.pageBasePage}${r.params.page}`),projKeyJson:t(String(r.query.projk??``)),signKey:t(n.config.signKey),options:t(n.options)},o=n.extends.renderView(`${r.params.page}.entry.tpl`,r,a),s=e.joinStr(a.basePath,a.name,a.env,a.projKey);if(!n.extends.localCacheHtmlEtag.hasEtag(s)){let e=n.extends.crypto.hmacSign(o);n.extends.localCacheHtmlEtag.setEtag(s,e)}let c=n.extends.localCacheHtmlEtag.getEtag(s);if(c||console.log(`---- etag 缓存异常 请检查服务 ----`),r.etag=c??Date.now()+``,r.fresh){r.status=304;return}}catch(e){console.log(`-------------- render view error --------------`),console.log(e),n.extends.generateErrorMessage(`template not found`,{status:404,showError:!0,code:0})}}}});module.exports=n;
1
+ const e=require(`../../packages/common/string/index.js`);var t=e=>JSON.stringify(e).replace(/</g,`\\u003c`).replace(/>/g,`\\u003e`).replace(/&/g,`\\u0026`).replace(/\u2028/g,`\\u2028`).replace(/\u2029/g,`\\u2029`),n=(n=>class{async renderPage(r,i){let a=r.path;if(n.extends.localCacheHtmlEtag.keepFreshFEBuildKey(),a.includes(`${n.options.apiPrefix}/`))await i();else{n.extends.logger.log(` - render page: `+r.params.page);try{let i=r.query.projk;Array.isArray(i)&&(i=e.joinStr(...i));let a={projKey:i??``,name:n.options?.name??``,env:n.envs.get(),FEBasePage:t(`${n.options.pageBasePage}`),basePath:t(`${n.options.pageBasePage}${r.params.page}`),projKeyJson:t(String(r.query.projk??``)),signKey:t(n.config.signKey),options:t(n.options)},o=n.extends.renderView(`${r.params.page}.entry.tpl`,r,a),s=e.joinStr(a.basePath,a.name,a.env,a.projKey);if(!n.extends.localCacheHtmlEtag.hasEtag(s)){let e=n.extends.crypto.hmacSign(o);n.extends.localCacheHtmlEtag.setEtag(s,e)}let c=n.extends.localCacheHtmlEtag.getEtag(s);if(c||console.log(`---- etag 缓存异常 请检查服务 ----`),r.etag=c??Date.now()+``,r.set(`Cache-Control`,`public, max-age=${n.config.resourceCacheTimeMs??300*1e3}, immutable`),r.fresh){r.status=304;return}}catch(e){console.log(`-------------- render view error --------------`),console.log(e),n.extends.generateErrorMessage(`template not found`,{status:404,showError:!0,code:0})}}}});module.exports=n;
@@ -1 +1 @@
1
- const e=require(`../_virtual/_rolldown/runtime.js`);let t=require(`koa-compress`);t=e.__toESM(t);let n=require(`koa-bodyparser`);n=e.__toESM(n);let r=require(`koa-static`);r=e.__toESM(r);var i=(0,n.default)({formLimit:`1000mb`,enableTypes:[`form`,`json`,`text`]}),a=e=>{let n=e.envs.isLocal()?{maxage:0,setHeaders(e){e.setHeader(`Cache-Control`,`no-store, no-cache, must-revalidate, proxy-revalidate`),e.setHeader(`Pragma`,`no-cache`),e.setHeader(`Expires`,`0`)}}:{maxage:365*24*60*60*1e3};e.use(e.middlewares.errorHandle),e.use((0,t.default)({threshold:2048})),e.publicsPath.forEach(t=>e.use((0,r.default)(t,n))),e.use(i),e.use(e.middlewares.requestParameterParsing),e.use(e.middlewares.projectHandler),!e.envs.isLocal()&&e.use(e.middlewares.apiSignVerify),e.use(e.middlewares.apiParamsVerify)};module.exports=a;
1
+ const e=require(`../_virtual/_rolldown/runtime.js`);let t=require(`koa-compress`);t=e.__toESM(t);let n=require(`koa-bodyparser`);n=e.__toESM(n);let r=require(`koa-static`);r=e.__toESM(r);var i=(0,n.default)({formLimit:`1000mb`,enableTypes:[`form`,`json`,`text`]}),a=e=>{let n=e.envs.isLocal()?{maxage:0,setHeaders(e){e.setHeader(`Cache-Control`,`no-store, no-cache, must-revalidate, proxy-revalidate`),e.setHeader(`Pragma`,`no-cache`),e.setHeader(`Expires`,`0`)}}:{maxage:e.config.resourceCacheTimeMs??300*1e3};e.use(e.middlewares.errorHandle),e.use((0,t.default)({threshold:2048})),e.publicsPath.forEach(t=>e.use((0,r.default)(t,n))),e.use(i),e.use(e.middlewares.requestParameterParsing),e.use(e.middlewares.projectHandler),!e.envs.isLocal()&&e.use(e.middlewares.apiSignVerify),e.use(e.middlewares.apiParamsVerify)};module.exports=a;
@@ -1 +1 @@
1
- var e={frameName:`TemplateCore`,signKey:`sakjdfnkjwjfnfkjkjldljksndf`,apiSignVerify:{whiteList:[]},auth:{ATKey:`Authorization`,RTKey:`RT`},notFoundRedirectCount:5};module.exports=e;
1
+ var e={frameName:`TemplateCore`,signKey:`sakjdfnkjwjfnfkjkjldljksndf`,apiSignVerify:{whiteList:[]},auth:{ATKey:`Authorization`,RTKey:`RT`},notFoundRedirectCount:5,resourceCacheTimeMs:300*1e3};module.exports=e;
@@ -24,7 +24,7 @@ var t = (e) => JSON.stringify(e).replace(/</g, "\\u003c").replace(/>/g, "\\u003e
24
24
  n.extends.localCacheHtmlEtag.setEtag(s, e);
25
25
  }
26
26
  let c = n.extends.localCacheHtmlEtag.getEtag(s);
27
- if (c || console.log("---- etag 缓存异常 请检查服务 ----"), r.etag = c ?? Date.now() + "", r.fresh) {
27
+ if (c || console.log("---- etag 缓存异常 请检查服务 ----"), r.etag = c ?? Date.now() + "", r.set("Cache-Control", `public, max-age=${n.config.resourceCacheTimeMs ?? 300 * 1e3}, immutable`), r.fresh) {
28
28
  r.status = 304;
29
29
  return;
30
30
  }
@@ -15,7 +15,7 @@ var r = t({
15
15
  setHeaders(e) {
16
16
  e.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate"), e.setHeader("Pragma", "no-cache"), e.setHeader("Expires", "0");
17
17
  }
18
- } : { maxage: 365 * 24 * 60 * 60 * 1e3 };
18
+ } : { maxage: t.config.resourceCacheTimeMs ?? 300 * 1e3 };
19
19
  t.use(t.middlewares.errorHandle), t.use(e({ threshold: 2048 })), t.publicsPath.forEach((e) => t.use(n(e, i))), t.use(r), t.use(t.middlewares.requestParameterParsing), t.use(t.middlewares.projectHandler), !t.envs.isLocal() && t.use(t.middlewares.apiSignVerify), t.use(t.middlewares.apiParamsVerify);
20
20
  };
21
21
  //#endregion
@@ -7,7 +7,8 @@ var e = {
7
7
  ATKey: "Authorization",
8
8
  RTKey: "RT"
9
9
  },
10
- notFoundRedirectCount: 5
10
+ notFoundRedirectCount: 5,
11
+ resourceCacheTimeMs: 300 * 1e3
11
12
  };
12
13
  //#endregion
13
14
  export { e as default };
@@ -0,0 +1,13 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __exportAll = (all, no_symbols) => {
4
+ let target = {};
5
+ for (var name in all) __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true
8
+ });
9
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
10
+ return target;
11
+ };
12
+ //#endregion
13
+ export { __exportAll };
@@ -1,5 +1,3 @@
1
- import { useI18nStore } from "../../i18n/useI18n.js";
2
- import "../../i18n/index.js";
3
1
  import { cn } from "../../lib/utils.js";
4
2
  import { Button } from "../Button/Button.js";
5
3
  import "../Button/index.js";
@@ -10,16 +8,14 @@ import { useMemo, useState } from "react";
10
8
  import { jsx, jsxs } from "react/jsx-runtime";
11
9
  import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from "lucide-react";
12
10
  import { addMonths, addYears, eachDayOfInterval, endOfDay, endOfMonth, endOfWeek, format, isAfter, isBefore, isSameDay, isSameMonth, startOfDay, startOfMonth, startOfWeek, subDays, subMonths, subYears } from "date-fns";
13
- import { enUS, zhCN } from "date-fns/locale";
14
11
  //#region packages/react/ui/components/Date/Calendar.tsx
15
12
  function Calendar({ mode = ModeType.Single, value, onChange, disabledDate, showTime, className, locale: customLocale, quickRanges }) {
16
- const language = useI18nStore((state) => state.language);
17
13
  const contextLocale = useDateLocale();
18
14
  const locale = useMemo(() => ({
19
15
  ...contextLocale,
20
16
  ...customLocale
21
17
  }), [contextLocale, customLocale]);
22
- const dateFnsLocale = language === "zh-CN" ? zhCN : enUS;
18
+ const dateFnsLocale = locale.dateFnsLocale;
23
19
  const [pendingValue, setPendingValue] = useState(value ?? null);
24
20
  const [currentMonth, setCurrentMonth] = useState(() => {
25
21
  if (value instanceof Date) return value;
@@ -1,339 +1,23 @@
1
- import { DatePicker } from "./Date.js";
2
- import { useState } from "react";
1
+ import { DemoSection } from "../testPage/DemoSection.js";
2
+ import { dateDemos } from "../testPage/demoRegistry.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
- import { startOfDay } from "date-fns";
5
4
  //#region packages/react/ui/components/Date/DateTestPage.tsx
6
5
  function DateTestPage() {
7
- const [date1, setDate1] = useState();
8
- const [dateTime1, setDateTime1] = useState();
9
- const [range, setRange] = useState();
10
- const [rangeWithTime, setRangeWithTime] = useState();
11
- const [emptyRange, setEmptyRange] = useState();
12
6
  return /* @__PURE__ */ jsxs("div", {
13
7
  className: "p-8 max-w-6xl mx-auto space-y-8",
14
- children: [
15
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h1", {
16
- className: "text-3xl font-bold mb-2",
17
- children: "Date 组件使用示例"
18
- }), /* @__PURE__ */ jsx("p", {
19
- className: "text-muted-foreground",
20
- children: "展示 DatePicker 组件的各种使用场景"
21
- })] }),
22
- /* @__PURE__ */ jsxs("section", {
23
- className: "space-y-4",
24
- children: [/* @__PURE__ */ jsx("h2", {
25
- className: "text-xl font-semibold",
26
- children: "1. 基本用法"
27
- }), /* @__PURE__ */ jsxs("div", {
28
- className: "grid grid-cols-2 gap-4",
29
- children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
30
- className: "text-sm text-muted-foreground mb-2",
31
- children: "单日期选择"
32
- }), /* @__PURE__ */ jsx(DatePicker, { placeholder: "请选择日期" })] }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
33
- className: "text-sm text-muted-foreground mb-2",
34
- children: "禁用清除按钮"
35
- }), /* @__PURE__ */ jsx(DatePicker, {
36
- placeholder: "请选择日期",
37
- allowClear: false
38
- })] })]
39
- })]
40
- }),
41
- /* @__PURE__ */ jsxs("section", {
42
- className: "space-y-4",
43
- children: [
44
- /* @__PURE__ */ jsx("h2", {
45
- className: "text-xl font-semibold",
46
- children: "2. 日期时间选择器 (showTime)"
47
- }),
48
- /* @__PURE__ */ jsx("p", {
49
- className: "text-sm text-muted-foreground",
50
- children: "时间选择器显示在日历右侧,提供更好的用户体验"
51
- }),
52
- /* @__PURE__ */ jsxs("div", {
53
- className: "grid grid-cols-2 gap-8",
54
- children: [/* @__PURE__ */ jsxs("div", { children: [
55
- /* @__PURE__ */ jsx("h3", {
56
- className: "text-sm font-medium mb-2",
57
- children: "基本用法 - 单日期时间"
58
- }),
59
- /* @__PURE__ */ jsx(DatePicker, {
60
- showTime: true,
61
- placeholder: "请选择日期时间"
62
- }),
63
- /* @__PURE__ */ jsx("p", {
64
- className: "text-xs text-muted-foreground mt-2",
65
- children: "点击输入框打开选择器,时间选择器在右侧显示"
66
- })
67
- ] }), /* @__PURE__ */ jsxs("div", { children: [
68
- /* @__PURE__ */ jsx("h3", {
69
- className: "text-sm font-medium mb-2",
70
- children: "受控模式"
71
- }),
72
- /* @__PURE__ */ jsx(DatePicker, {
73
- showTime: true,
74
- value: dateTime1,
75
- onChange: (val, date) => {
76
- setDateTime1(val);
77
- console.log("选中日期时间:", val);
78
- console.log("Date 对象:", date);
79
- },
80
- placeholder: "受控日期时间选择器"
81
- }),
82
- /* @__PURE__ */ jsxs("p", {
83
- className: "text-sm text-muted-foreground mt-2",
84
- children: ["选中的值: ", /* @__PURE__ */ jsx("code", {
85
- className: "text-xs bg-muted px-1 py-0.5 rounded",
86
- children: String(dateTime1 || "未选择")
87
- })]
88
- })
89
- ] })]
90
- })
91
- ]
92
- }),
93
- /* @__PURE__ */ jsxs("section", {
94
- className: "space-y-4",
95
- children: [/* @__PURE__ */ jsx("h2", {
96
- className: "text-xl font-semibold",
97
- children: "3. 范围选择 (Range Picker)"
98
- }), /* @__PURE__ */ jsxs("div", {
99
- className: "grid grid-cols-2 gap-8",
100
- children: [/* @__PURE__ */ jsxs("div", { children: [
101
- /* @__PURE__ */ jsx("h3", {
102
- className: "text-sm font-medium mb-2",
103
- children: "基本范围选择"
104
- }),
105
- /* @__PURE__ */ jsx(DatePicker, {
106
- mode: "range",
107
- value: emptyRange,
108
- onChange: (val) => {
109
- setEmptyRange(val);
110
- console.log("范围选择:", val);
111
- },
112
- placeholder: "选择日期范围"
113
- }),
114
- /* @__PURE__ */ jsxs("p", {
115
- className: "text-sm text-muted-foreground mt-2",
116
- children: ["值: ", /* @__PURE__ */ jsx("code", {
117
- className: "text-xs bg-muted px-1 py-0.5 rounded",
118
- children: JSON.stringify(emptyRange || "未选择")
119
- })]
120
- })
121
- ] }), /* @__PURE__ */ jsxs("div", { children: [
122
- /* @__PURE__ */ jsx("h3", {
123
- className: "text-sm font-medium mb-2",
124
- children: "范围选择 + 时间选择"
125
- }),
126
- /* @__PURE__ */ jsx(DatePicker, {
127
- mode: "range",
128
- value: rangeWithTime,
129
- showTime: true,
130
- onChange: (val) => {
131
- setRangeWithTime(val);
132
- console.log("范围时间选择:", val);
133
- },
134
- placeholder: "选择日期时间范围"
135
- }),
136
- /* @__PURE__ */ jsxs("p", {
137
- className: "text-sm text-muted-foreground mt-2",
138
- children: [
139
- "值:",
140
- " ",
141
- /* @__PURE__ */ jsx("code", {
142
- className: "text-xs bg-muted px-1 py-0.5 rounded",
143
- children: JSON.stringify(rangeWithTime || "未选择")
144
- })
145
- ]
146
- }),
147
- /* @__PURE__ */ jsx("p", {
148
- className: "text-xs text-muted-foreground mt-1",
149
- children: "选择开始日期后,右侧会显示开始时间选择器;选择结束日期后,会显示结束时间选择器"
150
- })
151
- ] })]
152
- })]
153
- }),
154
- /* @__PURE__ */ jsxs("section", {
155
- className: "space-y-4",
156
- children: [/* @__PURE__ */ jsx("h2", {
157
- className: "text-xl font-semibold",
158
- children: "4. 受控模式"
159
- }), /* @__PURE__ */ jsxs("div", {
160
- className: "grid grid-cols-2 gap-4",
161
- children: [/* @__PURE__ */ jsxs("div", { children: [
162
- /* @__PURE__ */ jsx("p", {
163
- className: "text-sm text-muted-foreground mb-2",
164
- children: "单日期受控"
165
- }),
166
- /* @__PURE__ */ jsx(DatePicker, {
167
- value: date1,
168
- onChange: (date, dateString) => {
169
- setDate1(date);
170
- console.log("选中日期:", date);
171
- console.log("日期字符串:", dateString);
172
- },
173
- placeholder: "受控日期选择器"
174
- }),
175
- /* @__PURE__ */ jsxs("p", {
176
- className: "text-sm text-muted-foreground mt-2",
177
- children: ["选中的日期: ", /* @__PURE__ */ jsx("code", {
178
- className: "text-xs bg-muted px-1 py-0.5 rounded",
179
- children: String(date1 || "未选择")
180
- })]
181
- })
182
- ] }), /* @__PURE__ */ jsxs("div", { children: [
183
- /* @__PURE__ */ jsx("p", {
184
- className: "text-sm text-muted-foreground mb-2",
185
- children: "范围受控"
186
- }),
187
- /* @__PURE__ */ jsx(DatePicker, {
188
- mode: "range",
189
- value: range,
190
- onChange: (val) => {
191
- setRange(val);
192
- console.log("范围变化:", val);
193
- },
194
- placeholder: "受控范围选择器"
195
- }),
196
- /* @__PURE__ */ jsxs("p", {
197
- className: "text-sm text-muted-foreground mt-2",
198
- children: ["值: ", /* @__PURE__ */ jsx("code", {
199
- className: "text-xs bg-muted px-1 py-0.5 rounded",
200
- children: JSON.stringify(range || "未选择")
201
- })]
202
- })
203
- ] })]
204
- })]
205
- }),
206
- /* @__PURE__ */ jsxs("section", {
207
- className: "space-y-4",
208
- children: [/* @__PURE__ */ jsx("h2", {
209
- className: "text-xl font-semibold",
210
- children: "5. 禁用日期"
211
- }), /* @__PURE__ */ jsxs("div", {
212
- className: "grid grid-cols-2 gap-4",
213
- children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
214
- className: "text-sm text-muted-foreground mb-2",
215
- children: "只能选择今天及以后"
216
- }), /* @__PURE__ */ jsx(DatePicker, {
217
- disabledDate: (current) => current < startOfDay(/* @__PURE__ */ new Date()),
218
- placeholder: "选择未来日期"
219
- })] }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
220
- className: "text-sm text-muted-foreground mb-2",
221
- children: "范围选择(禁用过去)"
222
- }), /* @__PURE__ */ jsx(DatePicker, {
223
- mode: "range",
224
- disabledDate: (current) => current < startOfDay(/* @__PURE__ */ new Date()),
225
- placeholder: "选择未来范围"
226
- })] })]
227
- })]
228
- }),
229
- /* @__PURE__ */ jsxs("section", {
230
- className: "space-y-4",
231
- children: [/* @__PURE__ */ jsx("h2", {
232
- className: "text-xl font-semibold",
233
- children: "6. 禁用状态"
234
- }), /* @__PURE__ */ jsxs("div", {
235
- className: "grid grid-cols-2 gap-4",
236
- children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
237
- className: "text-sm text-muted-foreground mb-2",
238
- children: "禁用状态"
239
- }), /* @__PURE__ */ jsx(DatePicker, {
240
- disabled: true,
241
- placeholder: "禁用状态"
242
- })] }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
243
- className: "text-sm text-muted-foreground mb-2",
244
- children: "禁用状态 + 有值"
245
- }), /* @__PURE__ */ jsx(DatePicker, {
246
- disabled: true,
247
- value: "2024-01-15",
248
- placeholder: "禁用状态"
249
- })] })]
250
- })]
251
- }),
252
- /* @__PURE__ */ jsxs("section", {
253
- className: "space-y-4",
254
- children: [/* @__PURE__ */ jsx("h2", {
255
- className: "text-xl font-semibold",
256
- children: "7. 自定义格式"
257
- }), /* @__PURE__ */ jsxs("div", {
258
- className: "grid grid-cols-2 gap-4",
259
- children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
260
- className: "text-sm text-muted-foreground mb-2",
261
- children: "自定义日期格式"
262
- }), /* @__PURE__ */ jsx(DatePicker, {
263
- format: "yyyy/MM/dd",
264
- placeholder: "选择日期 (yyyy/MM/dd)"
265
- })] }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
266
- className: "text-sm text-muted-foreground mb-2",
267
- children: "自定义日期时间格式"
268
- }), /* @__PURE__ */ jsx(DatePicker, {
269
- showTime: true,
270
- format: "yyyy-MM-dd HH:mm:ss",
271
- placeholder: "选择日期时间 (yyyy-MM-dd HH:mm:ss)"
272
- })] })]
273
- })]
274
- }),
275
- /* @__PURE__ */ jsxs("section", {
276
- className: "space-y-4 border-t pt-6",
277
- children: [/* @__PURE__ */ jsx("h2", {
278
- className: "text-xl font-semibold",
279
- children: "API 说明"
280
- }), /* @__PURE__ */ jsxs("div", {
281
- className: "bg-muted/50 p-4 rounded-lg space-y-2 text-sm",
282
- children: [
283
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
284
- className: "font-semibold",
285
- children: "showTime"
286
- }), /* @__PURE__ */ jsx("span", {
287
- className: "text-muted-foreground ml-2",
288
- children: ": boolean - 是否显示时间选择器,时间选择器会显示在日历右侧"
289
- })] }),
290
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
291
- className: "font-semibold",
292
- children: "mode"
293
- }), /* @__PURE__ */ jsx("span", {
294
- className: "text-muted-foreground ml-2",
295
- children: ": 'single' | 'range' - 选择模式,single 为单日期,range 为日期范围"
296
- })] }),
297
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
298
- className: "font-semibold",
299
- children: "value"
300
- }), /* @__PURE__ */ jsx("span", {
301
- className: "text-muted-foreground ml-2",
302
- children: ": string | [string, string] - 受控模式的值"
303
- })] }),
304
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
305
- className: "font-semibold",
306
- children: "onChange"
307
- }), /* @__PURE__ */ jsxs("span", {
308
- className: "text-muted-foreground ml-2",
309
- children: [
310
- ": (value?: DateChangeStrValue, date?: Date | DateRange) =",
311
- ">",
312
- " void - 值变化回调"
313
- ]
314
- })] }),
315
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
316
- className: "font-semibold",
317
- children: "format"
318
- }), /* @__PURE__ */ jsx("span", {
319
- className: "text-muted-foreground ml-2",
320
- children: ": string - 日期格式,默认 'yyyy-MM-dd',showTime 时为 'yyyy-MM-dd HH:mm'"
321
- })] }),
322
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
323
- className: "font-semibold",
324
- children: "disabledDate"
325
- }), /* @__PURE__ */ jsxs("span", {
326
- className: "text-muted-foreground ml-2",
327
- children: [
328
- ": (current: Date) =",
329
- ">",
330
- " boolean - 禁用日期的判断函数"
331
- ]
332
- })] })
333
- ]
334
- })]
335
- })
336
- ]
8
+ children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h1", {
9
+ className: "text-3xl font-bold mb-2",
10
+ children: "Date 组件使用示例"
11
+ }), /* @__PURE__ */ jsx("p", {
12
+ className: "text-muted-foreground",
13
+ children: "展示 DatePicker 组件的各种使用场景"
14
+ })] }), dateDemos.map(({ id, Component, meta, source }) => /* @__PURE__ */ jsx(DemoSection, {
15
+ title: meta.title,
16
+ description: meta.description,
17
+ source,
18
+ contentClassName: meta.contentClassName,
19
+ children: /* @__PURE__ */ jsx(Component, {})
20
+ }, id))]
337
21
  });
338
22
  }
339
23
  //#endregion
@@ -1,6 +1,7 @@
1
1
  import { type DateLocaleConfig } from "./locales";
2
2
  export declare const DateLocaleContext: import("react").Context<Partial<DateLocaleConfig> | undefined>;
3
3
  export declare const useDateLocale: () => {
4
+ dateFnsLocale?: import("date-fns").Locale;
4
5
  placeholder: string;
5
6
  placeholderDateTime: string;
6
7
  placeholderRange: string;
@@ -1,6 +1,6 @@
1
- import { defaultLocale, enUSLocale, getDateLocale, zhCNLocale } from "./locales.js";
1
+ import { defaultLocale, enUSLocale, getDateFnsLocale, getDateLocale, registerDateFnsLocale, registerDateFnsLocales, zhCNLocale } from "./locales.js";
2
2
  import { useDateLocaleStore } from "./dateLocaleStore.js";
3
3
  import { useDateLocale } from "./LocaleContext.js";
4
4
  import { DatePicker } from "./Date.js";
5
5
  import { DateLocaleProvider } from "./LocaleProvider.js";
6
- export { DateLocaleProvider, DatePicker, defaultLocale, enUSLocale, getDateLocale, useDateLocale, useDateLocaleStore, zhCNLocale };
6
+ export { DateLocaleProvider, DatePicker, defaultLocale, enUSLocale, getDateFnsLocale, getDateLocale, registerDateFnsLocale, registerDateFnsLocales, useDateLocale, useDateLocaleStore, zhCNLocale };
@@ -1,5 +1,7 @@
1
1
  import type { I18nTranslateState } from "../../../../common/i18n/index";
2
+ import type { Locale as DateFnsLocale } from "date-fns";
2
3
  export interface DateLocaleConfig {
4
+ dateFnsLocale?: DateFnsLocale;
3
5
  placeholder: string;
4
6
  placeholderDateTime: string;
5
7
  placeholderRange: string;
@@ -19,6 +21,9 @@ export interface DateLocaleConfig {
19
21
  quickRangeLastYear: string;
20
22
  clear: string;
21
23
  }
24
+ export declare const registerDateFnsLocale: (language: string, locale: DateFnsLocale) => void;
25
+ export declare const registerDateFnsLocales: (locales: Record<string, DateFnsLocale>) => void;
26
+ export declare const getDateFnsLocale: (language: string, fallbackLanguage?: string) => DateFnsLocale;
22
27
  export declare const getDateLocale: (state: I18nTranslateState) => DateLocaleConfig;
23
28
  export declare const zhCNLocale: DateLocaleConfig;
24
29
  export declare const enUSLocale: DateLocaleConfig;
@@ -1,6 +1,21 @@
1
1
  import { i18nStore, translate } from "../../../../common/i18n/index.js";
2
+ import { enUS, zhCN } from "date-fns/locale";
2
3
  //#region packages/react/ui/components/Date/locales.ts
4
+ var dateFnsLocaleMap = {
5
+ "zh-CN": zhCN,
6
+ "en-US": enUS
7
+ };
8
+ var registerDateFnsLocale = (language, locale) => {
9
+ dateFnsLocaleMap[language] = locale;
10
+ };
11
+ var registerDateFnsLocales = (locales) => {
12
+ Object.assign(dateFnsLocaleMap, locales);
13
+ };
14
+ var getDateFnsLocale = (language, fallbackLanguage) => {
15
+ return dateFnsLocaleMap[language] ?? (fallbackLanguage ? dateFnsLocaleMap[fallbackLanguage] : void 0) ?? zhCN;
16
+ };
3
17
  var getDateLocale = (state) => ({
18
+ dateFnsLocale: getDateFnsLocale(state.language, state.fallbackLanguage),
4
19
  placeholder: translate(state, "components.date.placeholder"),
5
20
  placeholderDateTime: translate(state, "components.date.placeholderDateTime"),
6
21
  placeholderRange: translate(state, "components.date.placeholderRange"),
@@ -38,4 +53,4 @@ var enUSLocale = { ...getDateLocaleByLanguage("en-US") };
38
53
  */
39
54
  var defaultLocale = zhCNLocale;
40
55
  //#endregion
41
- export { defaultLocale, enUSLocale, getDateLocale, zhCNLocale };
56
+ export { defaultLocale, enUSLocale, getDateFnsLocale, getDateLocale, registerDateFnsLocale, registerDateFnsLocales, zhCNLocale };
@@ -0,0 +1,10 @@
1
+ import { type ReactNode } from "react";
2
+ type DemoSectionProps = {
3
+ title: string;
4
+ description?: string;
5
+ source?: string;
6
+ children: ReactNode;
7
+ contentClassName?: string;
8
+ };
9
+ export declare function DemoSection({ title, description, source, children, contentClassName }: DemoSectionProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};