@saasicat/ui-vue 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +64 -4
  2. package/dist/chunk-A3W2N26K.js +714 -0
  3. package/dist/chunk-QZOSDCNP.js +98 -0
  4. package/dist/chunk-X5SQ5HMB.js +3231 -0
  5. package/dist/client/index.cjs +3988 -0
  6. package/dist/client/index.d.cts +321 -0
  7. package/dist/client/index.d.ts +321 -0
  8. package/dist/client/index.js +70 -0
  9. package/dist/index.cjs +4446 -1249
  10. package/dist/index.d.cts +297 -888
  11. package/dist/index.d.ts +297 -888
  12. package/dist/index.js +609 -1348
  13. package/dist/messages-7b0P8W75.d.cts +1652 -0
  14. package/dist/messages-7b0P8W75.d.ts +1652 -0
  15. package/dist/quasar/index.cjs +3340 -0
  16. package/dist/quasar/index.d.cts +95 -0
  17. package/dist/quasar/index.d.ts +95 -0
  18. package/dist/quasar/index.js +96 -0
  19. package/dist/testing-e2e/admin-pages-suite.cjs +14 -11
  20. package/dist/testing-e2e/admin-pages-suite.js +14 -11
  21. package/dist/use-super-admin-i18n-B3v3-SWZ.d.ts +210 -0
  22. package/dist/use-super-admin-i18n-DMktRVEt.d.cts +210 -0
  23. package/package.json +23 -3
  24. package/src/{action-registry.ts → client/action-registry.ts} +4 -4
  25. package/src/{batch-column-fetcher.ts → client/batch-column-fetcher.ts} +4 -4
  26. package/src/{boot-loader.ts → client/boot-loader.ts} +3 -3
  27. package/src/client/i18n/currency.ts +42 -0
  28. package/src/client/i18n/define.ts +59 -0
  29. package/src/client/i18n/format.ts +12 -0
  30. package/src/client/i18n/index.ts +14 -0
  31. package/src/client/i18n/locale.ts +15 -0
  32. package/src/client/i18n/messages/audit.ts +42 -0
  33. package/src/client/i18n/messages/bundles.ts +459 -0
  34. package/src/client/i18n/messages/common.ts +147 -0
  35. package/src/client/i18n/messages/dashboard.ts +16 -0
  36. package/src/client/i18n/messages/discovery.ts +229 -0
  37. package/src/client/i18n/messages/email.ts +125 -0
  38. package/src/client/i18n/messages/marketing.ts +270 -0
  39. package/src/client/i18n/messages/nav.ts +72 -0
  40. package/src/client/i18n/messages/pilots.ts +192 -0
  41. package/src/client/i18n/messages/plan-detail.ts +266 -0
  42. package/src/client/i18n/messages/plan-editor.ts +177 -0
  43. package/src/client/i18n/messages/plan-versions.ts +251 -0
  44. package/src/client/i18n/messages/plans.ts +503 -0
  45. package/src/client/i18n/messages/promos.ts +202 -0
  46. package/src/client/i18n/messages/shell.ts +145 -0
  47. package/src/client/i18n/messages/tenants.ts +104 -0
  48. package/src/client/i18n/messages/users.ts +78 -0
  49. package/src/client/i18n/messages.ts +84 -0
  50. package/src/client/index.ts +27 -0
  51. package/src/{manifest-loader.ts → client/manifest-loader.ts} +4 -4
  52. package/src/{nav-builder.ts → client/nav-builder.ts} +44 -51
  53. package/src/{plan-versions-catalog.ts → client/plan-versions-catalog.ts} +42 -30
  54. package/src/components/BundleVersionPublishDialog.vue +35 -24
  55. package/src/components/FeatureGate.vue +1 -1
  56. package/src/components/MarketingPromotionsTab.vue +112 -59
  57. package/src/components/MfaPromptDialog.vue +11 -11
  58. package/src/components/TenantActionConfirmDialog.vue +19 -17
  59. package/src/components/VersionDiffPreview.vue +72 -43
  60. package/src/components/bundle-editor/BundleCreatePanel.vue +76 -63
  61. package/src/components/bundle-editor/BundleFeaturesEditor.vue +13 -6
  62. package/src/components/bundle-editor/BundlePlanCompatPicker.vue +19 -14
  63. package/src/components/bundle-editor/BundleQuotasEditor.vue +7 -4
  64. package/src/components/bundle-editor/BundleStatusBanner.vue +36 -19
  65. package/src/components/bundle-editor/BundleVersionInlineEditor.vue +51 -35
  66. package/src/components/bundle-editor/BundleVersionStrip.vue +24 -12
  67. package/src/components/bundle-editor/bundle-version-status.ts +29 -29
  68. package/src/components/dialogs/PilotCreateDialog.vue +58 -63
  69. package/src/components/dialogs/PilotEditDialog.vue +40 -34
  70. package/src/components/dialogs/PromoCodeCreateDialog.vue +89 -63
  71. package/src/components/dialogs/PromoCodeEditDialog.vue +98 -66
  72. package/src/components/dialogs/types.ts +3 -13
  73. package/src/components/plan/PlanCycleToggle.vue +21 -10
  74. package/src/components/plan/PlanGrid.vue +2 -2
  75. package/src/components/plan/PriceSummary.vue +1 -1
  76. package/src/components/plan/PromoCodeInput.vue +1 -1
  77. package/src/components/plan/PublicBundleGrid.vue +1 -1
  78. package/src/components/plan-cockpit/PlanCockpit.vue +34 -15
  79. package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +13 -6
  80. package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +18 -9
  81. package/src/components/plan-cockpit/PlanCockpitHeader.vue +9 -6
  82. package/src/components/plan-cockpit/PlanCockpitImpactPanel.vue +24 -11
  83. package/src/components/plan-cockpit/PlanCockpitKpis.vue +28 -17
  84. package/src/components/plan-cockpit/PlanCockpitVersions.vue +50 -25
  85. package/src/components/plan-create-dialog/PlanCreateDialog.vue +45 -35
  86. package/src/components/plan-detail/PlanAuditLog.vue +11 -6
  87. package/src/components/plan-detail/PlanDetail.vue +21 -23
  88. package/src/components/plan-detail/PlanDetailHeader.vue +20 -11
  89. package/src/components/plan-detail/PlanDetailKpis.vue +30 -17
  90. package/src/components/plan-detail/PlanTerminateDialog.vue +22 -9
  91. package/src/components/plan-detail/PlanVersionDiffPanel.vue +61 -27
  92. package/src/components/plan-detail/PlanVersionsPanel.vue +71 -36
  93. package/src/components/plan-list/PlanList.vue +99 -57
  94. package/src/components/plan-matrix/PlanMatrix.vue +85 -38
  95. package/src/components/plan-review/PlanReview.vue +105 -80
  96. package/src/components/plan-version-editor/PlanCatalogPreview.vue +43 -20
  97. package/src/components/plan-version-editor/PlanComponentPool.vue +15 -7
  98. package/src/components/plan-version-editor/PlanVersionBasket.vue +45 -24
  99. package/src/components/plan-version-editor/PlanVersionDiffDialog.vue +8 -7
  100. package/src/components/plan-version-editor/PlanVersionEditor.vue +74 -40
  101. package/src/components/plan-version-editor/PlanVersionEditorHeader.vue +24 -12
  102. package/src/index.ts +82 -79
  103. package/src/pages-standard/AdminLayout.vue +43 -18
  104. package/src/pages-standard/AdminManifestErrorPage.vue +10 -10
  105. package/src/pages-standard/AuditPage.vue +58 -19
  106. package/src/pages-standard/BundlesPage.vue +29 -18
  107. package/src/pages-standard/DashboardPage.vue +31 -17
  108. package/src/pages-standard/DiscoveryPage.vue +40 -28
  109. package/src/pages-standard/EmailHistoryPage.vue +98 -69
  110. package/src/pages-standard/MarketingCatalogPage.vue +40 -21
  111. package/src/pages-standard/PilotsPage.vue +64 -52
  112. package/src/pages-standard/PlanVersionsPage.vue +9 -5
  113. package/src/pages-standard/PlansPage.vue +91 -59
  114. package/src/pages-standard/PlatformEmailPage.vue +120 -53
  115. package/src/pages-standard/PromoCodeDetailPage.vue +66 -63
  116. package/src/pages-standard/PromoCodesPage.vue +51 -54
  117. package/src/pages-standard/SubscriptionsPage.vue +14 -9
  118. package/src/pages-standard/SuperAdminLoginPage.vue +19 -16
  119. package/src/pages-standard/SuperAdminSetupWizard.vue +53 -49
  120. package/src/pages-standard/TenantDetailPage.vue +54 -40
  121. package/src/pages-standard/TenantsPage.vue +57 -44
  122. package/src/pages-standard/UsersPage.vue +70 -52
  123. package/src/pages-standard/bundles-page/BundleAccordionList.vue +20 -8
  124. package/src/pages-standard/bundles-page/BundleDetailPanel.vue +28 -18
  125. package/src/pages-standard/bundles-page/BundlesFilterBar.vue +4 -1
  126. package/src/pages-standard/bundles-page/BundlesHeader.vue +9 -8
  127. package/src/pages-standard/bundles-page/BundlesKpis.vue +29 -11
  128. package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +20 -8
  129. package/src/pages-standard/discovery-page/DiscoveryCapList.vue +5 -3
  130. package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +43 -24
  131. package/src/pages-standard/discovery-page/DiscoveryHeader.vue +7 -4
  132. package/src/pages-standard/discovery-page/DiscoveryKpis.vue +28 -15
  133. package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +20 -10
  134. package/src/pages-standard/discovery-page/DiscoveryStatusControl.vue +9 -6
  135. package/src/pages-standard/discovery-page/discovery-ui.ts +40 -52
  136. package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +81 -49
  137. package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +13 -10
  138. package/src/pages-standard/marketing-catalog/MarketingCatalogPreview.vue +24 -20
  139. package/src/pages-standard/marketing-catalog/MarketingCatalogToolbar.vue +6 -3
  140. package/src/pages-standard/plan-versions/PlanDiffCard.vue +16 -6
  141. package/src/pages-standard/plan-versions/PlanVersionHeader.vue +42 -26
  142. package/src/pages-standard/plan-versions/PlanVersionsAudit.vue +46 -27
  143. package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +8 -6
  144. package/src/pages-standard/plan-versions/PlanVersionsList.vue +40 -17
  145. package/src/pages-standard/plan-versions/PlanVersionsMatrix.vue +1 -1
  146. package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +25 -13
  147. package/src/pages-standard/plan-versions/format.ts +33 -17
  148. package/src/pages-standard/plans-page/PlanArchiveDialog.vue +12 -8
  149. package/src/pages-standard/plans-page/PlanBundleOverview.vue +15 -6
  150. package/src/pages-standard/plans-page/PlanDiscardDraftDialog.vue +18 -7
  151. package/src/pages-standard/plans-page/PlanPublishDialog.vue +23 -12
  152. package/src/pages-standard/tenants/format.ts +3 -2
  153. package/src/pages-tenant/MySubscriptionBundlesPage.vue +73 -38
  154. package/src/pages-tenant/OnboardingConfigurator.vue +3 -3
  155. package/src/pages-tenant/PackageSnapshotPanel.vue +1 -1
  156. package/src/pages-tenant/PlanChangeWizard.vue +10 -6
  157. package/src/pages-tenant/TenantPlanSection.vue +20 -16
  158. package/src/pages-tenant/default-i18n.ts +217 -1
  159. package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +9 -7
  160. package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +11 -12
  161. package/src/pages-tenant/tenant-plan-section/TenantFeatureMatrix.vue +4 -1
  162. package/src/pages-tenant/tenant-plan-section/TenantPlanCardHeader.vue +1 -1
  163. package/src/pages-tenant/tenant-plan-section/TenantUsageGrid.vue +1 -1
  164. package/src/quasar/create-super-admin-app.ts +192 -0
  165. package/src/quasar/index.ts +11 -0
  166. package/src/quasar/notify.ts +30 -0
  167. package/src/testing-e2e/admin-pages-suite.ts +14 -11
  168. package/src/{manifest-store-factory.ts → vue/manifest-store-factory.ts} +1 -1
  169. package/src/{platform-loaders.ts → vue/platform-loaders.ts} +4 -4
  170. package/src/{project-page-host.ts → vue/project-page-host.ts} +6 -4
  171. package/src/{create-super-admin-app.ts → vue/super-admin-context.ts} +20 -139
  172. package/src/vue/ui-notify.ts +30 -0
  173. package/src/{use-actions.ts → vue/use-actions.ts} +1 -1
  174. package/src/{use-api-list.ts → vue/use-api-list.ts} +1 -1
  175. package/src/{use-audit-entries.ts → vue/use-audit-entries.ts} +3 -3
  176. package/src/{use-batch-columns.ts → vue/use-batch-columns.ts} +1 -1
  177. package/src/{use-bulk-publish.ts → vue/use-bulk-publish.ts} +7 -5
  178. package/src/{use-bundle-versions-map.ts → vue/use-bundle-versions-map.ts} +7 -5
  179. package/src/{use-bundles.ts → vue/use-bundles.ts} +14 -14
  180. package/src/{use-catalog-entries.ts → vue/use-catalog-entries.ts} +14 -11
  181. package/src/{use-discovery.ts → vue/use-discovery.ts} +9 -6
  182. package/src/{use-entitlement.ts → vue/use-entitlement.ts} +4 -4
  183. package/src/{use-live-plan-versions.ts → vue/use-live-plan-versions.ts} +5 -5
  184. package/src/{use-manifest.ts → vue/use-manifest.ts} +1 -1
  185. package/src/{use-marketing-projections.ts → vue/use-marketing-projections.ts} +10 -7
  186. package/src/{use-nav.ts → vue/use-nav.ts} +9 -3
  187. package/src/{use-plan-editor.ts → vue/use-plan-editor.ts} +2 -2
  188. package/src/{use-plan-versions.ts → vue/use-plan-versions.ts} +3 -3
  189. package/src/{use-plans.ts → vue/use-plans.ts} +13 -13
  190. package/src/{use-platform-tenant-actions.ts → vue/use-platform-tenant-actions.ts} +9 -6
  191. package/src/{use-promotions.ts → vue/use-promotions.ts} +10 -11
  192. package/src/{use-public-boot.ts → vue/use-public-boot.ts} +1 -1
  193. package/src/{use-subscription-draft.ts → vue/use-subscription-draft.ts} +2 -3
  194. package/src/{use-super-admin-context.ts → vue/use-super-admin-context.ts} +5 -5
  195. package/src/vue/use-super-admin-i18n.ts +82 -0
  196. package/src/{use-tenant-action-flow.ts → vue/use-tenant-action-flow.ts} +12 -7
  197. package/src/{use-tenant-billing-catalog.ts → vue/use-tenant-billing-catalog.ts} +2 -2
  198. package/src/{use-tenant-billing.ts → vue/use-tenant-billing.ts} +2 -2
  199. package/src/{use-tenant-manifest.ts → vue/use-tenant-manifest.ts} +2 -4
  200. package/src/{use-tenant-subscription-bundles.ts → vue/use-tenant-subscription-bundles.ts} +5 -5
  201. package/src/{use-tenants.ts → vue/use-tenants.ts} +3 -3
  202. package/dist/testing-e2e/admin-pages-suite.d.cts +0 -37
  203. package/dist/testing-e2e/admin-pages-suite.d.ts +0 -37
  204. package/src/components/BusinessTypeVersionEditorDialog.vue +0 -417
  205. package/src/components/BusinessTypeVersionPublishDialog.vue +0 -258
  206. package/src/pages-standard/BusinessTypesPage.vue +0 -662
  207. package/src/pages-standard/plan-versions/VersionDiffPreview.vue +0 -167
  208. package/src/use-business-types.ts +0 -269
  209. /package/src/{http-json.ts → client/http-json.ts} +0 -0
  210. /package/src/{types.ts → client/types.ts} +0 -0
  211. /package/src/{version.ts → client/version.ts} +0 -0
  212. /package/src/{create-admin-routes.ts → vue/create-admin-routes.ts} +0 -0
  213. /package/src/{entitlement-provider.ts → vue/entitlement-provider.ts} +0 -0
  214. /package/src/{feature-router-guard.ts → vue/feature-router-guard.ts} +0 -0
@@ -2,22 +2,8 @@
2
2
  <section class="pd-panel">
3
3
  <div class="pd-panel-head">
4
4
  <div style="min-width: 0">
5
- <h3 class="pd-panel-title">
6
- <template v-if="predecessor">
7
- Diff v{{ predecessor.version }} → v{{ selectedVersion?.version }}
8
- </template>
9
- <template v-else>Komponenten · v{{ selectedVersion?.version }}</template>
10
- </h3>
11
- <div class="pd-panel-sub">
12
- <template v-if="predecessor && selectedVersion">
13
- {{
14
- statusOf(selectedVersion) === 'draft'
15
- ? 'Was sich beim Publish ändert'
16
- : `Änderungen v${predecessor.version} → v${selectedVersion.version}`
17
- }}
18
- </template>
19
- <template v-else>Initialversion · kein Vorgänger zum Vergleich</template>
20
- </div>
5
+ <h3 class="pd-panel-title">{{ panelTitle }}</h3>
6
+ <div class="pd-panel-sub">{{ panelSubtitle }}</div>
21
7
  </div>
22
8
  <div class="pd-panel-head-right pd-diff-chips">
23
9
  <template v-if="predecessor">
@@ -39,10 +25,10 @@
39
25
  <span class="pd-diff-kind">
40
26
  {{
41
27
  d.kind === 'add'
42
- ? 'Hinzugefügt'
28
+ ? msg.diff.kindAdded
43
29
  : d.kind === 'rm'
44
- ? 'Entfernt'
45
- : 'Geändert'
30
+ ? msg.diff.kindRemoved
31
+ : msg.diff.kindChanged
46
32
  }}
47
33
  </span>
48
34
  <span class="pd-diff-label">{{ d.label }}</span>
@@ -56,8 +42,8 @@
56
42
  </div>
57
43
  </div>
58
44
  <div v-if="diffRows.length === 0" class="pd-diff-empty">
59
- <b>Keine Änderungen</b>
60
- v{{ selectedVersion?.version }} ist identisch zu v{{ predecessor.version }}.
45
+ <b>{{ common.noChanges }}</b>
46
+ {{ emptyText }}
61
47
  </div>
62
48
  </div>
63
49
 
@@ -66,13 +52,17 @@
66
52
  v-if="selectedVersion.features.length === 0 && quotaCount(selectedVersion) === 0"
67
53
  class="pd-diff-empty"
68
54
  >
69
- <b>Keine Komponenten</b>
70
- Diese Version enthält weder Features noch Quotas.
55
+ <b>{{ msg.diff.noComponentsTitle }}</b>
56
+ {{ msg.diff.noComponentsText }}
71
57
  </div>
72
58
  <template v-if="selectedVersion.features.length > 0">
73
59
  <div class="pd-diff-section">
74
60
  <hr />
75
- <span>Features · {{ selectedVersion.features.length }}</span>
61
+ <span>{{
62
+ formatMessage(msg.diff.sectionFeatures, {
63
+ count: selectedVersion.features.length,
64
+ })
65
+ }}</span>
76
66
  <hr />
77
67
  </div>
78
68
  <div
@@ -90,7 +80,11 @@
90
80
  <template v-if="quotaCount(selectedVersion) > 0">
91
81
  <div class="pd-diff-section">
92
82
  <hr />
93
- <span>Quotas · {{ quotaCount(selectedVersion) }}</span>
83
+ <span>{{
84
+ formatMessage(msg.diff.sectionQuotas, {
85
+ count: quotaCount(selectedVersion),
86
+ })
87
+ }}</span>
94
88
  <hr />
95
89
  </div>
96
90
  <div
@@ -109,7 +103,11 @@
109
103
  <template v-if="(selectedVersion.bundles ?? []).length > 0">
110
104
  <div class="pd-diff-section">
111
105
  <hr />
112
- <span>Bundles · {{ (selectedVersion.bundles ?? []).length }}</span>
106
+ <span>{{
107
+ formatMessage(msg.diff.sectionBundles, {
108
+ count: (selectedVersion.bundles ?? []).length,
109
+ })
110
+ }}</span>
113
111
  <hr />
114
112
  </div>
115
113
  <div
@@ -129,10 +127,13 @@
129
127
  </template>
130
128
 
131
129
  <script setup lang="ts">
130
+ import { computed } from 'vue';
132
131
  import type { PlanVersionRow } from '@saasicat/types';
132
+ import { formatMessage } from '../../client/i18n/format.js';
133
+ import { useSaMessages } from '../../vue/use-super-admin-i18n.js';
133
134
  import type { DiffRow, PlanVersionDiff, StatusOf } from './types.js';
134
135
 
135
- defineProps<{
136
+ const props = defineProps<{
136
137
  selectedVersion: PlanVersionRow | null;
137
138
  predecessor: PlanVersionRow | null;
138
139
  diff: PlanVersionDiff;
@@ -146,4 +147,37 @@ defineProps<{
146
147
  quotaUnit: (key: string) => string;
147
148
  bundleLabel: (key: string) => string;
148
149
  }>();
150
+
151
+ const msg = useSaMessages('planDetail');
152
+ const common = useSaMessages('common');
153
+
154
+ const panelTitle = computed(() =>
155
+ props.predecessor
156
+ ? formatMessage(msg.value.diff.titleCompare, {
157
+ from: props.predecessor.version,
158
+ to: props.selectedVersion?.version ?? '',
159
+ })
160
+ : formatMessage(msg.value.diff.titleComponents, {
161
+ version: props.selectedVersion?.version ?? '',
162
+ }),
163
+ );
164
+
165
+ const panelSubtitle = computed(() => {
166
+ const predecessor = props.predecessor;
167
+ const selected = props.selectedVersion;
168
+ if (!predecessor || !selected) return msg.value.diff.subInitialVersion;
169
+ return props.statusOf(selected) === 'draft'
170
+ ? msg.value.diff.subOnPublish
171
+ : formatMessage(msg.value.diff.subChanges, {
172
+ from: predecessor.version,
173
+ to: selected.version,
174
+ });
175
+ });
176
+
177
+ const emptyText = computed(() =>
178
+ formatMessage(msg.value.diff.emptyText, {
179
+ selected: props.selectedVersion?.version ?? '',
180
+ predecessor: props.predecessor?.version ?? '',
181
+ }),
182
+ );
149
183
  </script>
@@ -2,9 +2,9 @@
2
2
  <section class="pd-panel">
3
3
  <div class="pd-panel-head">
4
4
  <div style="min-width: 0">
5
- <h3 class="pd-panel-title">Versionen</h3>
5
+ <h3 class="pd-panel-title">{{ msg.versions.title }}</h3>
6
6
  <div class="pd-panel-sub">
7
- Pro Plan max. 1 offene Draft-Version · Publish setzt Vorgänger auf
7
+ {{ msg.versions.subtitle }}
8
8
  <code class="pd-code">supersededAt</code>
9
9
  </div>
10
10
  </div>
@@ -25,7 +25,7 @@
25
25
  >
26
26
  <path d="M12 5v14M5 12h14" />
27
27
  </svg>
28
- <span>Draft v{{ nextDraftVersion }}</span>
28
+ <span>{{ newDraftButtonLabel }}</span>
29
29
  </button>
30
30
  </div>
31
31
  </div>
@@ -44,7 +44,7 @@
44
44
  <path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" />
45
45
  </svg>
46
46
  </span>
47
- Klicke eine Version, um sie zu wählen
47
+ {{ msg.versions.timelineHint }}
48
48
  </div>
49
49
  <div class="pd-timeline-bar">
50
50
  <div
@@ -56,10 +56,13 @@
56
56
  v.id === selectedId ? 'is-selected' : '',
57
57
  ]"
58
58
  :style="{ flex: statusOf(v) === 'draft' ? 1.4 : 1 }"
59
- :title="`v${v.version} wählen (${statusOf(v)})`"
59
+ :title="timelineSelectTitle(v)"
60
60
  @click="$emit('update:selectedId', v.id)"
61
61
  >
62
- v{{ v.version }}<template v-if="statusOf(v) === 'draft'"> · draft</template>
62
+ v{{ v.version
63
+ }}<template v-if="statusOf(v) === 'draft'">{{
64
+ msg.versions.timelineDraftSuffix
65
+ }}</template>
63
66
  </div>
64
67
  </div>
65
68
  <div class="pd-timeline-ticks">
@@ -69,11 +72,11 @@
69
72
 
70
73
  <div class="pd-versions-tbl">
71
74
  <div class="pd-versions-head">
72
- <div>Version</div>
73
- <div>Gültig</div>
74
- <div>Preis</div>
75
- <div>Auswirkung</div>
76
- <div>Änderungsnotiz</div>
75
+ <div>{{ msg.versions.colVersion }}</div>
76
+ <div>{{ msg.versions.colValidity }}</div>
77
+ <div>{{ msg.versions.colPrice }}</div>
78
+ <div>{{ msg.versions.colEffect }}</div>
79
+ <div>{{ msg.versions.colChangeNote }}</div>
77
80
  <div></div>
78
81
  </div>
79
82
 
@@ -107,27 +110,23 @@
107
110
  </span>
108
111
  <span v-else class="pd-arrow-inf" style="font-size: 14px">∞</span>
109
112
  </div>
110
- <span class="pd-validity-sub">
111
- {{
112
- statusOf(v) === 'draft'
113
- ? 'geplant'
114
- : statusOf(v) === 'live'
115
- ? 'aktiv'
116
- : 'historisch'
117
- }}
118
- </span>
113
+ <span class="pd-validity-sub">{{ validityLabel(v) }}</span>
119
114
  </div>
120
115
  </div>
121
116
  <div>
122
117
  <div>
123
- <div class="pd-pricing-m">{{ formatMoney(v.monthlyNet) }} / Mo</div>
124
- <div class="pd-pricing-y">{{ formatMoney(v.yearlyNet) }} / Jahr</div>
118
+ <div class="pd-pricing-m">
119
+ {{ formatMoney(v.monthlyNet) }} {{ msg.versions.perMonthUnit }}
120
+ </div>
121
+ <div class="pd-pricing-y">
122
+ {{ formatMoney(v.yearlyNet) }} {{ msg.versions.perYearUnit }}
123
+ </div>
125
124
  </div>
126
125
  </div>
127
126
  <div>
128
127
  <div>
129
128
  <div class="pd-impact-num">{{ impactByVersion[v.version] ?? 0 }}</div>
130
- <div class="pd-impact-sub">Mandanten</div>
129
+ <div class="pd-impact-sub">{{ msg.versions.tenants }}</div>
131
130
  </div>
132
131
  </div>
133
132
  <div>
@@ -139,18 +138,15 @@
139
138
  <span
140
139
  v-if="editabilityOf(v).reason === 'pre-active'"
141
140
  class="pd-pre-active-chip"
142
- :title="
143
- 'Published, aber noch nicht aktiv — Features, Quotas und ' +
144
- 'Preis können bis zum Aktivierungsdatum noch korrigiert werden'
145
- "
141
+ :title="msg.versions.preActiveTitle"
146
142
  >
147
- editierbar · noch nicht aktiv
143
+ {{ msg.versions.preActiveChip }}
148
144
  </span>
149
145
  <template v-if="statusOf(v) === 'draft'">
150
146
  <button
151
147
  class="btn btn--sm primary"
152
148
  type="button"
153
- title="Draft veröffentlichen"
149
+ :title="msg.versions.publishDraftTitle"
154
150
  @click="$emit('publish', v)"
155
151
  >
156
152
  <svg
@@ -171,8 +167,8 @@
171
167
  type="button"
172
168
  :title="
173
169
  editabilityOf(v).reason === 'pre-active'
174
- ? 'Future-Version bearbeiten'
175
- : 'Draft bearbeiten'
170
+ ? msg.versions.editFutureVersionTitle
171
+ : msg.versions.editDraftTitle
176
172
  "
177
173
  @click="$emit('editDraft', v)"
178
174
  >
@@ -194,14 +190,18 @@
194
190
  <span
195
191
  v-if="v.endsAt"
196
192
  class="pd-endsat-badge"
197
- :title="`Endet am ${formatDate(v.endsAt)}`"
193
+ :title="endsAtTitle(v.endsAt)"
198
194
  >
199
- Endet {{ formatDate(v.endsAt) }}
195
+ {{ endsAtBadge(v.endsAt) }}
200
196
  </span>
201
197
  <button
202
198
  class="btn btn--sm"
203
199
  type="button"
204
- :title="v.endsAt ? 'Enddatum ändern' : 'Version terminieren'"
200
+ :title="
201
+ v.endsAt
202
+ ? msg.terminateDialog.titleChangeEndDate
203
+ : msg.terminateDialog.titleTerminate
204
+ "
205
205
  @click="$emit('openTerminate', v)"
206
206
  >
207
207
  <svg
@@ -217,7 +217,11 @@
217
217
  <line x1="8" y1="2" x2="8" y2="6" />
218
218
  <line x1="3" y1="10" x2="21" y2="10" />
219
219
  </svg>
220
- <span>{{ v.endsAt ? 'Enddatum…' : 'Terminieren…' }}</span>
220
+ <span>{{
221
+ v.endsAt
222
+ ? msg.versions.changeEndDateAction
223
+ : msg.versions.terminateAction
224
+ }}</span>
221
225
  </button>
222
226
  </template>
223
227
  </div>
@@ -227,10 +231,13 @@
227
231
  </template>
228
232
 
229
233
  <script setup lang="ts">
234
+ import { computed } from 'vue';
230
235
  import type { PlanVersionRow } from '@saasicat/types';
236
+ import { formatMessage } from '../../client/i18n/format.js';
237
+ import { useSaMessages } from '../../vue/use-super-admin-i18n.js';
231
238
  import type { EditabilityOf, StatusChipOf, StatusOf } from './types.js';
232
239
 
233
- defineProps<{
240
+ const props = defineProps<{
234
241
  chronological: PlanVersionRow[];
235
242
  tableRows: PlanVersionRow[];
236
243
  selectedId: string | null;
@@ -252,4 +259,32 @@ defineEmits<{
252
259
  (e: 'editDraft', version: PlanVersionRow): void;
253
260
  (e: 'openTerminate', version: PlanVersionRow): void;
254
261
  }>();
262
+
263
+ const msg = useSaMessages('planDetail');
264
+
265
+ const newDraftButtonLabel = computed(() =>
266
+ formatMessage(msg.value.versions.newDraftButton, { version: props.nextDraftVersion }),
267
+ );
268
+
269
+ function timelineSelectTitle(version: PlanVersionRow): string {
270
+ return formatMessage(msg.value.versions.timelineSelectTitle, {
271
+ version: version.version,
272
+ status: props.statusOf(version),
273
+ });
274
+ }
275
+
276
+ function validityLabel(version: PlanVersionRow): string {
277
+ const status = props.statusOf(version);
278
+ if (status === 'draft') return msg.value.versions.validityPlanned;
279
+ if (status === 'live') return msg.value.versions.validityActive;
280
+ return msg.value.versions.validityHistoric;
281
+ }
282
+
283
+ function endsAtTitle(endsAt: string): string {
284
+ return formatMessage(msg.value.versions.endsAtTitle, { date: props.formatDate(endsAt) });
285
+ }
286
+
287
+ function endsAtBadge(endsAt: string): string {
288
+ return formatMessage(msg.value.versions.endsAtBadge, { date: props.formatDate(endsAt) });
289
+ }
255
290
  </script>