@saasicat/ui-vue 0.24.2 → 0.26.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 +32 -8
- package/dist/{catalog-DJcfm5N2.d.cts → catalog-Dch1Ryw0.d.cts} +353 -69
- package/dist/{catalog-DJcfm5N2.d.ts → catalog-Dch1Ryw0.d.ts} +353 -69
- package/dist/{chunk-F7NRM6KI.js → chunk-BPF2BMCQ.js} +748 -24
- package/dist/{chunk-D74FFCCP.js → chunk-NEXTZZRQ.js} +95 -177
- package/dist/{chunk-TQQMKWN6.js → chunk-O3J3ITF2.js} +119 -7
- package/dist/client/index.cjs +758 -83
- package/dist/client/index.d.cts +414 -9
- package/dist/client/index.d.ts +414 -9
- package/dist/client/index.js +84 -12
- package/dist/index.cjs +1325 -294
- package/dist/index.d.cts +205 -15
- package/dist/index.d.ts +205 -15
- package/dist/index.js +566 -240
- package/dist/quasar/index.cjs +574 -62
- package/dist/quasar/index.d.cts +61 -6
- package/dist/quasar/index.d.ts +61 -6
- package/dist/quasar/index.js +83 -19
- package/dist/{use-sa-theme-OUBlaqgl.d.ts → resource-registry-D7Xjs-5f.d.cts} +157 -7
- package/dist/{use-sa-theme-B5t7oXph.d.cts → resource-registry-TaR7rtq0.d.ts} +157 -7
- package/package.json +4 -3
- package/src/client/admin-error.ts +552 -0
- package/src/client/admin-resource-client.ts +9 -12
- package/src/client/batch-column-fetcher.ts +2 -2
- package/src/client/boot-loader.ts +12 -1
- package/src/client/http/axios-http-client.ts +383 -0
- package/src/client/http/fetch-http-client.ts +89 -0
- package/src/client/http/index.ts +6 -0
- package/src/client/http-json.ts +82 -16
- package/src/client/i18n/messages/discovery.ts +0 -6
- package/src/client/i18n/messages/errors.ts +44 -0
- package/src/client/i18n/messages/marketing.ts +0 -6
- package/src/client/i18n/messages/promos.ts +0 -2
- package/src/client/i18n/messages/shell.ts +12 -0
- package/src/client/i18n/messages.ts +3 -0
- package/src/client/index.ts +6 -0
- package/src/client/manifest-loader.ts +65 -15
- package/src/client/resources/audit.resource.ts +25 -0
- package/src/client/resources/define-resource.ts +166 -0
- package/src/client/resources/index.ts +42 -0
- package/src/client/resources/list-resource.ts +176 -0
- package/src/client/resources/plans.resource.ts +169 -0
- package/src/client/resources/resource-request.ts +117 -0
- package/src/client/resources/tenants.resource.ts +27 -0
- package/src/client/types.ts +10 -3
- package/src/components/BundleVersionPublishDialog.vue +1 -1
- package/src/components/MarketingPromotionsTab.vue +263 -241
- package/src/components/ThemeSwitcher.vue +85 -0
- package/src/components/admin-page/AdminAccordion.vue +125 -0
- package/src/components/bundle-editor/BundleCreatePanel.vue +1 -1
- package/src/components/dialogs/PromoCodeDialogFields.vue +20 -20
- package/src/components/plan/PlanCycleToggle.vue +1 -1
- package/src/components/plan-detail/PlanVersionsPanel.vue +5 -2
- package/src/index.ts +5 -0
- package/src/pages-standard/AdminLayout.vue +57 -0
- package/src/pages-standard/AdminManifestErrorPage.vue +4 -3
- package/src/pages-standard/BundlesPage.vue +5 -35
- package/src/pages-standard/DiscoveryPage.vue +8 -1
- package/src/pages-standard/MarketingCatalogPage.vue +14 -3
- package/src/pages-standard/SuperAdminLoginPage.vue +23 -2
- package/src/pages-standard/SuperAdminSetupWizard.vue +37 -3
- package/src/pages-standard/bundles-page/BundleAccordionList.vue +30 -32
- package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +80 -88
- package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +73 -79
- package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +44 -6
- package/src/pages-standard/marketing-catalog/MarketingCatalogPreview.vue +8 -2
- package/src/pages-tenant/PackageSnapshotPanel.vue +31 -2
- package/src/quasar/confirm.ts +83 -0
- package/src/quasar/create-super-admin-app.ts +84 -10
- package/src/quasar/dark-bridge.ts +47 -10
- package/src/quasar/index.ts +1 -0
- package/src/ui/theme/components/accordion.css +118 -0
- package/src/ui/theme/index.css +1 -0
- package/src/vue/create-admin-routes.ts +9 -1
- package/src/vue/platform-loaders.ts +12 -2
- package/src/vue/resource-registry.ts +211 -0
- package/src/vue/super-admin-context.ts +20 -5
- package/src/vue/ui-confirm.ts +76 -0
- package/src/vue/use-api-list.ts +50 -45
- package/src/vue/use-async-action.ts +170 -0
- package/src/vue/use-async-data.ts +83 -0
- package/src/vue/use-bundles.ts +34 -7
- package/src/vue/use-catalog-entries.ts +37 -12
- package/src/vue/use-discovery.ts +27 -6
- package/src/vue/use-marketing-projections.ts +29 -7
- package/src/vue/use-plans.ts +36 -8
- package/src/vue/use-promotions.ts +27 -7
- package/src/vue/use-resource-list.ts +272 -0
- package/src/vue/use-sa-theme.ts +34 -5
- package/src/vue/use-tenant-subscription-bundles.ts +22 -3
package/dist/quasar/index.d.cts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Component, App, WatchStopHandle } from 'vue';
|
|
2
|
-
import { QuasarPluginOptions } from 'quasar';
|
|
2
|
+
import { QuasarPluginOptions, QDialogOptions } from 'quasar';
|
|
3
3
|
import { Pinia } from 'pinia';
|
|
4
4
|
import { RouteRecordRaw, RouterHistory, Router } from 'vue-router';
|
|
5
|
-
import { H as HttpClient } from '../catalog-
|
|
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,
|
|
5
|
+
import { p as platformResources, H as HttpClient } from '../catalog-Dch1Ryw0.cjs';
|
|
6
|
+
import { S as SuperAdminGuardOptions, a as SuperAdminBrand, b as SuperAdminEndpoints, E as ExtensionsMap, A as ActionsMap, c as SuperAdminLoginAdapter, U as UiNotify, d as UiConfirm, R as ResourceOverrides, I as InstallPlugin, e as SuperAdminI18nOptions, f as SaThemeOptions, g as SuperAdminI18n, h as SaTheme, i as UiConfirmRequest } from '../resource-registry-D7Xjs-5f.cjs';
|
|
7
7
|
import '@saasicat/types';
|
|
8
8
|
|
|
9
9
|
interface CreateSuperAdminAppOptions extends SuperAdminGuardOptions {
|
|
@@ -47,6 +47,22 @@ interface CreateSuperAdminAppOptions extends SuperAdminGuardOptions {
|
|
|
47
47
|
* center replace it here without touching the pages.
|
|
48
48
|
*/
|
|
49
49
|
notify?: UiNotify;
|
|
50
|
+
/**
|
|
51
|
+
* Optional: confirm port for the standard pages' "are you sure" step.
|
|
52
|
+
* Default is the Quasar `Dialog` implementation — apps with their own
|
|
53
|
+
* modal system replace it here without touching the pages.
|
|
54
|
+
*
|
|
55
|
+
* An implementation must actually ask. Resolving `{ ok: true }` outright
|
|
56
|
+
* turns every guarded action into an unguarded one.
|
|
57
|
+
*/
|
|
58
|
+
confirm?: UiConfirm;
|
|
59
|
+
/**
|
|
60
|
+
* Optional: per-resource adjustments to the platform's own endpoint
|
|
61
|
+
* definitions — a different path for one resource, a different transport,
|
|
62
|
+
* or a single operation wrapped. Everything not named keeps the platform
|
|
63
|
+
* implementation.
|
|
64
|
+
*/
|
|
65
|
+
resourceOverrides?: ResourceOverrides<typeof platformResources>;
|
|
50
66
|
/**
|
|
51
67
|
* Optional: additional Vue plugins (e.g. an app's own NotificationCenter)
|
|
52
68
|
* that are installed after the platform setup, before the mount.
|
|
@@ -70,7 +86,9 @@ interface CreateSuperAdminAppOptions extends SuperAdminGuardOptions {
|
|
|
70
86
|
* Optional: colour scheme. Default follows the operating system and
|
|
71
87
|
* remembers an explicit pick. The context is returned on the handle
|
|
72
88
|
* (`handle.theme`) — set `handle.theme.scheme.value = 'dark'` to switch at
|
|
73
|
-
* runtime, and read it anywhere via `useSaTheme()`.
|
|
89
|
+
* runtime, and read it anywhere via `useSaTheme()`. The shell chrome
|
|
90
|
+
* renders a three-way switcher for it; `theme: { switcher: false }` drops
|
|
91
|
+
* it, as `i18n: { switcher: false }` drops the language one.
|
|
74
92
|
*
|
|
75
93
|
* Whatever it resolves to is mirrored onto `<html data-sa-theme>` AND into
|
|
76
94
|
* Quasar's `Dark`, so the platform's surfaces and Quasar's own components
|
|
@@ -105,6 +123,24 @@ interface SuperAdminAppHandle {
|
|
|
105
123
|
* test fixture can install the same config a real app gets — without it the
|
|
106
124
|
* `.sa-portal` rules are exercised by nothing. */
|
|
107
125
|
declare const SA_PORTAL_CLASS = "sa-portal";
|
|
126
|
+
/**
|
|
127
|
+
* Merges an app's Quasar options over the platform's, keeping the plugins the
|
|
128
|
+
* shell's own ports depend on.
|
|
129
|
+
*
|
|
130
|
+
* The bootstrap provides `quasarConfirm`, which calls `Dialog.create`, and the
|
|
131
|
+
* notify port's fallback calls `Notify.create`. Taking the app's options whole
|
|
132
|
+
* — as this did — left those uninstalled for anything passing
|
|
133
|
+
* `{ plugins: {}, … }`, a shape this package's own tests use: the first
|
|
134
|
+
* confirmation threw instead of asking, turning a guarded action into a broken
|
|
135
|
+
* one rather than a stricter one.
|
|
136
|
+
*
|
|
137
|
+
* An app's own entry still wins on a key collision, so its build of a plugin
|
|
138
|
+
* replaces the platform's.
|
|
139
|
+
*
|
|
140
|
+
* Exported because it is the whole of the decision, and the only part of the
|
|
141
|
+
* bootstrap that can be checked without driving a real Quasar install.
|
|
142
|
+
*/
|
|
143
|
+
declare function resolveQuasarOptions(own?: Partial<QuasarPluginOptions>): QuasarPluginOptions;
|
|
108
144
|
/**
|
|
109
145
|
* Universal bootstrap function for SuperAdmin apps. Replaces the `main.ts`
|
|
110
146
|
* boilerplate duplicated per app today (Quasar + Pinia + Router + manifest
|
|
@@ -125,7 +161,8 @@ declare function createSuperAdminApp(options: CreateSuperAdminAppOptions): Super
|
|
|
125
161
|
* says is written to Quasar, including `Dark.set(false)`. So a caller that
|
|
126
162
|
* bootstraps with Quasar already dark has to say so when it builds the theme,
|
|
127
163
|
* or its own choice is erased one line after it was applied.
|
|
128
|
-
* `createSuperAdminApp` does exactly that, seeding from
|
|
164
|
+
* `createSuperAdminApp` does exactly that, seeding the scheme from the
|
|
165
|
+
* `quasarOptions.config.dark` it was handed.
|
|
129
166
|
*/
|
|
130
167
|
declare function bindSaThemeToDocument(theme: SaTheme): WatchStopHandle;
|
|
131
168
|
|
|
@@ -137,4 +174,22 @@ declare const quasarNotify: UiNotify;
|
|
|
137
174
|
/** Returns the app-provided notify port, falling back to the Quasar default. */
|
|
138
175
|
declare function useSuperAdminNotify(): UiNotify;
|
|
139
176
|
|
|
140
|
-
|
|
177
|
+
/**
|
|
178
|
+
* Translates a request into Quasar's dialog options.
|
|
179
|
+
*
|
|
180
|
+
* Exported because it is the whole of the mapping and the only part of this
|
|
181
|
+
* file that can be checked without driving a real dialog.
|
|
182
|
+
*/
|
|
183
|
+
declare function quasarConfirmOptions(request: UiConfirmRequest): QDialogOptions;
|
|
184
|
+
/**
|
|
185
|
+
* Quasar-backed confirm port.
|
|
186
|
+
*
|
|
187
|
+
* `onOk` and `onCancel` are mutually exclusive and one of them always runs —
|
|
188
|
+
* dismissing with Escape or a backdrop click reaches `onCancel` — so the
|
|
189
|
+
* promise cannot be left hanging.
|
|
190
|
+
*/
|
|
191
|
+
declare const quasarConfirm: UiConfirm;
|
|
192
|
+
/** Returns the app-provided confirm port, falling back to the Quasar default. */
|
|
193
|
+
declare function useSuperAdminConfirm(): UiConfirm;
|
|
194
|
+
|
|
195
|
+
export { type CreateSuperAdminAppOptions, SA_PORTAL_CLASS, type SuperAdminAppHandle, bindSaThemeToDocument, createSuperAdminApp, quasarConfirm, quasarConfirmOptions, quasarNotify, resolveQuasarOptions, useSuperAdminConfirm, useSuperAdminNotify };
|
package/dist/quasar/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Component, App, WatchStopHandle } from 'vue';
|
|
2
|
-
import { QuasarPluginOptions } from 'quasar';
|
|
2
|
+
import { QuasarPluginOptions, QDialogOptions } from 'quasar';
|
|
3
3
|
import { Pinia } from 'pinia';
|
|
4
4
|
import { RouteRecordRaw, RouterHistory, Router } from 'vue-router';
|
|
5
|
-
import { H as HttpClient } from '../catalog-
|
|
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,
|
|
5
|
+
import { p as platformResources, H as HttpClient } from '../catalog-Dch1Ryw0.js';
|
|
6
|
+
import { S as SuperAdminGuardOptions, a as SuperAdminBrand, b as SuperAdminEndpoints, E as ExtensionsMap, A as ActionsMap, c as SuperAdminLoginAdapter, U as UiNotify, d as UiConfirm, R as ResourceOverrides, I as InstallPlugin, e as SuperAdminI18nOptions, f as SaThemeOptions, g as SuperAdminI18n, h as SaTheme, i as UiConfirmRequest } from '../resource-registry-TaR7rtq0.js';
|
|
7
7
|
import '@saasicat/types';
|
|
8
8
|
|
|
9
9
|
interface CreateSuperAdminAppOptions extends SuperAdminGuardOptions {
|
|
@@ -47,6 +47,22 @@ interface CreateSuperAdminAppOptions extends SuperAdminGuardOptions {
|
|
|
47
47
|
* center replace it here without touching the pages.
|
|
48
48
|
*/
|
|
49
49
|
notify?: UiNotify;
|
|
50
|
+
/**
|
|
51
|
+
* Optional: confirm port for the standard pages' "are you sure" step.
|
|
52
|
+
* Default is the Quasar `Dialog` implementation — apps with their own
|
|
53
|
+
* modal system replace it here without touching the pages.
|
|
54
|
+
*
|
|
55
|
+
* An implementation must actually ask. Resolving `{ ok: true }` outright
|
|
56
|
+
* turns every guarded action into an unguarded one.
|
|
57
|
+
*/
|
|
58
|
+
confirm?: UiConfirm;
|
|
59
|
+
/**
|
|
60
|
+
* Optional: per-resource adjustments to the platform's own endpoint
|
|
61
|
+
* definitions — a different path for one resource, a different transport,
|
|
62
|
+
* or a single operation wrapped. Everything not named keeps the platform
|
|
63
|
+
* implementation.
|
|
64
|
+
*/
|
|
65
|
+
resourceOverrides?: ResourceOverrides<typeof platformResources>;
|
|
50
66
|
/**
|
|
51
67
|
* Optional: additional Vue plugins (e.g. an app's own NotificationCenter)
|
|
52
68
|
* that are installed after the platform setup, before the mount.
|
|
@@ -70,7 +86,9 @@ interface CreateSuperAdminAppOptions extends SuperAdminGuardOptions {
|
|
|
70
86
|
* Optional: colour scheme. Default follows the operating system and
|
|
71
87
|
* remembers an explicit pick. The context is returned on the handle
|
|
72
88
|
* (`handle.theme`) — set `handle.theme.scheme.value = 'dark'` to switch at
|
|
73
|
-
* runtime, and read it anywhere via `useSaTheme()`.
|
|
89
|
+
* runtime, and read it anywhere via `useSaTheme()`. The shell chrome
|
|
90
|
+
* renders a three-way switcher for it; `theme: { switcher: false }` drops
|
|
91
|
+
* it, as `i18n: { switcher: false }` drops the language one.
|
|
74
92
|
*
|
|
75
93
|
* Whatever it resolves to is mirrored onto `<html data-sa-theme>` AND into
|
|
76
94
|
* Quasar's `Dark`, so the platform's surfaces and Quasar's own components
|
|
@@ -105,6 +123,24 @@ interface SuperAdminAppHandle {
|
|
|
105
123
|
* test fixture can install the same config a real app gets — without it the
|
|
106
124
|
* `.sa-portal` rules are exercised by nothing. */
|
|
107
125
|
declare const SA_PORTAL_CLASS = "sa-portal";
|
|
126
|
+
/**
|
|
127
|
+
* Merges an app's Quasar options over the platform's, keeping the plugins the
|
|
128
|
+
* shell's own ports depend on.
|
|
129
|
+
*
|
|
130
|
+
* The bootstrap provides `quasarConfirm`, which calls `Dialog.create`, and the
|
|
131
|
+
* notify port's fallback calls `Notify.create`. Taking the app's options whole
|
|
132
|
+
* — as this did — left those uninstalled for anything passing
|
|
133
|
+
* `{ plugins: {}, … }`, a shape this package's own tests use: the first
|
|
134
|
+
* confirmation threw instead of asking, turning a guarded action into a broken
|
|
135
|
+
* one rather than a stricter one.
|
|
136
|
+
*
|
|
137
|
+
* An app's own entry still wins on a key collision, so its build of a plugin
|
|
138
|
+
* replaces the platform's.
|
|
139
|
+
*
|
|
140
|
+
* Exported because it is the whole of the decision, and the only part of the
|
|
141
|
+
* bootstrap that can be checked without driving a real Quasar install.
|
|
142
|
+
*/
|
|
143
|
+
declare function resolveQuasarOptions(own?: Partial<QuasarPluginOptions>): QuasarPluginOptions;
|
|
108
144
|
/**
|
|
109
145
|
* Universal bootstrap function for SuperAdmin apps. Replaces the `main.ts`
|
|
110
146
|
* boilerplate duplicated per app today (Quasar + Pinia + Router + manifest
|
|
@@ -125,7 +161,8 @@ declare function createSuperAdminApp(options: CreateSuperAdminAppOptions): Super
|
|
|
125
161
|
* says is written to Quasar, including `Dark.set(false)`. So a caller that
|
|
126
162
|
* bootstraps with Quasar already dark has to say so when it builds the theme,
|
|
127
163
|
* or its own choice is erased one line after it was applied.
|
|
128
|
-
* `createSuperAdminApp` does exactly that, seeding from
|
|
164
|
+
* `createSuperAdminApp` does exactly that, seeding the scheme from the
|
|
165
|
+
* `quasarOptions.config.dark` it was handed.
|
|
129
166
|
*/
|
|
130
167
|
declare function bindSaThemeToDocument(theme: SaTheme): WatchStopHandle;
|
|
131
168
|
|
|
@@ -137,4 +174,22 @@ declare const quasarNotify: UiNotify;
|
|
|
137
174
|
/** Returns the app-provided notify port, falling back to the Quasar default. */
|
|
138
175
|
declare function useSuperAdminNotify(): UiNotify;
|
|
139
176
|
|
|
140
|
-
|
|
177
|
+
/**
|
|
178
|
+
* Translates a request into Quasar's dialog options.
|
|
179
|
+
*
|
|
180
|
+
* Exported because it is the whole of the mapping and the only part of this
|
|
181
|
+
* file that can be checked without driving a real dialog.
|
|
182
|
+
*/
|
|
183
|
+
declare function quasarConfirmOptions(request: UiConfirmRequest): QDialogOptions;
|
|
184
|
+
/**
|
|
185
|
+
* Quasar-backed confirm port.
|
|
186
|
+
*
|
|
187
|
+
* `onOk` and `onCancel` are mutually exclusive and one of them always runs —
|
|
188
|
+
* dismissing with Escape or a backdrop click reaches `onCancel` — so the
|
|
189
|
+
* promise cannot be left hanging.
|
|
190
|
+
*/
|
|
191
|
+
declare const quasarConfirm: UiConfirm;
|
|
192
|
+
/** Returns the app-provided confirm port, falling back to the Quasar default. */
|
|
193
|
+
declare function useSuperAdminConfirm(): UiConfirm;
|
|
194
|
+
|
|
195
|
+
export { type CreateSuperAdminAppOptions, SA_PORTAL_CLASS, type SuperAdminAppHandle, bindSaThemeToDocument, createSuperAdminApp, quasarConfirm, quasarConfirmOptions, quasarNotify, resolveQuasarOptions, useSuperAdminConfirm, useSuperAdminNotify };
|
package/dist/quasar/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
SA_THEME_KEY,
|
|
3
3
|
SUPER_ADMIN_ACTIONS_KEY,
|
|
4
4
|
SUPER_ADMIN_BRAND_KEY,
|
|
5
|
+
SUPER_ADMIN_CONFIRM_KEY,
|
|
5
6
|
SUPER_ADMIN_ENDPOINTS_KEY,
|
|
6
7
|
SUPER_ADMIN_EXTENSIONS_KEY,
|
|
7
8
|
SUPER_ADMIN_HTTP_KEY,
|
|
@@ -10,17 +11,21 @@ import {
|
|
|
10
11
|
SUPER_ADMIN_MANIFEST_CLEAR_CACHE_KEY,
|
|
11
12
|
SUPER_ADMIN_MANIFEST_KEY,
|
|
12
13
|
SUPER_ADMIN_NOTIFY_KEY,
|
|
14
|
+
SUPER_ADMIN_RESOURCES_KEY,
|
|
13
15
|
buildNavigationGuard,
|
|
16
|
+
createResourceRegistry,
|
|
14
17
|
createSaTheme,
|
|
15
|
-
createSuperAdminI18n
|
|
16
|
-
|
|
18
|
+
createSuperAdminI18n,
|
|
19
|
+
resolveSuperAdminEndpoints
|
|
20
|
+
} from "../chunk-O3J3ITF2.js";
|
|
17
21
|
import {
|
|
18
|
-
defaultHttpClient
|
|
19
|
-
|
|
22
|
+
defaultHttpClient,
|
|
23
|
+
platformResources
|
|
24
|
+
} from "../chunk-BPF2BMCQ.js";
|
|
20
25
|
|
|
21
26
|
// src/quasar/create-super-admin-app.ts
|
|
22
27
|
import { createApp } from "vue";
|
|
23
|
-
import { Quasar, Notify as Notify2, Dialog, Loading } from "quasar";
|
|
28
|
+
import { Quasar, Notify as Notify2, Dialog as Dialog2, Loading } from "quasar";
|
|
24
29
|
import { createPinia } from "pinia";
|
|
25
30
|
import {
|
|
26
31
|
createRouter,
|
|
@@ -31,22 +36,30 @@ import {
|
|
|
31
36
|
import { Dark } from "quasar";
|
|
32
37
|
import { watch } from "vue";
|
|
33
38
|
function bindSaThemeToDocument(theme) {
|
|
39
|
+
let mirroring = false;
|
|
34
40
|
const toQuasar = watch(
|
|
35
41
|
theme.resolved,
|
|
36
42
|
(resolved) => {
|
|
37
43
|
if (typeof document !== "undefined") {
|
|
38
44
|
document.documentElement.setAttribute("data-sa-theme", resolved);
|
|
39
45
|
}
|
|
40
|
-
|
|
46
|
+
mirroring = true;
|
|
47
|
+
try {
|
|
48
|
+
Dark.set(resolved === "dark");
|
|
49
|
+
} finally {
|
|
50
|
+
mirroring = false;
|
|
51
|
+
}
|
|
41
52
|
},
|
|
42
53
|
{ immediate: true }
|
|
43
54
|
);
|
|
44
55
|
const fromQuasar = watch(
|
|
45
|
-
() => Dark.
|
|
46
|
-
(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
() => Dark.mode,
|
|
57
|
+
(mode) => {
|
|
58
|
+
if (mirroring) return;
|
|
59
|
+
const picked = mode === "auto" ? "system" : mode === true ? "dark" : "light";
|
|
60
|
+
if (theme.scheme.value !== picked) theme.scheme.value = picked;
|
|
61
|
+
},
|
|
62
|
+
{ flush: "sync" }
|
|
50
63
|
);
|
|
51
64
|
return () => {
|
|
52
65
|
toQuasar();
|
|
@@ -70,15 +83,48 @@ function useSuperAdminNotify() {
|
|
|
70
83
|
return inject(SUPER_ADMIN_NOTIFY_KEY, quasarNotify);
|
|
71
84
|
}
|
|
72
85
|
|
|
86
|
+
// src/quasar/confirm.ts
|
|
87
|
+
import { inject as inject2 } from "vue";
|
|
88
|
+
import { Dialog } from "quasar";
|
|
89
|
+
function quasarConfirmOptions(request) {
|
|
90
|
+
return {
|
|
91
|
+
title: request.title,
|
|
92
|
+
message: request.message,
|
|
93
|
+
cancel: request.cancelLabel,
|
|
94
|
+
ok: { label: request.confirmLabel, color: request.tone ?? "primary" },
|
|
95
|
+
...request.prompt ? {
|
|
96
|
+
prompt: {
|
|
97
|
+
model: request.prompt.initial ?? "",
|
|
98
|
+
type: request.prompt.type ?? "text"
|
|
99
|
+
}
|
|
100
|
+
} : {}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
var quasarConfirm = (request) => new Promise((resolve) => {
|
|
104
|
+
Dialog.create(quasarConfirmOptions(request)).onOk((value) => {
|
|
105
|
+
resolve({ ok: true, value: typeof value === "string" ? value : void 0 });
|
|
106
|
+
}).onCancel(() => resolve({ ok: false }));
|
|
107
|
+
});
|
|
108
|
+
function useSuperAdminConfirm() {
|
|
109
|
+
return inject2(SUPER_ADMIN_CONFIRM_KEY, quasarConfirm);
|
|
110
|
+
}
|
|
111
|
+
|
|
73
112
|
// src/quasar/create-super-admin-app.ts
|
|
74
113
|
var SA_PORTAL_CLASS = "sa-portal";
|
|
75
114
|
var DEFAULT_QUASAR_OPTIONS = {
|
|
76
|
-
plugins: { Notify: Notify2, Dialog, Loading },
|
|
115
|
+
plugins: { Notify: Notify2, Dialog: Dialog2, Loading },
|
|
77
116
|
config: { notify: { position: "top-right", timeout: 3e3 } }
|
|
78
117
|
};
|
|
118
|
+
function resolveQuasarOptions(own) {
|
|
119
|
+
if (!own) return DEFAULT_QUASAR_OPTIONS;
|
|
120
|
+
return {
|
|
121
|
+
...own,
|
|
122
|
+
plugins: { ...DEFAULT_QUASAR_OPTIONS.plugins, ...own.plugins }
|
|
123
|
+
};
|
|
124
|
+
}
|
|
79
125
|
function createSuperAdminApp(options) {
|
|
80
126
|
const app = createApp(options.rootComponent);
|
|
81
|
-
const quasarOptions = options.quasarOptions
|
|
127
|
+
const quasarOptions = resolveQuasarOptions(options.quasarOptions);
|
|
82
128
|
const config = quasarOptions.config;
|
|
83
129
|
const existingPortalClass = config?.globalNodes?.class;
|
|
84
130
|
app.use(Quasar, {
|
|
@@ -101,11 +147,8 @@ function createSuperAdminApp(options) {
|
|
|
101
147
|
router.beforeEach(navGuard);
|
|
102
148
|
}
|
|
103
149
|
app.use(router);
|
|
104
|
-
const endpoints =
|
|
105
|
-
|
|
106
|
-
publicBootEndpoint: options.endpoints.publicBootEndpoint ?? `${options.endpoints.apiBase}/boot`,
|
|
107
|
-
manifestEndpoint: options.endpoints.manifestEndpoint ?? `${options.endpoints.apiBase}/manifest`
|
|
108
|
-
};
|
|
150
|
+
const endpoints = resolveSuperAdminEndpoints(options.endpoints);
|
|
151
|
+
const http = options.http ?? defaultHttpClient();
|
|
109
152
|
const i18n = createSuperAdminI18n(options.i18n);
|
|
110
153
|
const configuredDark = options.quasarOptions?.config?.dark;
|
|
111
154
|
const theme = createSaTheme({
|
|
@@ -120,6 +163,23 @@ function createSuperAdminApp(options) {
|
|
|
120
163
|
app.provide(SUPER_ADMIN_EXTENSIONS_KEY, options.extensions ?? {});
|
|
121
164
|
app.provide(SUPER_ADMIN_ACTIONS_KEY, options.actions ?? {});
|
|
122
165
|
app.provide(SUPER_ADMIN_NOTIFY_KEY, options.notify ?? quasarNotify);
|
|
166
|
+
app.provide(SUPER_ADMIN_CONFIRM_KEY, options.confirm ?? quasarConfirm);
|
|
167
|
+
if (options.http) {
|
|
168
|
+
app.provide(
|
|
169
|
+
SUPER_ADMIN_RESOURCES_KEY,
|
|
170
|
+
createResourceRegistry({
|
|
171
|
+
http: options.http,
|
|
172
|
+
// Read per call: the locale changes while the app runs.
|
|
173
|
+
context: () => ({
|
|
174
|
+
apiBase: endpoints.apiBase,
|
|
175
|
+
projectKey: endpoints.projectKey,
|
|
176
|
+
locale: i18n.locale.value
|
|
177
|
+
}),
|
|
178
|
+
resources: platformResources,
|
|
179
|
+
overrides: options.resourceOverrides
|
|
180
|
+
})
|
|
181
|
+
);
|
|
182
|
+
}
|
|
123
183
|
if (options.manifestGuard?.getManifest) {
|
|
124
184
|
app.provide(SUPER_ADMIN_MANIFEST_KEY, options.manifestGuard.getManifest);
|
|
125
185
|
}
|
|
@@ -129,7 +189,7 @@ function createSuperAdminApp(options) {
|
|
|
129
189
|
if (options.loginAdapter) {
|
|
130
190
|
app.provide(SUPER_ADMIN_LOGIN_ADAPTER_KEY, options.loginAdapter);
|
|
131
191
|
}
|
|
132
|
-
app.provide(SUPER_ADMIN_HTTP_KEY,
|
|
192
|
+
app.provide(SUPER_ADMIN_HTTP_KEY, http);
|
|
133
193
|
for (const plugin of options.installPlugins ?? []) {
|
|
134
194
|
plugin(app);
|
|
135
195
|
}
|
|
@@ -150,6 +210,10 @@ export {
|
|
|
150
210
|
SA_PORTAL_CLASS,
|
|
151
211
|
bindSaThemeToDocument,
|
|
152
212
|
createSuperAdminApp,
|
|
213
|
+
quasarConfirm,
|
|
214
|
+
quasarConfirmOptions,
|
|
153
215
|
quasarNotify,
|
|
216
|
+
resolveQuasarOptions,
|
|
217
|
+
useSuperAdminConfirm,
|
|
154
218
|
useSuperAdminNotify
|
|
155
219
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Component, App, InjectionKey, Ref, ComputedRef } from 'vue';
|
|
2
2
|
import { NavigationGuardWithThis } from 'vue-router';
|
|
3
3
|
import { ActionKey, ComponentKey, AdminManifest } from '@saasicat/types';
|
|
4
|
-
import { A as ActionHandler, H as HttpClient, S as SaLocale, a as SaMessages, b as SaLocaleOption, c as SaLocaleDefinition, d as SaMessagesOverrides, K as KvStore } from './catalog-
|
|
4
|
+
import { A as ActionHandler, H as HttpClient, S as SaLocale, a as SaMessages, b as SaLocaleOption, c as SaLocaleDefinition, d as SaMessagesOverrides, K as KvStore, R as ResourceDef, e as ResourceOps, f as ResourceContext, B as Bound, P as PlatformResources } from './catalog-Dch1Ryw0.cjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* App-specific branding data that the platform `AdminLayout` and other
|
|
@@ -26,6 +26,21 @@ interface SuperAdminEndpoints {
|
|
|
26
26
|
publicBootEndpoint?: string;
|
|
27
27
|
/** Post-login full-manifest endpoint, default `${apiBase}/manifest`. */
|
|
28
28
|
manifestEndpoint?: string;
|
|
29
|
+
/**
|
|
30
|
+
* The project whose catalogue this admin administers.
|
|
31
|
+
*
|
|
32
|
+
* App-wide and constant, which is why it belongs here. Today each page
|
|
33
|
+
* takes it as a prop and each consumer passes it again per route — the
|
|
34
|
+
* same value, written out once per page, with nothing keeping the copies
|
|
35
|
+
* in step.
|
|
36
|
+
*
|
|
37
|
+
* Optional in the type, but required in practice for an app that also
|
|
38
|
+
* passes `http`: that app gets the resource registry, the registry holds
|
|
39
|
+
* the plan catalogue, and binding a project-scoped resource without a
|
|
40
|
+
* project is refused at boot rather than sent as `?projectKey=`. An app
|
|
41
|
+
* that names no client gets no registry and needs no project.
|
|
42
|
+
*/
|
|
43
|
+
projectKey?: string;
|
|
29
44
|
}
|
|
30
45
|
type ExtensionLoader = () => Promise<Component | {
|
|
31
46
|
default: Component;
|
|
@@ -127,11 +142,11 @@ interface SuperAdminManifestGuardOptions {
|
|
|
127
142
|
* Discards the cached manifest, so the next `ensureLoaded()` fetches a
|
|
128
143
|
* fresh body instead of revalidating.
|
|
129
144
|
*
|
|
130
|
-
* Needed because the loader keeps an ETag in storage
|
|
131
|
-
*
|
|
132
|
-
* a
|
|
133
|
-
*
|
|
134
|
-
*
|
|
145
|
+
* Needed because the loader keeps an ETag in storage, which a full page
|
|
146
|
+
* reload does not touch. A plain retry therefore sends `If-None-Match`,
|
|
147
|
+
* and a 304 hands back the very manifest the app already had — so an
|
|
148
|
+
* operator retrying after a deployment would keep looking at the old one.
|
|
149
|
+
* Clearing first is what makes the retry ask an open question.
|
|
135
150
|
*
|
|
136
151
|
* `ManifestLoader.clearCache()` and the manifest store's reset both fit;
|
|
137
152
|
* pass whichever the app uses.
|
|
@@ -202,6 +217,53 @@ type UiNotify = (kind: UiNotifyKind, message: string, options?: UiNotifyOptions)
|
|
|
202
217
|
/** Vue inject key for the notify port (see `Symbol.for` note in super-admin-context.ts). */
|
|
203
218
|
declare const SUPER_ADMIN_NOTIFY_KEY: InjectionKey<UiNotify>;
|
|
204
219
|
|
|
220
|
+
/**
|
|
221
|
+
* How the confirming button is coloured. `negative` marks an action that
|
|
222
|
+
* destroys or revokes something; `primary` marks one that does not.
|
|
223
|
+
*/
|
|
224
|
+
type UiConfirmTone = 'primary' | 'negative';
|
|
225
|
+
/** Asks for a value along with the confirmation. */
|
|
226
|
+
interface UiConfirmPrompt {
|
|
227
|
+
/** Pre-filled value, e.g. the date a pilot currently ends on. */
|
|
228
|
+
initial?: string;
|
|
229
|
+
/** Input kind. Only the two the standard pages need. */
|
|
230
|
+
type?: 'text' | 'date';
|
|
231
|
+
}
|
|
232
|
+
interface UiConfirmRequest {
|
|
233
|
+
/** What is about to happen, naming the subject. */
|
|
234
|
+
title: string;
|
|
235
|
+
/**
|
|
236
|
+
* The consequence, in a sentence. For an action that cannot be reversed,
|
|
237
|
+
* say so here rather than asking "are you sure".
|
|
238
|
+
*/
|
|
239
|
+
message: string;
|
|
240
|
+
/** Label of the confirming button — a verb, not "OK". */
|
|
241
|
+
confirmLabel: string;
|
|
242
|
+
/** Label of the dismissing button. */
|
|
243
|
+
cancelLabel: string;
|
|
244
|
+
/** Default `primary`. Destructive actions pass `negative`. */
|
|
245
|
+
tone?: UiConfirmTone;
|
|
246
|
+
/** When set, the operator is asked for a value as well. */
|
|
247
|
+
prompt?: UiConfirmPrompt;
|
|
248
|
+
}
|
|
249
|
+
interface UiConfirmResult {
|
|
250
|
+
/** Whether the operator confirmed. Dismissing counts as `false`. */
|
|
251
|
+
ok: boolean;
|
|
252
|
+
/**
|
|
253
|
+
* What the operator entered, when the request carried a `prompt`.
|
|
254
|
+
* `undefined` otherwise, and whenever `ok` is `false`.
|
|
255
|
+
*/
|
|
256
|
+
value?: string;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Confirm port. Resolves once the operator has answered — an implementation
|
|
260
|
+
* that resolves `{ ok: true }` without asking would turn every guarded action
|
|
261
|
+
* into an unguarded one, so there is no such default.
|
|
262
|
+
*/
|
|
263
|
+
type UiConfirm = (request: UiConfirmRequest) => Promise<UiConfirmResult>;
|
|
264
|
+
/** Vue inject key for the confirm port (see `Symbol.for` note in super-admin-context.ts). */
|
|
265
|
+
declare const SUPER_ADMIN_CONFIRM_KEY: InjectionKey<UiConfirm>;
|
|
266
|
+
|
|
205
267
|
interface SuperAdminI18n {
|
|
206
268
|
/** Active UI locale — mutable; switching re-renders all catalog texts. */
|
|
207
269
|
locale: Ref<SaLocale>;
|
|
@@ -282,11 +344,21 @@ declare function useSaMessages<K extends keyof SaMessages>(namespace: K): Comput
|
|
|
282
344
|
|
|
283
345
|
type SaColorScheme = 'light' | 'dark' | 'system';
|
|
284
346
|
type SaResolvedScheme = 'light' | 'dark';
|
|
347
|
+
/** The schemes the switcher offers, in the order it lists them. */
|
|
348
|
+
declare const SA_COLOR_SCHEMES: readonly SaColorScheme[];
|
|
349
|
+
/** `KvStore` key holding the scheme the operator picked in the switcher. */
|
|
350
|
+
declare const SA_THEME_STORAGE_KEY = "saasicat.theme.scheme";
|
|
285
351
|
interface SaTheme {
|
|
286
352
|
/** What the operator picked. Writable — assigning switches the theme. */
|
|
287
353
|
scheme: Ref<SaColorScheme>;
|
|
288
354
|
/** What that means right now: `'system'` resolved against the OS. */
|
|
289
355
|
resolved: ComputedRef<SaResolvedScheme>;
|
|
356
|
+
/**
|
|
357
|
+
* Whether the shell renders its theme switcher. `false` when the app opted
|
|
358
|
+
* out or when `scheme` cannot be written to — a switcher that cannot change
|
|
359
|
+
* anything is worse than none.
|
|
360
|
+
*/
|
|
361
|
+
switcherEnabled: boolean;
|
|
290
362
|
/**
|
|
291
363
|
* Releases the `prefers-color-scheme` subscription and the persistence
|
|
292
364
|
* watcher. Idempotent.
|
|
@@ -312,6 +384,18 @@ interface SaThemeOptions {
|
|
|
312
384
|
persist?: boolean;
|
|
313
385
|
/** Injection seam for tests. */
|
|
314
386
|
storage?: KvStore;
|
|
387
|
+
/**
|
|
388
|
+
* Prefix for the persisted key, mirroring `createSuperAdminI18n`. Set it
|
|
389
|
+
* when several admin apps share one origin and must not inherit each
|
|
390
|
+
* other's colour scheme.
|
|
391
|
+
*/
|
|
392
|
+
storageKeyPrefix?: string;
|
|
393
|
+
/**
|
|
394
|
+
* Renders the theme switcher in the shell chrome, default `true`. Set
|
|
395
|
+
* `false` for a deployment that ships one appearance. A readonly `scheme`
|
|
396
|
+
* ref disables it on its own — no need to set this as well.
|
|
397
|
+
*/
|
|
398
|
+
switcher?: boolean;
|
|
315
399
|
}
|
|
316
400
|
/**
|
|
317
401
|
* Creates the theme context. `createSuperAdminApp()` makes one and the Quasar
|
|
@@ -330,4 +414,70 @@ declare const SA_THEME_KEY: InjectionKey<SaTheme>;
|
|
|
330
414
|
*/
|
|
331
415
|
declare function useSaTheme(): SaTheme;
|
|
332
416
|
|
|
333
|
-
|
|
417
|
+
/**
|
|
418
|
+
* An override receives the platform's own implementation as `next`, so it
|
|
419
|
+
* wraps rather than replaces. Recording an approval before a publish is three
|
|
420
|
+
* lines; rewriting the publish is not.
|
|
421
|
+
*/
|
|
422
|
+
type OpOverride<TOp> = TOp extends (http: HttpClient, ctx: ResourceContext, ...args: infer A) => Promise<infer R> ? (next: (...args: A) => Promise<R>, ...args: A) => Promise<R> : never;
|
|
423
|
+
interface ResourceOverride<TOps extends ResourceOps> {
|
|
424
|
+
/** Only the endpoint, project or locale this resource is read under. */
|
|
425
|
+
context?: Partial<ResourceContext>;
|
|
426
|
+
/** Only the transport, e.g. a client with a different auth. */
|
|
427
|
+
http?: HttpClient;
|
|
428
|
+
/** Individual operations, each wrapping the platform's. */
|
|
429
|
+
ops?: {
|
|
430
|
+
[K in keyof TOps]?: OpOverride<TOps[K]>;
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
/** Resources by key, in the shape a registry holds them. */
|
|
434
|
+
type ResourceMap = Record<string, ResourceDef<ResourceOps>>;
|
|
435
|
+
type ResourceOverrides<TMap extends ResourceMap> = {
|
|
436
|
+
[K in keyof TMap]?: ResourceOverride<TMap[K]['ops']>;
|
|
437
|
+
};
|
|
438
|
+
interface ResourceRegistry<TMap extends ResourceMap = ResourceMap> {
|
|
439
|
+
/** The bound operations of one resource. Throws for an unknown key. */
|
|
440
|
+
get<K extends keyof TMap>(key: K): Bound<TMap[K]['ops']>;
|
|
441
|
+
/** Every key the registry can answer for. */
|
|
442
|
+
keys(): string[];
|
|
443
|
+
}
|
|
444
|
+
interface CreateResourceRegistryOptions<TMap extends ResourceMap> {
|
|
445
|
+
/**
|
|
446
|
+
* Required — there is deliberately no fallback.
|
|
447
|
+
*
|
|
448
|
+
* A registry that quietly reached for `fetch` when nobody passed a client
|
|
449
|
+
* would send every request without the app's `Authorization` header, and
|
|
450
|
+
* the failure is silent: the call 401s, one card renders an em dash, and
|
|
451
|
+
* nothing is logged. Three such call sites existed in this package and had
|
|
452
|
+
* to be found by reading. Asking for the client makes them unwritable.
|
|
453
|
+
*/
|
|
454
|
+
http: HttpClient;
|
|
455
|
+
/** Read per call, so a switched locale or project applies to what follows. */
|
|
456
|
+
context: ResourceContext | (() => ResourceContext);
|
|
457
|
+
/** The resources on offer. */
|
|
458
|
+
resources: TMap;
|
|
459
|
+
/** Per-resource adjustments from the app. */
|
|
460
|
+
overrides?: ResourceOverrides<TMap>;
|
|
461
|
+
}
|
|
462
|
+
declare function createResourceRegistry<TMap extends ResourceMap>(options: CreateResourceRegistryOptions<TMap>): ResourceRegistry<TMap>;
|
|
463
|
+
/** Vue inject key for the registry (see `Symbol.for` note in super-admin-context.ts). */
|
|
464
|
+
declare const SUPER_ADMIN_RESOURCES_KEY: InjectionKey<ResourceRegistry>;
|
|
465
|
+
/**
|
|
466
|
+
* The operations of one resource, ready to call.
|
|
467
|
+
*
|
|
468
|
+
* Typed against the platform roster, so `useResource('plans').update(id, data)`
|
|
469
|
+
* carries the argument types the descriptor declares and an unknown key is a
|
|
470
|
+
* compile error. Without that mapping the key parameter erased the operations
|
|
471
|
+
* to `ResourceOps`, whose `never[]` constraint made *every* call with an
|
|
472
|
+
* argument a type error while accepting any misspelled resource name — the
|
|
473
|
+
* exact opposite of the guarantee the registry exists for.
|
|
474
|
+
*
|
|
475
|
+
* An app with its own resources passes its map as the second type argument.
|
|
476
|
+
*
|
|
477
|
+
* Throws when the shell has no registry rather than returning something
|
|
478
|
+
* inert — a page whose data silently never arrives is harder to diagnose than
|
|
479
|
+
* one that says what is missing.
|
|
480
|
+
*/
|
|
481
|
+
declare function useResource<K extends keyof TMap & string, TMap extends ResourceMap = PlatformResources>(key: K): Bound<TMap[K]['ops']>;
|
|
482
|
+
|
|
483
|
+
export { useSaTheme as $, type ActionsMap as A, SUPER_ADMIN_MANIFEST_KEY as B, type CreateResourceRegistryOptions as C, SUPER_ADMIN_NOTIFY_KEY as D, type ExtensionsMap as E, SUPER_ADMIN_RESOURCES_KEY as F, type SaColorScheme as G, type SaResolvedScheme as H, type InstallPlugin as I, type SuperAdminAuthGuardOptions as J, type SuperAdminLoginResult as K, type SuperAdminManifestGuardOptions as L, type UiConfirmPrompt as M, type UiConfirmResult as N, type OpOverride as O, type UiConfirmTone as P, type UiNotifyKind as Q, type ResourceOverrides as R, type SuperAdminGuardOptions as S, type UiNotifyOptions as T, type UiNotify as U, buildNavigationGuard as V, createResourceRegistry as W, createSaTheme as X, createSuperAdminI18n as Y, useResource as Z, useSaMessages as _, type SuperAdminBrand as a, useSuperAdminI18n as a0, type SuperAdminEndpoints as b, type SuperAdminLoginAdapter as c, type UiConfirm as d, type SuperAdminI18nOptions as e, type SaThemeOptions as f, type SuperAdminI18n as g, type SaTheme as h, type UiConfirmRequest as i, type ResourceMap as j, type ExtensionLoader as k, type ResourceOverride as l, type ResourceRegistry as m, SA_COLOR_SCHEMES as n, SA_LOCALE_STORAGE_KEY as o, SA_THEME_KEY as p, SA_THEME_STORAGE_KEY as q, SUPER_ADMIN_ACTIONS_KEY as r, SUPER_ADMIN_BRAND_KEY as s, SUPER_ADMIN_CONFIRM_KEY as t, SUPER_ADMIN_ENDPOINTS_KEY as u, SUPER_ADMIN_EXTENSIONS_KEY as v, SUPER_ADMIN_HTTP_KEY as w, SUPER_ADMIN_I18N_KEY as x, SUPER_ADMIN_LOGIN_ADAPTER_KEY as y, SUPER_ADMIN_MANIFEST_CLEAR_CACHE_KEY as z };
|