create-mithaq 0.1.1 → 0.2.1

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 +1094 -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,216 +0,0 @@
1
- import * as React from "react"
2
- import { Drawer as DrawerPrimitive } from "@base-ui/react/drawer"
3
- import { cn } from "cn"
4
-
5
- type DrawerContextProps = {
6
- hasSnapPoints: boolean
7
- modal: DrawerPrimitive.Root.Props["modal"]
8
- showSwipeHandle: boolean
9
- swipeDirection: NonNullable<DrawerPrimitive.Root.Props["swipeDirection"]>
10
- }
11
-
12
- const DrawerContext = React.createContext<DrawerContextProps | null>(null)
13
-
14
- function useDrawer() {
15
- const context = React.useContext(DrawerContext)
16
-
17
- if (!context) {
18
- throw new Error("useDrawer must be used within a Drawer.")
19
- }
20
-
21
- return context
22
- }
23
-
24
- function Drawer({
25
- modal = true,
26
- showSwipeHandle = false,
27
- snapPoints,
28
- swipeDirection = "down",
29
- ...props
30
- }: DrawerPrimitive.Root.Props & {
31
- showSwipeHandle?: boolean
32
- }) {
33
- const hasSnapPoints = snapPoints != null && snapPoints.length > 0
34
- const contextValue = React.useMemo(
35
- () => ({ hasSnapPoints, modal, showSwipeHandle, swipeDirection }),
36
- [hasSnapPoints, modal, showSwipeHandle, swipeDirection]
37
- )
38
-
39
- return (
40
- <DrawerContext.Provider value={contextValue}>
41
- <DrawerPrimitive.Root
42
- data-slot="drawer"
43
- modal={modal}
44
- snapPoints={snapPoints}
45
- swipeDirection={swipeDirection}
46
- {...props}
47
- />
48
- </DrawerContext.Provider>
49
- )
50
- }
51
-
52
- function DrawerTrigger({ ...props }: DrawerPrimitive.Trigger.Props) {
53
- return <DrawerPrimitive.Trigger data-slot="drawer-trigger" {...props} />
54
- }
55
-
56
- function DrawerPortal({ ...props }: DrawerPrimitive.Portal.Props) {
57
- return <DrawerPrimitive.Portal data-slot="drawer-portal" {...props} />
58
- }
59
-
60
- function DrawerClose({ ...props }: DrawerPrimitive.Close.Props) {
61
- return <DrawerPrimitive.Close data-slot="drawer-close" {...props} />
62
- }
63
-
64
- function DrawerOverlay({
65
- className,
66
- ...props
67
- }: DrawerPrimitive.Backdrop.Props) {
68
- return (
69
- <DrawerPrimitive.Backdrop
70
- data-slot="drawer-overlay"
71
- className={cn(
72
- "fixed inset-0 z-50 min-h-dvh bg-black/20 opacity-[max(var(--drawer-overlay-min-opacity,0),calc(1-var(--drawer-swipe-progress)))] transition-opacity duration-450 ease-[cubic-bezier(0.32,0.72,0,1)] select-none data-ending-style:pointer-events-none data-ending-style:opacity-0 data-ending-style:duration-[calc(var(--drawer-swipe-strength)*400ms)] data-snap-points:[--drawer-overlay-min-opacity:0.5] data-starting-style:opacity-0 data-swiping:duration-0 supports-backdrop-filter:backdrop-blur-sm supports-[-webkit-touch-callout:none]:absolute",
73
- className
74
- )}
75
- {...props}
76
- />
77
- )
78
- }
79
-
80
- function DrawerSwipeHandle({
81
- className,
82
- ...props
83
- }: React.ComponentProps<"div">) {
84
- return (
85
- <div
86
- data-slot="drawer-swipe-handle"
87
- aria-hidden="true"
88
- className={cn(
89
- "relative z-10 flex shrink-0 cursor-grab transition-opacity duration-200 group-data-nested-drawer-open/drawer-popup:opacity-0 group-data-nested-drawer-swiping/drawer-popup:opacity-100 group-data-[swipe-axis=x]/drawer-popup:h-full group-data-[swipe-axis=x]/drawer-popup:w-3 group-data-[swipe-axis=x]/drawer-popup:items-center group-data-[swipe-axis=y]/drawer-popup:h-3 group-data-[swipe-axis=y]/drawer-popup:w-full group-data-[swipe-axis=y]/drawer-popup:justify-center group-data-[swipe-direction=down]/drawer-popup:items-end group-data-[swipe-direction=left]/drawer-popup:order-last group-data-[swipe-direction=left]/drawer-popup:justify-start group-data-[swipe-direction=right]/drawer-popup:justify-end group-data-[swipe-direction=up]/drawer-popup:order-last group-data-[swipe-direction=up]/drawer-popup:items-start after:block after:shrink-0 after:rounded-none after:bg-muted group-data-[swipe-axis=x]/drawer-popup:after:h-[100px] group-data-[swipe-axis=x]/drawer-popup:after:w-1.5 group-data-[swipe-axis=y]/drawer-popup:after:h-1.5 group-data-[swipe-axis=y]/drawer-popup:after:w-[100px] active:cursor-grabbing",
90
- className
91
- )}
92
- {...props}
93
- />
94
- )
95
- }
96
-
97
- function DrawerContent({
98
- className,
99
- children,
100
- ...props
101
- }: DrawerPrimitive.Popup.Props) {
102
- const { hasSnapPoints, modal, showSwipeHandle, swipeDirection } = useDrawer()
103
- const swipeAxis =
104
- swipeDirection === "down" || swipeDirection === "up" ? "y" : "x"
105
-
106
- return (
107
- <DrawerPortal data-slot="drawer-portal">
108
- {modal === true && (
109
- <DrawerOverlay data-snap-points={hasSnapPoints ? "" : undefined} />
110
- )}
111
- <DrawerPrimitive.Viewport
112
- data-slot="drawer-viewport"
113
- data-modal={modal}
114
- className="pointer-events-none fixed inset-0 z-50 select-none data-[modal=true]:pointer-events-auto"
115
- >
116
- <DrawerPrimitive.Popup
117
- data-slot="drawer-popup"
118
- data-swipe-axis={swipeAxis}
119
- data-snap-points={hasSnapPoints ? "" : undefined}
120
- className={cn(
121
- "group/drawer-popup pointer-events-auto fixed z-50 m-(--drawer-inset,0px) flex h-(--drawer-content-height) max-h-(--drawer-content-max-height,none) min-h-0 w-(--drawer-content-width,auto) transform-[translate3d(var(--translate-x,0px),var(--translate-y,0px),0)_scale(var(--stack-scale))] flex-col bg-popover text-sm text-popover-foreground transition-[transform,height,opacity,filter] duration-450 ease-[cubic-bezier(0.22,1,0.36,1)] will-change-transform outline-none select-none [interpolate-size:allow-keywords] data-[swipe-direction=down]:rounded-none data-[swipe-direction=down]:border-t data-[swipe-direction=left]:rounded-none data-[swipe-direction=left]:border-e data-[swipe-direction=right]:rounded-none data-[swipe-direction=right]:border-s data-[swipe-direction=up]:rounded-none data-[swipe-direction=up]:border-b",
122
- "data-nested-drawer-open:overflow-hidden data-nested-drawer-open:brightness-95",
123
- "after:pointer-events-none after:absolute after:bg-(--drawer-bleed-background,var(--color-popover)) data-[swipe-axis=x]:after:inset-y-0 data-[swipe-axis=x]:after:w-(--bleed) data-[swipe-axis=y]:after:inset-x-0 data-[swipe-axis=y]:after:h-(--bleed) data-[swipe-direction=down]:after:top-full data-[swipe-direction=left]:after:end-full data-[swipe-direction=right]:after:start-full data-[swipe-direction=up]:after:bottom-full",
124
- "[--drawer-content-height:var(--drawer-height,auto)] data-[swipe-axis=x]:[--drawer-content-width:75%] data-[swipe-axis=y]:[--drawer-content-max-height:calc(100dvh-6rem)] data-[swipe-axis=y]:data-snap-points:[--drawer-content-height:100dvh] data-[swipe-axis=x]:sm:[--drawer-content-width:24rem]",
125
- "[--bleed:3rem] [--peek:1rem] [--stack-height:var(--drawer-frontmost-height,var(--drawer-height,0px))] [--stack-peek-offset:max(0px,calc((var(--nested-drawers)-var(--stack-progress))*var(--peek)))] [--stack-progress:clamp(0,var(--drawer-swipe-progress),1)] [--stack-scale-base:max(0,calc(1-(var(--nested-drawers)*var(--stack-step))))] [--stack-scale:clamp(0,calc(var(--stack-scale-base)+(var(--stack-step)*var(--stack-progress))),1)] [--stack-shrink:calc(1-var(--stack-scale))] [--stack-step:0.05]",
126
- "data-ending-style:transform-(--closed-transform) data-ending-style:opacity-[0.9999] data-ending-style:duration-[calc(var(--drawer-swipe-strength)*400ms)] data-nested-drawer-swiping:duration-0 data-ending-style:data-nested-drawer-swiping:duration-[calc(var(--drawer-swipe-strength)*400ms)] data-starting-style:transform-(--closed-transform) data-swiping:duration-0 data-ending-style:data-swiping:duration-[calc(var(--drawer-swipe-strength)*400ms)]",
127
- "data-[swipe-axis=y]:inset-x-0 data-[swipe-axis=y]:data-nested-drawer-open:h-(--stack-height)",
128
- "data-[swipe-axis=x]:inset-y-0 data-[swipe-axis=x]:flex-row",
129
- "data-[swipe-direction=down]:bottom-0 data-[swipe-direction=down]:origin-bottom data-[swipe-direction=down]:[--closed-transform:translate3d(0,calc(100%+var(--drawer-inset,0px)+2px),0)] data-[swipe-direction=down]:[--translate-y:calc(var(--drawer-snap-point-offset,0px)+var(--drawer-swipe-movement-y)-var(--stack-peek-offset)-(var(--stack-shrink)*var(--stack-height)))]",
130
- "data-[swipe-direction=up]:top-0 data-[swipe-direction=up]:origin-top data-[swipe-direction=up]:[--closed-transform:translate3d(0,calc(-100%-var(--drawer-inset,0px)-2px),0)] data-[swipe-direction=up]:[--translate-y:calc(var(--drawer-snap-point-offset,0px)+var(--drawer-swipe-movement-y)+var(--stack-peek-offset)+(var(--stack-shrink)*var(--stack-height)))]",
131
- "data-[swipe-direction=left]:start-0 data-[swipe-direction=left]:origin-start data-[swipe-direction=left]:[--closed-transform:translate3d(calc(-100%-var(--drawer-inset,0px)-2px),0,0)] data-[swipe-direction=left]:[--translate-x:calc(var(--drawer-swipe-movement-x)+var(--stack-peek-offset)+(var(--stack-shrink)*100%))]",
132
- "data-[swipe-direction=right]:end-0 data-[swipe-direction=right]:origin-end data-[swipe-direction=right]:[--closed-transform:translate3d(calc(100%+var(--drawer-inset,0px)+2px),0,0)] data-[swipe-direction=right]:[--translate-x:calc(var(--drawer-swipe-movement-x)-var(--stack-peek-offset)-(var(--stack-shrink)*100%))]",
133
- className
134
- )}
135
- {...props}
136
- >
137
- {showSwipeHandle && <DrawerSwipeHandle />}
138
- <DrawerPrimitive.Content
139
- data-slot="drawer-content"
140
- className={cn(
141
- "flex min-h-0 flex-1 flex-col overflow-hidden overscroll-contain rounded-[inherit] transition-opacity duration-300 ease-[cubic-bezier(0.45,1.005,0,1.005)] select-text group-data-nested-drawer-open/drawer-popup:opacity-0 group-data-nested-drawer-swiping/drawer-popup:opacity-100 group-data-swiping/drawer-popup:select-none"
142
- )}
143
- >
144
- {children}
145
- </DrawerPrimitive.Content>
146
- </DrawerPrimitive.Popup>
147
- </DrawerPrimitive.Viewport>
148
- </DrawerPortal>
149
- )
150
- }
151
-
152
- function DrawerHeader({ className, ...props }: React.ComponentProps<"div">) {
153
- return (
154
- <div
155
- data-slot="drawer-header"
156
- className={cn(
157
- "flex shrink-0 flex-col gap-1 p-4 pb-0 group-data-[swipe-axis=y]/drawer-popup:text-center md:gap-2 md:text-start",
158
- className
159
- )}
160
- {...props}
161
- />
162
- )
163
- }
164
-
165
- function DrawerFooter({ className, ...props }: React.ComponentProps<"div">) {
166
- return (
167
- <div
168
- data-slot="drawer-footer"
169
- className={cn("mt-auto flex shrink-0 flex-col gap-2 p-4 pt-0", className)}
170
- {...props}
171
- />
172
- )
173
- }
174
-
175
- function DrawerTitle({ className, ...props }: DrawerPrimitive.Title.Props) {
176
- return (
177
- <DrawerPrimitive.Title
178
- data-slot="drawer-title"
179
- className={cn(
180
- "text-lg font-semibold tracking-wider text-foreground uppercase",
181
- className
182
- )}
183
- {...props}
184
- />
185
- )
186
- }
187
-
188
- function DrawerDescription({
189
- className,
190
- ...props
191
- }: DrawerPrimitive.Description.Props) {
192
- return (
193
- <DrawerPrimitive.Description
194
- data-slot="drawer-description"
195
- className={cn(
196
- "mt-0.5 text-sm leading-relaxed text-balance text-muted-foreground",
197
- className
198
- )}
199
- {...props}
200
- />
201
- )
202
- }
203
-
204
- export {
205
- Drawer,
206
- DrawerPortal,
207
- DrawerOverlay,
208
- DrawerSwipeHandle,
209
- DrawerTrigger,
210
- DrawerClose,
211
- DrawerContent,
212
- DrawerHeader,
213
- DrawerFooter,
214
- DrawerTitle,
215
- DrawerDescription,
216
- }
@@ -1 +0,0 @@
1
- export { wanted } from '../../asas-tanstack/src/redirect.ts'
@@ -1,181 +0,0 @@
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 screensPlatformRouteImport } from './routes/(screens)/platform'
14
- import { Route as ApiSplatRouteImport } from './routes/api/$'
15
- import { Route as AuthSignInRouteImport } from './routes/auth.sign-in'
16
- import { Route as screensPlatformIndexRouteImport } from './routes/(screens)/platform.index'
17
- import { Route as screensPlatformSplatRouteImport } from './routes/(screens)/platform.$'
18
-
19
- const UnauthorizedRoute = UnauthorizedRouteImport.update({
20
- id: '/unauthorized',
21
- path: '/unauthorized',
22
- getParentRoute: () => rootRouteImport,
23
- } as any)
24
- const screensPlatformRoute = screensPlatformRouteImport.update({
25
- id: '/(screens)/platform',
26
- path: '/platform',
27
- getParentRoute: () => rootRouteImport,
28
- } as any)
29
- const ApiSplatRoute = ApiSplatRouteImport.update({
30
- id: '/api/$',
31
- path: '/api/$',
32
- getParentRoute: () => rootRouteImport,
33
- } as any)
34
- const AuthSignInRoute = AuthSignInRouteImport.update({
35
- id: '/auth/sign-in',
36
- path: '/auth/sign-in',
37
- getParentRoute: () => rootRouteImport,
38
- } as any)
39
- const screensPlatformIndexRoute = screensPlatformIndexRouteImport.update({
40
- id: '/',
41
- path: '/',
42
- getParentRoute: () => screensPlatformRoute,
43
- } as any)
44
- const screensPlatformSplatRoute = screensPlatformSplatRouteImport.update({
45
- id: '/$',
46
- path: '/$',
47
- getParentRoute: () => screensPlatformRoute,
48
- } as any)
49
-
50
- export interface FileRoutesByFullPath {
51
- '/unauthorized': typeof UnauthorizedRoute
52
- '/platform': typeof screensPlatformRouteWithChildren
53
- '/api/$': typeof ApiSplatRoute
54
- '/auth/sign-in': typeof AuthSignInRoute
55
- '/platform/$': typeof screensPlatformSplatRoute
56
- '/platform/': typeof screensPlatformIndexRoute
57
- }
58
- export interface FileRoutesByTo {
59
- '/unauthorized': typeof UnauthorizedRoute
60
- '/api/$': typeof ApiSplatRoute
61
- '/auth/sign-in': typeof AuthSignInRoute
62
- '/platform/$': typeof screensPlatformSplatRoute
63
- '/platform': typeof screensPlatformIndexRoute
64
- }
65
- export interface FileRoutesById {
66
- __root__: typeof rootRouteImport
67
- '/unauthorized': typeof UnauthorizedRoute
68
- '/(screens)/platform': typeof screensPlatformRouteWithChildren
69
- '/api/$': typeof ApiSplatRoute
70
- '/auth/sign-in': typeof AuthSignInRoute
71
- '/(screens)/platform/$': typeof screensPlatformSplatRoute
72
- '/(screens)/platform/': typeof screensPlatformIndexRoute
73
- }
74
- export interface FileRouteTypes {
75
- fileRoutesByFullPath: FileRoutesByFullPath
76
- fullPaths:
77
- | '/unauthorized'
78
- | '/platform'
79
- | '/api/$'
80
- | '/auth/sign-in'
81
- | '/platform/$'
82
- | '/platform/'
83
- fileRoutesByTo: FileRoutesByTo
84
- to: '/unauthorized' | '/api/$' | '/auth/sign-in' | '/platform/$' | '/platform'
85
- id:
86
- | '__root__'
87
- | '/unauthorized'
88
- | '/(screens)/platform'
89
- | '/api/$'
90
- | '/auth/sign-in'
91
- | '/(screens)/platform/$'
92
- | '/(screens)/platform/'
93
- fileRoutesById: FileRoutesById
94
- }
95
- export interface RootRouteChildren {
96
- UnauthorizedRoute: typeof UnauthorizedRoute
97
- screensPlatformRoute: typeof screensPlatformRouteWithChildren
98
- ApiSplatRoute: typeof ApiSplatRoute
99
- AuthSignInRoute: typeof AuthSignInRoute
100
- }
101
-
102
- declare module '@tanstack/react-router' {
103
- interface FileRoutesByPath {
104
- '/unauthorized': {
105
- id: '/unauthorized'
106
- path: '/unauthorized'
107
- fullPath: '/unauthorized'
108
- preLoaderRoute: typeof UnauthorizedRouteImport
109
- parentRoute: typeof rootRouteImport
110
- }
111
- '/(screens)/platform': {
112
- id: '/(screens)/platform'
113
- path: '/platform'
114
- fullPath: '/platform'
115
- preLoaderRoute: typeof screensPlatformRouteImport
116
- parentRoute: typeof rootRouteImport
117
- }
118
- '/api/$': {
119
- id: '/api/$'
120
- path: '/api/$'
121
- fullPath: '/api/$'
122
- preLoaderRoute: typeof ApiSplatRouteImport
123
- parentRoute: typeof rootRouteImport
124
- }
125
- '/auth/sign-in': {
126
- id: '/auth/sign-in'
127
- path: '/auth/sign-in'
128
- fullPath: '/auth/sign-in'
129
- preLoaderRoute: typeof AuthSignInRouteImport
130
- parentRoute: typeof rootRouteImport
131
- }
132
- '/(screens)/platform/': {
133
- id: '/(screens)/platform/'
134
- path: '/'
135
- fullPath: '/platform/'
136
- preLoaderRoute: typeof screensPlatformIndexRouteImport
137
- parentRoute: typeof screensPlatformRoute
138
- }
139
- '/(screens)/platform/$': {
140
- id: '/(screens)/platform/$'
141
- path: '/$'
142
- fullPath: '/platform/$'
143
- preLoaderRoute: typeof screensPlatformSplatRouteImport
144
- parentRoute: typeof screensPlatformRoute
145
- }
146
- }
147
- }
148
-
149
- interface screensPlatformRouteChildren {
150
- screensPlatformSplatRoute: typeof screensPlatformSplatRoute
151
- screensPlatformIndexRoute: typeof screensPlatformIndexRoute
152
- }
153
-
154
- const screensPlatformRouteChildren: screensPlatformRouteChildren = {
155
- screensPlatformSplatRoute: screensPlatformSplatRoute,
156
- screensPlatformIndexRoute: screensPlatformIndexRoute,
157
- }
158
-
159
- const screensPlatformRouteWithChildren = screensPlatformRoute._addFileChildren(
160
- screensPlatformRouteChildren,
161
- )
162
-
163
- const rootRouteChildren: RootRouteChildren = {
164
- UnauthorizedRoute: UnauthorizedRoute,
165
- screensPlatformRoute: screensPlatformRouteWithChildren,
166
- ApiSplatRoute: ApiSplatRoute,
167
- AuthSignInRoute: AuthSignInRoute,
168
- }
169
- export const routeTree = rootRouteImport
170
- ._addFileChildren(rootRouteChildren)
171
- ._addFileTypes<FileRouteTypes>()
172
-
173
- import type { getRouter } from './router.tsx'
174
- import type { startInstance } from './start.ts'
175
- declare module '@tanstack/react-start' {
176
- interface Register {
177
- ssr: true
178
- router: Awaited<ReturnType<typeof getRouter>>
179
- config: Awaited<ReturnType<typeof startInstance.getOptions>>
180
- }
181
- }
@@ -1,7 +0,0 @@
1
- import { createRouter } from '@tanstack/react-router'
2
- import { routeTree } from './routeTree.gen'
3
- import { flatSearch } from './screen-list.tsx'
4
-
5
- // routeTree.gen.ts is committed: a clean checkout has to typecheck before any build.
6
- // The search stays the URL's own pairs, one string each; a screen's list keeps its `qs` URL there.
7
- export const getRouter = () => createRouter({ routeTree, scrollRestoration: true, ...flatSearch })
@@ -1,4 +0,0 @@
1
- // Written by `mithaq generate screens`. Do not edit.
2
- /// <reference types="vite/client" />
3
- // Every file the `platform` screen's references name, each loaded when a page draws it.
4
- export const files = import.meta.glob(['./src/courses/ui/fee-cell.tsx', './src/enrollments/ui/session-cell.tsx', './src/roles/ui/roles.tsx', './src/ui-dashboard/theme-provider.tsx', './src/ui-platform/home.tsx', './src/ui-platform/organization-actions.tsx', './src/ui-platform/record-page.tsx', './src/ui-platform/role-cells.tsx', './src/ui-platform/user-actions.tsx', './src/ui/app-shell.tsx', './src/ui/rich-text-nodes.tsx', './src/ui/session-labels.tsx', './src/ui/table-page.tsx'], { base: '/node_modules/asas/', exhaustive: true })
@@ -1,30 +0,0 @@
1
- import { createFileRoute } from '@tanstack/react-router'
2
- // Loads the types of the `server` route option; erased at build.
3
- import type {} from '@tanstack/start-client-core'
4
- import { asas } from 'asas'
5
-
6
- // The platform reads every organization: a read of a kayan asks `tenant: 'all'`, which the runner
7
- // grants platform staff in this app alone and refuses anyone else. A global is one organization's row
8
- // and asks for none.
9
- const reads = new Set(asas.operations.filter((one) => one.effect === 'read' && !one.single).map((one) => `/api/${one.kayan}/${one.name}`))
10
-
11
- const acrossTenants = async (request: Request) => {
12
- const url = new URL(request.url)
13
- if (!reads.has(url.pathname)) return request
14
- url.searchParams.set('tenant', 'all')
15
- const body = request.method === 'GET' || request.method === 'HEAD' ? undefined : await request.text()
16
- return new Request(url, { method: request.method, headers: request.headers, body })
17
- }
18
-
19
- // A write whose `Origin` is not this app's own is refused: the data plug checks no origin and leans on
20
- // the session cookie's `SameSite=Lax`, which a sibling origin of the same site passes.
21
- export const Route = createFileRoute('/api/$')({
22
- server: {
23
- handlers: {
24
- ANY: async ({ request }) =>
25
- request.method === 'GET' || request.method === 'HEAD' || request.headers.get('origin') === new URL(request.url).origin
26
- ? asas.handler(await acrossTenants(request))
27
- : new Response('Forbidden', { status: 403 }),
28
- },
29
- },
30
- })
@@ -1,20 +0,0 @@
1
- import handler, { createServerEntry } from '@tanstack/react-start/server-entry'
2
- import { withQuietAbort } from '../../asas-tanstack/src/quiet-abort.ts'
3
-
4
- // A refused start (a migration not applied) exits 1 rather than leave a server up that cannot serve.
5
- const { env } = process
6
- if (env.NODE_ENV === 'production') {
7
- await (await import('asas')).asas.connect().catch((error: unknown) => {
8
- console.error(error)
9
- process.exit(1)
10
- })
11
- }
12
-
13
- // Every request runs as the platform; nothing a request carries decides it, and the tenant app never does.
14
- // `asas` is imported per request so it is the same module every route reads.
15
- export default createServerEntry({
16
- fetch: async (request: Request) => {
17
- const { asPlatform } = await import('asas')
18
- return asPlatform(() => handler.fetch(withQuietAbort(request)))
19
- },
20
- })
@@ -1,112 +0,0 @@
1
- import { useSyncExternalStore, type ReactNode } from 'react'
2
- import type { ClientField, ClientKayan } from 'mithaq/admin'
3
- import { formatDate, listed, noValue, type Translate } from './controls.tsx'
4
- import { RelationshipCell, type RelationshipTitles } from './relationship-cell.tsx'
5
- import { UploadCell } from './upload.tsx'
6
-
7
- // The server does not know the viewer's zone, so it and the hydrating render draw the day in UTC
8
- // and the mounted client swaps in the moment; drawing both in a zone would be a hydration mismatch.
9
- function Moment({ value, locale }: { value: unknown; locale: string }): ReactNode {
10
- const mounted = useSyncExternalStore(() => () => {}, () => true, () => false)
11
- const text = formatDate({ value, locale, day: !mounted })
12
- return text === undefined ? plain(value) : <time dateTime={new Date(value as string).toISOString()} suppressHydrationWarning>{text}</time>
13
- }
14
-
15
- /** What every cell is handed. The locale is the browser's; `t` is here because a cell that renders a word rather than the value is rendering the project's copy. */
16
- export type CellProps = {
17
- kayan: ClientKayan
18
- field: ClientField
19
- value: unknown
20
- t: Translate
21
- locale: string
22
- /**
23
- * The titles of the rows the relationship columns point at, read once per page. Absent on a
24
- * server render, where every relationship cell reads as loading; no cell shows the id it holds.
25
- */
26
- titles?: RelationshipTitles
27
- }
28
-
29
- const plain = (value: unknown) => (value === null || value === undefined ? '' : String(value))
30
-
31
- const worded = (field: ClientField, value: unknown, locale: string) => {
32
- const held = field.rules.localized === true && value && typeof value === 'object' ? (value as Record<string, unknown>)[locale] : value
33
- return field.options?.find((one) => one.value === held)?.label[locale] ?? plain(held)
34
- }
35
-
36
- /** The text a reader sees in a rich text value, a block to a line. Lives here, not beside the editor, so lists read it without loading Lexical. */
37
- export const richTextPlainText = (node: unknown, depth = 64): string => {
38
- // A stored value nested past the bound ends in an ellipsis rather than overflowing the stack.
39
- if (depth <= 0) return '…'
40
- if (!node || typeof node !== 'object') return ''
41
- const held = node as { root?: unknown; type?: unknown; text?: unknown; children?: unknown }
42
- if (held.root) return richTextPlainText(held.root, depth - 1)
43
- if (held.type === 'linebreak') return '\n'
44
- const children: unknown[] = Array.isArray(held.children) ? held.children : []
45
- const inner = children.map((child) => richTextPlainText(child, depth - 1)).join(children.some((child) => typeof (child as { text?: unknown } | null)?.text === 'string') ? '' : '\n')
46
- return (typeof held.text === 'string' ? held.text : '') + inner
47
- }
48
-
49
- /** The blocks of a rich text value: its root's children, or the value itself where it holds none. */
50
- export const blocksOf = (value: unknown): unknown[] => {
51
- const root = (value as { root?: unknown } | null)?.root ?? value
52
- return Array.isArray((root as { children?: unknown } | null)?.children) ? (root as { children: unknown[] }).children : [root]
53
- }
54
-
55
- const lineLength = 120
56
-
57
- /** The words of a rich text value's first non-empty block on one line, cut at 120 characters with an ellipsis. */
58
- export const richTextLine = (value: unknown): string => {
59
- const first = blocksOf(value).map((block) => richTextPlainText(block).replace(/\s+/g, ' ').trim()).find(Boolean) ?? ''
60
- const characters = Array.from(first)
61
- return characters.length > lineLength ? `${characters.slice(0, lineLength).join('').trimEnd()}…` : characters.join('')
62
- }
63
-
64
- /** One cell per shipped kind, keyed by the kind's own name. */
65
- export const cells: Record<string, (props: CellProps) => ReactNode> = {
66
- text: ({ field, value, locale }) => worded(field, value, locale),
67
- email: ({ value }) =>
68
- value ? (
69
- <a href={`mailto:${String(value)}`} className="underline underline-offset-2">
70
- {String(value)}
71
- </a>
72
- ) : (
73
- ''
74
- ),
75
- number: ({ value, locale }) => (typeof value === 'number' ? value.toLocaleString(locale) : plain(value)),
76
- integer: (props) => cells.number!(props),
77
- // Exact text: a JS double would lose digits.
78
- decimal: ({ field, value, locale }) => worded(field, value, locale),
79
- // The glyph is aria-hidden, so the sr-only word is what a screen reader gets. The words are keyed per field because `true` means different things on `archived` and `published`.
80
- checkbox: ({ kayan, field, value, t }) => (
81
- <>
82
- <span aria-hidden className="tabular-nums">
83
- {value === true ? '✓' : value === false ? '✗' : '—'}
84
- </span>
85
- <span className="sr-only">
86
- {value === true
87
- ? (t(`${kayan.name}.${field.name}.true`) ?? t('admin.yes', 'Yes') ?? 'Yes')
88
- : (t(`${kayan.name}.${field.name}.false`) ?? t('admin.no', 'No') ?? 'No')}
89
- </span>
90
- </>
91
- ),
92
- datetime: ({ value, locale }) => <Moment value={value} locale={locale} />,
93
- date: ({ value, locale }) => formatDate({ value, locale, day: true }) ?? plain(value),
94
- textArray: ({ field, value, locale }) => (Array.isArray(value) ? listed(value.map((one) => worded(field, one, locale)), locale) : plain(value)),
95
- uuid: ({ value }) => <span className="font-mono text-xs">{plain(value)}</span>,
96
- relationship: RelationshipCell,
97
- upload: UploadCell,
98
- // Nothing where the read carried no join: an absent key means the read did not ask, an empty array means no children, and a count of zero would say both.
99
- join: ({ value, locale }) => (Array.isArray(value) ? value.length.toLocaleString(locale) : ''),
100
- // min-w-48 keeps a phone-width table from squeezing the words to one per line.
101
- richText: ({ value }) => {
102
- const line = richTextLine(value)
103
- return line ? <span dir="auto" className="line-clamp-2 min-w-48 whitespace-normal">{line}</span> : noValue
104
- },
105
- }
106
- // No prototype, so a kind named `constructor` never resolves to an inherited property.
107
- Object.setPrototypeOf(cells, null)
108
-
109
- /** The cell for a field, first match wins: the list column's named cell, the field's own cell, the kind's cell, then plain text. */
110
- export const cellFor = (field: ClientField, column?: string): ((props: CellProps) => ReactNode) =>
111
- cells[column ?? ''] ?? cells[field.cell] ?? cells[field.kind] ?? cells.text!
112
- // mithaq-admin b06d8d335d306c07556f8f2b81fba20ba7ded198 95340e7fd65595abe95ca51f11ac4b6f98a69775637a46591d6aa053f6aa5f27