create-mithaq 0.0.0-stage → 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.
- package/LICENSE +22 -0
- package/LICENSES/openstatus-time-picker.txt +21 -0
- package/LICENSES/payload.txt +22 -0
- package/LICENSES/ponytail.txt +21 -0
- package/index.js +521 -0
- package/package.json +19 -4
- package/template/apps/asas-backoffice/components.json +25 -0
- package/template/apps/asas-backoffice/gitignore +3 -0
- package/template/apps/asas-backoffice/package.json +57 -0
- package/template/apps/asas-backoffice/public/favicon.svg +1 -0
- package/template/apps/asas-backoffice/src/api.ts +147 -0
- package/template/apps/asas-backoffice/src/auth-frame.tsx +150 -0
- package/template/apps/asas-backoffice/src/components/ui/accordion.tsx +74 -0
- package/template/apps/asas-backoffice/src/components/ui/alert-dialog.tsx +185 -0
- package/template/apps/asas-backoffice/src/components/ui/avatar.tsx +106 -0
- package/template/apps/asas-backoffice/src/components/ui/badge.tsx +48 -0
- package/template/apps/asas-backoffice/src/components/ui/breadcrumb.tsx +124 -0
- package/template/apps/asas-backoffice/src/components/ui/button-group.tsx +87 -0
- package/template/apps/asas-backoffice/src/components/ui/button.tsx +55 -0
- package/template/apps/asas-backoffice/src/components/ui/calendar.tsx +223 -0
- package/template/apps/asas-backoffice/src/components/ui/card.tsx +102 -0
- package/template/apps/asas-backoffice/src/components/ui/chart.tsx +371 -0
- package/template/apps/asas-backoffice/src/components/ui/checkbox.tsx +28 -0
- package/template/apps/asas-backoffice/src/components/ui/collapsible.tsx +19 -0
- package/template/apps/asas-backoffice/src/components/ui/combobox.tsx +308 -0
- package/template/apps/asas-backoffice/src/components/ui/dialog.tsx +158 -0
- package/template/apps/asas-backoffice/src/components/ui/direction.tsx +6 -0
- package/template/apps/asas-backoffice/src/components/ui/directional-icon.tsx +20 -0
- package/template/apps/asas-backoffice/src/components/ui/dropdown-menu.tsx +267 -0
- package/template/apps/asas-backoffice/src/components/ui/field.tsx +236 -0
- package/template/apps/asas-backoffice/src/components/ui/input-group.tsx +155 -0
- package/template/apps/asas-backoffice/src/components/ui/input-otp.tsx +84 -0
- package/template/apps/asas-backoffice/src/components/ui/input.tsx +19 -0
- package/template/apps/asas-backoffice/src/components/ui/label.tsx +19 -0
- package/template/apps/asas-backoffice/src/components/ui/popover.tsx +90 -0
- package/template/apps/asas-backoffice/src/components/ui/radio-group.tsx +37 -0
- package/template/apps/asas-backoffice/src/components/ui/resizable.tsx +47 -0
- package/template/apps/asas-backoffice/src/components/ui/scroll-area.tsx +54 -0
- package/template/apps/asas-backoffice/src/components/ui/select.tsx +204 -0
- package/template/apps/asas-backoffice/src/components/ui/separator.tsx +24 -0
- package/template/apps/asas-backoffice/src/components/ui/sheet.tsx +139 -0
- package/template/apps/asas-backoffice/src/components/ui/sidebar.tsx +714 -0
- package/template/apps/asas-backoffice/src/components/ui/skeleton.tsx +13 -0
- package/template/apps/asas-backoffice/src/components/ui/slider.tsx +55 -0
- package/template/apps/asas-backoffice/src/components/ui/spinner.tsx +10 -0
- package/template/apps/asas-backoffice/src/components/ui/switch.tsx +29 -0
- package/template/apps/asas-backoffice/src/components/ui/table.tsx +115 -0
- package/template/apps/asas-backoffice/src/components/ui/tabs.tsx +79 -0
- package/template/apps/asas-backoffice/src/components/ui/textarea.tsx +17 -0
- package/template/apps/asas-backoffice/src/components/ui/toggle-group.tsx +89 -0
- package/template/apps/asas-backoffice/src/components/ui/toggle.tsx +44 -0
- package/template/apps/asas-backoffice/src/components/ui/tooltip.tsx +63 -0
- package/template/apps/asas-backoffice/src/components.ts +35 -0
- package/template/apps/asas-backoffice/src/copy.ts +1 -0
- package/template/apps/asas-backoffice/src/first-user.ts +14 -0
- package/template/apps/asas-backoffice/src/hooks/use-mobile.ts +19 -0
- package/template/apps/asas-backoffice/src/lib/utils.ts +1 -0
- package/template/apps/asas-backoffice/src/links.ts +38 -0
- package/template/apps/asas-backoffice/src/locale-switch.tsx +28 -0
- package/template/apps/asas-backoffice/src/no-organization.tsx +5 -0
- package/template/apps/asas-backoffice/src/redirect.ts +1 -0
- package/template/apps/asas-backoffice/src/request-headers.ts +11 -0
- package/template/apps/asas-backoffice/src/routeTree.gen.ts +206 -0
- package/template/apps/asas-backoffice/src/router.tsx +18 -0
- package/template/apps/asas-backoffice/src/routes/(screens)/backoffice/files.ts +10 -0
- package/template/apps/asas-backoffice/src/routes/(screens)/backoffice/screen.json +3971 -0
- package/template/apps/asas-backoffice/src/routes/(screens)/backoffice/types.ts +163 -0
- package/template/apps/asas-backoffice/src/routes/(screens)/backoffice.$.tsx +17 -0
- package/template/apps/asas-backoffice/src/routes/(screens)/backoffice.index.tsx +10 -0
- package/template/apps/asas-backoffice/src/routes/(screens)/backoffice.tsx +13 -0
- package/template/apps/asas-backoffice/src/routes/__root.tsx +95 -0
- package/template/apps/asas-backoffice/src/routes/api/$.ts +34 -0
- package/template/apps/asas-backoffice/src/routes/auth.create-first-user.tsx +113 -0
- package/template/apps/asas-backoffice/src/routes/auth.sign-in.tsx +77 -0
- package/template/apps/asas-backoffice/src/routes/unauthorized.tsx +134 -0
- package/template/apps/asas-backoffice/src/screen-form.tsx +36 -0
- package/template/apps/asas-backoffice/src/screen-list.tsx +140 -0
- package/template/apps/asas-backoffice/src/screen-names.ts +10 -0
- package/template/apps/asas-backoffice/src/screens.tsx +888 -0
- package/template/apps/asas-backoffice/src/server.ts +30 -0
- package/template/apps/asas-backoffice/src/slide.ts +22 -0
- package/template/apps/asas-backoffice/src/start.ts +42 -0
- package/template/apps/asas-backoffice/src/styles.css +202 -0
- package/template/apps/asas-backoffice/src/theme.ts +2 -0
- package/template/apps/asas-backoffice/tsconfig.json +19 -0
- package/template/apps/asas-backoffice/vite.config.ts +32 -0
- package/template/apps/asas-tanstack/components.json +25 -0
- package/template/apps/asas-tanstack/gitignore +3 -0
- package/template/apps/asas-tanstack/package.json +58 -0
- package/template/apps/asas-tanstack/public/favicon.svg +1 -0
- package/template/apps/asas-tanstack/src/api.ts +147 -0
- package/template/apps/asas-tanstack/src/auth-frame.tsx +150 -0
- package/template/apps/asas-tanstack/src/choose-password.tsx +150 -0
- package/template/apps/asas-tanstack/src/components/ui/accordion.tsx +10 -0
- package/template/apps/asas-tanstack/src/components/ui/alert-dialog.tsx +173 -0
- package/template/apps/asas-tanstack/src/components/ui/avatar.tsx +104 -0
- package/template/apps/asas-tanstack/src/components/ui/badge.tsx +48 -0
- package/template/apps/asas-tanstack/src/components/ui/breadcrumb.tsx +125 -0
- package/template/apps/asas-tanstack/src/components/ui/button-group.tsx +87 -0
- package/template/apps/asas-tanstack/src/components/ui/button.tsx +56 -0
- package/template/apps/asas-tanstack/src/components/ui/calendar.tsx +223 -0
- package/template/apps/asas-tanstack/src/components/ui/card.tsx +94 -0
- package/template/apps/asas-tanstack/src/components/ui/chart.tsx +369 -0
- package/template/apps/asas-tanstack/src/components/ui/checkbox.tsx +27 -0
- package/template/apps/asas-tanstack/src/components/ui/collapsible.tsx +19 -0
- package/template/apps/asas-tanstack/src/components/ui/combobox.tsx +300 -0
- package/template/apps/asas-tanstack/src/components/ui/dialog.tsx +149 -0
- package/template/apps/asas-tanstack/src/components/ui/direction.tsx +5 -0
- package/template/apps/asas-tanstack/src/components/ui/directional-icon.tsx +20 -0
- package/template/apps/asas-tanstack/src/components/ui/dropdown-menu.tsx +267 -0
- package/template/apps/asas-tanstack/src/components/ui/field.tsx +225 -0
- package/template/apps/asas-tanstack/src/components/ui/input-group.tsx +147 -0
- package/template/apps/asas-tanstack/src/components/ui/input-otp.tsx +20 -0
- package/template/apps/asas-tanstack/src/components/ui/input.tsx +20 -0
- package/template/apps/asas-tanstack/src/components/ui/label.tsx +18 -0
- package/template/apps/asas-tanstack/src/components/ui/popover.tsx +50 -0
- package/template/apps/asas-tanstack/src/components/ui/radio-group.tsx +10 -0
- package/template/apps/asas-tanstack/src/components/ui/resizable.tsx +47 -0
- package/template/apps/asas-tanstack/src/components/ui/scroll-area.tsx +52 -0
- package/template/apps/asas-tanstack/src/components/ui/select.tsx +190 -0
- package/template/apps/asas-tanstack/src/components/ui/separator.tsx +23 -0
- package/template/apps/asas-tanstack/src/components/ui/sheet.tsx +127 -0
- package/template/apps/asas-tanstack/src/components/ui/sidebar.tsx +716 -0
- package/template/apps/asas-tanstack/src/components/ui/skeleton.tsx +13 -0
- package/template/apps/asas-tanstack/src/components/ui/slider.tsx +13 -0
- package/template/apps/asas-tanstack/src/components/ui/spinner.tsx +11 -0
- package/template/apps/asas-tanstack/src/components/ui/switch.tsx +8 -0
- package/template/apps/asas-tanstack/src/components/ui/table.tsx +119 -0
- package/template/apps/asas-tanstack/src/components/ui/tabs.tsx +80 -0
- package/template/apps/asas-tanstack/src/components/ui/textarea.tsx +18 -0
- package/template/apps/asas-tanstack/src/components/ui/toggle-group.tsx +8 -0
- package/template/apps/asas-tanstack/src/components/ui/toggle.tsx +44 -0
- package/template/apps/asas-tanstack/src/components/ui/tooltip.tsx +68 -0
- package/template/apps/asas-tanstack/src/components.ts +35 -0
- package/template/apps/asas-tanstack/src/copy.ts +1207 -0
- package/template/apps/asas-tanstack/src/first-run.ts +16 -0
- package/template/apps/asas-tanstack/src/hooks/use-mobile.ts +19 -0
- package/template/apps/asas-tanstack/src/lib/utils.ts +6 -0
- package/template/apps/asas-tanstack/src/links.ts +38 -0
- package/template/apps/asas-tanstack/src/locale-switch.tsx +28 -0
- package/template/apps/asas-tanstack/src/no-organization.tsx +108 -0
- package/template/apps/asas-tanstack/src/quiet-abort.ts +25 -0
- package/template/apps/asas-tanstack/src/redirect.ts +39 -0
- package/template/apps/asas-tanstack/src/request-headers.ts +11 -0
- package/template/apps/asas-tanstack/src/routeTree.gen.ts +424 -0
- package/template/apps/asas-tanstack/src/router.tsx +18 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/files.ts +11 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/screen.json +4242 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/types.ts +160 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/dashboard.$.tsx +17 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/dashboard.index.tsx +10 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/dashboard.tsx +13 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/portal/files.ts +9 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/portal/screen.json +1564 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/portal/types.ts +94 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/portal.$.tsx +17 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/portal.index.tsx +10 -0
- package/template/apps/asas-tanstack/src/routes/(screens)/portal.tsx +13 -0
- package/template/apps/asas-tanstack/src/routes/__root.tsx +99 -0
- package/template/apps/asas-tanstack/src/routes/api/$.ts +11 -0
- package/template/apps/asas-tanstack/src/routes/auth.accept-invitation.tsx +108 -0
- package/template/apps/asas-tanstack/src/routes/auth.first-run.tsx +114 -0
- package/template/apps/asas-tanstack/src/routes/auth.forgot-password.tsx +94 -0
- package/template/apps/asas-tanstack/src/routes/auth.handoff.ts +39 -0
- package/template/apps/asas-tanstack/src/routes/auth.reset-password.tsx +16 -0
- package/template/apps/asas-tanstack/src/routes/auth.set-password.tsx +16 -0
- package/template/apps/asas-tanstack/src/routes/auth.sign-in.tsx +98 -0
- package/template/apps/asas-tanstack/src/routes/auth.sign-up.tsx +143 -0
- package/template/apps/asas-tanstack/src/routes/index.tsx +146 -0
- package/template/apps/asas-tanstack/src/routes/unauthorized.tsx +134 -0
- package/template/apps/asas-tanstack/src/screen-form.tsx +36 -0
- package/template/apps/asas-tanstack/src/screen-list.tsx +140 -0
- package/template/apps/asas-tanstack/src/screen-names.ts +10 -0
- package/template/apps/asas-tanstack/src/screens.tsx +888 -0
- package/template/apps/asas-tanstack/src/server.ts +26 -0
- package/template/apps/asas-tanstack/src/slide.ts +22 -0
- package/template/apps/asas-tanstack/src/start.ts +57 -0
- package/template/apps/asas-tanstack/src/styles.css +163 -0
- package/template/apps/asas-tanstack/src/theme.ts +5 -0
- package/template/apps/asas-tanstack/tsconfig.json +19 -0
- package/template/apps/asas-tanstack/vite.config.ts +34 -0
- package/template/package.json +16 -0
- package/template/templates/asas/.claude/skills/add-field/SKILL.md +27 -0
- package/template/templates/asas/.claude/skills/add-kayan/SKILL.md +26 -0
- package/template/templates/asas/.claude/skills/eject-admin-piece/SKILL.md +28 -0
- package/template/templates/asas/.claude/skills/upgrade-mithaq/SKILL.md +35 -0
- package/template/templates/asas/.env.example +33 -0
- package/template/templates/asas/AGENTS.md +101 -0
- package/template/templates/asas/CLAUDE.md +1 -0
- package/template/templates/asas/README.md +1056 -0
- package/template/templates/asas/mithaq.hints.json +25 -0
- package/template/templates/asas/package.json +53 -0
- package/template/templates/asas/src/asas.ts +118 -0
- package/template/templates/asas/src/backoffice-http.ts +117 -0
- package/template/templates/asas/src/dev-setup.ts +112 -0
- package/template/templates/asas/src/local-database.ts +22 -0
- package/template/templates/asas/src/messages/account.json +132 -0
- package/template/templates/asas/src/messages/auditLog.json +304 -0
- package/template/templates/asas/src/messages/backofficeLog.json +132 -0
- package/template/templates/asas/src/messages/courses.json +312 -0
- package/template/templates/asas/src/messages/enrollments.json +60 -0
- package/template/templates/asas/src/messages/invitation.json +82 -0
- package/template/templates/asas/src/messages/localUsers.json +48 -0
- package/template/templates/asas/src/messages/media.json +76 -0
- package/template/templates/asas/src/messages/member.json +62 -0
- package/template/templates/asas/src/messages/memberRoles.json +48 -0
- package/template/templates/asas/src/messages/mithaq.json +214 -0
- package/template/templates/asas/src/messages/organization.json +72 -0
- package/template/templates/asas/src/messages/organizationRole.json +62 -0
- package/template/templates/asas/src/messages/roles.json +72 -0
- package/template/templates/asas/src/messages/session.json +102 -0
- package/template/templates/asas/src/messages/sessions.json +136 -0
- package/template/templates/asas/src/messages/settings.json +64 -0
- package/template/templates/asas/src/messages/tags.json +48 -0
- package/template/templates/asas/src/messages/user.json +112 -0
- package/template/templates/asas/src/messages/verification.json +62 -0
- package/template/templates/asas/src/migrations/20260920080701_parched_tombstone/migration.sql +177 -0
- package/template/templates/asas/src/migrations/20260920080701_parched_tombstone/snapshot.json +2169 -0
- package/template/templates/asas/src/migrations/20260920230505_zippy_ben_urich/migration.sql +1 -0
- package/template/templates/asas/src/migrations/20260920230505_zippy_ben_urich/snapshot.json +2182 -0
- package/template/templates/asas/src/migrations/20260920231219_slim_retro_girl/migration.sql +20 -0
- package/template/templates/asas/src/migrations/20260920231219_slim_retro_girl/snapshot.json +2409 -0
- package/template/templates/asas/src/migrations/20260922082945_military_ironclad/migration.sql +15 -0
- package/template/templates/asas/src/migrations/20260922082945_military_ironclad/snapshot.json +2627 -0
- package/template/templates/asas/src/migrations/20260922112630_bitter_chat/migration.sql +5 -0
- package/template/templates/asas/src/migrations/20260922112630_bitter_chat/snapshot.json +2691 -0
- package/template/templates/asas/src/migrations/20260923235915_foamy_rachel_grey/migration.sql +8 -0
- package/template/templates/asas/src/migrations/20260923235915_foamy_rachel_grey/snapshot.json +2795 -0
- package/template/templates/asas/src/migrations/20260926145709_clean_the_initiative/migration.sql +3 -0
- package/template/templates/asas/src/migrations/20260926145709_clean_the_initiative/snapshot.json +2834 -0
- package/template/templates/asas/src/migrations/20260927212525_bent_prowler/migration.sql +9 -0
- package/template/templates/asas/src/migrations/20260927212525_bent_prowler/snapshot.json +2870 -0
- package/template/templates/asas/src/migrations/20260927223441_tranquil_bromley/migration.sql +1 -0
- package/template/templates/asas/src/migrations/20260927223441_tranquil_bromley/snapshot.json +2881 -0
- package/template/templates/asas/src/migrations/20260928030047_outgoing_wraith/migration.sql +15 -0
- package/template/templates/asas/src/migrations/20260928030047_outgoing_wraith/snapshot.json +3073 -0
- package/template/templates/asas/src/migrations/20260929024407_grey_morlun/migration.sql +21 -0
- package/template/templates/asas/src/migrations/20260929024407_grey_morlun/snapshot.json +3098 -0
- package/template/templates/asas/src/migrations/20260929130530_bored_jackal/migration.sql +21 -0
- package/template/templates/asas/src/migrations/20260929130530_bored_jackal/snapshot.json +3124 -0
- package/template/templates/asas/src/migrations/20260930102924_material_newton_destine/migration.sql +32 -0
- package/template/templates/asas/src/migrations/20260930102924_material_newton_destine/snapshot.json +3324 -0
- package/template/templates/asas/src/migrations/20261003022353_clumsy_taskmaster/migration.sql +2 -0
- package/template/templates/asas/src/migrations/20261003022353_clumsy_taskmaster/snapshot.json +3350 -0
- package/template/templates/asas/src/migrations/20261003143249_premium_red_shift/migration.sql +21 -0
- package/template/templates/asas/src/migrations/20261003143249_premium_red_shift/snapshot.json +3635 -0
- package/template/templates/asas/src/migrations/20261008215349_square_norrin_radd/migration.sql +8 -0
- package/template/templates/asas/src/migrations/20261008215349_square_norrin_radd/snapshot.json +3635 -0
- package/template/templates/asas/src/migrations/20261008230204_many_scarecrow/migration.sql +18 -0
- package/template/templates/asas/src/migrations/20261008230204_many_scarecrow/snapshot.json +3635 -0
- package/template/templates/asas/src/migrations/20261010005521_elite_giant_girl/migration.sql +18 -0
- package/template/templates/asas/src/migrations/20261010005521_elite_giant_girl/snapshot.json +3635 -0
- package/template/templates/asas/src/migrations/20261010120822_needy_thunderbolt/migration.sql +11 -0
- package/template/templates/asas/src/migrations/20261010120822_needy_thunderbolt/snapshot.json +3667 -0
- package/template/templates/asas/src/migrations/20261012000752_organization_ownership/migration.sql +48 -0
- package/template/templates/asas/src/migrations/20261012000752_organization_ownership/snapshot.json +3891 -0
- package/template/templates/asas/src/migrations/20261014221355_tags_restrict/migration.sql +1 -0
- package/template/templates/asas/src/migrations/20261014221355_tags_restrict/snapshot.json +3881 -0
- package/template/templates/asas/src/migrations/20261014222218_one_seat_per_session/migration.sql +1 -0
- package/template/templates/asas/src/migrations/20261014222218_one_seat_per_session/snapshot.json +3894 -0
- package/template/templates/asas/src/migrations/20261014223522_session_archive_reason/migration.sql +1 -0
- package/template/templates/asas/src/migrations/20261014223522_session_archive_reason/snapshot.json +3907 -0
- package/template/templates/asas/src/migrations/20261014225728_course_archive_by_operation/migration.sql +1 -0
- package/template/templates/asas/src/migrations/20261014225728_course_archive_by_operation/snapshot.json +3907 -0
- package/template/templates/asas/src/migrations/20261015042444_organization_names/migration.sql +1 -0
- package/template/templates/asas/src/migrations/20261015042444_organization_names/snapshot.json +3920 -0
- package/template/templates/asas/src/migrations/20261015053212_member_last_seen/migration.sql +1 -0
- package/template/templates/asas/src/migrations/20261015053212_member_last_seen/snapshot.json +3933 -0
- package/template/templates/asas/src/migrations/20261015093203_activity_and_staff_history/migration.sql +15 -0
- package/template/templates/asas/src/migrations/20261015093203_activity_and_staff_history/snapshot.json +4113 -0
- package/template/templates/asas/src/migrations/20261015095752_portal/migration.sql +2 -0
- package/template/templates/asas/src/migrations/20261015095752_portal/snapshot.json +4113 -0
- package/template/templates/asas/src/migrations/20261015135529_better_auth_indexes/migration.sql +9 -0
- package/template/templates/asas/src/migrations/20261015135529_better_auth_indexes/snapshot.json +4302 -0
- package/template/templates/asas/src/migrations/20261015162438_audit_changes_json/migration.sql +27 -0
- package/template/templates/asas/src/migrations/20261015162438_audit_changes_json/snapshot.json +4289 -0
- package/template/templates/asas/src/migrations/drizzle.config.ts +11 -0
- package/template/templates/asas/src/migrations/schema.ts +30 -0
- package/template/templates/asas/src/mithaq.ts +4 -0
- package/template/templates/asas/src/organizations.ts +3 -0
- package/template/templates/asas/src/seed.ts +427 -0
- package/template/templates/asas/src/ui-backoffice/home.tsx +63 -0
- package/template/templates/asas/src/ui-backoffice/organization-actions.tsx +121 -0
- package/template/templates/asas/src/ui-backoffice/record-page.tsx +30 -0
- package/template/templates/asas/src/ui-backoffice/role-cells.tsx +59 -0
- package/template/templates/asas/src/ui-backoffice/user-actions.tsx +249 -0
- package/template/templates/asas/src/ui-dashboard/dashboard.tsx +300 -0
- package/template/templates/asas/src/ui-dashboard/home.tsx +73 -0
- package/template/templates/asas/src/ui-dashboard/members-card.tsx +147 -0
- package/template/templates/asas/src/ui-dashboard/members.tsx +829 -0
- package/template/templates/asas/src/ui-dashboard/theme-provider.tsx +10 -0
- package/template/templates/asas/src/ui-dashboard/versions.tsx +446 -0
- package/template/templates/asas/src/ui-portal/courses-home.tsx +96 -0
- package/template/templates/asas/src/ui-portal/home.tsx +73 -0
- package/template/templates/asas/src/ui-portal/page.tsx +11 -0
- package/template/templates/features/audit-log/audit-log/audit-log.ts +284 -0
- package/template/templates/features/audit-log/backoffice-log/backoffice-log.ts +67 -0
- package/template/templates/features/audit-log/index.ts +4 -0
- package/template/templates/features/audit-log/package.json +13 -0
- package/template/templates/features/auth/index.ts +11 -0
- package/template/templates/features/auth/local-users/local-users.ts +143 -0
- package/template/templates/features/auth/package.json +13 -0
- package/template/templates/features/auth/user/account.access.ts +8 -0
- package/template/templates/features/auth/user/account.ts +31 -0
- package/template/templates/features/auth/user/index.ts +18 -0
- package/template/templates/features/auth/user/invitation.access.ts +4 -0
- package/template/templates/features/auth/user/invitation.ts +27 -0
- package/template/templates/features/auth/user/member.access.ts +10 -0
- package/template/templates/features/auth/user/member.screens.ts +37 -0
- package/template/templates/features/auth/user/member.ts +26 -0
- package/template/templates/features/auth/user/organization.access.ts +20 -0
- package/template/templates/features/auth/user/organization.screens.ts +37 -0
- package/template/templates/features/auth/user/organization.ts +25 -0
- package/template/templates/features/auth/user/organizationRole.access.ts +8 -0
- package/template/templates/features/auth/user/organizationRole.ts +25 -0
- package/template/templates/features/auth/user/session.access.ts +8 -0
- package/template/templates/features/auth/user/session.ts +28 -0
- package/template/templates/features/auth/user/user.access.ts +30 -0
- package/template/templates/features/auth/user/user.screens.ts +45 -0
- package/template/templates/features/auth/user/user.ts +31 -0
- package/template/templates/features/auth/user/verification.access.ts +8 -0
- package/template/templates/features/auth/user/verification.ts +23 -0
- package/template/templates/features/courses/courses/courses.ts +601 -0
- package/template/templates/features/courses/courses/cover-reads.ts +33 -0
- package/template/templates/features/courses/courses/ui/archived-badge.tsx +9 -0
- package/template/templates/features/courses/courses/ui/fee-cell.tsx +19 -0
- package/template/templates/features/courses/courses/ui/no-courses.tsx +13 -0
- package/template/templates/features/courses/courses/ui/status-cell.tsx +33 -0
- package/template/templates/features/courses/courses/ui/unpublish-button.tsx +15 -0
- package/template/templates/features/courses/domain/archive.ts +39 -0
- package/template/templates/features/courses/domain/on-offer.ts +6 -0
- package/template/templates/features/courses/enrollments/enrollments.ts +309 -0
- package/template/templates/features/courses/enrollments/ui/session-cell.tsx +75 -0
- package/template/templates/features/courses/enrollments/ui/session-labels.tsx +36 -0
- package/template/templates/features/courses/index.ts +8 -0
- package/template/templates/features/courses/package.json +24 -0
- package/template/templates/features/courses/portal/ui/catalogue.tsx +86 -0
- package/template/templates/features/courses/portal/ui/course.tsx +176 -0
- package/template/templates/features/courses/portal/ui/enrollments.tsx +170 -0
- package/template/templates/features/courses/portal/ui/parts.tsx +95 -0
- package/template/templates/features/courses/portal/ui/reads.ts +76 -0
- package/template/templates/features/courses/portal/ui/rules.ts +87 -0
- package/template/templates/features/courses/portal/ui/shell.tsx +194 -0
- package/template/templates/features/courses/sessions/seats.ts +42 -0
- package/template/templates/features/courses/sessions/sessions.ts +186 -0
- package/template/templates/features/media/index.ts +10 -0
- package/template/templates/features/media/media/media.ts +131 -0
- package/template/templates/features/media/media/ui/preview.tsx +143 -0
- package/template/templates/features/media/package.json +19 -0
- package/template/templates/features/roles/index.ts +4 -0
- package/template/templates/features/roles/member-roles/member-roles.ts +207 -0
- package/template/templates/features/roles/package.json +21 -0
- package/template/templates/features/roles/roles/roles.ts +184 -0
- package/template/templates/features/roles/roles/ui/role-form.tsx +267 -0
- package/template/templates/features/roles/roles/ui/roles.tsx +190 -0
- package/template/templates/features/settings/index.ts +3 -0
- package/template/templates/features/settings/package.json +13 -0
- package/template/templates/features/settings/settings/settings.ts +64 -0
- package/template/templates/features/tags/index.ts +3 -0
- package/template/templates/features/tags/package.json +14 -0
- package/template/templates/features/tags/tags/tags.ts +80 -0
- package/template/templates/mithaq/components.json +22 -0
- package/template/templates/mithaq/package.json +33 -0
- package/template/templates/mithaq/src/mail/index.ts +32 -0
- package/template/templates/mithaq/src/mail/mailers.ts +36 -0
- package/template/templates/mithaq/src/mithaq/audit-sink.ts +111 -0
- package/template/templates/mithaq/src/mithaq/auth/backoffice-roles.ts +108 -0
- package/template/templates/mithaq/src/mithaq/auth/index.ts +1859 -0
- package/template/templates/mithaq/src/mithaq/auth/organizations.ts +80 -0
- package/template/templates/mithaq/src/mithaq/pages.ts +83 -0
- package/template/templates/mithaq/src/mithaq/rich-text-nodes.ts +19 -0
- package/template/templates/mithaq/src/mithaq.ts +593 -0
- package/template/templates/mithaq/src/roles/default-member-roles.ts +29 -0
- package/template/templates/mithaq/src/roles/grants.ts +47 -0
- package/template/templates/mithaq/src/roles/member-access.ts +11 -0
- package/template/templates/mithaq/src/roles/statements.ts +13 -0
- package/template/templates/mithaq/src/roles/system-roles.ts +16 -0
- package/template/templates/mithaq/src/roles/tenant-access.ts +260 -0
- package/template/templates/mithaq/src/roles/tenant-roles.ts +321 -0
- package/template/templates/mithaq/src/steps/expected-updated-at.ts +41 -0
- package/template/templates/mithaq/src/storage/defaults.ts +156 -0
- package/template/templates/mithaq/src/storage/index.ts +97 -0
- package/template/templates/mithaq/src/storage/local.ts +143 -0
- package/template/templates/mithaq/src/storage/r2.ts +5 -0
- package/template/templates/mithaq/src/storage/s3.ts +91 -0
- package/template/templates/mithaq/src/storage/uploadthing.ts +59 -0
- package/template/templates/mithaq/src/ui/activity-page.tsx +33 -0
- package/template/templates/mithaq/src/ui/activity.tsx +527 -0
- package/template/templates/mithaq/src/ui/app-shell.tsx +268 -0
- package/template/templates/mithaq/src/ui/kpi-card.tsx +25 -0
- package/template/templates/mithaq/src/ui/record-page.tsx +50 -0
- package/template/templates/mithaq/src/ui/rich-text-nodes.tsx +33 -0
- package/template/templates/mithaq/src/ui/screen-nav.tsx +28 -0
- package/template/templates/mithaq/src/ui/table-page.tsx +9 -0
- package/template/templates/mithaq/src/ui/top-shell.tsx +60 -0
- package/README.md +0 -3
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// What the backoffice draws of the generated `member` kayan, which `mithaq
|
|
2
|
+
// generate auth` imports into `./member.ts` because this file sits beside it:
|
|
3
|
+
// every organization's members, each by the person's and the organization's name,
|
|
4
|
+
// filtered to one organization from that organization's row.
|
|
5
|
+
import { backofficeUi } from '@asas/mithaq'
|
|
6
|
+
import { appPage } from '@asas/mithaq/mithaq/pages.ts'
|
|
7
|
+
|
|
8
|
+
/** The provider's governance role by the project's word for it, never its slug. */
|
|
9
|
+
const role = { field: 'role', cell: backofficeUi('role-cells.tsx#MembershipRole') } as const
|
|
10
|
+
|
|
11
|
+
export const screens = {
|
|
12
|
+
backoffice: {
|
|
13
|
+
// A membership's record is titled by its person.
|
|
14
|
+
useAsTitle: 'userId',
|
|
15
|
+
pages: {
|
|
16
|
+
list: {
|
|
17
|
+
path: '/members',
|
|
18
|
+
page: appPage([{ layout: 'table', main: [{ list: {
|
|
19
|
+
columns: ['userId', 'organizationId', role, 'createdAt'],
|
|
20
|
+
filters: ['organizationId', 'userId', 'role', 'createdAt'],
|
|
21
|
+
// A membership is looked for by its person.
|
|
22
|
+
search: ['userId.name', 'userId.email'],
|
|
23
|
+
sort: '-createdAt',
|
|
24
|
+
} }] }]),
|
|
25
|
+
},
|
|
26
|
+
// A membership's record, which a row opens and which only reads.
|
|
27
|
+
view: {
|
|
28
|
+
path: '/members/:id',
|
|
29
|
+
page: appPage([{
|
|
30
|
+
layout: 'record',
|
|
31
|
+
main: [{ section: 'membership', label: { en: 'Membership', ar: 'العضوية' }, fields: ['userId', 'organizationId', role] }],
|
|
32
|
+
side: [{ section: 'record', label: { en: 'Record', ar: 'السجل' }, fields: ['createdAt', 'updatedAt'] }],
|
|
33
|
+
}]),
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
} as const
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Written by `mithaq generate auth` from the Better Auth options generate.providers names. Do not edit.
|
|
2
|
+
// This kayan's access and what each screen draws of it are the project's:
|
|
3
|
+
// `member.access.ts` exporting `access` and `member.screens.ts` exporting
|
|
4
|
+
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
|
+
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
|
+
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
|
+
import { organization } from './organization.ts'
|
|
9
|
+
import { user } from './user.ts'
|
|
10
|
+
import { access } from './member.access.ts'
|
|
11
|
+
import { screens } from './member.screens.ts'
|
|
12
|
+
|
|
13
|
+
export const member = defineKayan({
|
|
14
|
+
name: 'member',
|
|
15
|
+
targets: { ...screens, service: { operations: defaultOperations } },
|
|
16
|
+
access,
|
|
17
|
+
fields: {
|
|
18
|
+
...defaultFields,
|
|
19
|
+
id: { kind: 'text' },
|
|
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
|
+
role: { kind: 'text', rules: { required: true } },
|
|
23
|
+
createdAt: { kind: 'datetime', rules: { required: true } },
|
|
24
|
+
lastSeenAt: { kind: 'datetime' },
|
|
25
|
+
},
|
|
26
|
+
})
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// This project's access for the generated `organization` kayan, which `mithaq
|
|
2
|
+
// generate auth` imports into `./organization.ts` because this file sits
|
|
3
|
+
// beside it. The table is written here, beside the kayan it is for, and never
|
|
4
|
+
// in a file every kayan shares.
|
|
5
|
+
//
|
|
6
|
+
// An organization is written through no managed operation: Better Auth writes
|
|
7
|
+
// it through its own adapter, and the backoffice renames one through its own route.
|
|
8
|
+
// In the tenant app a member reads its active organization, the one every tenant-owned
|
|
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 backoffice app a
|
|
11
|
+
// backoffice role reads every organization, each column where it holds that
|
|
12
|
+
// column's key. The id and the name are held by `namesInTenant` for the
|
|
13
|
+
// reason `./user.access.ts` gives.
|
|
14
|
+
import { rows } from '@asas/mithaq'
|
|
15
|
+
import { namesInTenant, backofficeReads, user } from '@asas/mithaq/roles/tenant-access.ts'
|
|
16
|
+
|
|
17
|
+
export const access = rows(
|
|
18
|
+
{ '*': { read: { id: { equals: user.activeOrganizationId } } }, ...backofficeReads },
|
|
19
|
+
{ holds: namesInTenant('organization') },
|
|
20
|
+
)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// What each screen draws of the generated `organization` kayan, which `mithaq
|
|
2
|
+
// generate auth` imports into `./organization.ts` because this file sits beside
|
|
3
|
+
// it, spreading it into the kayan's `targets` after the generated titles of the
|
|
4
|
+
// screens it does not name, so the backoffice's block here is that screen's whole
|
|
5
|
+
// block, its title included, and the dashboard keeps the generated one. The
|
|
6
|
+
// backoffice lists every organization with the registry's list and renames it or
|
|
7
|
+
// opens its members from the slug column.
|
|
8
|
+
import { backofficeUi } from '@asas/mithaq'
|
|
9
|
+
import { appPage } from '@asas/mithaq/mithaq/pages.ts'
|
|
10
|
+
|
|
11
|
+
export const screens = {
|
|
12
|
+
backoffice: {
|
|
13
|
+
useAsTitle: 'name',
|
|
14
|
+
pages: {
|
|
15
|
+
list: {
|
|
16
|
+
path: '/organizations',
|
|
17
|
+
page: appPage([{ layout: 'table', main: [{ list: {
|
|
18
|
+
columns: ['name', { field: 'slug', cell: backofficeUi('organization-actions.tsx#OrganizationActions') }, 'createdAt'],
|
|
19
|
+
filters: ['name', 'slug', 'createdAt'],
|
|
20
|
+
search: ['name', 'slug'],
|
|
21
|
+
sort: 'name',
|
|
22
|
+
} }] }]),
|
|
23
|
+
},
|
|
24
|
+
// An organization's record, which a row opens and which only reads; its
|
|
25
|
+
// rename and its members stay on the list's slug column.
|
|
26
|
+
view: {
|
|
27
|
+
path: '/organizations/:id',
|
|
28
|
+
page: appPage([{
|
|
29
|
+
layout: 'record',
|
|
30
|
+
main: [{ section: 'organization', label: { en: 'Organization', ar: 'المؤسسة' }, fields: ['name', 'slug', 'logo', 'metadata'] }],
|
|
31
|
+
// No id: the record is read by its name.
|
|
32
|
+
side: [{ section: 'record', label: { en: 'Record', ar: 'السجل' }, fields: ['createdAt', 'updatedAt'] }],
|
|
33
|
+
}]),
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
} as const
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Written by `mithaq generate auth` from the Better Auth options generate.providers names. Do not edit.
|
|
2
|
+
// This kayan's access and what each screen draws of it are the project's:
|
|
3
|
+
// `organization.access.ts` exporting `access` and `organization.screens.ts` exporting
|
|
4
|
+
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
|
+
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
|
+
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
|
+
import { access } from './organization.access.ts'
|
|
9
|
+
import { screens } from './organization.screens.ts'
|
|
10
|
+
|
|
11
|
+
export const organization = defineKayan({
|
|
12
|
+
name: 'organization',
|
|
13
|
+
targets: { dashboard: { useAsTitle: 'name' }, ...screens, service: { operations: defaultOperations } },
|
|
14
|
+
access,
|
|
15
|
+
fields: {
|
|
16
|
+
...defaultFields,
|
|
17
|
+
id: { kind: 'text' },
|
|
18
|
+
name: { kind: 'text', rules: { required: true } },
|
|
19
|
+
slug: { kind: 'text', rules: { required: true, unique: true } },
|
|
20
|
+
logo: { kind: 'text' },
|
|
21
|
+
createdAt: { kind: 'datetime', rules: { required: true } },
|
|
22
|
+
metadata: { kind: 'text' },
|
|
23
|
+
names: { kind: 'text' },
|
|
24
|
+
},
|
|
25
|
+
})
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// This project's access for the generated `organizationRole` kayan, which `mithaq generate
|
|
2
|
+
// auth` imports into `./organizationRole.ts` because this file sits beside it.
|
|
3
|
+
//
|
|
4
|
+
// Better Auth alone writes and reads this table, through its own adapter,
|
|
5
|
+
// so every managed operation on it is refused to every actor. Written out
|
|
6
|
+
// rather than left to the administrator's default, which a super admin
|
|
7
|
+
// passes in the backoffice app.
|
|
8
|
+
export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Written by `mithaq generate auth` from the Better Auth options generate.providers names. Do not edit.
|
|
2
|
+
// This kayan's access and what each screen draws of it are the project's:
|
|
3
|
+
// `organizationRole.access.ts` exporting `access` and `organizationRole.screens.ts` exporting
|
|
4
|
+
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
|
+
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
|
+
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
|
+
import { organization } from './organization.ts'
|
|
9
|
+
import { access } from './organizationRole.access.ts'
|
|
10
|
+
|
|
11
|
+
export const organizationRole = defineKayan({
|
|
12
|
+
name: 'organizationRole',
|
|
13
|
+
dbName: 'organization_role',
|
|
14
|
+
targets: { service: { operations: defaultOperations } },
|
|
15
|
+
access,
|
|
16
|
+
fields: {
|
|
17
|
+
...defaultFields,
|
|
18
|
+
id: { kind: 'text' },
|
|
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
|
+
permission: { kind: 'text', rules: { required: true } },
|
|
22
|
+
createdAt: { kind: 'datetime', rules: { required: true } },
|
|
23
|
+
updatedAt: { kind: 'datetime', rules: { nowOnUpdate: true, providedBy: { update: 'application' } } },
|
|
24
|
+
},
|
|
25
|
+
})
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// This project's access for the generated `session` kayan, which `mithaq generate
|
|
2
|
+
// auth` imports into `./session.ts` because this file sits beside it.
|
|
3
|
+
//
|
|
4
|
+
// Better Auth alone writes and reads this table, through its own adapter, so
|
|
5
|
+
// every managed operation on it is refused to every actor. Written out rather
|
|
6
|
+
// than left to the administrator's default, which a super admin passes in the
|
|
7
|
+
// backoffice app.
|
|
8
|
+
export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Written by `mithaq generate auth` from the Better Auth options generate.providers names. Do not edit.
|
|
2
|
+
// This kayan's access and what each screen draws of it are the project's:
|
|
3
|
+
// `session.access.ts` exporting `access` and `session.screens.ts` exporting
|
|
4
|
+
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
|
+
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
|
+
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
|
+
import { user } from './user.ts'
|
|
9
|
+
import { access } from './session.access.ts'
|
|
10
|
+
|
|
11
|
+
export const session = defineKayan({
|
|
12
|
+
name: 'session',
|
|
13
|
+
targets: { service: { operations: defaultOperations } },
|
|
14
|
+
access,
|
|
15
|
+
fields: {
|
|
16
|
+
...defaultFields,
|
|
17
|
+
id: { kind: 'text' },
|
|
18
|
+
expiresAt: { kind: 'datetime', rules: { required: true } },
|
|
19
|
+
token: { kind: 'text', rules: { required: true, unique: true } },
|
|
20
|
+
createdAt: { kind: 'datetime', rules: { required: true } },
|
|
21
|
+
updatedAt: { kind: 'datetime', rules: { required: true, nowOnUpdate: true, providedBy: { update: 'application' } } },
|
|
22
|
+
ipAddress: { kind: 'text' },
|
|
23
|
+
userAgent: { kind: 'text' },
|
|
24
|
+
userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, index: true, onDelete: 'cascade' } },
|
|
25
|
+
impersonatedBy: { kind: 'text' },
|
|
26
|
+
activeOrganizationId: { kind: 'text' },
|
|
27
|
+
},
|
|
28
|
+
})
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// This project's access for the generated `user` kayan, which `mithaq generate
|
|
2
|
+
// auth` imports into `./user.ts` because this file sits beside it. The table is
|
|
3
|
+
// written here, beside the kayan it is for, and never in a file every kayan
|
|
4
|
+
// shares.
|
|
5
|
+
//
|
|
6
|
+
// A person is written through no managed operation: Better Auth writes it
|
|
7
|
+
// through its own adapter. The two sides of the backoffice line read it
|
|
8
|
+
// differently, and neither row reaches the other's side. In the tenant app a
|
|
9
|
+
// member reads its active organization's members by their id and their name
|
|
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. 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.
|
|
14
|
+
//
|
|
15
|
+
// The id and the name are held by `namesInTenant` rather than by a field list
|
|
16
|
+
// on the `'*'` row, because every actor with a role takes the `'*'` row, the
|
|
17
|
+
// backoffice's included, and a column one row's list leaves out is hidden
|
|
18
|
+
// whatever the other rows say.
|
|
19
|
+
//
|
|
20
|
+
// The `'*'` row reads every person, and `membersOf` narrows it to the active
|
|
21
|
+
// organization's members: a person carries no tenant column, and a row filter
|
|
22
|
+
// reaches one relationship hop from the kayan's own fields, which `user` has
|
|
23
|
+
// none of toward `member`.
|
|
24
|
+
import { rows, serverTargets } from '@asas/mithaq'
|
|
25
|
+
import { membersOf, namesInTenant, backofficeReads } from '@asas/mithaq/roles/tenant-access.ts'
|
|
26
|
+
|
|
27
|
+
export const access = {
|
|
28
|
+
...rows({ '*': { read: true }, ...backofficeReads }, { holds: namesInTenant('user') }),
|
|
29
|
+
read: membersOf(serverTargets.drizzle),
|
|
30
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// What each screen draws of the generated `user` kayan, which `mithaq generate
|
|
2
|
+
// auth` imports into `./user.ts` because this file sits beside it, spreading it
|
|
3
|
+
// into the kayan's `targets` after the generated titles of the screens it does
|
|
4
|
+
// not name, so the backoffice's block here is that screen's whole block, its
|
|
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 backoffice lists
|
|
7
|
+
// every person with the registry's list and acts on each from its row's menu
|
|
8
|
+
// and its own page.
|
|
9
|
+
import { backofficeUi } from '@asas/mithaq'
|
|
10
|
+
import { appPage } from '@asas/mithaq/mithaq/pages.ts'
|
|
11
|
+
|
|
12
|
+
export const screens = {
|
|
13
|
+
backoffice: {
|
|
14
|
+
useAsTitle: 'name',
|
|
15
|
+
pages: {
|
|
16
|
+
list: {
|
|
17
|
+
path: '/users',
|
|
18
|
+
page: appPage([{ layout: 'table', main: [{ list: {
|
|
19
|
+
columns: ['name', 'email', { field: 'role', cell: backofficeUi('user-actions.tsx#BackofficeRole') }, 'banned', 'createdAt'],
|
|
20
|
+
filters: ['name', 'email', 'role', 'banned', 'createdAt'],
|
|
21
|
+
search: ['name', 'email'],
|
|
22
|
+
sort: 'email',
|
|
23
|
+
// Set role, ban and impersonate, after the row menu's View.
|
|
24
|
+
menu: backofficeUi('user-actions.tsx#UserMenu'),
|
|
25
|
+
} }] }]),
|
|
26
|
+
},
|
|
27
|
+
// A person's record, which a row opens and which only reads: every
|
|
28
|
+
// column drawn by its cell, under the actions the row's menu offers, as buttons.
|
|
29
|
+
view: {
|
|
30
|
+
path: '/users/:id',
|
|
31
|
+
page: appPage([{
|
|
32
|
+
layout: 'record',
|
|
33
|
+
main: [
|
|
34
|
+
{ component: backofficeUi('user-actions.tsx#UserButtons') },
|
|
35
|
+
{ section: 'person', label: { en: 'Person', ar: 'الشخص' }, fields: ['name', 'email', 'emailVerified', 'image'] },
|
|
36
|
+
// The role by its label, where the column holds the slugs.
|
|
37
|
+
{ section: 'standing', label: { en: 'Standing in the backoffice', ar: 'الوضع في لوحة الإدارة الخلفية' }, fields: [{ field: 'role', cell: backofficeUi('user-actions.tsx#BackofficeRole') }, 'banned', 'banReason', 'banExpires'] },
|
|
38
|
+
],
|
|
39
|
+
// No id: a person reads the record by its name, and the address bar holds the id.
|
|
40
|
+
side: [{ section: 'record', label: { en: 'Record', ar: 'السجل' }, fields: ['createdAt', 'updatedAt'] }],
|
|
41
|
+
}]),
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
} as const
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Written by `mithaq generate auth` from the Better Auth options generate.providers names. Do not edit.
|
|
2
|
+
// This kayan's access and what each screen draws of it are the project's:
|
|
3
|
+
// `user.access.ts` exporting `access` and `user.screens.ts` exporting
|
|
4
|
+
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
|
+
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
|
+
import { betterAuth, defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
|
+
import { providers } from '@asas/mithaq/auth'
|
|
9
|
+
import { access } from './user.access.ts'
|
|
10
|
+
import { screens } from './user.screens.ts'
|
|
11
|
+
|
|
12
|
+
export const user = defineKayan({
|
|
13
|
+
name: 'user',
|
|
14
|
+
auth: betterAuth({ server: providers.user.server }),
|
|
15
|
+
targets: { dashboard: { useAsTitle: 'name' }, portal: { useAsTitle: 'name' }, ...screens, service: { operations: defaultOperations } },
|
|
16
|
+
access,
|
|
17
|
+
fields: {
|
|
18
|
+
...defaultFields,
|
|
19
|
+
id: { kind: 'text' },
|
|
20
|
+
name: { kind: 'text', rules: { required: true } },
|
|
21
|
+
email: { kind: 'text', rules: { required: true, unique: true } },
|
|
22
|
+
emailVerified: { kind: 'checkbox', rules: { required: true } },
|
|
23
|
+
image: { kind: 'text' },
|
|
24
|
+
createdAt: { kind: 'datetime', rules: { required: true } },
|
|
25
|
+
updatedAt: { kind: 'datetime', rules: { required: true, nowOnUpdate: true, providedBy: { update: 'application' } } },
|
|
26
|
+
role: { kind: 'text' },
|
|
27
|
+
banned: { kind: 'checkbox' },
|
|
28
|
+
banReason: { kind: 'text' },
|
|
29
|
+
banExpires: { kind: 'datetime' },
|
|
30
|
+
},
|
|
31
|
+
})
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// This project's access for the generated `verification` kayan, which `mithaq generate
|
|
2
|
+
// auth` imports into `./verification.ts` because this file sits beside it.
|
|
3
|
+
//
|
|
4
|
+
// Better Auth alone writes and reads this table, through its own adapter, so
|
|
5
|
+
// every managed operation on it is refused to every actor. Written out rather
|
|
6
|
+
// than left to the administrator's default, which a super admin passes in the
|
|
7
|
+
// backoffice app.
|
|
8
|
+
export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Written by `mithaq generate auth` from the Better Auth options generate.providers names. Do not edit.
|
|
2
|
+
// This kayan's access and what each screen draws of it are the project's:
|
|
3
|
+
// `verification.access.ts` exporting `access` and `verification.screens.ts` exporting
|
|
4
|
+
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
|
+
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
|
+
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
|
+
import { access } from './verification.access.ts'
|
|
9
|
+
|
|
10
|
+
export const verification = defineKayan({
|
|
11
|
+
name: 'verification',
|
|
12
|
+
targets: { service: { operations: defaultOperations } },
|
|
13
|
+
access,
|
|
14
|
+
fields: {
|
|
15
|
+
...defaultFields,
|
|
16
|
+
id: { kind: 'text' },
|
|
17
|
+
identifier: { kind: 'text', rules: { required: true, index: true } },
|
|
18
|
+
value: { kind: 'text', rules: { required: true } },
|
|
19
|
+
expiresAt: { kind: 'datetime', rules: { required: true } },
|
|
20
|
+
createdAt: { kind: 'datetime', rules: { required: true } },
|
|
21
|
+
updatedAt: { kind: 'datetime', rules: { required: true, nowOnUpdate: true, providedBy: { update: 'application' } } },
|
|
22
|
+
},
|
|
23
|
+
})
|