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,196 @@
1
+ # 文件能力接入指南
2
+
3
+ `src/files` 提供上传、下载和导入/导出任务的公共状态与安全边界;
4
+ `FileUpload` 提供核心上传交互,`filePreview` 能力完整提供 `FilePreview`、预览类型和适配器。基础层不包含接口地址、OSS/S3 SDK、
5
+ Office 服务地址或具体导入模板,所有网络请求都由 Feature 使用
6
+ `swagger-typescript-api` 生成客户端适配。
7
+
8
+ ## 安全与职责
9
+
10
+ - 文件名、扩展名、浏览器 MIME、响应头和外部预览 URL 都是不可信输入。
11
+ - 浏览器大小/MIME 校验只用于尽早反馈;后端必须重新鉴权、限制大小、识别真实内容、
12
+ 扫描恶意文件,并返回标准 `ApiError`。
13
+ - 上传/下载适配器必须把 `objSignal` 传给生成客户端,把 Axios 进度事件转换为
14
+ `IFileTransferProgress`。取消信号被忽略时,基础层无法强制终止网络流量。
15
+ - 图片只内建 AVIF/GIF/JPEG/PNG/WebP,主动排除 SVG;PDF 和外部预览放在沙箱
16
+ iframe 中。Office 文件交给第三方前必须完成数据合规评审。
17
+ - Blob 下载默认上限为 100 MiB。更大的文件必须在请求前选择流式/签名 URL Adapter,
18
+ 或使用异步导出任务,不能先把整个文件装入浏览器内存。
19
+ - 对象 URL 在保存或预览卸载后统一回收;业务层不要持久化 Blob URL。
20
+
21
+ ## 上传
22
+
23
+ `FileUpload` 复用全局 `Button` 和 `Input`,支持单/多文件、体验校验、进度、取消与重试。
24
+ 组件不引入第二套 UI primitives。
25
+
26
+ ```tsx
27
+ import { FileUpload } from '@/components/FileUpload'
28
+
29
+ <FileUpload
30
+ bMultiple
31
+ objValidation={{
32
+ arrAcceptedExtensions: ['.pdf', '.docx'],
33
+ arrAcceptedMimeTypes: [
34
+ 'application/pdf',
35
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
36
+ ],
37
+ nMaxBytes: 20 * 1024 * 1024,
38
+ nMaxFiles: 5,
39
+ }}
40
+ fnUpload={async ({ arrFiles, fnOnProgress, objSignal }) => {
41
+ const objFormData = new FormData()
42
+ arrFiles.forEach((objFile) => objFormData.append('files', objFile))
43
+ const objResponse = await objDocumentApi.api.documentsUploadCreate(
44
+ objFormData,
45
+ {
46
+ signal: objSignal,
47
+ onUploadProgress: ({ loaded: nLoaded, total: nTotal }) =>
48
+ fnOnProgress({
49
+ nLoadedBytes: nLoaded,
50
+ nTotalBytes: nTotal,
51
+ nPercent: nTotal ? Math.round((nLoaded / nTotal) * 100) : undefined,
52
+ }),
53
+ }
54
+ )
55
+ return objResponse.data
56
+ }}
57
+ />
58
+ ```
59
+
60
+ `AppPageForm` 已内建 `type: 'file'`,直接复用同一份全局 `FileUpload`。`fnUpload`
61
+ 必须返回最终写入表单字段的文件 ID、对象 Key 或稳定 DTO;生成客户端的原始响应应当在
62
+ Feature Adapter 内完成映射,基础表单不会猜测后端协议。上传成功会进入 PageForm 的
63
+ dirty 生命周期,重置或外部模型替换会卸载当前上传状态并取消仍在执行的请求。
64
+
65
+ ```tsx
66
+ import {
67
+ AppPageForm,
68
+ type IFormProp,
69
+ } from '@/components/AppPageForm'
70
+
71
+ const objFormConfig: IFormProp<IDocumentForm> = {
72
+ formItems: [
73
+ {
74
+ label: '合同附件',
75
+ prop: 'objAttachment',
76
+ type: 'file',
77
+ required: true,
78
+ fileConfig: {
79
+ objValidation: {
80
+ arrAcceptedExtensions: ['.pdf'],
81
+ nMaxBytes: 20 * 1024 * 1024,
82
+ nMaxFiles: 1,
83
+ },
84
+ fnUpload: async ({ arrFiles, objSignal }) => {
85
+ const objResponse = await objDocumentApi.api.documentsUploadCreate(
86
+ fnCreateDocumentFormData(arrFiles),
87
+ { signal: objSignal }
88
+ )
89
+ return {
90
+ strFileId: objResponse.data.id,
91
+ strFileName: objResponse.data.name,
92
+ }
93
+ },
94
+ },
95
+ },
96
+ ],
97
+ }
98
+
99
+ <AppPageForm model={objModel} config={objFormConfig} />
100
+ ```
101
+
102
+ 已有附件展示、删除、预览或分片上传等复杂交互仍使用自定义 renderer 组合文件能力层,
103
+ 不要把业务 DTO 或对象存储协议下沉到 PageForm。
104
+
105
+ ## 下载
106
+
107
+ 中小文件使用 `fnDownloadFile`。它会透传取消/进度、解析并清理
108
+ `Content-Disposition` 文件名,拒绝 JSON/problem+json/HTML 错误 Blob,并在保存后回收
109
+ 对象 URL。
110
+
111
+ ```ts
112
+ await fnDownloadFile(
113
+ {
114
+ strFallbackFileName: 'document.pdf',
115
+ fnRequest: async ({ fnOnProgress, objSignal }) => {
116
+ const objResponse = await objDocumentApi.api.documentsDownloadDetail(
117
+ strDocumentId,
118
+ {
119
+ signal: objSignal,
120
+ responseType: 'blob',
121
+ onDownloadProgress: ({ loaded: nLoaded, total: nTotal }) =>
122
+ fnOnProgress({ nLoadedBytes: nLoaded, nTotalBytes: nTotal }),
123
+ }
124
+ )
125
+ return {
126
+ objBlob: objResponse.data,
127
+ strContentDisposition: objResponse.headers['content-disposition'],
128
+ strContentType: objResponse.headers['content-type'],
129
+ }
130
+ },
131
+ },
132
+ objAbortController.signal
133
+ )
134
+ ```
135
+
136
+ 大文件使用 `fnRunExternalFileDownload` 注入项目 Adapter。Adapter 可以换取短期签名 URL、
137
+ 调用受控的 File System Access/流式保存方案,或启动后端异步任务;它必须自行约束 URL
138
+ 协议、Origin、凭据和过期时间。
139
+
140
+ 跨域下载若需要读取文件名,服务端还必须暴露响应头:
141
+
142
+ ```http
143
+ Access-Control-Expose-Headers: Content-Disposition, Content-Type, X-Request-ID
144
+ ```
145
+
146
+ ## 预览
147
+
148
+ `FilePreview` 直接支持图片与 PDF。Office 等格式通过 `IFilePreviewAdapter` 接入,默认只
149
+ 接受当前站点 Origin;使用外部服务时必须显式传入 `arrAllowedOrigins`。
150
+
151
+ ```bash
152
+ pnpm scaffold:add --target <项目目录> --capability filePreview
153
+ ```
154
+
155
+ ```tsx
156
+ <FilePreview
157
+ objBlob={objFileBlob}
158
+ strFileName='合同.docx'
159
+ arrAdapters={[objOfficePreviewAdapter]}
160
+ arrAllowedOrigins={['https://preview.corp.example']}
161
+ />
162
+ ```
163
+
164
+ Adapter 创建的临时 URL、上传副本或会话由其 `fnDispose` 回收。基础层不会内置某个
165
+ Office/OSS 供应商,也不会默认把企业文件发送到公网预览服务。
166
+
167
+ ## 导入与导出任务
168
+
169
+ `useFileTask` 用同一个互斥状态处理立即完成与后台任务:`starting`、`queued`、`running`、
170
+ `success`、`error`、`canceled`。同步导出可在 `fnStart` 中调用 `fnDownloadFile` 后返回
171
+ `completed`;异步导出返回任务 ID,并通过 `fnPoll` 查询到成功后再下载结果。导入同样
172
+ 可以把上传后的校验任务映射到该契约。
173
+
174
+ ```tsx
175
+ const objExportTask = useFileTask({
176
+ objAdapter: {
177
+ async fnStart(objFilters, objContext) {
178
+ const objResponse = await objInventoryApi.api.exportsCreate(objFilters, {
179
+ signal: objContext.objSignal,
180
+ })
181
+ return objResponse.data.completed
182
+ ? { strMode: 'completed', objResult: objResponse.data }
183
+ : { strMode: 'background', strTaskId: objResponse.data.taskId }
184
+ },
185
+ async fnPoll(strTaskId, objContext) {
186
+ const objResponse = await objInventoryApi.api.exportsDetail(strTaskId, {
187
+ signal: objContext.objSignal,
188
+ })
189
+ return fnMapProjectExportStatus(objResponse.data)
190
+ },
191
+ },
192
+ })
193
+ ```
194
+
195
+ 具体 CSV/Excel 字段、导入模板、错误明细页面和业务状态映射属于 Feature。脚手架只提供
196
+ 生命周期、取消、重试和进度契约。入口显隐由 Feature 权限控制,接口授权由后端完成。
@@ -0,0 +1,132 @@
1
+ # Locale、时区与国际化接入指南
2
+
3
+ `src/locale` 是应用语言、时区、Intl 格式化和共享文案的唯一基础能力入口。应用组合层把
4
+ 同一个 `strLocale` 同时交给 `LocaleProvider`、枚举目录和全局参数目录,避免界面已经切换
5
+ 语言但后端元数据仍使用旧语言。
6
+
7
+ ## 运行时配置
8
+
9
+ 部署环境通过 `public/runtime-config.json` 声明默认值:
10
+
11
+ ```json
12
+ {
13
+ "locale": {
14
+ "strLocale": "zh-CN",
15
+ "strTimeZone": "Asia/Shanghai"
16
+ }
17
+ }
18
+ ```
19
+
20
+ 当前脚手架内建 `zh-CN` 和 `en-US`。时区必须是浏览器 Intl 支持的 IANA 名称。缺少
21
+ `locale` 时为旧配置提供 `zh-CN`、`Asia/Shanghai` 兼容默认值;非法语言或时区会在应用
22
+ 启动前被拒绝。
23
+
24
+ `strLocale` 决定共享文案、数字格式和排序规则,`strTimeZone` 决定日期、时间和日期时间
25
+ 落在哪个业务时区。用户浏览器时区不会静默覆盖部署配置。
26
+
27
+ ## React 中格式化
28
+
29
+ ```tsx
30
+ import { useLocale } from '@/locale'
31
+
32
+ function InvoiceAmount({ nAmount, nCreatedAt }: IInvoiceAmountProps) {
33
+ const objLocale = useLocale()
34
+
35
+ return (
36
+ <div>
37
+ <span>{objLocale.fnFormatCurrency(nAmount, 'CNY')}</span>
38
+ <time dateTime={new Date(nCreatedAt).toISOString()}>
39
+ {objLocale.fnFormatDateTime(nCreatedAt)}
40
+ </time>
41
+ </div>
42
+ )
43
+ }
44
+ ```
45
+
46
+ 内建能力包括日期、时间、日期时间、数字、百分比、货币和本地化字符串比较。百分比遵循
47
+ Intl 语义,`0.125` 显示为约 `13%`;货币必须显式提供 ISO 4217 代码。日期输入只接受
48
+ `Date` 或毫秒时间戳,Feature 必须先按后端契约解析字符串,避免无时区字符串被浏览器按
49
+ 本地规则猜测。
50
+
51
+ React 外使用 `fnCreateLocaleFormatter`,不要直接散落 `toLocaleString()`:
52
+
53
+ ```ts
54
+ const objFormatter = fnCreateLocaleFormatter({
55
+ strLocale: 'zh-CN',
56
+ strTimeZone: 'Asia/Shanghai',
57
+ })
58
+
59
+ objFormatter.fnFormatNumber(12_345.67)
60
+ ```
61
+
62
+ 无效日期、`NaN` 和无限数字统一显示 `-`。格式化器会在自己的生命周期内复用 Intl 实例。
63
+
64
+ ## Feature 自有语言包
65
+
66
+ 业务文案归所属 Feature 管理,不注册到一个不断膨胀的全局对象,也不由共享组件引用:
67
+
68
+ ```tsx
69
+ // src/features/inventory/messages.ts
70
+ export const objInventoryMessages = fnDefineLocaleMessages({
71
+ 'en-US': {
72
+ emptyTitle: 'No inventory records',
73
+ pageTitle: 'Inventory',
74
+ },
75
+ 'zh-CN': {
76
+ emptyTitle: '暂无库存记录',
77
+ pageTitle: '库存管理',
78
+ },
79
+ })
80
+
81
+ // Feature 内部组件
82
+ const objMessages = useLocaleMessages(objInventoryMessages)
83
+ const strTitle = objMessages.fnTranslate('pageTitle')
84
+ ```
85
+
86
+ `fnDefineLocaleMessages` 要求每个 Key 在所有内建语言中都存在,漏翻译会在 TypeScript
87
+ 阶段暴露。语言包随 Feature 路由分包,不需要在 `Application` 注册。
88
+
89
+ ## 共享文案
90
+
91
+ 壳层和基础组件使用稳定的 `TSharedMessageKey`。项目确需修改通用文案时,通过
92
+ `Application.objLocale.objSharedMessages` 按语言覆盖;不要修改组件内部或把业务文案放进共享目录:
93
+
94
+ ```tsx
95
+ <Application
96
+ objLocale={{
97
+ strLocale: 'en-US',
98
+ strTimeZone: 'UTC',
99
+ objSharedMessages: {
100
+ 'en-US': { 'common.retry': 'Try again' },
101
+ },
102
+ }}
103
+ />
104
+ ```
105
+
106
+ 当前已迁移登录、首页、错误页、路由导航元数据、文件上传/预览、普通数据表、JSON 编辑器、
107
+ 密码输入、Header 搜索、主题、用户菜单和 `AppDialog`。调用方显式传入的按钮、标题和内容
108
+ 始终优先于共享默认文案。
109
+
110
+ `AppPageForm` 和 `AppTable` 的文案数量较多,并包含参数化校验错误,因此各自在组件目录
111
+ 维护完整的强类型消息合同。两者默认跟随 `LocaleProvider`,同时允许通过组件的
112
+ `messages` 属性做实例级局部覆盖:
113
+
114
+ ```tsx
115
+ <AppTable
116
+ tableKey='orders'
117
+ messages={{ strSearch: '查找订单' }}
118
+ config={objOrderTableConfig}
119
+ />
120
+ ```
121
+
122
+ `AppTable` 的 React 控件、纯 DOM renderer、解析/校验和保存结算使用同一份消息对象,避免
123
+ 出现界面已经切换语言而单元格错误仍为另一种语言。纯 engine 被 React 外直接调用时保留
124
+ 中文兼容默认值;独立消费者可显式传入 `TableEngineMessages`。PageForm 的显式业务校验
125
+ 消息仍优先,只有内建 required、长度、格式等默认错误由组件语言合同生成。
126
+
127
+ ## 语言切换所有权
128
+
129
+ `LocaleProvider` 是受控 Provider,不自己持久化用户选择。项目需要语言切换时,由应用
130
+ 组合层或用户偏好 Feature 持有 `strLocale`,再传给 `Application`;切换后 Provider、HTML
131
+ `lang`、Intl 和元数据 Query 会一起更新。浏览器存储、服务端用户偏好及权限由具体项目
132
+ 决定,基础层不建立第二份 Locale Store。
@@ -0,0 +1,24 @@
1
+ # Mutation 幂等约定
2
+
3
+ 写操作的最终幂等由后端按用户意图和幂等键原子执行。前端只负责为需要幂等的请求创建
4
+ 键,并通过统一 Axios Hook 写入 `Idempotency-Key` Header;不要在浏览器中维护另一套事务
5
+ 确认状态机。
6
+
7
+ ```ts
8
+ const strIdempotencyKey = fnCreateIdempotencyKey()
9
+
10
+ await objGeneratedApi.records.updateRecord(strRecordId, objBody, {
11
+ strIdempotencyKey,
12
+ })
13
+ ```
14
+
15
+ 同一次用户操作在手动重试时复用原键;新的用户意图创建新键。后端必须校验请求指纹、
16
+ 授权与租户,并返回第一次执行的稳定结果。网络结果不明确时,页面应按具体业务接口查询
17
+ 最新服务端事实,而不是由通用前端控制器推断事务结果。
18
+
19
+ 公共入口 `@/api/idempotency` 仅导出:
20
+
21
+ - `fnCreateIdempotencyKey()`:使用浏览器 `crypto.randomUUID()` 创建键;
22
+ - `fnNormalizeIdempotencyKey()`:拒绝不能安全写入 HTTP Header 的值。
23
+
24
+ 请求头映射契约由 `tests/unit/api/hooks/request.test.ts` 验证。
@@ -0,0 +1,203 @@
1
+ # 地图、富文本和图形编辑器接入
2
+
3
+ `src/optionalEditors` 提供地图、富文本和图形编辑器共享的运行时边界:专用容器挂载、
4
+ 权限体验预检、SDK 生命周期、竞态取消、dirty 状态、结构化文档导出和项目版本迁移。
5
+ 它不内置地图/编辑器供应商,也不试图统一三类文档的业务语义。
6
+
7
+ 现有 `JsonEditor` 是一个独立的 JSON 源文本控件,继续按需用于配置编辑;它不是富文本
8
+ 或图形编辑器 Adapter,也不会被本模块重新包装。
9
+
10
+ ## 统一与不统一的边界
11
+
12
+ | 能力 | 脚手架统一 | 项目 Adapter 或 Feature 负责 |
13
+ | ------------ | ------------------------------------ | ------------------------------------------------ |
14
+ | SDK 生命周期 | 挂载、取消、最后请求生效、退订和销毁 | 动态加载具体 SDK、Worker、插件和样式 |
15
+ | 文档身份 | ID、能力分类、结构版本、可选内容修订 | 具体 GeoJSON、富文本树或图形节点契约 |
16
+ | 运行时校验 | 信封、类型匹配、模式、事件和迁移路径 | 文档节点、属性、大小、URL 和供应商数据校验 |
17
+ | dirty 与保存 | dirty 快照和 `fnMarkSaved` | 保存接口、并发控制、冲突处理、服务端最终授权 |
18
+ | DOM | 只提供一个专用空容器 | 编辑器内部 DOM/Canvas/WebGL 及无障碍行为 |
19
+ | 内容展示 | 不提供 HTML sink | 安全只读渲染、文本替代、静态预览或受控 sanitizer |
20
+ | 版本迁移 | 唯一线性路径、循环检测、逐步校验 | 每个版本的纯数据转换和发布/回滚策略 |
21
+
22
+ 不要建立一个同时理解地图图层、富文本节点和流程图连线的“万能编辑器模型”。稳定复用的是
23
+ 资源生命周期和文档信封,不是供应商命令、工具栏或业务结构。
24
+
25
+ ## 文档信封
26
+
27
+ 业务接口返回项目拥有的结构化文档,而不是供应商实例、DOM、Canvas 或 HTML 字符串:
28
+
29
+ ```ts
30
+ interface IArticleDocument {
31
+ readonly arrContent: readonly IArticleNode[]
32
+ readonly strDocumentType: 'article'
33
+ }
34
+
35
+ const objEditorDocument = {
36
+ objDocument: objArticleQuery.data.document,
37
+ strContentRevision: objArticleQuery.data.etag,
38
+ strDocumentId: objArticleQuery.data.id,
39
+ strEditorKind: 'richText',
40
+ strSchemaVersion: 'article-v3',
41
+ }
42
+ ```
43
+
44
+ - `strSchemaVersion` 属于项目文档契约,不等于 Tiptap、Lexical、Mapbox 或其他 SDK 版本。
45
+ - `strContentRevision` 表示同一文档的服务端内容版本,可使用 ETag/Revision;变化时 Hook
46
+ 会重建会话。省略时,同 ID、类型和结构版本的普通 React 重渲染不会反复挂载 SDK。
47
+ - `objDocument` 必须是结构化对象,并由 Adapter 的 `fnValidateDocument` 在挂载、迁移和
48
+ 导出后校验。字符串 HTML、供应商实例和循环对象不属于合法标准文档。
49
+
50
+ 后端保存时仍必须验证文档结构、节点数量、字符串长度、资源地址、租户归属和权限,
51
+ 并使用 `strContentRevision` 做乐观并发控制。前端类型和 dirty 状态不能替代这些检查。
52
+
53
+ ## Adapter 与路由级挂载
54
+
55
+ 每个项目和编辑器类型实现独立 Adapter。供应商 SDK 必须在 `fnMount` 内动态加载:
56
+
57
+ ```tsx
58
+ import type { IOptionalEditorAdapter } from '@/optionalEditors'
59
+
60
+ export const objArticleEditorAdapter: IOptionalEditorAdapter<
61
+ IArticleDocument,
62
+ IArticleEditorBinding
63
+ > = {
64
+ strEditorKind: 'richText',
65
+ fnValidateDocument: fnValidateArticleDocument,
66
+ async fnMount(objRequest) {
67
+ const { fnMountArticleEditor } = await import('./vendorArticleEditor')
68
+ return fnMountArticleEditor({
69
+ bIsReadOnly: objRequest.strMode === 'view',
70
+ fnOnAbort: () => objRequest.objSignal.aborted,
71
+ objContainer: objRequest.objContainer,
72
+ objDocument: objRequest.objDocument.objDocument,
73
+ })
74
+ },
75
+ }
76
+ ```
77
+
78
+ 返回的 Session 必须实现:
79
+
80
+ - `objBinding`:Feature 需要的强类型命令,不暴露无关管理 API。
81
+ - `fnReadDocument`:导出项目结构化文档,不能返回 HTML DOM 或 SDK 实例。
82
+ - `fnSubscribe`:发送完整 dirty 状态或安全致命失败,返回解除监听函数。
83
+ - `fnDestroy`:可重复销毁实例、Worker、Observer、WebGL、对象 URL、事件和专用 DOM。
84
+
85
+ Adapter 必须响应 `objSignal`。如果 SDK 初始化无法真正取消,迟到 Session 仍会被控制器
86
+ 立即销毁。供应商原因码只能使用稳定字符,不得包含正文、Token、URL 或堆栈。
87
+
88
+ Feature 使用 Hook,并为宿主元素提供可感知名称和明确尺寸:
89
+
90
+ ```tsx
91
+ const objEditor = useOptionalEditor({
92
+ objAdapter: objArticleEditorAdapter,
93
+ objDocument: objEditorDocument,
94
+ strMode: 'edit',
95
+ })
96
+
97
+ return (
98
+ <section aria-labelledby='article-editor-title'>
99
+ <h1 id='article-editor-title'>文章内容</h1>
100
+ <div
101
+ ref={objEditor.fnSetContainer}
102
+ aria-label='文章富文本编辑器'
103
+ className='min-h-96'
104
+ />
105
+ </section>
106
+ )
107
+ ```
108
+
109
+ 路由、文档、内容修订、结构版本、身份作用域或 Adapter 变化时会销毁旧会话。模块不装入
110
+ 应用根 Provider,也不提供默认页面、路由或菜单。
111
+
112
+ ## 保存与未保存保护
113
+
114
+ 保存时先调用 `fnExportDocument`。它会从当前 Session 读取结构化值,并再次执行项目
115
+ 校验;会话在导出过程中被替换会得到稳定错误,不能把迟到结果写回新文档。
116
+
117
+ ```ts
118
+ const objDocument = await objEditor.fnExportDocument()
119
+ await objGeneratedApi.articles.update(
120
+ objDocument.strDocumentId,
121
+ {
122
+ content: objDocument.objDocument,
123
+ contentRevision: objDocument.strContentRevision,
124
+ schemaVersion: objDocument.strSchemaVersion,
125
+ }
126
+ )
127
+ objEditor.fnMarkSaved()
128
+ ```
129
+
130
+ 只有后端明确保存成功后才能调用 `fnMarkSaved`。将活动快照的 `bIsDirty` 接入现有
131
+ `UnsavedChangesProvider`;取消请求、自动保存失败、权限撤销或 SDK 崩溃都不能错误清除
132
+ dirty 状态。协同编辑项目可组合 P2-04,但只能由一个项目 Adapter 拥有编辑器和 CRDT
133
+ 绑定,不能让两个基础控制器同时创建同一 SDK 实例。
134
+
135
+ ## 项目版本迁移
136
+
137
+ 读取旧文档后,在挂载 SDK 前执行显式、前向、纯数据迁移:
138
+
139
+ ```ts
140
+ const objMigratedDocument = fnMigrateOptionalEditorDocument({
141
+ objDocument: objResponse.data,
142
+ strTargetVersion: 'article-v3',
143
+ fnValidateDocument: fnValidateArticleDocument,
144
+ arrMigrations: [
145
+ {
146
+ strFromVersion: 'article-v1',
147
+ strToVersion: 'article-v2',
148
+ fnMigrate: fnMigrateArticleV1ToV2,
149
+ },
150
+ {
151
+ strFromVersion: 'article-v2',
152
+ strToVersion: 'article-v3',
153
+ fnMigrate: fnMigrateArticleV2ToV3,
154
+ },
155
+ ],
156
+ })
157
+ ```
158
+
159
+ 每个来源版本只能有一个下一步,单次最多 20 步;缺失路径、循环、同版本迁移和任一步
160
+ 校验失败都会停止。迁移函数不得访问网络、DOM、当前用户或供应商全局状态,必须保证
161
+ 同一输入产生同一输出。大规模永久升级由后端批处理并记录审计,浏览器迁移只是兼容
162
+ 读取和渐进发布边界。
163
+
164
+ ## 三类编辑器专项要求
165
+
166
+ ### 地图
167
+
168
+ - 标准文档优先使用项目约束后的 GeoJSON/图层配置对象,限制坐标数、精度和范围。
169
+ - 地址、轨迹、家庭/工作位置可能是个人敏感数据,禁止默认进入日志和遥测。
170
+ - 地理编码、路径规划和受保护图层由后端授权;浏览器不能持有供应商管理密钥。
171
+ - 公开瓦片 Token 必须限制 Origin、配额和能力,并通过运行时配置注入和 Kill Switch 撤销。
172
+ - 审查 CSP `connect-src`、`img-src`、`worker-src`,销毁 WebGL Context、Worker 和监听器。
173
+ - 提供键盘操作、列表/文本替代和非地图查看路径,不能只用颜色或拖拽表达状态。
174
+
175
+ ### 富文本
176
+
177
+ - 标准存储优先使用项目结构化 JSON;不把编辑器生成 HTML 直接写入
178
+ `dangerouslySetInnerHTML`。
179
+ - 真正需要 HTML 展示时,在单一边界使用维护中的白名单 sanitizer,并针对链接、图片、
180
+ iframe、SVG、样式、事件属性和 `javascript:` 协议做攻击回归测试。
181
+ - 图片和附件复用 `src/files` 上传能力,服务端重新校验 MIME、扫描内容和授权文件 ID。
182
+ - 限制粘贴 HTML、超长文档、嵌套深度、提及查询和外部嵌入;不默认允许任意 iframe。
183
+ - 验证标题层级、列表、表格、链接名称、键盘快捷键、焦点和只读模式的语义输出。
184
+
185
+ ### 图形编辑器
186
+
187
+ - 标准存储使用项目节点/边/画布 JSON,并限制节点数、坐标范围、属性大小和连接合法性。
188
+ - 禁止在节点脚本、公式、插件或导入文件中执行任意 JavaScript。
189
+ - 外部图片、图标和链接使用允许协议/Origin;Data URL、SVG 和第三方图标库单独评审。
190
+ - Canvas/SVG 视图提供可访问的节点列表、属性面板或导出文本,核心操作支持键盘。
191
+ - SVG/图片/PDF 导出作为不可信文件处理,不把未清理 SVG 重新注入应用 DOM。
192
+
193
+ ## 性能、供应链和验收
194
+
195
+ - Feature 路由与 Adapter 双层动态加载;编辑器 SDK、语言包、字体和 Worker 不进入首屏包。
196
+ - 设置单个编辑器路由的 JS、内存、初始化时间和大文档交互预算,并在目标设备测量。
197
+ - 评审 SDK 许可证、维护状态、CVE、遥测默认值、插件权限、CSP、Worker 和退出/迁移能力。
198
+ - 使用 P2-02 Feature Flag/Kill Switch 控制新会话;供应商故障提供安全只读或静态预览。
199
+ - 测试快速文档切换、卸载销毁、无权限、dirty、保存失败、导出竞态、恶意文档、迁移
200
+ 缺口/循环、大文档、键盘操作和目标浏览器兼容性。
201
+
202
+ Knip 只把 `src/optionalEditors` 视为脚手架可选公共入口;项目没有选择供应商前,不新增
203
+ 地图、富文本或图形编辑器依赖。
@@ -0,0 +1,83 @@
1
+ # 页面反馈与错误恢复
2
+
3
+ `src/components/PageFeedback` 提供页面首次加载、成功空态和无可用内容错误态。它只负责
4
+ 统一展示和无障碍语义,不持有 TanStack Query 状态、不自动重试,也不决定 Feature 的
5
+ 业务动作。页面仍然是查询状态和业务文案的所有者。
6
+
7
+ ## 状态判定
8
+
9
+ | 查询与内容状态 | 页面行为 |
10
+ | ---------------------------- | --------------------------------------------------- |
11
+ | 首次请求执行中且没有可用内容 | `PageLoadingState` |
12
+ | 请求成功且业务集合确实为空 | `PageEmptyState`,可传入新建或清空筛选动作 |
13
+ | 请求失败且没有可用内容 | `PageErrorState`,按 `ApiError.bRetriable` 提供重试 |
14
+ | 后台刷新且已有缓存内容 | 保留内容,只在局部显示刷新进度 |
15
+ | 后台刷新失败但仍有可用旧内容 | 保留内容,使用非阻塞提示,不替换成整页错误态 |
16
+ | 查询被取消 | 不向用户显示错误 |
17
+ | 权限或其他不可重试错误 | 显示错误说明和业务后续动作,不显示重试 |
18
+
19
+ 加载态只用于首次无内容请求,不能在每次 `isFetching` 时卸载已有页面。空态必须来自一次成功
20
+ 响应,不能用空数组掩盖请求失败。
21
+
22
+ ## Feature 组合方式
23
+
24
+ ```tsx
25
+ const objListQuery = useTemplateRecordList({
26
+ objFeature,
27
+ objInput: { nPage: 1, nPageSize: 20 },
28
+ strWorkspaceId,
29
+ })
30
+
31
+ if (objListQuery.isPending) {
32
+ return <PageLoadingState />
33
+ }
34
+
35
+ if (objListQuery.isError) {
36
+ return (
37
+ <PageErrorState
38
+ bIsRetrying={objListQuery.isFetching}
39
+ fnOnRetry={() => void objListQuery.refetch()}
40
+ objError={objListQuery.error}
41
+ />
42
+ )
43
+ }
44
+
45
+ if (objListQuery.data.arrRecords.length === 0) {
46
+ return <PageEmptyState objAction={objCreateAction} />
47
+ }
48
+
49
+ return <RecordList arrRecords={objListQuery.data.arrRecords} />
50
+ ```
51
+
52
+ `PageErrorState` 仅展示标准 `ApiError` 的安全消息和请求 ID。未知 `Error` 的原始消息可能
53
+ 包含实现或隐私信息,因此默认使用通用文案。Feature 可以通过 `strTitle` 和
54
+ `strDescription` 提供经过审核的领域文案,通过 `objAction` 提供返回、联系支持等操作。
55
+
56
+ ## 页面内反馈与全局 Toast
57
+
58
+ 一个失败只应有一个主要反馈入口:
59
+
60
+ - 会阻断页面首次内容的 Query,由页面内 `PageErrorState` 负责;生成客户端请求配置
61
+ `bShowError: false`,避免同时弹出全局错误 Toast。
62
+ - 后台刷新失败且页面仍有旧数据时保留内容,可使用全局 Toast 或 Feature 内非阻塞提示。
63
+ - Mutation 默认使用统一 Toast;表单字段错误、Dialog 内错误或批量失败明细由局部 UI
64
+ 负责时,同样设置 `bShowError: false`。
65
+ - 401 由会话生命周期和路由处理;路由渲染错误、运行时配置错误继续使用各自的专用错误页。
66
+
67
+ ```ts
68
+ objGeneratedApi.records.recordsList(objParameters, {
69
+ bShowError: false,
70
+ signal: objSignal,
71
+ })
72
+ ```
73
+
74
+ `bRetriable` 只控制是否向用户提供手动重试,不代表自动发起请求。自动重试次数、退避和
75
+ 幂等安全仍由 Query/Mutation 及后端协议决定。重试执行中应传入 `bIsRetrying`,组件会禁用
76
+ 按钮以阻止重复触发。
77
+
78
+ ## 验收要求
79
+
80
+ - 页面覆盖首次加载、成功空态、无内容失败、无权限、重试中和成功内容状态。
81
+ - 错误页保留请求 ID,未知错误不直接显示内部消息。
82
+ - 动态状态具有 `status`/`alert`、`aria-live` 和忙碌语义,业务动作可使用键盘完成。
83
+ - 页面内错误与全局 Toast 不重复,已有内容不会因后台刷新闪成整页加载态。