create-mithaq 0.1.1 → 0.2.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 (348) hide show
  1. package/LICENSES/openstatus-time-picker.txt +21 -0
  2. package/index.js +457 -63
  3. package/package.json +1 -1
  4. package/template/apps/{asas-platform → asas-backoffice}/package.json +5 -3
  5. package/template/apps/{asas-platform → asas-backoffice}/src/api.ts +1 -1
  6. package/template/apps/{asas-platform → asas-backoffice}/src/auth-frame.tsx +12 -12
  7. package/template/apps/asas-backoffice/src/components.ts +35 -0
  8. package/template/apps/asas-backoffice/src/first-user.ts +14 -0
  9. package/template/apps/{asas-platform → asas-backoffice}/src/links.ts +1 -1
  10. package/template/apps/{asas-platform → asas-backoffice}/src/locale-switch.tsx +7 -5
  11. package/template/apps/asas-backoffice/src/no-organization.tsx +5 -0
  12. package/template/apps/asas-backoffice/src/redirect.ts +1 -0
  13. package/template/apps/{asas-platform → asas-backoffice}/src/request-headers.ts +1 -1
  14. package/template/apps/asas-backoffice/src/routeTree.gen.ts +206 -0
  15. package/template/apps/asas-backoffice/src/router.tsx +18 -0
  16. package/template/apps/asas-backoffice/src/routes/(screens)/backoffice/files.ts +10 -0
  17. package/template/apps/{asas-platform/src/routes/(screens)/platform → asas-backoffice/src/routes/(screens)/backoffice}/screen.json +426 -64
  18. package/template/apps/{asas-platform/src/routes/(screens)/platform → asas-backoffice/src/routes/(screens)/backoffice}/types.ts +18 -0
  19. package/template/apps/{asas-platform/src/routes/(screens)/platform.$.tsx → asas-backoffice/src/routes/(screens)/backoffice.$.tsx} +4 -4
  20. package/template/apps/{asas-platform/src/routes/(screens)/platform.index.tsx → asas-backoffice/src/routes/(screens)/backoffice.index.tsx} +3 -3
  21. package/template/apps/{asas-platform/src/routes/(screens)/platform.tsx → asas-backoffice/src/routes/(screens)/backoffice.tsx} +3 -3
  22. package/template/apps/{asas-platform → asas-backoffice}/src/routes/__root.tsx +2 -2
  23. package/template/apps/asas-backoffice/src/routes/api/$.ts +34 -0
  24. package/template/apps/asas-backoffice/src/routes/auth.create-first-user.tsx +113 -0
  25. package/template/apps/{asas-platform → asas-backoffice}/src/routes/auth.sign-in.tsx +9 -4
  26. package/template/apps/{asas-platform → asas-backoffice}/src/routes/unauthorized.tsx +24 -12
  27. package/template/apps/{asas-platform → asas-backoffice}/src/screen-form.tsx +5 -3
  28. package/template/apps/{asas-platform → asas-backoffice}/src/screen-list.tsx +6 -5
  29. package/template/apps/{asas-platform → asas-backoffice}/src/screen-names.ts +1 -1
  30. package/template/apps/{asas-platform → asas-backoffice}/src/screens.tsx +46 -26
  31. package/template/apps/asas-backoffice/src/server.ts +30 -0
  32. package/template/apps/{asas-platform → asas-backoffice}/src/slide.ts +1 -1
  33. package/template/apps/{asas-platform → asas-backoffice}/src/start.ts +1 -1
  34. package/template/apps/{asas-platform → asas-backoffice}/src/styles.css +9 -7
  35. package/template/apps/{asas-platform → asas-backoffice}/tsconfig.json +2 -2
  36. package/template/apps/{asas-platform → asas-backoffice}/vite.config.ts +7 -1
  37. package/template/apps/asas-tanstack/package.json +4 -2
  38. package/template/apps/asas-tanstack/src/api.ts +1 -1
  39. package/template/apps/asas-tanstack/src/auth-frame.tsx +12 -12
  40. package/template/apps/asas-tanstack/src/choose-password.tsx +150 -0
  41. package/template/apps/asas-tanstack/src/components.ts +35 -0
  42. package/template/apps/asas-tanstack/src/copy.ts +416 -79
  43. package/template/apps/asas-tanstack/src/first-run.ts +16 -0
  44. package/template/apps/asas-tanstack/src/links.ts +1 -1
  45. package/template/apps/asas-tanstack/src/locale-switch.tsx +7 -5
  46. package/template/apps/asas-tanstack/src/no-organization.tsx +108 -0
  47. package/template/apps/asas-tanstack/src/redirect.ts +20 -1
  48. package/template/apps/asas-tanstack/src/request-headers.ts +1 -1
  49. package/template/apps/asas-tanstack/src/routeTree.gen.ts +42 -0
  50. package/template/apps/asas-tanstack/src/router.tsx +12 -1
  51. package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/files.ts +9 -2
  52. package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/screen.json +475 -116
  53. package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/types.ts +4 -2
  54. package/template/apps/asas-tanstack/src/routes/(screens)/portal/files.ts +7 -2
  55. package/template/apps/asas-tanstack/src/routes/(screens)/portal/screen.json +83 -319
  56. package/template/apps/asas-tanstack/src/routes/(screens)/portal/types.ts +3 -1
  57. package/template/apps/asas-tanstack/src/routes/__root.tsx +1 -1
  58. package/template/apps/asas-tanstack/src/routes/auth.accept-invitation.tsx +14 -7
  59. package/template/apps/asas-tanstack/src/routes/auth.first-run.tsx +114 -0
  60. package/template/apps/asas-tanstack/src/routes/auth.forgot-password.tsx +2 -2
  61. package/template/apps/asas-tanstack/src/routes/auth.handoff.ts +5 -5
  62. package/template/apps/asas-tanstack/src/routes/auth.reset-password.tsx +7 -100
  63. package/template/apps/asas-tanstack/src/routes/auth.set-password.tsx +16 -0
  64. package/template/apps/asas-tanstack/src/routes/auth.sign-in.tsx +27 -15
  65. package/template/apps/asas-tanstack/src/routes/auth.sign-up.tsx +59 -38
  66. package/template/apps/asas-tanstack/src/routes/index.tsx +18 -14
  67. package/template/apps/asas-tanstack/src/routes/unauthorized.tsx +24 -12
  68. package/template/apps/asas-tanstack/src/screen-form.tsx +5 -3
  69. package/template/apps/asas-tanstack/src/screen-list.tsx +6 -5
  70. package/template/apps/asas-tanstack/src/screen-names.ts +1 -1
  71. package/template/apps/asas-tanstack/src/screens.tsx +46 -26
  72. package/template/apps/asas-tanstack/src/server.ts +10 -0
  73. package/template/apps/asas-tanstack/src/slide.ts +1 -1
  74. package/template/apps/asas-tanstack/src/styles.css +7 -3
  75. package/template/apps/asas-tanstack/tsconfig.json +2 -2
  76. package/template/apps/asas-tanstack/vite.config.ts +7 -1
  77. package/template/package.json +3 -3
  78. package/template/templates/asas/.claude/skills/add-field/SKILL.md +27 -0
  79. package/template/templates/asas/.claude/skills/add-kayan/SKILL.md +26 -0
  80. package/template/templates/asas/.claude/skills/eject-admin-piece/SKILL.md +28 -0
  81. package/template/templates/asas/.claude/skills/upgrade-mithaq/SKILL.md +35 -0
  82. package/template/templates/asas/.env.example +22 -5
  83. package/template/templates/asas/AGENTS.md +101 -0
  84. package/template/templates/asas/CLAUDE.md +1 -0
  85. package/template/templates/asas/README.md +1056 -0
  86. package/template/templates/asas/package.json +19 -4
  87. package/template/templates/asas/src/asas.ts +81 -56
  88. package/template/templates/asas/src/{platform-http.ts → backoffice-http.ts} +48 -27
  89. package/template/templates/asas/src/dev-setup.ts +112 -0
  90. package/template/templates/asas/src/local-database.ts +22 -0
  91. package/template/templates/asas/src/messages/account.json +129 -103
  92. package/template/templates/asas/src/messages/auditLog.json +223 -105
  93. package/template/templates/asas/src/messages/backofficeLog.json +132 -0
  94. package/template/templates/asas/src/messages/courses.json +256 -214
  95. package/template/templates/asas/src/messages/enrollments.json +45 -27
  96. package/template/templates/asas/src/messages/invitation.json +72 -56
  97. package/template/templates/asas/src/messages/localUsers.json +34 -28
  98. package/template/templates/asas/src/messages/media.json +31 -21
  99. package/template/templates/asas/src/messages/member.json +59 -39
  100. package/template/templates/asas/src/messages/memberRoles.json +37 -31
  101. package/template/templates/asas/src/messages/mithaq.json +206 -162
  102. package/template/templates/asas/src/messages/organization.json +63 -41
  103. package/template/templates/asas/src/messages/organizationRole.json +59 -47
  104. package/template/templates/asas/src/messages/roles.json +59 -45
  105. package/template/templates/asas/src/messages/session.json +99 -79
  106. package/template/templates/asas/src/messages/sessions.json +110 -80
  107. package/template/templates/asas/src/messages/settings.json +51 -53
  108. package/template/templates/asas/src/messages/tags.json +31 -21
  109. package/template/templates/asas/src/messages/user.json +109 -87
  110. package/template/templates/asas/src/messages/verification.json +59 -47
  111. package/template/templates/asas/src/migrations/20261014221355_tags_restrict/migration.sql +1 -0
  112. package/template/templates/asas/src/migrations/20261014221355_tags_restrict/snapshot.json +3881 -0
  113. package/template/templates/asas/src/migrations/20261014222218_one_seat_per_session/migration.sql +1 -0
  114. package/template/templates/asas/src/migrations/20261014222218_one_seat_per_session/snapshot.json +3894 -0
  115. package/template/templates/asas/src/migrations/20261014223522_session_archive_reason/migration.sql +1 -0
  116. package/template/templates/asas/src/migrations/20261014223522_session_archive_reason/snapshot.json +3907 -0
  117. package/template/templates/asas/src/migrations/20261014225728_course_archive_by_operation/migration.sql +1 -0
  118. package/template/templates/asas/src/migrations/20261014225728_course_archive_by_operation/snapshot.json +3907 -0
  119. package/template/templates/asas/src/migrations/20261015042444_organization_names/migration.sql +1 -0
  120. package/template/templates/asas/src/migrations/20261015042444_organization_names/snapshot.json +3920 -0
  121. package/template/templates/asas/src/migrations/20261015053212_member_last_seen/migration.sql +1 -0
  122. package/template/templates/asas/src/migrations/20261015053212_member_last_seen/snapshot.json +3933 -0
  123. package/template/templates/asas/src/migrations/20261015093203_activity_and_staff_history/migration.sql +15 -0
  124. package/template/templates/asas/src/migrations/20261015093203_activity_and_staff_history/snapshot.json +4113 -0
  125. package/template/templates/asas/src/migrations/20261015095752_portal/migration.sql +2 -0
  126. package/template/templates/asas/src/migrations/20261015095752_portal/snapshot.json +4113 -0
  127. package/template/templates/asas/src/migrations/20261015135529_better_auth_indexes/migration.sql +9 -0
  128. package/template/templates/asas/src/migrations/20261015135529_better_auth_indexes/snapshot.json +4302 -0
  129. package/template/templates/asas/src/migrations/20261015162438_audit_changes_json/migration.sql +27 -0
  130. package/template/templates/asas/src/migrations/20261015162438_audit_changes_json/snapshot.json +4289 -0
  131. package/template/templates/asas/src/migrations/schema.ts +1 -0
  132. package/template/templates/asas/src/mithaq.ts +4 -406
  133. package/template/templates/asas/src/organizations.ts +3 -0
  134. package/template/templates/asas/src/seed.ts +147 -45
  135. package/template/templates/asas/src/{ui-platform → ui-backoffice}/home.tsx +9 -9
  136. package/template/templates/asas/src/ui-backoffice/organization-actions.tsx +121 -0
  137. package/template/templates/asas/src/{ui-platform → ui-backoffice}/record-page.tsx +4 -4
  138. package/template/templates/asas/src/{ui-platform → ui-backoffice}/role-cells.tsx +13 -6
  139. package/template/templates/asas/src/{ui-platform → ui-backoffice}/user-actions.tsx +46 -48
  140. package/template/templates/asas/src/ui-dashboard/dashboard.tsx +10 -4
  141. package/template/templates/asas/src/ui-dashboard/home.tsx +73 -0
  142. package/template/templates/asas/src/ui-dashboard/members-card.tsx +147 -0
  143. package/template/templates/asas/src/ui-dashboard/members.tsx +637 -438
  144. package/template/templates/asas/src/ui-dashboard/versions.tsx +22 -8
  145. package/template/templates/asas/src/ui-portal/courses-home.tsx +96 -0
  146. package/template/templates/asas/src/ui-portal/home.tsx +9 -13
  147. package/template/templates/features/audit-log/audit-log/audit-log.ts +284 -0
  148. package/template/templates/features/audit-log/backoffice-log/backoffice-log.ts +67 -0
  149. package/template/templates/features/audit-log/index.ts +4 -0
  150. package/template/templates/features/audit-log/package.json +13 -0
  151. package/template/templates/features/auth/index.ts +11 -0
  152. package/template/templates/{asas/src → features/auth}/local-users/local-users.ts +7 -7
  153. package/template/templates/{auth → features/auth}/package.json +2 -3
  154. package/template/templates/{asas/src/kayan → features}/auth/user/account.access.ts +2 -2
  155. package/template/templates/{asas/src/kayan → features}/auth/user/account.ts +2 -2
  156. package/template/templates/{asas/src/kayan → features}/auth/user/invitation.access.ts +1 -1
  157. package/template/templates/{asas/src/kayan → features}/auth/user/invitation.ts +3 -3
  158. package/template/templates/{asas/src/kayan → features}/auth/user/member.access.ts +4 -4
  159. package/template/templates/{asas/src/kayan → features}/auth/user/member.screens.ts +5 -5
  160. package/template/templates/{asas/src/kayan → features}/auth/user/member.ts +4 -3
  161. package/template/templates/{asas/src/kayan → features}/auth/user/organization.access.ts +6 -6
  162. package/template/templates/{asas/src/kayan → features}/auth/user/organization.screens.ts +6 -6
  163. package/template/templates/{asas/src/kayan → features}/auth/user/organization.ts +2 -1
  164. package/template/templates/{asas/src/kayan → features}/auth/user/organizationRole.access.ts +2 -2
  165. package/template/templates/{asas/src/kayan → features}/auth/user/organizationRole.ts +3 -3
  166. package/template/templates/{asas/src/kayan → features}/auth/user/session.access.ts +2 -2
  167. package/template/templates/{asas/src/kayan → features}/auth/user/session.ts +2 -2
  168. package/template/templates/{asas/src/kayan → features}/auth/user/user.access.ts +8 -7
  169. package/template/templates/{asas/src/kayan → features}/auth/user/user.screens.ts +9 -9
  170. package/template/templates/{asas/src/kayan → features}/auth/user/user.ts +2 -2
  171. package/template/templates/{asas/src/kayan → features}/auth/user/verification.access.ts +2 -2
  172. package/template/templates/{asas/src/kayan → features}/auth/user/verification.ts +2 -2
  173. package/template/templates/{asas/src → features/courses}/courses/courses.ts +122 -133
  174. package/template/templates/features/courses/courses/cover-reads.ts +33 -0
  175. package/template/templates/features/courses/courses/ui/archived-badge.tsx +9 -0
  176. package/template/templates/{asas/src → features/courses}/courses/ui/fee-cell.tsx +1 -1
  177. package/template/templates/{asas/src → features/courses}/courses/ui/status-cell.tsx +5 -3
  178. package/template/templates/features/courses/courses/ui/unpublish-button.tsx +15 -0
  179. package/template/templates/features/courses/domain/archive.ts +39 -0
  180. package/template/templates/features/courses/domain/on-offer.ts +6 -0
  181. package/template/templates/features/courses/enrollments/enrollments.ts +309 -0
  182. package/template/templates/{asas/src → features/courses}/enrollments/ui/session-cell.tsx +17 -7
  183. package/template/templates/{asas/src → features/courses/enrollments}/ui/session-labels.tsx +3 -3
  184. package/template/templates/features/courses/index.ts +8 -0
  185. package/template/templates/features/courses/package.json +24 -0
  186. package/template/templates/features/courses/portal/ui/catalogue.tsx +86 -0
  187. package/template/templates/features/courses/portal/ui/course.tsx +176 -0
  188. package/template/templates/features/courses/portal/ui/enrollments.tsx +170 -0
  189. package/template/templates/features/courses/portal/ui/parts.tsx +95 -0
  190. package/template/templates/features/courses/portal/ui/reads.ts +76 -0
  191. package/template/templates/features/courses/portal/ui/rules.ts +87 -0
  192. package/template/templates/features/courses/portal/ui/shell.tsx +194 -0
  193. package/template/templates/features/courses/sessions/seats.ts +42 -0
  194. package/template/templates/{asas/src → features/courses}/sessions/sessions.ts +45 -14
  195. package/template/templates/features/media/index.ts +10 -0
  196. package/template/templates/{asas/src → features/media}/media/media.ts +34 -40
  197. package/template/templates/{asas/src → features/media}/media/ui/preview.tsx +2 -2
  198. package/template/templates/features/media/package.json +19 -0
  199. package/template/templates/features/roles/index.ts +4 -0
  200. package/template/templates/{asas/src → features/roles}/member-roles/member-roles.ts +15 -15
  201. package/template/templates/features/roles/package.json +21 -0
  202. package/template/templates/{asas/src → features/roles}/roles/roles.ts +23 -23
  203. package/template/templates/{asas/src → features/roles}/roles/ui/role-form.tsx +65 -24
  204. package/template/templates/{asas/src → features/roles}/roles/ui/roles.tsx +49 -25
  205. package/template/templates/features/settings/index.ts +3 -0
  206. package/template/templates/features/settings/package.json +13 -0
  207. package/template/templates/{asas/src → features/settings}/settings/settings.ts +12 -17
  208. package/template/templates/features/tags/index.ts +3 -0
  209. package/template/templates/features/tags/package.json +14 -0
  210. package/template/templates/{asas/src → features/tags}/tags/tags.ts +15 -15
  211. package/template/templates/mithaq/package.json +33 -0
  212. package/template/templates/mithaq/src/mail/index.ts +32 -0
  213. package/template/templates/mithaq/src/mail/mailers.ts +36 -0
  214. package/template/templates/{asas/src/audit-log/sink.ts → mithaq/src/mithaq/audit-sink.ts} +31 -9
  215. package/template/templates/{auth/src/platform-roles.ts → mithaq/src/mithaq/auth/backoffice-roles.ts} +44 -23
  216. package/template/templates/mithaq/src/mithaq/auth/index.ts +1859 -0
  217. package/template/templates/mithaq/src/mithaq/auth/organizations.ts +80 -0
  218. package/template/templates/{asas/src → mithaq/src/mithaq}/pages.ts +16 -7
  219. package/template/templates/mithaq/src/mithaq/rich-text-nodes.ts +19 -0
  220. package/template/templates/mithaq/src/mithaq.ts +593 -0
  221. package/template/templates/mithaq/src/roles/default-member-roles.ts +29 -0
  222. package/template/templates/{asas → mithaq}/src/roles/grants.ts +1 -1
  223. package/template/templates/mithaq/src/roles/member-access.ts +11 -0
  224. package/template/templates/{asas/src → mithaq/src/roles}/statements.ts +6 -4
  225. package/template/templates/mithaq/src/roles/system-roles.ts +16 -0
  226. package/template/templates/{asas/src → mithaq/src/roles}/tenant-access.ts +96 -57
  227. package/template/templates/{asas/src → mithaq/src/roles}/tenant-roles.ts +84 -25
  228. package/template/templates/{asas → mithaq}/src/steps/expected-updated-at.ts +2 -2
  229. package/template/templates/{asas → mithaq}/src/storage/index.ts +3 -1
  230. package/template/templates/mithaq/src/ui/activity-page.tsx +33 -0
  231. package/template/templates/mithaq/src/ui/activity.tsx +527 -0
  232. package/template/templates/{asas → mithaq}/src/ui/app-shell.tsx +27 -19
  233. package/template/templates/mithaq/src/ui/rich-text-nodes.tsx +33 -0
  234. package/template/templates/{asas → mithaq}/src/ui/screen-nav.tsx +1 -1
  235. package/template/templates/{asas → mithaq}/src/ui/top-shell.tsx +8 -8
  236. package/template/apps/asas-platform/src/components/mithaq/cells.tsx +0 -112
  237. package/template/apps/asas-platform/src/components/mithaq/controls.tsx +0 -650
  238. package/template/apps/asas-platform/src/components/mithaq/field-shell.tsx +0 -53
  239. package/template/apps/asas-platform/src/components/mithaq/filter-operators.ts +0 -108
  240. package/template/apps/asas-platform/src/components/mithaq/form.tsx +0 -1467
  241. package/template/apps/asas-platform/src/components/mithaq/list-columns.tsx +0 -108
  242. package/template/apps/asas-platform/src/components/mithaq/list-filters.tsx +0 -368
  243. package/template/apps/asas-platform/src/components/mithaq/list-pagination.tsx +0 -153
  244. package/template/apps/asas-platform/src/components/mithaq/list-query.ts +0 -432
  245. package/template/apps/asas-platform/src/components/mithaq/list-selection.tsx +0 -74
  246. package/template/apps/asas-platform/src/components/mithaq/list.tsx +0 -865
  247. package/template/apps/asas-platform/src/components/mithaq/nav.tsx +0 -871
  248. package/template/apps/asas-platform/src/components/mithaq/nodes.tsx +0 -1024
  249. package/template/apps/asas-platform/src/components/mithaq/relationship-cell.tsx +0 -127
  250. package/template/apps/asas-platform/src/components/mithaq/relationship-control.tsx +0 -400
  251. package/template/apps/asas-platform/src/components/mithaq/rich-text-nodes.ts +0 -6
  252. package/template/apps/asas-platform/src/components/mithaq/rich-text.tsx +0 -1083
  253. package/template/apps/asas-platform/src/components/mithaq/upload.tsx +0 -686
  254. package/template/apps/asas-platform/src/components/ui/drawer.tsx +0 -216
  255. package/template/apps/asas-platform/src/redirect.ts +0 -1
  256. package/template/apps/asas-platform/src/routeTree.gen.ts +0 -181
  257. package/template/apps/asas-platform/src/router.tsx +0 -7
  258. package/template/apps/asas-platform/src/routes/(screens)/platform/files.ts +0 -4
  259. package/template/apps/asas-platform/src/routes/api/$.ts +0 -30
  260. package/template/apps/asas-platform/src/server.ts +0 -20
  261. package/template/apps/asas-tanstack/src/components/mithaq/cells.tsx +0 -112
  262. package/template/apps/asas-tanstack/src/components/mithaq/controls.tsx +0 -650
  263. package/template/apps/asas-tanstack/src/components/mithaq/field-shell.tsx +0 -53
  264. package/template/apps/asas-tanstack/src/components/mithaq/filter-operators.ts +0 -108
  265. package/template/apps/asas-tanstack/src/components/mithaq/form.tsx +0 -1467
  266. package/template/apps/asas-tanstack/src/components/mithaq/list-columns.tsx +0 -108
  267. package/template/apps/asas-tanstack/src/components/mithaq/list-filters.tsx +0 -368
  268. package/template/apps/asas-tanstack/src/components/mithaq/list-pagination.tsx +0 -153
  269. package/template/apps/asas-tanstack/src/components/mithaq/list-query.ts +0 -432
  270. package/template/apps/asas-tanstack/src/components/mithaq/list-selection.tsx +0 -74
  271. package/template/apps/asas-tanstack/src/components/mithaq/list.tsx +0 -865
  272. package/template/apps/asas-tanstack/src/components/mithaq/nav.tsx +0 -871
  273. package/template/apps/asas-tanstack/src/components/mithaq/nodes.tsx +0 -1024
  274. package/template/apps/asas-tanstack/src/components/mithaq/relationship-cell.tsx +0 -127
  275. package/template/apps/asas-tanstack/src/components/mithaq/relationship-control.tsx +0 -400
  276. package/template/apps/asas-tanstack/src/components/mithaq/rich-text-nodes.ts +0 -6
  277. package/template/apps/asas-tanstack/src/components/mithaq/rich-text.tsx +0 -1083
  278. package/template/apps/asas-tanstack/src/components/mithaq/upload.tsx +0 -686
  279. package/template/apps/asas-tanstack/src/components/ui/drawer.tsx +0 -215
  280. package/template/templates/asas/src/audit-log/audit-log.ts +0 -187
  281. package/template/templates/asas/src/audit-log/ui/activity.tsx +0 -243
  282. package/template/templates/asas/src/courses/ui/archive-button.tsx +0 -25
  283. package/template/templates/asas/src/courses/ui/no-courses-on-offer.tsx +0 -11
  284. package/template/templates/asas/src/courses/ui/on-offer.ts +0 -6
  285. package/template/templates/asas/src/enrollments/enrollments.ts +0 -137
  286. package/template/templates/asas/src/rich-text-nodes.ts +0 -11
  287. package/template/templates/asas/src/roles.ts +0 -16
  288. package/template/templates/asas/src/ui/rich-text-nodes.tsx +0 -15
  289. package/template/templates/asas/src/ui-platform/organization-actions.tsx +0 -114
  290. package/template/templates/auth/src/index.ts +0 -690
  291. /package/template/apps/{asas-platform → asas-backoffice}/components.json +0 -0
  292. /package/template/apps/{asas-platform → asas-backoffice}/gitignore +0 -0
  293. /package/template/apps/{asas-platform → asas-backoffice}/public/favicon.svg +0 -0
  294. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/accordion.tsx +0 -0
  295. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/alert-dialog.tsx +0 -0
  296. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/avatar.tsx +0 -0
  297. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/badge.tsx +0 -0
  298. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/breadcrumb.tsx +0 -0
  299. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/button-group.tsx +0 -0
  300. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/button.tsx +0 -0
  301. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/calendar.tsx +0 -0
  302. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/card.tsx +0 -0
  303. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/chart.tsx +0 -0
  304. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/checkbox.tsx +0 -0
  305. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/collapsible.tsx +0 -0
  306. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/combobox.tsx +0 -0
  307. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/dialog.tsx +0 -0
  308. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/direction.tsx +0 -0
  309. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/directional-icon.tsx +0 -0
  310. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/dropdown-menu.tsx +0 -0
  311. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/field.tsx +0 -0
  312. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/input-group.tsx +0 -0
  313. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/input-otp.tsx +0 -0
  314. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/input.tsx +0 -0
  315. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/label.tsx +0 -0
  316. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/popover.tsx +0 -0
  317. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/radio-group.tsx +0 -0
  318. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/resizable.tsx +0 -0
  319. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/scroll-area.tsx +0 -0
  320. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/select.tsx +0 -0
  321. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/separator.tsx +0 -0
  322. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/sheet.tsx +0 -0
  323. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/sidebar.tsx +0 -0
  324. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/skeleton.tsx +0 -0
  325. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/slider.tsx +0 -0
  326. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/spinner.tsx +0 -0
  327. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/switch.tsx +0 -0
  328. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/table.tsx +0 -0
  329. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/tabs.tsx +0 -0
  330. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/textarea.tsx +0 -0
  331. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/toggle-group.tsx +0 -0
  332. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/toggle.tsx +0 -0
  333. /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/tooltip.tsx +0 -0
  334. /package/template/apps/{asas-platform → asas-backoffice}/src/copy.ts +0 -0
  335. /package/template/apps/{asas-platform → asas-backoffice}/src/hooks/use-mobile.ts +0 -0
  336. /package/template/apps/{asas-platform → asas-backoffice}/src/lib/utils.ts +0 -0
  337. /package/template/apps/{asas-platform → asas-backoffice}/src/theme.ts +0 -0
  338. /package/template/templates/{asas/src/kayan → features}/auth/user/index.ts +0 -0
  339. /package/template/templates/{asas/src → features/courses}/courses/ui/no-courses.tsx +0 -0
  340. /package/template/templates/{asas → mithaq}/components.json +0 -0
  341. /package/template/templates/{asas → mithaq}/src/storage/defaults.ts +0 -0
  342. /package/template/templates/{asas → mithaq}/src/storage/local.ts +0 -0
  343. /package/template/templates/{asas → mithaq}/src/storage/r2.ts +0 -0
  344. /package/template/templates/{asas → mithaq}/src/storage/s3.ts +0 -0
  345. /package/template/templates/{asas → mithaq}/src/storage/uploadthing.ts +0 -0
  346. /package/template/templates/{asas → mithaq}/src/ui/kpi-card.tsx +0 -0
  347. /package/template/templates/{asas → mithaq}/src/ui/record-page.tsx +0 -0
  348. /package/template/templates/{asas → mithaq}/src/ui/table-page.tsx +0 -0
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "asas-platform",
2
+ "name": "asas-backoffice",
3
3
  "version": "0.0.0",
4
4
  "private": true,
5
5
  "type": "module",
@@ -13,7 +13,7 @@
13
13
  "@fontsource-variable/figtree": "^5.3.0",
14
14
  "@fontsource-variable/noto-sans": "^5.3.0",
15
15
  "@fontsource/ibm-plex-sans-arabic": "^5.2.8",
16
- "@hugeicons/core-free-icons": "^4.1.4",
16
+ "@hugeicons/core-free-icons": "4.3.5",
17
17
  "@hugeicons/react": "^1.1.6",
18
18
  "@lexical/extension": "0.52.0",
19
19
  "@lexical/link": "0.52.0",
@@ -34,9 +34,11 @@
34
34
  "lexical": "0.52.0",
35
35
  "lucide-react": "^1.16.0",
36
36
  "mithaq": "*",
37
+ "mithaq-admin": "*",
37
38
  "react": "^19.3.0",
38
39
  "react-day-picker": "^10.0.1",
39
40
  "react-dom": "^19.3.0",
41
+ "react-is": "^19.3.0",
40
42
  "react-resizable-panels": "^4.14.1",
41
43
  "recharts": "3.8.0",
42
44
  "tw-animate-css": "^1.4.0"
@@ -47,9 +49,9 @@
47
49
  "@types/react": "^19.3.0",
48
50
  "@types/react-dom": "^19.3.0",
49
51
  "@vitejs/plugin-react": "^6.0.2",
50
- "mithaq-admin": "*",
51
52
  "shadcn": "4.18.0",
52
53
  "tailwindcss": "^4.3.0",
54
+ "typescript": "^7.0.2",
53
55
  "vite": "^8.0.13"
54
56
  }
55
57
  }
@@ -144,4 +144,4 @@ export const authArm = async (path: string, body: unknown = {}) => {
144
144
  // The status too, because a rate limit's refusal carries no code to read.
145
145
  return { ok: response.ok, status: response.status, message: answered?.message, body: answered }
146
146
  }
147
- // mithaq-admin b06d8d335d306c07556f8f2b81fba20ba7ded198 94db2fc49ad4391c0d1c2183cb41001dd08d62017c76af86cc5f611488c22c68
147
+ // mithaq-admin 2d3ab739c92c6c2b397041b76bf4b23b2902b7a2 94db2fc49ad4391c0d1c2183cb41001dd08d62017c76af86cc5f611488c22c68
@@ -7,10 +7,10 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/com
7
7
  import { Input } from '@/components/ui/input'
8
8
  import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from '@/components/ui/input-group'
9
9
  import { authArm } from './api.ts'
10
- import { FieldShell, describedBy } from './components/mithaq/field-shell.tsx'
10
+ import { FieldShell, describedBy } from 'mithaq-admin/field-shell.tsx'
11
11
  import { refusalKey } from './copy.ts'
12
12
  import { LocaleSwitch } from './locale-switch.tsx'
13
- import { wanted } from './redirect.ts'
13
+ import { landing } from './redirect.ts'
14
14
  import { useCopy } from './routes/__root.tsx'
15
15
 
16
16
  /** The one search key the auth pages read, off the raw search. */
@@ -21,8 +21,8 @@ export const redirectSearch = (search: Record<string, unknown>): { redirect?: st
21
21
  export const signedInAs = async (actor: Promise<unknown>) => Boolean(((await actor.catch(() => null)) as { email?: unknown } | null)?.email)
22
22
 
23
23
  /**
24
- * Whether this request carries a session, where signing in lands for it, and the provider's password bounds.
25
- * No auth page sends a referrer, since the reset page's address carries its token.
24
+ * Whether this request carries a session, the screens it opens, the first of them as `home`, which a link back names,
25
+ * and the provider's password bounds. No auth page sends a referrer, since the reset page's address carries its token.
26
26
  */
27
27
  export const authGate = createServerFn({ method: 'GET' }).handler(async () => {
28
28
  // Imported inside the server half so no auth page ships the screen host to the browser.
@@ -31,9 +31,9 @@ export const authGate = createServerFn({ method: 'GET' }).handler(async () => {
31
31
  type Provider = { name: string; server: { $context: Promise<{ password: { config: { minPasswordLength: number; maxPasswordLength: number } } }> } }
32
32
  const provider = (asas.auth.strategies as unknown as Provider[]).find((one) => one.name === 'user')!
33
33
  const [signedIn, { password }] = await Promise.all([signedInAs(asas.auth.actor(getRequest().headers)), provider.server.$context])
34
- const first = signedIn ? (await loadEnterable())?.screens[0] : undefined
35
- const home: { path: string; name?: string } = first ?? { path: '/unauthorized' }
36
- return { signedIn, home, password: { min: password.config.minPasswordLength, max: password.config.maxPasswordLength } }
34
+ const entered = signedIn ? ((await loadEnterable())?.screens ?? []) : []
35
+ const home: { path: string; name?: string } = entered[0] ?? { path: '/unauthorized' }
36
+ return { signedIn, home, screens: entered, password: { min: password.config.minPasswordLength, max: password.config.maxPasswordLength } }
37
37
  })
38
38
 
39
39
  /**
@@ -42,8 +42,8 @@ export const authGate = createServerFn({ method: 'GET' }).handler(async () => {
42
42
  * route context.
43
43
  */
44
44
  export const gate = async ({ search }: { search: { redirect?: string } }) => {
45
- const { signedIn, home, password } = await authGate()
46
- if (signedIn) throw redirect({ href: wanted({ asked: search.redirect, home: home.path }) })
45
+ const { signedIn, screens, password } = await authGate()
46
+ if (signedIn) throw redirect({ href: landing({ asked: search.redirect, screens }) })
47
47
  return { password }
48
48
  }
49
49
 
@@ -57,10 +57,10 @@ export const useHomeLabel = () => {
57
57
  }
58
58
 
59
59
  /** What the forgot and reset pages draw for someone already signed in: the way on, and a sign-out. */
60
- export function AlreadySignedIn({ redirect: asked, home }: { redirect?: string; home: { path: string; name?: string } }) {
60
+ export function AlreadySignedIn({ redirect: asked, home, screens }: { redirect?: string; home: { path: string; name?: string }; screens: readonly { name: string; path: string }[] }) {
61
61
  const { t } = useCopy()
62
62
  const label = useHomeLabel()
63
- const to = wanted({ asked, home: home.path })
63
+ const to = landing({ asked, screens })
64
64
  return (
65
65
  <AuthFrame title={t('auth.alreadySignedIn', 'You are already signed in')}>
66
66
  <div className="grid gap-4">
@@ -147,4 +147,4 @@ export function AuthBox({
147
147
  </FieldShell>
148
148
  )
149
149
  }
150
- // mithaq-admin b06d8d335d306c07556f8f2b81fba20ba7ded198 ab822afe361dfc5f82c504570fd5d0ea13ec4572e60adb679a3f9532ccf67803
150
+ // mithaq-admin 0.0.0 e498423cf4a61adb8cf6358d043d31ae92d853de4c6939a9c0fe138c848b7211
@@ -0,0 +1,35 @@
1
+ import type { Language } from 'asas'
2
+ import type { ComponentsOf } from 'mithaq-admin/components.tsx'
3
+ import { defaultComponents } from 'mithaq-admin/default-components.tsx'
4
+ // add-on: rich-text
5
+ import { richTextComponents } from 'mithaq-admin/rich-text.tsx'
6
+ // end add-on: rich-text
7
+ // add-on: uploads
8
+ import { uploadComponents } from 'mithaq-admin/upload.tsx'
9
+ // end add-on: uploads
10
+
11
+ // Typed against the language, so a kind of the project's own with no control or cell here is a type error, and so
12
+ // is leaving out the rich text or files add-on while the language holds its kind.
13
+ // Spread defaultComponents.controls or defaultComponents.cells to add or replace one.
14
+ // A file of its own, so the server entry reads the map without evaluating the router and its route tree.
15
+ export const components: ComponentsOf<Language> = {
16
+ ...defaultComponents,
17
+ controls: {
18
+ ...defaultComponents.controls,
19
+ // add-on: rich-text
20
+ ...richTextComponents.controls,
21
+ // end add-on: rich-text
22
+ // add-on: uploads
23
+ ...uploadComponents.controls,
24
+ // end add-on: uploads
25
+ },
26
+ cells: {
27
+ ...defaultComponents.cells,
28
+ // add-on: rich-text
29
+ ...richTextComponents.cells,
30
+ // end add-on: rich-text
31
+ // add-on: uploads
32
+ ...uploadComponents.cells,
33
+ // end add-on: uploads
34
+ },
35
+ }
@@ -0,0 +1,14 @@
1
+ import { createServerFn } from '@tanstack/react-start'
2
+
3
+ type FirstUser = { initialized: true } | { initialized: false; code: 'none' | 'required' | 'unset' }
4
+
5
+ /**
6
+ * Whether the backoffice has an administrator yet, and while it has none whether making one asks for
7
+ * the setup code: the provider's own `init`, read in process.
8
+ */
9
+ export const firstUser = createServerFn({ method: 'GET' }).handler(async () => {
10
+ // Imported inside the server half so no page ships the provider to the browser.
11
+ const { asas } = await import('asas')
12
+ type Provider = { name: string; server: { api: { init(): Promise<FirstUser> } } }
13
+ return (asas.auth.strategies as unknown as Provider[]).find((one) => one.name === 'user')!.server.api.init()
14
+ })
@@ -35,4 +35,4 @@ export const clampedHref = ({ href, page, totalPages }: { href: string; page: nu
35
35
  else url.searchParams.delete('page')
36
36
  return `${url.pathname}${url.search}${url.hash}`
37
37
  }
38
- // mithaq-admin b06d8d335d306c07556f8f2b81fba20ba7ded198 4754cbac64eeac528e7e037173ad56ffa8d07df3e526e1191bbe3be400db97a5
38
+ // mithaq-admin 2d3ab739c92c6c2b397041b76bf4b23b2902b7a2 4754cbac64eeac528e7e037173ad56ffa8d07df3e526e1191bbe3be400db97a5
@@ -1,9 +1,11 @@
1
+ import { useRouter } from '@tanstack/react-router'
1
2
  import { Button } from '@/components/ui/button'
2
- import { localeEntries } from './components/mithaq/nav.tsx'
3
- import { locales, switchLocale, type Locale } from './copy.ts'
3
+ import { localeEntries } from 'mithaq-admin/locale-menu.ts'
4
+ import { locales, showLocale, type Locale } from './copy.ts'
4
5
 
5
- /** The language switch for pages without a form: `switchLocale` reloads without asking, so a page with a form must use the user menu, which asks first. */
6
+ /** The language switch of the auth and landing pages, which redraws the page in place, so a form keeps what was typed. */
6
7
  export function LocaleSwitch({ locale }: { locale: Locale }) {
8
+ const router = useRouter()
7
9
  return (
8
10
  <div className="flex items-center gap-1">
9
11
  {localeEntries(locales, locale).map((entry) => (
@@ -14,7 +16,7 @@ export function LocaleSwitch({ locale }: { locale: Locale }) {
14
16
  size="xs"
15
17
  aria-current={entry.active}
16
18
  aria-label={entry.label}
17
- onClick={() => switchLocale({ to: entry.locale })}
19
+ onClick={() => void showLocale({ to: entry.locale, router })}
18
20
  >
19
21
  <span className="hidden sm:inline">{entry.label}</span>
20
22
  <span className="sm:hidden">{entry.locale.toUpperCase()}</span>
@@ -23,4 +25,4 @@ export function LocaleSwitch({ locale }: { locale: Locale }) {
23
25
  </div>
24
26
  )
25
27
  }
26
- // mithaq-admin b06d8d335d306c07556f8f2b81fba20ba7ded198 43c6d309a5bae4f6af3cdcf4c741106b3a16129ac77d142f1e4254594f5b8a54
28
+ // mithaq-admin 0.0.0 37e32a32766452cd88389e2e4cc6c246ccc3ccb40bf941f8c1e3835b4e377f98
@@ -0,0 +1,5 @@
1
+ // What `/unauthorized` draws below its sentence for someone in no organization. The backoffice is staff's, who join an
2
+ // organization in the tenant app, so it offers nothing here.
3
+ export function NoOrganization(_: { email: string | undefined }) {
4
+ return null
5
+ }
@@ -0,0 +1 @@
1
+ export { landing } from '../../asas-tanstack/src/redirect.ts'
@@ -8,4 +8,4 @@ export const mergedHeaders = (session: Headers, own?: HeadersInit): Headers => {
8
8
  if (own) for (const [key, value] of new Headers(own)) if (key !== 'cookie') headers.set(key, value)
9
9
  return headers
10
10
  }
11
- // mithaq-admin b06d8d335d306c07556f8f2b81fba20ba7ded198 2969a3dafbf201d6eb6074ecda0e8f17e341cbd1ca176100350844e74ec23623
11
+ // mithaq-admin 2d3ab739c92c6c2b397041b76bf4b23b2902b7a2 2969a3dafbf201d6eb6074ecda0e8f17e341cbd1ca176100350844e74ec23623
@@ -0,0 +1,206 @@
1
+ /* eslint-disable */
2
+
3
+ // @ts-nocheck
4
+
5
+ // noinspection JSUnusedGlobalSymbols
6
+
7
+ // This file was automatically generated by TanStack Router.
8
+ // You should NOT make any changes in this file as it will be overwritten.
9
+ // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
10
+
11
+ import { Route as rootRouteImport } from './routes/__root'
12
+ import { Route as UnauthorizedRouteImport } from './routes/unauthorized'
13
+ import { Route as screensBackofficeRouteImport } from './routes/(screens)/backoffice'
14
+ import { Route as ApiSplatRouteImport } from './routes/api/$'
15
+ import { Route as AuthCreateFirstUserRouteImport } from './routes/auth.create-first-user'
16
+ import { Route as AuthSignInRouteImport } from './routes/auth.sign-in'
17
+ import { Route as screensBackofficeIndexRouteImport } from './routes/(screens)/backoffice.index'
18
+ import { Route as screensBackofficeSplatRouteImport } from './routes/(screens)/backoffice.$'
19
+
20
+ const UnauthorizedRoute = UnauthorizedRouteImport.update({
21
+ id: '/unauthorized',
22
+ path: '/unauthorized',
23
+ getParentRoute: () => rootRouteImport,
24
+ } as any)
25
+ const screensBackofficeRoute = screensBackofficeRouteImport.update({
26
+ id: '/(screens)/backoffice',
27
+ path: '/backoffice',
28
+ getParentRoute: () => rootRouteImport,
29
+ } as any)
30
+ const ApiSplatRoute = ApiSplatRouteImport.update({
31
+ id: '/api/$',
32
+ path: '/api/$',
33
+ getParentRoute: () => rootRouteImport,
34
+ } as any)
35
+ const AuthCreateFirstUserRoute = AuthCreateFirstUserRouteImport.update({
36
+ id: '/auth/create-first-user',
37
+ path: '/auth/create-first-user',
38
+ getParentRoute: () => rootRouteImport,
39
+ } as any)
40
+ const AuthSignInRoute = AuthSignInRouteImport.update({
41
+ id: '/auth/sign-in',
42
+ path: '/auth/sign-in',
43
+ getParentRoute: () => rootRouteImport,
44
+ } as any)
45
+ const screensBackofficeIndexRoute = screensBackofficeIndexRouteImport.update({
46
+ id: '/',
47
+ path: '/',
48
+ getParentRoute: () => screensBackofficeRoute,
49
+ } as any)
50
+ const screensBackofficeSplatRoute = screensBackofficeSplatRouteImport.update({
51
+ id: '/$',
52
+ path: '/$',
53
+ getParentRoute: () => screensBackofficeRoute,
54
+ } as any)
55
+
56
+ export interface FileRoutesByFullPath {
57
+ '/unauthorized': typeof UnauthorizedRoute
58
+ '/backoffice': typeof screensBackofficeRouteWithChildren
59
+ '/api/$': typeof ApiSplatRoute
60
+ '/auth/create-first-user': typeof AuthCreateFirstUserRoute
61
+ '/auth/sign-in': typeof AuthSignInRoute
62
+ '/backoffice/$': typeof screensBackofficeSplatRoute
63
+ '/backoffice/': typeof screensBackofficeIndexRoute
64
+ }
65
+ export interface FileRoutesByTo {
66
+ '/unauthorized': typeof UnauthorizedRoute
67
+ '/api/$': typeof ApiSplatRoute
68
+ '/auth/create-first-user': typeof AuthCreateFirstUserRoute
69
+ '/auth/sign-in': typeof AuthSignInRoute
70
+ '/backoffice/$': typeof screensBackofficeSplatRoute
71
+ '/backoffice': typeof screensBackofficeIndexRoute
72
+ }
73
+ export interface FileRoutesById {
74
+ __root__: typeof rootRouteImport
75
+ '/unauthorized': typeof UnauthorizedRoute
76
+ '/(screens)/backoffice': typeof screensBackofficeRouteWithChildren
77
+ '/api/$': typeof ApiSplatRoute
78
+ '/auth/create-first-user': typeof AuthCreateFirstUserRoute
79
+ '/auth/sign-in': typeof AuthSignInRoute
80
+ '/(screens)/backoffice/$': typeof screensBackofficeSplatRoute
81
+ '/(screens)/backoffice/': typeof screensBackofficeIndexRoute
82
+ }
83
+ export interface FileRouteTypes {
84
+ fileRoutesByFullPath: FileRoutesByFullPath
85
+ fullPaths:
86
+ | '/unauthorized'
87
+ | '/backoffice'
88
+ | '/api/$'
89
+ | '/auth/create-first-user'
90
+ | '/auth/sign-in'
91
+ | '/backoffice/$'
92
+ | '/backoffice/'
93
+ fileRoutesByTo: FileRoutesByTo
94
+ to:
95
+ | '/unauthorized'
96
+ | '/api/$'
97
+ | '/auth/create-first-user'
98
+ | '/auth/sign-in'
99
+ | '/backoffice/$'
100
+ | '/backoffice'
101
+ id:
102
+ | '__root__'
103
+ | '/unauthorized'
104
+ | '/(screens)/backoffice'
105
+ | '/api/$'
106
+ | '/auth/create-first-user'
107
+ | '/auth/sign-in'
108
+ | '/(screens)/backoffice/$'
109
+ | '/(screens)/backoffice/'
110
+ fileRoutesById: FileRoutesById
111
+ }
112
+ export interface RootRouteChildren {
113
+ UnauthorizedRoute: typeof UnauthorizedRoute
114
+ screensBackofficeRoute: typeof screensBackofficeRouteWithChildren
115
+ ApiSplatRoute: typeof ApiSplatRoute
116
+ AuthCreateFirstUserRoute: typeof AuthCreateFirstUserRoute
117
+ AuthSignInRoute: typeof AuthSignInRoute
118
+ }
119
+
120
+ declare module '@tanstack/react-router' {
121
+ interface FileRoutesByPath {
122
+ '/unauthorized': {
123
+ id: '/unauthorized'
124
+ path: '/unauthorized'
125
+ fullPath: '/unauthorized'
126
+ preLoaderRoute: typeof UnauthorizedRouteImport
127
+ parentRoute: typeof rootRouteImport
128
+ }
129
+ '/(screens)/backoffice': {
130
+ id: '/(screens)/backoffice'
131
+ path: '/backoffice'
132
+ fullPath: '/backoffice'
133
+ preLoaderRoute: typeof screensBackofficeRouteImport
134
+ parentRoute: typeof rootRouteImport
135
+ }
136
+ '/api/$': {
137
+ id: '/api/$'
138
+ path: '/api/$'
139
+ fullPath: '/api/$'
140
+ preLoaderRoute: typeof ApiSplatRouteImport
141
+ parentRoute: typeof rootRouteImport
142
+ }
143
+ '/auth/create-first-user': {
144
+ id: '/auth/create-first-user'
145
+ path: '/auth/create-first-user'
146
+ fullPath: '/auth/create-first-user'
147
+ preLoaderRoute: typeof AuthCreateFirstUserRouteImport
148
+ parentRoute: typeof rootRouteImport
149
+ }
150
+ '/auth/sign-in': {
151
+ id: '/auth/sign-in'
152
+ path: '/auth/sign-in'
153
+ fullPath: '/auth/sign-in'
154
+ preLoaderRoute: typeof AuthSignInRouteImport
155
+ parentRoute: typeof rootRouteImport
156
+ }
157
+ '/(screens)/backoffice/': {
158
+ id: '/(screens)/backoffice/'
159
+ path: '/'
160
+ fullPath: '/backoffice/'
161
+ preLoaderRoute: typeof screensBackofficeIndexRouteImport
162
+ parentRoute: typeof screensBackofficeRoute
163
+ }
164
+ '/(screens)/backoffice/$': {
165
+ id: '/(screens)/backoffice/$'
166
+ path: '/$'
167
+ fullPath: '/backoffice/$'
168
+ preLoaderRoute: typeof screensBackofficeSplatRouteImport
169
+ parentRoute: typeof screensBackofficeRoute
170
+ }
171
+ }
172
+ }
173
+
174
+ interface screensBackofficeRouteChildren {
175
+ screensBackofficeSplatRoute: typeof screensBackofficeSplatRoute
176
+ screensBackofficeIndexRoute: typeof screensBackofficeIndexRoute
177
+ }
178
+
179
+ const screensBackofficeRouteChildren: screensBackofficeRouteChildren = {
180
+ screensBackofficeSplatRoute: screensBackofficeSplatRoute,
181
+ screensBackofficeIndexRoute: screensBackofficeIndexRoute,
182
+ }
183
+
184
+ const screensBackofficeRouteWithChildren =
185
+ screensBackofficeRoute._addFileChildren(screensBackofficeRouteChildren)
186
+
187
+ const rootRouteChildren: RootRouteChildren = {
188
+ UnauthorizedRoute: UnauthorizedRoute,
189
+ screensBackofficeRoute: screensBackofficeRouteWithChildren,
190
+ ApiSplatRoute: ApiSplatRoute,
191
+ AuthCreateFirstUserRoute: AuthCreateFirstUserRoute,
192
+ AuthSignInRoute: AuthSignInRoute,
193
+ }
194
+ export const routeTree = rootRouteImport
195
+ ._addFileChildren(rootRouteChildren)
196
+ ._addFileTypes<FileRouteTypes>()
197
+
198
+ import type { getRouter } from './router.tsx'
199
+ import type { startInstance } from './start.ts'
200
+ declare module '@tanstack/react-start' {
201
+ interface Register {
202
+ ssr: true
203
+ router: Awaited<ReturnType<typeof getRouter>>
204
+ config: Awaited<ReturnType<typeof startInstance.getOptions>>
205
+ }
206
+ }
@@ -0,0 +1,18 @@
1
+ import { createRouter } from '@tanstack/react-router'
2
+ import { routeTree } from './routeTree.gen'
3
+ import { flatSearch } from './screen-list.tsx'
4
+ import { ComponentsProvider, RouteError } from 'mithaq-admin/components.tsx'
5
+ import { components } from './components.ts'
6
+
7
+ // routeTree.gen.ts is committed: a clean checkout has to typecheck before any build.
8
+ // The search stays the URL's own pairs, one string each; a screen's list keeps its `qs` URL there.
9
+ export const getRouter = () =>
10
+ createRouter({
11
+ routeTree,
12
+ scrollRestoration: true,
13
+ ...flatSearch,
14
+ // Around every route, so each screen draws its controls from this map.
15
+ Wrap: ({ children }) => <ComponentsProvider components={components}>{children}</ComponentsProvider>,
16
+ // Drawn in place of the route that threw, so the shell around it stays.
17
+ defaultErrorComponent: RouteError,
18
+ })
@@ -0,0 +1,10 @@
1
+ // Written by `mithaq generate screens`. Do not edit.
2
+ /// <reference types="vite/client" />
3
+ // Every file the `backoffice` screen's references name, each loaded when a page draws it, keyed as the reference prints it.
4
+ const named = (name: string, files: Record<string, () => Promise<unknown>>) => Object.fromEntries(Object.entries(files).map(([file, load]) => [`${name}:${file}`, load]))
5
+ export const files = {
6
+ ...import.meta.glob(['./src/ui-backoffice/home.tsx', './src/ui-backoffice/organization-actions.tsx', './src/ui-backoffice/record-page.tsx', './src/ui-backoffice/role-cells.tsx', './src/ui-backoffice/user-actions.tsx', './src/ui-dashboard/theme-provider.tsx'], { base: '../../../../../../templates/asas/', exhaustive: true }),
7
+ ...named('@asas/courses', import.meta.glob(['./courses/ui/fee-cell.tsx', './enrollments/ui/session-cell.tsx', './enrollments/ui/session-labels.tsx'], { base: '../../../../../../templates/features/courses/', exhaustive: true })),
8
+ ...named('@asas/mithaq', import.meta.glob(['./src/ui/app-shell.tsx', './src/ui/rich-text-nodes.tsx', './src/ui/table-page.tsx'], { base: '../../../../../../templates/mithaq/', exhaustive: true })),
9
+ ...named('@asas/roles', import.meta.glob(['./roles/ui/roles.tsx'], { base: '../../../../../../templates/features/roles/', exhaustive: true })),
10
+ }