create-mithaq 0.0.0-stage → 0.1.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 (357) hide show
  1. package/LICENSE +22 -0
  2. package/LICENSES/payload.txt +22 -0
  3. package/LICENSES/ponytail.txt +21 -0
  4. package/index.js +127 -0
  5. package/package.json +19 -4
  6. package/template/apps/asas-platform/components.json +25 -0
  7. package/template/apps/asas-platform/gitignore +3 -0
  8. package/template/apps/asas-platform/package.json +55 -0
  9. package/template/apps/asas-platform/public/favicon.svg +1 -0
  10. package/template/apps/asas-platform/src/api.ts +147 -0
  11. package/template/apps/asas-platform/src/auth-frame.tsx +150 -0
  12. package/template/apps/asas-platform/src/components/mithaq/cells.tsx +112 -0
  13. package/template/apps/asas-platform/src/components/mithaq/controls.tsx +650 -0
  14. package/template/apps/asas-platform/src/components/mithaq/field-shell.tsx +53 -0
  15. package/template/apps/asas-platform/src/components/mithaq/filter-operators.ts +108 -0
  16. package/template/apps/asas-platform/src/components/mithaq/form.tsx +1467 -0
  17. package/template/apps/asas-platform/src/components/mithaq/list-columns.tsx +108 -0
  18. package/template/apps/asas-platform/src/components/mithaq/list-filters.tsx +368 -0
  19. package/template/apps/asas-platform/src/components/mithaq/list-pagination.tsx +153 -0
  20. package/template/apps/asas-platform/src/components/mithaq/list-query.ts +432 -0
  21. package/template/apps/asas-platform/src/components/mithaq/list-selection.tsx +74 -0
  22. package/template/apps/asas-platform/src/components/mithaq/list.tsx +865 -0
  23. package/template/apps/asas-platform/src/components/mithaq/nav.tsx +871 -0
  24. package/template/apps/asas-platform/src/components/mithaq/nodes.tsx +1024 -0
  25. package/template/apps/asas-platform/src/components/mithaq/relationship-cell.tsx +127 -0
  26. package/template/apps/asas-platform/src/components/mithaq/relationship-control.tsx +400 -0
  27. package/template/apps/asas-platform/src/components/mithaq/rich-text-nodes.ts +6 -0
  28. package/template/apps/asas-platform/src/components/mithaq/rich-text.tsx +1083 -0
  29. package/template/apps/asas-platform/src/components/mithaq/upload.tsx +686 -0
  30. package/template/apps/asas-platform/src/components/ui/accordion.tsx +74 -0
  31. package/template/apps/asas-platform/src/components/ui/alert-dialog.tsx +185 -0
  32. package/template/apps/asas-platform/src/components/ui/avatar.tsx +106 -0
  33. package/template/apps/asas-platform/src/components/ui/badge.tsx +48 -0
  34. package/template/apps/asas-platform/src/components/ui/breadcrumb.tsx +124 -0
  35. package/template/apps/asas-platform/src/components/ui/button-group.tsx +87 -0
  36. package/template/apps/asas-platform/src/components/ui/button.tsx +55 -0
  37. package/template/apps/asas-platform/src/components/ui/calendar.tsx +223 -0
  38. package/template/apps/asas-platform/src/components/ui/card.tsx +102 -0
  39. package/template/apps/asas-platform/src/components/ui/chart.tsx +371 -0
  40. package/template/apps/asas-platform/src/components/ui/checkbox.tsx +28 -0
  41. package/template/apps/asas-platform/src/components/ui/collapsible.tsx +19 -0
  42. package/template/apps/asas-platform/src/components/ui/combobox.tsx +308 -0
  43. package/template/apps/asas-platform/src/components/ui/dialog.tsx +158 -0
  44. package/template/apps/asas-platform/src/components/ui/direction.tsx +6 -0
  45. package/template/apps/asas-platform/src/components/ui/directional-icon.tsx +20 -0
  46. package/template/apps/asas-platform/src/components/ui/drawer.tsx +216 -0
  47. package/template/apps/asas-platform/src/components/ui/dropdown-menu.tsx +267 -0
  48. package/template/apps/asas-platform/src/components/ui/field.tsx +236 -0
  49. package/template/apps/asas-platform/src/components/ui/input-group.tsx +155 -0
  50. package/template/apps/asas-platform/src/components/ui/input-otp.tsx +84 -0
  51. package/template/apps/asas-platform/src/components/ui/input.tsx +19 -0
  52. package/template/apps/asas-platform/src/components/ui/label.tsx +19 -0
  53. package/template/apps/asas-platform/src/components/ui/popover.tsx +90 -0
  54. package/template/apps/asas-platform/src/components/ui/radio-group.tsx +37 -0
  55. package/template/apps/asas-platform/src/components/ui/resizable.tsx +47 -0
  56. package/template/apps/asas-platform/src/components/ui/scroll-area.tsx +54 -0
  57. package/template/apps/asas-platform/src/components/ui/select.tsx +204 -0
  58. package/template/apps/asas-platform/src/components/ui/separator.tsx +24 -0
  59. package/template/apps/asas-platform/src/components/ui/sheet.tsx +139 -0
  60. package/template/apps/asas-platform/src/components/ui/sidebar.tsx +714 -0
  61. package/template/apps/asas-platform/src/components/ui/skeleton.tsx +13 -0
  62. package/template/apps/asas-platform/src/components/ui/slider.tsx +55 -0
  63. package/template/apps/asas-platform/src/components/ui/spinner.tsx +10 -0
  64. package/template/apps/asas-platform/src/components/ui/switch.tsx +29 -0
  65. package/template/apps/asas-platform/src/components/ui/table.tsx +115 -0
  66. package/template/apps/asas-platform/src/components/ui/tabs.tsx +79 -0
  67. package/template/apps/asas-platform/src/components/ui/textarea.tsx +17 -0
  68. package/template/apps/asas-platform/src/components/ui/toggle-group.tsx +89 -0
  69. package/template/apps/asas-platform/src/components/ui/toggle.tsx +44 -0
  70. package/template/apps/asas-platform/src/components/ui/tooltip.tsx +63 -0
  71. package/template/apps/asas-platform/src/copy.ts +1 -0
  72. package/template/apps/asas-platform/src/hooks/use-mobile.ts +19 -0
  73. package/template/apps/asas-platform/src/lib/utils.ts +1 -0
  74. package/template/apps/asas-platform/src/links.ts +38 -0
  75. package/template/apps/asas-platform/src/locale-switch.tsx +26 -0
  76. package/template/apps/asas-platform/src/redirect.ts +1 -0
  77. package/template/apps/asas-platform/src/request-headers.ts +11 -0
  78. package/template/apps/asas-platform/src/routeTree.gen.ts +181 -0
  79. package/template/apps/asas-platform/src/router.tsx +7 -0
  80. package/template/apps/asas-platform/src/routes/(screens)/platform/files.ts +4 -0
  81. package/template/apps/asas-platform/src/routes/(screens)/platform/screen.json +3609 -0
  82. package/template/apps/asas-platform/src/routes/(screens)/platform/types.ts +145 -0
  83. package/template/apps/asas-platform/src/routes/(screens)/platform.$.tsx +17 -0
  84. package/template/apps/asas-platform/src/routes/(screens)/platform.index.tsx +10 -0
  85. package/template/apps/asas-platform/src/routes/(screens)/platform.tsx +13 -0
  86. package/template/apps/asas-platform/src/routes/__root.tsx +95 -0
  87. package/template/apps/asas-platform/src/routes/api/$.ts +30 -0
  88. package/template/apps/asas-platform/src/routes/auth.sign-in.tsx +72 -0
  89. package/template/apps/asas-platform/src/routes/unauthorized.tsx +122 -0
  90. package/template/apps/asas-platform/src/screen-form.tsx +34 -0
  91. package/template/apps/asas-platform/src/screen-list.tsx +139 -0
  92. package/template/apps/asas-platform/src/screen-names.ts +10 -0
  93. package/template/apps/asas-platform/src/screens.tsx +868 -0
  94. package/template/apps/asas-platform/src/server.ts +20 -0
  95. package/template/apps/asas-platform/src/slide.ts +22 -0
  96. package/template/apps/asas-platform/src/start.ts +42 -0
  97. package/template/apps/asas-platform/src/styles.css +200 -0
  98. package/template/apps/asas-platform/src/theme.ts +2 -0
  99. package/template/apps/asas-platform/tsconfig.json +19 -0
  100. package/template/apps/asas-platform/vite.config.ts +26 -0
  101. package/template/apps/asas-tanstack/components.json +25 -0
  102. package/template/apps/asas-tanstack/gitignore +3 -0
  103. package/template/apps/asas-tanstack/package.json +56 -0
  104. package/template/apps/asas-tanstack/public/favicon.svg +1 -0
  105. package/template/apps/asas-tanstack/src/api.ts +147 -0
  106. package/template/apps/asas-tanstack/src/auth-frame.tsx +150 -0
  107. package/template/apps/asas-tanstack/src/components/mithaq/cells.tsx +112 -0
  108. package/template/apps/asas-tanstack/src/components/mithaq/controls.tsx +650 -0
  109. package/template/apps/asas-tanstack/src/components/mithaq/field-shell.tsx +53 -0
  110. package/template/apps/asas-tanstack/src/components/mithaq/filter-operators.ts +108 -0
  111. package/template/apps/asas-tanstack/src/components/mithaq/form.tsx +1467 -0
  112. package/template/apps/asas-tanstack/src/components/mithaq/list-columns.tsx +108 -0
  113. package/template/apps/asas-tanstack/src/components/mithaq/list-filters.tsx +368 -0
  114. package/template/apps/asas-tanstack/src/components/mithaq/list-pagination.tsx +153 -0
  115. package/template/apps/asas-tanstack/src/components/mithaq/list-query.ts +432 -0
  116. package/template/apps/asas-tanstack/src/components/mithaq/list-selection.tsx +74 -0
  117. package/template/apps/asas-tanstack/src/components/mithaq/list.tsx +865 -0
  118. package/template/apps/asas-tanstack/src/components/mithaq/nav.tsx +871 -0
  119. package/template/apps/asas-tanstack/src/components/mithaq/nodes.tsx +1024 -0
  120. package/template/apps/asas-tanstack/src/components/mithaq/relationship-cell.tsx +127 -0
  121. package/template/apps/asas-tanstack/src/components/mithaq/relationship-control.tsx +400 -0
  122. package/template/apps/asas-tanstack/src/components/mithaq/rich-text-nodes.ts +6 -0
  123. package/template/apps/asas-tanstack/src/components/mithaq/rich-text.tsx +1083 -0
  124. package/template/apps/asas-tanstack/src/components/mithaq/upload.tsx +686 -0
  125. package/template/apps/asas-tanstack/src/components/ui/accordion.tsx +10 -0
  126. package/template/apps/asas-tanstack/src/components/ui/alert-dialog.tsx +173 -0
  127. package/template/apps/asas-tanstack/src/components/ui/avatar.tsx +104 -0
  128. package/template/apps/asas-tanstack/src/components/ui/badge.tsx +48 -0
  129. package/template/apps/asas-tanstack/src/components/ui/breadcrumb.tsx +125 -0
  130. package/template/apps/asas-tanstack/src/components/ui/button-group.tsx +87 -0
  131. package/template/apps/asas-tanstack/src/components/ui/button.tsx +56 -0
  132. package/template/apps/asas-tanstack/src/components/ui/calendar.tsx +223 -0
  133. package/template/apps/asas-tanstack/src/components/ui/card.tsx +94 -0
  134. package/template/apps/asas-tanstack/src/components/ui/chart.tsx +369 -0
  135. package/template/apps/asas-tanstack/src/components/ui/checkbox.tsx +27 -0
  136. package/template/apps/asas-tanstack/src/components/ui/collapsible.tsx +19 -0
  137. package/template/apps/asas-tanstack/src/components/ui/combobox.tsx +300 -0
  138. package/template/apps/asas-tanstack/src/components/ui/dialog.tsx +149 -0
  139. package/template/apps/asas-tanstack/src/components/ui/direction.tsx +5 -0
  140. package/template/apps/asas-tanstack/src/components/ui/directional-icon.tsx +20 -0
  141. package/template/apps/asas-tanstack/src/components/ui/drawer.tsx +215 -0
  142. package/template/apps/asas-tanstack/src/components/ui/dropdown-menu.tsx +267 -0
  143. package/template/apps/asas-tanstack/src/components/ui/field.tsx +225 -0
  144. package/template/apps/asas-tanstack/src/components/ui/input-group.tsx +147 -0
  145. package/template/apps/asas-tanstack/src/components/ui/input-otp.tsx +20 -0
  146. package/template/apps/asas-tanstack/src/components/ui/input.tsx +20 -0
  147. package/template/apps/asas-tanstack/src/components/ui/label.tsx +18 -0
  148. package/template/apps/asas-tanstack/src/components/ui/popover.tsx +50 -0
  149. package/template/apps/asas-tanstack/src/components/ui/radio-group.tsx +10 -0
  150. package/template/apps/asas-tanstack/src/components/ui/resizable.tsx +47 -0
  151. package/template/apps/asas-tanstack/src/components/ui/scroll-area.tsx +52 -0
  152. package/template/apps/asas-tanstack/src/components/ui/select.tsx +190 -0
  153. package/template/apps/asas-tanstack/src/components/ui/separator.tsx +23 -0
  154. package/template/apps/asas-tanstack/src/components/ui/sheet.tsx +127 -0
  155. package/template/apps/asas-tanstack/src/components/ui/sidebar.tsx +716 -0
  156. package/template/apps/asas-tanstack/src/components/ui/skeleton.tsx +13 -0
  157. package/template/apps/asas-tanstack/src/components/ui/slider.tsx +13 -0
  158. package/template/apps/asas-tanstack/src/components/ui/spinner.tsx +11 -0
  159. package/template/apps/asas-tanstack/src/components/ui/switch.tsx +8 -0
  160. package/template/apps/asas-tanstack/src/components/ui/table.tsx +119 -0
  161. package/template/apps/asas-tanstack/src/components/ui/tabs.tsx +80 -0
  162. package/template/apps/asas-tanstack/src/components/ui/textarea.tsx +18 -0
  163. package/template/apps/asas-tanstack/src/components/ui/toggle-group.tsx +8 -0
  164. package/template/apps/asas-tanstack/src/components/ui/toggle.tsx +44 -0
  165. package/template/apps/asas-tanstack/src/components/ui/tooltip.tsx +68 -0
  166. package/template/apps/asas-tanstack/src/copy.ts +870 -0
  167. package/template/apps/asas-tanstack/src/hooks/use-mobile.ts +19 -0
  168. package/template/apps/asas-tanstack/src/lib/utils.ts +6 -0
  169. package/template/apps/asas-tanstack/src/links.ts +38 -0
  170. package/template/apps/asas-tanstack/src/locale-switch.tsx +26 -0
  171. package/template/apps/asas-tanstack/src/quiet-abort.ts +25 -0
  172. package/template/apps/asas-tanstack/src/redirect.ts +20 -0
  173. package/template/apps/asas-tanstack/src/request-headers.ts +11 -0
  174. package/template/apps/asas-tanstack/src/routeTree.gen.ts +382 -0
  175. package/template/apps/asas-tanstack/src/router.tsx +7 -0
  176. package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/files.ts +4 -0
  177. package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/screen.json +3883 -0
  178. package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/types.ts +158 -0
  179. package/template/apps/asas-tanstack/src/routes/(screens)/dashboard.$.tsx +17 -0
  180. package/template/apps/asas-tanstack/src/routes/(screens)/dashboard.index.tsx +10 -0
  181. package/template/apps/asas-tanstack/src/routes/(screens)/dashboard.tsx +13 -0
  182. package/template/apps/asas-tanstack/src/routes/(screens)/portal/files.ts +4 -0
  183. package/template/apps/asas-tanstack/src/routes/(screens)/portal/screen.json +1800 -0
  184. package/template/apps/asas-tanstack/src/routes/(screens)/portal/types.ts +92 -0
  185. package/template/apps/asas-tanstack/src/routes/(screens)/portal.$.tsx +17 -0
  186. package/template/apps/asas-tanstack/src/routes/(screens)/portal.index.tsx +10 -0
  187. package/template/apps/asas-tanstack/src/routes/(screens)/portal.tsx +13 -0
  188. package/template/apps/asas-tanstack/src/routes/__root.tsx +99 -0
  189. package/template/apps/asas-tanstack/src/routes/api/$.ts +11 -0
  190. package/template/apps/asas-tanstack/src/routes/auth.accept-invitation.tsx +101 -0
  191. package/template/apps/asas-tanstack/src/routes/auth.forgot-password.tsx +94 -0
  192. package/template/apps/asas-tanstack/src/routes/auth.handoff.ts +39 -0
  193. package/template/apps/asas-tanstack/src/routes/auth.reset-password.tsx +109 -0
  194. package/template/apps/asas-tanstack/src/routes/auth.sign-in.tsx +86 -0
  195. package/template/apps/asas-tanstack/src/routes/auth.sign-up.tsx +122 -0
  196. package/template/apps/asas-tanstack/src/routes/index.tsx +142 -0
  197. package/template/apps/asas-tanstack/src/routes/unauthorized.tsx +122 -0
  198. package/template/apps/asas-tanstack/src/screen-form.tsx +34 -0
  199. package/template/apps/asas-tanstack/src/screen-list.tsx +139 -0
  200. package/template/apps/asas-tanstack/src/screen-names.ts +10 -0
  201. package/template/apps/asas-tanstack/src/screens.tsx +868 -0
  202. package/template/apps/asas-tanstack/src/server.ts +16 -0
  203. package/template/apps/asas-tanstack/src/slide.ts +22 -0
  204. package/template/apps/asas-tanstack/src/start.ts +57 -0
  205. package/template/apps/asas-tanstack/src/styles.css +159 -0
  206. package/template/apps/asas-tanstack/src/theme.ts +5 -0
  207. package/template/apps/asas-tanstack/tsconfig.json +19 -0
  208. package/template/apps/asas-tanstack/vite.config.ts +28 -0
  209. package/template/package.json +16 -0
  210. package/template/templates/asas/.env.example +16 -0
  211. package/template/templates/asas/components.json +22 -0
  212. package/template/templates/asas/mithaq.hints.json +25 -0
  213. package/template/templates/asas/package.json +38 -0
  214. package/template/templates/asas/src/asas.ts +93 -0
  215. package/template/templates/asas/src/audit-log/audit-log.ts +187 -0
  216. package/template/templates/asas/src/audit-log/sink.ts +89 -0
  217. package/template/templates/asas/src/audit-log/ui/activity.tsx +243 -0
  218. package/template/templates/asas/src/courses/courses.ts +612 -0
  219. package/template/templates/asas/src/courses/ui/archive-button.tsx +25 -0
  220. package/template/templates/asas/src/courses/ui/fee-cell.tsx +19 -0
  221. package/template/templates/asas/src/courses/ui/no-courses-on-offer.tsx +11 -0
  222. package/template/templates/asas/src/courses/ui/no-courses.tsx +13 -0
  223. package/template/templates/asas/src/courses/ui/on-offer.ts +6 -0
  224. package/template/templates/asas/src/courses/ui/status-cell.tsx +31 -0
  225. package/template/templates/asas/src/enrollments/enrollments.ts +137 -0
  226. package/template/templates/asas/src/enrollments/ui/session-cell.tsx +65 -0
  227. package/template/templates/asas/src/kayan/auth/user/account.access.ts +8 -0
  228. package/template/templates/asas/src/kayan/auth/user/account.ts +31 -0
  229. package/template/templates/asas/src/kayan/auth/user/index.ts +18 -0
  230. package/template/templates/asas/src/kayan/auth/user/invitation.access.ts +4 -0
  231. package/template/templates/asas/src/kayan/auth/user/invitation.ts +27 -0
  232. package/template/templates/asas/src/kayan/auth/user/member.access.ts +10 -0
  233. package/template/templates/asas/src/kayan/auth/user/member.screens.ts +37 -0
  234. package/template/templates/asas/src/kayan/auth/user/member.ts +25 -0
  235. package/template/templates/asas/src/kayan/auth/user/organization.access.ts +20 -0
  236. package/template/templates/asas/src/kayan/auth/user/organization.screens.ts +37 -0
  237. package/template/templates/asas/src/kayan/auth/user/organization.ts +24 -0
  238. package/template/templates/asas/src/kayan/auth/user/organizationRole.access.ts +8 -0
  239. package/template/templates/asas/src/kayan/auth/user/organizationRole.ts +25 -0
  240. package/template/templates/asas/src/kayan/auth/user/session.access.ts +8 -0
  241. package/template/templates/asas/src/kayan/auth/user/session.ts +28 -0
  242. package/template/templates/asas/src/kayan/auth/user/user.access.ts +29 -0
  243. package/template/templates/asas/src/kayan/auth/user/user.screens.ts +45 -0
  244. package/template/templates/asas/src/kayan/auth/user/user.ts +31 -0
  245. package/template/templates/asas/src/kayan/auth/user/verification.access.ts +8 -0
  246. package/template/templates/asas/src/kayan/auth/user/verification.ts +23 -0
  247. package/template/templates/asas/src/local-users/local-users.ts +143 -0
  248. package/template/templates/asas/src/media/media.ts +137 -0
  249. package/template/templates/asas/src/media/ui/preview.tsx +143 -0
  250. package/template/templates/asas/src/member-roles/member-roles.ts +207 -0
  251. package/template/templates/asas/src/messages/account.json +106 -0
  252. package/template/templates/asas/src/messages/auditLog.json +186 -0
  253. package/template/templates/asas/src/messages/courses.json +270 -0
  254. package/template/templates/asas/src/messages/enrollments.json +42 -0
  255. package/template/templates/asas/src/messages/invitation.json +66 -0
  256. package/template/templates/asas/src/messages/localUsers.json +42 -0
  257. package/template/templates/asas/src/messages/media.json +66 -0
  258. package/template/templates/asas/src/messages/member.json +42 -0
  259. package/template/templates/asas/src/messages/memberRoles.json +42 -0
  260. package/template/templates/asas/src/messages/mithaq.json +170 -0
  261. package/template/templates/asas/src/messages/organization.json +50 -0
  262. package/template/templates/asas/src/messages/organizationRole.json +50 -0
  263. package/template/templates/asas/src/messages/roles.json +58 -0
  264. package/template/templates/asas/src/messages/session.json +82 -0
  265. package/template/templates/asas/src/messages/sessions.json +106 -0
  266. package/template/templates/asas/src/messages/settings.json +66 -0
  267. package/template/templates/asas/src/messages/tags.json +38 -0
  268. package/template/templates/asas/src/messages/user.json +90 -0
  269. package/template/templates/asas/src/messages/verification.json +50 -0
  270. package/template/templates/asas/src/migrations/20260920080701_parched_tombstone/migration.sql +177 -0
  271. package/template/templates/asas/src/migrations/20260920080701_parched_tombstone/snapshot.json +2169 -0
  272. package/template/templates/asas/src/migrations/20260920230505_zippy_ben_urich/migration.sql +1 -0
  273. package/template/templates/asas/src/migrations/20260920230505_zippy_ben_urich/snapshot.json +2182 -0
  274. package/template/templates/asas/src/migrations/20260920231219_slim_retro_girl/migration.sql +20 -0
  275. package/template/templates/asas/src/migrations/20260920231219_slim_retro_girl/snapshot.json +2409 -0
  276. package/template/templates/asas/src/migrations/20260922082945_military_ironclad/migration.sql +15 -0
  277. package/template/templates/asas/src/migrations/20260922082945_military_ironclad/snapshot.json +2627 -0
  278. package/template/templates/asas/src/migrations/20260922112630_bitter_chat/migration.sql +5 -0
  279. package/template/templates/asas/src/migrations/20260922112630_bitter_chat/snapshot.json +2691 -0
  280. package/template/templates/asas/src/migrations/20260923235915_foamy_rachel_grey/migration.sql +8 -0
  281. package/template/templates/asas/src/migrations/20260923235915_foamy_rachel_grey/snapshot.json +2795 -0
  282. package/template/templates/asas/src/migrations/20260926145709_clean_the_initiative/migration.sql +3 -0
  283. package/template/templates/asas/src/migrations/20260926145709_clean_the_initiative/snapshot.json +2834 -0
  284. package/template/templates/asas/src/migrations/20260927212525_bent_prowler/migration.sql +9 -0
  285. package/template/templates/asas/src/migrations/20260927212525_bent_prowler/snapshot.json +2870 -0
  286. package/template/templates/asas/src/migrations/20260927223441_tranquil_bromley/migration.sql +1 -0
  287. package/template/templates/asas/src/migrations/20260927223441_tranquil_bromley/snapshot.json +2881 -0
  288. package/template/templates/asas/src/migrations/20260928030047_outgoing_wraith/migration.sql +15 -0
  289. package/template/templates/asas/src/migrations/20260928030047_outgoing_wraith/snapshot.json +3073 -0
  290. package/template/templates/asas/src/migrations/20260929024407_grey_morlun/migration.sql +21 -0
  291. package/template/templates/asas/src/migrations/20260929024407_grey_morlun/snapshot.json +3098 -0
  292. package/template/templates/asas/src/migrations/20260929130530_bored_jackal/migration.sql +21 -0
  293. package/template/templates/asas/src/migrations/20260929130530_bored_jackal/snapshot.json +3124 -0
  294. package/template/templates/asas/src/migrations/20260930102924_material_newton_destine/migration.sql +32 -0
  295. package/template/templates/asas/src/migrations/20260930102924_material_newton_destine/snapshot.json +3324 -0
  296. package/template/templates/asas/src/migrations/20261003022353_clumsy_taskmaster/migration.sql +2 -0
  297. package/template/templates/asas/src/migrations/20261003022353_clumsy_taskmaster/snapshot.json +3350 -0
  298. package/template/templates/asas/src/migrations/20261003143249_premium_red_shift/migration.sql +21 -0
  299. package/template/templates/asas/src/migrations/20261003143249_premium_red_shift/snapshot.json +3635 -0
  300. package/template/templates/asas/src/migrations/20261008215349_square_norrin_radd/migration.sql +8 -0
  301. package/template/templates/asas/src/migrations/20261008215349_square_norrin_radd/snapshot.json +3635 -0
  302. package/template/templates/asas/src/migrations/20261008230204_many_scarecrow/migration.sql +18 -0
  303. package/template/templates/asas/src/migrations/20261008230204_many_scarecrow/snapshot.json +3635 -0
  304. package/template/templates/asas/src/migrations/20261010005521_elite_giant_girl/migration.sql +18 -0
  305. package/template/templates/asas/src/migrations/20261010005521_elite_giant_girl/snapshot.json +3635 -0
  306. package/template/templates/asas/src/migrations/20261010120822_needy_thunderbolt/migration.sql +11 -0
  307. package/template/templates/asas/src/migrations/20261010120822_needy_thunderbolt/snapshot.json +3667 -0
  308. package/template/templates/asas/src/migrations/20261012000752_organization_ownership/migration.sql +48 -0
  309. package/template/templates/asas/src/migrations/20261012000752_organization_ownership/snapshot.json +3891 -0
  310. package/template/templates/asas/src/migrations/drizzle.config.ts +11 -0
  311. package/template/templates/asas/src/migrations/schema.ts +29 -0
  312. package/template/templates/asas/src/mithaq.ts +406 -0
  313. package/template/templates/asas/src/pages.ts +74 -0
  314. package/template/templates/asas/src/platform-http.ts +96 -0
  315. package/template/templates/asas/src/rich-text-nodes.ts +11 -0
  316. package/template/templates/asas/src/roles/grants.ts +47 -0
  317. package/template/templates/asas/src/roles/roles.ts +184 -0
  318. package/template/templates/asas/src/roles/ui/role-form.tsx +226 -0
  319. package/template/templates/asas/src/roles/ui/roles.tsx +166 -0
  320. package/template/templates/asas/src/roles.ts +16 -0
  321. package/template/templates/asas/src/seed.ts +325 -0
  322. package/template/templates/asas/src/sessions/sessions.ts +155 -0
  323. package/template/templates/asas/src/settings/settings.ts +69 -0
  324. package/template/templates/asas/src/statements.ts +11 -0
  325. package/template/templates/asas/src/steps/expected-updated-at.ts +41 -0
  326. package/template/templates/asas/src/storage/defaults.ts +156 -0
  327. package/template/templates/asas/src/storage/index.ts +95 -0
  328. package/template/templates/asas/src/storage/local.ts +143 -0
  329. package/template/templates/asas/src/storage/r2.ts +5 -0
  330. package/template/templates/asas/src/storage/s3.ts +91 -0
  331. package/template/templates/asas/src/storage/uploadthing.ts +59 -0
  332. package/template/templates/asas/src/tags/tags.ts +80 -0
  333. package/template/templates/asas/src/tenant-access.ts +221 -0
  334. package/template/templates/asas/src/tenant-roles.ts +262 -0
  335. package/template/templates/asas/src/ui/app-shell.tsx +260 -0
  336. package/template/templates/asas/src/ui/kpi-card.tsx +25 -0
  337. package/template/templates/asas/src/ui/record-page.tsx +50 -0
  338. package/template/templates/asas/src/ui/rich-text-nodes.tsx +15 -0
  339. package/template/templates/asas/src/ui/screen-nav.tsx +28 -0
  340. package/template/templates/asas/src/ui/session-labels.tsx +36 -0
  341. package/template/templates/asas/src/ui/table-page.tsx +9 -0
  342. package/template/templates/asas/src/ui/top-shell.tsx +60 -0
  343. package/template/templates/asas/src/ui-dashboard/dashboard.tsx +294 -0
  344. package/template/templates/asas/src/ui-dashboard/members.tsx +630 -0
  345. package/template/templates/asas/src/ui-dashboard/theme-provider.tsx +10 -0
  346. package/template/templates/asas/src/ui-dashboard/versions.tsx +432 -0
  347. package/template/templates/asas/src/ui-platform/home.tsx +63 -0
  348. package/template/templates/asas/src/ui-platform/organization-actions.tsx +114 -0
  349. package/template/templates/asas/src/ui-platform/record-page.tsx +30 -0
  350. package/template/templates/asas/src/ui-platform/role-cells.tsx +52 -0
  351. package/template/templates/asas/src/ui-platform/user-actions.tsx +251 -0
  352. package/template/templates/asas/src/ui-portal/home.tsx +77 -0
  353. package/template/templates/asas/src/ui-portal/page.tsx +11 -0
  354. package/template/templates/auth/package.json +14 -0
  355. package/template/templates/auth/src/index.ts +690 -0
  356. package/template/templates/auth/src/platform-roles.ts +87 -0
  357. package/README.md +0 -3
@@ -0,0 +1,1800 @@
1
+ {
2
+ "path": "/portal",
3
+ "providers": [
4
+ "./src/ui/rich-text-nodes.tsx#RichTextNodes",
5
+ "./src/ui/session-labels.tsx#SessionLabels"
6
+ ],
7
+ "pages": {
8
+ "home": {
9
+ "path": "/",
10
+ "component": "./src/ui-portal/home.tsx#Home"
11
+ }
12
+ },
13
+ "nav": [
14
+ {
15
+ "path": "/courses",
16
+ "page": "list",
17
+ "kayan": "courses",
18
+ "permission": "courses.find"
19
+ },
20
+ {
21
+ "path": "/enrollments",
22
+ "page": "list",
23
+ "kayan": "enrollments",
24
+ "permission": "enrollments.find"
25
+ }
26
+ ],
27
+ "layouts": {
28
+ "top": "./src/ui/top-shell.tsx#PortalTopShell",
29
+ "page": "./src/ui-portal/page.tsx#Page",
30
+ "record": "./src/ui/record-page.tsx#RecordPage"
31
+ },
32
+ "components": {
33
+ "archive": "./src/courses/ui/archive-button.tsx#ArchiveButton"
34
+ },
35
+ "controls": {
36
+ "text": {
37
+ "control": "text",
38
+ "cell": "text"
39
+ },
40
+ "email": {
41
+ "control": "email",
42
+ "cell": "email"
43
+ },
44
+ "number": {
45
+ "control": "number",
46
+ "cell": "number"
47
+ },
48
+ "integer": {
49
+ "control": "integer",
50
+ "cell": "integer"
51
+ },
52
+ "decimal": {
53
+ "control": "decimal",
54
+ "cell": "decimal"
55
+ },
56
+ "checkbox": {
57
+ "control": "checkbox",
58
+ "cell": "checkbox"
59
+ },
60
+ "datetime": {
61
+ "control": "datetime",
62
+ "cell": "datetime"
63
+ },
64
+ "date": {
65
+ "control": "date",
66
+ "cell": "date"
67
+ },
68
+ "textArray": {
69
+ "control": "textArray",
70
+ "cell": "textArray"
71
+ },
72
+ "uuid": {
73
+ "control": "uuid",
74
+ "cell": "uuid"
75
+ },
76
+ "relationship": {
77
+ "control": "relationship",
78
+ "cell": "relationship"
79
+ },
80
+ "join": {
81
+ "control": "join",
82
+ "cell": "join"
83
+ },
84
+ "richText": {
85
+ "control": "richText",
86
+ "cell": "richText"
87
+ },
88
+ "upload": {
89
+ "control": "upload",
90
+ "cell": "upload"
91
+ }
92
+ },
93
+ "kayan": {
94
+ "courses": {
95
+ "name": "courses",
96
+ "single": false,
97
+ "fields": [
98
+ {
99
+ "name": "id",
100
+ "kind": "uuid",
101
+ "label": {
102
+ "en": "ID",
103
+ "ar": "المعرف"
104
+ },
105
+ "rules": {
106
+ "required": false
107
+ },
108
+ "component": "uuid",
109
+ "cell": "uuid"
110
+ },
111
+ {
112
+ "name": "updatedAt",
113
+ "kind": "datetime",
114
+ "label": {
115
+ "en": "Updated at",
116
+ "ar": "تاريخ التعديل"
117
+ },
118
+ "rules": {
119
+ "required": true,
120
+ "defaultNow": true,
121
+ "nowOnUpdate": true,
122
+ "providedBy": {
123
+ "create": "application",
124
+ "update": "application"
125
+ }
126
+ },
127
+ "component": "datetime",
128
+ "cell": "datetime"
129
+ },
130
+ {
131
+ "name": "createdAt",
132
+ "kind": "datetime",
133
+ "label": {
134
+ "en": "Created at",
135
+ "ar": "تاريخ الإنشاء"
136
+ },
137
+ "rules": {
138
+ "required": true,
139
+ "defaultNow": true,
140
+ "index": true,
141
+ "providedBy": {
142
+ "create": "application",
143
+ "update": "application"
144
+ }
145
+ },
146
+ "component": "datetime",
147
+ "cell": "datetime"
148
+ },
149
+ {
150
+ "name": "organization",
151
+ "kind": "relationship",
152
+ "label": {
153
+ "en": "Organization",
154
+ "ar": "المؤسسة"
155
+ },
156
+ "rules": {
157
+ "required": true,
158
+ "index": true,
159
+ "providedBy": {
160
+ "create": "application",
161
+ "update": "never"
162
+ },
163
+ "onDelete": "restrict"
164
+ },
165
+ "relationTo": "organization",
166
+ "component": "relationship",
167
+ "cell": "relationship"
168
+ },
169
+ {
170
+ "name": "title",
171
+ "kind": "text",
172
+ "label": {
173
+ "en": "Title",
174
+ "ar": "العنوان"
175
+ },
176
+ "rules": {
177
+ "required": true,
178
+ "trim": true,
179
+ "maxLength": 120,
180
+ "index": true
181
+ },
182
+ "placeholder": {
183
+ "en": "Introduction to Arabic calligraphy",
184
+ "ar": "مقدمة في الخط العربي"
185
+ },
186
+ "prefix": {
187
+ "en": "Course",
188
+ "ar": "دورة"
189
+ },
190
+ "description": {
191
+ "en": "The name a student sees in the catalogue.",
192
+ "ar": "الاسم الذي يراه الطالب في الدليل."
193
+ },
194
+ "component": "text",
195
+ "cell": "text"
196
+ },
197
+ {
198
+ "name": "summary",
199
+ "kind": "text",
200
+ "label": {
201
+ "en": "Summary",
202
+ "ar": "الملخص"
203
+ },
204
+ "rules": {
205
+ "maxLength": 200,
206
+ "required": false
207
+ },
208
+ "component": "text",
209
+ "cell": "text"
210
+ },
211
+ {
212
+ "name": "fee",
213
+ "kind": "number",
214
+ "label": {
215
+ "en": "Fee",
216
+ "ar": "الرسوم"
217
+ },
218
+ "rules": {
219
+ "required": false
220
+ },
221
+ "suffix": {
222
+ "en": "per seat",
223
+ "ar": "لكل مقعد"
224
+ },
225
+ "component": "number",
226
+ "cell": "./src/courses/ui/fee-cell.tsx#FeeCell"
227
+ },
228
+ {
229
+ "name": "currency",
230
+ "kind": "text",
231
+ "label": {
232
+ "en": "Currency",
233
+ "ar": "العملة"
234
+ },
235
+ "rules": {
236
+ "required": false
237
+ },
238
+ "options": [
239
+ {
240
+ "value": "SAR",
241
+ "label": {
242
+ "en": "Saudi riyal",
243
+ "ar": "ريال سعودي"
244
+ }
245
+ },
246
+ {
247
+ "value": "USD",
248
+ "label": {
249
+ "en": "US dollar",
250
+ "ar": "دولار أمريكي"
251
+ }
252
+ }
253
+ ],
254
+ "component": "radio",
255
+ "cell": "text"
256
+ },
257
+ {
258
+ "name": "level",
259
+ "kind": "number",
260
+ "label": {
261
+ "en": "Level",
262
+ "ar": "المستوى"
263
+ },
264
+ "rules": {
265
+ "min": 1,
266
+ "max": 5,
267
+ "required": false
268
+ },
269
+ "component": "number",
270
+ "cell": "number"
271
+ },
272
+ {
273
+ "name": "notifications",
274
+ "kind": "checkbox",
275
+ "label": {
276
+ "en": "Notifications",
277
+ "ar": "الإشعارات"
278
+ },
279
+ "rules": {
280
+ "required": false
281
+ },
282
+ "component": "checkbox",
283
+ "cell": "checkbox"
284
+ },
285
+ {
286
+ "name": "delivery",
287
+ "kind": "text",
288
+ "label": {
289
+ "en": "Delivery",
290
+ "ar": "طريقة التقديم"
291
+ },
292
+ "rules": {
293
+ "required": false
294
+ },
295
+ "options": [
296
+ {
297
+ "value": "live",
298
+ "label": {
299
+ "en": "Live",
300
+ "ar": "مباشر"
301
+ }
302
+ },
303
+ {
304
+ "value": "recorded",
305
+ "label": {
306
+ "en": "Recorded",
307
+ "ar": "مسجل"
308
+ }
309
+ }
310
+ ],
311
+ "component": "radio",
312
+ "cell": "text"
313
+ },
314
+ {
315
+ "name": "audience",
316
+ "kind": "text",
317
+ "label": {
318
+ "en": "Audience",
319
+ "ar": "الجمهور"
320
+ },
321
+ "rules": {
322
+ "required": false
323
+ },
324
+ "options": [
325
+ {
326
+ "value": "beginner",
327
+ "label": {
328
+ "en": "Beginner",
329
+ "ar": "مبتدئ"
330
+ }
331
+ },
332
+ {
333
+ "value": "advanced",
334
+ "label": {
335
+ "en": "Advanced",
336
+ "ar": "متقدم"
337
+ }
338
+ }
339
+ ],
340
+ "component": "text",
341
+ "cell": "text"
342
+ },
343
+ {
344
+ "name": "accessCode",
345
+ "kind": "text",
346
+ "label": {
347
+ "en": "Access code",
348
+ "ar": "رمز الدخول"
349
+ },
350
+ "rules": {
351
+ "maxLength": 6,
352
+ "required": false
353
+ },
354
+ "component": "text",
355
+ "cell": "text"
356
+ },
357
+ {
358
+ "name": "archived",
359
+ "kind": "checkbox",
360
+ "label": {
361
+ "en": "Archived",
362
+ "ar": "مؤرشف"
363
+ },
364
+ "rules": {
365
+ "required": false
366
+ },
367
+ "component": "checkbox",
368
+ "cell": "checkbox"
369
+ },
370
+ {
371
+ "name": "topics",
372
+ "kind": "textArray",
373
+ "label": {
374
+ "en": "Topics",
375
+ "ar": "المواضيع"
376
+ },
377
+ "rules": {
378
+ "maxRows": 2,
379
+ "required": false
380
+ },
381
+ "options": [
382
+ {
383
+ "value": "script",
384
+ "label": {
385
+ "en": "Script",
386
+ "ar": "الخط"
387
+ }
388
+ },
389
+ {
390
+ "value": "grammar",
391
+ "label": {
392
+ "en": "Grammar",
393
+ "ar": "النحو"
394
+ }
395
+ },
396
+ {
397
+ "value": "recitation",
398
+ "label": {
399
+ "en": "Recitation",
400
+ "ar": "التلاوة"
401
+ }
402
+ }
403
+ ],
404
+ "component": "textArray",
405
+ "cell": "textArray"
406
+ },
407
+ {
408
+ "name": "opensOn",
409
+ "kind": "date",
410
+ "label": {
411
+ "en": "Opens on",
412
+ "ar": "يفتح في"
413
+ },
414
+ "rules": {
415
+ "required": false
416
+ },
417
+ "component": "date",
418
+ "cell": "date"
419
+ },
420
+ {
421
+ "name": "archiveReason",
422
+ "kind": "text",
423
+ "label": {
424
+ "en": "Archive reason",
425
+ "ar": "سبب الأرشفة"
426
+ },
427
+ "rules": {
428
+ "maxLength": 200,
429
+ "required": false
430
+ },
431
+ "component": "text",
432
+ "cell": "text"
433
+ },
434
+ {
435
+ "name": "tags",
436
+ "kind": "relationship",
437
+ "label": {
438
+ "en": "Tags",
439
+ "ar": "الوسوم"
440
+ },
441
+ "rules": {
442
+ "required": false
443
+ },
444
+ "relationTo": "tags",
445
+ "hasMany": true,
446
+ "component": "relationship",
447
+ "cell": "relationship"
448
+ },
449
+ {
450
+ "name": "scheduledSessions",
451
+ "kind": "join",
452
+ "label": {
453
+ "en": "Scheduled sessions",
454
+ "ar": "الجلسات المجدولة"
455
+ },
456
+ "rules": {
457
+ "required": false,
458
+ "providedBy": {
459
+ "create": "never",
460
+ "update": "never"
461
+ }
462
+ },
463
+ "relationTo": "sessions",
464
+ "on": "course",
465
+ "component": "join",
466
+ "cell": "join"
467
+ },
468
+ {
469
+ "name": "_status",
470
+ "kind": "text",
471
+ "label": {
472
+ "en": "Status",
473
+ "ar": "الحالة"
474
+ },
475
+ "rules": {
476
+ "index": true,
477
+ "required": false
478
+ },
479
+ "options": [
480
+ {
481
+ "value": "draft",
482
+ "label": {
483
+ "en": "Draft",
484
+ "ar": "مسودة"
485
+ }
486
+ },
487
+ {
488
+ "value": "published",
489
+ "label": {
490
+ "en": "Published",
491
+ "ar": "منشور"
492
+ }
493
+ }
494
+ ],
495
+ "component": "text",
496
+ "cell": "text"
497
+ },
498
+ {
499
+ "name": "details",
500
+ "kind": "richText",
501
+ "label": {
502
+ "en": "Details",
503
+ "ar": "التفاصيل"
504
+ },
505
+ "rules": {
506
+ "required": false
507
+ },
508
+ "component": "richText",
509
+ "cell": "richText",
510
+ "sortable": false
511
+ },
512
+ {
513
+ "name": "cover",
514
+ "kind": "upload",
515
+ "label": {
516
+ "en": "Cover image",
517
+ "ar": "صورة الغلاف"
518
+ },
519
+ "rules": {
520
+ "required": false,
521
+ "onDelete": "restrict"
522
+ },
523
+ "relationTo": "media",
524
+ "component": "upload",
525
+ "cell": "upload"
526
+ }
527
+ ],
528
+ "operations": [
529
+ {
530
+ "name": "create",
531
+ "effect": "create"
532
+ },
533
+ {
534
+ "name": "update",
535
+ "effect": "update"
536
+ },
537
+ {
538
+ "name": "delete",
539
+ "effect": "delete"
540
+ },
541
+ {
542
+ "name": "find",
543
+ "effect": "read"
544
+ },
545
+ {
546
+ "name": "findByID",
547
+ "effect": "read"
548
+ },
549
+ {
550
+ "name": "count",
551
+ "effect": "read"
552
+ },
553
+ {
554
+ "name": "updateMany",
555
+ "effect": "update",
556
+ "updatesMany": true
557
+ },
558
+ {
559
+ "name": "deleteMany",
560
+ "effect": "delete"
561
+ },
562
+ {
563
+ "name": "findVersions",
564
+ "effect": "read"
565
+ },
566
+ {
567
+ "name": "findVersionByID",
568
+ "effect": "read"
569
+ },
570
+ {
571
+ "name": "restoreVersion",
572
+ "effect": "update"
573
+ },
574
+ {
575
+ "name": "archive",
576
+ "effect": "update",
577
+ "fields": [
578
+ {
579
+ "name": "reason",
580
+ "kind": "text",
581
+ "label": {
582
+ "en": "Reason",
583
+ "ar": "السبب"
584
+ },
585
+ "rules": {
586
+ "required": true,
587
+ "maxLength": 200
588
+ },
589
+ "component": "text",
590
+ "cell": "text"
591
+ }
592
+ ]
593
+ },
594
+ {
595
+ "name": "findWithSessions",
596
+ "effect": "read"
597
+ }
598
+ ],
599
+ "useAsTitle": "title",
600
+ "description": {
601
+ "en": "The courses on offer.",
602
+ "ar": "الدورات المعروضة."
603
+ },
604
+ "baseFilter": {
605
+ "or": [
606
+ {
607
+ "archived": {
608
+ "exists": false
609
+ }
610
+ },
611
+ {
612
+ "archived": {
613
+ "equals": false
614
+ }
615
+ }
616
+ ]
617
+ },
618
+ "drafts": {
619
+ "autosave": {
620
+ "interval": 2000
621
+ }
622
+ },
623
+ "pages": {
624
+ "list": {
625
+ "path": "/courses",
626
+ "page": {
627
+ "shell": "./src/ui/top-shell.tsx#PortalTopShell",
628
+ "header": [
629
+ {
630
+ "title": {}
631
+ }
632
+ ],
633
+ "nav": [
634
+ {
635
+ "nav": {}
636
+ }
637
+ ],
638
+ "main": [
639
+ {
640
+ "layout": "./src/ui-portal/page.tsx#Page",
641
+ "main": [
642
+ {
643
+ "list": {
644
+ "columns": [
645
+ {
646
+ "field": "title",
647
+ "cell": "text",
648
+ "decided": "table"
649
+ },
650
+ {
651
+ "field": "fee",
652
+ "cell": "./src/courses/ui/fee-cell.tsx#FeeCell",
653
+ "decided": "field"
654
+ }
655
+ ],
656
+ "filters": [
657
+ "title"
658
+ ],
659
+ "search": [
660
+ "title"
661
+ ],
662
+ "empty": "./src/courses/ui/no-courses-on-offer.tsx#NoCourses",
663
+ "row": [
664
+ {
665
+ "button": "archive",
666
+ "label": {
667
+ "en": "Archive",
668
+ "ar": "أرشفة"
669
+ },
670
+ "fields": [
671
+ "reason"
672
+ ],
673
+ "when": {
674
+ "or": [
675
+ {
676
+ "record.archived": {
677
+ "exists": false
678
+ }
679
+ },
680
+ {
681
+ "record.archived": {
682
+ "equals": false
683
+ }
684
+ }
685
+ ]
686
+ }
687
+ }
688
+ ],
689
+ "sort": "title",
690
+ "limit": 25
691
+ }
692
+ }
693
+ ]
694
+ }
695
+ ]
696
+ }
697
+ },
698
+ "edit": {
699
+ "path": "/courses/:id",
700
+ "page": {
701
+ "shell": "./src/ui/top-shell.tsx#PortalTopShell",
702
+ "header": [
703
+ {
704
+ "title": {}
705
+ }
706
+ ],
707
+ "nav": [
708
+ {
709
+ "nav": {}
710
+ }
711
+ ],
712
+ "main": [
713
+ {
714
+ "layout": "./src/ui/record-page.tsx#RecordPage",
715
+ "main": [
716
+ {
717
+ "form": [
718
+ {
719
+ "section": "about",
720
+ "label": {
721
+ "en": "About the course",
722
+ "ar": "عن الدورة"
723
+ },
724
+ "fields": [
725
+ {
726
+ "field": "title",
727
+ "component": "text",
728
+ "decided": "table"
729
+ },
730
+ {
731
+ "field": "summary",
732
+ "component": "text",
733
+ "decided": "table"
734
+ },
735
+ {
736
+ "field": "cover",
737
+ "component": "upload",
738
+ "decided": "table"
739
+ },
740
+ {
741
+ "field": "details",
742
+ "component": "richText",
743
+ "decided": "table"
744
+ }
745
+ ]
746
+ },
747
+ {
748
+ "section": "pricing",
749
+ "label": {
750
+ "en": "Pricing",
751
+ "ar": "التسعير"
752
+ },
753
+ "fields": [
754
+ {
755
+ "row": [
756
+ {
757
+ "field": "fee",
758
+ "component": "number",
759
+ "decided": "table"
760
+ },
761
+ {
762
+ "field": "currency",
763
+ "component": "radio",
764
+ "decided": "field"
765
+ }
766
+ ]
767
+ },
768
+ {
769
+ "field": "audience",
770
+ "component": "buttonGroup",
771
+ "decided": "leaf"
772
+ }
773
+ ]
774
+ },
775
+ {
776
+ "section": "teaching",
777
+ "label": {
778
+ "en": "Teaching",
779
+ "ar": "التدريس"
780
+ },
781
+ "fields": [
782
+ {
783
+ "field": "delivery",
784
+ "component": "radio",
785
+ "decided": "field"
786
+ },
787
+ {
788
+ "field": "accessCode",
789
+ "component": "text",
790
+ "decided": "table",
791
+ "when": {
792
+ "delivery": {
793
+ "equals": "live"
794
+ }
795
+ }
796
+ },
797
+ {
798
+ "field": "opensOn",
799
+ "component": "date",
800
+ "decided": "table"
801
+ }
802
+ ]
803
+ }
804
+ ]
805
+ }
806
+ ],
807
+ "danger": [
808
+ {
809
+ "button": "archive",
810
+ "label": {
811
+ "en": "Archive",
812
+ "ar": "أرشفة"
813
+ },
814
+ "reload": true,
815
+ "component": "./src/courses/ui/archive-button.tsx#ArchiveButton",
816
+ "confirm": {
817
+ "title": {
818
+ "en": "Archive this course?",
819
+ "ar": "أرشفة هذه الدورة؟"
820
+ },
821
+ "body": {
822
+ "en": "Students stop seeing it.",
823
+ "ar": "يتوقف الطلاب عن رؤيتها."
824
+ }
825
+ },
826
+ "when": {
827
+ "and": [
828
+ {
829
+ "or": [
830
+ {
831
+ "record.archived": {
832
+ "exists": false
833
+ }
834
+ },
835
+ {
836
+ "record.archived": {
837
+ "equals": false
838
+ }
839
+ }
840
+ ]
841
+ },
842
+ {
843
+ "$user.collections.courses.operations.archive": {
844
+ "equals": true
845
+ }
846
+ }
847
+ ]
848
+ }
849
+ }
850
+ ]
851
+ }
852
+ ]
853
+ }
854
+ }
855
+ }
856
+ },
857
+ "enrollments": {
858
+ "name": "enrollments",
859
+ "single": false,
860
+ "fields": [
861
+ {
862
+ "name": "id",
863
+ "kind": "uuid",
864
+ "label": {
865
+ "en": "ID",
866
+ "ar": "المعرف"
867
+ },
868
+ "rules": {
869
+ "required": false
870
+ },
871
+ "component": "uuid",
872
+ "cell": "uuid"
873
+ },
874
+ {
875
+ "name": "updatedAt",
876
+ "kind": "datetime",
877
+ "label": {
878
+ "en": "Updated at",
879
+ "ar": "تاريخ التعديل"
880
+ },
881
+ "rules": {
882
+ "required": true,
883
+ "defaultNow": true,
884
+ "nowOnUpdate": true,
885
+ "providedBy": {
886
+ "create": "application",
887
+ "update": "application"
888
+ }
889
+ },
890
+ "component": "datetime",
891
+ "cell": "datetime"
892
+ },
893
+ {
894
+ "name": "createdAt",
895
+ "kind": "datetime",
896
+ "label": {
897
+ "en": "Created at",
898
+ "ar": "تاريخ الإنشاء"
899
+ },
900
+ "rules": {
901
+ "required": true,
902
+ "defaultNow": true,
903
+ "index": true,
904
+ "providedBy": {
905
+ "create": "application",
906
+ "update": "application"
907
+ }
908
+ },
909
+ "component": "datetime",
910
+ "cell": "datetime"
911
+ },
912
+ {
913
+ "name": "organization",
914
+ "kind": "relationship",
915
+ "label": {
916
+ "en": "Organization",
917
+ "ar": "المؤسسة"
918
+ },
919
+ "rules": {
920
+ "required": true,
921
+ "index": true,
922
+ "providedBy": {
923
+ "create": "application",
924
+ "update": "never"
925
+ },
926
+ "onDelete": "restrict"
927
+ },
928
+ "relationTo": "organization",
929
+ "component": "relationship",
930
+ "cell": "relationship"
931
+ },
932
+ {
933
+ "name": "session",
934
+ "kind": "relationship",
935
+ "label": {
936
+ "en": "Session",
937
+ "ar": "الحصة"
938
+ },
939
+ "rules": {
940
+ "required": true,
941
+ "onDelete": "restrict"
942
+ },
943
+ "relationTo": "sessions",
944
+ "component": "relationship",
945
+ "cell": "./src/enrollments/ui/session-cell.tsx#SessionCell"
946
+ },
947
+ {
948
+ "name": "student",
949
+ "kind": "relationship",
950
+ "label": {
951
+ "en": "Student",
952
+ "ar": "الطالب"
953
+ },
954
+ "rules": {
955
+ "required": true,
956
+ "onDelete": "restrict"
957
+ },
958
+ "relationTo": "user",
959
+ "component": "relationship",
960
+ "cell": "relationship"
961
+ },
962
+ {
963
+ "name": "deletedAt",
964
+ "kind": "datetime",
965
+ "label": {
966
+ "en": "Deleted at",
967
+ "ar": "تاريخ الحذف"
968
+ },
969
+ "rules": {
970
+ "providedBy": {
971
+ "create": "never",
972
+ "update": "never"
973
+ },
974
+ "required": false
975
+ },
976
+ "component": "datetime",
977
+ "cell": "datetime"
978
+ }
979
+ ],
980
+ "operations": [
981
+ {
982
+ "name": "create",
983
+ "effect": "create"
984
+ },
985
+ {
986
+ "name": "update",
987
+ "effect": "update"
988
+ },
989
+ {
990
+ "name": "delete",
991
+ "effect": "delete"
992
+ },
993
+ {
994
+ "name": "find",
995
+ "effect": "read"
996
+ },
997
+ {
998
+ "name": "findByID",
999
+ "effect": "read"
1000
+ },
1001
+ {
1002
+ "name": "count",
1003
+ "effect": "read"
1004
+ },
1005
+ {
1006
+ "name": "updateMany",
1007
+ "effect": "update",
1008
+ "updatesMany": true
1009
+ },
1010
+ {
1011
+ "name": "deleteMany",
1012
+ "effect": "delete"
1013
+ }
1014
+ ],
1015
+ "useAsTitle": "session",
1016
+ "pages": {
1017
+ "list": {
1018
+ "path": "/enrollments",
1019
+ "page": {
1020
+ "shell": "./src/ui/top-shell.tsx#PortalTopShell",
1021
+ "header": [
1022
+ {
1023
+ "title": {}
1024
+ }
1025
+ ],
1026
+ "nav": [
1027
+ {
1028
+ "nav": {}
1029
+ }
1030
+ ],
1031
+ "main": [
1032
+ {
1033
+ "layout": "./src/ui-portal/page.tsx#Page",
1034
+ "main": [
1035
+ {
1036
+ "list": {
1037
+ "columns": [
1038
+ {
1039
+ "field": "session",
1040
+ "cell": "./src/enrollments/ui/session-cell.tsx#SessionCell",
1041
+ "decided": "field"
1042
+ },
1043
+ {
1044
+ "field": "createdAt",
1045
+ "cell": "datetime",
1046
+ "decided": "table"
1047
+ }
1048
+ ]
1049
+ }
1050
+ }
1051
+ ]
1052
+ }
1053
+ ]
1054
+ }
1055
+ },
1056
+ "create": {
1057
+ "path": "/enrollments/new",
1058
+ "page": {
1059
+ "shell": "./src/ui/top-shell.tsx#PortalTopShell",
1060
+ "header": [
1061
+ {
1062
+ "title": {}
1063
+ }
1064
+ ],
1065
+ "nav": [
1066
+ {
1067
+ "nav": {}
1068
+ }
1069
+ ],
1070
+ "main": [
1071
+ {
1072
+ "layout": "./src/ui-portal/page.tsx#Page",
1073
+ "main": [
1074
+ {
1075
+ "form": [
1076
+ {
1077
+ "field": "session",
1078
+ "component": "relationship",
1079
+ "decided": "table"
1080
+ },
1081
+ {
1082
+ "field": "student",
1083
+ "component": "relationship",
1084
+ "decided": "table"
1085
+ }
1086
+ ]
1087
+ }
1088
+ ]
1089
+ }
1090
+ ]
1091
+ },
1092
+ "mode": "drawer"
1093
+ },
1094
+ "edit": {
1095
+ "path": "/enrollments/:id",
1096
+ "page": {
1097
+ "shell": "./src/ui/top-shell.tsx#PortalTopShell",
1098
+ "header": [
1099
+ {
1100
+ "title": {}
1101
+ }
1102
+ ],
1103
+ "nav": [
1104
+ {
1105
+ "nav": {}
1106
+ }
1107
+ ],
1108
+ "main": [
1109
+ {
1110
+ "layout": "./src/ui-portal/page.tsx#Page",
1111
+ "main": [
1112
+ {
1113
+ "form": [
1114
+ {
1115
+ "field": "session",
1116
+ "component": "relationship",
1117
+ "decided": "table"
1118
+ }
1119
+ ]
1120
+ }
1121
+ ]
1122
+ }
1123
+ ]
1124
+ }
1125
+ }
1126
+ }
1127
+ },
1128
+ "sessions": {
1129
+ "name": "sessions",
1130
+ "single": false,
1131
+ "fields": [
1132
+ {
1133
+ "name": "id",
1134
+ "kind": "uuid",
1135
+ "label": {
1136
+ "en": "ID",
1137
+ "ar": "المعرف"
1138
+ },
1139
+ "rules": {
1140
+ "required": false
1141
+ },
1142
+ "component": "uuid",
1143
+ "cell": "uuid"
1144
+ },
1145
+ {
1146
+ "name": "updatedAt",
1147
+ "kind": "datetime",
1148
+ "label": {
1149
+ "en": "Updated at",
1150
+ "ar": "تاريخ التعديل"
1151
+ },
1152
+ "rules": {
1153
+ "required": true,
1154
+ "defaultNow": true,
1155
+ "nowOnUpdate": true,
1156
+ "providedBy": {
1157
+ "create": "application",
1158
+ "update": "application"
1159
+ }
1160
+ },
1161
+ "component": "datetime",
1162
+ "cell": "datetime"
1163
+ },
1164
+ {
1165
+ "name": "createdAt",
1166
+ "kind": "datetime",
1167
+ "label": {
1168
+ "en": "Created at",
1169
+ "ar": "تاريخ الإنشاء"
1170
+ },
1171
+ "rules": {
1172
+ "required": true,
1173
+ "defaultNow": true,
1174
+ "index": true,
1175
+ "providedBy": {
1176
+ "create": "application",
1177
+ "update": "application"
1178
+ }
1179
+ },
1180
+ "component": "datetime",
1181
+ "cell": "datetime"
1182
+ },
1183
+ {
1184
+ "name": "organization",
1185
+ "kind": "relationship",
1186
+ "label": {
1187
+ "en": "Organization",
1188
+ "ar": "المؤسسة"
1189
+ },
1190
+ "rules": {
1191
+ "required": true,
1192
+ "index": true,
1193
+ "providedBy": {
1194
+ "create": "application",
1195
+ "update": "never"
1196
+ },
1197
+ "onDelete": "restrict"
1198
+ },
1199
+ "relationTo": "organization",
1200
+ "component": "relationship",
1201
+ "cell": "relationship"
1202
+ },
1203
+ {
1204
+ "name": "course",
1205
+ "kind": "relationship",
1206
+ "label": {
1207
+ "en": "Course",
1208
+ "ar": "الدورة"
1209
+ },
1210
+ "rules": {
1211
+ "required": true,
1212
+ "onDelete": "restrict"
1213
+ },
1214
+ "relationTo": "courses",
1215
+ "component": "relationship",
1216
+ "cell": "relationship"
1217
+ },
1218
+ {
1219
+ "name": "startsAt",
1220
+ "kind": "datetime",
1221
+ "label": {
1222
+ "en": "Starts at",
1223
+ "ar": "وقت البداية"
1224
+ },
1225
+ "rules": {
1226
+ "required": true
1227
+ },
1228
+ "component": "datetime",
1229
+ "cell": "datetime"
1230
+ },
1231
+ {
1232
+ "name": "capacity",
1233
+ "kind": "number",
1234
+ "label": {
1235
+ "en": "Capacity",
1236
+ "ar": "السعة"
1237
+ },
1238
+ "rules": {
1239
+ "min": 1,
1240
+ "required": false
1241
+ },
1242
+ "component": "number",
1243
+ "cell": "number"
1244
+ },
1245
+ {
1246
+ "name": "venue",
1247
+ "kind": "text",
1248
+ "label": {
1249
+ "en": "Venue",
1250
+ "ar": "المكان"
1251
+ },
1252
+ "rules": {
1253
+ "required": false
1254
+ },
1255
+ "options": [
1256
+ {
1257
+ "value": "online",
1258
+ "label": {
1259
+ "en": "Online",
1260
+ "ar": "عبر الإنترنت"
1261
+ }
1262
+ },
1263
+ {
1264
+ "value": "campus",
1265
+ "label": {
1266
+ "en": "Campus",
1267
+ "ar": "الحرم"
1268
+ }
1269
+ }
1270
+ ],
1271
+ "component": "text",
1272
+ "cell": "text"
1273
+ },
1274
+ {
1275
+ "name": "format",
1276
+ "kind": "text",
1277
+ "label": {
1278
+ "en": "Format",
1279
+ "ar": "الصيغة"
1280
+ },
1281
+ "rules": {
1282
+ "required": false
1283
+ },
1284
+ "options": [
1285
+ {
1286
+ "value": "workshop",
1287
+ "label": {
1288
+ "en": "Workshop",
1289
+ "ar": "ورشة عمل"
1290
+ }
1291
+ },
1292
+ {
1293
+ "value": "lecture",
1294
+ "label": {
1295
+ "en": "Lecture",
1296
+ "ar": "محاضرة"
1297
+ }
1298
+ }
1299
+ ],
1300
+ "component": "text",
1301
+ "cell": "text"
1302
+ },
1303
+ {
1304
+ "name": "archived",
1305
+ "kind": "checkbox",
1306
+ "label": {
1307
+ "en": "Archived",
1308
+ "ar": "مؤرشفة"
1309
+ },
1310
+ "rules": {
1311
+ "required": false
1312
+ },
1313
+ "component": "checkbox",
1314
+ "cell": "checkbox"
1315
+ },
1316
+ {
1317
+ "name": "details",
1318
+ "kind": "richText",
1319
+ "label": {
1320
+ "en": "Details",
1321
+ "ar": "التفاصيل"
1322
+ },
1323
+ "rules": {
1324
+ "required": false
1325
+ },
1326
+ "component": "richText",
1327
+ "cell": "richText",
1328
+ "sortable": false
1329
+ },
1330
+ {
1331
+ "name": "enrollments",
1332
+ "kind": "join",
1333
+ "label": {
1334
+ "en": "Enrollments",
1335
+ "ar": "التسجيلات"
1336
+ },
1337
+ "rules": {
1338
+ "required": false,
1339
+ "providedBy": {
1340
+ "create": "never",
1341
+ "update": "never"
1342
+ }
1343
+ },
1344
+ "relationTo": "enrollments",
1345
+ "on": "session",
1346
+ "component": "join",
1347
+ "cell": "join"
1348
+ }
1349
+ ],
1350
+ "operations": [
1351
+ {
1352
+ "name": "create",
1353
+ "effect": "create"
1354
+ },
1355
+ {
1356
+ "name": "update",
1357
+ "effect": "update"
1358
+ },
1359
+ {
1360
+ "name": "delete",
1361
+ "effect": "delete"
1362
+ },
1363
+ {
1364
+ "name": "find",
1365
+ "effect": "read"
1366
+ },
1367
+ {
1368
+ "name": "findByID",
1369
+ "effect": "read"
1370
+ },
1371
+ {
1372
+ "name": "count",
1373
+ "effect": "read"
1374
+ },
1375
+ {
1376
+ "name": "updateMany",
1377
+ "effect": "update",
1378
+ "updatesMany": true
1379
+ },
1380
+ {
1381
+ "name": "deleteMany",
1382
+ "effect": "delete"
1383
+ },
1384
+ {
1385
+ "name": "archiveMany",
1386
+ "effect": "update",
1387
+ "updatesMany": true
1388
+ }
1389
+ ],
1390
+ "useAsTitle": "startsAt",
1391
+ "pages": {}
1392
+ },
1393
+ "media": {
1394
+ "name": "media",
1395
+ "single": false,
1396
+ "fields": [
1397
+ {
1398
+ "name": "id",
1399
+ "kind": "uuid",
1400
+ "label": {
1401
+ "en": "ID",
1402
+ "ar": "المعرف"
1403
+ },
1404
+ "rules": {
1405
+ "required": false
1406
+ },
1407
+ "component": "uuid",
1408
+ "cell": "uuid"
1409
+ },
1410
+ {
1411
+ "name": "updatedAt",
1412
+ "kind": "datetime",
1413
+ "label": {
1414
+ "en": "Updated at",
1415
+ "ar": "تاريخ التعديل"
1416
+ },
1417
+ "rules": {
1418
+ "required": true,
1419
+ "defaultNow": true,
1420
+ "nowOnUpdate": true,
1421
+ "providedBy": {
1422
+ "create": "application",
1423
+ "update": "application"
1424
+ }
1425
+ },
1426
+ "component": "datetime",
1427
+ "cell": "datetime"
1428
+ },
1429
+ {
1430
+ "name": "createdAt",
1431
+ "kind": "datetime",
1432
+ "label": {
1433
+ "en": "Created at",
1434
+ "ar": "تاريخ الإنشاء"
1435
+ },
1436
+ "rules": {
1437
+ "required": true,
1438
+ "defaultNow": true,
1439
+ "index": true,
1440
+ "providedBy": {
1441
+ "create": "application",
1442
+ "update": "application"
1443
+ }
1444
+ },
1445
+ "component": "datetime",
1446
+ "cell": "datetime"
1447
+ },
1448
+ {
1449
+ "name": "organization",
1450
+ "kind": "relationship",
1451
+ "label": {
1452
+ "en": "Organization",
1453
+ "ar": "المؤسسة"
1454
+ },
1455
+ "rules": {
1456
+ "required": true,
1457
+ "index": true,
1458
+ "providedBy": {
1459
+ "create": "application",
1460
+ "update": "never"
1461
+ },
1462
+ "onDelete": "restrict"
1463
+ },
1464
+ "relationTo": "organization",
1465
+ "component": "relationship",
1466
+ "cell": "relationship"
1467
+ },
1468
+ {
1469
+ "name": "filename",
1470
+ "kind": "text",
1471
+ "label": {
1472
+ "en": "File name",
1473
+ "ar": "اسم الملف"
1474
+ },
1475
+ "rules": {
1476
+ "providedBy": {
1477
+ "create": "application",
1478
+ "update": "never"
1479
+ },
1480
+ "required": true,
1481
+ "index": true
1482
+ },
1483
+ "component": "text",
1484
+ "cell": "text"
1485
+ },
1486
+ {
1487
+ "name": "mimeType",
1488
+ "kind": "text",
1489
+ "label": {
1490
+ "en": "File type",
1491
+ "ar": "نوع الملف"
1492
+ },
1493
+ "rules": {
1494
+ "providedBy": {
1495
+ "create": "application",
1496
+ "update": "never"
1497
+ },
1498
+ "required": true
1499
+ },
1500
+ "component": "text",
1501
+ "cell": "text"
1502
+ },
1503
+ {
1504
+ "name": "filesize",
1505
+ "kind": "number",
1506
+ "label": {
1507
+ "en": "File size",
1508
+ "ar": "حجم الملف"
1509
+ },
1510
+ "rules": {
1511
+ "providedBy": {
1512
+ "create": "application",
1513
+ "update": "never"
1514
+ },
1515
+ "required": true
1516
+ },
1517
+ "component": "number",
1518
+ "cell": "number"
1519
+ },
1520
+ {
1521
+ "name": "width",
1522
+ "kind": "number",
1523
+ "label": {
1524
+ "en": "Width",
1525
+ "ar": "العرض"
1526
+ },
1527
+ "rules": {
1528
+ "providedBy": {
1529
+ "create": "application",
1530
+ "update": "never"
1531
+ },
1532
+ "required": false
1533
+ },
1534
+ "component": "number",
1535
+ "cell": "number"
1536
+ },
1537
+ {
1538
+ "name": "height",
1539
+ "kind": "number",
1540
+ "label": {
1541
+ "en": "Height",
1542
+ "ar": "الارتفاع"
1543
+ },
1544
+ "rules": {
1545
+ "providedBy": {
1546
+ "create": "application",
1547
+ "update": "never"
1548
+ },
1549
+ "required": false
1550
+ },
1551
+ "component": "number",
1552
+ "cell": "number"
1553
+ },
1554
+ {
1555
+ "name": "key",
1556
+ "kind": "text",
1557
+ "label": {
1558
+ "en": "Object key",
1559
+ "ar": "مفتاح الملف"
1560
+ },
1561
+ "rules": {
1562
+ "providedBy": {
1563
+ "create": "application",
1564
+ "update": "never"
1565
+ },
1566
+ "required": true,
1567
+ "unique": true
1568
+ },
1569
+ "component": "text",
1570
+ "cell": "text"
1571
+ },
1572
+ {
1573
+ "name": "storage",
1574
+ "kind": "text",
1575
+ "label": {
1576
+ "en": "Storage",
1577
+ "ar": "التخزين"
1578
+ },
1579
+ "rules": {
1580
+ "providedBy": {
1581
+ "create": "application",
1582
+ "update": "never"
1583
+ },
1584
+ "required": true
1585
+ },
1586
+ "component": "text",
1587
+ "cell": "text"
1588
+ },
1589
+ {
1590
+ "name": "alt",
1591
+ "kind": "text",
1592
+ "label": {
1593
+ "en": "Alternative text",
1594
+ "ar": "النص البديل"
1595
+ },
1596
+ "rules": {
1597
+ "localized": true,
1598
+ "required": true,
1599
+ "maxLength": 300
1600
+ },
1601
+ "component": "text",
1602
+ "cell": "text"
1603
+ }
1604
+ ],
1605
+ "operations": [
1606
+ {
1607
+ "name": "create",
1608
+ "effect": "create"
1609
+ },
1610
+ {
1611
+ "name": "update",
1612
+ "effect": "update"
1613
+ },
1614
+ {
1615
+ "name": "delete",
1616
+ "effect": "delete"
1617
+ },
1618
+ {
1619
+ "name": "find",
1620
+ "effect": "read"
1621
+ },
1622
+ {
1623
+ "name": "findByID",
1624
+ "effect": "read"
1625
+ },
1626
+ {
1627
+ "name": "count",
1628
+ "effect": "read"
1629
+ },
1630
+ {
1631
+ "name": "updateMany",
1632
+ "effect": "update",
1633
+ "updatesMany": true
1634
+ },
1635
+ {
1636
+ "name": "deleteMany",
1637
+ "effect": "delete"
1638
+ }
1639
+ ],
1640
+ "useAsTitle": "filename",
1641
+ "storage": {
1642
+ "mimeTypes": [
1643
+ "image/png",
1644
+ "image/jpeg",
1645
+ "image/webp"
1646
+ ],
1647
+ "fileSize": 10485760
1648
+ },
1649
+ "pages": {}
1650
+ },
1651
+ "user": {
1652
+ "name": "user",
1653
+ "single": false,
1654
+ "fields": [
1655
+ {
1656
+ "name": "id",
1657
+ "kind": "text",
1658
+ "rules": {
1659
+ "required": false
1660
+ },
1661
+ "component": "text",
1662
+ "cell": "text"
1663
+ },
1664
+ {
1665
+ "name": "updatedAt",
1666
+ "kind": "datetime",
1667
+ "rules": {
1668
+ "required": true,
1669
+ "nowOnUpdate": true,
1670
+ "providedBy": {
1671
+ "update": "application"
1672
+ }
1673
+ },
1674
+ "component": "datetime",
1675
+ "cell": "datetime"
1676
+ },
1677
+ {
1678
+ "name": "createdAt",
1679
+ "kind": "datetime",
1680
+ "rules": {
1681
+ "required": true
1682
+ },
1683
+ "component": "datetime",
1684
+ "cell": "datetime"
1685
+ },
1686
+ {
1687
+ "name": "name",
1688
+ "kind": "text",
1689
+ "rules": {
1690
+ "required": true
1691
+ },
1692
+ "component": "text",
1693
+ "cell": "text"
1694
+ },
1695
+ {
1696
+ "name": "email",
1697
+ "kind": "text",
1698
+ "rules": {
1699
+ "required": true,
1700
+ "unique": true
1701
+ },
1702
+ "component": "text",
1703
+ "cell": "text"
1704
+ },
1705
+ {
1706
+ "name": "emailVerified",
1707
+ "kind": "checkbox",
1708
+ "rules": {
1709
+ "required": true
1710
+ },
1711
+ "component": "checkbox",
1712
+ "cell": "checkbox"
1713
+ },
1714
+ {
1715
+ "name": "image",
1716
+ "kind": "text",
1717
+ "rules": {
1718
+ "required": false
1719
+ },
1720
+ "component": "text",
1721
+ "cell": "text"
1722
+ },
1723
+ {
1724
+ "name": "role",
1725
+ "kind": "text",
1726
+ "rules": {
1727
+ "required": false
1728
+ },
1729
+ "component": "text",
1730
+ "cell": "text"
1731
+ },
1732
+ {
1733
+ "name": "banned",
1734
+ "kind": "checkbox",
1735
+ "rules": {
1736
+ "required": false
1737
+ },
1738
+ "component": "checkbox",
1739
+ "cell": "checkbox"
1740
+ },
1741
+ {
1742
+ "name": "banReason",
1743
+ "kind": "text",
1744
+ "rules": {
1745
+ "required": false
1746
+ },
1747
+ "component": "text",
1748
+ "cell": "text"
1749
+ },
1750
+ {
1751
+ "name": "banExpires",
1752
+ "kind": "datetime",
1753
+ "rules": {
1754
+ "required": false
1755
+ },
1756
+ "component": "datetime",
1757
+ "cell": "datetime"
1758
+ }
1759
+ ],
1760
+ "operations": [
1761
+ {
1762
+ "name": "create",
1763
+ "effect": "create"
1764
+ },
1765
+ {
1766
+ "name": "update",
1767
+ "effect": "update"
1768
+ },
1769
+ {
1770
+ "name": "delete",
1771
+ "effect": "delete"
1772
+ },
1773
+ {
1774
+ "name": "find",
1775
+ "effect": "read"
1776
+ },
1777
+ {
1778
+ "name": "findByID",
1779
+ "effect": "read"
1780
+ },
1781
+ {
1782
+ "name": "count",
1783
+ "effect": "read"
1784
+ },
1785
+ {
1786
+ "name": "updateMany",
1787
+ "effect": "update",
1788
+ "updatesMany": true
1789
+ },
1790
+ {
1791
+ "name": "deleteMany",
1792
+ "effect": "delete"
1793
+ }
1794
+ ],
1795
+ "useAsTitle": "name",
1796
+ "pages": {}
1797
+ }
1798
+ },
1799
+ "maxLimit": 100
1800
+ }