@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.
- package/README.md +64 -4
- package/dist/chunk-A3W2N26K.js +714 -0
- package/dist/chunk-QZOSDCNP.js +98 -0
- package/dist/chunk-X5SQ5HMB.js +3231 -0
- package/dist/client/index.cjs +3988 -0
- package/dist/client/index.d.cts +321 -0
- package/dist/client/index.d.ts +321 -0
- package/dist/client/index.js +70 -0
- package/dist/index.cjs +4446 -1249
- package/dist/index.d.cts +297 -888
- package/dist/index.d.ts +297 -888
- package/dist/index.js +609 -1348
- package/dist/messages-7b0P8W75.d.cts +1652 -0
- package/dist/messages-7b0P8W75.d.ts +1652 -0
- package/dist/quasar/index.cjs +3340 -0
- package/dist/quasar/index.d.cts +95 -0
- package/dist/quasar/index.d.ts +95 -0
- package/dist/quasar/index.js +96 -0
- package/dist/testing-e2e/admin-pages-suite.cjs +14 -11
- package/dist/testing-e2e/admin-pages-suite.js +14 -11
- package/dist/use-super-admin-i18n-B3v3-SWZ.d.ts +210 -0
- package/dist/use-super-admin-i18n-DMktRVEt.d.cts +210 -0
- package/package.json +23 -3
- package/src/{action-registry.ts → client/action-registry.ts} +4 -4
- package/src/{batch-column-fetcher.ts → client/batch-column-fetcher.ts} +4 -4
- package/src/{boot-loader.ts → client/boot-loader.ts} +3 -3
- package/src/client/i18n/currency.ts +42 -0
- package/src/client/i18n/define.ts +59 -0
- package/src/client/i18n/format.ts +12 -0
- package/src/client/i18n/index.ts +14 -0
- package/src/client/i18n/locale.ts +15 -0
- package/src/client/i18n/messages/audit.ts +42 -0
- package/src/client/i18n/messages/bundles.ts +459 -0
- package/src/client/i18n/messages/common.ts +147 -0
- package/src/client/i18n/messages/dashboard.ts +16 -0
- package/src/client/i18n/messages/discovery.ts +229 -0
- package/src/client/i18n/messages/email.ts +125 -0
- package/src/client/i18n/messages/marketing.ts +270 -0
- package/src/client/i18n/messages/nav.ts +72 -0
- package/src/client/i18n/messages/pilots.ts +192 -0
- package/src/client/i18n/messages/plan-detail.ts +266 -0
- package/src/client/i18n/messages/plan-editor.ts +177 -0
- package/src/client/i18n/messages/plan-versions.ts +251 -0
- package/src/client/i18n/messages/plans.ts +503 -0
- package/src/client/i18n/messages/promos.ts +202 -0
- package/src/client/i18n/messages/shell.ts +145 -0
- package/src/client/i18n/messages/tenants.ts +104 -0
- package/src/client/i18n/messages/users.ts +78 -0
- package/src/client/i18n/messages.ts +84 -0
- package/src/client/index.ts +27 -0
- package/src/{manifest-loader.ts → client/manifest-loader.ts} +4 -4
- package/src/{nav-builder.ts → client/nav-builder.ts} +44 -51
- package/src/{plan-versions-catalog.ts → client/plan-versions-catalog.ts} +42 -30
- package/src/components/BundleVersionPublishDialog.vue +35 -24
- package/src/components/FeatureGate.vue +1 -1
- package/src/components/MarketingPromotionsTab.vue +112 -59
- package/src/components/MfaPromptDialog.vue +11 -11
- package/src/components/TenantActionConfirmDialog.vue +19 -17
- package/src/components/VersionDiffPreview.vue +72 -43
- package/src/components/bundle-editor/BundleCreatePanel.vue +76 -63
- package/src/components/bundle-editor/BundleFeaturesEditor.vue +13 -6
- package/src/components/bundle-editor/BundlePlanCompatPicker.vue +19 -14
- package/src/components/bundle-editor/BundleQuotasEditor.vue +7 -4
- package/src/components/bundle-editor/BundleStatusBanner.vue +36 -19
- package/src/components/bundle-editor/BundleVersionInlineEditor.vue +51 -35
- package/src/components/bundle-editor/BundleVersionStrip.vue +24 -12
- package/src/components/bundle-editor/bundle-version-status.ts +29 -29
- package/src/components/dialogs/PilotCreateDialog.vue +58 -63
- package/src/components/dialogs/PilotEditDialog.vue +40 -34
- package/src/components/dialogs/PromoCodeCreateDialog.vue +89 -63
- package/src/components/dialogs/PromoCodeEditDialog.vue +98 -66
- package/src/components/dialogs/types.ts +3 -13
- package/src/components/plan/PlanCycleToggle.vue +21 -10
- 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/components/plan-cockpit/PlanCockpit.vue +34 -15
- package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +13 -6
- package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +18 -9
- package/src/components/plan-cockpit/PlanCockpitHeader.vue +9 -6
- package/src/components/plan-cockpit/PlanCockpitImpactPanel.vue +24 -11
- package/src/components/plan-cockpit/PlanCockpitKpis.vue +28 -17
- package/src/components/plan-cockpit/PlanCockpitVersions.vue +50 -25
- package/src/components/plan-create-dialog/PlanCreateDialog.vue +45 -35
- package/src/components/plan-detail/PlanAuditLog.vue +11 -6
- package/src/components/plan-detail/PlanDetail.vue +21 -23
- package/src/components/plan-detail/PlanDetailHeader.vue +20 -11
- package/src/components/plan-detail/PlanDetailKpis.vue +30 -17
- package/src/components/plan-detail/PlanTerminateDialog.vue +22 -9
- package/src/components/plan-detail/PlanVersionDiffPanel.vue +61 -27
- package/src/components/plan-detail/PlanVersionsPanel.vue +71 -36
- package/src/components/plan-list/PlanList.vue +99 -57
- package/src/components/plan-matrix/PlanMatrix.vue +85 -38
- package/src/components/plan-review/PlanReview.vue +105 -80
- package/src/components/plan-version-editor/PlanCatalogPreview.vue +43 -20
- package/src/components/plan-version-editor/PlanComponentPool.vue +15 -7
- package/src/components/plan-version-editor/PlanVersionBasket.vue +45 -24
- package/src/components/plan-version-editor/PlanVersionDiffDialog.vue +8 -7
- package/src/components/plan-version-editor/PlanVersionEditor.vue +74 -40
- package/src/components/plan-version-editor/PlanVersionEditorHeader.vue +24 -12
- package/src/index.ts +82 -79
- package/src/pages-standard/AdminLayout.vue +43 -18
- package/src/pages-standard/AdminManifestErrorPage.vue +10 -10
- package/src/pages-standard/AuditPage.vue +58 -19
- package/src/pages-standard/BundlesPage.vue +29 -18
- package/src/pages-standard/DashboardPage.vue +31 -17
- package/src/pages-standard/DiscoveryPage.vue +40 -28
- package/src/pages-standard/EmailHistoryPage.vue +98 -69
- package/src/pages-standard/MarketingCatalogPage.vue +40 -21
- package/src/pages-standard/PilotsPage.vue +64 -52
- package/src/pages-standard/PlanVersionsPage.vue +9 -5
- package/src/pages-standard/PlansPage.vue +91 -59
- package/src/pages-standard/PlatformEmailPage.vue +120 -53
- package/src/pages-standard/PromoCodeDetailPage.vue +66 -63
- package/src/pages-standard/PromoCodesPage.vue +51 -54
- package/src/pages-standard/SubscriptionsPage.vue +14 -9
- package/src/pages-standard/SuperAdminLoginPage.vue +19 -16
- package/src/pages-standard/SuperAdminSetupWizard.vue +53 -49
- package/src/pages-standard/TenantDetailPage.vue +54 -40
- package/src/pages-standard/TenantsPage.vue +57 -44
- package/src/pages-standard/UsersPage.vue +70 -52
- package/src/pages-standard/bundles-page/BundleAccordionList.vue +20 -8
- package/src/pages-standard/bundles-page/BundleDetailPanel.vue +28 -18
- package/src/pages-standard/bundles-page/BundlesFilterBar.vue +4 -1
- package/src/pages-standard/bundles-page/BundlesHeader.vue +9 -8
- package/src/pages-standard/bundles-page/BundlesKpis.vue +29 -11
- package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +20 -8
- package/src/pages-standard/discovery-page/DiscoveryCapList.vue +5 -3
- package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +43 -24
- package/src/pages-standard/discovery-page/DiscoveryHeader.vue +7 -4
- package/src/pages-standard/discovery-page/DiscoveryKpis.vue +28 -15
- package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +20 -10
- package/src/pages-standard/discovery-page/DiscoveryStatusControl.vue +9 -6
- package/src/pages-standard/discovery-page/discovery-ui.ts +40 -52
- package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +81 -49
- package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +13 -10
- package/src/pages-standard/marketing-catalog/MarketingCatalogPreview.vue +24 -20
- package/src/pages-standard/marketing-catalog/MarketingCatalogToolbar.vue +6 -3
- package/src/pages-standard/plan-versions/PlanDiffCard.vue +16 -6
- package/src/pages-standard/plan-versions/PlanVersionHeader.vue +42 -26
- package/src/pages-standard/plan-versions/PlanVersionsAudit.vue +46 -27
- package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +8 -6
- package/src/pages-standard/plan-versions/PlanVersionsList.vue +40 -17
- package/src/pages-standard/plan-versions/PlanVersionsMatrix.vue +1 -1
- package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +25 -13
- package/src/pages-standard/plan-versions/format.ts +33 -17
- package/src/pages-standard/plans-page/PlanArchiveDialog.vue +12 -8
- package/src/pages-standard/plans-page/PlanBundleOverview.vue +15 -6
- package/src/pages-standard/plans-page/PlanDiscardDraftDialog.vue +18 -7
- package/src/pages-standard/plans-page/PlanPublishDialog.vue +23 -12
- package/src/pages-standard/tenants/format.ts +3 -2
- package/src/pages-tenant/MySubscriptionBundlesPage.vue +73 -38
- package/src/pages-tenant/OnboardingConfigurator.vue +3 -3
- package/src/pages-tenant/PackageSnapshotPanel.vue +1 -1
- package/src/pages-tenant/PlanChangeWizard.vue +10 -6
- package/src/pages-tenant/TenantPlanSection.vue +20 -16
- package/src/pages-tenant/default-i18n.ts +217 -1
- package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +9 -7
- package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +11 -12
- package/src/pages-tenant/tenant-plan-section/TenantFeatureMatrix.vue +4 -1
- 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 +192 -0
- package/src/quasar/index.ts +11 -0
- package/src/quasar/notify.ts +30 -0
- package/src/testing-e2e/admin-pages-suite.ts +14 -11
- 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} +6 -4
- 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-audit-entries.ts → vue/use-audit-entries.ts} +3 -3
- package/src/{use-batch-columns.ts → vue/use-batch-columns.ts} +1 -1
- package/src/{use-bulk-publish.ts → vue/use-bulk-publish.ts} +7 -5
- package/src/{use-bundle-versions-map.ts → vue/use-bundle-versions-map.ts} +7 -5
- package/src/{use-bundles.ts → vue/use-bundles.ts} +14 -14
- package/src/{use-catalog-entries.ts → vue/use-catalog-entries.ts} +14 -11
- package/src/{use-discovery.ts → vue/use-discovery.ts} +9 -6
- package/src/{use-entitlement.ts → vue/use-entitlement.ts} +4 -4
- package/src/{use-live-plan-versions.ts → vue/use-live-plan-versions.ts} +5 -5
- package/src/{use-manifest.ts → vue/use-manifest.ts} +1 -1
- package/src/{use-marketing-projections.ts → vue/use-marketing-projections.ts} +10 -7
- package/src/{use-nav.ts → vue/use-nav.ts} +9 -3
- package/src/{use-plan-editor.ts → vue/use-plan-editor.ts} +2 -2
- package/src/{use-plan-versions.ts → vue/use-plan-versions.ts} +3 -3
- package/src/{use-plans.ts → vue/use-plans.ts} +13 -13
- package/src/{use-platform-tenant-actions.ts → vue/use-platform-tenant-actions.ts} +9 -6
- package/src/{use-promotions.ts → vue/use-promotions.ts} +10 -11
- package/src/{use-public-boot.ts → vue/use-public-boot.ts} +1 -1
- package/src/{use-subscription-draft.ts → vue/use-subscription-draft.ts} +2 -3
- package/src/{use-super-admin-context.ts → vue/use-super-admin-context.ts} +5 -5
- package/src/vue/use-super-admin-i18n.ts +82 -0
- package/src/{use-tenant-action-flow.ts → vue/use-tenant-action-flow.ts} +12 -7
- 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} +2 -4
- package/src/{use-tenant-subscription-bundles.ts → vue/use-tenant-subscription-bundles.ts} +5 -5
- package/src/{use-tenants.ts → vue/use-tenants.ts} +3 -3
- package/dist/testing-e2e/admin-pages-suite.d.cts +0 -37
- package/dist/testing-e2e/admin-pages-suite.d.ts +0 -37
- package/src/components/BusinessTypeVersionEditorDialog.vue +0 -417
- package/src/components/BusinessTypeVersionPublishDialog.vue +0 -258
- package/src/pages-standard/BusinessTypesPage.vue +0 -662
- package/src/pages-standard/plan-versions/VersionDiffPreview.vue +0 -167
- package/src/use-business-types.ts +0 -269
- /package/src/{http-json.ts → client/http-json.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
|
@@ -7,13 +7,8 @@
|
|
|
7
7
|
<q-card class="pl-dlg">
|
|
8
8
|
<q-card-section class="pl-dlg__head">
|
|
9
9
|
<div>
|
|
10
|
-
<div class="pl-dlg__title">
|
|
11
|
-
<div class="pl-dlg__sub">
|
|
12
|
-
{{
|
|
13
|
-
subtitle ??
|
|
14
|
-
'Neuer Mandant + Initial-Admin werden in einem Schritt angelegt.'
|
|
15
|
-
}}
|
|
16
|
-
</div>
|
|
10
|
+
<div class="pl-dlg__title">{{ msg.createDialog.title }}</div>
|
|
11
|
+
<div class="pl-dlg__sub">{{ subtitle ?? msg.createDialog.subtitle }}</div>
|
|
17
12
|
</div>
|
|
18
13
|
<q-btn
|
|
19
14
|
class="pl-dlg__close"
|
|
@@ -32,7 +27,9 @@
|
|
|
32
27
|
<header class="pl-section__head">
|
|
33
28
|
<span class="pl-section__num">1</span>
|
|
34
29
|
<div>
|
|
35
|
-
<div class="pl-section__title">
|
|
30
|
+
<div class="pl-section__title">
|
|
31
|
+
{{ msg.createDialog.sectionTenant }}
|
|
32
|
+
</div>
|
|
36
33
|
<div class="pl-section__sub">{{ copy.tenantSubtitle }}</div>
|
|
37
34
|
</div>
|
|
38
35
|
</header>
|
|
@@ -49,10 +46,8 @@
|
|
|
49
46
|
|
|
50
47
|
<div class="pl-field pl-field--full">
|
|
51
48
|
<label>
|
|
52
|
-
|
|
53
|
-
<span class="pl-field__hint"
|
|
54
|
-
>wird automatisch aus dem Namen erzeugt</span
|
|
55
|
-
>
|
|
49
|
+
{{ msg.form.slugLabel }}
|
|
50
|
+
<span class="pl-field__hint">{{ msg.form.slugHint }}</span>
|
|
56
51
|
</label>
|
|
57
52
|
<div class="pl-slug-input">
|
|
58
53
|
<span v-if="slugPrefix" class="pl-slug-input__prefix">{{
|
|
@@ -66,27 +61,27 @@
|
|
|
66
61
|
/>
|
|
67
62
|
</div>
|
|
68
63
|
<div v-if="slugConflict" class="pl-field__error">
|
|
69
|
-
|
|
64
|
+
{{ msg.form.slugConflict }}
|
|
70
65
|
</div>
|
|
71
66
|
</div>
|
|
72
67
|
|
|
73
68
|
<div v-if="showLegalFields" class="pl-field">
|
|
74
|
-
<label>
|
|
69
|
+
<label>{{ msg.createDialog.legalFormLabel }}</label>
|
|
75
70
|
<input
|
|
76
71
|
v-model="form.tenant.legalForm"
|
|
77
72
|
class="pl-input"
|
|
78
|
-
placeholder="
|
|
73
|
+
:placeholder="msg.createDialog.legalFormPlaceholder"
|
|
79
74
|
/>
|
|
80
75
|
</div>
|
|
81
76
|
<div v-if="showLegalFields" class="pl-field">
|
|
82
77
|
<label>
|
|
83
|
-
|
|
84
|
-
<span class="pl-field__hint">
|
|
78
|
+
{{ msg.createDialog.vatIdLabel }}
|
|
79
|
+
<span class="pl-field__hint">{{ msg.createDialog.vatIdHint }}</span>
|
|
85
80
|
</label>
|
|
86
81
|
<input
|
|
87
82
|
v-model="form.tenant.vatId"
|
|
88
83
|
class="pl-input"
|
|
89
|
-
placeholder="
|
|
84
|
+
:placeholder="msg.createDialog.vatIdPlaceholder"
|
|
90
85
|
/>
|
|
91
86
|
</div>
|
|
92
87
|
</div>
|
|
@@ -98,15 +93,15 @@
|
|
|
98
93
|
<header class="pl-section__head">
|
|
99
94
|
<span class="pl-section__num">2</span>
|
|
100
95
|
<div>
|
|
101
|
-
<div class="pl-section__title">
|
|
96
|
+
<div class="pl-section__title">{{ msg.createDialog.sectionAdmin }}</div>
|
|
102
97
|
<div class="pl-section__sub">
|
|
103
|
-
|
|
98
|
+
{{ msg.createDialog.sectionAdminSub }}
|
|
104
99
|
</div>
|
|
105
100
|
</div>
|
|
106
101
|
</header>
|
|
107
102
|
<div class="pl-grid">
|
|
108
103
|
<div class="pl-field pl-field--full">
|
|
109
|
-
<label>
|
|
104
|
+
<label>{{ msg.createDialog.emailLabel }}</label>
|
|
110
105
|
<input
|
|
111
106
|
v-model="form.admin.email"
|
|
112
107
|
class="pl-input"
|
|
@@ -115,36 +110,36 @@
|
|
|
115
110
|
:placeholder="copy.adminEmailPlaceholder"
|
|
116
111
|
/>
|
|
117
112
|
<div v-if="form.admin.email && !emailValid" class="pl-field__error">
|
|
118
|
-
|
|
113
|
+
{{ msg.createDialog.emailInvalid }}
|
|
119
114
|
</div>
|
|
120
115
|
</div>
|
|
121
116
|
<div class="pl-field">
|
|
122
|
-
<label>
|
|
117
|
+
<label>{{ msg.createDialog.firstNameLabel }}</label>
|
|
123
118
|
<input
|
|
124
119
|
v-model="form.admin.firstName"
|
|
125
120
|
class="pl-input"
|
|
126
|
-
placeholder="
|
|
121
|
+
:placeholder="msg.createDialog.firstNamePlaceholder"
|
|
127
122
|
/>
|
|
128
123
|
</div>
|
|
129
124
|
<div class="pl-field">
|
|
130
|
-
<label>
|
|
125
|
+
<label>{{ msg.createDialog.lastNameLabel }}</label>
|
|
131
126
|
<input
|
|
132
127
|
v-model="form.admin.lastName"
|
|
133
128
|
class="pl-input"
|
|
134
|
-
placeholder="
|
|
129
|
+
:placeholder="msg.createDialog.lastNamePlaceholder"
|
|
135
130
|
/>
|
|
136
131
|
</div>
|
|
137
132
|
<div class="pl-field pl-field--full">
|
|
138
133
|
<label>
|
|
139
|
-
|
|
140
|
-
<span class="pl-field__hint"
|
|
141
|
-
|
|
142
|
-
>
|
|
134
|
+
{{ msg.createDialog.initialPasswordLabel }}
|
|
135
|
+
<span class="pl-field__hint">{{
|
|
136
|
+
msg.createDialog.initialPasswordHint
|
|
137
|
+
}}</span>
|
|
143
138
|
</label>
|
|
144
139
|
<input
|
|
145
140
|
v-model="form.admin.initialPassword"
|
|
146
141
|
class="pl-input"
|
|
147
|
-
placeholder="
|
|
142
|
+
:placeholder="msg.createDialog.initialPasswordPlaceholder"
|
|
148
143
|
/>
|
|
149
144
|
</div>
|
|
150
145
|
</div>
|
|
@@ -155,15 +150,15 @@
|
|
|
155
150
|
<header class="pl-section__head">
|
|
156
151
|
<span class="pl-section__num">3</span>
|
|
157
152
|
<div>
|
|
158
|
-
<div class="pl-section__title">
|
|
153
|
+
<div class="pl-section__title">{{ msg.createDialog.sectionPilot }}</div>
|
|
159
154
|
<div class="pl-section__sub">
|
|
160
|
-
|
|
155
|
+
{{ msg.createDialog.sectionPilotSub }}
|
|
161
156
|
</div>
|
|
162
157
|
</div>
|
|
163
158
|
</header>
|
|
164
159
|
<div class="pl-grid">
|
|
165
160
|
<div class="pl-field">
|
|
166
|
-
<label>
|
|
161
|
+
<label>{{ msg.form.planLabel }}</label>
|
|
167
162
|
<div class="pl-plan-select">
|
|
168
163
|
<button
|
|
169
164
|
v-for="p in normalizedPlanOptions"
|
|
@@ -192,23 +187,23 @@
|
|
|
192
187
|
</div>
|
|
193
188
|
|
|
194
189
|
<div class="pl-field">
|
|
195
|
-
<label>
|
|
190
|
+
<label>{{ msg.form.endsAtLabel }}</label>
|
|
196
191
|
<div class="pl-end-row">
|
|
197
192
|
<input v-model="form.pilot.endsAt" class="pl-input" type="date" />
|
|
198
193
|
<button
|
|
199
194
|
v-if="form.pilot.endsAt"
|
|
200
195
|
type="button"
|
|
201
196
|
class="pl-btn-mini"
|
|
202
|
-
title="
|
|
197
|
+
:title="msg.form.endsAtClearTitle"
|
|
203
198
|
@click="form.pilot.endsAt = ''"
|
|
204
199
|
>
|
|
205
200
|
<q-icon name="close" size="12px" />
|
|
206
|
-
|
|
201
|
+
{{ common.unlimited }}
|
|
207
202
|
</button>
|
|
208
203
|
</div>
|
|
209
204
|
<div class="pl-end-presets">
|
|
210
205
|
<button
|
|
211
|
-
v-for="p in
|
|
206
|
+
v-for="p in presetEnds"
|
|
212
207
|
:key="p.days"
|
|
213
208
|
type="button"
|
|
214
209
|
class="pl-preset-btn"
|
|
@@ -221,10 +216,8 @@
|
|
|
221
216
|
|
|
222
217
|
<div class="pl-field pl-field--full">
|
|
223
218
|
<label>
|
|
224
|
-
|
|
225
|
-
<span class="pl-field__hint"
|
|
226
|
-
>intern · nicht für Kunden sichtbar</span
|
|
227
|
-
>
|
|
219
|
+
{{ msg.form.noteLabel }}
|
|
220
|
+
<span class="pl-field__hint">{{ msg.form.noteHint }}</span>
|
|
228
221
|
</label>
|
|
229
222
|
<textarea
|
|
230
223
|
v-model="form.pilot.note"
|
|
@@ -242,13 +235,13 @@
|
|
|
242
235
|
<q-card-actions align="right" class="pl-dlg__foot">
|
|
243
236
|
<span v-if="form.admin.email && emailValid" class="pl-foot-hint">
|
|
244
237
|
<q-icon name="send" size="14px" />
|
|
245
|
-
|
|
238
|
+
{{ msg.createDialog.invitationHint }} <strong>{{ form.admin.email }}</strong>
|
|
246
239
|
</span>
|
|
247
|
-
<q-btn flat label="
|
|
240
|
+
<q-btn flat :label="common.cancel" v-close-popup :disable="loading" />
|
|
248
241
|
<q-btn
|
|
249
242
|
unelevated
|
|
250
243
|
color="primary"
|
|
251
|
-
label="
|
|
244
|
+
:label="msg.createAction"
|
|
252
245
|
:loading="loading"
|
|
253
246
|
:disable="!isValid"
|
|
254
247
|
@click="onSubmit"
|
|
@@ -270,12 +263,9 @@
|
|
|
270
263
|
<script setup lang="ts">
|
|
271
264
|
import { computed, reactive, ref, watch } from 'vue';
|
|
272
265
|
import MfaPromptDialog from '../MfaPromptDialog.vue';
|
|
273
|
-
import {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
type PilotCreatePayload,
|
|
277
|
-
type PilotCreateResult,
|
|
278
|
-
} from './types.js';
|
|
266
|
+
import { formatMessage } from '../../client/i18n/format.js';
|
|
267
|
+
import { useSaMessages } from '../../vue/use-super-admin-i18n.js';
|
|
268
|
+
import type { PilotCopy, PilotCreatePayload, PilotCreateResult } from './types.js';
|
|
279
269
|
|
|
280
270
|
// Platform pilot-create dialog (sim layout: 3 numbered sections,
|
|
281
271
|
// slug-prefix display, plan-tile picker, ends-at quick-sets, footer hint).
|
|
@@ -315,14 +305,17 @@ const emit = defineEmits<{
|
|
|
315
305
|
(e: 'created', result: PilotCreateResult): void;
|
|
316
306
|
}>();
|
|
317
307
|
|
|
318
|
-
const
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
{ label:
|
|
323
|
-
|
|
308
|
+
const msg = useSaMessages('pilots');
|
|
309
|
+
const common = useSaMessages('common');
|
|
310
|
+
|
|
311
|
+
const presetEnds = computed<ReadonlyArray<{ label: string; days: number }>>(() => [
|
|
312
|
+
{ label: msg.value.form.preset30Days, days: 30 },
|
|
313
|
+
{ label: msg.value.form.preset90Days, days: 90 },
|
|
314
|
+
{ label: msg.value.form.preset6Months, days: 180 },
|
|
315
|
+
{ label: msg.value.form.preset1Year, days: 365 },
|
|
316
|
+
]);
|
|
324
317
|
|
|
325
|
-
const copy = computed<Required<PilotCopy>>(() => ({ ...
|
|
318
|
+
const copy = computed<Required<PilotCopy>>(() => ({ ...msg.value.copyDefaults, ...props.copy }));
|
|
326
319
|
|
|
327
320
|
const normalizedPlanOptions = computed<Array<{ value: string; label: string; color?: string }>>(
|
|
328
321
|
() =>
|
|
@@ -419,7 +412,10 @@ watch(
|
|
|
419
412
|
function onSubmit(): void {
|
|
420
413
|
if (!isValid.value) return;
|
|
421
414
|
if (props.requireMfa) {
|
|
422
|
-
mfaDescription.value =
|
|
415
|
+
mfaDescription.value = formatMessage(msg.value.createDialog.mfaDescription, {
|
|
416
|
+
name: form.tenant.name,
|
|
417
|
+
plan: form.pilot.plan,
|
|
418
|
+
});
|
|
423
419
|
mfaError.value = '';
|
|
424
420
|
showMfa.value = true;
|
|
425
421
|
return;
|
|
@@ -472,12 +468,11 @@ async function doSubmit(code: string): Promise<void> {
|
|
|
472
468
|
status === 401 &&
|
|
473
469
|
(reason === 'MFA_FAILED' || reason === 'MFA_REQUIRED')
|
|
474
470
|
) {
|
|
475
|
-
mfaError.value =
|
|
471
|
+
mfaError.value = msg.value.mfa.invalidCode;
|
|
476
472
|
} else if (props.requireMfa && status === 401 && reason === 'MFA_NOT_SET_UP') {
|
|
477
|
-
mfaError.value =
|
|
478
|
-
response?.data?.message ?? 'MFA ist für diesen Account nicht eingerichtet.';
|
|
473
|
+
mfaError.value = response?.data?.message ?? msg.value.mfa.notSetUp;
|
|
479
474
|
} else {
|
|
480
|
-
error.value = response?.data?.message ??
|
|
475
|
+
error.value = response?.data?.message ?? common.value.createFailed;
|
|
481
476
|
showMfa.value = false;
|
|
482
477
|
}
|
|
483
478
|
} finally {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<q-card class="ple-dlg">
|
|
8
8
|
<q-card-section class="ple-dlg__head">
|
|
9
9
|
<div>
|
|
10
|
-
<div class="ple-dlg__title">
|
|
10
|
+
<div class="ple-dlg__title">{{ msg.editDialog.title }}</div>
|
|
11
11
|
<div class="ple-dlg__sub" v-if="row">
|
|
12
12
|
<strong>{{ row.tenant.name }}</strong>
|
|
13
13
|
<span class="ple-dlg__sep">·</span>
|
|
@@ -31,11 +31,8 @@
|
|
|
31
31
|
<header class="ple-section__head">
|
|
32
32
|
<span class="ple-section__num">1</span>
|
|
33
33
|
<div>
|
|
34
|
-
<div class="ple-section__title">
|
|
35
|
-
<div class="ple-section__sub">
|
|
36
|
-
Aktive Plan-Zuweisung. Legacy-Plans tauchen als „nicht im Katalog"
|
|
37
|
-
auf.
|
|
38
|
-
</div>
|
|
34
|
+
<div class="ple-section__title">{{ msg.form.planLabel }}</div>
|
|
35
|
+
<div class="ple-section__sub">{{ msg.editDialog.sectionPlanSub }}</div>
|
|
39
36
|
</div>
|
|
40
37
|
</header>
|
|
41
38
|
<div class="ple-plan-select">
|
|
@@ -70,9 +67,11 @@
|
|
|
70
67
|
<header class="ple-section__head">
|
|
71
68
|
<span class="ple-section__num">2</span>
|
|
72
69
|
<div>
|
|
73
|
-
<div class="ple-section__title">
|
|
70
|
+
<div class="ple-section__title">
|
|
71
|
+
{{ msg.editDialog.sectionEndDate }}
|
|
72
|
+
</div>
|
|
74
73
|
<div class="ple-section__sub">
|
|
75
|
-
|
|
74
|
+
{{ msg.editDialog.sectionEndDateSub }}
|
|
76
75
|
</div>
|
|
77
76
|
</div>
|
|
78
77
|
</header>
|
|
@@ -82,16 +81,16 @@
|
|
|
82
81
|
v-if="form.endsAt"
|
|
83
82
|
type="button"
|
|
84
83
|
class="ple-btn-mini"
|
|
85
|
-
title="
|
|
84
|
+
:title="msg.editDialog.clearDateTitle"
|
|
86
85
|
@click="form.endsAt = ''"
|
|
87
86
|
>
|
|
88
87
|
<q-icon name="close" size="12px" />
|
|
89
|
-
|
|
88
|
+
{{ common.unlimited }}
|
|
90
89
|
</button>
|
|
91
90
|
</div>
|
|
92
91
|
<div class="ple-end-presets">
|
|
93
92
|
<button
|
|
94
|
-
v-for="p in
|
|
93
|
+
v-for="p in presetEnds"
|
|
95
94
|
:key="p.days"
|
|
96
95
|
type="button"
|
|
97
96
|
class="ple-preset-btn"
|
|
@@ -107,8 +106,8 @@
|
|
|
107
106
|
<header class="ple-section__head">
|
|
108
107
|
<span class="ple-section__num">3</span>
|
|
109
108
|
<div>
|
|
110
|
-
<div class="ple-section__title">
|
|
111
|
-
<div class="ple-section__sub">
|
|
109
|
+
<div class="ple-section__title">{{ msg.editDialog.sectionNote }}</div>
|
|
110
|
+
<div class="ple-section__sub">{{ msg.editDialog.sectionNoteSub }}</div>
|
|
112
111
|
</div>
|
|
113
112
|
</header>
|
|
114
113
|
<textarea
|
|
@@ -123,11 +122,11 @@
|
|
|
123
122
|
</q-card-section>
|
|
124
123
|
|
|
125
124
|
<q-card-actions align="right" class="ple-dlg__foot">
|
|
126
|
-
<q-btn flat label="
|
|
125
|
+
<q-btn flat :label="common.cancel" v-close-popup :disable="loading" />
|
|
127
126
|
<q-btn
|
|
128
127
|
unelevated
|
|
129
128
|
color="primary"
|
|
130
|
-
label="
|
|
129
|
+
:label="common.save"
|
|
131
130
|
:loading="loading"
|
|
132
131
|
:disable="!isDirty"
|
|
133
132
|
@click="onSubmit"
|
|
@@ -149,13 +148,10 @@
|
|
|
149
148
|
<script setup lang="ts">
|
|
150
149
|
import { computed, reactive, ref, watch } from 'vue';
|
|
151
150
|
import MfaPromptDialog from '../MfaPromptDialog.vue';
|
|
151
|
+
import { formatMessage } from '../../client/i18n/format.js';
|
|
152
|
+
import { useSaMessages } from '../../vue/use-super-admin-i18n.js';
|
|
152
153
|
import type { PilotRow } from '../../pages-standard/PilotsPage.vue';
|
|
153
|
-
import {
|
|
154
|
-
DEFAULT_PILOT_COPY,
|
|
155
|
-
type PilotCopy,
|
|
156
|
-
type PilotEditPayload,
|
|
157
|
-
type PilotEditResult,
|
|
158
|
-
} from './types.js';
|
|
154
|
+
import type { PilotCopy, PilotEditPayload, PilotEditResult } from './types.js';
|
|
159
155
|
|
|
160
156
|
// Platform dialog for editing an existing pilot subscription
|
|
161
157
|
// (sim layout: numbered sections, plan tile picker, ends-at quick sets).
|
|
@@ -187,15 +183,18 @@ const emit = defineEmits<{
|
|
|
187
183
|
(e: 'updated', result: PilotEditResult): void;
|
|
188
184
|
}>();
|
|
189
185
|
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
{ label:
|
|
195
|
-
|
|
186
|
+
const msg = useSaMessages('pilots');
|
|
187
|
+
const common = useSaMessages('common');
|
|
188
|
+
|
|
189
|
+
const presetEnds = computed<ReadonlyArray<{ label: string; days: number }>>(() => [
|
|
190
|
+
{ label: msg.value.form.preset30Days, days: 30 },
|
|
191
|
+
{ label: msg.value.form.preset90Days, days: 90 },
|
|
192
|
+
{ label: msg.value.form.preset6Months, days: 180 },
|
|
193
|
+
{ label: msg.value.form.preset1Year, days: 365 },
|
|
194
|
+
]);
|
|
196
195
|
|
|
197
196
|
const notePlaceholder = computed(
|
|
198
|
-
() => props.copy?.notePlaceholder ??
|
|
197
|
+
() => props.copy?.notePlaceholder ?? msg.value.copyDefaults.notePlaceholder,
|
|
199
198
|
);
|
|
200
199
|
|
|
201
200
|
function normalize(opt: PlanOption): { value: string; label: string; color?: string } {
|
|
@@ -212,7 +211,13 @@ const effectivePlanOptions = computed<Array<{ value: string; label: string; colo
|
|
|
212
211
|
const current = props.row?.plan;
|
|
213
212
|
if (!current) return opts;
|
|
214
213
|
if (opts.some((o) => o.value === current)) return opts;
|
|
215
|
-
return [
|
|
214
|
+
return [
|
|
215
|
+
{
|
|
216
|
+
value: current,
|
|
217
|
+
label: formatMessage(msg.value.editDialog.planNotInCatalog, { plan: current }),
|
|
218
|
+
},
|
|
219
|
+
...opts,
|
|
220
|
+
];
|
|
216
221
|
},
|
|
217
222
|
);
|
|
218
223
|
|
|
@@ -276,7 +281,9 @@ const isDirty = computed(() => Object.keys(diff.value).length > 0);
|
|
|
276
281
|
function onSubmit(): void {
|
|
277
282
|
if (!isDirty.value || !props.row) return;
|
|
278
283
|
if (props.requireMfa) {
|
|
279
|
-
mfaDescription.value =
|
|
284
|
+
mfaDescription.value = formatMessage(msg.value.editDialog.mfaDescription, {
|
|
285
|
+
name: props.row.tenant.name,
|
|
286
|
+
});
|
|
280
287
|
mfaError.value = '';
|
|
281
288
|
showMfa.value = true;
|
|
282
289
|
return;
|
|
@@ -309,12 +316,11 @@ async function doSubmit(code: string): Promise<void> {
|
|
|
309
316
|
status === 401 &&
|
|
310
317
|
(reason === 'MFA_FAILED' || reason === 'MFA_REQUIRED')
|
|
311
318
|
) {
|
|
312
|
-
mfaError.value =
|
|
319
|
+
mfaError.value = msg.value.mfa.invalidCode;
|
|
313
320
|
} else if (props.requireMfa && status === 401 && reason === 'MFA_NOT_SET_UP') {
|
|
314
|
-
mfaError.value =
|
|
315
|
-
response?.data?.message ?? 'MFA ist für diesen Account nicht eingerichtet.';
|
|
321
|
+
mfaError.value = response?.data?.message ?? msg.value.mfa.notSetUp;
|
|
316
322
|
} else {
|
|
317
|
-
error.value = response?.data?.message ??
|
|
323
|
+
error.value = response?.data?.message ?? common.value.errorSaveFailed;
|
|
318
324
|
showMfa.value = false;
|
|
319
325
|
}
|
|
320
326
|
} finally {
|