@saasicat/ui-vue 0.3.0 → 0.5.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 +47 -4
- package/dist/action-registry-CQ2wL3R-.d.cts +85 -0
- package/dist/action-registry-CQ2wL3R-.d.ts +85 -0
- package/dist/chunk-3YP2ZAOD.js +63 -0
- package/dist/chunk-EH7TOD4H.js +718 -0
- package/dist/chunk-LVGUSD3T.js +26 -0
- package/dist/client/index.cjs +785 -0
- package/dist/client/index.d.cts +295 -0
- package/dist/client/index.d.ts +295 -0
- package/dist/client/index.js +52 -0
- package/dist/index.cjs +787 -834
- package/dist/index.d.cts +267 -841
- package/dist/index.d.ts +267 -841
- package/dist/index.js +284 -1059
- package/dist/quasar/index.cjs +159 -0
- package/dist/quasar/index.d.cts +86 -0
- package/dist/quasar/index.d.ts +86 -0
- package/dist/quasar/index.js +91 -0
- package/dist/ui-notify-COUzXEQ4.d.ts +178 -0
- package/dist/ui-notify-D_eAAwRh.d.cts +178 -0
- package/package.json +23 -3
- package/src/client/index.ts +25 -0
- package/src/components/FeatureGate.vue +1 -1
- package/src/components/plan/PlanCycleToggle.vue +1 -1
- 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/index.ts +82 -79
- package/src/pages-standard/AdminLayout.vue +2 -2
- package/src/pages-standard/DashboardPage.vue +2 -2
- package/src/pages-standard/EmailHistoryPage.vue +9 -13
- package/src/pages-standard/MarketingCatalogPage.vue +5 -5
- package/src/pages-standard/PilotsPage.vue +9 -13
- package/src/pages-standard/PlanVersionsPage.vue +2 -2
- package/src/pages-standard/PlansPage.vue +2 -2
- package/src/pages-standard/PlatformEmailPage.vue +7 -5
- package/src/pages-standard/PromoCodesPage.vue +8 -22
- package/src/pages-standard/SuperAdminLoginPage.vue +3 -3
- package/src/pages-standard/SuperAdminSetupWizard.vue +2 -2
- package/src/pages-standard/TenantDetailPage.vue +4 -4
- package/src/pages-standard/TenantsPage.vue +3 -3
- package/src/pages-standard/UsersPage.vue +6 -12
- package/src/pages-standard/plan-versions/PlanVersionHeader.vue +1 -1
- package/src/pages-standard/plan-versions/PlanVersionsAudit.vue +1 -1
- package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +1 -1
- package/src/pages-standard/plan-versions/PlanVersionsList.vue +1 -1
- package/src/pages-standard/plan-versions/PlanVersionsMatrix.vue +1 -1
- package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +1 -1
- package/src/pages-tenant/MySubscriptionBundlesPage.vue +1 -1
- package/src/pages-tenant/OnboardingConfigurator.vue +3 -3
- package/src/pages-tenant/PackageSnapshotPanel.vue +1 -1
- package/src/pages-tenant/PlanChangeWizard.vue +2 -2
- package/src/pages-tenant/TenantPlanSection.vue +3 -3
- package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +1 -1
- package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +2 -2
- 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 +173 -0
- package/src/quasar/index.ts +11 -0
- package/src/quasar/notify.ts +30 -0
- 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} +1 -1
- 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-batch-columns.ts → vue/use-batch-columns.ts} +1 -1
- package/src/{use-bulk-publish.ts → vue/use-bulk-publish.ts} +1 -1
- package/src/{use-bundle-versions-map.ts → vue/use-bundle-versions-map.ts} +1 -1
- package/src/{use-bundles.ts → vue/use-bundles.ts} +1 -1
- package/src/{use-business-types.ts → vue/use-business-types.ts} +1 -1
- package/src/{use-catalog-entries.ts → vue/use-catalog-entries.ts} +1 -1
- package/src/{use-discovery.ts → vue/use-discovery.ts} +1 -1
- package/src/{use-entitlement.ts → vue/use-entitlement.ts} +1 -1
- package/src/{use-live-plan-versions.ts → vue/use-live-plan-versions.ts} +1 -1
- package/src/{use-manifest.ts → vue/use-manifest.ts} +1 -1
- package/src/{use-marketing-projections.ts → vue/use-marketing-projections.ts} +1 -1
- package/src/{use-nav.ts → vue/use-nav.ts} +1 -1
- package/src/{use-plans.ts → vue/use-plans.ts} +1 -1
- package/src/{use-promotions.ts → vue/use-promotions.ts} +1 -1
- package/src/{use-public-boot.ts → vue/use-public-boot.ts} +1 -1
- package/src/{use-super-admin-context.ts → vue/use-super-admin-context.ts} +2 -2
- package/src/{use-tenant-action-flow.ts → vue/use-tenant-action-flow.ts} +1 -1
- 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} +1 -1
- package/src/{use-tenant-subscription-bundles.ts → vue/use-tenant-subscription-bundles.ts} +1 -1
- package/dist/testing-e2e/admin-pages-suite.d.cts +0 -37
- package/dist/testing-e2e/admin-pages-suite.d.ts +0 -37
- /package/src/{action-registry.ts → client/action-registry.ts} +0 -0
- /package/src/{batch-column-fetcher.ts → client/batch-column-fetcher.ts} +0 -0
- /package/src/{boot-loader.ts → client/boot-loader.ts} +0 -0
- /package/src/{http-json.ts → client/http-json.ts} +0 -0
- /package/src/{manifest-loader.ts → client/manifest-loader.ts} +0 -0
- /package/src/{nav-builder.ts → client/nav-builder.ts} +0 -0
- /package/src/{plan-versions-catalog.ts → client/plan-versions-catalog.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
- /package/src/{use-audit-entries.ts → vue/use-audit-entries.ts} +0 -0
- /package/src/{use-plan-editor.ts → vue/use-plan-editor.ts} +0 -0
- /package/src/{use-plan-versions.ts → vue/use-plan-versions.ts} +0 -0
- /package/src/{use-platform-tenant-actions.ts → vue/use-platform-tenant-actions.ts} +0 -0
- /package/src/{use-subscription-draft.ts → vue/use-subscription-draft.ts} +0 -0
- /package/src/{use-tenants.ts → vue/use-tenants.ts} +0 -0
|
@@ -109,6 +109,7 @@
|
|
|
109
109
|
<script setup lang="ts">
|
|
110
110
|
import { computed, onMounted, ref } from 'vue';
|
|
111
111
|
import { useQuasar } from 'quasar';
|
|
112
|
+
import { useSuperAdminNotify } from '../quasar/notify.js';
|
|
112
113
|
import PilotCreateDialog from '../components/dialogs/PilotCreateDialog.vue';
|
|
113
114
|
import PilotEditDialog from '../components/dialogs/PilotEditDialog.vue';
|
|
114
115
|
import MfaPromptDialog from '../components/MfaPromptDialog.vue';
|
|
@@ -200,6 +201,7 @@ const props = withDefaults(
|
|
|
200
201
|
);
|
|
201
202
|
|
|
202
203
|
const q = useQuasar();
|
|
204
|
+
const notify = useSuperAdminNotify();
|
|
203
205
|
const rows = ref<PilotRow[]>([]);
|
|
204
206
|
const reviewSoon = ref<PilotRow[]>([]);
|
|
205
207
|
const loading = ref(false);
|
|
@@ -445,22 +447,16 @@ function onEditClick(row: PilotRow): void {
|
|
|
445
447
|
}
|
|
446
448
|
|
|
447
449
|
function onUpdated(result: PilotEditResult): void {
|
|
448
|
-
|
|
449
|
-
type: 'positive',
|
|
450
|
-
message: `Pilot ${result.slug} aktualisiert.`,
|
|
450
|
+
notify('positive', `Pilot ${result.slug} aktualisiert.`, {
|
|
451
451
|
caption: result.changed?.length ? `Geändert: ${result.changed.join(', ')}` : undefined,
|
|
452
|
-
position: 'top',
|
|
453
452
|
});
|
|
454
453
|
void reload();
|
|
455
454
|
}
|
|
456
455
|
|
|
457
456
|
function onCreated(result: PilotCreateResult): void {
|
|
458
|
-
|
|
459
|
-
type: 'positive',
|
|
460
|
-
message: `Pilot ${result.slug} angelegt.`,
|
|
457
|
+
notify('positive', `Pilot ${result.slug} angelegt.`, {
|
|
461
458
|
caption: result.initialPassword ? `Initial-Passwort: ${result.initialPassword}` : undefined,
|
|
462
|
-
|
|
463
|
-
timeout: 8000,
|
|
459
|
+
timeoutMs: 8000,
|
|
464
460
|
});
|
|
465
461
|
void reload();
|
|
466
462
|
}
|
|
@@ -476,10 +472,10 @@ async function runAction(
|
|
|
476
472
|
if (!requireMfa) {
|
|
477
473
|
try {
|
|
478
474
|
await invoke('');
|
|
479
|
-
|
|
475
|
+
notify('positive', successMessage);
|
|
480
476
|
await reload();
|
|
481
477
|
} catch (err) {
|
|
482
|
-
|
|
478
|
+
notify('negative', errMsg(err));
|
|
483
479
|
}
|
|
484
480
|
return;
|
|
485
481
|
}
|
|
@@ -491,7 +487,7 @@ async function runAction(
|
|
|
491
487
|
try {
|
|
492
488
|
await invoke(code);
|
|
493
489
|
showMfa.value = false;
|
|
494
|
-
|
|
490
|
+
notify('positive', successMessage);
|
|
495
491
|
await reload();
|
|
496
492
|
return;
|
|
497
493
|
} catch (err) {
|
|
@@ -501,7 +497,7 @@ async function runAction(
|
|
|
501
497
|
continue;
|
|
502
498
|
}
|
|
503
499
|
showMfa.value = false;
|
|
504
|
-
|
|
500
|
+
notify('negative', errMsg(err));
|
|
505
501
|
return;
|
|
506
502
|
}
|
|
507
503
|
}
|
|
@@ -76,8 +76,8 @@
|
|
|
76
76
|
|
|
77
77
|
<script setup lang="ts">
|
|
78
78
|
import { computed, ref, watch } from 'vue';
|
|
79
|
-
import type { CatalogSnapshot, RawCatalogData } from '../plan-versions-catalog.js';
|
|
80
|
-
import { buildSnapshots } from '../plan-versions-catalog.js';
|
|
79
|
+
import type { CatalogSnapshot, RawCatalogData } from '../client/plan-versions-catalog.js';
|
|
80
|
+
import { buildSnapshots } from '../client/plan-versions-catalog.js';
|
|
81
81
|
import PlanVersionsTimeline from './plan-versions/PlanVersionsTimeline.vue';
|
|
82
82
|
import PlanVersionHeader from './plan-versions/PlanVersionHeader.vue';
|
|
83
83
|
import PlanVersionsList, { type QuotaColumnConfig } from './plan-versions/PlanVersionsList.vue';
|
|
@@ -177,8 +177,8 @@ import {
|
|
|
177
177
|
usePlanVersions,
|
|
178
178
|
type UsePlansResult,
|
|
179
179
|
type UsePlanVersionsResult,
|
|
180
|
-
} from '../use-plans.js';
|
|
181
|
-
import type { HttpClient } from '../types.js';
|
|
180
|
+
} from '../vue/use-plans.js';
|
|
181
|
+
import type { HttpClient } from '../client/types.js';
|
|
182
182
|
import PlanVersionEditor from '../components/plan-version-editor/PlanVersionEditor.vue';
|
|
183
183
|
import PlanMatrix from '../components/plan-matrix/PlanMatrix.vue';
|
|
184
184
|
import PlanDetail from '../components/plan-detail/PlanDetail.vue';
|
|
@@ -153,6 +153,7 @@
|
|
|
153
153
|
<script setup lang="ts">
|
|
154
154
|
import { reactive, ref } from 'vue';
|
|
155
155
|
import { useQuasar } from 'quasar';
|
|
156
|
+
import { useSuperAdminNotify } from '../quasar/notify.js';
|
|
156
157
|
import MfaPromptDialog from '../components/MfaPromptDialog.vue';
|
|
157
158
|
import type {
|
|
158
159
|
PlatformEmailProvider,
|
|
@@ -188,6 +189,7 @@ const props = withDefaults(
|
|
|
188
189
|
);
|
|
189
190
|
|
|
190
191
|
const q = useQuasar();
|
|
192
|
+
const notify = useSuperAdminNotify();
|
|
191
193
|
const rows = ref<PlatformEmailProvider[]>([]);
|
|
192
194
|
const loading = ref(false);
|
|
193
195
|
|
|
@@ -274,7 +276,7 @@ async function reload(): Promise<void> {
|
|
|
274
276
|
rows.value = await props.loadProviders();
|
|
275
277
|
} catch (err) {
|
|
276
278
|
rows.value = [];
|
|
277
|
-
|
|
279
|
+
notify('negative', errMsg(err));
|
|
278
280
|
} finally {
|
|
279
281
|
loading.value = false;
|
|
280
282
|
}
|
|
@@ -312,7 +314,7 @@ async function runWrite(label: string, invoke: (code: string) => Promise<unknown
|
|
|
312
314
|
await invoke('');
|
|
313
315
|
return true;
|
|
314
316
|
} catch (err) {
|
|
315
|
-
|
|
317
|
+
notify('negative', errMsg(err));
|
|
316
318
|
return false;
|
|
317
319
|
}
|
|
318
320
|
}
|
|
@@ -330,7 +332,7 @@ async function runWrite(label: string, invoke: (code: string) => Promise<unknown
|
|
|
330
332
|
continue;
|
|
331
333
|
}
|
|
332
334
|
showMfa.value = false;
|
|
333
|
-
|
|
335
|
+
notify('negative', errMsg(err));
|
|
334
336
|
return false;
|
|
335
337
|
}
|
|
336
338
|
}
|
|
@@ -368,7 +370,7 @@ async function onSubmit(): Promise<void> {
|
|
|
368
370
|
);
|
|
369
371
|
if (ok) {
|
|
370
372
|
showForm.value = false;
|
|
371
|
-
|
|
373
|
+
notify('positive', 'Gespeichert.');
|
|
372
374
|
void reload();
|
|
373
375
|
}
|
|
374
376
|
}
|
|
@@ -384,7 +386,7 @@ function onDelete(row: PlatformEmailProvider): void {
|
|
|
384
386
|
props.deleteProvider(row.id, code || undefined),
|
|
385
387
|
);
|
|
386
388
|
if (ok) {
|
|
387
|
-
|
|
389
|
+
notify('positive', 'Gelöscht.');
|
|
388
390
|
void reload();
|
|
389
391
|
}
|
|
390
392
|
});
|
|
@@ -138,6 +138,7 @@ export function computePlanColors(
|
|
|
138
138
|
<script setup lang="ts">
|
|
139
139
|
import { computed, onMounted, reactive, ref } from 'vue';
|
|
140
140
|
import { useQuasar } from 'quasar';
|
|
141
|
+
import { useSuperAdminNotify } from '../quasar/notify.js';
|
|
141
142
|
import PromoCodeCreateDialog from '../components/dialogs/PromoCodeCreateDialog.vue';
|
|
142
143
|
import PromoCodeEditDialog, {
|
|
143
144
|
type PromoCodeEditRow,
|
|
@@ -215,6 +216,7 @@ const props = withDefaults(
|
|
|
215
216
|
);
|
|
216
217
|
|
|
217
218
|
const q = useQuasar();
|
|
219
|
+
const notify = useSuperAdminNotify();
|
|
218
220
|
const rows = ref<PromoRow[]>([]);
|
|
219
221
|
const loading = ref(false);
|
|
220
222
|
const filter = reactive({ search: '', status: null as string | null });
|
|
@@ -490,14 +492,10 @@ async function onPatch(row: PromoRow, data: PromoCodeUpdatePayload): Promise<voi
|
|
|
490
492
|
if (!props.submitEdit) return;
|
|
491
493
|
try {
|
|
492
494
|
await props.submitEdit(row.id, data);
|
|
493
|
-
|
|
494
|
-
type: 'positive',
|
|
495
|
-
message: `${row.code} → ${data.status}`,
|
|
496
|
-
position: 'top',
|
|
497
|
-
});
|
|
495
|
+
notify('positive', `${row.code} → ${data.status}`);
|
|
498
496
|
await reload();
|
|
499
497
|
} catch (err) {
|
|
500
|
-
|
|
498
|
+
notify('negative', errMsg(err));
|
|
501
499
|
}
|
|
502
500
|
}
|
|
503
501
|
|
|
@@ -512,33 +510,21 @@ function onDeleteClick(row: PromoRow): void {
|
|
|
512
510
|
}).onOk(async () => {
|
|
513
511
|
try {
|
|
514
512
|
await submit(row.id);
|
|
515
|
-
|
|
516
|
-
type: 'positive',
|
|
517
|
-
message: `${row.code} gelöscht.`,
|
|
518
|
-
position: 'top',
|
|
519
|
-
});
|
|
513
|
+
notify('positive', `${row.code} gelöscht.`);
|
|
520
514
|
await reload();
|
|
521
515
|
} catch (err) {
|
|
522
|
-
|
|
516
|
+
notify('negative', errMsg(err));
|
|
523
517
|
}
|
|
524
518
|
});
|
|
525
519
|
}
|
|
526
520
|
|
|
527
521
|
function onCreated(): void {
|
|
528
|
-
|
|
529
|
-
type: 'positive',
|
|
530
|
-
message: 'Promo-Code angelegt.',
|
|
531
|
-
position: 'top',
|
|
532
|
-
});
|
|
522
|
+
notify('positive', 'Promo-Code angelegt.');
|
|
533
523
|
void reload();
|
|
534
524
|
}
|
|
535
525
|
|
|
536
526
|
function onUpdated(): void {
|
|
537
|
-
|
|
538
|
-
type: 'positive',
|
|
539
|
-
message: 'Promo-Code aktualisiert.',
|
|
540
|
-
position: 'top',
|
|
541
|
-
});
|
|
527
|
+
notify('positive', 'Promo-Code aktualisiert.');
|
|
542
528
|
void reload();
|
|
543
529
|
}
|
|
544
530
|
|
|
@@ -86,14 +86,14 @@ import { computed, onMounted, reactive, ref } from 'vue';
|
|
|
86
86
|
import { useRouter } from 'vue-router';
|
|
87
87
|
import type { SetupStatusResponse } from '@saasicat/types';
|
|
88
88
|
|
|
89
|
-
import { usePublicBoot } from '../use-public-boot.js';
|
|
89
|
+
import { usePublicBoot } from '../vue/use-public-boot.js';
|
|
90
90
|
import {
|
|
91
91
|
useSuperAdminBrand,
|
|
92
92
|
useSuperAdminEndpoints,
|
|
93
93
|
useSuperAdminHttp,
|
|
94
94
|
useSuperAdminLoginAdapter,
|
|
95
|
-
} from '../use-super-admin-context.js';
|
|
96
|
-
import { getJson } from '../http-json.js';
|
|
95
|
+
} from '../vue/use-super-admin-context.js';
|
|
96
|
+
import { getJson } from '../client/http-json.js';
|
|
97
97
|
import SuperAdminSetupWizard from './SuperAdminSetupWizard.vue';
|
|
98
98
|
|
|
99
99
|
interface Props {
|
|
@@ -158,8 +158,8 @@ import {
|
|
|
158
158
|
useSuperAdminBrand,
|
|
159
159
|
useSuperAdminEndpoints,
|
|
160
160
|
useSuperAdminHttp,
|
|
161
|
-
} from '../use-super-admin-context.js';
|
|
162
|
-
import { HttpJsonError, postJson as httpPostJson } from '../http-json.js';
|
|
161
|
+
} from '../vue/use-super-admin-context.js';
|
|
162
|
+
import { HttpJsonError, postJson as httpPostJson } from '../client/http-json.js';
|
|
163
163
|
|
|
164
164
|
interface Props {
|
|
165
165
|
/** Display name + badge abbreviation (override the app branding, e.g. from PublicBoot). */
|
|
@@ -125,12 +125,12 @@
|
|
|
125
125
|
import { computed, onMounted, ref, toRef } from 'vue';
|
|
126
126
|
import type { RouteLocationRaw } from 'vue-router';
|
|
127
127
|
import type { QTableColumn } from 'quasar';
|
|
128
|
-
import {
|
|
128
|
+
import { useSuperAdminNotify } from '../quasar/notify.js';
|
|
129
129
|
import type { AdminManifest, TenantActionDef, TenantDto } from '@saasicat/types';
|
|
130
130
|
import KvBlock from '../components/KvBlock.vue';
|
|
131
131
|
import MfaPromptDialog from '../components/MfaPromptDialog.vue';
|
|
132
132
|
import TenantActionConfirmDialog from '../components/TenantActionConfirmDialog.vue';
|
|
133
|
-
import { useTenantActionFlow } from '../use-tenant-action-flow.js';
|
|
133
|
+
import { useTenantActionFlow } from '../vue/use-tenant-action-flow.js';
|
|
134
134
|
|
|
135
135
|
export interface TenantDetailData {
|
|
136
136
|
id: string;
|
|
@@ -200,7 +200,7 @@ const props = withDefaults(
|
|
|
200
200
|
},
|
|
201
201
|
);
|
|
202
202
|
|
|
203
|
-
const
|
|
203
|
+
const notify = useSuperAdminNotify();
|
|
204
204
|
const data = ref<TenantDetailData | null>(null);
|
|
205
205
|
const loading = ref(false);
|
|
206
206
|
|
|
@@ -317,7 +317,7 @@ const tenantRow = computed<TenantDto | null>(() => {
|
|
|
317
317
|
const flow = useTenantActionFlow<TenantDto>(manifestRef, {
|
|
318
318
|
confirm: showConfirmDialog,
|
|
319
319
|
mfa: showMfaDialog,
|
|
320
|
-
notify
|
|
320
|
+
notify,
|
|
321
321
|
onSuccess: () => void load(),
|
|
322
322
|
visibleForRow: (def, row) => {
|
|
323
323
|
if (def.actionKey === 'tenants.suspend') return row.isActive;
|
|
@@ -172,12 +172,12 @@ import type {
|
|
|
172
172
|
TenantDto,
|
|
173
173
|
TenantListFilter,
|
|
174
174
|
} from '@saasicat/types';
|
|
175
|
-
import type { HttpClient } from '../types.js';
|
|
176
|
-
import { useTenants } from '../use-tenants.js';
|
|
175
|
+
import type { HttpClient } from '../client/types.js';
|
|
176
|
+
import { useTenants } from '../vue/use-tenants.js';
|
|
177
177
|
import {
|
|
178
178
|
usePlatformTenantActions,
|
|
179
179
|
type PlatformTenantActionTone,
|
|
180
|
-
} from '../use-platform-tenant-actions.js';
|
|
180
|
+
} from '../vue/use-platform-tenant-actions.js';
|
|
181
181
|
import MfaPromptDialog from '../components/MfaPromptDialog.vue';
|
|
182
182
|
import TenantActionConfirmDialog from '../components/TenantActionConfirmDialog.vue';
|
|
183
183
|
import StatusPill, { type PillTone } from './tenants/StatusPill.vue';
|
|
@@ -106,6 +106,7 @@
|
|
|
106
106
|
<script setup lang="ts">
|
|
107
107
|
import { computed, onMounted, reactive, ref } from 'vue';
|
|
108
108
|
import { useQuasar } from 'quasar';
|
|
109
|
+
import { useSuperAdminNotify } from '../quasar/notify.js';
|
|
109
110
|
import MfaPromptDialog from '../components/MfaPromptDialog.vue';
|
|
110
111
|
|
|
111
112
|
// Platform standard page: user search. Data-agnostic.
|
|
@@ -172,6 +173,7 @@ const props = withDefaults(
|
|
|
172
173
|
);
|
|
173
174
|
|
|
174
175
|
const q = useQuasar();
|
|
176
|
+
const notify = useSuperAdminNotify();
|
|
175
177
|
const rows = ref<UserRow[]>([]);
|
|
176
178
|
const loading = ref(false);
|
|
177
179
|
const filter = reactive({ q: '', tenant: '' });
|
|
@@ -387,7 +389,7 @@ async function runAction<R>(
|
|
|
387
389
|
const result = await invoke('');
|
|
388
390
|
onSuccess(result);
|
|
389
391
|
} catch (err) {
|
|
390
|
-
|
|
392
|
+
notify('negative', errMsg(err));
|
|
391
393
|
}
|
|
392
394
|
return;
|
|
393
395
|
}
|
|
@@ -406,7 +408,7 @@ async function runAction<R>(
|
|
|
406
408
|
continue;
|
|
407
409
|
}
|
|
408
410
|
showMfa.value = false;
|
|
409
|
-
|
|
411
|
+
notify('negative', errMsg(err));
|
|
410
412
|
return;
|
|
411
413
|
}
|
|
412
414
|
}
|
|
@@ -438,11 +440,7 @@ function onResetPasswordClick(row: UserRow): void {
|
|
|
438
440
|
ok: { label: 'Verstanden' },
|
|
439
441
|
});
|
|
440
442
|
} else {
|
|
441
|
-
|
|
442
|
-
type: 'positive',
|
|
443
|
-
message: 'Passwort-Reset ausgelöst.',
|
|
444
|
-
position: 'top',
|
|
445
|
-
});
|
|
443
|
+
notify('positive', 'Passwort-Reset ausgelöst.');
|
|
446
444
|
}
|
|
447
445
|
void reload();
|
|
448
446
|
},
|
|
@@ -466,11 +464,7 @@ function onDeactivateClick(row: UserRow): void {
|
|
|
466
464
|
!!props.requireMfaForDeactivate,
|
|
467
465
|
(code) => submit(row.id, reason, code),
|
|
468
466
|
() => {
|
|
469
|
-
|
|
470
|
-
type: 'positive',
|
|
471
|
-
message: `${row.email} deaktiviert.`,
|
|
472
|
-
position: 'top',
|
|
473
|
-
});
|
|
467
|
+
notify('positive', `${row.email} deaktiviert.`);
|
|
474
468
|
void reload();
|
|
475
469
|
},
|
|
476
470
|
);
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
|
|
90
90
|
<script setup lang="ts">
|
|
91
91
|
import { computed } from 'vue';
|
|
92
|
-
import type { CatalogSnapshot } from '../../plan-versions-catalog.js';
|
|
92
|
+
import type { CatalogSnapshot } from '../../client/plan-versions-catalog.js';
|
|
93
93
|
import { formatDateDe } from './format.js';
|
|
94
94
|
import PlanVersionStatusBadge from './PlanVersionStatusBadge.vue';
|
|
95
95
|
import type { PlanVersionViewMode } from './types.js';
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
|
|
58
58
|
<script setup lang="ts">
|
|
59
59
|
import { onMounted, ref, watch } from 'vue';
|
|
60
|
-
import type { CatalogSnapshot } from '../../plan-versions-catalog.js';
|
|
60
|
+
import type { CatalogSnapshot } from '../../client/plan-versions-catalog.js';
|
|
61
61
|
import { formatTsDe } from './format.js';
|
|
62
62
|
|
|
63
63
|
// PlanVersionsAudit — data-agnostic. Consumers pass in a `loadAudit` loader
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
<script setup lang="ts">
|
|
46
46
|
import { computed } from 'vue';
|
|
47
47
|
import type { VersionChange } from '@saasicat/types';
|
|
48
|
-
import type { CatalogSnapshot, ResolvedPlan } from '../../plan-versions-catalog.js';
|
|
48
|
+
import type { CatalogSnapshot, ResolvedPlan } from '../../client/plan-versions-catalog.js';
|
|
49
49
|
import PlanDiffCard from './PlanDiffCard.vue';
|
|
50
50
|
|
|
51
51
|
interface SnapshotEntityDiff {
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
|
|
98
98
|
<script setup lang="ts">
|
|
99
99
|
import { computed, ref } from 'vue';
|
|
100
|
-
import type { CatalogSnapshot } from '../../plan-versions-catalog.js';
|
|
100
|
+
import type { CatalogSnapshot } from '../../client/plan-versions-catalog.js';
|
|
101
101
|
import PlanVersionsKpi from './PlanVersionsKpi.vue';
|
|
102
102
|
import { fmtEuro } from './format.js';
|
|
103
103
|
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
|
|
53
53
|
<script setup lang="ts">
|
|
54
54
|
import { computed } from 'vue';
|
|
55
|
-
import type { CatalogSnapshot } from '../../plan-versions-catalog.js';
|
|
55
|
+
import type { CatalogSnapshot } from '../../client/plan-versions-catalog.js';
|
|
56
56
|
import { fmtEuro } from './format.js';
|
|
57
57
|
|
|
58
58
|
// Generic feature matrix. Apps pass `featureRegistry` for label/icon/
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
</template>
|
|
72
72
|
|
|
73
73
|
<script setup lang="ts">
|
|
74
|
-
import type { CatalogSnapshot } from '../../plan-versions-catalog.js';
|
|
74
|
+
import type { CatalogSnapshot } from '../../client/plan-versions-catalog.js';
|
|
75
75
|
import { formatRelativeDe } from './format.js';
|
|
76
76
|
|
|
77
77
|
defineProps<{
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
import { computed, onMounted, reactive, ref } from 'vue';
|
|
168
168
|
import type { SubscriptionBundleRecord } from '@saasicat/types';
|
|
169
169
|
|
|
170
|
-
import { useTenantSubscriptionBundles } from '../use-tenant-subscription-bundles.js';
|
|
170
|
+
import { useTenantSubscriptionBundles } from '../vue/use-tenant-subscription-bundles.js';
|
|
171
171
|
|
|
172
172
|
// MySubscriptionBundlesPage — tenant self-service page "Meine Bundles".
|
|
173
173
|
// The hosting app embeds the page
|
|
@@ -104,9 +104,9 @@ import {
|
|
|
104
104
|
useSubscriptionDraft,
|
|
105
105
|
type PromoState,
|
|
106
106
|
type SubscriptionDraft,
|
|
107
|
-
} from '../use-subscription-draft.js';
|
|
108
|
-
import type { CatalogPlan } from '../use-tenant-billing-catalog.js';
|
|
109
|
-
import type { BillingCycleStr } from '../use-tenant-billing.js';
|
|
107
|
+
} from '../vue/use-subscription-draft.js';
|
|
108
|
+
import type { CatalogPlan } from '../vue/use-tenant-billing-catalog.js';
|
|
109
|
+
import type { BillingCycleStr } from '../vue/use-tenant-billing.js';
|
|
110
110
|
import type {
|
|
111
111
|
OnboardingSelectionRequest,
|
|
112
112
|
OnboardingSelectionResponse,
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
|
|
106
106
|
<script setup lang="ts">
|
|
107
107
|
import { computed, ref } from 'vue';
|
|
108
|
-
import type { PackageSnapshotShape } from '../use-tenant-billing.js';
|
|
108
|
+
import type { PackageSnapshotShape } from '../vue/use-tenant-billing.js';
|
|
109
109
|
import type { TenantPlanSectionI18n } from './default-i18n.js';
|
|
110
110
|
|
|
111
111
|
// PackageSnapshotPanel — P11.4 (METAMODELL §17a):
|
|
@@ -220,8 +220,8 @@ import { computed, ref, watch } from 'vue';
|
|
|
220
220
|
import LimitsRow from './LimitsRow.vue';
|
|
221
221
|
import PlanCycleToggle from '../components/plan/PlanCycleToggle.vue';
|
|
222
222
|
import PlanGrid from '../components/plan/PlanGrid.vue';
|
|
223
|
-
import type { BillingCycleStr, PlanChangePreviewShape } from '../use-tenant-billing.js';
|
|
224
|
-
import type { CatalogPlan } from '../use-tenant-billing-catalog.js';
|
|
223
|
+
import type { BillingCycleStr, PlanChangePreviewShape } from '../vue/use-tenant-billing.js';
|
|
224
|
+
import type { CatalogPlan } from '../vue/use-tenant-billing-catalog.js';
|
|
225
225
|
|
|
226
226
|
// PlanChangeWizard — 3-step dialog for plan changes.
|
|
227
227
|
//
|
|
@@ -204,13 +204,13 @@ import {
|
|
|
204
204
|
useTenantBilling,
|
|
205
205
|
type BundlePreviewShape,
|
|
206
206
|
type SubscriptionBundleShape,
|
|
207
|
-
} from '../use-tenant-billing.js';
|
|
207
|
+
} from '../vue/use-tenant-billing.js';
|
|
208
208
|
import {
|
|
209
209
|
useTenantBillingCatalog,
|
|
210
210
|
type CatalogBundle,
|
|
211
211
|
type CatalogPlan,
|
|
212
|
-
} from '../use-tenant-billing-catalog.js';
|
|
213
|
-
import type { HttpClient } from '../types.js';
|
|
212
|
+
} from '../vue/use-tenant-billing-catalog.js';
|
|
213
|
+
import type { HttpClient } from '../client/types.js';
|
|
214
214
|
|
|
215
215
|
// TenantPlanSection — main component for the tenant plan/bundle self-service
|
|
216
216
|
// UI. The consumer (app) embeds it in its settings page and passes through
|
|
@@ -168,7 +168,7 @@ import type {
|
|
|
168
168
|
BundleAddPreviewShape,
|
|
169
169
|
BundleCancelPreviewShape,
|
|
170
170
|
BundlePreviewShape,
|
|
171
|
-
} from '../../use-tenant-billing.js';
|
|
171
|
+
} from '../../vue/use-tenant-billing.js';
|
|
172
172
|
|
|
173
173
|
// BundlePreviewDialog (#37/#61) — preview BEFORE bundle add/cancel in the
|
|
174
174
|
// tenant self-service: proration until period end, next-period price,
|
|
@@ -131,8 +131,8 @@
|
|
|
131
131
|
import { computed } from 'vue';
|
|
132
132
|
import { missingRequiresFor } from '@saasicat/types';
|
|
133
133
|
import type { TenantPlanSectionI18n } from '../default-i18n.js';
|
|
134
|
-
import type { CatalogBundle } from '../../use-tenant-billing-catalog.js';
|
|
135
|
-
import type { SubscriptionBundleShape } from '../../use-tenant-billing.js';
|
|
134
|
+
import type { CatalogBundle } from '../../vue/use-tenant-billing-catalog.js';
|
|
135
|
+
import type { SubscriptionBundleShape } from '../../vue/use-tenant-billing.js';
|
|
136
136
|
|
|
137
137
|
// TenantBundleStore — bundle sales on "Paket & Verbrauch" (#15):
|
|
138
138
|
// lists booked (cancelable) and available (bookable) catalog bundles.
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
|
|
46
46
|
<script setup lang="ts">
|
|
47
47
|
import type { TenantPlanSectionI18n } from '../default-i18n.js';
|
|
48
|
-
import type { UsageSnapshotShape } from '../../use-tenant-billing.js';
|
|
48
|
+
import type { UsageSnapshotShape } from '../../vue/use-tenant-billing.js';
|
|
49
49
|
|
|
50
50
|
defineProps<{
|
|
51
51
|
usage: UsageSnapshotShape;
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
<script setup lang="ts">
|
|
19
19
|
import type { TenantPlanSectionI18n } from '../default-i18n.js';
|
|
20
|
-
import type { UsageSnapshotShape } from '../../use-tenant-billing.js';
|
|
20
|
+
import type { UsageSnapshotShape } from '../../vue/use-tenant-billing.js';
|
|
21
21
|
import UsageBar from '../UsageBar.vue';
|
|
22
22
|
|
|
23
23
|
defineProps<{
|