@saasicat/ui-vue 0.7.0 → 0.9.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 (41) hide show
  1. package/dist/{chunk-A3W2N26K.js → chunk-66BUSVC5.js} +68 -217
  2. package/dist/{chunk-X5SQ5HMB.js → chunk-TBLXKSTR.js} +0 -137
  3. package/dist/{chunk-QZOSDCNP.js → chunk-TY2WYKME.js} +1 -1
  4. package/dist/client/index.cjs +180 -463
  5. package/dist/client/index.d.cts +32 -57
  6. package/dist/client/index.d.ts +32 -57
  7. package/dist/client/index.js +4 -6
  8. package/dist/index.cjs +273 -580
  9. package/dist/index.d.cts +10 -55
  10. package/dist/index.d.ts +10 -55
  11. package/dist/index.js +76 -101
  12. package/dist/{messages-7b0P8W75.d.ts → messages-BIYw32u1.d.cts} +0 -67
  13. package/dist/{messages-7b0P8W75.d.cts → messages-BIYw32u1.d.ts} +0 -67
  14. package/dist/quasar/index.cjs +0 -136
  15. package/dist/quasar/index.d.cts +2 -2
  16. package/dist/quasar/index.d.ts +2 -2
  17. package/dist/quasar/index.js +2 -2
  18. package/dist/{use-super-admin-i18n-B3v3-SWZ.d.ts → use-super-admin-i18n-CWNu_W3u.d.ts} +1 -1
  19. package/dist/{use-super-admin-i18n-DMktRVEt.d.cts → use-super-admin-i18n-DL_qI1BY.d.cts} +1 -1
  20. package/package.json +5 -5
  21. package/src/client/admin-resource-client.ts +112 -0
  22. package/src/client/i18n/messages/nav.ts +0 -2
  23. package/src/client/i18n/messages/plan-versions.ts +0 -143
  24. package/src/client/index.ts +1 -2
  25. package/src/client/nav-builder.ts +9 -4
  26. package/src/index.ts +0 -1
  27. package/src/pages-standard/AdminLayout.vue +1 -1
  28. package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +1 -1
  29. package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +1 -1
  30. package/src/pages-standard/plan-versions/catalog-history.types.ts +37 -0
  31. package/src/pages-standard/plan-versions/format.ts +2 -38
  32. package/src/client/plan-versions-catalog.ts +0 -380
  33. package/src/pages-standard/PlanVersionsPage.vue +0 -220
  34. package/src/pages-standard/plan-versions/PlanVersionHeader.vue +0 -309
  35. package/src/pages-standard/plan-versions/PlanVersionStatusBadge.vue +0 -48
  36. package/src/pages-standard/plan-versions/PlanVersionsAudit.vue +0 -326
  37. package/src/pages-standard/plan-versions/PlanVersionsKpi.vue +0 -65
  38. package/src/pages-standard/plan-versions/PlanVersionsList.vue +0 -315
  39. package/src/pages-standard/plan-versions/PlanVersionsMatrix.vue +0 -261
  40. package/src/pages-standard/plan-versions/types.ts +0 -33
  41. package/src/vue/use-plan-versions.ts +0 -83
@@ -1,12 +1,9 @@
1
1
  import {
2
2
  DEFAULT_SA_LOCALE,
3
- SA_INTL_LOCALES,
4
3
  defaultHttpClient,
5
4
  defaultKvStore,
6
- formatMessage,
7
- navMessages,
8
- planVersionsMessages
9
- } from "./chunk-X5SQ5HMB.js";
5
+ navMessages
6
+ } from "./chunk-TBLXKSTR.js";
10
7
 
11
8
  // src/client/version.ts
12
9
  var ADMIN_UI_VERSION = "1.2.0";
@@ -174,7 +171,6 @@ var DEFAULT_STANDARD_PAGE_ROUTES = {
174
171
  subscriptions: "/admin/subscriptions",
175
172
  promoCodes: "/admin/promo-codes",
176
173
  plans: "/admin/plans",
177
- planVersions: "/admin/plan-versions",
178
174
  audit: "/admin/audit",
179
175
  users: "/admin/users",
180
176
  pilots: "/admin/pilots",
@@ -184,13 +180,15 @@ var DEFAULT_STANDARD_PAGE_ROUTES = {
184
180
  platformEmail: "/admin/platform-email",
185
181
  platformEmailHistory: "/admin/platform-email-history"
186
182
  };
183
+ function isSupportedStandardPageKey(key) {
184
+ return Object.hasOwn(DEFAULT_STANDARD_PAGE_ROUTES, key);
185
+ }
187
186
  var DEFAULT_ICONS = {
188
187
  dashboard: "dashboard",
189
188
  tenants: "business",
190
189
  subscriptions: "card_membership",
191
190
  promoCodes: "local_activity",
192
191
  plans: "workspace_premium",
193
- planVersions: "history_edu",
194
192
  audit: "history",
195
193
  users: "people",
196
194
  pilots: "flight_takeoff",
@@ -205,7 +203,6 @@ var PAGE_SECTIONS = {
205
203
  discovery: "catalog",
206
204
  bundles: "catalog",
207
205
  plans: "catalog",
208
- planVersions: "catalog",
209
206
  marketingCatalog: "catalog",
210
207
  promoCodes: "catalog",
211
208
  tenants: "customers",
@@ -233,6 +230,7 @@ function buildRoutes(manifest, options = {}) {
233
230
  const overrideIcons = { ...DEFAULT_ICONS, ...options.standardPageIcons };
234
231
  const overrideNavSection = { ...defaultNavSections, ...options.standardPageNavSection };
235
232
  for (const key of Object.keys(standard)) {
233
+ if (!isSupportedStandardPageKey(key)) continue;
236
234
  const def = standard[key];
237
235
  if (!def?.enabled) continue;
238
236
  const cap = def.requiredCapability ?? null;
@@ -473,220 +471,74 @@ var BatchColumnFetcher = class {
473
471
  }
474
472
  };
475
473
 
476
- // src/client/plan-versions-catalog.ts
477
- var dec = (s) => Number(s);
478
- function extractQuotas(p) {
479
- if (p.quotas && Object.keys(p.quotas).length > 0) {
480
- return { ...p.quotas };
481
- }
482
- const out = {};
483
- if (typeof p.maxUsers === "number") out.users = p.maxUsers;
484
- if (typeof p.maxVehicles === "number") out.vehicles = p.maxVehicles;
485
- if (typeof p.maxStorageGb === "number") out.storageGb = p.maxStorageGb;
486
- return out;
487
- }
488
- var sortByPublishedDesc = (rows) => [...rows].sort((a, b) => {
489
- const at = a.publishedAt ? Date.parse(a.publishedAt) : Number.POSITIVE_INFINITY;
490
- const bt = b.publishedAt ? Date.parse(b.publishedAt) : Number.POSITIVE_INFINITY;
491
- if (at !== bt) return bt - at;
492
- return b.version - a.version;
493
- });
494
- function findLiveAt(rows, asOfMs) {
495
- const candidates = rows.filter((r) => {
496
- if (r.publishedAt === null) return false;
497
- if (Date.parse(r.publishedAt) > asOfMs) return false;
498
- if (r.supersededAt !== null && Date.parse(r.supersededAt) <= asOfMs) return false;
499
- return true;
500
- });
501
- if (candidates.length === 0) return null;
502
- return [...candidates].sort((a, b) => b.version - a.version)[0] ?? null;
503
- }
504
- function findCurrentLive(rows) {
505
- return rows.find((r) => r.publishedAt !== null && r.supersededAt === null) ?? null;
506
- }
507
- function findDraft(rows) {
508
- return rows.find((r) => r.publishedAt === null) ?? null;
509
- }
510
- function groupBy(rows, keyOf) {
511
- const out = /* @__PURE__ */ new Map();
512
- for (const r of rows) {
513
- const k = keyOf(r);
514
- const list = out.get(k) ?? [];
515
- list.push(r);
516
- out.set(k, list);
517
- }
518
- return out;
519
- }
520
- function resolvePlan(source, liveBase) {
521
- const quotas = extractQuotas(source);
522
- return {
523
- source,
524
- liveBase,
525
- isDraft: source.publishedAt === null,
526
- planId: source.planId,
527
- features: source.features,
528
- quotas,
529
- monthlyNet: dec(source.monthlyNet),
530
- yearlyNet: dec(source.yearlyNet),
531
- marketed: source.marketed,
532
- version: source.version,
533
- maxUsers: quotas.users,
534
- maxVehicles: quotas.vehicles,
535
- maxStorageGb: quotas.storageGb
474
+ // src/client/admin-resource-client.ts
475
+ function createAdminResourceClient(options) {
476
+ const base = options.adminBase ?? "/api/v1/admin";
477
+ const tenantsEndpoint = `${base}/tenants`;
478
+ const getJson2 = async (url) => {
479
+ const response = await options.http(url, { method: "GET" });
480
+ assertSuccess(response.status, "GET", url);
481
+ return await response.json();
536
482
  };
537
- }
538
- function draftsTitle(draftCount, msg) {
539
- if (draftCount === 0) return msg.draftsTitleEmpty;
540
- const template = draftCount === 1 ? msg.draftsTitleOne : msg.draftsTitleMany;
541
- return formatMessage(template, { count: draftCount });
542
- }
543
- function dateLabel(iso, locale) {
544
- return new Date(iso).toLocaleDateString(SA_INTL_LOCALES[locale], {
545
- day: "2-digit",
546
- month: "short",
547
- year: "numeric"
548
- });
549
- }
550
- function buildDraftsSnapshot(data, sortPlansFn, locale) {
551
- const msg = planVersionsMessages[locale].catalog;
552
- const planByKey = groupBy(data.planVersions, (r) => r.planId);
553
- const plans = [];
554
- for (const [, rows] of planByKey) {
555
- const draft = findDraft(rows);
556
- const live = findCurrentLive(rows);
557
- if (draft) plans.push(resolvePlan(draft, live));
558
- else if (live) plans.push(resolvePlan(live, null));
559
- }
560
- const draftCount = plans.filter((p) => p.isDraft).length;
561
- return {
562
- id: "drafts",
563
- kind: "drafts",
564
- status: "DRAFT",
565
- label: msg.draftsLabel,
566
- title: draftsTitle(draftCount, msg),
567
- description: draftCount === 0 ? msg.draftsDescriptionEmpty : msg.draftsDescription,
568
- asOf: null,
569
- createdAt: null,
570
- publishedAt: null,
571
- authorEmail: null,
572
- plans: sortPlansFn(plans),
573
- draftCount,
574
- regressionCount: 0
483
+ const sendJson = async (method, url, body) => {
484
+ const response = await options.http(url, {
485
+ method,
486
+ headers: { "content-type": "application/json" },
487
+ body: body === void 0 ? void 0 : JSON.stringify(body)
488
+ });
489
+ assertSuccess(response.status, method, url);
490
+ return await response.json();
575
491
  };
576
- }
577
- function buildActiveSnapshot(data, sortPlansFn, locale) {
578
- const msg = planVersionsMessages[locale].catalog;
579
- const planByKey = groupBy(data.planVersions, (r) => r.planId);
580
- const plans = [];
581
- for (const [, rows] of planByKey) {
582
- const live = findCurrentLive(rows);
583
- if (live) plans.push(resolvePlan(live, null));
584
- }
585
- if (plans.length === 0) return null;
586
- const publishedDates = plans.map((p) => p.source.publishedAt).filter((t) => t !== null).sort();
587
- const latestPublished = publishedDates[publishedDates.length - 1];
588
492
  return {
589
- id: "active",
590
- kind: "active",
591
- status: "ACTIVE",
592
- label: msg.activeLabel,
593
- title: msg.activeTitle,
594
- description: msg.activeDescription,
595
- asOf: latestPublished ?? null,
596
- createdAt: null,
597
- publishedAt: latestPublished ?? null,
598
- authorEmail: null,
599
- plans: sortPlansFn(plans),
600
- draftCount: 0,
601
- regressionCount: 0
493
+ tenantsEndpoint,
494
+ loadTenantDetail: (slug) => getJson2(`${tenantsEndpoint}/${encodeURIComponent(slug)}`),
495
+ loadUsers: (filter) => getJson2(
496
+ `${base}/users${queryString({ q: filter.q, tenant: filter.tenant })}`
497
+ ),
498
+ loadAudit: (filter) => getJson2(
499
+ `${base}/audit${queryString({
500
+ actor: filter.actor,
501
+ action: filter.action,
502
+ entity: filter.entity,
503
+ since: filter.since,
504
+ limit: filter.limit
505
+ })}`
506
+ ),
507
+ loadSubscriptions: () => getJson2(`${base}/subscriptions`),
508
+ loadPromos: (filter) => getJson2(
509
+ `${base}/promo-codes${queryString({
510
+ search: filter.search,
511
+ status: filter.status
512
+ })}`
513
+ ),
514
+ createPromo: async (payload) => {
515
+ await sendJson("POST", `${base}/promo-codes`, payload);
516
+ },
517
+ updatePromo: async (id, payload) => {
518
+ await sendJson("PATCH", `${base}/promo-codes/${encodeURIComponent(id)}`, payload);
519
+ },
520
+ deletePromo: async (id) => {
521
+ await sendJson("DELETE", `${base}/promo-codes/${encodeURIComponent(id)}`);
522
+ },
523
+ suspendTenant: (slug, reason) => sendJson("POST", `${tenantsEndpoint}/${encodeURIComponent(slug)}/suspend`, {
524
+ reason
525
+ }),
526
+ reactivateTenant: (slug) => sendJson("POST", `${tenantsEndpoint}/${encodeURIComponent(slug)}/reactivate`)
602
527
  };
603
528
  }
604
- function buildHistoricalSnapshots(data, sortPlansFn, locale) {
605
- const msg = planVersionsMessages[locale].catalog;
606
- const allPublishedAt = /* @__PURE__ */ new Set();
607
- for (const r of data.planVersions) if (r.publishedAt) allPublishedAt.add(r.publishedAt);
608
- if (allPublishedAt.size === 0) return [];
609
- const planByKey = groupBy(data.planVersions, (r) => r.planId);
610
- const liveTimestamps = /* @__PURE__ */ new Set();
611
- for (const rows of planByKey.values()) {
612
- const live = findCurrentLive(rows);
613
- if (live?.publishedAt) liveTimestamps.add(live.publishedAt);
614
- }
615
- const liveSorted = [...liveTimestamps].sort();
616
- const latestLive = liveSorted[liveSorted.length - 1];
617
- const sortedDesc = [...allPublishedAt].sort((a, b) => Date.parse(b) - Date.parse(a));
618
- const out = [];
619
- for (const ts of sortedDesc) {
620
- if (latestLive && Date.parse(ts) >= Date.parse(latestLive)) continue;
621
- const tMs = Date.parse(ts) + 1;
622
- const plans = [];
623
- for (const [, rows] of planByKey) {
624
- const live = findLiveAt(rows, tMs);
625
- if (live) plans.push(resolvePlan(live, null));
626
- }
627
- if (plans.length === 0) continue;
628
- const publishedAtThisEvent = data.planVersions.filter((r) => r.publishedAt === ts);
629
- const regressionCount = publishedAtThisEvent.filter((r) => !r.nonRegressive).length;
630
- const author = publishedAtThisEvent[0]?.publishedByUserId ?? null;
631
- out.push({
632
- id: `hist-${ts}`,
633
- kind: "historical",
634
- status: "ARCHIVED",
635
- label: dateLabel(ts, locale),
636
- title: summarizeEvent(publishedAtThisEvent, msg),
637
- description: detailEvent(publishedAtThisEvent, msg),
638
- asOf: ts,
639
- createdAt: ts,
640
- publishedAt: ts,
641
- authorEmail: author,
642
- plans: sortPlansFn(plans),
643
- draftCount: 0,
644
- regressionCount
645
- });
646
- }
647
- return out;
648
- }
649
- function summarizeEvent(rows, msg) {
650
- if (rows.length === 0) return msg.publishEvent;
651
- if (rows.length === 1) {
652
- const r = rows[0];
653
- return formatMessage(msg.publishEventSingle, { planId: r.planId, version: r.version });
529
+ function assertSuccess(status, method, url) {
530
+ if (status < 200 || status >= 300) {
531
+ throw new Error(`${method} ${url} \u2192 HTTP ${status}`);
654
532
  }
655
- return formatMessage(msg.publishEventMultiple, { count: rows.length });
656
533
  }
657
- function detailEvent(rows, msg) {
658
- if (rows.length === 0) return "";
659
- const note = rows[0]?.changeNote ?? "";
660
- return note.length > 0 ? note : msg.reconstructedSnapshot;
661
- }
662
- function sortPlansBy(order) {
663
- if (!order || order.length === 0) {
664
- return (rows) => [...rows].sort((a, b) => a.planId.localeCompare(b.planId));
665
- }
666
- const idx = {};
667
- for (let i = 0; i < order.length; i++) idx[order[i]] = i;
668
- return (rows) => [...rows].sort((a, b) => {
669
- const ai = idx[a.planId] ?? Number.POSITIVE_INFINITY;
670
- const bi = idx[b.planId] ?? Number.POSITIVE_INFINITY;
671
- if (ai !== bi) return ai - bi;
672
- return a.planId.localeCompare(b.planId);
673
- });
674
- }
675
- function buildSnapshots(data, options = {}) {
676
- const locale = options.locale ?? DEFAULT_SA_LOCALE;
677
- const sortPlansFn = sortPlansBy(options.planSortOrder);
678
- const drafts = buildDraftsSnapshot(data, sortPlansFn, locale);
679
- const active = buildActiveSnapshot(data, sortPlansFn, locale);
680
- const historical = buildHistoricalSnapshots(data, sortPlansFn, locale);
681
- const out = [drafts];
682
- if (active) out.push(active);
683
- out.push(...historical);
684
- return out;
685
- }
686
- function listOpenDrafts(data) {
687
- return {
688
- plans: sortByPublishedDesc(data.planVersions).filter((r) => r.publishedAt === null)
689
- };
534
+ function queryString(params) {
535
+ const search = new URLSearchParams();
536
+ for (const [key, value2] of Object.entries(params)) {
537
+ if (value2 === void 0 || value2 === null || value2 === "") continue;
538
+ search.set(key, String(value2));
539
+ }
540
+ const value = search.toString();
541
+ return value ? `?${value}` : "";
690
542
  }
691
543
 
692
544
  export {
@@ -709,6 +561,5 @@ export {
709
561
  ActionRegistry,
710
562
  BatchColumnDriftError,
711
563
  BatchColumnFetcher,
712
- buildSnapshots,
713
- listOpenDrafts
564
+ createAdminResourceClient
714
565
  };
@@ -1312,7 +1312,6 @@ var navMessages = defineMessages(
1312
1312
  subscriptions: "Abonnements",
1313
1313
  promoCodes: "Promo-Codes",
1314
1314
  plans: "Pl\xE4ne & Versionen",
1315
- planVersions: "Plan-Versionen",
1316
1315
  audit: "Audit-Log",
1317
1316
  users: "Benutzer",
1318
1317
  pilots: "Piloten",
@@ -1336,7 +1335,6 @@ var navMessages = defineMessages(
1336
1335
  subscriptions: "Subscriptions",
1337
1336
  promoCodes: "Promo codes",
1338
1337
  plans: "Plans & versions",
1339
- planVersions: "Plan versions",
1340
1338
  audit: "Audit log",
1341
1339
  users: "Users",
1342
1340
  pilots: "Pilots",
@@ -1979,21 +1977,6 @@ var planEditorMessages = defineMessages(
1979
1977
  var planVersionsMessages = defineMessages(
1980
1978
  {
1981
1979
  compareEnd: "Vergleich beenden",
1982
- page: {
1983
- loadingCatalog: "Catalog wird geladen\u2026",
1984
- noAuditLoader: "Kein Audit-Loader konfiguriert."
1985
- },
1986
- header: {
1987
- modeList: "Plan-Liste",
1988
- modeMatrix: "Feature-Matrix",
1989
- modeAudit: "Aktivit\xE4t",
1990
- publishedOn: "Publiziert {date}",
1991
- openDrafts: "offene Drafts",
1992
- regressionOne: "Regression",
1993
- regressionMany: "Regressionen",
1994
- startPublishFlow: "Publish-Flow starten",
1995
- compareModeHint: "Vergleichsmodus aktiv \u2014 andere Ansichten deaktiviert"
1996
- },
1997
1980
  status: {
1998
1981
  draft: "DRAFT",
1999
1982
  active: "AKTIV",
@@ -2007,29 +1990,6 @@ var planVersionsMessages = defineMessages(
2007
1990
  unknown: "unbekannt",
2008
1991
  compareHint: "Rechtsklick auf Snapshot \u2192 vergleichen"
2009
1992
  },
2010
- list: {
2011
- kpiPlans: "Pakete",
2012
- kpiSelfService: "Self-Service",
2013
- kpiOfTotal: "von {count}",
2014
- kpiFeaturesTotal: "Features gesamt",
2015
- missingPlansLabel: "Fehlende Pakete:",
2016
- missingPlansHint: "\u2014 keine Live-Version in diesem Snapshot.",
2017
- createDraftFor: "Draft f\xFCr {planId}",
2018
- colPlan: "Paket",
2019
- colPriceNet: "Preis (netto)",
2020
- colFeatures: "Features",
2021
- draftHintLabel: "Arbeitsstand:",
2022
- draftHintBefore: "Drafts oben in der Liste. Limits, Preise und Features per Klick auf",
2023
- draftHintEditButton: '\u201EBearbeiten"',
2024
- draftHintMiddle: "\xE4ndern (ohne MFA). Erst",
2025
- draftHintPublishFlow: "Publish-Flow",
2026
- draftHintAfter: "(Validate \u2192 Diff-Review \u2192 MFA \u2192 Apply) macht sie f\xFCr k\xFCnftige Renewals wirksam."
2027
- },
2028
- matrix: {
2029
- colFeature: "Feature",
2030
- perMonthShort: "/Mo",
2031
- fallbackGroup: "Sonstige"
2032
- },
2033
1993
  diff: {
2034
1994
  legend: "Vergleich",
2035
1995
  plansChanged: "Pakete ge\xE4ndert",
@@ -2053,24 +2013,10 @@ var planVersionsMessages = defineMessages(
2053
2013
  yearlyNet: "Preis j\xE4hrlich (netto)",
2054
2014
  unitSize: "Einheitsgr\xF6\xDFe"
2055
2015
  },
2056
- audit: {
2057
- title: "Aktivit\xE4t",
2058
- eventCount: "{count} Events",
2059
- loading: "Audit-Trail wird geladen\u2026",
2060
- empty: "Keine Plan-/Add-on-Events im Audit-Log gefunden.",
2061
- actionPlanPublished: "Plan publiziert",
2062
- actionPlanDraftCreated: "Plan-Draft angelegt",
2063
- actionPlanDraftUpdated: "Plan-Draft ge\xE4ndert",
2064
- actionPlanDraftDeleted: "Plan-Draft gel\xF6scht",
2065
- actionCatalogPublished: "Catalog publiziert",
2066
- detailRegression: "Mit mindestens einer Verschlechterung publiziert.",
2067
- detailFieldsChanged: "{count} Felder ge\xE4ndert."
2068
- },
2069
2016
  bulkPublish: {
2070
2017
  changeNoteRequired: "changeNote ist Pflicht beim Publish."
2071
2018
  },
2072
2019
  format: {
2073
- priceIndividual: "individuell",
2074
2020
  today: "heute",
2075
2021
  yesterday: "gestern",
2076
2022
  daysAgo: "vor {count} Tagen",
@@ -2079,40 +2025,10 @@ var planVersionsMessages = defineMessages(
2079
2025
  monthsAgo: "vor {count} Monaten",
2080
2026
  yearsAgoOne: "vor {count} Jahr",
2081
2027
  yearsAgoMany: "vor {count} Jahren"
2082
- },
2083
- catalog: {
2084
- draftsLabel: "Arbeitsstand",
2085
- draftsTitleEmpty: "Keine offenen Drafts",
2086
- draftsTitleOne: "{count} offener Draft bereit f\xFCr Publish",
2087
- draftsTitleMany: "{count} offene Drafts bereit f\xFCr Publish",
2088
- draftsDescriptionEmpty: "Lege einen Draft an, um Limits, Preise oder Features zu \xE4ndern. Drafts sind ohne MFA editierbar und werden erst beim Publish wirksam.",
2089
- draftsDescription: "Diese Tabelle zeigt, wie der Catalog nach Publish aller Drafts aussehen w\xFCrde. Bestehende Mandanten bleiben auf der vorherigen Version, bis sie aktiv migriert werden.",
2090
- activeLabel: "Aktuell",
2091
- activeTitle: "Live-Catalog",
2092
- activeDescription: "Diese Plan-Versionen sind aktuell f\xFCr neue Onboardings und f\xFCr Renewals nach Stichtag aktiv.",
2093
- publishEvent: "Publish-Event",
2094
- publishEventSingle: "{planId} v{version} publiziert",
2095
- publishEventMultiple: "{count} Versionen publiziert",
2096
- reconstructedSnapshot: "Snapshot rekonstruiert aus per-Entity-Versionen."
2097
2028
  }
2098
2029
  },
2099
2030
  {
2100
2031
  compareEnd: "End comparison",
2101
- page: {
2102
- loadingCatalog: "Loading catalog\u2026",
2103
- noAuditLoader: "No audit loader configured."
2104
- },
2105
- header: {
2106
- modeList: "Plan list",
2107
- modeMatrix: "Feature matrix",
2108
- modeAudit: "Activity",
2109
- publishedOn: "Published {date}",
2110
- openDrafts: "open drafts",
2111
- regressionOne: "regression",
2112
- regressionMany: "regressions",
2113
- startPublishFlow: "Start publish flow",
2114
- compareModeHint: "Comparison mode active \u2014 other views disabled"
2115
- },
2116
2032
  status: {
2117
2033
  draft: "DRAFT",
2118
2034
  active: "ACTIVE",
@@ -2126,29 +2042,6 @@ var planVersionsMessages = defineMessages(
2126
2042
  unknown: "unknown",
2127
2043
  compareHint: "Right-click a snapshot \u2192 compare"
2128
2044
  },
2129
- list: {
2130
- kpiPlans: "Plans",
2131
- kpiSelfService: "Self-service",
2132
- kpiOfTotal: "of {count}",
2133
- kpiFeaturesTotal: "Features total",
2134
- missingPlansLabel: "Missing plans:",
2135
- missingPlansHint: "\u2014 no live version in this snapshot.",
2136
- createDraftFor: "Draft for {planId}",
2137
- colPlan: "Plan",
2138
- colPriceNet: "Price (net)",
2139
- colFeatures: "Features",
2140
- draftHintLabel: "Working state:",
2141
- draftHintBefore: "Drafts at the top of the list. Change limits, prices and features by clicking",
2142
- draftHintEditButton: '"Edit"',
2143
- draftHintMiddle: "(without MFA). Only the",
2144
- draftHintPublishFlow: "publish flow",
2145
- draftHintAfter: "(validate \u2192 diff review \u2192 MFA \u2192 apply) makes them effective for future renewals."
2146
- },
2147
- matrix: {
2148
- colFeature: "Feature",
2149
- perMonthShort: "/mo",
2150
- fallbackGroup: "Other"
2151
- },
2152
2045
  diff: {
2153
2046
  legend: "Comparison",
2154
2047
  plansChanged: "Plans changed",
@@ -2172,24 +2065,10 @@ var planVersionsMessages = defineMessages(
2172
2065
  yearlyNet: "Price yearly (net)",
2173
2066
  unitSize: "Unit size"
2174
2067
  },
2175
- audit: {
2176
- title: "Activity",
2177
- eventCount: "{count} events",
2178
- loading: "Loading audit trail\u2026",
2179
- empty: "No plan/add-on events found in the audit log.",
2180
- actionPlanPublished: "Plan published",
2181
- actionPlanDraftCreated: "Plan draft created",
2182
- actionPlanDraftUpdated: "Plan draft changed",
2183
- actionPlanDraftDeleted: "Plan draft deleted",
2184
- actionCatalogPublished: "Catalog published",
2185
- detailRegression: "Published with at least one regression.",
2186
- detailFieldsChanged: "{count} fields changed."
2187
- },
2188
2068
  bulkPublish: {
2189
2069
  changeNoteRequired: "changeNote is required when publishing."
2190
2070
  },
2191
2071
  format: {
2192
- priceIndividual: "custom",
2193
2072
  today: "today",
2194
2073
  yesterday: "yesterday",
2195
2074
  daysAgo: "{count} days ago",
@@ -2198,21 +2077,6 @@ var planVersionsMessages = defineMessages(
2198
2077
  monthsAgo: "{count} months ago",
2199
2078
  yearsAgoOne: "{count} year ago",
2200
2079
  yearsAgoMany: "{count} years ago"
2201
- },
2202
- catalog: {
2203
- draftsLabel: "Working state",
2204
- draftsTitleEmpty: "No open drafts",
2205
- draftsTitleOne: "{count} open draft ready to publish",
2206
- draftsTitleMany: "{count} open drafts ready to publish",
2207
- draftsDescriptionEmpty: "Create a draft to change limits, prices or features. Drafts are editable without MFA and only take effect when published.",
2208
- draftsDescription: "This table shows what the catalog would look like after publishing all drafts. Existing tenants stay on the previous version until they are actively migrated.",
2209
- activeLabel: "Current",
2210
- activeTitle: "Live catalog",
2211
- activeDescription: "These plan versions are currently active for new onboardings and for renewals after the effective date.",
2212
- publishEvent: "Publish event",
2213
- publishEventSingle: "{planId} v{version} published",
2214
- publishEventMultiple: "{count} versions published",
2215
- reconstructedSnapshot: "Snapshot reconstructed from per-entity versions."
2216
2080
  }
2217
2081
  }
2218
2082
  );
@@ -3224,7 +3088,6 @@ export {
3224
3088
  mergeMessages,
3225
3089
  navMessages,
3226
3090
  formatMessage,
3227
- planVersionsMessages,
3228
3091
  formatCurrency,
3229
3092
  SA_MESSAGES,
3230
3093
  resolveMessages
@@ -2,7 +2,7 @@ import {
2
2
  DEFAULT_SA_LOCALE,
3
3
  SA_INTL_LOCALES,
4
4
  resolveMessages
5
- } from "./chunk-X5SQ5HMB.js";
5
+ } from "./chunk-TBLXKSTR.js";
6
6
 
7
7
  // src/vue/super-admin-context.ts
8
8
  var SUPER_ADMIN_BRAND_KEY = /* @__PURE__ */ Symbol.for(