@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.
Files changed (109) hide show
  1. package/README.md +47 -4
  2. package/dist/action-registry-CQ2wL3R-.d.cts +85 -0
  3. package/dist/action-registry-CQ2wL3R-.d.ts +85 -0
  4. package/dist/chunk-3YP2ZAOD.js +63 -0
  5. package/dist/chunk-EH7TOD4H.js +718 -0
  6. package/dist/chunk-LVGUSD3T.js +26 -0
  7. package/dist/client/index.cjs +785 -0
  8. package/dist/client/index.d.cts +295 -0
  9. package/dist/client/index.d.ts +295 -0
  10. package/dist/client/index.js +52 -0
  11. package/dist/index.cjs +787 -834
  12. package/dist/index.d.cts +267 -841
  13. package/dist/index.d.ts +267 -841
  14. package/dist/index.js +284 -1059
  15. package/dist/quasar/index.cjs +159 -0
  16. package/dist/quasar/index.d.cts +86 -0
  17. package/dist/quasar/index.d.ts +86 -0
  18. package/dist/quasar/index.js +91 -0
  19. package/dist/ui-notify-COUzXEQ4.d.ts +178 -0
  20. package/dist/ui-notify-D_eAAwRh.d.cts +178 -0
  21. package/package.json +23 -3
  22. package/src/client/index.ts +25 -0
  23. package/src/components/FeatureGate.vue +1 -1
  24. package/src/components/plan/PlanCycleToggle.vue +1 -1
  25. package/src/components/plan/PlanGrid.vue +2 -2
  26. package/src/components/plan/PriceSummary.vue +1 -1
  27. package/src/components/plan/PromoCodeInput.vue +1 -1
  28. package/src/components/plan/PublicBundleGrid.vue +1 -1
  29. package/src/index.ts +82 -79
  30. package/src/pages-standard/AdminLayout.vue +2 -2
  31. package/src/pages-standard/DashboardPage.vue +2 -2
  32. package/src/pages-standard/EmailHistoryPage.vue +9 -13
  33. package/src/pages-standard/MarketingCatalogPage.vue +5 -5
  34. package/src/pages-standard/PilotsPage.vue +9 -13
  35. package/src/pages-standard/PlanVersionsPage.vue +2 -2
  36. package/src/pages-standard/PlansPage.vue +2 -2
  37. package/src/pages-standard/PlatformEmailPage.vue +7 -5
  38. package/src/pages-standard/PromoCodesPage.vue +8 -22
  39. package/src/pages-standard/SuperAdminLoginPage.vue +3 -3
  40. package/src/pages-standard/SuperAdminSetupWizard.vue +2 -2
  41. package/src/pages-standard/TenantDetailPage.vue +4 -4
  42. package/src/pages-standard/TenantsPage.vue +3 -3
  43. package/src/pages-standard/UsersPage.vue +6 -12
  44. package/src/pages-standard/plan-versions/PlanVersionHeader.vue +1 -1
  45. package/src/pages-standard/plan-versions/PlanVersionsAudit.vue +1 -1
  46. package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +1 -1
  47. package/src/pages-standard/plan-versions/PlanVersionsList.vue +1 -1
  48. package/src/pages-standard/plan-versions/PlanVersionsMatrix.vue +1 -1
  49. package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +1 -1
  50. package/src/pages-tenant/MySubscriptionBundlesPage.vue +1 -1
  51. package/src/pages-tenant/OnboardingConfigurator.vue +3 -3
  52. package/src/pages-tenant/PackageSnapshotPanel.vue +1 -1
  53. package/src/pages-tenant/PlanChangeWizard.vue +2 -2
  54. package/src/pages-tenant/TenantPlanSection.vue +3 -3
  55. package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +1 -1
  56. package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +2 -2
  57. package/src/pages-tenant/tenant-plan-section/TenantPlanCardHeader.vue +1 -1
  58. package/src/pages-tenant/tenant-plan-section/TenantUsageGrid.vue +1 -1
  59. package/src/quasar/create-super-admin-app.ts +173 -0
  60. package/src/quasar/index.ts +11 -0
  61. package/src/quasar/notify.ts +30 -0
  62. package/src/{manifest-store-factory.ts → vue/manifest-store-factory.ts} +1 -1
  63. package/src/{platform-loaders.ts → vue/platform-loaders.ts} +4 -4
  64. package/src/{project-page-host.ts → vue/project-page-host.ts} +1 -1
  65. package/src/{create-super-admin-app.ts → vue/super-admin-context.ts} +20 -139
  66. package/src/vue/ui-notify.ts +30 -0
  67. package/src/{use-actions.ts → vue/use-actions.ts} +1 -1
  68. package/src/{use-api-list.ts → vue/use-api-list.ts} +1 -1
  69. package/src/{use-batch-columns.ts → vue/use-batch-columns.ts} +1 -1
  70. package/src/{use-bulk-publish.ts → vue/use-bulk-publish.ts} +1 -1
  71. package/src/{use-bundle-versions-map.ts → vue/use-bundle-versions-map.ts} +1 -1
  72. package/src/{use-bundles.ts → vue/use-bundles.ts} +1 -1
  73. package/src/{use-business-types.ts → vue/use-business-types.ts} +1 -1
  74. package/src/{use-catalog-entries.ts → vue/use-catalog-entries.ts} +1 -1
  75. package/src/{use-discovery.ts → vue/use-discovery.ts} +1 -1
  76. package/src/{use-entitlement.ts → vue/use-entitlement.ts} +1 -1
  77. package/src/{use-live-plan-versions.ts → vue/use-live-plan-versions.ts} +1 -1
  78. package/src/{use-manifest.ts → vue/use-manifest.ts} +1 -1
  79. package/src/{use-marketing-projections.ts → vue/use-marketing-projections.ts} +1 -1
  80. package/src/{use-nav.ts → vue/use-nav.ts} +1 -1
  81. package/src/{use-plans.ts → vue/use-plans.ts} +1 -1
  82. package/src/{use-promotions.ts → vue/use-promotions.ts} +1 -1
  83. package/src/{use-public-boot.ts → vue/use-public-boot.ts} +1 -1
  84. package/src/{use-super-admin-context.ts → vue/use-super-admin-context.ts} +2 -2
  85. package/src/{use-tenant-action-flow.ts → vue/use-tenant-action-flow.ts} +1 -1
  86. package/src/{use-tenant-billing-catalog.ts → vue/use-tenant-billing-catalog.ts} +2 -2
  87. package/src/{use-tenant-billing.ts → vue/use-tenant-billing.ts} +2 -2
  88. package/src/{use-tenant-manifest.ts → vue/use-tenant-manifest.ts} +1 -1
  89. package/src/{use-tenant-subscription-bundles.ts → vue/use-tenant-subscription-bundles.ts} +1 -1
  90. package/dist/testing-e2e/admin-pages-suite.d.cts +0 -37
  91. package/dist/testing-e2e/admin-pages-suite.d.ts +0 -37
  92. /package/src/{action-registry.ts → client/action-registry.ts} +0 -0
  93. /package/src/{batch-column-fetcher.ts → client/batch-column-fetcher.ts} +0 -0
  94. /package/src/{boot-loader.ts → client/boot-loader.ts} +0 -0
  95. /package/src/{http-json.ts → client/http-json.ts} +0 -0
  96. /package/src/{manifest-loader.ts → client/manifest-loader.ts} +0 -0
  97. /package/src/{nav-builder.ts → client/nav-builder.ts} +0 -0
  98. /package/src/{plan-versions-catalog.ts → client/plan-versions-catalog.ts} +0 -0
  99. /package/src/{types.ts → client/types.ts} +0 -0
  100. /package/src/{version.ts → client/version.ts} +0 -0
  101. /package/src/{create-admin-routes.ts → vue/create-admin-routes.ts} +0 -0
  102. /package/src/{entitlement-provider.ts → vue/entitlement-provider.ts} +0 -0
  103. /package/src/{feature-router-guard.ts → vue/feature-router-guard.ts} +0 -0
  104. /package/src/{use-audit-entries.ts → vue/use-audit-entries.ts} +0 -0
  105. /package/src/{use-plan-editor.ts → vue/use-plan-editor.ts} +0 -0
  106. /package/src/{use-plan-versions.ts → vue/use-plan-versions.ts} +0 -0
  107. /package/src/{use-platform-tenant-actions.ts → vue/use-platform-tenant-actions.ts} +0 -0
  108. /package/src/{use-subscription-draft.ts → vue/use-subscription-draft.ts} +0 -0
  109. /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
- q.notify({
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
- q.notify({
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
- position: 'top',
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
- q.notify({ type: 'positive', message: successMessage, position: 'top' });
475
+ notify('positive', successMessage);
480
476
  await reload();
481
477
  } catch (err) {
482
- q.notify({ type: 'negative', message: errMsg(err), position: 'top' });
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
- q.notify({ type: 'positive', message: successMessage, position: 'top' });
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
- q.notify({ type: 'negative', message: errMsg(err), position: 'top' });
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
- q.notify({ type: 'negative', message: errMsg(err), position: 'top' });
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
- q.notify({ type: 'negative', message: errMsg(err), position: 'top' });
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
- q.notify({ type: 'negative', message: errMsg(err), position: 'top' });
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
- q.notify({ type: 'positive', message: 'Gespeichert.', position: 'top' });
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
- q.notify({ type: 'positive', message: 'Gelöscht.', position: 'top' });
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
- q.notify({
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
- q.notify({ type: 'negative', message: errMsg(err), position: 'top' });
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
- q.notify({
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
- q.notify({ type: 'negative', message: errMsg(err), position: 'top' });
516
+ notify('negative', errMsg(err));
523
517
  }
524
518
  });
525
519
  }
526
520
 
527
521
  function onCreated(): void {
528
- q.notify({
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
- q.notify({
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 { useQuasar } from 'quasar';
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 q = useQuasar();
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: (kind, message) => q.notify({ type: kind, message, position: 'top' }),
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
- q.notify({ type: 'negative', message: errMsg(err), position: 'top' });
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
- q.notify({ type: 'negative', message: errMsg(err), position: 'top' });
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
- q.notify({
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
- q.notify({
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<{