create-react-admin-template 0.0.0-stage → 0.1.0

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 (736) hide show
  1. package/README.md +46 -2
  2. package/bin/create.mjs +5 -0
  3. package/package.json +22 -4
  4. package/template/.dockerignore +12 -0
  5. package/template/.editorconfig +12 -0
  6. package/template/.env +14 -0
  7. package/template/.env.development +5 -0
  8. package/template/.env.production +2 -0
  9. package/template/.env.test +5 -0
  10. package/template/.github/workflows/ci.yml +40 -0
  11. package/template/.gitlab-ci.yml +208 -0
  12. package/template/.husky/commit-msg +1 -0
  13. package/template/.husky/pre-commit +1 -0
  14. package/template/.nvmrc +1 -0
  15. package/template/.prettierignore +11 -0
  16. package/template/.prettierrc +47 -0
  17. package/template/Dockerfile +16 -0
  18. package/template/README.md +372 -0
  19. package/template/build/advancedTable.ts +103 -0
  20. package/template/build/environment.ts +150 -0
  21. package/template/commitlint.config.js +32 -0
  22. package/template/components.json +21 -0
  23. package/template/deploy/README.md +132 -0
  24. package/template/deploy/host-nginx/react-admin-api.conf +14 -0
  25. package/template/deploy/host-nginx/react-admin-web.conf +8 -0
  26. package/template/deploy/nginx.conf +38 -0
  27. package/template/docs/activity-status.md +217 -0
  28. package/template/docs/audit-logs.md +158 -0
  29. package/template/docs/authentication-adapters.md +219 -0
  30. package/template/docs/browser-security.md +58 -0
  31. package/template/docs/bundle-budgets.md +65 -0
  32. package/template/docs/component-source-governance.md +99 -0
  33. package/template/docs/data-masking.md +169 -0
  34. package/template/docs/enterprise-scaffold.md +208 -0
  35. package/template/docs/feature-data-template.md +227 -0
  36. package/template/docs/feature-flags.md +169 -0
  37. package/template/docs/file-capabilities.md +196 -0
  38. package/template/docs/locale-and-i18n.md +132 -0
  39. package/template/docs/mutation-idempotency.md +24 -0
  40. package/template/docs/optional-editors.md +203 -0
  41. package/template/docs/page-feedback.md +83 -0
  42. package/template/docs/query-data-conventions.md +178 -0
  43. package/template/docs/realtime-collaboration.md +140 -0
  44. package/template/docs/reporting-printing-templates.md +156 -0
  45. package/template/docs/scaffold-capability-roadmap.md +226 -0
  46. package/template/docs/scaffold-guide.md +443 -0
  47. package/template/docs/template-changelog.md +30 -0
  48. package/template/docs/template-versioning.md +26 -0
  49. package/template/docs/tenant-workspace-context.md +147 -0
  50. package/template/docs/unsaved-changes.md +58 -0
  51. package/template/docs/white-label.md +102 -0
  52. package/template/eslint.config.js +697 -0
  53. package/template/gitignore +39 -0
  54. package/template/index.html +26 -0
  55. package/template/knip.config.ts +42 -0
  56. package/template/lint-staged.config.js +8 -0
  57. package/template/package.json +133 -0
  58. package/template/pnpm-lock.yaml +8694 -0
  59. package/template/public/favicon.ico +0 -0
  60. package/template/public/logo.svg +1 -0
  61. package/template/public/runtime-config.json +49 -0
  62. package/template/scaffold.template.json +5 -0
  63. package/template/src/Application.tsx +114 -0
  64. package/template/src/api/ApiError.ts +33 -0
  65. package/template/src/api/activity/ActivityProvider.tsx +167 -0
  66. package/template/src/api/activity/access.ts +13 -0
  67. package/template/src/api/activity/errors.ts +17 -0
  68. package/template/src/api/activity/index.ts +67 -0
  69. package/template/src/api/activity/model.ts +227 -0
  70. package/template/src/api/activity/query.ts +163 -0
  71. package/template/src/api/activity/source.ts +16 -0
  72. package/template/src/api/activity/subscription.ts +292 -0
  73. package/template/src/api/activity/transports.ts +271 -0
  74. package/template/src/api/activity/types.ts +402 -0
  75. package/template/src/api/authClient.ts +134 -0
  76. package/template/src/api/authSession.ts +307 -0
  77. package/template/src/api/clients/configureApiClient.ts +62 -0
  78. package/template/src/api/clients/httpStatus.ts +4 -0
  79. package/template/src/api/config/services.json +7 -0
  80. package/template/src/api/demoAuthClient.ts +46 -0
  81. package/template/src/api/enums/EnumCatalogProvider.tsx +169 -0
  82. package/template/src/api/enums/EnumDictionary.ts +55 -0
  83. package/template/src/api/enums/access.ts +130 -0
  84. package/template/src/api/enums/catalog.ts +216 -0
  85. package/template/src/api/enums/errors.ts +21 -0
  86. package/template/src/api/enums/index.ts +48 -0
  87. package/template/src/api/enums/query.ts +82 -0
  88. package/template/src/api/enums/scope.ts +58 -0
  89. package/template/src/api/enums/types.ts +251 -0
  90. package/template/src/api/hooks/error.ts +198 -0
  91. package/template/src/api/hooks/index.ts +4 -0
  92. package/template/src/api/hooks/request.ts +99 -0
  93. package/template/src/api/hooks/requestId.ts +65 -0
  94. package/template/src/api/hooks/response.ts +22 -0
  95. package/template/src/api/hooks/types.ts +20 -0
  96. package/template/src/api/idempotency/index.ts +1 -0
  97. package/template/src/api/idempotency/key.ts +23 -0
  98. package/template/src/api/index.ts +14 -0
  99. package/template/src/api/metadata/MetadataProvider.tsx +37 -0
  100. package/template/src/api/metadata/index.ts +2 -0
  101. package/template/src/api/metadata/types.ts +30 -0
  102. package/template/src/api/parameters/GlobalParameterProvider.tsx +210 -0
  103. package/template/src/api/parameters/access.ts +117 -0
  104. package/template/src/api/parameters/catalog.ts +170 -0
  105. package/template/src/api/parameters/errors.ts +21 -0
  106. package/template/src/api/parameters/index.ts +53 -0
  107. package/template/src/api/parameters/query.ts +84 -0
  108. package/template/src/api/parameters/scope.ts +58 -0
  109. package/template/src/api/parameters/types.ts +214 -0
  110. package/template/src/api/query/index.ts +13 -0
  111. package/template/src/api/query/keys.ts +155 -0
  112. package/template/src/api/query/mutation.ts +48 -0
  113. package/template/src/api/query/react.ts +36 -0
  114. package/template/src/api/query/scope.ts +38 -0
  115. package/template/src/api/query/types.ts +147 -0
  116. package/template/src/api/types.ts +144 -0
  117. package/template/src/application/types.ts +52 -0
  118. package/template/src/auditLogs/errors.ts +17 -0
  119. package/template/src/auditLogs/export.ts +85 -0
  120. package/template/src/auditLogs/index.ts +54 -0
  121. package/template/src/auditLogs/model.ts +526 -0
  122. package/template/src/auditLogs/query.ts +113 -0
  123. package/template/src/auditLogs/react.ts +36 -0
  124. package/template/src/auditLogs/source.ts +51 -0
  125. package/template/src/auditLogs/types.ts +357 -0
  126. package/template/src/authentication/controller.ts +351 -0
  127. package/template/src/authentication/index.ts +8 -0
  128. package/template/src/authentication/redirect.ts +72 -0
  129. package/template/src/authentication/types.ts +300 -0
  130. package/template/src/bootstrap.tsx +96 -0
  131. package/template/src/components/AppDataTable/AppDataTable.tsx +74 -0
  132. package/template/src/components/AppDataTable/index.ts +2 -0
  133. package/template/src/components/AppDataTable/types.ts +27 -0
  134. package/template/src/components/AppDialog/AppConfirmDialog.tsx +44 -0
  135. package/template/src/components/AppDialog/AppDialog.tsx +113 -0
  136. package/template/src/components/AppDialog/index.ts +3 -0
  137. package/template/src/components/AppDialog/messages.tsx +22 -0
  138. package/template/src/components/AppDialog/types.ts +53 -0
  139. package/template/src/components/AppPageForm/AppPageForm.tsx +21 -0
  140. package/template/src/components/AppPageForm/PageForm.tsx +765 -0
  141. package/template/src/components/AppPageForm/SOURCE.md +26 -0
  142. package/template/src/components/AppPageForm/config.ts +253 -0
  143. package/template/src/components/AppPageForm/controller.ts +580 -0
  144. package/template/src/components/AppPageForm/index.ts +2 -0
  145. package/template/src/components/AppPageForm/messages.ts +90 -0
  146. package/template/src/components/AppPageForm/optionUtils.ts +91 -0
  147. package/template/src/components/AppPageForm/options.ts +397 -0
  148. package/template/src/components/AppPageForm/query.ts +44 -0
  149. package/template/src/components/AppPageForm/style.css +119 -0
  150. package/template/src/components/AppPageForm/types.ts +632 -0
  151. package/template/src/components/AppPageForm/validation.ts +233 -0
  152. package/template/src/components/AppTable/AppTable.tsx +26 -0
  153. package/template/src/components/AppTable/SOURCE.md +72 -0
  154. package/template/src/components/AppTable/cell/customCell/TableCellLayer.tsx +73 -0
  155. package/template/src/components/AppTable/cell/customCell/actions/ActionDropdownCell.tsx +104 -0
  156. package/template/src/components/AppTable/cell/customCell/cellLayer.ts +358 -0
  157. package/template/src/components/AppTable/cell/customCell/componentProps.ts +30 -0
  158. package/template/src/components/AppTable/cell/customCell/date/TemporalPickerEditor.tsx +54 -0
  159. package/template/src/components/AppTable/cell/customCell/index.ts +2 -0
  160. package/template/src/components/AppTable/cell/customCell/select/SelectCellEditor.tsx +225 -0
  161. package/template/src/components/AppTable/cell/customCell/tableCellLayer.css +20 -0
  162. package/template/src/components/AppTable/cell/customCell/tooltip/TooltipCell.tsx +45 -0
  163. package/template/src/components/AppTable/cell/customCell/types.ts +63 -0
  164. package/template/src/components/AppTable/cell/customCell/useCellLayerLifecycle.ts +111 -0
  165. package/template/src/components/AppTable/cell/frameworkCell/TableCellComponentLayer.tsx +40 -0
  166. package/template/src/components/AppTable/cell/frameworkCell/cellComponentSession.ts +203 -0
  167. package/template/src/components/AppTable/cell/frameworkCell/index.ts +3 -0
  168. package/template/src/components/AppTable/cell/index.ts +2 -0
  169. package/template/src/components/AppTable/columns/TableColumnEditor.tsx +257 -0
  170. package/template/src/components/AppTable/columns/index.ts +1 -0
  171. package/template/src/components/AppTable/columns/useTableColumnPreferenceActions.ts +85 -0
  172. package/template/src/components/AppTable/config/defaults.ts +46 -0
  173. package/template/src/components/AppTable/config/index.ts +2 -0
  174. package/template/src/components/AppTable/config/license.ts +39 -0
  175. package/template/src/components/AppTable/config/resolver.ts +25 -0
  176. package/template/src/components/AppTable/config/types.ts +377 -0
  177. package/template/src/components/AppTable/engine/bottom/index.ts +1 -0
  178. package/template/src/components/AppTable/engine/bottom/types.ts +14 -0
  179. package/template/src/components/AppTable/engine/cell/constants.ts +32 -0
  180. package/template/src/components/AppTable/engine/cell/customCell/actions/index.ts +1 -0
  181. package/template/src/components/AppTable/engine/cell/customCell/actions/renderer.ts +162 -0
  182. package/template/src/components/AppTable/engine/cell/customCell/date/index.ts +1 -0
  183. package/template/src/components/AppTable/engine/cell/customCell/date/renderer.ts +116 -0
  184. package/template/src/components/AppTable/engine/cell/customCell/editors/editorBounds.ts +57 -0
  185. package/template/src/components/AppTable/engine/cell/customCell/editors/editorTrigger.ts +46 -0
  186. package/template/src/components/AppTable/engine/cell/customCell/editors/index.ts +3 -0
  187. package/template/src/components/AppTable/engine/cell/customCell/editors/layerEditor.ts +244 -0
  188. package/template/src/components/AppTable/engine/cell/customCell/index.ts +7 -0
  189. package/template/src/components/AppTable/engine/cell/customCell/renderers/columnRenderer.ts +245 -0
  190. package/template/src/components/AppTable/engine/cell/customCell/renderers/confirmInput.ts +57 -0
  191. package/template/src/components/AppTable/engine/cell/customCell/renderers/display.ts +78 -0
  192. package/template/src/components/AppTable/engine/cell/customCell/renderers/index.ts +3 -0
  193. package/template/src/components/AppTable/engine/cell/customCell/renderers/itemList.ts +60 -0
  194. package/template/src/components/AppTable/engine/cell/customCell/renderers/links.ts +131 -0
  195. package/template/src/components/AppTable/engine/cell/customCell/renderers/selection.ts +41 -0
  196. package/template/src/components/AppTable/engine/cell/customCell/renderers/shared.ts +71 -0
  197. package/template/src/components/AppTable/engine/cell/customCell/renderers/step.ts +37 -0
  198. package/template/src/components/AppTable/engine/cell/customCell/renderers/switch.ts +45 -0
  199. package/template/src/components/AppTable/engine/cell/customCell/select/index.ts +1 -0
  200. package/template/src/components/AppTable/engine/cell/customCell/select/renderer.ts +33 -0
  201. package/template/src/components/AppTable/engine/cell/customCell/tooltip/index.ts +1 -0
  202. package/template/src/components/AppTable/engine/cell/customCell/tooltip/tooltip.ts +94 -0
  203. package/template/src/components/AppTable/engine/cell/customCell/types.ts +82 -0
  204. package/template/src/components/AppTable/engine/cell/formatting.ts +355 -0
  205. package/template/src/components/AppTable/engine/cell/formula.ts +145 -0
  206. package/template/src/components/AppTable/engine/cell/index.ts +7 -0
  207. package/template/src/components/AppTable/engine/cell/multiSelect.ts +96 -0
  208. package/template/src/components/AppTable/engine/cell/options.ts +339 -0
  209. package/template/src/components/AppTable/engine/cell/types.ts +53 -0
  210. package/template/src/components/AppTable/engine/columns/column.ts +430 -0
  211. package/template/src/components/AppTable/engine/columns/config/columns.ts +33 -0
  212. package/template/src/components/AppTable/engine/columns/config/index.ts +4 -0
  213. package/template/src/components/AppTable/engine/columns/config/mutation.ts +138 -0
  214. package/template/src/components/AppTable/engine/columns/config/temporal.ts +11 -0
  215. package/template/src/components/AppTable/engine/columns/config/validation.ts +106 -0
  216. package/template/src/components/AppTable/engine/columns/constants.ts +6 -0
  217. package/template/src/components/AppTable/engine/columns/gridColumns.ts +332 -0
  218. package/template/src/components/AppTable/engine/columns/index.ts +4 -0
  219. package/template/src/components/AppTable/engine/columns/rendererPolicies.ts +129 -0
  220. package/template/src/components/AppTable/engine/component/resolver.ts +272 -0
  221. package/template/src/components/AppTable/engine/component/types.ts +384 -0
  222. package/template/src/components/AppTable/engine/config/constants.ts +33 -0
  223. package/template/src/components/AppTable/engine/config/grid/compiler.ts +65 -0
  224. package/template/src/components/AppTable/engine/config/grid/defaults.ts +82 -0
  225. package/template/src/components/AppTable/engine/config/grid/ownership.ts +35 -0
  226. package/template/src/components/AppTable/engine/config/grid/runtimeDelta.ts +34 -0
  227. package/template/src/components/AppTable/engine/config/grid/types.ts +30 -0
  228. package/template/src/components/AppTable/engine/pagination/config.ts +75 -0
  229. package/template/src/components/AppTable/engine/pagination/constants.ts +5 -0
  230. package/template/src/components/AppTable/engine/pagination/index.ts +3 -0
  231. package/template/src/components/AppTable/engine/pagination/types.ts +70 -0
  232. package/template/src/components/AppTable/engine/preference/index.ts +2 -0
  233. package/template/src/components/AppTable/engine/preference/preference.ts +535 -0
  234. package/template/src/components/AppTable/engine/preference/types.ts +28 -0
  235. package/template/src/components/AppTable/engine/right/index.ts +1 -0
  236. package/template/src/components/AppTable/engine/right/types.ts +18 -0
  237. package/template/src/components/AppTable/engine/search/config.ts +64 -0
  238. package/template/src/components/AppTable/engine/search/constants.ts +8 -0
  239. package/template/src/components/AppTable/engine/search/index.ts +7 -0
  240. package/template/src/components/AppTable/engine/search/localQuery.ts +145 -0
  241. package/template/src/components/AppTable/engine/search/query.ts +203 -0
  242. package/template/src/components/AppTable/engine/search/remoteQuery.ts +99 -0
  243. package/template/src/components/AppTable/engine/search/searchInteraction.ts +46 -0
  244. package/template/src/components/AppTable/engine/search/types.ts +155 -0
  245. package/template/src/components/AppTable/engine/selection/config.ts +13 -0
  246. package/template/src/components/AppTable/engine/selection/index.ts +4 -0
  247. package/template/src/components/AppTable/engine/selection/selection.ts +357 -0
  248. package/template/src/components/AppTable/engine/selection/selectionHeader.ts +88 -0
  249. package/template/src/components/AppTable/engine/selection/types.ts +66 -0
  250. package/template/src/components/AppTable/engine/shared/action.ts +11 -0
  251. package/template/src/components/AppTable/engine/shared/constants.ts +2 -0
  252. package/template/src/components/AppTable/engine/shared/decimal.ts +114 -0
  253. package/template/src/components/AppTable/engine/shared/feedback.ts +62 -0
  254. package/template/src/components/AppTable/engine/shared/index.ts +13 -0
  255. package/template/src/components/AppTable/engine/shared/interaction.ts +55 -0
  256. package/template/src/components/AppTable/engine/shared/messages.ts +161 -0
  257. package/template/src/components/AppTable/engine/shared/row.ts +32 -0
  258. package/template/src/components/AppTable/engine/shared/scheduler.ts +17 -0
  259. package/template/src/components/AppTable/engine/shared/tableKey.ts +31 -0
  260. package/template/src/components/AppTable/engine/shared/theme.ts +196 -0
  261. package/template/src/components/AppTable/engine/shared/treeRows.ts +155 -0
  262. package/template/src/components/AppTable/engine/shared/types.ts +58 -0
  263. package/template/src/components/AppTable/engine/shared/valueSnapshot.ts +46 -0
  264. package/template/src/components/AppTable/engine/summary/config/export.ts +117 -0
  265. package/template/src/components/AppTable/engine/summary/config/index.ts +3 -0
  266. package/template/src/components/AppTable/engine/summary/config/summary.ts +62 -0
  267. package/template/src/components/AppTable/engine/summary/config/types.ts +93 -0
  268. package/template/src/components/AppTable/engine/summary/constants.ts +13 -0
  269. package/template/src/components/AppTable/engine/summary/excelJs.ts +133 -0
  270. package/template/src/components/AppTable/engine/summary/export.ts +311 -0
  271. package/template/src/components/AppTable/engine/summary/index.ts +6 -0
  272. package/template/src/components/AppTable/engine/summary/selectionSum.ts +92 -0
  273. package/template/src/components/AppTable/engine/summary/summary.ts +457 -0
  274. package/template/src/components/AppTable/engine/table/clipboard/index.ts +1 -0
  275. package/template/src/components/AppTable/engine/table/clipboard/transfer.ts +9 -0
  276. package/template/src/components/AppTable/engine/table/controller/TableController.ts +802 -0
  277. package/template/src/components/AppTable/engine/table/controller/errors.ts +106 -0
  278. package/template/src/components/AppTable/engine/table/controller/index.ts +4 -0
  279. package/template/src/components/AppTable/engine/table/controller/latestAbortableTask.ts +33 -0
  280. package/template/src/components/AppTable/engine/table/controller/tableDataReplacement.ts +60 -0
  281. package/template/src/components/AppTable/engine/table/controller/tableDomainConfiguration.ts +94 -0
  282. package/template/src/components/AppTable/engine/table/controller/tableEditingCommands.ts +163 -0
  283. package/template/src/components/AppTable/engine/table/controller/tableGridHost.ts +324 -0
  284. package/template/src/components/AppTable/engine/table/controller/tableIdentity.ts +68 -0
  285. package/template/src/components/AppTable/engine/table/controller/tableMutationPipeline.ts +79 -0
  286. package/template/src/components/AppTable/engine/table/controller/tableQueryCoordinator.ts +187 -0
  287. package/template/src/components/AppTable/engine/table/controller/tableReportingCoordinator.ts +143 -0
  288. package/template/src/components/AppTable/engine/table/controller/tableSaveCoordinator.ts +227 -0
  289. package/template/src/components/AppTable/engine/table/controller/tableSaveValidation.ts +29 -0
  290. package/template/src/components/AppTable/engine/table/controller/tableSnapshot.ts +58 -0
  291. package/template/src/components/AppTable/engine/table/controller/types.ts +202 -0
  292. package/template/src/components/AppTable/engine/table/editing/baselineStore.ts +134 -0
  293. package/template/src/components/AppTable/engine/table/editing/changeSet.ts +492 -0
  294. package/template/src/components/AppTable/engine/table/editing/changeSetSettlement.ts +633 -0
  295. package/template/src/components/AppTable/engine/table/editing/commitResultIndex.ts +75 -0
  296. package/template/src/components/AppTable/engine/table/editing/constants.ts +15 -0
  297. package/template/src/components/AppTable/engine/table/editing/dirtyCellIndex.ts +96 -0
  298. package/template/src/components/AppTable/engine/table/editing/index.ts +6 -0
  299. package/template/src/components/AppTable/engine/table/editing/mutation.ts +173 -0
  300. package/template/src/components/AppTable/engine/table/editing/rowKey.ts +10 -0
  301. package/template/src/components/AppTable/engine/table/editing/types.ts +404 -0
  302. package/template/src/components/AppTable/engine/table/editing/validation.ts +452 -0
  303. package/template/src/components/AppTable/engine/table/grid/cellMeta.ts +90 -0
  304. package/template/src/components/AppTable/engine/table/grid/handsontable.ts +25 -0
  305. package/template/src/components/AppTable/engine/table/grid/handsontableExtensions.d.ts +26 -0
  306. package/template/src/components/AppTable/engine/table/grid/index.ts +5 -0
  307. package/template/src/components/AppTable/engine/table/grid/moduleRegistry.ts +39 -0
  308. package/template/src/components/AppTable/engine/table/grid/runtime.ts +31 -0
  309. package/template/src/components/AppTable/engine/table/grid/types.ts +25 -0
  310. package/template/src/components/AppTable/engine/table/hooks/fixedEndHooks.ts +44 -0
  311. package/template/src/components/AppTable/engine/table/hooks/gridHooks.ts +108 -0
  312. package/template/src/components/AppTable/engine/table/hooks/headerHooks.ts +103 -0
  313. package/template/src/components/AppTable/engine/table/hooks/index.ts +3 -0
  314. package/template/src/components/AppTable/engine/table/index.ts +6 -0
  315. package/template/src/components/AppTable/engine/table/layout/constants.ts +2 -0
  316. package/template/src/components/AppTable/engine/table/layout/dropdownMenu.ts +89 -0
  317. package/template/src/components/AppTable/engine/table/layout/fixedColumns.ts +44 -0
  318. package/template/src/components/AppTable/engine/table/layout/fixedEndOverlay.ts +90 -0
  319. package/template/src/components/AppTable/engine/table/layout/fixedEndOverlayAccessibility.ts +104 -0
  320. package/template/src/components/AppTable/engine/table/layout/fixedEndOverlayRenderer.ts +690 -0
  321. package/template/src/components/AppTable/engine/table/layout/fixedEndOverlaySignature.ts +58 -0
  322. package/template/src/components/AppTable/engine/table/layout/fixedEndRuntime.ts +137 -0
  323. package/template/src/components/AppTable/engine/table/layout/handsontableDomAdapter.ts +40 -0
  324. package/template/src/components/AppTable/engine/table/layout/height.ts +72 -0
  325. package/template/src/components/AppTable/engine/table/layout/index.ts +14 -0
  326. package/template/src/components/AppTable/engine/table/layout/layoutScheduler.ts +60 -0
  327. package/template/src/components/AppTable/engine/table/layout/mergeCells.ts +146 -0
  328. package/template/src/components/AppTable/engine/table/layout/nestedHeaders.ts +271 -0
  329. package/template/src/components/AppTable/engine/table/layout/types.ts +10 -0
  330. package/template/src/components/AppTable/engine/toolbar/index.ts +1 -0
  331. package/template/src/components/AppTable/engine/toolbar/types.ts +56 -0
  332. package/template/src/components/AppTable/index.ts +11 -0
  333. package/template/src/components/AppTable/messages.ts +256 -0
  334. package/template/src/components/AppTable/pagination/TablePaginationBar.tsx +193 -0
  335. package/template/src/components/AppTable/pagination/index.ts +1 -0
  336. package/template/src/components/AppTable/pagination/paginationItems.ts +56 -0
  337. package/template/src/components/AppTable/preference/index.ts +1 -0
  338. package/template/src/components/AppTable/preference/useTablePreference.ts +208 -0
  339. package/template/src/components/AppTable/reporting/index.ts +1 -0
  340. package/template/src/components/AppTable/reporting/useTableReporting.ts +342 -0
  341. package/template/src/components/AppTable/search/TableSearchBar.tsx +301 -0
  342. package/template/src/components/AppTable/search/TableSearchConditionEditor.tsx +254 -0
  343. package/template/src/components/AppTable/search/TableSearchField.tsx +338 -0
  344. package/template/src/components/AppTable/search/TableSearchFields.tsx +65 -0
  345. package/template/src/components/AppTable/search/constants.ts +9 -0
  346. package/template/src/components/AppTable/search/index.ts +3 -0
  347. package/template/src/components/AppTable/search/tableSearchBar.css +164 -0
  348. package/template/src/components/AppTable/search/types.ts +7 -0
  349. package/template/src/components/AppTable/search/useTableQuery.ts +373 -0
  350. package/template/src/components/AppTable/selection/index.ts +1 -0
  351. package/template/src/components/AppTable/selection/useTableSelection.ts +188 -0
  352. package/template/src/components/AppTable/sensitiveData.tsx +41 -0
  353. package/template/src/components/AppTable/shared/styles.ts +2 -0
  354. package/template/src/components/AppTable/styles/index.css +6 -0
  355. package/template/src/components/AppTable/styles/tableComponent.css +297 -0
  356. package/template/src/components/AppTable/styles/theme.css +133 -0
  357. package/template/src/components/AppTable/table/components/TableComponent.tsx +567 -0
  358. package/template/src/components/AppTable/table/components/TableErrorFeedback.tsx +36 -0
  359. package/template/src/components/AppTable/table/components/TableGridViewport.tsx +85 -0
  360. package/template/src/components/AppTable/table/components/index.ts +2 -0
  361. package/template/src/components/AppTable/table/components/types.ts +90 -0
  362. package/template/src/components/AppTable/table/controller/configuration.ts +89 -0
  363. package/template/src/components/AppTable/table/controller/index.ts +2 -0
  364. package/template/src/components/AppTable/table/controller/useTableController.ts +155 -0
  365. package/template/src/components/AppTable/table/controller/useTableLifecycle.ts +97 -0
  366. package/template/src/components/AppTable/table/grid/index.ts +1 -0
  367. package/template/src/components/AppTable/table/grid/useTableGrid.ts +857 -0
  368. package/template/src/components/AppTable/table/grid/useTableGridRuntimeSettings.ts +49 -0
  369. package/template/src/components/AppTable/table/index.ts +4 -0
  370. package/template/src/components/AppTable/table/layout/TablePanels.tsx +389 -0
  371. package/template/src/components/AppTable/table/layout/index.ts +7 -0
  372. package/template/src/components/AppTable/table/layout/types.ts +3 -0
  373. package/template/src/components/AppTable/table/layout/useResizablePanel.ts +213 -0
  374. package/template/src/components/AppTable/table/layout/useTableAdaptiveHeight.ts +238 -0
  375. package/template/src/components/AppTable/table/layout/useTablePanels.ts +329 -0
  376. package/template/src/components/AppTable/table/layout/useTableTheme.ts +123 -0
  377. package/template/src/components/AppTable/toolbar/TableToolbar.tsx +336 -0
  378. package/template/src/components/AppTable/toolbar/index.ts +1 -0
  379. package/template/src/components/BrandLogo/BrandLogo.tsx +41 -0
  380. package/template/src/components/BrandLogo/index.ts +1 -0
  381. package/template/src/components/Can/Can.tsx +19 -0
  382. package/template/src/components/Can/index.ts +7 -0
  383. package/template/src/components/Can/types.ts +41 -0
  384. package/template/src/components/EnumBadge/EnumBadge.tsx +44 -0
  385. package/template/src/components/EnumBadge/index.ts +2 -0
  386. package/template/src/components/EnumBadge/types.ts +16 -0
  387. package/template/src/components/EnumText/EnumText.tsx +33 -0
  388. package/template/src/components/EnumText/index.ts +2 -0
  389. package/template/src/components/EnumText/types.ts +13 -0
  390. package/template/src/components/FilePreview/FilePreview.tsx +120 -0
  391. package/template/src/components/FilePreview/index.ts +11 -0
  392. package/template/src/components/FilePreview/preview.ts +88 -0
  393. package/template/src/components/FilePreview/types.ts +91 -0
  394. package/template/src/components/FileUpload/FileUpload.tsx +172 -0
  395. package/template/src/components/FileUpload/index.ts +2 -0
  396. package/template/src/components/FileUpload/types.ts +32 -0
  397. package/template/src/components/JsonEditor/JsonEditor.tsx +103 -0
  398. package/template/src/components/JsonEditor/index.ts +1 -0
  399. package/template/src/components/JsonEditor/types.ts +14 -0
  400. package/template/src/components/PageFeedback/PageFeedback.tsx +194 -0
  401. package/template/src/components/PageFeedback/index.ts +10 -0
  402. package/template/src/components/PageFeedback/types.ts +31 -0
  403. package/template/src/components/PasswordInput/PasswordInput.tsx +50 -0
  404. package/template/src/components/PasswordInput/index.ts +1 -0
  405. package/template/src/components/RouteDialog/RouteDialog.tsx +20 -0
  406. package/template/src/components/RouteDialog/index.ts +2 -0
  407. package/template/src/components/RouteDialog/types.ts +8 -0
  408. package/template/src/components/RouteDialog/useRouteDialogNavigation.ts +30 -0
  409. package/template/src/components/SensitiveData/SensitiveData.tsx +337 -0
  410. package/template/src/components/SensitiveData/index.ts +2 -0
  411. package/template/src/components/SensitiveData/types.ts +31 -0
  412. package/template/src/components/StatusBadge/StatusBadge.tsx +28 -0
  413. package/template/src/components/StatusBadge/index.ts +2 -0
  414. package/template/src/components/StatusBadge/statusBadgeStyles.ts +30 -0
  415. package/template/src/components/StatusBadge/types.ts +7 -0
  416. package/template/src/components/layout/AppHeader/AppHeader.tsx +57 -0
  417. package/template/src/components/layout/AppHeader/HeaderSearch.tsx +160 -0
  418. package/template/src/components/layout/AppHeader/HeaderUserMenu.tsx +59 -0
  419. package/template/src/components/layout/AppHeader/ThemeControls.tsx +44 -0
  420. package/template/src/components/layout/AppHeader/index.ts +1 -0
  421. package/template/src/components/layout/AppHeader/themeOptions.ts +13 -0
  422. package/template/src/components/layout/AppSidebar.tsx +268 -0
  423. package/template/src/components/layout/PageContainer.tsx +16 -0
  424. package/template/src/components/ui/avatar.tsx +108 -0
  425. package/template/src/components/ui/badge.tsx +47 -0
  426. package/template/src/components/ui/button.tsx +63 -0
  427. package/template/src/components/ui/card.tsx +60 -0
  428. package/template/src/components/ui/checkbox.tsx +31 -0
  429. package/template/src/components/ui/collapsible.tsx +33 -0
  430. package/template/src/components/ui/command.tsx +181 -0
  431. package/template/src/components/ui/dialog.tsx +157 -0
  432. package/template/src/components/ui/dropdown-menu.tsx +254 -0
  433. package/template/src/components/ui/form.tsx +141 -0
  434. package/template/src/components/ui/input.tsx +20 -0
  435. package/template/src/components/ui/label.tsx +23 -0
  436. package/template/src/components/ui/pagination.tsx +127 -0
  437. package/template/src/components/ui/popover.tsx +41 -0
  438. package/template/src/components/ui/select.tsx +187 -0
  439. package/template/src/components/ui/separator.tsx +25 -0
  440. package/template/src/components/ui/sheet.tsx +142 -0
  441. package/template/src/components/ui/sidebar.tsx +878 -0
  442. package/template/src/components/ui/skeleton.tsx +13 -0
  443. package/template/src/components/ui/sonner.tsx +33 -0
  444. package/template/src/components/ui/tooltip.tsx +54 -0
  445. package/template/src/config/RuntimeConfigErrorPage.tsx +48 -0
  446. package/template/src/config/appConfig.ts +126 -0
  447. package/template/src/config/buildInfo.ts +8 -0
  448. package/template/src/config/observabilityAdapter.ts +8 -0
  449. package/template/src/config/runtimeConfig.ts +360 -0
  450. package/template/src/config/types.ts +195 -0
  451. package/template/src/context/ThemeProvider.tsx +84 -0
  452. package/template/src/context/UnsavedChangesProvider.tsx +123 -0
  453. package/template/src/context/applicationScope.ts +39 -0
  454. package/template/src/context/types.ts +41 -0
  455. package/template/src/dataMasking/index.ts +14 -0
  456. package/template/src/dataMasking/masking.ts +139 -0
  457. package/template/src/dataMasking/types.ts +144 -0
  458. package/template/src/featureFlags/FeatureFlagProvider.tsx +143 -0
  459. package/template/src/featureFlags/FeatureGate.tsx +12 -0
  460. package/template/src/featureFlags/catalog.ts +140 -0
  461. package/template/src/featureFlags/errors.ts +17 -0
  462. package/template/src/featureFlags/index.ts +43 -0
  463. package/template/src/featureFlags/query.ts +103 -0
  464. package/template/src/featureFlags/registry.ts +149 -0
  465. package/template/src/featureFlags/scope.ts +27 -0
  466. package/template/src/featureFlags/types.ts +241 -0
  467. package/template/src/features/auth/AuthLayout.tsx +17 -0
  468. package/template/src/features/auth/index.ts +2 -0
  469. package/template/src/features/auth/signIn/components/UserAuthForm.tsx +121 -0
  470. package/template/src/features/auth/signIn/index.tsx +71 -0
  471. package/template/src/features/auth/signIn/messages.ts +37 -0
  472. package/template/src/features/auth/signIn/types.ts +4 -0
  473. package/template/src/features/errors/ForbiddenError.tsx +34 -0
  474. package/template/src/features/errors/GeneralError.tsx +46 -0
  475. package/template/src/features/errors/MaintenanceError.tsx +31 -0
  476. package/template/src/features/errors/NotFoundError.tsx +34 -0
  477. package/template/src/features/errors/RouteError.tsx +72 -0
  478. package/template/src/features/errors/UnauthorizedError.tsx +34 -0
  479. package/template/src/features/errors/index.ts +6 -0
  480. package/template/src/features/errors/messages.ts +56 -0
  481. package/template/src/features/home/index.tsx +107 -0
  482. package/template/src/features/home/messages.ts +59 -0
  483. package/template/src/features/showcase/AccessShowcasePage.tsx +284 -0
  484. package/template/src/features/showcase/AdvancedTableDemo.tsx +120 -0
  485. package/template/src/features/showcase/FeedbackShowcasePage.tsx +142 -0
  486. package/template/src/features/showcase/FileShowcasePage.tsx +110 -0
  487. package/template/src/features/showcase/FormShowcasePage.tsx +156 -0
  488. package/template/src/features/showcase/MetadataShowcasePage.tsx +241 -0
  489. package/template/src/features/showcase/ShowcasePageHeader.tsx +24 -0
  490. package/template/src/features/showcase/TableShowcasePage.tsx +436 -0
  491. package/template/src/features/showcase/accessMessages.ts +67 -0
  492. package/template/src/features/showcase/index.ts +6 -0
  493. package/template/src/features/showcase/messages.ts +192 -0
  494. package/template/src/files/download.ts +82 -0
  495. package/template/src/files/errors.ts +15 -0
  496. package/template/src/files/filename.ts +61 -0
  497. package/template/src/files/index.ts +38 -0
  498. package/template/src/files/types.ts +299 -0
  499. package/template/src/files/useFileTask.ts +153 -0
  500. package/template/src/files/useFileUpload.ts +117 -0
  501. package/template/src/files/validation.ts +109 -0
  502. package/template/src/layouts/AppLayout.tsx +37 -0
  503. package/template/src/lib/accessControl.ts +42 -0
  504. package/template/src/lib/navigationRedirect.ts +26 -0
  505. package/template/src/lib/utils.ts +6 -0
  506. package/template/src/locale/LocaleProvider.tsx +37 -0
  507. package/template/src/locale/context.ts +15 -0
  508. package/template/src/locale/formatters.ts +123 -0
  509. package/template/src/locale/hooks.ts +35 -0
  510. package/template/src/locale/index.ts +17 -0
  511. package/template/src/locale/messages.ts +151 -0
  512. package/template/src/locale/types.ts +167 -0
  513. package/template/src/main.tsx +5 -0
  514. package/template/src/observability/browser.ts +37 -0
  515. package/template/src/observability/consoleAdapter.ts +18 -0
  516. package/template/src/observability/index.ts +26 -0
  517. package/template/src/observability/observer.ts +118 -0
  518. package/template/src/observability/redaction.ts +85 -0
  519. package/template/src/observability/types.ts +119 -0
  520. package/template/src/optionalEditors/controller.ts +327 -0
  521. package/template/src/optionalEditors/errors.ts +21 -0
  522. package/template/src/optionalEditors/index.ts +35 -0
  523. package/template/src/optionalEditors/model.ts +253 -0
  524. package/template/src/optionalEditors/react.ts +89 -0
  525. package/template/src/optionalEditors/types.ts +254 -0
  526. package/template/src/permissions/index.ts +3 -0
  527. package/template/src/permissions/types.ts +5 -0
  528. package/template/src/permissions/usePermission.ts +16 -0
  529. package/template/src/realtimeCollaboration/controller.ts +355 -0
  530. package/template/src/realtimeCollaboration/errors.ts +20 -0
  531. package/template/src/realtimeCollaboration/index.ts +39 -0
  532. package/template/src/realtimeCollaboration/model.ts +212 -0
  533. package/template/src/realtimeCollaboration/react.ts +72 -0
  534. package/template/src/realtimeCollaboration/types.ts +251 -0
  535. package/template/src/reporting/errors.ts +21 -0
  536. package/template/src/reporting/generation.ts +87 -0
  537. package/template/src/reporting/index.ts +42 -0
  538. package/template/src/reporting/model.ts +373 -0
  539. package/template/src/reporting/print.ts +16 -0
  540. package/template/src/reporting/query.ts +50 -0
  541. package/template/src/reporting/react.ts +17 -0
  542. package/template/src/reporting/source.ts +13 -0
  543. package/template/src/reporting/types.ts +219 -0
  544. package/template/src/router/RootRouteLayout.tsx +11 -0
  545. package/template/src/router/authLifecycle.ts +39 -0
  546. package/template/src/router/config.ts +293 -0
  547. package/template/src/router/interceptors.ts +48 -0
  548. package/template/src/router/lazyRouteComponents.ts +78 -0
  549. package/template/src/router/messages.ts +48 -0
  550. package/template/src/router/navigation.ts +167 -0
  551. package/template/src/router/router.ts +66 -0
  552. package/template/src/router/searchSchemas.ts +9 -0
  553. package/template/src/router/types.ts +76 -0
  554. package/template/src/stores/authSessionStorage.ts +27 -0
  555. package/template/src/stores/authStore.ts +165 -0
  556. package/template/src/stores/types.ts +36 -0
  557. package/template/src/stores/uiPreferenceStore.ts +34 -0
  558. package/template/src/styles/index.css +141 -0
  559. package/template/src/styles/theme.css +213 -0
  560. package/template/src/tenantWorkspace/TenantWorkspaceProvider.tsx +102 -0
  561. package/template/src/tenantWorkspace/index.ts +33 -0
  562. package/template/src/tenantWorkspace/store.ts +184 -0
  563. package/template/src/tenantWorkspace/switch.ts +206 -0
  564. package/template/src/tenantWorkspace/types.ts +155 -0
  565. package/template/src/vite-env.d.ts +20 -0
  566. package/template/stylelint.config.js +28 -0
  567. package/template/tests/integration/Application.test.tsx +269 -0
  568. package/template/tests/integration/layout/AppHeader.test.tsx +182 -0
  569. package/template/tests/integration/layout/AppSidebar.test.tsx +121 -0
  570. package/template/tests/integration/layout/__screenshots__/AppHeader.test.tsx/AppHeader-command-search-hides-the-duplicate-header-trigger-when-the-desktop-sidebar-collapses-1.png +0 -0
  571. package/template/tests/integration/router/__screenshots__/config.test.ts/route-tree-authentication-boundaries-exposes-only-scaffold-navigation-metadata-1.png +0 -0
  572. package/template/tests/integration/router/config.test.ts +123 -0
  573. package/template/tests/integration/router/interceptors.test.ts +100 -0
  574. package/template/tests/setup/accessibility.ts +25 -0
  575. package/template/tests/setup/runtimeConfig.ts +3 -0
  576. package/template/tests/unit/api/ApiError.test.ts +25 -0
  577. package/template/tests/unit/api/__screenshots__/authSession.test.ts/administrator-authentication-clears-the-session-if-a-refresh-identity-loses-administrator-access-1.png +0 -0
  578. package/template/tests/unit/api/__screenshots__/authSession.test.ts/administrator-authentication-creates-a-session-from-the-generated-login-response-for-an-admin-1.png +0 -0
  579. package/template/tests/unit/api/__screenshots__/authSession.test.ts/administrator-authentication-rejects-and-revokes-the-generated-login-result-for-an-ordinary-user-1.png +0 -0
  580. package/template/tests/unit/api/activity/ActivityProvider.test.tsx +131 -0
  581. package/template/tests/unit/api/activity/__screenshots__/transports.test.ts/activity-transport-adapters-polls-sequentially-and-advances-the-last-event-ID-1.png +0 -0
  582. package/template/tests/unit/api/activity/modelAndQuery.test.ts +144 -0
  583. package/template/tests/unit/api/activity/subscription.test.ts +103 -0
  584. package/template/tests/unit/api/activity/transports.test.ts +145 -0
  585. package/template/tests/unit/api/authClient.test.ts +110 -0
  586. package/template/tests/unit/api/authSession.test.ts +289 -0
  587. package/template/tests/unit/api/clients/configureApiClient.test.ts +198 -0
  588. package/template/tests/unit/api/demoAuthClient.test.ts +47 -0
  589. package/template/tests/unit/api/enums/access.test.ts +107 -0
  590. package/template/tests/unit/api/enums/catalog.test.ts +200 -0
  591. package/template/tests/unit/api/enums/query.test.ts +110 -0
  592. package/template/tests/unit/api/enums/useEnum.test.tsx +98 -0
  593. package/template/tests/unit/api/enums/useEnumCatalog.test.tsx +68 -0
  594. package/template/tests/unit/api/hooks/error.test.ts +168 -0
  595. package/template/tests/unit/api/hooks/request.test.ts +170 -0
  596. package/template/tests/unit/api/hooks/response.test.ts +46 -0
  597. package/template/tests/unit/api/metadata/MetadataProvider.test.tsx +102 -0
  598. package/template/tests/unit/api/parameters/catalog.test.ts +147 -0
  599. package/template/tests/unit/api/parameters/query.test.ts +78 -0
  600. package/template/tests/unit/api/parameters/useGlobalParameter.test.tsx +89 -0
  601. package/template/tests/unit/api/query/queryPolicy.test.ts +245 -0
  602. package/template/tests/unit/api/query/useAppQueryScope.test.tsx +74 -0
  603. package/template/tests/unit/auditLogs/auditLogHooks.test.tsx +194 -0
  604. package/template/tests/unit/auditLogs/auditLogs.test.ts +199 -0
  605. package/template/tests/unit/authentication/__screenshots__/authentication.test.ts/authentication-controller-completes-Step-up-callbacks-without-creating-a-second-login-result-1.png +0 -0
  606. package/template/tests/unit/authentication/__screenshots__/authentication.test.ts/authentication-controller-moves-from-challenge-to-completion-without-retaining-tokens-in-snapshot-1.png +0 -0
  607. package/template/tests/unit/authentication/authentication.test.ts +376 -0
  608. package/template/tests/unit/components/AppDialog.test.tsx +225 -0
  609. package/template/tests/unit/components/AppTable.test.tsx +129 -0
  610. package/template/tests/unit/components/AppTableLayoutTransition.test.ts +118 -0
  611. package/template/tests/unit/components/AppTableLocalization.test.ts +58 -0
  612. package/template/tests/unit/components/AppTableSensitiveData.test.ts +35 -0
  613. package/template/tests/unit/components/AppTableUpgrade.test.tsx +179 -0
  614. package/template/tests/unit/components/AppTableUpgradeCore.test.ts +258 -0
  615. package/template/tests/unit/components/BrandLogo.test.tsx +24 -0
  616. package/template/tests/unit/components/Can.test.tsx +80 -0
  617. package/template/tests/unit/components/Dialog.test.tsx +56 -0
  618. package/template/tests/unit/components/EnumPresentation.test.tsx +64 -0
  619. package/template/tests/unit/components/FilePreviewEngine.test.ts +51 -0
  620. package/template/tests/unit/components/JsonEditor.test.tsx +47 -0
  621. package/template/tests/unit/components/LocalizedSharedComponents.test.tsx +36 -0
  622. package/template/tests/unit/components/OverlayLayer.test.tsx +151 -0
  623. package/template/tests/unit/components/PageFeedback.test.tsx +143 -0
  624. package/template/tests/unit/components/PageForm.test.tsx +272 -0
  625. package/template/tests/unit/components/PageFormCore.test.ts +74 -0
  626. package/template/tests/unit/components/PasswordInput.test.tsx +105 -0
  627. package/template/tests/unit/components/ScaffoldComponents.test.tsx +64 -0
  628. package/template/tests/unit/components/SensitiveData.test.tsx +151 -0
  629. package/template/tests/unit/components/StatusBadge.test.tsx +36 -0
  630. package/template/tests/unit/components/TableComponent.test.tsx +644 -0
  631. package/template/tests/unit/components/TableCore.test.ts +145 -0
  632. package/template/tests/unit/components/ThemeAccessibility.test.tsx +27 -0
  633. package/template/tests/unit/components/__screenshots__/BatchOperationDialog.test.tsx/confirms-a-batch-action-and-presents-partial-failure-details-1.png +0 -0
  634. package/template/tests/unit/components/__screenshots__/PageForm.test.tsx/PageForm-writes-uploaded-values-through-the-public-file-field-and-resets-dirty-state-1.png +0 -0
  635. package/template/tests/unit/components/__screenshots__/PasswordInput.test.tsx/PasswordInput-toggles-the-password-visibility-when-the-show-password-button-is-clicked-1.png +0 -0
  636. package/template/tests/unit/components/__screenshots__/TableComponent.test.tsx/TableComponent-pins-trailing-action-columns-and-removes-their-header-menu-by-default-1.png +0 -0
  637. package/template/tests/unit/components/__screenshots__/TableComponent.test.tsx/TableComponent-renders-shadcn-components-through-cellComponent-1.png +0 -0
  638. package/template/tests/unit/components/__screenshots__/TableComponent.test.tsx/TableComponent-renders-the-toolbar-without-a-bottom-divider-1.png +0 -0
  639. package/template/tests/unit/components/__screenshots__/TableComponent.test.tsx/TableComponent-resyncs-adaptive-height-after-a-column-resize-changes-wrapped-row-height-1.png +0 -0
  640. package/template/tests/unit/config/RuntimeConfigErrorPage.test.tsx +23 -0
  641. package/template/tests/unit/config/appConfig.test.ts +98 -0
  642. package/template/tests/unit/config/appTableContracts.test.mjs +120 -0
  643. package/template/tests/unit/config/bundleBudget.test.mjs +190 -0
  644. package/template/tests/unit/config/componentGovernance.test.mjs +156 -0
  645. package/template/tests/unit/config/deployConfig.test.mjs +211 -0
  646. package/template/tests/unit/config/eslintConfig.test.mjs +101 -0
  647. package/template/tests/unit/config/featureBoundaries.test.mjs +126 -0
  648. package/template/tests/unit/config/npmPackage.test.mjs +37 -0
  649. package/template/tests/unit/config/releaseArtifact.test.mjs +105 -0
  650. package/template/tests/unit/config/runtimeConfig.test.ts +225 -0
  651. package/template/tests/unit/config/scaffoldCheck.test.mjs +53 -0
  652. package/template/tests/unit/config/scaffoldFeature.test.mjs +177 -0
  653. package/template/tests/unit/config/scaffoldInit.test.mjs +218 -0
  654. package/template/tests/unit/config/scaffoldProject.test.mjs +378 -0
  655. package/template/tests/unit/config/scaffoldTransaction.test.mjs +77 -0
  656. package/template/tests/unit/config/viteConfig.test.mjs +371 -0
  657. package/template/tests/unit/context/ThemeProvider.test.tsx +108 -0
  658. package/template/tests/unit/context/UnsavedChangesProvider.test.tsx +94 -0
  659. package/template/tests/unit/context/__screenshots__/ThemeProvider.test.tsx/ThemeProvider-uses-the-neutral-black-palette-for-the-app-and-scoped-table-theme-1.png +0 -0
  660. package/template/tests/unit/context/applicationScope.test.ts +62 -0
  661. package/template/tests/unit/dataMasking/dataMasking.test.ts +95 -0
  662. package/template/tests/unit/featureFlags/featureFlags.test.ts +169 -0
  663. package/template/tests/unit/featureFlags/useFeatureFlag.test.tsx +108 -0
  664. package/template/tests/unit/features/FeatureLocalization.test.tsx +54 -0
  665. package/template/tests/unit/features/RouteError.test.tsx +40 -0
  666. package/template/tests/unit/features/auth/signIn/UserAuthForm.test.tsx +79 -0
  667. package/template/tests/unit/features/auth/signIn/__screenshots__/UserAuthForm.test.tsx/UserAuthForm-passes-validated-values-to-onSubmit-1.png +0 -0
  668. package/template/tests/unit/features/auth/signIn/__screenshots__/UserAuthForm.test.tsx/UserAuthForm-shows-validation-messages-when-submitting-an-empty-form-1.png +0 -0
  669. package/template/tests/unit/files/fileHooks.test.tsx +130 -0
  670. package/template/tests/unit/files/files.test.ts +112 -0
  671. package/template/tests/unit/lib/accessControl.test.ts +69 -0
  672. package/template/tests/unit/locale/locale.test.tsx +90 -0
  673. package/template/tests/unit/observability/browser.test.ts +48 -0
  674. package/template/tests/unit/observability/observer.test.ts +115 -0
  675. package/template/tests/unit/optionalEditors/__screenshots__/useOptionalEditor.test.tsx/useOptionalEditor-fails-permission-precheck-before-loading-the-project-SDK-1.png +0 -0
  676. package/template/tests/unit/optionalEditors/__screenshots__/useOptionalEditor.test.tsx/useOptionalEditor-mounts-a-route-scoped-SDK-into-the-dedicated-host-with-permission-1.png +0 -0
  677. package/template/tests/unit/optionalEditors/optionalEditors.test.ts +313 -0
  678. package/template/tests/unit/optionalEditors/useOptionalEditor.test.tsx +141 -0
  679. package/template/tests/unit/realtimeCollaboration/collaboration.test.ts +240 -0
  680. package/template/tests/unit/realtimeCollaboration/useRealtimeCollaboration.test.tsx +115 -0
  681. package/template/tests/unit/reporting/reporting.test.ts +195 -0
  682. package/template/tests/unit/reporting/reportingHooks.test.tsx +203 -0
  683. package/template/tests/unit/router/authLifecycle.test.ts +55 -0
  684. package/template/tests/unit/router/navigation.test.ts +55 -0
  685. package/template/tests/unit/router/redirects.test.ts +22 -0
  686. package/template/tests/unit/scaffoldFeatureTemplate/featureTemplate.test.ts +42 -0
  687. package/template/tests/unit/scaffoldFeatureTemplate/publicContract.test.ts +28 -0
  688. package/template/tests/unit/scaffoldFeatureTemplate/queries.test.tsx +289 -0
  689. package/template/tests/unit/stores/authStore.test.ts +128 -0
  690. package/template/tests/unit/stores/uiPreferenceStore.test.ts +56 -0
  691. package/template/tests/unit/tenantWorkspace/tenantWorkspace.test.tsx +261 -0
  692. package/template/tools/bundle/budgets.json +48 -0
  693. package/template/tools/bundle/check.mjs +307 -0
  694. package/template/tools/component-governance/check.mjs +703 -0
  695. package/template/tools/component-governance/manifest.json +112 -0
  696. package/template/tools/deployment/browser-smoke.mjs +76 -0
  697. package/template/tools/deployment/browser-smoke.sh +141 -0
  698. package/template/tools/openapi/generate.mjs +268 -0
  699. package/template/tools/openapi/templates/README.md +14 -0
  700. package/template/tools/openapi/templates/base/README.md +7 -0
  701. package/template/tools/openapi/templates/base/data-contracts.eta +44 -0
  702. package/template/tools/openapi/templates/base/http-client.eta +3 -0
  703. package/template/tools/openapi/templates/base/http-clients/axios-http-client.eta +132 -0
  704. package/template/tools/openapi/templates/base/http-clients/fetch-http-client.eta +220 -0
  705. package/template/tools/openapi/templates/base/route-docs.eta +31 -0
  706. package/template/tools/openapi/templates/base/route-name.eta +43 -0
  707. package/template/tools/openapi/templates/base/route-type.eta +22 -0
  708. package/template/tools/openapi/templates/default/README.md +7 -0
  709. package/template/tools/openapi/templates/default/api.eta +67 -0
  710. package/template/tools/openapi/templates/default/http-client.eta +137 -0
  711. package/template/tools/openapi/templates/default/procedure-call.eta +99 -0
  712. package/template/tools/openapi/templates/default/route-docs.eta +40 -0
  713. package/template/tools/openapi/templates/default/route-types.eta +28 -0
  714. package/template/tools/openapi/templates/modular/README.md +7 -0
  715. package/template/tools/openapi/templates/modular/api.eta +28 -0
  716. package/template/tools/openapi/templates/modular/procedure-call.eta +99 -0
  717. package/template/tools/openapi/templates/modular/route-types.eta +18 -0
  718. package/template/tools/release/artifact.mjs +258 -0
  719. package/template/tools/scaffold/add-capability.mjs +409 -0
  720. package/template/tools/scaffold/capability-catalog.json +163 -0
  721. package/template/tools/scaffold/check.mjs +326 -0
  722. package/template/tools/scaffold/create-feature.mjs +444 -0
  723. package/template/tools/scaffold/create-project.mjs +482 -0
  724. package/template/tools/scaffold/init.example.json +64 -0
  725. package/template/tools/scaffold/init.mjs +419 -0
  726. package/template/tools/scaffold/lockfile.mjs +193 -0
  727. package/template/tools/scaffold/templates/feature/index.ts +19 -0
  728. package/template/tools/scaffold/templates/feature/model.ts +142 -0
  729. package/template/tools/scaffold/templates/feature/queries.ts +154 -0
  730. package/template/tools/scaffold/templates/feature/repository.ts +206 -0
  731. package/template/tools/scaffold/templates/feature/types.ts +168 -0
  732. package/template/tools/scaffold/workspace-transaction.mjs +111 -0
  733. package/template/tsconfig.app.json +31 -0
  734. package/template/tsconfig.json +12 -0
  735. package/template/tsconfig.node.json +24 -0
  736. package/template/vite.config.ts +121 -0
@@ -0,0 +1,300 @@
1
+ import type { IAuthTokenResult } from '@/api/types'
2
+
3
+ /** 认证编排所服务的业务目的。 */
4
+ export type TAuthenticationPurpose = 'signIn' | 'stepUp'
5
+
6
+ /** 认证控制器可观察的互斥状态。 */
7
+ export type TAuthenticationStatus =
8
+ | 'awaitingChallenge'
9
+ | 'cancelled'
10
+ | 'completed'
11
+ | 'error'
12
+ | 'idle'
13
+ | 'redirecting'
14
+ | 'working'
15
+
16
+ /** 登录认证的启动参数。 */
17
+ export interface IAuthenticationSignInStartInput {
18
+ /** signIn 表示本次流程最终需要建立应用会话。 */
19
+ readonly strPurpose: 'signIn'
20
+ /** 后端配置的认证提供方稳定 key,例如 corporate-sso。 */
21
+ readonly strProviderKey: string
22
+ /** 登录成功后的站内路径;后端必须与 state 事务绑定并在回调时返回。 */
23
+ readonly strReturnPath?: string
24
+ }
25
+
26
+ /** 敏感操作二次认证的启动参数。 */
27
+ export interface IAuthenticationStepUpStartInput {
28
+ /** stepUp 表示本次流程只提升当前会话保证级别。 */
29
+ readonly strPurpose: 'stepUp'
30
+ /** 后端定义的敏感操作稳定 key,不应包含参数或个人数据。 */
31
+ readonly strActionKey: string
32
+ /** 后端配置的二次认证提供方稳定 key。 */
33
+ readonly strProviderKey: string
34
+ /** 可选的资源类型或范围 key,不传递完整资源内容。 */
35
+ readonly strResourceKey?: string
36
+ }
37
+
38
+ /** 认证启动参数,以 purpose 阻止登录与 Step-up 字段混用。 */
39
+ export type TAuthenticationStartInput =
40
+ | IAuthenticationSignInStartInput
41
+ | IAuthenticationStepUpStartInput
42
+
43
+ /** 后端返回的可选认证方式。 */
44
+ export interface IAuthenticationChallengeMethod {
45
+ /** Adapter 和后端共同约定的稳定方式 key,例如 totp、smsOtp。 */
46
+ readonly strMethod: string
47
+ /** 已完成本地化且不包含秘密的展示名称。 */
48
+ readonly strLabel: string
49
+ }
50
+
51
+ /** MFA 或 Step-up 等待用户完成的挑战。 */
52
+ export interface IAuthenticationChallenge {
53
+ /** 后端签发的短期挑战标识,不得写入 URL、日志或持久化存储。 */
54
+ readonly strChallengeId: string
55
+ /** 当前选中的认证方式 key。 */
56
+ readonly strMethod: string
57
+ /** 挑战绝对过期时间,单位为毫秒时间戳。 */
58
+ readonly nExpiresAt: number
59
+ /** 剩余可提交次数;省略表示后端没有安全地公开该信息。 */
60
+ readonly nAttemptsRemaining?: number
61
+ /** 再次发送验证码前需要等待的毫秒数。 */
62
+ readonly nRetryAfterMs?: number
63
+ /** 后端已经脱敏的手机号、邮箱或设备提示。 */
64
+ readonly strMaskedDestination?: string
65
+ /** 当前允许切换的认证方式。 */
66
+ readonly arrMethods?: readonly IAuthenticationChallengeMethod[]
67
+ }
68
+
69
+ /** 浏览器回调路由交给生成客户端 Adapter 的协议参数。 */
70
+ export interface IAuthenticationCallbackInput {
71
+ /** 回调所属目的必须由独立回调路由确定,不能相信查询参数自报。 */
72
+ readonly strPurpose: TAuthenticationPurpose
73
+ /** 路由运行时收窄后的回调参数;Adapter 再映射到后端生成 DTO。 */
74
+ readonly objParameters: Readonly<Record<string, string>>
75
+ }
76
+
77
+ /** 用户提交 MFA 或 Step-up 挑战时的结构化响应。 */
78
+ export interface IAuthenticationChallengeResponseInput {
79
+ /** 当前控制器快照中的短期挑战标识。 */
80
+ readonly strChallengeId: string
81
+ /** 当前认证方式 key。 */
82
+ readonly strMethod: string
83
+ /** OTP、恢复码或 WebAuthn 字段的字符串映射,不得记录或持久化。 */
84
+ readonly objResponse: Readonly<Record<string, string>>
85
+ }
86
+
87
+ /** 由服务端会话承载、不需要浏览器传递凭据的 Step-up 授权。 */
88
+ export interface IAuthenticationServerStepUpGrant {
89
+ /** serverSession 表示后续请求由后端会话识别提升结果。 */
90
+ readonly strMode: 'serverSession'
91
+ /** 用于审计关联的非秘密授权标识。 */
92
+ readonly strGrantId: string
93
+ /** 授权绝对过期时间,单位为毫秒时间戳。 */
94
+ readonly nExpiresAt: number
95
+ }
96
+
97
+ /** 必须由下一次敏感请求显式携带的短期 Step-up 授权。 */
98
+ export interface IAuthenticationRequestTokenStepUpGrant {
99
+ /** requestToken 表示下一次敏感请求需要携带短期证明。 */
100
+ readonly strMode: 'requestToken'
101
+ /** 用于审计关联的非秘密授权标识。 */
102
+ readonly strGrantId: string
103
+ /** 只允许进入目标请求头或请求体的短期证明,不得持久化或记录。 */
104
+ readonly strProofToken: string
105
+ /** 授权绝对过期时间,单位为毫秒时间戳。 */
106
+ readonly nExpiresAt: number
107
+ }
108
+
109
+ /** Step-up 完成后服务端返回的两种授权承载方式。 */
110
+ export type TAuthenticationStepUpGrant =
111
+ | IAuthenticationRequestTokenStepUpGrant
112
+ | IAuthenticationServerStepUpGrant
113
+
114
+ /** 登录流程完成结果,由应用层建立唯一认证会话。 */
115
+ export interface IAuthenticationSignInCompletion {
116
+ /** signIn 结果只能进入应用会话建立函数。 */
117
+ readonly strPurpose: 'signIn'
118
+ /** 生成客户端 Adapter 映射后的统一 Token 和身份结果。 */
119
+ readonly objTokenResult: IAuthTokenResult
120
+ /** 后端从认证事务恢复的站内回跳路径;应用仍须再次安全解析。 */
121
+ readonly strReturnPath?: string
122
+ }
123
+
124
+ /** Step-up 流程完成结果,不创建第二套登录会话。 */
125
+ export interface IAuthenticationStepUpCompletion {
126
+ /** stepUp 结果只能用于恢复当前被挂起的敏感操作。 */
127
+ readonly strPurpose: 'stepUp'
128
+ /** 后端签发的短期提升授权。 */
129
+ readonly objGrant: TAuthenticationStepUpGrant
130
+ }
131
+
132
+ /** 认证流程完成结果。 */
133
+ export type TAuthenticationCompletion =
134
+ | IAuthenticationSignInCompletion
135
+ | IAuthenticationStepUpCompletion
136
+
137
+ /** Adapter 要求浏览器跳转到经过服务端创建的认证地址。 */
138
+ export interface IAuthenticationRedirectResult {
139
+ /** redirect 表示当前页面需要离开或跳转。 */
140
+ readonly strResult: 'redirect'
141
+ /** 该结果所属认证目的。 */
142
+ readonly strPurpose: TAuthenticationPurpose
143
+ /** 服务端创建的授权地址,控制器仍会执行协议和 Origin 校验。 */
144
+ readonly strRedirectUrl: string
145
+ /** 后端认证事务的非秘密关联标识。 */
146
+ readonly strTransactionId: string
147
+ }
148
+
149
+ /** Adapter 要求页面收集 MFA 或 Step-up 响应。 */
150
+ export interface IAuthenticationChallengeResult {
151
+ /** challenge 表示控制器进入等待用户输入状态。 */
152
+ readonly strResult: 'challenge'
153
+ /** 该结果所属认证目的。 */
154
+ readonly strPurpose: TAuthenticationPurpose
155
+ /** 后端认证事务的非秘密关联标识。 */
156
+ readonly strTransactionId: string
157
+ /** 当前需要展示的挑战。 */
158
+ readonly objChallenge: IAuthenticationChallenge
159
+ }
160
+
161
+ /** Adapter 已经完成登录或 Step-up。 */
162
+ export interface IAuthenticationCompleteResult {
163
+ /** complete 表示结果可交给应用完成回调消费。 */
164
+ readonly strResult: 'complete'
165
+ /** 不在控制器快照中长期保存的完成结果。 */
166
+ readonly objCompletion: TAuthenticationCompletion
167
+ }
168
+
169
+ /** 认证 Adapter 每一步允许返回的互斥结果。 */
170
+ export type TAuthenticationAdapterResult =
171
+ | IAuthenticationChallengeResult
172
+ | IAuthenticationCompleteResult
173
+ | IAuthenticationRedirectResult
174
+
175
+ /** Adapter 调用时统一提供的取消上下文。 */
176
+ export interface IAuthenticationAdapterContext {
177
+ /** 新操作、取消或控制器释放时终止生成客户端请求。 */
178
+ readonly objSignal: AbortSignal
179
+ }
180
+
181
+ /** 取消后端认证事务时提供的最小安全上下文。 */
182
+ export interface IAuthenticationCancelInput {
183
+ /** 需要取消的认证目的。 */
184
+ readonly strPurpose: TAuthenticationPurpose
185
+ /** 后端认证事务的非秘密关联标识。 */
186
+ readonly strTransactionId: string
187
+ }
188
+
189
+ /** Feature 使用 swagger-typescript-api 生成客户端实现的认证 Adapter。 */
190
+ export interface IAuthenticationAdapter {
191
+ /** 启动登录或 Step-up,返回 redirect、challenge 或 complete。 */
192
+ readonly fnStart: (
193
+ objInput: TAuthenticationStartInput,
194
+ objContext: IAuthenticationAdapterContext
195
+ ) => Promise<TAuthenticationAdapterResult>
196
+ /** 完成 OIDC/SAML 等回调;协议参数只在 Adapter 和后端之间流动。 */
197
+ readonly fnCompleteRedirect: (
198
+ objInput: IAuthenticationCallbackInput,
199
+ objContext: IAuthenticationAdapterContext
200
+ ) => Promise<TAuthenticationAdapterResult>
201
+ /** 验证当前 MFA 或 Step-up 挑战响应。 */
202
+ readonly fnVerifyChallenge: (
203
+ objInput: IAuthenticationChallengeResponseInput,
204
+ objContext: IAuthenticationAdapterContext
205
+ ) => Promise<TAuthenticationAdapterResult>
206
+ /** 尽力取消后端事务;本地状态不会因远端取消失败而继续保留。 */
207
+ readonly fnCancel?: (
208
+ objInput: IAuthenticationCancelInput,
209
+ objContext: IAuthenticationAdapterContext
210
+ ) => Promise<void>
211
+ }
212
+
213
+ /** 外部认证跳转的明确信任策略。 */
214
+ export interface IAuthenticationRedirectPolicy {
215
+ /** 当前应用的完整 Origin,例如 `https://admin.example.com`。 */
216
+ readonly strApplicationOrigin: string
217
+ /** 允许跳转的身份提供方 Origin;当前应用 Origin 会自动加入。 */
218
+ readonly arrAllowedOrigins?: readonly string[]
219
+ }
220
+
221
+ type TAuthenticationErrorCode =
222
+ | 'adapter_failed'
223
+ | 'completion_failed'
224
+ | 'invalid_challenge'
225
+ | 'invalid_input'
226
+ | 'invalid_redirect'
227
+ | 'invalid_result'
228
+ | 'invalid_state'
229
+ | 'navigation_failed'
230
+
231
+ /** 不包含 Token、挑战响应或协议参数的认证编排错误。 */
232
+ export class AuthenticationError extends Error {
233
+ /** 页面反馈、监控分类和测试使用的稳定错误码。 */
234
+ readonly strCode: TAuthenticationErrorCode
235
+
236
+ constructor(
237
+ strCode: TAuthenticationErrorCode,
238
+ strMessage: string,
239
+ objOptions?: ErrorOptions
240
+ ) {
241
+ super(strMessage, objOptions)
242
+ this.name = 'AuthenticationError'
243
+ this.strCode = strCode
244
+ }
245
+ }
246
+
247
+ /** 页面可订阅的认证快照,不保存 Token、证明或挑战响应。 */
248
+ export interface IAuthenticationSnapshot {
249
+ /** 当前控制器生命周期状态。 */
250
+ readonly strStatus: TAuthenticationStatus
251
+ /** 当前登录或 Step-up 目的。 */
252
+ readonly strPurpose?: TAuthenticationPurpose
253
+ /** 每次状态发布递增的修订号。 */
254
+ readonly nRevision: number
255
+ /** 等待用户完成的当前挑战。 */
256
+ readonly objChallenge?: IAuthenticationChallenge
257
+ /** 当前后端事务的非秘密关联标识。 */
258
+ readonly strTransactionId?: string
259
+ /** 不包含外部响应和凭据的安全错误。 */
260
+ readonly objError?: AuthenticationError
261
+ }
262
+
263
+ /** 创建认证控制器所需的外部边界。 */
264
+ export interface ICreateAuthenticationControllerOptions {
265
+ /** 由 Feature 生成客户端实现的协议 Adapter。 */
266
+ readonly objAdapter: IAuthenticationAdapter
267
+ /** 外部跳转 Origin 白名单。 */
268
+ readonly objRedirectPolicy: IAuthenticationRedirectPolicy
269
+ /** 执行经过控制器校验的完整跳转地址。 */
270
+ readonly fnNavigateRedirect: (strRedirectUrl: string) => void | Promise<void>
271
+ /** 立即消费完成结果;控制器不会把 Token 或证明放入快照。 */
272
+ readonly fnOnComplete: (
273
+ objCompletion: TAuthenticationCompletion,
274
+ objContext: IAuthenticationAdapterContext
275
+ ) => void | Promise<void>
276
+ }
277
+
278
+ /** 登录、SSO 回调、MFA 和 Step-up 共用的认证控制器。 */
279
+ export interface IAuthenticationController {
280
+ /** 读取当前不可变快照。 */
281
+ readonly fnGetSnapshot: () => IAuthenticationSnapshot
282
+ /** 订阅状态变化并返回取消订阅函数。 */
283
+ readonly fnSubscribe: (fnListener: () => void) => () => void
284
+ /** 启动新的登录或 Step-up,自动取消上一操作。 */
285
+ readonly fnStart: (
286
+ objInput: TAuthenticationStartInput
287
+ ) => Promise<IAuthenticationSnapshot>
288
+ /** 在回调路由中完成外部认证。 */
289
+ readonly fnCompleteRedirect: (
290
+ objInput: IAuthenticationCallbackInput
291
+ ) => Promise<IAuthenticationSnapshot>
292
+ /** 提交当前挑战响应。 */
293
+ readonly fnVerifyChallenge: (
294
+ objInput: IAuthenticationChallengeResponseInput
295
+ ) => Promise<IAuthenticationSnapshot>
296
+ /** 取消当前本地请求并尽力取消远端事务。 */
297
+ readonly fnCancel: () => Promise<IAuthenticationSnapshot>
298
+ /** 清除完成、取消或错误状态并回到 idle。 */
299
+ readonly fnReset: () => IAuthenticationSnapshot
300
+ }
@@ -0,0 +1,96 @@
1
+ import { StrictMode } from 'react'
2
+ import ReactDOM from 'react-dom/client'
3
+ import { RuntimeConfigErrorPage } from './config/RuntimeConfigErrorPage'
4
+ import { objBuildInfo } from './config/buildInfo'
5
+ import { objProjectObservabilityAdapter } from './config/observabilityAdapter'
6
+ import { fnLoadRuntimeConfig, RuntimeConfigError } from './config/runtimeConfig'
7
+ import {
8
+ fnCaptureError,
9
+ fnCaptureObservabilityEvent,
10
+ fnConfigureObservability,
11
+ fnStartGlobalErrorObservation,
12
+ } from './observability'
13
+
14
+ /**
15
+ * 完成运行时配置、可观测性、认证生命周期与 React 根节点的有序启动。
16
+ * 调用方不需要了解 runtime config 必须早于 appConfig 求值的约束。
17
+ */
18
+ export async function fnBootstrapApplication() {
19
+ const objRootElement = document.getElementById('root')
20
+ if (!objRootElement) return
21
+ const objRoot = ReactDOM.createRoot(objRootElement)
22
+ let fnStopGlobalErrorObservation: (() => void) | undefined
23
+
24
+ fnConfigureObservability({
25
+ bEnabled: Boolean(objProjectObservabilityAdapter),
26
+ objAdapter: objProjectObservabilityAdapter,
27
+ objRelease: {
28
+ ...objBuildInfo,
29
+ strEnvironment: 'bootstrap',
30
+ },
31
+ })
32
+
33
+ try {
34
+ await fnLoadRuntimeConfig()
35
+ const { fnApplyAppDocumentMetadata, objAppConfig } =
36
+ await import('./config/appConfig')
37
+ fnConfigureObservability({
38
+ bEnabled: objAppConfig.observability.bEnabled,
39
+ objAdapter: objProjectObservabilityAdapter,
40
+ objRelease: objAppConfig.release,
41
+ })
42
+ fnStopGlobalErrorObservation = fnStartGlobalErrorObservation()
43
+ const [{ Application }, { fnStartAuthLifecycle }] = await Promise.all([
44
+ import('./Application'),
45
+ import('./router/router'),
46
+ ])
47
+ const fnStopAuthLifecycle = fnStartAuthLifecycle()
48
+ import.meta.hot?.dispose(() => {
49
+ fnStopAuthLifecycle()
50
+ fnStopGlobalErrorObservation?.()
51
+ })
52
+ fnApplyAppDocumentMetadata()
53
+
54
+ objRoot.render(
55
+ <StrictMode>
56
+ <Application
57
+ objLocale={{
58
+ strLocale: objAppConfig.locale.strLocale,
59
+ strTimeZone: objAppConfig.locale.strTimeZone,
60
+ }}
61
+ />
62
+ </StrictMode>
63
+ )
64
+ fnCaptureObservabilityEvent({
65
+ strName: 'application.ready',
66
+ strSource: 'bootstrap',
67
+ objAttributes: { strPhase: 'rendered' },
68
+ })
69
+ } catch (objError) {
70
+ const strCode =
71
+ objError instanceof RuntimeConfigError
72
+ ? objError.strCode
73
+ : 'bootstrap_failed'
74
+ const strMessage =
75
+ objError instanceof Error ? objError.message : '应用启动时发生未知错误。'
76
+
77
+ const objBootstrapError =
78
+ objError instanceof Error ||
79
+ typeof objError === 'string' ||
80
+ typeof objError === 'number' ||
81
+ typeof objError === 'boolean'
82
+ ? objError
83
+ : null
84
+ fnCaptureError(objBootstrapError, {
85
+ strName: 'application.bootstrap_failed',
86
+ strSource: 'bootstrap',
87
+ objAttributes: { strCode, strPhase: 'bootstrap' },
88
+ })
89
+
90
+ objRoot.render(
91
+ <StrictMode>
92
+ <RuntimeConfigErrorPage strCode={strCode} strMessage={strMessage} />
93
+ </StrictMode>
94
+ )
95
+ }
96
+ }
@@ -0,0 +1,74 @@
1
+ import { useLocale } from '@/locale'
2
+ import { cn } from '@/lib/utils'
3
+ import type { IAppDataTableProps } from './types'
4
+
5
+ /** 普通企业 CRUD 列表,保持语义化表格和轻量运行时。 */
6
+ export function AppDataTable<TRow>({
7
+ arrColumns,
8
+ arrRows,
9
+ fnGetRowKey,
10
+ strAriaLabel,
11
+ strEmptyMessage: strEmptyMessageOverride,
12
+ }: IAppDataTableProps<TRow>) {
13
+ const { fnTranslateShared } = useLocale()
14
+ const strEmptyMessage =
15
+ strEmptyMessageOverride ?? fnTranslateShared('appDataTable.empty')
16
+ return (
17
+ <div
18
+ role='region'
19
+ tabIndex={0}
20
+ aria-label={`${strAriaLabel} (${fnTranslateShared('appDataTable.scrollable')})`}
21
+ className='overflow-x-auto rounded-lg border focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none'
22
+ >
23
+ <table aria-label={strAriaLabel} className='w-full min-w-[52rem] text-sm'>
24
+ <thead className='bg-muted/50 text-start text-muted-foreground'>
25
+ <tr className='border-b'>
26
+ {arrColumns.map((objColumn) => (
27
+ <th
28
+ key={objColumn.strKey}
29
+ scope='col'
30
+ className={cn(
31
+ 'h-11 px-4 text-start align-middle font-medium',
32
+ objColumn.strHeaderClassName
33
+ )}
34
+ >
35
+ {objColumn.strHeader}
36
+ </th>
37
+ ))}
38
+ </tr>
39
+ </thead>
40
+ <tbody>
41
+ {arrRows.length > 0 ? (
42
+ arrRows.map((objRow) => (
43
+ <tr
44
+ key={fnGetRowKey(objRow)}
45
+ className='border-b transition-colors last:border-b-0 hover:bg-muted/30'
46
+ >
47
+ {arrColumns.map((objColumn) => (
48
+ <td
49
+ key={objColumn.strKey}
50
+ className={cn(
51
+ 'px-4 py-3 align-middle',
52
+ objColumn.strCellClassName
53
+ )}
54
+ >
55
+ {objColumn.fnRender(objRow)}
56
+ </td>
57
+ ))}
58
+ </tr>
59
+ ))
60
+ ) : (
61
+ <tr>
62
+ <td
63
+ colSpan={arrColumns.length}
64
+ className='h-28 px-4 text-center text-muted-foreground'
65
+ >
66
+ {strEmptyMessage}
67
+ </td>
68
+ </tr>
69
+ )}
70
+ </tbody>
71
+ </table>
72
+ </div>
73
+ )
74
+ }
@@ -0,0 +1,2 @@
1
+ export { AppDataTable } from './AppDataTable'
2
+ export type { IAppDataTableColumn } from './types'
@@ -0,0 +1,27 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ export interface IAppDataTableColumn<TRow> {
4
+ /** 稳定列标识,用于 React Key。 */
5
+ strKey: string
6
+ /** 列标题;业务文案由 Feature 语言包提供。 */
7
+ strHeader: string
8
+ /** 数据单元格样式类名。 */
9
+ strCellClassName?: string
10
+ /** 表头单元格样式类名。 */
11
+ strHeaderClassName?: string
12
+ /** 渲染当前行对应单元格内容。 */
13
+ fnRender: (objRow: TRow) => ReactNode
14
+ }
15
+
16
+ export interface IAppDataTableProps<TRow> {
17
+ /** 表格列定义。 */
18
+ arrColumns: IAppDataTableColumn<TRow>[]
19
+ /** 当前需要展示的行数据。 */
20
+ arrRows: TRow[]
21
+ /** 获取每一行稳定唯一 Key。 */
22
+ fnGetRowKey: (objRow: TRow) => string | number
23
+ /** 描述表格业务用途的无障碍名称。 */
24
+ strAriaLabel: string
25
+ /** 空数据文案;省略时使用当前 Locale 的共享文案。 */
26
+ strEmptyMessage?: string
27
+ }
@@ -0,0 +1,44 @@
1
+ import { useLocale, useSharedMessage } from '@/locale'
2
+ import { AppDialog } from './AppDialog'
3
+ import { objAppConfirmMessages } from './messages'
4
+ import type { IAppConfirmRequest } from './types'
5
+
6
+ export function AppConfirmDialog({
7
+ objRequest,
8
+ fnOnRequestChange,
9
+ }: {
10
+ objRequest?: IAppConfirmRequest
11
+ fnOnRequestChange: (objRequest?: IAppConfirmRequest) => void
12
+ }) {
13
+ const { strLocale } = useLocale()
14
+ const strDefaultTitle = useSharedMessage('appDialog.confirmTitle')
15
+ if (!objRequest) return null
16
+
17
+ const strAction = objRequest.strTitle.replace(/[??]\s*$/, '')
18
+ const objMessages = objAppConfirmMessages[strLocale]
19
+
20
+ return (
21
+ <AppDialog
22
+ bOpen
23
+ fnOnOpenChange={(bOpen) => {
24
+ if (!bOpen) fnOnRequestChange(undefined)
25
+ }}
26
+ strTitle={strDefaultTitle}
27
+ strSize='sm'
28
+ strHeaderClassName='border-b-0'
29
+ strBodyClassName='py-3 text-sm leading-6 text-foreground'
30
+ strFooterClassName='border-t-0'
31
+ strConfirmText={objRequest.strConfirmText}
32
+ strConfirmVariant={objRequest.strConfirmVariant}
33
+ fnOnConfirm={() => {
34
+ fnOnRequestChange(undefined)
35
+ objRequest.fnOnConfirm()
36
+ }}
37
+ >
38
+ <p className='break-words'>
39
+ {objMessages.fnRenderPrompt(strAction, objRequest.objContent)}
40
+ {objRequest.strDescription}
41
+ </p>
42
+ </AppDialog>
43
+ )
44
+ }
@@ -0,0 +1,113 @@
1
+ import { useSharedMessage } from '@/locale'
2
+ import { Loader2 } from 'lucide-react'
3
+ import { cn } from '@/lib/utils'
4
+ import { Button } from '@/components/ui/button'
5
+ import {
6
+ Dialog,
7
+ DialogBody,
8
+ DialogContent,
9
+ DialogDescription,
10
+ DialogFooter,
11
+ DialogHeader,
12
+ DialogTitle,
13
+ } from '@/components/ui/dialog'
14
+ import type { TAppDialogProps, TAppDialogSize } from './types'
15
+
16
+ const objDialogSizeClasses = {
17
+ sm: 'sm:max-w-md',
18
+ md: 'sm:max-w-lg',
19
+ lg: 'sm:max-w-2xl',
20
+ xl: 'sm:max-w-3xl',
21
+ '2xl': 'sm:max-w-4xl',
22
+ '3xl': 'sm:max-w-5xl',
23
+ '4xl': 'sm:max-w-6xl',
24
+ } as const satisfies Record<TAppDialogSize, string>
25
+
26
+ export function AppDialog({
27
+ bOpen,
28
+ fnOnOpenChange,
29
+ strTitle,
30
+ strDescription,
31
+ strSize = 'md',
32
+ strContentClassName,
33
+ strHeaderClassName,
34
+ strBodyClassName,
35
+ strFooterClassName,
36
+ strCancelText,
37
+ strConfirmText,
38
+ strConfirmVariant = 'default',
39
+ bShowCloseButton = true,
40
+ bWrapBody = true,
41
+ bCancelDisabled = false,
42
+ bConfirmDisabled = false,
43
+ bConfirmPending = false,
44
+ fnOnCancel,
45
+ fnOnConfirm,
46
+ children: objChildren,
47
+ objConfirmIcon,
48
+ objFooter,
49
+ }: TAppDialogProps) {
50
+ const strDefaultCancelText = useSharedMessage('appDialog.cancel')
51
+ const strDefaultConfirmText = useSharedMessage('appDialog.confirm')
52
+ const bHasCustomFooter = objFooter !== undefined
53
+ const bHasDefaultFooter = Boolean(fnOnConfirm)
54
+ const fnHandleCancel = () => {
55
+ if (fnOnCancel) {
56
+ fnOnCancel()
57
+ return
58
+ }
59
+ fnOnOpenChange(false)
60
+ }
61
+
62
+ return (
63
+ <Dialog open={bOpen} onOpenChange={fnOnOpenChange}>
64
+ <DialogContent
65
+ showCloseButton={bShowCloseButton}
66
+ className={cn(objDialogSizeClasses[strSize], strContentClassName)}
67
+ >
68
+ <DialogHeader className={strHeaderClassName}>
69
+ <DialogTitle>{strTitle}</DialogTitle>
70
+ {strDescription ? (
71
+ <DialogDescription>{strDescription}</DialogDescription>
72
+ ) : null}
73
+ </DialogHeader>
74
+ {bWrapBody ? (
75
+ <DialogBody className={strBodyClassName}>{objChildren}</DialogBody>
76
+ ) : (
77
+ objChildren
78
+ )}
79
+ {bHasCustomFooter || bHasDefaultFooter ? (
80
+ <DialogFooter className={strFooterClassName}>
81
+ {bHasCustomFooter ? (
82
+ objFooter
83
+ ) : (
84
+ <>
85
+ <Button
86
+ type='button'
87
+ variant='outline'
88
+ disabled={bCancelDisabled}
89
+ onClick={fnHandleCancel}
90
+ >
91
+ {strCancelText ?? strDefaultCancelText}
92
+ </Button>
93
+ <Button
94
+ type='button'
95
+ variant={strConfirmVariant}
96
+ disabled={bConfirmDisabled || bConfirmPending}
97
+ onClick={() => void fnOnConfirm?.()}
98
+ >
99
+ {bConfirmPending ? (
100
+ <Loader2 className='animate-spin' />
101
+ ) : (
102
+ objConfirmIcon
103
+ )}
104
+ {strConfirmText ?? strDefaultConfirmText}
105
+ </Button>
106
+ </>
107
+ )}
108
+ </DialogFooter>
109
+ ) : null}
110
+ </DialogContent>
111
+ </Dialog>
112
+ )
113
+ }
@@ -0,0 +1,3 @@
1
+ export { AppDialog } from './AppDialog'
2
+ export { AppConfirmDialog } from './AppConfirmDialog'
3
+ export type { IAppConfirmRequest, TAppDialogProps } from './types'
@@ -0,0 +1,22 @@
1
+ import type { TAppLocale } from '@/locale'
2
+ import type { IAppConfirmMessages } from './types'
3
+
4
+ /** AppConfirmDialog 自有的中英文句式;动态内容保持 ReactNode 类型。 */
5
+ export const objAppConfirmMessages: Readonly<
6
+ Record<TAppLocale, IAppConfirmMessages>
7
+ > = Object.freeze({
8
+ 'en-US': Object.freeze({
9
+ fnRenderPrompt: (strAction, objContent) => (
10
+ <>
11
+ Are you sure you want to {strAction} “{objContent}”?
12
+ </>
13
+ ),
14
+ } satisfies IAppConfirmMessages),
15
+ 'zh-CN': Object.freeze({
16
+ fnRenderPrompt: (strAction, objContent) => (
17
+ <>
18
+ 确定{strAction}“{objContent}”吗?
19
+ </>
20
+ ),
21
+ } satisfies IAppConfirmMessages),
22
+ })