create-mithaq 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSES/openstatus-time-picker.txt +21 -0
- package/index.js +457 -63
- package/package.json +1 -1
- package/template/apps/{asas-platform → asas-backoffice}/package.json +5 -3
- package/template/apps/{asas-platform → asas-backoffice}/src/api.ts +1 -1
- package/template/apps/{asas-platform → asas-backoffice}/src/auth-frame.tsx +12 -12
- package/template/apps/asas-backoffice/src/components.ts +35 -0
- package/template/apps/asas-backoffice/src/first-user.ts +14 -0
- package/template/apps/{asas-platform → asas-backoffice}/src/links.ts +1 -1
- package/template/apps/{asas-platform → asas-backoffice}/src/locale-switch.tsx +7 -5
- 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-platform → asas-backoffice}/src/request-headers.ts +1 -1
- 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-platform/src/routes/(screens)/platform → asas-backoffice/src/routes/(screens)/backoffice}/screen.json +426 -64
- package/template/apps/{asas-platform/src/routes/(screens)/platform → asas-backoffice/src/routes/(screens)/backoffice}/types.ts +18 -0
- package/template/apps/{asas-platform/src/routes/(screens)/platform.$.tsx → asas-backoffice/src/routes/(screens)/backoffice.$.tsx} +4 -4
- package/template/apps/{asas-platform/src/routes/(screens)/platform.index.tsx → asas-backoffice/src/routes/(screens)/backoffice.index.tsx} +3 -3
- package/template/apps/{asas-platform/src/routes/(screens)/platform.tsx → asas-backoffice/src/routes/(screens)/backoffice.tsx} +3 -3
- package/template/apps/{asas-platform → asas-backoffice}/src/routes/__root.tsx +2 -2
- 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-platform → asas-backoffice}/src/routes/auth.sign-in.tsx +9 -4
- package/template/apps/{asas-platform → asas-backoffice}/src/routes/unauthorized.tsx +24 -12
- package/template/apps/{asas-platform → asas-backoffice}/src/screen-form.tsx +5 -3
- package/template/apps/{asas-platform → asas-backoffice}/src/screen-list.tsx +6 -5
- package/template/apps/{asas-platform → asas-backoffice}/src/screen-names.ts +1 -1
- package/template/apps/{asas-platform → asas-backoffice}/src/screens.tsx +46 -26
- package/template/apps/asas-backoffice/src/server.ts +30 -0
- package/template/apps/{asas-platform → asas-backoffice}/src/slide.ts +1 -1
- package/template/apps/{asas-platform → asas-backoffice}/src/start.ts +1 -1
- package/template/apps/{asas-platform → asas-backoffice}/src/styles.css +9 -7
- package/template/apps/{asas-platform → asas-backoffice}/tsconfig.json +2 -2
- package/template/apps/{asas-platform → asas-backoffice}/vite.config.ts +7 -1
- package/template/apps/asas-tanstack/package.json +4 -2
- package/template/apps/asas-tanstack/src/api.ts +1 -1
- package/template/apps/asas-tanstack/src/auth-frame.tsx +12 -12
- package/template/apps/asas-tanstack/src/choose-password.tsx +150 -0
- package/template/apps/asas-tanstack/src/components.ts +35 -0
- package/template/apps/asas-tanstack/src/copy.ts +416 -79
- package/template/apps/asas-tanstack/src/first-run.ts +16 -0
- package/template/apps/asas-tanstack/src/links.ts +1 -1
- package/template/apps/asas-tanstack/src/locale-switch.tsx +7 -5
- package/template/apps/asas-tanstack/src/no-organization.tsx +108 -0
- package/template/apps/asas-tanstack/src/redirect.ts +20 -1
- package/template/apps/asas-tanstack/src/request-headers.ts +1 -1
- package/template/apps/asas-tanstack/src/routeTree.gen.ts +42 -0
- package/template/apps/asas-tanstack/src/router.tsx +12 -1
- package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/files.ts +9 -2
- package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/screen.json +475 -116
- package/template/apps/asas-tanstack/src/routes/(screens)/dashboard/types.ts +4 -2
- package/template/apps/asas-tanstack/src/routes/(screens)/portal/files.ts +7 -2
- package/template/apps/asas-tanstack/src/routes/(screens)/portal/screen.json +83 -319
- package/template/apps/asas-tanstack/src/routes/(screens)/portal/types.ts +3 -1
- package/template/apps/asas-tanstack/src/routes/__root.tsx +1 -1
- package/template/apps/asas-tanstack/src/routes/auth.accept-invitation.tsx +14 -7
- package/template/apps/asas-tanstack/src/routes/auth.first-run.tsx +114 -0
- package/template/apps/asas-tanstack/src/routes/auth.forgot-password.tsx +2 -2
- package/template/apps/asas-tanstack/src/routes/auth.handoff.ts +5 -5
- package/template/apps/asas-tanstack/src/routes/auth.reset-password.tsx +7 -100
- package/template/apps/asas-tanstack/src/routes/auth.set-password.tsx +16 -0
- package/template/apps/asas-tanstack/src/routes/auth.sign-in.tsx +27 -15
- package/template/apps/asas-tanstack/src/routes/auth.sign-up.tsx +59 -38
- package/template/apps/asas-tanstack/src/routes/index.tsx +18 -14
- package/template/apps/asas-tanstack/src/routes/unauthorized.tsx +24 -12
- package/template/apps/asas-tanstack/src/screen-form.tsx +5 -3
- package/template/apps/asas-tanstack/src/screen-list.tsx +6 -5
- package/template/apps/asas-tanstack/src/screen-names.ts +1 -1
- package/template/apps/asas-tanstack/src/screens.tsx +46 -26
- package/template/apps/asas-tanstack/src/server.ts +10 -0
- package/template/apps/asas-tanstack/src/slide.ts +1 -1
- package/template/apps/asas-tanstack/src/styles.css +7 -3
- package/template/apps/asas-tanstack/tsconfig.json +2 -2
- package/template/apps/asas-tanstack/vite.config.ts +7 -1
- package/template/package.json +3 -3
- 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 +22 -5
- 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/package.json +19 -4
- package/template/templates/asas/src/asas.ts +81 -56
- package/template/templates/asas/src/{platform-http.ts → backoffice-http.ts} +48 -27
- 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 +129 -103
- package/template/templates/asas/src/messages/auditLog.json +223 -105
- package/template/templates/asas/src/messages/backofficeLog.json +132 -0
- package/template/templates/asas/src/messages/courses.json +256 -214
- package/template/templates/asas/src/messages/enrollments.json +45 -27
- package/template/templates/asas/src/messages/invitation.json +72 -56
- package/template/templates/asas/src/messages/localUsers.json +34 -28
- package/template/templates/asas/src/messages/media.json +31 -21
- package/template/templates/asas/src/messages/member.json +59 -39
- package/template/templates/asas/src/messages/memberRoles.json +37 -31
- package/template/templates/asas/src/messages/mithaq.json +206 -162
- package/template/templates/asas/src/messages/organization.json +63 -41
- package/template/templates/asas/src/messages/organizationRole.json +59 -47
- package/template/templates/asas/src/messages/roles.json +59 -45
- package/template/templates/asas/src/messages/session.json +99 -79
- package/template/templates/asas/src/messages/sessions.json +110 -80
- package/template/templates/asas/src/messages/settings.json +51 -53
- package/template/templates/asas/src/messages/tags.json +31 -21
- package/template/templates/asas/src/messages/user.json +109 -87
- package/template/templates/asas/src/messages/verification.json +59 -47
- 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/schema.ts +1 -0
- package/template/templates/asas/src/mithaq.ts +4 -406
- package/template/templates/asas/src/organizations.ts +3 -0
- package/template/templates/asas/src/seed.ts +147 -45
- package/template/templates/asas/src/{ui-platform → ui-backoffice}/home.tsx +9 -9
- package/template/templates/asas/src/ui-backoffice/organization-actions.tsx +121 -0
- package/template/templates/asas/src/{ui-platform → ui-backoffice}/record-page.tsx +4 -4
- package/template/templates/asas/src/{ui-platform → ui-backoffice}/role-cells.tsx +13 -6
- package/template/templates/asas/src/{ui-platform → ui-backoffice}/user-actions.tsx +46 -48
- package/template/templates/asas/src/ui-dashboard/dashboard.tsx +10 -4
- 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 +637 -438
- package/template/templates/asas/src/ui-dashboard/versions.tsx +22 -8
- package/template/templates/asas/src/ui-portal/courses-home.tsx +96 -0
- package/template/templates/asas/src/ui-portal/home.tsx +9 -13
- 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/{asas/src → features/auth}/local-users/local-users.ts +7 -7
- package/template/templates/{auth → features/auth}/package.json +2 -3
- package/template/templates/{asas/src/kayan → features}/auth/user/account.access.ts +2 -2
- package/template/templates/{asas/src/kayan → features}/auth/user/account.ts +2 -2
- package/template/templates/{asas/src/kayan → features}/auth/user/invitation.access.ts +1 -1
- package/template/templates/{asas/src/kayan → features}/auth/user/invitation.ts +3 -3
- package/template/templates/{asas/src/kayan → features}/auth/user/member.access.ts +4 -4
- package/template/templates/{asas/src/kayan → features}/auth/user/member.screens.ts +5 -5
- package/template/templates/{asas/src/kayan → features}/auth/user/member.ts +4 -3
- package/template/templates/{asas/src/kayan → features}/auth/user/organization.access.ts +6 -6
- package/template/templates/{asas/src/kayan → features}/auth/user/organization.screens.ts +6 -6
- package/template/templates/{asas/src/kayan → features}/auth/user/organization.ts +2 -1
- package/template/templates/{asas/src/kayan → features}/auth/user/organizationRole.access.ts +2 -2
- package/template/templates/{asas/src/kayan → features}/auth/user/organizationRole.ts +3 -3
- package/template/templates/{asas/src/kayan → features}/auth/user/session.access.ts +2 -2
- package/template/templates/{asas/src/kayan → features}/auth/user/session.ts +2 -2
- package/template/templates/{asas/src/kayan → features}/auth/user/user.access.ts +8 -7
- package/template/templates/{asas/src/kayan → features}/auth/user/user.screens.ts +9 -9
- package/template/templates/{asas/src/kayan → features}/auth/user/user.ts +2 -2
- package/template/templates/{asas/src/kayan → features}/auth/user/verification.access.ts +2 -2
- package/template/templates/{asas/src/kayan → features}/auth/user/verification.ts +2 -2
- package/template/templates/{asas/src → features/courses}/courses/courses.ts +122 -133
- 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/{asas/src → features/courses}/courses/ui/fee-cell.tsx +1 -1
- package/template/templates/{asas/src → features/courses}/courses/ui/status-cell.tsx +5 -3
- 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/{asas/src → features/courses}/enrollments/ui/session-cell.tsx +17 -7
- package/template/templates/{asas/src → features/courses/enrollments}/ui/session-labels.tsx +3 -3
- 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/{asas/src → features/courses}/sessions/sessions.ts +45 -14
- package/template/templates/features/media/index.ts +10 -0
- package/template/templates/{asas/src → features/media}/media/media.ts +34 -40
- package/template/templates/{asas/src → features/media}/media/ui/preview.tsx +2 -2
- package/template/templates/features/media/package.json +19 -0
- package/template/templates/features/roles/index.ts +4 -0
- package/template/templates/{asas/src → features/roles}/member-roles/member-roles.ts +15 -15
- package/template/templates/features/roles/package.json +21 -0
- package/template/templates/{asas/src → features/roles}/roles/roles.ts +23 -23
- package/template/templates/{asas/src → features/roles}/roles/ui/role-form.tsx +65 -24
- package/template/templates/{asas/src → features/roles}/roles/ui/roles.tsx +49 -25
- package/template/templates/features/settings/index.ts +3 -0
- package/template/templates/features/settings/package.json +13 -0
- package/template/templates/{asas/src → features/settings}/settings/settings.ts +12 -17
- package/template/templates/features/tags/index.ts +3 -0
- package/template/templates/features/tags/package.json +14 -0
- package/template/templates/{asas/src → features/tags}/tags/tags.ts +15 -15
- 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/{asas/src/audit-log/sink.ts → mithaq/src/mithaq/audit-sink.ts} +31 -9
- package/template/templates/{auth/src/platform-roles.ts → mithaq/src/mithaq/auth/backoffice-roles.ts} +44 -23
- 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/{asas/src → mithaq/src/mithaq}/pages.ts +16 -7
- 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/{asas → mithaq}/src/roles/grants.ts +1 -1
- package/template/templates/mithaq/src/roles/member-access.ts +11 -0
- package/template/templates/{asas/src → mithaq/src/roles}/statements.ts +6 -4
- package/template/templates/mithaq/src/roles/system-roles.ts +16 -0
- package/template/templates/{asas/src → mithaq/src/roles}/tenant-access.ts +96 -57
- package/template/templates/{asas/src → mithaq/src/roles}/tenant-roles.ts +84 -25
- package/template/templates/{asas → mithaq}/src/steps/expected-updated-at.ts +2 -2
- package/template/templates/{asas → mithaq}/src/storage/index.ts +3 -1
- package/template/templates/mithaq/src/ui/activity-page.tsx +33 -0
- package/template/templates/mithaq/src/ui/activity.tsx +527 -0
- package/template/templates/{asas → mithaq}/src/ui/app-shell.tsx +27 -19
- package/template/templates/mithaq/src/ui/rich-text-nodes.tsx +33 -0
- package/template/templates/{asas → mithaq}/src/ui/screen-nav.tsx +1 -1
- package/template/templates/{asas → mithaq}/src/ui/top-shell.tsx +8 -8
- package/template/apps/asas-platform/src/components/mithaq/cells.tsx +0 -112
- package/template/apps/asas-platform/src/components/mithaq/controls.tsx +0 -650
- package/template/apps/asas-platform/src/components/mithaq/field-shell.tsx +0 -53
- package/template/apps/asas-platform/src/components/mithaq/filter-operators.ts +0 -108
- package/template/apps/asas-platform/src/components/mithaq/form.tsx +0 -1467
- package/template/apps/asas-platform/src/components/mithaq/list-columns.tsx +0 -108
- package/template/apps/asas-platform/src/components/mithaq/list-filters.tsx +0 -368
- package/template/apps/asas-platform/src/components/mithaq/list-pagination.tsx +0 -153
- package/template/apps/asas-platform/src/components/mithaq/list-query.ts +0 -432
- package/template/apps/asas-platform/src/components/mithaq/list-selection.tsx +0 -74
- package/template/apps/asas-platform/src/components/mithaq/list.tsx +0 -865
- package/template/apps/asas-platform/src/components/mithaq/nav.tsx +0 -871
- package/template/apps/asas-platform/src/components/mithaq/nodes.tsx +0 -1024
- package/template/apps/asas-platform/src/components/mithaq/relationship-cell.tsx +0 -127
- package/template/apps/asas-platform/src/components/mithaq/relationship-control.tsx +0 -400
- package/template/apps/asas-platform/src/components/mithaq/rich-text-nodes.ts +0 -6
- package/template/apps/asas-platform/src/components/mithaq/rich-text.tsx +0 -1083
- package/template/apps/asas-platform/src/components/mithaq/upload.tsx +0 -686
- package/template/apps/asas-platform/src/components/ui/drawer.tsx +0 -216
- package/template/apps/asas-platform/src/redirect.ts +0 -1
- package/template/apps/asas-platform/src/routeTree.gen.ts +0 -181
- package/template/apps/asas-platform/src/router.tsx +0 -7
- package/template/apps/asas-platform/src/routes/(screens)/platform/files.ts +0 -4
- package/template/apps/asas-platform/src/routes/api/$.ts +0 -30
- package/template/apps/asas-platform/src/server.ts +0 -20
- package/template/apps/asas-tanstack/src/components/mithaq/cells.tsx +0 -112
- package/template/apps/asas-tanstack/src/components/mithaq/controls.tsx +0 -650
- package/template/apps/asas-tanstack/src/components/mithaq/field-shell.tsx +0 -53
- package/template/apps/asas-tanstack/src/components/mithaq/filter-operators.ts +0 -108
- package/template/apps/asas-tanstack/src/components/mithaq/form.tsx +0 -1467
- package/template/apps/asas-tanstack/src/components/mithaq/list-columns.tsx +0 -108
- package/template/apps/asas-tanstack/src/components/mithaq/list-filters.tsx +0 -368
- package/template/apps/asas-tanstack/src/components/mithaq/list-pagination.tsx +0 -153
- package/template/apps/asas-tanstack/src/components/mithaq/list-query.ts +0 -432
- package/template/apps/asas-tanstack/src/components/mithaq/list-selection.tsx +0 -74
- package/template/apps/asas-tanstack/src/components/mithaq/list.tsx +0 -865
- package/template/apps/asas-tanstack/src/components/mithaq/nav.tsx +0 -871
- package/template/apps/asas-tanstack/src/components/mithaq/nodes.tsx +0 -1024
- package/template/apps/asas-tanstack/src/components/mithaq/relationship-cell.tsx +0 -127
- package/template/apps/asas-tanstack/src/components/mithaq/relationship-control.tsx +0 -400
- package/template/apps/asas-tanstack/src/components/mithaq/rich-text-nodes.ts +0 -6
- package/template/apps/asas-tanstack/src/components/mithaq/rich-text.tsx +0 -1083
- package/template/apps/asas-tanstack/src/components/mithaq/upload.tsx +0 -686
- package/template/apps/asas-tanstack/src/components/ui/drawer.tsx +0 -215
- package/template/templates/asas/src/audit-log/audit-log.ts +0 -187
- package/template/templates/asas/src/audit-log/ui/activity.tsx +0 -243
- package/template/templates/asas/src/courses/ui/archive-button.tsx +0 -25
- package/template/templates/asas/src/courses/ui/no-courses-on-offer.tsx +0 -11
- package/template/templates/asas/src/courses/ui/on-offer.ts +0 -6
- package/template/templates/asas/src/enrollments/enrollments.ts +0 -137
- package/template/templates/asas/src/rich-text-nodes.ts +0 -11
- package/template/templates/asas/src/roles.ts +0 -16
- package/template/templates/asas/src/ui/rich-text-nodes.tsx +0 -15
- package/template/templates/asas/src/ui-platform/organization-actions.tsx +0 -114
- package/template/templates/auth/src/index.ts +0 -690
- /package/template/apps/{asas-platform → asas-backoffice}/components.json +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/gitignore +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/public/favicon.svg +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/accordion.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/alert-dialog.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/avatar.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/badge.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/breadcrumb.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/button-group.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/button.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/calendar.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/card.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/chart.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/checkbox.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/collapsible.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/combobox.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/dialog.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/direction.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/directional-icon.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/dropdown-menu.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/field.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/input-group.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/input-otp.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/input.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/label.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/popover.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/radio-group.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/resizable.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/scroll-area.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/select.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/separator.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/sheet.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/sidebar.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/skeleton.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/slider.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/spinner.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/switch.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/table.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/tabs.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/textarea.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/toggle-group.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/toggle.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/components/ui/tooltip.tsx +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/copy.ts +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/hooks/use-mobile.ts +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/lib/utils.ts +0 -0
- /package/template/apps/{asas-platform → asas-backoffice}/src/theme.ts +0 -0
- /package/template/templates/{asas/src/kayan → features}/auth/user/index.ts +0 -0
- /package/template/templates/{asas/src → features/courses}/courses/ui/no-courses.tsx +0 -0
- /package/template/templates/{asas → mithaq}/components.json +0 -0
- /package/template/templates/{asas → mithaq}/src/storage/defaults.ts +0 -0
- /package/template/templates/{asas → mithaq}/src/storage/local.ts +0 -0
- /package/template/templates/{asas → mithaq}/src/storage/r2.ts +0 -0
- /package/template/templates/{asas → mithaq}/src/storage/s3.ts +0 -0
- /package/template/templates/{asas → mithaq}/src/storage/uploadthing.ts +0 -0
- /package/template/templates/{asas → mithaq}/src/ui/kpi-card.tsx +0 -0
- /package/template/templates/{asas → mithaq}/src/ui/record-page.tsx +0 -0
- /package/template/templates/{asas → mithaq}/src/ui/table-page.tsx +0 -0
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
// Better Auth alone writes and reads this table, through its own adapter, so
|
|
5
5
|
// every managed operation on it is refused to every actor. Written out rather
|
|
6
6
|
// than left to the administrator's default, which a super admin passes in the
|
|
7
|
-
//
|
|
8
|
-
export { providerOnly as access } from '
|
|
7
|
+
// backoffice app.
|
|
8
|
+
export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
5
|
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
6
|
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
-
import { defineKayan } from '
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
8
|
import { user } from './user.ts'
|
|
9
9
|
import { access } from './account.access.ts'
|
|
10
10
|
|
|
@@ -17,7 +17,7 @@ export const account = defineKayan({
|
|
|
17
17
|
id: { kind: 'text' },
|
|
18
18
|
accountId: { kind: 'text', rules: { required: true } },
|
|
19
19
|
providerId: { kind: 'text', rules: { required: true } },
|
|
20
|
-
userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, onDelete: 'cascade' } },
|
|
20
|
+
userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, index: true, onDelete: 'cascade' } },
|
|
21
21
|
accessToken: { kind: 'text' },
|
|
22
22
|
refreshToken: { kind: 'text' },
|
|
23
23
|
idToken: { kind: 'text' },
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// Better Auth alone writes and reads this table, through its own adapter, so every managed
|
|
2
2
|
// operation on it is refused to every actor. Written out rather than left to the administrator's
|
|
3
3
|
// default, which a super admin passes.
|
|
4
|
-
export { providerOnly as access } from '
|
|
4
|
+
export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
5
|
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
6
|
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
-
import { defineKayan } from '
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
8
|
import { organization } from './organization.ts'
|
|
9
9
|
import { user } from './user.ts'
|
|
10
10
|
import { access } from './invitation.access.ts'
|
|
@@ -16,8 +16,8 @@ export const invitation = defineKayan({
|
|
|
16
16
|
fields: {
|
|
17
17
|
...defaultFields,
|
|
18
18
|
id: { kind: 'text' },
|
|
19
|
-
organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, onDelete: 'cascade' } },
|
|
20
|
-
email: { kind: 'text', rules: { required: true } },
|
|
19
|
+
organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, index: true, onDelete: 'cascade' } },
|
|
20
|
+
email: { kind: 'text', rules: { required: true, index: true } },
|
|
21
21
|
role: { kind: 'text' },
|
|
22
22
|
status: { kind: 'text', rules: { required: true } },
|
|
23
23
|
expiresAt: { kind: 'datetime', rules: { required: true } },
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// This project's access for the generated `member` kayan, which `mithaq
|
|
2
2
|
// generate auth` imports into `./member.ts` because this file sits beside it. A
|
|
3
|
-
//
|
|
3
|
+
// backoffice role reads every organization's members in the backoffice app, by the
|
|
4
4
|
// keys it holds, and no one writes through it. There is no `'*'` row, so a
|
|
5
5
|
// tenant's actor takes no row here and reads nothing: a tenant lists its
|
|
6
6
|
// members through the provider's own `list-members`.
|
|
7
|
-
import { rows } from '
|
|
8
|
-
import {
|
|
7
|
+
import { rows } from '@asas/mithaq'
|
|
8
|
+
import { backofficeReads } from '@asas/mithaq/roles/tenant-access.ts'
|
|
9
9
|
|
|
10
|
-
export const access = rows(
|
|
10
|
+
export const access = rows(backofficeReads)
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
// What the
|
|
1
|
+
// What the backoffice draws of the generated `member` kayan, which `mithaq
|
|
2
2
|
// generate auth` imports into `./member.ts` because this file sits beside it:
|
|
3
3
|
// every organization's members, each by the person's and the organization's name,
|
|
4
4
|
// filtered to one organization from that organization's row.
|
|
5
|
-
import {
|
|
6
|
-
import { appPage } from '
|
|
5
|
+
import { backofficeUi } from '@asas/mithaq'
|
|
6
|
+
import { appPage } from '@asas/mithaq/mithaq/pages.ts'
|
|
7
7
|
|
|
8
8
|
/** The provider's governance role by the project's word for it, never its slug. */
|
|
9
|
-
const role = { field: 'role', cell:
|
|
9
|
+
const role = { field: 'role', cell: backofficeUi('role-cells.tsx#MembershipRole') } as const
|
|
10
10
|
|
|
11
11
|
export const screens = {
|
|
12
|
-
|
|
12
|
+
backoffice: {
|
|
13
13
|
// A membership's record is titled by its person.
|
|
14
14
|
useAsTitle: 'userId',
|
|
15
15
|
pages: {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
5
|
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
6
|
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
-
import { defineKayan } from '
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
8
|
import { organization } from './organization.ts'
|
|
9
9
|
import { user } from './user.ts'
|
|
10
10
|
import { access } from './member.access.ts'
|
|
@@ -17,9 +17,10 @@ export const member = defineKayan({
|
|
|
17
17
|
fields: {
|
|
18
18
|
...defaultFields,
|
|
19
19
|
id: { kind: 'text' },
|
|
20
|
-
organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, onDelete: 'cascade' } },
|
|
21
|
-
userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, onDelete: 'cascade' } },
|
|
20
|
+
organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, index: true, onDelete: 'cascade' } },
|
|
21
|
+
userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, index: true, onDelete: 'cascade' } },
|
|
22
22
|
role: { kind: 'text', rules: { required: true } },
|
|
23
23
|
createdAt: { kind: 'datetime', rules: { required: true } },
|
|
24
|
+
lastSeenAt: { kind: 'datetime' },
|
|
24
25
|
},
|
|
25
26
|
})
|
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
// in a file every kayan shares.
|
|
5
5
|
//
|
|
6
6
|
// An organization is written through no managed operation: Better Auth writes
|
|
7
|
-
// it through its own adapter, and the
|
|
7
|
+
// it through its own adapter, and the backoffice renames one through its own route.
|
|
8
8
|
// In the tenant app a member reads its active organization, the one every tenant-owned
|
|
9
9
|
// row belongs to, and by its id and its name alone, so a tenant
|
|
10
|
-
// relationship shows a name on the dashboard. In the
|
|
11
|
-
//
|
|
10
|
+
// relationship shows a name on the dashboard. In the backoffice app a
|
|
11
|
+
// backoffice role reads every organization, each column where it holds that
|
|
12
12
|
// column's key. The id and the name are held by `namesInTenant` for the
|
|
13
13
|
// reason `./user.access.ts` gives.
|
|
14
|
-
import { rows } from '
|
|
15
|
-
import { namesInTenant,
|
|
14
|
+
import { rows } from '@asas/mithaq'
|
|
15
|
+
import { namesInTenant, backofficeReads, user } from '@asas/mithaq/roles/tenant-access.ts'
|
|
16
16
|
|
|
17
17
|
export const access = rows(
|
|
18
|
-
{ '*': { read: { id: { equals: user.activeOrganizationId } } }, ...
|
|
18
|
+
{ '*': { read: { id: { equals: user.activeOrganizationId } } }, ...backofficeReads },
|
|
19
19
|
{ holds: namesInTenant('organization') },
|
|
20
20
|
)
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
// What each screen draws of the generated `organization` kayan, which `mithaq
|
|
2
2
|
// generate auth` imports into `./organization.ts` because this file sits beside
|
|
3
3
|
// it, spreading it into the kayan's `targets` after the generated titles of the
|
|
4
|
-
// screens it does not name, so the
|
|
4
|
+
// screens it does not name, so the backoffice's block here is that screen's whole
|
|
5
5
|
// block, its title included, and the dashboard keeps the generated one. The
|
|
6
|
-
//
|
|
6
|
+
// backoffice lists every organization with the registry's list and renames it or
|
|
7
7
|
// opens its members from the slug column.
|
|
8
|
-
import {
|
|
9
|
-
import { appPage } from '
|
|
8
|
+
import { backofficeUi } from '@asas/mithaq'
|
|
9
|
+
import { appPage } from '@asas/mithaq/mithaq/pages.ts'
|
|
10
10
|
|
|
11
11
|
export const screens = {
|
|
12
|
-
|
|
12
|
+
backoffice: {
|
|
13
13
|
useAsTitle: 'name',
|
|
14
14
|
pages: {
|
|
15
15
|
list: {
|
|
16
16
|
path: '/organizations',
|
|
17
17
|
page: appPage([{ layout: 'table', main: [{ list: {
|
|
18
|
-
columns: ['name', { field: 'slug', cell:
|
|
18
|
+
columns: ['name', { field: 'slug', cell: backofficeUi('organization-actions.tsx#OrganizationActions') }, 'createdAt'],
|
|
19
19
|
filters: ['name', 'slug', 'createdAt'],
|
|
20
20
|
search: ['name', 'slug'],
|
|
21
21
|
sort: 'name',
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
5
|
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
6
|
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
-
import { defineKayan } from '
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
8
|
import { access } from './organization.access.ts'
|
|
9
9
|
import { screens } from './organization.screens.ts'
|
|
10
10
|
|
|
@@ -20,5 +20,6 @@ export const organization = defineKayan({
|
|
|
20
20
|
logo: { kind: 'text' },
|
|
21
21
|
createdAt: { kind: 'datetime', rules: { required: true } },
|
|
22
22
|
metadata: { kind: 'text' },
|
|
23
|
+
names: { kind: 'text' },
|
|
23
24
|
},
|
|
24
25
|
})
|
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
// Better Auth alone writes and reads this table, through its own adapter,
|
|
5
5
|
// so every managed operation on it is refused to every actor. Written out
|
|
6
6
|
// rather than left to the administrator's default, which a super admin
|
|
7
|
-
// passes in the
|
|
8
|
-
export { providerOnly as access } from '
|
|
7
|
+
// passes in the backoffice app.
|
|
8
|
+
export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
5
|
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
6
|
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
-
import { defineKayan } from '
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
8
|
import { organization } from './organization.ts'
|
|
9
9
|
import { access } from './organizationRole.access.ts'
|
|
10
10
|
|
|
@@ -16,8 +16,8 @@ export const organizationRole = defineKayan({
|
|
|
16
16
|
fields: {
|
|
17
17
|
...defaultFields,
|
|
18
18
|
id: { kind: 'text' },
|
|
19
|
-
organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, onDelete: 'cascade' } },
|
|
20
|
-
role: { kind: 'text', rules: { required: true } },
|
|
19
|
+
organizationId: { kind: 'relationship', relationTo: () => organization, dbName: 'organization_id', rules: { required: true, index: true, onDelete: 'cascade' } },
|
|
20
|
+
role: { kind: 'text', rules: { required: true, index: true } },
|
|
21
21
|
permission: { kind: 'text', rules: { required: true } },
|
|
22
22
|
createdAt: { kind: 'datetime', rules: { required: true } },
|
|
23
23
|
updatedAt: { kind: 'datetime', rules: { nowOnUpdate: true, providedBy: { update: 'application' } } },
|
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
// Better Auth alone writes and reads this table, through its own adapter, so
|
|
5
5
|
// every managed operation on it is refused to every actor. Written out rather
|
|
6
6
|
// than left to the administrator's default, which a super admin passes in the
|
|
7
|
-
//
|
|
8
|
-
export { providerOnly as access } from '
|
|
7
|
+
// backoffice app.
|
|
8
|
+
export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
5
|
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
6
|
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
-
import { defineKayan } from '
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
8
|
import { user } from './user.ts'
|
|
9
9
|
import { access } from './session.access.ts'
|
|
10
10
|
|
|
@@ -21,7 +21,7 @@ export const session = defineKayan({
|
|
|
21
21
|
updatedAt: { kind: 'datetime', rules: { required: true, nowOnUpdate: true, providedBy: { update: 'application' } } },
|
|
22
22
|
ipAddress: { kind: 'text' },
|
|
23
23
|
userAgent: { kind: 'text' },
|
|
24
|
-
userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, onDelete: 'cascade' } },
|
|
24
|
+
userId: { kind: 'relationship', relationTo: () => user, dbName: 'user_id', rules: { required: true, index: true, onDelete: 'cascade' } },
|
|
25
25
|
impersonatedBy: { kind: 'text' },
|
|
26
26
|
activeOrganizationId: { kind: 'text' },
|
|
27
27
|
},
|
|
@@ -4,26 +4,27 @@
|
|
|
4
4
|
// shares.
|
|
5
5
|
//
|
|
6
6
|
// A person is written through no managed operation: Better Auth writes it
|
|
7
|
-
// through its own adapter. The two sides of the
|
|
7
|
+
// through its own adapter. The two sides of the backoffice line read it
|
|
8
8
|
// differently, and neither row reaches the other's side. In the tenant app a
|
|
9
9
|
// member reads its active organization's members by their id and their name
|
|
10
10
|
// alone, so a relationship to a person shows a name in the dashboard's cell and
|
|
11
|
-
// picker, and no email, role or ban reaches a tenant.
|
|
12
|
-
//
|
|
11
|
+
// picker, and no email, role or ban reaches a tenant. Which members: all of them
|
|
12
|
+
// to a holder of `member.find`, otherwise itself and its roles' `peopleAudience`. In the backoffice app a
|
|
13
|
+
// backoffice role reads every person, each column where it holds that column's key.
|
|
13
14
|
//
|
|
14
15
|
// The id and the name are held by `namesInTenant` rather than by a field list
|
|
15
16
|
// on the `'*'` row, because every actor with a role takes the `'*'` row, the
|
|
16
|
-
//
|
|
17
|
+
// backoffice's included, and a column one row's list leaves out is hidden
|
|
17
18
|
// whatever the other rows say.
|
|
18
19
|
//
|
|
19
20
|
// The `'*'` row reads every person, and `membersOf` narrows it to the active
|
|
20
21
|
// organization's members: a person carries no tenant column, and a row filter
|
|
21
22
|
// reaches one relationship hop from the kayan's own fields, which `user` has
|
|
22
23
|
// none of toward `member`.
|
|
23
|
-
import { rows, serverTargets } from '
|
|
24
|
-
import { membersOf, namesInTenant,
|
|
24
|
+
import { rows, serverTargets } from '@asas/mithaq'
|
|
25
|
+
import { membersOf, namesInTenant, backofficeReads } from '@asas/mithaq/roles/tenant-access.ts'
|
|
25
26
|
|
|
26
27
|
export const access = {
|
|
27
|
-
...rows({ '*': { read: true }, ...
|
|
28
|
+
...rows({ '*': { read: true }, ...backofficeReads }, { holds: namesInTenant('user') }),
|
|
28
29
|
read: membersOf(serverTargets.drizzle),
|
|
29
30
|
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
// What each screen draws of the generated `user` kayan, which `mithaq generate
|
|
2
2
|
// auth` imports into `./user.ts` because this file sits beside it, spreading it
|
|
3
3
|
// into the kayan's `targets` after the generated titles of the screens it does
|
|
4
|
-
// not name, so the
|
|
4
|
+
// not name, so the backoffice's block here is that screen's whole block, its
|
|
5
5
|
// title included, and the dashboard keeps the generated one. The dashboard
|
|
6
|
-
// titles a person by name for its cells and pickers, and the
|
|
6
|
+
// titles a person by name for its cells and pickers, and the backoffice lists
|
|
7
7
|
// every person with the registry's list and acts on each from its row's menu
|
|
8
8
|
// and its own page.
|
|
9
|
-
import {
|
|
10
|
-
import { appPage } from '
|
|
9
|
+
import { backofficeUi } from '@asas/mithaq'
|
|
10
|
+
import { appPage } from '@asas/mithaq/mithaq/pages.ts'
|
|
11
11
|
|
|
12
12
|
export const screens = {
|
|
13
|
-
|
|
13
|
+
backoffice: {
|
|
14
14
|
useAsTitle: 'name',
|
|
15
15
|
pages: {
|
|
16
16
|
list: {
|
|
17
17
|
path: '/users',
|
|
18
18
|
page: appPage([{ layout: 'table', main: [{ list: {
|
|
19
|
-
columns: ['name', 'email', { field: 'role', cell:
|
|
19
|
+
columns: ['name', 'email', { field: 'role', cell: backofficeUi('user-actions.tsx#BackofficeRole') }, 'banned', 'createdAt'],
|
|
20
20
|
filters: ['name', 'email', 'role', 'banned', 'createdAt'],
|
|
21
21
|
search: ['name', 'email'],
|
|
22
22
|
sort: 'email',
|
|
23
23
|
// Set role, ban and impersonate, after the row menu's View.
|
|
24
|
-
menu:
|
|
24
|
+
menu: backofficeUi('user-actions.tsx#UserMenu'),
|
|
25
25
|
} }] }]),
|
|
26
26
|
},
|
|
27
27
|
// A person's record, which a row opens and which only reads: every
|
|
@@ -31,10 +31,10 @@ export const screens = {
|
|
|
31
31
|
page: appPage([{
|
|
32
32
|
layout: 'record',
|
|
33
33
|
main: [
|
|
34
|
-
{ component:
|
|
34
|
+
{ component: backofficeUi('user-actions.tsx#UserButtons') },
|
|
35
35
|
{ section: 'person', label: { en: 'Person', ar: 'الشخص' }, fields: ['name', 'email', 'emailVerified', 'image'] },
|
|
36
36
|
// The role by its label, where the column holds the slugs.
|
|
37
|
-
{ section: 'standing', label: { en: 'Standing
|
|
37
|
+
{ section: 'standing', label: { en: 'Standing in the backoffice', ar: 'الوضع في لوحة الإدارة الخلفية' }, fields: [{ field: 'role', cell: backofficeUi('user-actions.tsx#BackofficeRole') }, 'banned', 'banReason', 'banExpires'] },
|
|
38
38
|
],
|
|
39
39
|
// No id: a person reads the record by its name, and the address bar holds the id.
|
|
40
40
|
side: [{ section: 'record', label: { en: 'Record', ar: 'السجل' }, fields: ['createdAt', 'updatedAt'] }],
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
5
|
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
6
|
import { betterAuth, defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
-
import { defineKayan } from '
|
|
8
|
-
import { providers } from '@asas/auth'
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
|
+
import { providers } from '@asas/mithaq/auth'
|
|
9
9
|
import { access } from './user.access.ts'
|
|
10
10
|
import { screens } from './user.screens.ts'
|
|
11
11
|
|
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
// Better Auth alone writes and reads this table, through its own adapter, so
|
|
5
5
|
// every managed operation on it is refused to every actor. Written out rather
|
|
6
6
|
// than left to the administrator's default, which a super admin passes in the
|
|
7
|
-
//
|
|
8
|
-
export { providerOnly as access } from '
|
|
7
|
+
// backoffice app.
|
|
8
|
+
export { providerOnly as access } from '@asas/mithaq/roles/tenant-access.ts'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// `screens`, beside this file, are imported here on the next run. A kayan
|
|
5
5
|
// built under this one's name elsewhere is refused by every relationship to it.
|
|
6
6
|
import { defaultFields, defaultOperations } from 'mithaq'
|
|
7
|
-
import { defineKayan } from '
|
|
7
|
+
import { defineKayan } from '@asas/mithaq'
|
|
8
8
|
import { access } from './verification.access.ts'
|
|
9
9
|
|
|
10
10
|
export const verification = defineKayan({
|
|
@@ -14,7 +14,7 @@ export const verification = defineKayan({
|
|
|
14
14
|
fields: {
|
|
15
15
|
...defaultFields,
|
|
16
16
|
id: { kind: 'text' },
|
|
17
|
-
identifier: { kind: 'text', rules: { required: true } },
|
|
17
|
+
identifier: { kind: 'text', rules: { required: true, index: true } },
|
|
18
18
|
value: { kind: 'text', rules: { required: true } },
|
|
19
19
|
expiresAt: { kind: 'datetime', rules: { required: true } },
|
|
20
20
|
createdAt: { kind: 'datetime', rules: { required: true } },
|