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
@@ -4,11 +4,10 @@
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "exports": {
7
- ".": "./src/index.ts",
8
- "./platform-roles": "./src/platform-roles.ts"
7
+ ".": "./index.ts"
9
8
  },
10
9
  "dependencies": {
11
- "better-auth": "1.7.4",
10
+ "@asas/mithaq": "*",
12
11
  "mithaq": "*"
13
12
  }
14
13
  }
@@ -4,5 +4,5 @@
4
4
  // Better Auth alone writes and reads this table, through its own adapter, so
5
5
  // every managed operation on it is refused to every actor. Written out rather
6
6
  // than left to the administrator's default, which a super admin passes in the
7
- // platform app.
8
- export { providerOnly as access } from '../../../tenant-access.ts'
7
+ // backoffice app.
8
+ export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
@@ -4,7 +4,7 @@
4
4
  // `screens`, beside this file, are imported here on the next run. A kayan
5
5
  // built under this one's name elsewhere is refused by every relationship to it.
6
6
  import { defaultFields, defaultOperations } from 'mithaq'
7
- import { defineKayan } from '../../../mithaq.ts'
7
+ import { defineKayan } from '@asas/mithaq'
8
8
  import { user } from './user.ts'
9
9
  import { access } from './account.access.ts'
10
10
 
@@ -17,7 +17,7 @@ export const account = defineKayan({
17
17
  id: { kind: 'text' },
18
18
  accountId: { kind: 'text', rules: { required: true } },
19
19
  providerId: { kind: 'text', rules: { required: true } },
20
- userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, onDelete: 'cascade' } },
20
+ userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, index: true, onDelete: 'cascade' } },
21
21
  accessToken: { kind: 'text' },
22
22
  refreshToken: { kind: 'text' },
23
23
  idToken: { kind: 'text' },
@@ -1,4 +1,4 @@
1
1
  // Better Auth alone writes and reads this table, through its own adapter, so every managed
2
2
  // operation on it is refused to every actor. Written out rather than left to the administrator's
3
3
  // default, which a super admin passes.
4
- export { providerOnly as access } from '../../../tenant-access.ts'
4
+ export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
@@ -4,7 +4,7 @@
4
4
  // `screens`, beside this file, are imported here on the next run. A kayan
5
5
  // built under this one's name elsewhere is refused by every relationship to it.
6
6
  import { defaultFields, defaultOperations } from 'mithaq'
7
- import { defineKayan } from '../../../mithaq.ts'
7
+ import { defineKayan } from '@asas/mithaq'
8
8
  import { organization } from './organization.ts'
9
9
  import { user } from './user.ts'
10
10
  import { access } from './invitation.access.ts'
@@ -16,8 +16,8 @@ export const invitation = defineKayan({
16
16
  fields: {
17
17
  ...defaultFields,
18
18
  id: { kind: 'text' },
19
- organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, onDelete: 'cascade' } },
20
- email: { kind: 'text', rules: { required: true } },
19
+ organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, index: true, onDelete: 'cascade' } },
20
+ email: { kind: 'text', rules: { required: true, index: true } },
21
21
  role: { kind: 'text' },
22
22
  status: { kind: 'text', rules: { required: true } },
23
23
  expiresAt: { kind: 'datetime', rules: { required: true } },
@@ -1,10 +1,10 @@
1
1
  // This project's access for the generated `member` kayan, which `mithaq
2
2
  // generate auth` imports into `./member.ts` because this file sits beside it. A
3
- // platform role reads every organization's members in the platform app, by the
3
+ // backoffice role reads every organization's members in the backoffice app, by the
4
4
  // keys it holds, and no one writes through it. There is no `'*'` row, so a
5
5
  // tenant's actor takes no row here and reads nothing: a tenant lists its
6
6
  // members through the provider's own `list-members`.
7
- import { rows } from '../../../mithaq.ts'
8
- import { platformReads } from '../../../tenant-access.ts'
7
+ import { rows } from '@asas/mithaq'
8
+ import { backofficeReads } from '@asas/mithaq/roles/tenant-access.ts'
9
9
 
10
- export const access = rows(platformReads)
10
+ export const access = rows(backofficeReads)
@@ -1,15 +1,15 @@
1
- // What the platform draws of the generated `member` kayan, which `mithaq
1
+ // What the backoffice draws of the generated `member` kayan, which `mithaq
2
2
  // generate auth` imports into `./member.ts` because this file sits beside it:
3
3
  // every organization's members, each by the person's and the organization's name,
4
4
  // filtered to one organization from that organization's row.
5
- import { platformUi } from '../../../mithaq.ts'
6
- import { appPage } from '../../../pages.ts'
5
+ import { backofficeUi } from '@asas/mithaq'
6
+ import { appPage } from '@asas/mithaq/mithaq/pages.ts'
7
7
 
8
8
  /** The provider's governance role by the project's word for it, never its slug. */
9
- const role = { field: 'role', cell: platformUi('role-cells.tsx#MembershipRole') } as const
9
+ const role = { field: 'role', cell: backofficeUi('role-cells.tsx#MembershipRole') } as const
10
10
 
11
11
  export const screens = {
12
- platform: {
12
+ backoffice: {
13
13
  // A membership's record is titled by its person.
14
14
  useAsTitle: 'userId',
15
15
  pages: {
@@ -4,7 +4,7 @@
4
4
  // `screens`, beside this file, are imported here on the next run. A kayan
5
5
  // built under this one's name elsewhere is refused by every relationship to it.
6
6
  import { defaultFields, defaultOperations } from 'mithaq'
7
- import { defineKayan } from '../../../mithaq.ts'
7
+ import { defineKayan } from '@asas/mithaq'
8
8
  import { organization } from './organization.ts'
9
9
  import { user } from './user.ts'
10
10
  import { access } from './member.access.ts'
@@ -17,9 +17,10 @@ export const member = defineKayan({
17
17
  fields: {
18
18
  ...defaultFields,
19
19
  id: { kind: 'text' },
20
- organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, onDelete: 'cascade' } },
21
- userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, onDelete: 'cascade' } },
20
+ organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, index: true, onDelete: 'cascade' } },
21
+ userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, index: true, onDelete: 'cascade' } },
22
22
  role: { kind: 'text', rules: { required: true } },
23
23
  createdAt: { kind: 'datetime', rules: { required: true } },
24
+ lastSeenAt: { kind: 'datetime' },
24
25
  },
25
26
  })
@@ -4,17 +4,17 @@
4
4
  // in a file every kayan shares.
5
5
  //
6
6
  // An organization is written through no managed operation: Better Auth writes
7
- // it through its own adapter, and the platform renames one through its own route.
7
+ // it through its own adapter, and the backoffice renames one through its own route.
8
8
  // In the tenant app a member reads its active organization, the one every tenant-owned
9
9
  // row belongs to, and by its id and its name alone, so a tenant
10
- // relationship shows a name on the dashboard. In the platform app a
11
- // platform role reads every organization, each column where it holds that
10
+ // relationship shows a name on the dashboard. In the backoffice app a
11
+ // backoffice role reads every organization, each column where it holds that
12
12
  // column's key. The id and the name are held by `namesInTenant` for the
13
13
  // reason `./user.access.ts` gives.
14
- import { rows } from '../../../mithaq.ts'
15
- import { namesInTenant, platformReads, user } from '../../../tenant-access.ts'
14
+ import { rows } from '@asas/mithaq'
15
+ import { namesInTenant, backofficeReads, user } from '@asas/mithaq/roles/tenant-access.ts'
16
16
 
17
17
  export const access = rows(
18
- { '*': { read: { id: { equals: user.activeOrganizationId } } }, ...platformReads },
18
+ { '*': { read: { id: { equals: user.activeOrganizationId } } }, ...backofficeReads },
19
19
  { holds: namesInTenant('organization') },
20
20
  )
@@ -1,21 +1,21 @@
1
1
  // What each screen draws of the generated `organization` kayan, which `mithaq
2
2
  // generate auth` imports into `./organization.ts` because this file sits beside
3
3
  // it, spreading it into the kayan's `targets` after the generated titles of the
4
- // screens it does not name, so the platform's block here is that screen's whole
4
+ // screens it does not name, so the backoffice's block here is that screen's whole
5
5
  // block, its title included, and the dashboard keeps the generated one. The
6
- // platform lists every organization with the registry's list and renames it or
6
+ // backoffice lists every organization with the registry's list and renames it or
7
7
  // opens its members from the slug column.
8
- import { platformUi } from '../../../mithaq.ts'
9
- import { appPage } from '../../../pages.ts'
8
+ import { backofficeUi } from '@asas/mithaq'
9
+ import { appPage } from '@asas/mithaq/mithaq/pages.ts'
10
10
 
11
11
  export const screens = {
12
- platform: {
12
+ backoffice: {
13
13
  useAsTitle: 'name',
14
14
  pages: {
15
15
  list: {
16
16
  path: '/organizations',
17
17
  page: appPage([{ layout: 'table', main: [{ list: {
18
- columns: ['name', { field: 'slug', cell: platformUi('organization-actions.tsx#OrganizationActions') }, 'createdAt'],
18
+ columns: ['name', { field: 'slug', cell: backofficeUi('organization-actions.tsx#OrganizationActions') }, 'createdAt'],
19
19
  filters: ['name', 'slug', 'createdAt'],
20
20
  search: ['name', 'slug'],
21
21
  sort: 'name',
@@ -4,7 +4,7 @@
4
4
  // `screens`, beside this file, are imported here on the next run. A kayan
5
5
  // built under this one's name elsewhere is refused by every relationship to it.
6
6
  import { defaultFields, defaultOperations } from 'mithaq'
7
- import { defineKayan } from '../../../mithaq.ts'
7
+ import { defineKayan } from '@asas/mithaq'
8
8
  import { access } from './organization.access.ts'
9
9
  import { screens } from './organization.screens.ts'
10
10
 
@@ -20,5 +20,6 @@ export const organization = defineKayan({
20
20
  logo: { kind: 'text' },
21
21
  createdAt: { kind: 'datetime', rules: { required: true } },
22
22
  metadata: { kind: 'text' },
23
+ names: { kind: 'text' },
23
24
  },
24
25
  })
@@ -4,5 +4,5 @@
4
4
  // Better Auth alone writes and reads this table, through its own adapter,
5
5
  // so every managed operation on it is refused to every actor. Written out
6
6
  // rather than left to the administrator's default, which a super admin
7
- // passes in the platform app.
8
- export { providerOnly as access } from '../../../tenant-access.ts'
7
+ // passes in the backoffice app.
8
+ export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
@@ -4,7 +4,7 @@
4
4
  // `screens`, beside this file, are imported here on the next run. A kayan
5
5
  // built under this one's name elsewhere is refused by every relationship to it.
6
6
  import { defaultFields, defaultOperations } from 'mithaq'
7
- import { defineKayan } from '../../../mithaq.ts'
7
+ import { defineKayan } from '@asas/mithaq'
8
8
  import { organization } from './organization.ts'
9
9
  import { access } from './organizationRole.access.ts'
10
10
 
@@ -16,8 +16,8 @@ export const organizationRole = defineKayan({
16
16
  fields: {
17
17
  ...defaultFields,
18
18
  id: { kind: 'text' },
19
- organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, onDelete: 'cascade' } },
20
- role: { kind: 'text', rules: { required: true } },
19
+ organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, index: true, onDelete: 'cascade' } },
20
+ role: { kind: 'text', rules: { required: true, index: true } },
21
21
  permission: { kind: 'text', rules: { required: true } },
22
22
  createdAt: { kind: 'datetime', rules: { required: true } },
23
23
  updatedAt: { kind: 'datetime', rules: { nowOnUpdate: true, providedBy: { update: 'application' } } },
@@ -4,5 +4,5 @@
4
4
  // Better Auth alone writes and reads this table, through its own adapter, so
5
5
  // every managed operation on it is refused to every actor. Written out rather
6
6
  // than left to the administrator's default, which a super admin passes in the
7
- // platform app.
8
- export { providerOnly as access } from '../../../tenant-access.ts'
7
+ // backoffice app.
8
+ export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
@@ -4,7 +4,7 @@
4
4
  // `screens`, beside this file, are imported here on the next run. A kayan
5
5
  // built under this one's name elsewhere is refused by every relationship to it.
6
6
  import { defaultFields, defaultOperations } from 'mithaq'
7
- import { defineKayan } from '../../../mithaq.ts'
7
+ import { defineKayan } from '@asas/mithaq'
8
8
  import { user } from './user.ts'
9
9
  import { access } from './session.access.ts'
10
10
 
@@ -21,7 +21,7 @@ export const session = defineKayan({
21
21
  updatedAt: { kind: 'datetime', rules: { required: true, nowOnUpdate: true, providedBy: { update: 'application' } } },
22
22
  ipAddress: { kind: 'text' },
23
23
  userAgent: { kind: 'text' },
24
- userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, onDelete: 'cascade' } },
24
+ userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, index: true, onDelete: 'cascade' } },
25
25
  impersonatedBy: { kind: 'text' },
26
26
  activeOrganizationId: { kind: 'text' },
27
27
  },
@@ -4,26 +4,27 @@
4
4
  // shares.
5
5
  //
6
6
  // A person is written through no managed operation: Better Auth writes it
7
- // through its own adapter. The two sides of the platform line read it
7
+ // through its own adapter. The two sides of the backoffice line read it
8
8
  // differently, and neither row reaches the other's side. In the tenant app a
9
9
  // member reads its active organization's members by their id and their name
10
10
  // alone, so a relationship to a person shows a name in the dashboard's cell and
11
- // picker, and no email, role or ban reaches a tenant. In the platform app a
12
- // platform role reads every person, each column where it holds that column's key.
11
+ // picker, and no email, role or ban reaches a tenant. Which members: all of them
12
+ // to a holder of `member.find`, otherwise itself and its roles' `peopleAudience`. In the backoffice app a
13
+ // backoffice role reads every person, each column where it holds that column's key.
13
14
  //
14
15
  // The id and the name are held by `namesInTenant` rather than by a field list
15
16
  // on the `'*'` row, because every actor with a role takes the `'*'` row, the
16
- // platform's included, and a column one row's list leaves out is hidden
17
+ // backoffice's included, and a column one row's list leaves out is hidden
17
18
  // whatever the other rows say.
18
19
  //
19
20
  // The `'*'` row reads every person, and `membersOf` narrows it to the active
20
21
  // organization's members: a person carries no tenant column, and a row filter
21
22
  // reaches one relationship hop from the kayan's own fields, which `user` has
22
23
  // none of toward `member`.
23
- import { rows, serverTargets } from '../../../mithaq.ts'
24
- import { membersOf, namesInTenant, platformReads } from '../../../tenant-access.ts'
24
+ import { rows, serverTargets } from '@asas/mithaq'
25
+ import { membersOf, namesInTenant, backofficeReads } from '@asas/mithaq/roles/tenant-access.ts'
25
26
 
26
27
  export const access = {
27
- ...rows({ '*': { read: true }, ...platformReads }, { holds: namesInTenant('user') }),
28
+ ...rows({ '*': { read: true }, ...backofficeReads }, { holds: namesInTenant('user') }),
28
29
  read: membersOf(serverTargets.drizzle),
29
30
  }
@@ -1,27 +1,27 @@
1
1
  // What each screen draws of the generated `user` kayan, which `mithaq generate
2
2
  // auth` imports into `./user.ts` because this file sits beside it, spreading it
3
3
  // into the kayan's `targets` after the generated titles of the screens it does
4
- // not name, so the platform's block here is that screen's whole block, its
4
+ // not name, so the backoffice's block here is that screen's whole block, its
5
5
  // title included, and the dashboard keeps the generated one. The dashboard
6
- // titles a person by name for its cells and pickers, and the platform lists
6
+ // titles a person by name for its cells and pickers, and the backoffice lists
7
7
  // every person with the registry's list and acts on each from its row's menu
8
8
  // and its own page.
9
- import { platformUi } from '../../../mithaq.ts'
10
- import { appPage } from '../../../pages.ts'
9
+ import { backofficeUi } from '@asas/mithaq'
10
+ import { appPage } from '@asas/mithaq/mithaq/pages.ts'
11
11
 
12
12
  export const screens = {
13
- platform: {
13
+ backoffice: {
14
14
  useAsTitle: 'name',
15
15
  pages: {
16
16
  list: {
17
17
  path: '/users',
18
18
  page: appPage([{ layout: 'table', main: [{ list: {
19
- columns: ['name', 'email', { field: 'role', cell: platformUi('user-actions.tsx#PlatformRole') }, 'banned', 'createdAt'],
19
+ columns: ['name', 'email', { field: 'role', cell: backofficeUi('user-actions.tsx#BackofficeRole') }, 'banned', 'createdAt'],
20
20
  filters: ['name', 'email', 'role', 'banned', 'createdAt'],
21
21
  search: ['name', 'email'],
22
22
  sort: 'email',
23
23
  // Set role, ban and impersonate, after the row menu's View.
24
- menu: platformUi('user-actions.tsx#UserMenu'),
24
+ menu: backofficeUi('user-actions.tsx#UserMenu'),
25
25
  } }] }]),
26
26
  },
27
27
  // A person's record, which a row opens and which only reads: every
@@ -31,10 +31,10 @@ export const screens = {
31
31
  page: appPage([{
32
32
  layout: 'record',
33
33
  main: [
34
- { component: platformUi('user-actions.tsx#UserButtons') },
34
+ { component: backofficeUi('user-actions.tsx#UserButtons') },
35
35
  { section: 'person', label: { en: 'Person', ar: 'الشخص' }, fields: ['name', 'email', 'emailVerified', 'image'] },
36
36
  // The role by its label, where the column holds the slugs.
37
- { section: 'standing', label: { en: 'Standing on the platform', ar: 'الوضع في المنصة' }, fields: [{ field: 'role', cell: platformUi('user-actions.tsx#PlatformRole') }, 'banned', 'banReason', 'banExpires'] },
37
+ { section: 'standing', label: { en: 'Standing in the backoffice', ar: 'الوضع في لوحة الإدارة الخلفية' }, fields: [{ field: 'role', cell: backofficeUi('user-actions.tsx#BackofficeRole') }, 'banned', 'banReason', 'banExpires'] },
38
38
  ],
39
39
  // No id: a person reads the record by its name, and the address bar holds the id.
40
40
  side: [{ section: 'record', label: { en: 'Record', ar: 'السجل' }, fields: ['createdAt', 'updatedAt'] }],
@@ -4,8 +4,8 @@
4
4
  // `screens`, beside this file, are imported here on the next run. A kayan
5
5
  // built under this one's name elsewhere is refused by every relationship to it.
6
6
  import { betterAuth, defaultFields, defaultOperations } from 'mithaq'
7
- import { defineKayan } from '../../../mithaq.ts'
8
- import { providers } from '@asas/auth'
7
+ import { defineKayan } from '@asas/mithaq'
8
+ import { providers } from '@asas/mithaq/auth'
9
9
  import { access } from './user.access.ts'
10
10
  import { screens } from './user.screens.ts'
11
11
 
@@ -4,5 +4,5 @@
4
4
  // Better Auth alone writes and reads this table, through its own adapter, so
5
5
  // every managed operation on it is refused to every actor. Written out rather
6
6
  // than left to the administrator's default, which a super admin passes in the
7
- // platform app.
8
- export { providerOnly as access } from '../../../tenant-access.ts'
7
+ // backoffice app.
8
+ export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
@@ -4,7 +4,7 @@
4
4
  // `screens`, beside this file, are imported here on the next run. A kayan
5
5
  // built under this one's name elsewhere is refused by every relationship to it.
6
6
  import { defaultFields, defaultOperations } from 'mithaq'
7
- import { defineKayan } from '../../../mithaq.ts'
7
+ import { defineKayan } from '@asas/mithaq'
8
8
  import { access } from './verification.access.ts'
9
9
 
10
10
  export const verification = defineKayan({
@@ -14,7 +14,7 @@ export const verification = defineKayan({
14
14
  fields: {
15
15
  ...defaultFields,
16
16
  id: { kind: 'text' },
17
- identifier: { kind: 'text', rules: { required: true } },
17
+ identifier: { kind: 'text', rules: { required: true, index: true } },
18
18
  value: { kind: 'text', rules: { required: true } },
19
19
  expiresAt: { kind: 'datetime', rules: { required: true } },
20
20
  createdAt: { kind: 'datetime', rules: { required: true } },