@saasicat/ui-vue 0.4.0 → 0.6.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/README.md +64 -4
- package/dist/chunk-A3W2N26K.js +714 -0
- package/dist/chunk-QZOSDCNP.js +98 -0
- package/dist/chunk-X5SQ5HMB.js +3231 -0
- package/dist/client/index.cjs +3988 -0
- package/dist/client/index.d.cts +321 -0
- package/dist/client/index.d.ts +321 -0
- package/dist/client/index.js +70 -0
- package/dist/index.cjs +4446 -1249
- package/dist/index.d.cts +297 -888
- package/dist/index.d.ts +297 -888
- package/dist/index.js +609 -1348
- package/dist/messages-7b0P8W75.d.cts +1652 -0
- package/dist/messages-7b0P8W75.d.ts +1652 -0
- package/dist/quasar/index.cjs +3340 -0
- package/dist/quasar/index.d.cts +95 -0
- package/dist/quasar/index.d.ts +95 -0
- package/dist/quasar/index.js +96 -0
- package/dist/testing-e2e/admin-pages-suite.cjs +14 -11
- package/dist/testing-e2e/admin-pages-suite.js +14 -11
- package/dist/use-super-admin-i18n-B3v3-SWZ.d.ts +210 -0
- package/dist/use-super-admin-i18n-DMktRVEt.d.cts +210 -0
- package/package.json +23 -3
- package/src/{action-registry.ts → client/action-registry.ts} +4 -4
- package/src/{batch-column-fetcher.ts → client/batch-column-fetcher.ts} +4 -4
- package/src/{boot-loader.ts → client/boot-loader.ts} +3 -3
- package/src/client/i18n/currency.ts +42 -0
- package/src/client/i18n/define.ts +59 -0
- package/src/client/i18n/format.ts +12 -0
- package/src/client/i18n/index.ts +14 -0
- package/src/client/i18n/locale.ts +15 -0
- package/src/client/i18n/messages/audit.ts +42 -0
- package/src/client/i18n/messages/bundles.ts +459 -0
- package/src/client/i18n/messages/common.ts +147 -0
- package/src/client/i18n/messages/dashboard.ts +16 -0
- package/src/client/i18n/messages/discovery.ts +229 -0
- package/src/client/i18n/messages/email.ts +125 -0
- package/src/client/i18n/messages/marketing.ts +270 -0
- package/src/client/i18n/messages/nav.ts +72 -0
- package/src/client/i18n/messages/pilots.ts +192 -0
- package/src/client/i18n/messages/plan-detail.ts +266 -0
- package/src/client/i18n/messages/plan-editor.ts +177 -0
- package/src/client/i18n/messages/plan-versions.ts +251 -0
- package/src/client/i18n/messages/plans.ts +503 -0
- package/src/client/i18n/messages/promos.ts +202 -0
- package/src/client/i18n/messages/shell.ts +145 -0
- package/src/client/i18n/messages/tenants.ts +104 -0
- package/src/client/i18n/messages/users.ts +78 -0
- package/src/client/i18n/messages.ts +84 -0
- package/src/client/index.ts +27 -0
- package/src/{manifest-loader.ts → client/manifest-loader.ts} +4 -4
- package/src/{nav-builder.ts → client/nav-builder.ts} +44 -51
- package/src/{plan-versions-catalog.ts → client/plan-versions-catalog.ts} +42 -30
- package/src/components/BundleVersionPublishDialog.vue +35 -24
- package/src/components/FeatureGate.vue +1 -1
- package/src/components/MarketingPromotionsTab.vue +112 -59
- package/src/components/MfaPromptDialog.vue +11 -11
- package/src/components/TenantActionConfirmDialog.vue +19 -17
- package/src/components/VersionDiffPreview.vue +72 -43
- package/src/components/bundle-editor/BundleCreatePanel.vue +76 -63
- package/src/components/bundle-editor/BundleFeaturesEditor.vue +13 -6
- package/src/components/bundle-editor/BundlePlanCompatPicker.vue +19 -14
- package/src/components/bundle-editor/BundleQuotasEditor.vue +7 -4
- package/src/components/bundle-editor/BundleStatusBanner.vue +36 -19
- package/src/components/bundle-editor/BundleVersionInlineEditor.vue +51 -35
- package/src/components/bundle-editor/BundleVersionStrip.vue +24 -12
- package/src/components/bundle-editor/bundle-version-status.ts +29 -29
- package/src/components/dialogs/PilotCreateDialog.vue +58 -63
- package/src/components/dialogs/PilotEditDialog.vue +40 -34
- package/src/components/dialogs/PromoCodeCreateDialog.vue +89 -63
- package/src/components/dialogs/PromoCodeEditDialog.vue +98 -66
- package/src/components/dialogs/types.ts +3 -13
- package/src/components/plan/PlanCycleToggle.vue +21 -10
- package/src/components/plan/PlanGrid.vue +2 -2
- package/src/components/plan/PriceSummary.vue +1 -1
- package/src/components/plan/PromoCodeInput.vue +1 -1
- package/src/components/plan/PublicBundleGrid.vue +1 -1
- package/src/components/plan-cockpit/PlanCockpit.vue +34 -15
- package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +13 -6
- package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +18 -9
- package/src/components/plan-cockpit/PlanCockpitHeader.vue +9 -6
- package/src/components/plan-cockpit/PlanCockpitImpactPanel.vue +24 -11
- package/src/components/plan-cockpit/PlanCockpitKpis.vue +28 -17
- package/src/components/plan-cockpit/PlanCockpitVersions.vue +50 -25
- package/src/components/plan-create-dialog/PlanCreateDialog.vue +45 -35
- package/src/components/plan-detail/PlanAuditLog.vue +11 -6
- package/src/components/plan-detail/PlanDetail.vue +21 -23
- package/src/components/plan-detail/PlanDetailHeader.vue +20 -11
- package/src/components/plan-detail/PlanDetailKpis.vue +30 -17
- package/src/components/plan-detail/PlanTerminateDialog.vue +22 -9
- package/src/components/plan-detail/PlanVersionDiffPanel.vue +61 -27
- package/src/components/plan-detail/PlanVersionsPanel.vue +71 -36
- package/src/components/plan-list/PlanList.vue +99 -57
- package/src/components/plan-matrix/PlanMatrix.vue +85 -38
- package/src/components/plan-review/PlanReview.vue +105 -80
- package/src/components/plan-version-editor/PlanCatalogPreview.vue +43 -20
- package/src/components/plan-version-editor/PlanComponentPool.vue +15 -7
- package/src/components/plan-version-editor/PlanVersionBasket.vue +45 -24
- package/src/components/plan-version-editor/PlanVersionDiffDialog.vue +8 -7
- package/src/components/plan-version-editor/PlanVersionEditor.vue +74 -40
- package/src/components/plan-version-editor/PlanVersionEditorHeader.vue +24 -12
- package/src/index.ts +82 -79
- package/src/pages-standard/AdminLayout.vue +43 -18
- package/src/pages-standard/AdminManifestErrorPage.vue +10 -10
- package/src/pages-standard/AuditPage.vue +58 -19
- package/src/pages-standard/BundlesPage.vue +29 -18
- package/src/pages-standard/DashboardPage.vue +31 -17
- package/src/pages-standard/DiscoveryPage.vue +40 -28
- package/src/pages-standard/EmailHistoryPage.vue +98 -69
- package/src/pages-standard/MarketingCatalogPage.vue +40 -21
- package/src/pages-standard/PilotsPage.vue +64 -52
- package/src/pages-standard/PlanVersionsPage.vue +9 -5
- package/src/pages-standard/PlansPage.vue +91 -59
- package/src/pages-standard/PlatformEmailPage.vue +120 -53
- package/src/pages-standard/PromoCodeDetailPage.vue +66 -63
- package/src/pages-standard/PromoCodesPage.vue +51 -54
- package/src/pages-standard/SubscriptionsPage.vue +14 -9
- package/src/pages-standard/SuperAdminLoginPage.vue +19 -16
- package/src/pages-standard/SuperAdminSetupWizard.vue +53 -49
- package/src/pages-standard/TenantDetailPage.vue +54 -40
- package/src/pages-standard/TenantsPage.vue +57 -44
- package/src/pages-standard/UsersPage.vue +70 -52
- package/src/pages-standard/bundles-page/BundleAccordionList.vue +20 -8
- package/src/pages-standard/bundles-page/BundleDetailPanel.vue +28 -18
- package/src/pages-standard/bundles-page/BundlesFilterBar.vue +4 -1
- package/src/pages-standard/bundles-page/BundlesHeader.vue +9 -8
- package/src/pages-standard/bundles-page/BundlesKpis.vue +29 -11
- package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +20 -8
- package/src/pages-standard/discovery-page/DiscoveryCapList.vue +5 -3
- package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +43 -24
- package/src/pages-standard/discovery-page/DiscoveryHeader.vue +7 -4
- package/src/pages-standard/discovery-page/DiscoveryKpis.vue +28 -15
- package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +20 -10
- package/src/pages-standard/discovery-page/DiscoveryStatusControl.vue +9 -6
- package/src/pages-standard/discovery-page/discovery-ui.ts +40 -52
- package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +81 -49
- package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +13 -10
- package/src/pages-standard/marketing-catalog/MarketingCatalogPreview.vue +24 -20
- package/src/pages-standard/marketing-catalog/MarketingCatalogToolbar.vue +6 -3
- package/src/pages-standard/plan-versions/PlanDiffCard.vue +16 -6
- package/src/pages-standard/plan-versions/PlanVersionHeader.vue +42 -26
- package/src/pages-standard/plan-versions/PlanVersionsAudit.vue +46 -27
- package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +8 -6
- package/src/pages-standard/plan-versions/PlanVersionsList.vue +40 -17
- package/src/pages-standard/plan-versions/PlanVersionsMatrix.vue +1 -1
- package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +25 -13
- package/src/pages-standard/plan-versions/format.ts +33 -17
- package/src/pages-standard/plans-page/PlanArchiveDialog.vue +12 -8
- package/src/pages-standard/plans-page/PlanBundleOverview.vue +15 -6
- package/src/pages-standard/plans-page/PlanDiscardDraftDialog.vue +18 -7
- package/src/pages-standard/plans-page/PlanPublishDialog.vue +23 -12
- package/src/pages-standard/tenants/format.ts +3 -2
- package/src/pages-tenant/MySubscriptionBundlesPage.vue +73 -38
- package/src/pages-tenant/OnboardingConfigurator.vue +3 -3
- package/src/pages-tenant/PackageSnapshotPanel.vue +1 -1
- package/src/pages-tenant/PlanChangeWizard.vue +10 -6
- package/src/pages-tenant/TenantPlanSection.vue +20 -16
- package/src/pages-tenant/default-i18n.ts +217 -1
- package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +9 -7
- package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +11 -12
- package/src/pages-tenant/tenant-plan-section/TenantFeatureMatrix.vue +4 -1
- package/src/pages-tenant/tenant-plan-section/TenantPlanCardHeader.vue +1 -1
- package/src/pages-tenant/tenant-plan-section/TenantUsageGrid.vue +1 -1
- package/src/quasar/create-super-admin-app.ts +192 -0
- package/src/quasar/index.ts +11 -0
- package/src/quasar/notify.ts +30 -0
- package/src/testing-e2e/admin-pages-suite.ts +14 -11
- package/src/{manifest-store-factory.ts → vue/manifest-store-factory.ts} +1 -1
- package/src/{platform-loaders.ts → vue/platform-loaders.ts} +4 -4
- package/src/{project-page-host.ts → vue/project-page-host.ts} +6 -4
- package/src/{create-super-admin-app.ts → vue/super-admin-context.ts} +20 -139
- package/src/vue/ui-notify.ts +30 -0
- package/src/{use-actions.ts → vue/use-actions.ts} +1 -1
- package/src/{use-api-list.ts → vue/use-api-list.ts} +1 -1
- package/src/{use-audit-entries.ts → vue/use-audit-entries.ts} +3 -3
- package/src/{use-batch-columns.ts → vue/use-batch-columns.ts} +1 -1
- package/src/{use-bulk-publish.ts → vue/use-bulk-publish.ts} +7 -5
- package/src/{use-bundle-versions-map.ts → vue/use-bundle-versions-map.ts} +7 -5
- package/src/{use-bundles.ts → vue/use-bundles.ts} +14 -14
- package/src/{use-catalog-entries.ts → vue/use-catalog-entries.ts} +14 -11
- package/src/{use-discovery.ts → vue/use-discovery.ts} +9 -6
- package/src/{use-entitlement.ts → vue/use-entitlement.ts} +4 -4
- package/src/{use-live-plan-versions.ts → vue/use-live-plan-versions.ts} +5 -5
- package/src/{use-manifest.ts → vue/use-manifest.ts} +1 -1
- package/src/{use-marketing-projections.ts → vue/use-marketing-projections.ts} +10 -7
- package/src/{use-nav.ts → vue/use-nav.ts} +9 -3
- package/src/{use-plan-editor.ts → vue/use-plan-editor.ts} +2 -2
- package/src/{use-plan-versions.ts → vue/use-plan-versions.ts} +3 -3
- package/src/{use-plans.ts → vue/use-plans.ts} +13 -13
- package/src/{use-platform-tenant-actions.ts → vue/use-platform-tenant-actions.ts} +9 -6
- package/src/{use-promotions.ts → vue/use-promotions.ts} +10 -11
- package/src/{use-public-boot.ts → vue/use-public-boot.ts} +1 -1
- package/src/{use-subscription-draft.ts → vue/use-subscription-draft.ts} +2 -3
- package/src/{use-super-admin-context.ts → vue/use-super-admin-context.ts} +5 -5
- package/src/vue/use-super-admin-i18n.ts +82 -0
- package/src/{use-tenant-action-flow.ts → vue/use-tenant-action-flow.ts} +12 -7
- package/src/{use-tenant-billing-catalog.ts → vue/use-tenant-billing-catalog.ts} +2 -2
- package/src/{use-tenant-billing.ts → vue/use-tenant-billing.ts} +2 -2
- package/src/{use-tenant-manifest.ts → vue/use-tenant-manifest.ts} +2 -4
- package/src/{use-tenant-subscription-bundles.ts → vue/use-tenant-subscription-bundles.ts} +5 -5
- package/src/{use-tenants.ts → vue/use-tenants.ts} +3 -3
- package/dist/testing-e2e/admin-pages-suite.d.cts +0 -37
- package/dist/testing-e2e/admin-pages-suite.d.ts +0 -37
- package/src/components/BusinessTypeVersionEditorDialog.vue +0 -417
- package/src/components/BusinessTypeVersionPublishDialog.vue +0 -258
- package/src/pages-standard/BusinessTypesPage.vue +0 -662
- package/src/pages-standard/plan-versions/VersionDiffPreview.vue +0 -167
- package/src/use-business-types.ts +0 -269
- /package/src/{http-json.ts → client/http-json.ts} +0 -0
- /package/src/{types.ts → client/types.ts} +0 -0
- /package/src/{version.ts → client/version.ts} +0 -0
- /package/src/{create-admin-routes.ts → vue/create-admin-routes.ts} +0 -0
- /package/src/{entitlement-provider.ts → vue/entitlement-provider.ts} +0 -0
- /package/src/{feature-router-guard.ts → vue/feature-router-guard.ts} +0 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Component, App } from 'vue';
|
|
2
|
+
import { QuasarPluginOptions } from 'quasar';
|
|
3
|
+
import { Pinia } from 'pinia';
|
|
4
|
+
import { RouteRecordRaw, RouterHistory, Router } from 'vue-router';
|
|
5
|
+
import { H as HttpClient } from '../messages-7b0P8W75.cjs';
|
|
6
|
+
import { S as SuperAdminGuardOptions, a as SuperAdminBrand, b as SuperAdminEndpoints, E as ExtensionsMap, A as ActionsMap, c as SuperAdminLoginAdapter, U as UiNotify, I as InstallPlugin, d as SuperAdminI18nOptions, e as SuperAdminI18n } from '../use-super-admin-i18n-DMktRVEt.cjs';
|
|
7
|
+
import '@saasicat/types';
|
|
8
|
+
|
|
9
|
+
interface CreateSuperAdminAppOptions extends SuperAdminGuardOptions {
|
|
10
|
+
/** App root component (`App.vue`). */
|
|
11
|
+
rootComponent: Component;
|
|
12
|
+
/** App branding (logo, name). */
|
|
13
|
+
brand: SuperAdminBrand;
|
|
14
|
+
/** Endpoint configuration. */
|
|
15
|
+
endpoints: SuperAdminEndpoints;
|
|
16
|
+
/** App's own routes (login, standard pages, bundle pages, …). */
|
|
17
|
+
appRoutes: RouteRecordRaw[];
|
|
18
|
+
/**
|
|
19
|
+
* Static `extensions:` map. Manifest `projectPages[].componentKey` is
|
|
20
|
+
* looked up in it (see Spec §4.4).
|
|
21
|
+
*/
|
|
22
|
+
extensions?: ExtensionsMap;
|
|
23
|
+
/**
|
|
24
|
+
* Static `actions:` map. Manifest `tenants.actions[].actionKey` is looked
|
|
25
|
+
* up in it.
|
|
26
|
+
*/
|
|
27
|
+
actions?: ActionsMap;
|
|
28
|
+
/**
|
|
29
|
+
* Optional: login adapter. When set, it is exposed via `provide()` for the
|
|
30
|
+
* shared `<SuperAdminLoginPage>` (from `pages-standard/`) — the app no
|
|
31
|
+
* longer needs to hold its own LoginPage Vue component.
|
|
32
|
+
*/
|
|
33
|
+
loginAdapter?: SuperAdminLoginAdapter;
|
|
34
|
+
/**
|
|
35
|
+
* Optional: router history variant, default `createWebHistory()`.
|
|
36
|
+
* Apps with a subpath mount override this.
|
|
37
|
+
*/
|
|
38
|
+
routerHistory?: RouterHistory;
|
|
39
|
+
/**
|
|
40
|
+
* Optional: Quasar configuration. Default loads `Notify`/`Dialog`/`Loading`
|
|
41
|
+
* with the established consumer convention (`top-right`, 3 s).
|
|
42
|
+
*/
|
|
43
|
+
quasarOptions?: Partial<QuasarPluginOptions>;
|
|
44
|
+
/**
|
|
45
|
+
* Optional: notify port for the standard pages' toasts. Default is the
|
|
46
|
+
* Quasar `Notify` implementation — apps with their own notification
|
|
47
|
+
* center replace it here without touching the pages.
|
|
48
|
+
*/
|
|
49
|
+
notify?: UiNotify;
|
|
50
|
+
/**
|
|
51
|
+
* Optional: additional Vue plugins (e.g. an app's own NotificationCenter)
|
|
52
|
+
* that are installed after the platform setup, before the mount.
|
|
53
|
+
*/
|
|
54
|
+
installPlugins?: InstallPlugin[];
|
|
55
|
+
/**
|
|
56
|
+
* Optional: `HttpClient` for all pre-login calls (boot, first-run setup).
|
|
57
|
+
* Default `defaultHttpClient()` (= `fetch`). Consumers pass their own
|
|
58
|
+
* variant through (auth header, baseURL, retry) — it then applies uniformly,
|
|
59
|
+
* including for the setup wizard. Consumed via `useSuperAdminHttp()`.
|
|
60
|
+
*/
|
|
61
|
+
http?: HttpClient;
|
|
62
|
+
/**
|
|
63
|
+
* Optional: UI locale + string overrides. Default is German. The created
|
|
64
|
+
* context is returned on the handle (`handle.i18n`) — set
|
|
65
|
+
* `handle.i18n.locale.value = 'en'` (or pass a `Ref` here) to switch at
|
|
66
|
+
* runtime. Consumed via `useSuperAdminI18n()` / `useSaMessages()`.
|
|
67
|
+
*/
|
|
68
|
+
i18n?: SuperAdminI18nOptions;
|
|
69
|
+
}
|
|
70
|
+
interface SuperAdminAppHandle {
|
|
71
|
+
app: App;
|
|
72
|
+
router: Router;
|
|
73
|
+
pinia: Pinia;
|
|
74
|
+
/** i18n context of the shell — switch locale via `i18n.locale.value`. */
|
|
75
|
+
i18n: SuperAdminI18n;
|
|
76
|
+
/** Mounts the app on a selector. Returns the root component instance. */
|
|
77
|
+
mount: (selector: string | Element) => ReturnType<App['mount']>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Universal bootstrap function for SuperAdmin apps. Replaces the `main.ts`
|
|
81
|
+
* boilerplate duplicated per app today (Quasar + Pinia + Router + manifest
|
|
82
|
+
* guard) and exposes the platform maps via `provide()` for downstream
|
|
83
|
+
* components.
|
|
84
|
+
*/
|
|
85
|
+
declare function createSuperAdminApp(options: CreateSuperAdminAppOptions): SuperAdminAppHandle;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Quasar-backed notify port: `position: 'top'` matches the convention the
|
|
89
|
+
* standard pages used with their previous direct `$q.notify` calls.
|
|
90
|
+
*/
|
|
91
|
+
declare const quasarNotify: UiNotify;
|
|
92
|
+
/** Returns the app-provided notify port, falling back to the Quasar default. */
|
|
93
|
+
declare function useSuperAdminNotify(): UiNotify;
|
|
94
|
+
|
|
95
|
+
export { type CreateSuperAdminAppOptions, type SuperAdminAppHandle, createSuperAdminApp, quasarNotify, useSuperAdminNotify };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Component, App } from 'vue';
|
|
2
|
+
import { QuasarPluginOptions } from 'quasar';
|
|
3
|
+
import { Pinia } from 'pinia';
|
|
4
|
+
import { RouteRecordRaw, RouterHistory, Router } from 'vue-router';
|
|
5
|
+
import { H as HttpClient } from '../messages-7b0P8W75.js';
|
|
6
|
+
import { S as SuperAdminGuardOptions, a as SuperAdminBrand, b as SuperAdminEndpoints, E as ExtensionsMap, A as ActionsMap, c as SuperAdminLoginAdapter, U as UiNotify, I as InstallPlugin, d as SuperAdminI18nOptions, e as SuperAdminI18n } from '../use-super-admin-i18n-B3v3-SWZ.js';
|
|
7
|
+
import '@saasicat/types';
|
|
8
|
+
|
|
9
|
+
interface CreateSuperAdminAppOptions extends SuperAdminGuardOptions {
|
|
10
|
+
/** App root component (`App.vue`). */
|
|
11
|
+
rootComponent: Component;
|
|
12
|
+
/** App branding (logo, name). */
|
|
13
|
+
brand: SuperAdminBrand;
|
|
14
|
+
/** Endpoint configuration. */
|
|
15
|
+
endpoints: SuperAdminEndpoints;
|
|
16
|
+
/** App's own routes (login, standard pages, bundle pages, …). */
|
|
17
|
+
appRoutes: RouteRecordRaw[];
|
|
18
|
+
/**
|
|
19
|
+
* Static `extensions:` map. Manifest `projectPages[].componentKey` is
|
|
20
|
+
* looked up in it (see Spec §4.4).
|
|
21
|
+
*/
|
|
22
|
+
extensions?: ExtensionsMap;
|
|
23
|
+
/**
|
|
24
|
+
* Static `actions:` map. Manifest `tenants.actions[].actionKey` is looked
|
|
25
|
+
* up in it.
|
|
26
|
+
*/
|
|
27
|
+
actions?: ActionsMap;
|
|
28
|
+
/**
|
|
29
|
+
* Optional: login adapter. When set, it is exposed via `provide()` for the
|
|
30
|
+
* shared `<SuperAdminLoginPage>` (from `pages-standard/`) — the app no
|
|
31
|
+
* longer needs to hold its own LoginPage Vue component.
|
|
32
|
+
*/
|
|
33
|
+
loginAdapter?: SuperAdminLoginAdapter;
|
|
34
|
+
/**
|
|
35
|
+
* Optional: router history variant, default `createWebHistory()`.
|
|
36
|
+
* Apps with a subpath mount override this.
|
|
37
|
+
*/
|
|
38
|
+
routerHistory?: RouterHistory;
|
|
39
|
+
/**
|
|
40
|
+
* Optional: Quasar configuration. Default loads `Notify`/`Dialog`/`Loading`
|
|
41
|
+
* with the established consumer convention (`top-right`, 3 s).
|
|
42
|
+
*/
|
|
43
|
+
quasarOptions?: Partial<QuasarPluginOptions>;
|
|
44
|
+
/**
|
|
45
|
+
* Optional: notify port for the standard pages' toasts. Default is the
|
|
46
|
+
* Quasar `Notify` implementation — apps with their own notification
|
|
47
|
+
* center replace it here without touching the pages.
|
|
48
|
+
*/
|
|
49
|
+
notify?: UiNotify;
|
|
50
|
+
/**
|
|
51
|
+
* Optional: additional Vue plugins (e.g. an app's own NotificationCenter)
|
|
52
|
+
* that are installed after the platform setup, before the mount.
|
|
53
|
+
*/
|
|
54
|
+
installPlugins?: InstallPlugin[];
|
|
55
|
+
/**
|
|
56
|
+
* Optional: `HttpClient` for all pre-login calls (boot, first-run setup).
|
|
57
|
+
* Default `defaultHttpClient()` (= `fetch`). Consumers pass their own
|
|
58
|
+
* variant through (auth header, baseURL, retry) — it then applies uniformly,
|
|
59
|
+
* including for the setup wizard. Consumed via `useSuperAdminHttp()`.
|
|
60
|
+
*/
|
|
61
|
+
http?: HttpClient;
|
|
62
|
+
/**
|
|
63
|
+
* Optional: UI locale + string overrides. Default is German. The created
|
|
64
|
+
* context is returned on the handle (`handle.i18n`) — set
|
|
65
|
+
* `handle.i18n.locale.value = 'en'` (or pass a `Ref` here) to switch at
|
|
66
|
+
* runtime. Consumed via `useSuperAdminI18n()` / `useSaMessages()`.
|
|
67
|
+
*/
|
|
68
|
+
i18n?: SuperAdminI18nOptions;
|
|
69
|
+
}
|
|
70
|
+
interface SuperAdminAppHandle {
|
|
71
|
+
app: App;
|
|
72
|
+
router: Router;
|
|
73
|
+
pinia: Pinia;
|
|
74
|
+
/** i18n context of the shell — switch locale via `i18n.locale.value`. */
|
|
75
|
+
i18n: SuperAdminI18n;
|
|
76
|
+
/** Mounts the app on a selector. Returns the root component instance. */
|
|
77
|
+
mount: (selector: string | Element) => ReturnType<App['mount']>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Universal bootstrap function for SuperAdmin apps. Replaces the `main.ts`
|
|
81
|
+
* boilerplate duplicated per app today (Quasar + Pinia + Router + manifest
|
|
82
|
+
* guard) and exposes the platform maps via `provide()` for downstream
|
|
83
|
+
* components.
|
|
84
|
+
*/
|
|
85
|
+
declare function createSuperAdminApp(options: CreateSuperAdminAppOptions): SuperAdminAppHandle;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Quasar-backed notify port: `position: 'top'` matches the convention the
|
|
89
|
+
* standard pages used with their previous direct `$q.notify` calls.
|
|
90
|
+
*/
|
|
91
|
+
declare const quasarNotify: UiNotify;
|
|
92
|
+
/** Returns the app-provided notify port, falling back to the Quasar default. */
|
|
93
|
+
declare function useSuperAdminNotify(): UiNotify;
|
|
94
|
+
|
|
95
|
+
export { type CreateSuperAdminAppOptions, type SuperAdminAppHandle, createSuperAdminApp, quasarNotify, useSuperAdminNotify };
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SUPER_ADMIN_ACTIONS_KEY,
|
|
3
|
+
SUPER_ADMIN_BRAND_KEY,
|
|
4
|
+
SUPER_ADMIN_ENDPOINTS_KEY,
|
|
5
|
+
SUPER_ADMIN_EXTENSIONS_KEY,
|
|
6
|
+
SUPER_ADMIN_HTTP_KEY,
|
|
7
|
+
SUPER_ADMIN_I18N_KEY,
|
|
8
|
+
SUPER_ADMIN_LOGIN_ADAPTER_KEY,
|
|
9
|
+
SUPER_ADMIN_MANIFEST_KEY,
|
|
10
|
+
SUPER_ADMIN_NOTIFY_KEY,
|
|
11
|
+
buildNavigationGuard,
|
|
12
|
+
createSuperAdminI18n
|
|
13
|
+
} from "../chunk-QZOSDCNP.js";
|
|
14
|
+
import {
|
|
15
|
+
defaultHttpClient
|
|
16
|
+
} from "../chunk-X5SQ5HMB.js";
|
|
17
|
+
|
|
18
|
+
// src/quasar/create-super-admin-app.ts
|
|
19
|
+
import { createApp } from "vue";
|
|
20
|
+
import { Quasar, Notify as Notify2, Dialog, Loading } from "quasar";
|
|
21
|
+
import { createPinia } from "pinia";
|
|
22
|
+
import {
|
|
23
|
+
createRouter,
|
|
24
|
+
createWebHistory
|
|
25
|
+
} from "vue-router";
|
|
26
|
+
|
|
27
|
+
// src/quasar/notify.ts
|
|
28
|
+
import { inject } from "vue";
|
|
29
|
+
import { Notify } from "quasar";
|
|
30
|
+
var quasarNotify = (kind, message, options) => {
|
|
31
|
+
Notify.create({
|
|
32
|
+
type: kind,
|
|
33
|
+
message,
|
|
34
|
+
position: "top",
|
|
35
|
+
caption: options?.caption,
|
|
36
|
+
timeout: options?.timeoutMs
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
function useSuperAdminNotify() {
|
|
40
|
+
return inject(SUPER_ADMIN_NOTIFY_KEY, quasarNotify);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// src/quasar/create-super-admin-app.ts
|
|
44
|
+
var DEFAULT_QUASAR_OPTIONS = {
|
|
45
|
+
plugins: { Notify: Notify2, Dialog, Loading },
|
|
46
|
+
config: { notify: { position: "top-right", timeout: 3e3 } }
|
|
47
|
+
};
|
|
48
|
+
function createSuperAdminApp(options) {
|
|
49
|
+
const app = createApp(options.rootComponent);
|
|
50
|
+
app.use(Quasar, options.quasarOptions ?? DEFAULT_QUASAR_OPTIONS);
|
|
51
|
+
const pinia = createPinia();
|
|
52
|
+
app.use(pinia);
|
|
53
|
+
const router = createRouter({
|
|
54
|
+
history: options.routerHistory ?? createWebHistory(),
|
|
55
|
+
routes: options.appRoutes
|
|
56
|
+
});
|
|
57
|
+
const navGuard = buildNavigationGuard(options);
|
|
58
|
+
if (navGuard) {
|
|
59
|
+
router.beforeEach(navGuard);
|
|
60
|
+
}
|
|
61
|
+
app.use(router);
|
|
62
|
+
const endpoints = {
|
|
63
|
+
apiBase: options.endpoints.apiBase,
|
|
64
|
+
publicBootEndpoint: options.endpoints.publicBootEndpoint ?? `${options.endpoints.apiBase}/boot`,
|
|
65
|
+
manifestEndpoint: options.endpoints.manifestEndpoint ?? `${options.endpoints.apiBase}/manifest`
|
|
66
|
+
};
|
|
67
|
+
const i18n = createSuperAdminI18n(options.i18n);
|
|
68
|
+
app.provide(SUPER_ADMIN_BRAND_KEY, { tag: "SuperAdmin", ...options.brand });
|
|
69
|
+
app.provide(SUPER_ADMIN_I18N_KEY, i18n);
|
|
70
|
+
app.provide(SUPER_ADMIN_ENDPOINTS_KEY, endpoints);
|
|
71
|
+
app.provide(SUPER_ADMIN_EXTENSIONS_KEY, options.extensions ?? {});
|
|
72
|
+
app.provide(SUPER_ADMIN_ACTIONS_KEY, options.actions ?? {});
|
|
73
|
+
app.provide(SUPER_ADMIN_NOTIFY_KEY, options.notify ?? quasarNotify);
|
|
74
|
+
if (options.manifestGuard?.getManifest) {
|
|
75
|
+
app.provide(SUPER_ADMIN_MANIFEST_KEY, options.manifestGuard.getManifest);
|
|
76
|
+
}
|
|
77
|
+
if (options.loginAdapter) {
|
|
78
|
+
app.provide(SUPER_ADMIN_LOGIN_ADAPTER_KEY, options.loginAdapter);
|
|
79
|
+
}
|
|
80
|
+
app.provide(SUPER_ADMIN_HTTP_KEY, options.http ?? defaultHttpClient());
|
|
81
|
+
for (const plugin of options.installPlugins ?? []) {
|
|
82
|
+
plugin(app);
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
app,
|
|
86
|
+
router,
|
|
87
|
+
pinia,
|
|
88
|
+
i18n,
|
|
89
|
+
mount: (selector) => app.mount(selector)
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export {
|
|
93
|
+
createSuperAdminApp,
|
|
94
|
+
quasarNotify,
|
|
95
|
+
useSuperAdminNotify
|
|
96
|
+
};
|
|
@@ -60,7 +60,7 @@ function runAdminPagesSuite(test, expect, config) {
|
|
|
60
60
|
const dashboardPath = config.dashboardPath ?? "/admin/";
|
|
61
61
|
test.describe(`${config.appName}: SuperAdmin-Pages Smoke`, () => {
|
|
62
62
|
for (const pageDef of config.pages) {
|
|
63
|
-
test(`${pageDef.name}
|
|
63
|
+
test(`${pageDef.name} renders without errors`, async ({ page }) => {
|
|
64
64
|
const errors = attachListeners(
|
|
65
65
|
page,
|
|
66
66
|
config.consoleErrorAllowlist,
|
|
@@ -78,18 +78,18 @@ function runAdminPagesSuite(test, expect, config) {
|
|
|
78
78
|
timeout: 5e3
|
|
79
79
|
});
|
|
80
80
|
}
|
|
81
|
-
expect(errors.pageErrors, `pageerror
|
|
81
|
+
expect(errors.pageErrors, `pageerror events on ${pageDef.path}`).toHaveLength(0);
|
|
82
82
|
expect(
|
|
83
83
|
errors.consoleErrors,
|
|
84
|
-
`console.error
|
|
84
|
+
`console.error events on ${pageDef.path}`
|
|
85
85
|
).toHaveLength(0);
|
|
86
86
|
expect(
|
|
87
87
|
errors.networkErrors,
|
|
88
|
-
`HTTP
|
|
88
|
+
`HTTP errors on /api/ during ${pageDef.path}`
|
|
89
89
|
).toHaveLength(0);
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
|
-
test("Dashboard
|
|
92
|
+
test("Dashboard shows the expected KPIs, distributions and shortcuts", async ({ page }) => {
|
|
93
93
|
attachListeners(page, config.consoleErrorAllowlist);
|
|
94
94
|
await loginIfNeeded(page, config);
|
|
95
95
|
const origin = new URL(config.loginUrl).origin;
|
|
@@ -100,7 +100,9 @@ function runAdminPagesSuite(test, expect, config) {
|
|
|
100
100
|
const kpiLabels = await page.locator(".sa-kpi__label").allTextContents();
|
|
101
101
|
const normalizedKpis = kpiLabels.map((s) => s.trim());
|
|
102
102
|
for (const expected of config.expectedKpiLabels) {
|
|
103
|
-
expect(normalizedKpis, `KPI '${expected}'
|
|
103
|
+
expect(normalizedKpis, `KPI '${expected}' missing on the dashboard`).toContain(
|
|
104
|
+
expected
|
|
105
|
+
);
|
|
104
106
|
}
|
|
105
107
|
if (config.expectedDistributionTitles?.length) {
|
|
106
108
|
const distTitles = await page.locator(".sa-dashboard__row-head h2").allTextContents();
|
|
@@ -108,21 +110,22 @@ function runAdminPagesSuite(test, expect, config) {
|
|
|
108
110
|
for (const expected of config.expectedDistributionTitles) {
|
|
109
111
|
expect(
|
|
110
112
|
normalizedDist,
|
|
111
|
-
`Distribution '${expected}'
|
|
113
|
+
`Distribution '${expected}' missing on the dashboard`
|
|
112
114
|
).toContain(expected);
|
|
113
115
|
}
|
|
114
116
|
}
|
|
115
117
|
const shortcutTitles = await page.locator(".sa-dashboard__shortcut-title").allTextContents();
|
|
116
118
|
const normalizedShortcuts = shortcutTitles.map((s) => s.trim());
|
|
117
119
|
for (const expected of config.expectedShortcutTitles) {
|
|
118
|
-
expect(
|
|
119
|
-
|
|
120
|
-
|
|
120
|
+
expect(
|
|
121
|
+
normalizedShortcuts,
|
|
122
|
+
`Shortcut '${expected}' missing on the dashboard`
|
|
123
|
+
).toContain(expected);
|
|
121
124
|
}
|
|
122
125
|
for (const forbidden of config.forbiddenShortcutTitles ?? []) {
|
|
123
126
|
expect(
|
|
124
127
|
normalizedShortcuts,
|
|
125
|
-
`Shortcut '${forbidden}'
|
|
128
|
+
`Shortcut '${forbidden}' must not be on the dashboard`
|
|
126
129
|
).not.toContain(forbidden);
|
|
127
130
|
}
|
|
128
131
|
});
|
|
@@ -36,7 +36,7 @@ function runAdminPagesSuite(test, expect, config) {
|
|
|
36
36
|
const dashboardPath = config.dashboardPath ?? "/admin/";
|
|
37
37
|
test.describe(`${config.appName}: SuperAdmin-Pages Smoke`, () => {
|
|
38
38
|
for (const pageDef of config.pages) {
|
|
39
|
-
test(`${pageDef.name}
|
|
39
|
+
test(`${pageDef.name} renders without errors`, async ({ page }) => {
|
|
40
40
|
const errors = attachListeners(
|
|
41
41
|
page,
|
|
42
42
|
config.consoleErrorAllowlist,
|
|
@@ -54,18 +54,18 @@ function runAdminPagesSuite(test, expect, config) {
|
|
|
54
54
|
timeout: 5e3
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
|
-
expect(errors.pageErrors, `pageerror
|
|
57
|
+
expect(errors.pageErrors, `pageerror events on ${pageDef.path}`).toHaveLength(0);
|
|
58
58
|
expect(
|
|
59
59
|
errors.consoleErrors,
|
|
60
|
-
`console.error
|
|
60
|
+
`console.error events on ${pageDef.path}`
|
|
61
61
|
).toHaveLength(0);
|
|
62
62
|
expect(
|
|
63
63
|
errors.networkErrors,
|
|
64
|
-
`HTTP
|
|
64
|
+
`HTTP errors on /api/ during ${pageDef.path}`
|
|
65
65
|
).toHaveLength(0);
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
-
test("Dashboard
|
|
68
|
+
test("Dashboard shows the expected KPIs, distributions and shortcuts", async ({ page }) => {
|
|
69
69
|
attachListeners(page, config.consoleErrorAllowlist);
|
|
70
70
|
await loginIfNeeded(page, config);
|
|
71
71
|
const origin = new URL(config.loginUrl).origin;
|
|
@@ -76,7 +76,9 @@ function runAdminPagesSuite(test, expect, config) {
|
|
|
76
76
|
const kpiLabels = await page.locator(".sa-kpi__label").allTextContents();
|
|
77
77
|
const normalizedKpis = kpiLabels.map((s) => s.trim());
|
|
78
78
|
for (const expected of config.expectedKpiLabels) {
|
|
79
|
-
expect(normalizedKpis, `KPI '${expected}'
|
|
79
|
+
expect(normalizedKpis, `KPI '${expected}' missing on the dashboard`).toContain(
|
|
80
|
+
expected
|
|
81
|
+
);
|
|
80
82
|
}
|
|
81
83
|
if (config.expectedDistributionTitles?.length) {
|
|
82
84
|
const distTitles = await page.locator(".sa-dashboard__row-head h2").allTextContents();
|
|
@@ -84,21 +86,22 @@ function runAdminPagesSuite(test, expect, config) {
|
|
|
84
86
|
for (const expected of config.expectedDistributionTitles) {
|
|
85
87
|
expect(
|
|
86
88
|
normalizedDist,
|
|
87
|
-
`Distribution '${expected}'
|
|
89
|
+
`Distribution '${expected}' missing on the dashboard`
|
|
88
90
|
).toContain(expected);
|
|
89
91
|
}
|
|
90
92
|
}
|
|
91
93
|
const shortcutTitles = await page.locator(".sa-dashboard__shortcut-title").allTextContents();
|
|
92
94
|
const normalizedShortcuts = shortcutTitles.map((s) => s.trim());
|
|
93
95
|
for (const expected of config.expectedShortcutTitles) {
|
|
94
|
-
expect(
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
expect(
|
|
97
|
+
normalizedShortcuts,
|
|
98
|
+
`Shortcut '${expected}' missing on the dashboard`
|
|
99
|
+
).toContain(expected);
|
|
97
100
|
}
|
|
98
101
|
for (const forbidden of config.forbiddenShortcutTitles ?? []) {
|
|
99
102
|
expect(
|
|
100
103
|
normalizedShortcuts,
|
|
101
|
-
`Shortcut '${forbidden}'
|
|
104
|
+
`Shortcut '${forbidden}' must not be on the dashboard`
|
|
102
105
|
).not.toContain(forbidden);
|
|
103
106
|
}
|
|
104
107
|
});
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { Component, App, InjectionKey, Ref, ComputedRef } from 'vue';
|
|
2
|
+
import { NavigationGuardWithThis } from 'vue-router';
|
|
3
|
+
import { ActionKey, ComponentKey, AdminManifest } from '@saasicat/types';
|
|
4
|
+
import { A as ActionHandler, H as HttpClient, S as SaLocale, a as SaMessages, b as SaMessagesOverrides } from './messages-7b0P8W75.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* App-specific branding data that the platform `AdminLayout` and other
|
|
8
|
+
* consumers read via `useSuperAdminBrand()`.
|
|
9
|
+
*/
|
|
10
|
+
interface SuperAdminBrand {
|
|
11
|
+
/** 2-letter abbreviation in the logo badge (`'ma'`, `'da'`, …). */
|
|
12
|
+
logoText: string;
|
|
13
|
+
/** Full display name (`'DemoApp'`, `'ClubApp'`, …). */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Optional: tag to the right of the name, default `'SuperAdmin'`. */
|
|
16
|
+
tag?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Endpoint configuration. `apiBase` is the shared prefix under which
|
|
20
|
+
* `/manifest`, `/boot` and extra routes live.
|
|
21
|
+
*/
|
|
22
|
+
interface SuperAdminEndpoints {
|
|
23
|
+
/** Shared prefix, e.g. `'/api/admin'` or `'/api/v1/admin'`. */
|
|
24
|
+
apiBase: string;
|
|
25
|
+
/** Pre-login branding endpoint, default `${apiBase}/boot`. */
|
|
26
|
+
publicBootEndpoint?: string;
|
|
27
|
+
/** Post-login full-manifest endpoint, default `${apiBase}/manifest`. */
|
|
28
|
+
manifestEndpoint?: string;
|
|
29
|
+
}
|
|
30
|
+
type ExtensionLoader = () => Promise<Component | {
|
|
31
|
+
default: Component;
|
|
32
|
+
}>;
|
|
33
|
+
type ExtensionsMap = Record<ComponentKey, ExtensionLoader>;
|
|
34
|
+
type ActionsMap = Record<ActionKey, ActionHandler>;
|
|
35
|
+
interface SuperAdminAuthGuardOptions {
|
|
36
|
+
/** App provides: is the user currently logged in? */
|
|
37
|
+
isAuthenticated: () => boolean;
|
|
38
|
+
/** App provides: does the user have the SuperAdmin role? Default: only check `isAuthenticated`. */
|
|
39
|
+
isSuperAdmin?: () => boolean;
|
|
40
|
+
/** App provides: redirect path for unauthenticated calls (e.g. `'/login'`). */
|
|
41
|
+
onUnauthenticated: () => string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Result of a login attempt. Apps pass this back from their auth store to the
|
|
45
|
+
* platform LoginPage; the page renders an appropriate error message.
|
|
46
|
+
*
|
|
47
|
+
* `ok: true` → login succeeded, page redirects to `redirectAfterLogin`.
|
|
48
|
+
* `ok: false` → page shows `message` or a translation derived from `code`.
|
|
49
|
+
*
|
|
50
|
+
* Known codes:
|
|
51
|
+
* - `BAD_CREDENTIALS` — wrong email/password combination.
|
|
52
|
+
* - `NOT_SUPER_ADMIN` — account does not have the SuperAdmin role.
|
|
53
|
+
* - otherwise — app-specific; `message` is displayed directly.
|
|
54
|
+
*/
|
|
55
|
+
type SuperAdminLoginResult = {
|
|
56
|
+
ok: true;
|
|
57
|
+
} | {
|
|
58
|
+
ok: false;
|
|
59
|
+
code?: 'BAD_CREDENTIALS' | 'NOT_SUPER_ADMIN' | string;
|
|
60
|
+
message?: string;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Login adapter. The app passes its auth-store call through here. The platform
|
|
64
|
+
* LoginPage consumes it via `useSuperAdminLoginAdapter()`, without knowledge
|
|
65
|
+
* of app-specific stores (Pinia, auth API routes, MFA hooks).
|
|
66
|
+
*/
|
|
67
|
+
interface SuperAdminLoginAdapter {
|
|
68
|
+
/**
|
|
69
|
+
* Performs the login. The app store encapsulates the API call, token
|
|
70
|
+
* storage, MFA hops etc.
|
|
71
|
+
*/
|
|
72
|
+
login(email: string, password: string): Promise<SuperAdminLoginResult>;
|
|
73
|
+
/**
|
|
74
|
+
* Target route after a successful login. Default: `/admin/dashboard`
|
|
75
|
+
* (platform convention for the standard pages — apps with a different
|
|
76
|
+
* default mount override this here).
|
|
77
|
+
*/
|
|
78
|
+
redirectAfterLogin?: string;
|
|
79
|
+
/**
|
|
80
|
+
* Optional: dev hint (test account), shown below the form. Deliberately
|
|
81
|
+
* rendered only when `environment !== 'production'`.
|
|
82
|
+
*/
|
|
83
|
+
devHint?: {
|
|
84
|
+
email: string;
|
|
85
|
+
password: string;
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
interface SuperAdminManifestGuardOptions {
|
|
89
|
+
/**
|
|
90
|
+
* App provides: loads the manifest into the app store. The router guard
|
|
91
|
+
* `await`s the promise before the route is resolved.
|
|
92
|
+
*
|
|
93
|
+
* **On loader error:** the promise REJECTS. The router guard catches the
|
|
94
|
+
* rejection and decides depending on `errorRoute`:
|
|
95
|
+
* - `errorRoute` set → redirect to this route (fail-closed).
|
|
96
|
+
* - `errorRoute` not set → `console.error` + render allowed
|
|
97
|
+
* (defensive default behavior; the app must render the manifest gap
|
|
98
|
+
* itself).
|
|
99
|
+
*/
|
|
100
|
+
ensureLoaded: () => Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Optional: read accessor on the loaded manifest. When set, it is exposed
|
|
103
|
+
* via `provide(SUPER_ADMIN_MANIFEST_KEY)` — the `<ProjectPageHost>`
|
|
104
|
+
* resolves manifest `projectPages` through it against the
|
|
105
|
+
* `extensions:` map.
|
|
106
|
+
*/
|
|
107
|
+
getManifest?: () => AdminManifest | null;
|
|
108
|
+
/**
|
|
109
|
+
* Optional: path that the router guard redirects to on a manifest load
|
|
110
|
+
* error (fail-closed mode). The app must register the route in `appRoutes`
|
|
111
|
+
* and mark it as `meta.public = true`, otherwise it runs through the
|
|
112
|
+
* manifest guard again and produces a redirect loop.
|
|
113
|
+
*/
|
|
114
|
+
errorRoute?: string;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Guard configuration shared by `buildNavigationGuard()` and
|
|
118
|
+
* `createSuperAdminApp()` (which embeds both fields in its options).
|
|
119
|
+
*/
|
|
120
|
+
interface SuperAdminGuardOptions {
|
|
121
|
+
/**
|
|
122
|
+
* Optional: auth guard. When set, `router.beforeEach` is wired up
|
|
123
|
+
* automatically — `to.meta.public === true` bypasses the guard.
|
|
124
|
+
*/
|
|
125
|
+
authGuard?: SuperAdminAuthGuardOptions;
|
|
126
|
+
/**
|
|
127
|
+
* Optional: manifest guard. Runs after a successful auth guard, blocks the
|
|
128
|
+
* render until the manifest is loaded (prevents sidebar flicker).
|
|
129
|
+
*/
|
|
130
|
+
manifestGuard?: SuperAdminManifestGuardOptions;
|
|
131
|
+
}
|
|
132
|
+
/** Vue inject key for `useSuperAdminBrand()`. */
|
|
133
|
+
declare const SUPER_ADMIN_BRAND_KEY: InjectionKey<SuperAdminBrand>;
|
|
134
|
+
/** Vue inject key for `useSuperAdminEndpoints()`. */
|
|
135
|
+
declare const SUPER_ADMIN_ENDPOINTS_KEY: InjectionKey<Required<SuperAdminEndpoints>>;
|
|
136
|
+
/** Vue inject key for `useSuperAdminExtensions()`. */
|
|
137
|
+
declare const SUPER_ADMIN_EXTENSIONS_KEY: InjectionKey<ExtensionsMap>;
|
|
138
|
+
/** Vue inject key for `useSuperAdminActions()`. */
|
|
139
|
+
declare const SUPER_ADMIN_ACTIONS_KEY: InjectionKey<ActionsMap>;
|
|
140
|
+
/**
|
|
141
|
+
* Vue inject key for the manifest accessor. Only provided when
|
|
142
|
+
* `manifestGuard.getManifest` was passed to `createSuperAdminApp()` — the
|
|
143
|
+
* `<ProjectPageHost>` needs it to resolve project pages.
|
|
144
|
+
*/
|
|
145
|
+
declare const SUPER_ADMIN_MANIFEST_KEY: InjectionKey<() => AdminManifest | null>;
|
|
146
|
+
/** Vue inject key for `useSuperAdminLoginAdapter()`. */
|
|
147
|
+
declare const SUPER_ADMIN_LOGIN_ADAPTER_KEY: InjectionKey<SuperAdminLoginAdapter>;
|
|
148
|
+
/** Vue inject key for `useSuperAdminHttp()` (pre-login HttpClient). */
|
|
149
|
+
declare const SUPER_ADMIN_HTTP_KEY: InjectionKey<HttpClient>;
|
|
150
|
+
/**
|
|
151
|
+
* Additional Vue plugins (e.g. an app's own NotificationCenter) that a
|
|
152
|
+
* bootstrap installs after the platform setup, before the mount.
|
|
153
|
+
*/
|
|
154
|
+
type InstallPlugin = (app: App) => void;
|
|
155
|
+
/**
|
|
156
|
+
* Internal helper, exported for isolated unit tests of the navigation
|
|
157
|
+
* behavior (auth redirect, manifest fail-closed path). Consumers should call
|
|
158
|
+
* `createSuperAdminApp()`, not this helper directly.
|
|
159
|
+
*/
|
|
160
|
+
declare function buildNavigationGuard(options: SuperAdminGuardOptions): NavigationGuardWithThis<undefined> | null;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Feedback kind, aligned with the established page conventions
|
|
164
|
+
* (`positive` = success, `negative` = error).
|
|
165
|
+
*/
|
|
166
|
+
type UiNotifyKind = 'positive' | 'negative' | 'warning' | 'info';
|
|
167
|
+
interface UiNotifyOptions {
|
|
168
|
+
/** Secondary line below the message (e.g. changed fields, one-time password). */
|
|
169
|
+
caption?: string;
|
|
170
|
+
/** Display duration in ms; implementations fall back to their default when unset. */
|
|
171
|
+
timeoutMs?: number;
|
|
172
|
+
}
|
|
173
|
+
/** Notify port. Compatible with the `(kind, message)` callbacks pages already accept. */
|
|
174
|
+
type UiNotify = (kind: UiNotifyKind, message: string, options?: UiNotifyOptions) => void;
|
|
175
|
+
/** Vue inject key for the notify port (see `Symbol.for` note in super-admin-context.ts). */
|
|
176
|
+
declare const SUPER_ADMIN_NOTIFY_KEY: InjectionKey<UiNotify>;
|
|
177
|
+
|
|
178
|
+
interface SuperAdminI18n {
|
|
179
|
+
/** Active UI locale — mutable; switching re-renders all catalog texts. */
|
|
180
|
+
locale: Ref<SaLocale>;
|
|
181
|
+
/** Resolved catalog for the active locale (platform + app overrides). */
|
|
182
|
+
messages: ComputedRef<SaMessages>;
|
|
183
|
+
/** BCP-47 tag for `Intl`/`toLocaleString` formatting in the active locale. */
|
|
184
|
+
intlLocale: ComputedRef<string>;
|
|
185
|
+
}
|
|
186
|
+
interface SuperAdminI18nOptions {
|
|
187
|
+
/**
|
|
188
|
+
* Initial UI locale, default `'de'`. Pass a `Ref` when the app wants to
|
|
189
|
+
* keep control (e.g. a user-profile setting or a header switcher).
|
|
190
|
+
*/
|
|
191
|
+
locale?: SaLocale | Ref<SaLocale>;
|
|
192
|
+
/** Per-locale string overrides layered over the platform catalog. */
|
|
193
|
+
overrides?: Partial<Record<SaLocale, SaMessagesOverrides>>;
|
|
194
|
+
}
|
|
195
|
+
declare const SUPER_ADMIN_I18N_KEY: InjectionKey<SuperAdminI18n>;
|
|
196
|
+
declare function createSuperAdminI18n(options?: SuperAdminI18nOptions): SuperAdminI18n;
|
|
197
|
+
/**
|
|
198
|
+
* Returns the i18n context provided by `createSuperAdminApp()`. Outside a
|
|
199
|
+
* shell (isolated mounts, tests) a shared German default instance is returned
|
|
200
|
+
* so callers never have to guard for a missing context.
|
|
201
|
+
*/
|
|
202
|
+
declare function useSuperAdminI18n(): SuperAdminI18n;
|
|
203
|
+
/**
|
|
204
|
+
* Focused accessor for one catalog namespace:
|
|
205
|
+
* `const msg = useSaMessages('plans')` → `msg.value.title` /
|
|
206
|
+
* template `msg.title`.
|
|
207
|
+
*/
|
|
208
|
+
declare function useSaMessages<K extends keyof SaMessages>(namespace: K): ComputedRef<SaMessages[K]>;
|
|
209
|
+
|
|
210
|
+
export { type ActionsMap as A, type ExtensionsMap as E, type InstallPlugin as I, type SuperAdminGuardOptions as S, type UiNotify as U, type SuperAdminBrand as a, type SuperAdminEndpoints as b, type SuperAdminLoginAdapter as c, type SuperAdminI18nOptions as d, type SuperAdminI18n as e, type ExtensionLoader as f, SUPER_ADMIN_ACTIONS_KEY as g, SUPER_ADMIN_BRAND_KEY as h, SUPER_ADMIN_ENDPOINTS_KEY as i, SUPER_ADMIN_EXTENSIONS_KEY as j, SUPER_ADMIN_HTTP_KEY as k, SUPER_ADMIN_I18N_KEY as l, SUPER_ADMIN_LOGIN_ADAPTER_KEY as m, SUPER_ADMIN_MANIFEST_KEY as n, SUPER_ADMIN_NOTIFY_KEY as o, type SuperAdminAuthGuardOptions as p, type SuperAdminLoginResult as q, type SuperAdminManifestGuardOptions as r, type UiNotifyKind as s, type UiNotifyOptions as t, buildNavigationGuard as u, createSuperAdminI18n as v, useSaMessages as w, useSuperAdminI18n as x };
|