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