@vc-shell/framework 1.1.82 → 1.1.83

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 (38) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/core/api/virtocommerce.platform.ts +10457 -0
  3. package/core/plugins/extension-points/ExtensionSlot.vue +23 -0
  4. package/core/plugins/extension-points/README.md +406 -0
  5. package/core/plugins/extension-points/index.ts +8 -0
  6. package/core/plugins/extension-points/migration-examples.md +613 -0
  7. package/core/plugins/extension-points/simple-extensions.ts +148 -0
  8. package/core/plugins/index.ts +1 -0
  9. package/core/plugins/modularity/loader.ts +2 -2
  10. package/dist/core/api/virtocommerce.platform.d.ts +2442 -0
  11. package/dist/core/api/virtocommerce.platform.d.ts.map +1 -0
  12. package/dist/core/plugins/extension-points/ExtensionSlot.vue.d.ts +6 -0
  13. package/dist/core/plugins/extension-points/ExtensionSlot.vue.d.ts.map +1 -0
  14. package/dist/core/plugins/extension-points/index.d.ts +3 -0
  15. package/dist/core/plugins/extension-points/index.d.ts.map +1 -0
  16. package/dist/core/plugins/extension-points/simple-extensions.d.ts +29 -0
  17. package/dist/core/plugins/extension-points/simple-extensions.d.ts.map +1 -0
  18. package/dist/core/plugins/index.d.ts +1 -0
  19. package/dist/core/plugins/index.d.ts.map +1 -1
  20. package/dist/framework.js +5104 -5031
  21. package/dist/locales/de.json +1 -0
  22. package/dist/locales/en.json +1 -0
  23. package/dist/shared/components/notification-template/notification-template.vue.d.ts +8 -1
  24. package/dist/shared/components/notification-template/notification-template.vue.d.ts.map +1 -1
  25. package/dist/shared/composables/useModificationTracker/index.d.ts +5 -0
  26. package/dist/shared/composables/useModificationTracker/index.d.ts.map +1 -1
  27. package/dist/shared/pages/LoginPage/components/login/Login.vue.d.ts.map +1 -1
  28. package/dist/tsconfig.tsbuildinfo +1 -1
  29. package/dist/ui/components/molecules/vc-form/vc-form.vue.d.ts +5 -1
  30. package/dist/ui/components/molecules/vc-form/vc-form.vue.d.ts.map +1 -1
  31. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts +10 -5
  32. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  33. package/package.json +4 -4
  34. package/shared/components/notification-template/notification-template.vue +5 -1
  35. package/shared/composables/useModificationTracker/index.ts +6 -0
  36. package/shared/pages/LoginPage/components/login/Login.vue +30 -34
  37. package/ui/components/molecules/vc-form/vc-form.vue +11 -3
  38. package/ui/components/molecules/vc-select/vc-select.vue +1 -2
@@ -2,7 +2,11 @@ declare var __VLS_1: {};
2
2
  type __VLS_Slots = {} & {
3
3
  default?: (props: typeof __VLS_1) => any;
4
4
  };
5
- declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
5
+ declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
6
+ submit: () => any;
7
+ }, string, import("vue").PublicProps, Readonly<{}> & Readonly<{
8
+ onSubmit?: (() => any) | undefined;
9
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
6
10
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
7
11
  export default _default;
8
12
  type __VLS_WithSlots<T, S> = T & {
@@ -1 +1 @@
1
- {"version":3,"file":"vc-form.vue.d.ts","sourceRoot":"","sources":["../../../../../ui/components/molecules/vc-form/vc-form.vue"],"names":[],"mappings":"AAsBA,QAAA,IAAI,OAAO,IAAW,CAAE;AACxB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAkB/C,QAAA,MAAM,eAAe,+QAKnB,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAE1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"vc-form.vue.d.ts","sourceRoot":"","sources":["../../../../../ui/components/molecules/vc-form/vc-form.vue"],"names":[],"mappings":"AAwCA,QAAA,IAAI,OAAO,IAAW,CAAE;AACxB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAoB/C,QAAA,MAAM,eAAe;;;;iFAMnB,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAE1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import { Placement } from "@floating-ui/vue";
2
2
  export type OptionProp<T> = ((option: T) => string) | string | undefined;
3
- export type MaybeArray<T> = T | T[];
4
3
  declare const _default: <T, P extends {
5
4
  results?: T[];
6
5
  totalCount?: number;
@@ -8,10 +7,13 @@ declare const _default: <T, P extends {
8
7
  props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
9
8
  readonly onSearch?: ((inputValue: string) => any) | undefined;
10
9
  readonly onClose?: (() => any) | undefined;
11
- readonly "onUpdate:modelValue"?: ((inputValue: MaybeArray<P extends {
10
+ readonly "onUpdate:modelValue"?: ((inputValue: string | string[] | (P extends {
12
11
  results?: T[];
13
12
  totalCount?: number;
14
- } ? T & (Required<P>["results"] extends infer T_1 ? T_1 extends Required<P>["results"] ? T_1 extends (infer V)[] ? V : never : never : never) : T> | MaybeArray<string> | null) => any) | undefined;
13
+ } ? T & (Required<P>["results"] extends infer T_1 ? T_1 extends Required<P>["results"] ? T_1 extends (infer V)[] ? V : never : never : never) : T) | (P extends {
14
+ results?: T[];
15
+ totalCount?: number;
16
+ } ? T & (Required<P>["results"] extends infer T_2 ? T_2 extends Required<P>["results"] ? T_2 extends (infer V)[] ? V : never : never : never) : T)[] | null) => any) | undefined;
15
17
  } & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onClose" | "onUpdate:modelValue" | "onSearch"> & {
16
18
  /**
17
19
  * Name of select
@@ -215,10 +217,13 @@ declare const _default: <T, P extends {
215
217
  }) => any;
216
218
  "no-options": (props: any) => any;
217
219
  };
218
- emit: ((evt: "search", inputValue: string) => void) & ((evt: "close") => void) & ((evt: "update:modelValue", inputValue: MaybeArray<P extends {
220
+ emit: ((evt: "search", inputValue: string) => void) & ((evt: "close") => void) & ((evt: "update:modelValue", inputValue: string | string[] | (P extends {
221
+ results?: T[];
222
+ totalCount?: number;
223
+ } ? T & (Required<P>["results"] extends infer T_3 ? T_3 extends Required<P>["results"] ? T_3 extends (infer V)[] ? V : never : never : never) : T) | (P extends {
219
224
  results?: T[];
220
225
  totalCount?: number;
221
- } ? T & (Required<P>["results"] extends infer T_3 ? T_3 extends Required<P>["results"] ? T_3 extends (infer V)[] ? V : never : never : never) : T> | MaybeArray<string> | null) => void);
226
+ } ? T & (Required<P>["results"] extends infer T_4 ? T_4 extends Required<P>["results"] ? T_4 extends (infer V)[] ? V : never : never : never) : T)[] | null) => void);
222
227
  }>) => import("vue").VNode & {
223
228
  __ctx?: Awaited<typeof __VLS_setup>;
224
229
  };
@@ -1 +1 @@
1
- {"version":3,"file":"vc-select.vue.d.ts","sourceRoot":"","sources":["../../../../../ui/components/molecules/vc-select/vc-select.vue"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vc-select.vue.d.ts","sourceRoot":"","sources":["../../../../../ui/components/molecules/vc-select/vc-select.vue"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vc-shell/framework",
3
- "version": "1.1.82",
3
+ "version": "1.1.83",
4
4
  "type": "module",
5
5
  "main": "./dist/framework.js",
6
6
  "types": "./dist/index.d.ts",
@@ -90,9 +90,9 @@
90
90
  "@fullhuman/postcss-purgecss": "^7.0.2",
91
91
  "@laynezh/vite-plugin-lib-assets": "v1.1.0",
92
92
  "@types/dompurify": "^3.0.5",
93
- "@vc-shell/api-client-generator": "^1.1.82",
94
- "@vc-shell/config-generator": "^1.1.82",
95
- "@vc-shell/ts-config": "^1.1.82",
93
+ "@vc-shell/api-client-generator": "^1.1.83",
94
+ "@vc-shell/config-generator": "^1.1.83",
95
+ "@vc-shell/ts-config": "^1.1.83",
96
96
  "@vitejs/plugin-vue": "^5.2.3",
97
97
  "@vue/test-utils": "^2.4.5",
98
98
  "cypress-signalr-mock": "^1.5.0",
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="vc-notification-template">
2
+ <div class="vc-notification-template" @click="$emit('click')">
3
3
  <div
4
4
  class="vc-notification-template__container"
5
5
  :class="{
@@ -38,8 +38,12 @@ export interface Props {
38
38
  title: string;
39
39
  notification: IPushNotification;
40
40
  }
41
+ export interface Emits {
42
+ (e: "click"): void;
43
+ }
41
44
 
42
45
  const props = defineProps<Props>();
46
+ const emit = defineEmits<Emits>();
43
47
 
44
48
  const locale = window.navigator.language;
45
49
 
@@ -11,6 +11,11 @@ export interface UseModificationTrackerReturn<T> {
11
11
  * It can be changed directly or through v-model.
12
12
  */
13
13
  currentValue: Ref<T>;
14
+ /**
15
+ * Reactive reference to the pristine value.
16
+ * It is a "clean" version representing the original, unmodified state.
17
+ */
18
+ pristineValue: Ref<T>;
14
19
  /**
15
20
  * Shows if currentValue has been modified compared to its "pristine" state.
16
21
  * Read-only.
@@ -87,6 +92,7 @@ export function useModificationTracker<T>(initialValueProp: T | Ref<T>): UseModi
87
92
 
88
93
  return {
89
94
  currentValue,
95
+ pristineValue,
90
96
  isModified: computed(() => isModified.value),
91
97
  resetModificationState,
92
98
  };
@@ -9,7 +9,7 @@
9
9
  <VcForm @submit.prevent="login">
10
10
  <Field
11
11
  v-slot="{ errorMessage, handleChange, errors }"
12
- :label="t('LOGIN.FIELDS.LOGIN.LABEL')"
12
+ :label="$t('LOGIN.FIELDS.LOGIN.LABEL')"
13
13
  name="username"
14
14
  :model-value="form.username"
15
15
  rules="required"
@@ -18,8 +18,8 @@
18
18
  ref="loginField"
19
19
  v-model="form.username"
20
20
  class="vc-login-page__input"
21
- :label="t('LOGIN.FIELDS.LOGIN.LABEL')"
22
- :placeholder="t('LOGIN.FIELDS.LOGIN.PLACEHOLDER')"
21
+ :label="$t('LOGIN.FIELDS.LOGIN.LABEL')"
22
+ :placeholder="$t('LOGIN.FIELDS.LOGIN.PLACEHOLDER')"
23
23
  required
24
24
  :error="!!errors.length"
25
25
  :error-message="errorMessage"
@@ -28,7 +28,7 @@
28
28
  </Field>
29
29
  <Field
30
30
  v-slot="{ errorMessage, handleChange, errors }"
31
- :label="t('LOGIN.FIELDS.PASSWORD.LABEL')"
31
+ :label="$t('LOGIN.FIELDS.PASSWORD.LABEL')"
32
32
  name="password"
33
33
  :model-value="form.password"
34
34
  rules="required"
@@ -37,8 +37,8 @@
37
37
  ref="passwordField"
38
38
  v-model="form.password"
39
39
  class="vc-login-page__input--small"
40
- :label="t('LOGIN.FIELDS.PASSWORD.LABEL')"
41
- :placeholder="t('LOGIN.FIELDS.PASSWORD.PLACEHOLDER')"
40
+ :label="$t('LOGIN.FIELDS.PASSWORD.LABEL')"
41
+ :placeholder="$t('LOGIN.FIELDS.PASSWORD.PLACEHOLDER')"
42
42
  type="password"
43
43
  required
44
44
  :error="!!errors.length"
@@ -49,7 +49,6 @@
49
49
  </Field>
50
50
 
51
51
  <div
52
- v-if="!!forgotPassword"
53
52
  class="vc-login-page__forgot-password-container"
54
53
  >
55
54
  <VcButton
@@ -57,7 +56,7 @@
57
56
  type="button"
58
57
  @click="togglePassRequest"
59
58
  >
60
- {{ t("LOGIN.FORGOT_PASSWORD_BUTTON") }}
59
+ {{ $t("LOGIN.FORGOT_PASSWORD_BUTTON") }}
61
60
  </VcButton>
62
61
  </div>
63
62
  <div class="vc-login-page__button-container">
@@ -66,7 +65,7 @@
66
65
  class="vc-login-page__submit-button"
67
66
  @click="login"
68
67
  >
69
- {{ t("LOGIN.BUTTON") }}
68
+ {{ $t("LOGIN.BUTTON") }}
70
69
  </vc-button>
71
70
  </div>
72
71
  </VcForm>
@@ -76,28 +75,31 @@
76
75
  >
77
76
  <div class="vc-login-page__separator-line">
78
77
  <!-- TODO add to localization -->
79
- OR
78
+ {{ $t("LOGIN.OR") }}
80
79
  </div>
81
80
 
82
81
  <ExternalProviders :providers="loginProviders" />
83
82
  </div>
84
83
 
85
- <!-- Extensions after form -->
86
- <template
87
- v-for="extension in afterLoginFormExtensions"
88
- :key="extension.id"
84
+ <!-- Simple extension slot -->
85
+ <div
86
+ v-if="hasComponents"
87
+ class="vc-login-page__separator"
89
88
  >
90
- <div class="vc-login-page__extension">
91
- <component :is="extension.component" />
89
+ <div class="vc-login-page__separator-line">
90
+ <!-- TODO add to localization -->
91
+ {{ $t("LOGIN.OR") }}
92
92
  </div>
93
- </template>
93
+
94
+ <ExtensionSlot name="login-after-form" />
95
+ </div>
94
96
  </template>
95
97
  <template v-else>
96
98
  <template v-if="!forgotPasswordRequestSent">
97
- <VcForm @submit.prevent="forgot">
99
+ <VcForm>
98
100
  <Field
99
101
  v-slot="{ field, errorMessage, handleChange, errors }"
100
- :label="t('LOGIN.FIELDS.FORGOT_PASSWORD.LABEL')"
102
+ :label="$t('LOGIN.FIELDS.FORGOT_PASSWORD.LABEL')"
101
103
  name="loginOrEmail"
102
104
  :model-value="forgotPasswordForm.loginOrEmail"
103
105
  rules="required|email"
@@ -107,9 +109,9 @@
107
109
  ref="forgotPasswordField"
108
110
  v-model="forgotPasswordForm.loginOrEmail"
109
111
  class="vc-login-page__input"
110
- :label="t('LOGIN.FIELDS.FORGOT_PASSWORD.LABEL')"
111
- :placeholder="t('LOGIN.FIELDS.FORGOT_PASSWORD.PLACEHOLDER')"
112
- :hint="t('LOGIN.RESET_EMAIL_TEXT')"
112
+ :label="$t('LOGIN.FIELDS.FORGOT_PASSWORD.LABEL')"
113
+ :placeholder="$t('LOGIN.FIELDS.FORGOT_PASSWORD.PLACEHOLDER')"
114
+ :hint="$t('LOGIN.RESET_EMAIL_TEXT')"
113
115
  required
114
116
  :error="!!errors.length"
115
117
  :error-message="errorMessage"
@@ -122,20 +124,20 @@
122
124
  type="button"
123
125
  @click="togglePassRequest"
124
126
  >
125
- {{ t("LOGIN.BACK_BUTTON") }}
127
+ {{ $t("LOGIN.BACK_BUTTON") }}
126
128
  </vc-button>
127
129
  <vc-button
128
130
  :disabled="loading || isDisabled || loadingForgotPassword"
129
131
  @click="forgot"
130
132
  >
131
- {{ t("LOGIN.FORGOT_BUTTON") }}
133
+ {{ $t("LOGIN.FORGOT_BUTTON") }}
132
134
  </vc-button>
133
135
  </div>
134
136
  </VcForm>
135
137
  </template>
136
138
 
137
139
  <template v-if="requestPassResult.succeeded && forgotPasswordRequestSent">
138
- <div>{{ t("LOGIN.RESET_EMAIL_SENT") }}</div>
140
+ <div>{{ $t("LOGIN.RESET_EMAIL_SENT") }}</div>
139
141
  <div class="vc-login-page__button-container">
140
142
  <span
141
143
  v-if="$isDesktop.value"
@@ -145,7 +147,7 @@
145
147
  :disabled="loading"
146
148
  @click="togglePassRequest"
147
149
  >
148
- {{ t("LOGIN.BUTTON_OK") }}
150
+ {{ $t("LOGIN.BUTTON_OK") }}
149
151
  </vc-button>
150
152
  </div>
151
153
  </template>
@@ -180,7 +182,7 @@ import { ExternalSignInProviderInfo, SignInResult } from "./../../../../../core/
180
182
  import { useI18n } from "vue-i18n";
181
183
  import { default as ExternalProviders } from "./../../../../../shared/components/sign-in/external-providers.vue";
182
184
  import { useExternalProvider } from "./../../../../../shared/components/sign-in/useExternalProvider";
183
- import { Extension, ExtensionPoint, extensionsHelperSymbol } from "./../../../../../core/plugins";
185
+ import { ExtensionSlot, useExtensionSlot } from '../../../../../core/plugins/extension-points';
184
186
 
185
187
  type ForgotPasswordFunc = (args: { loginOrEmail: string }) => Promise<void>;
186
188
 
@@ -197,13 +199,13 @@ const router = useRouter();
197
199
 
198
200
  const { validateField } = useForm({ validateOnMount: false });
199
201
  const { uiSettings, loading: customizationLoading } = useSettings();
200
- const { t } = useI18n({ useScope: "global" });
201
202
  let useLogin;
202
203
  const signInResult = ref({ succeeded: true }) as Ref<SignInResult & { status?: number; error?: any }>;
203
204
  const requestPassResult = ref<RequestPasswordResult>({ succeeded: true });
204
205
  const forgotPasswordRequestSent = ref(false);
205
206
  const { signIn, loading, user } = useUserManagement();
206
207
  const { getProviders } = useExternalProvider();
208
+ const { hasComponents } = useExtensionSlot('login-after-form');
207
209
 
208
210
  const isLogin = ref(true);
209
211
  const isValid = useIsFormValid();
@@ -213,12 +215,6 @@ const loadingForgotPassword = ref(false);
213
215
  const loginProviders = ref<ExternalSignInProviderInfo[]>();
214
216
  let forgotPassword: ForgotPasswordFunc;
215
217
 
216
- const extensionsHelper = inject(extensionsHelperSymbol);
217
-
218
- const afterLoginFormExtensions = computed(
219
- (): ExtensionPoint[] => (extensionsHelper?.getOutboundExtensions("login-after-form") as ExtensionPoint[]) || [],
220
- );
221
-
222
218
  if (props.composable && typeof props.composable === "function") {
223
219
  useLogin = props.composable;
224
220
 
@@ -1,7 +1,15 @@
1
- <script lang="ts" setup></script>
2
-
3
1
  <template>
4
- <form>
2
+ <form @submit.prevent="submit">
5
3
  <slot>vc-form</slot>
6
4
  </form>
7
5
  </template>
6
+
7
+ <script lang="ts" setup>
8
+ const emit = defineEmits<{
9
+ (e: 'submit'): void;
10
+ }>()
11
+
12
+ const submit = () => {
13
+ emit('submit');
14
+ }
15
+ </script>
@@ -349,7 +349,6 @@ import { useI18n } from "vue-i18n";
349
349
  import { useKeyboardNavigation } from "../../../../core/composables/useKeyboardNavigation";
350
350
 
351
351
  export type OptionProp<T> = ((option: T) => string) | string | undefined;
352
- export type MaybeArray<T> = T | T[];
353
352
  type FloatingInstanceType = UseFloatingReturn & {
354
353
  middlewareData: {
355
354
  sameWidthChangeBorders: {
@@ -572,7 +571,7 @@ const emit = defineEmits<{
572
571
  * Emitted when the component needs to change the model; Is also used by v-model
573
572
  */
574
573
 
575
- "update:modelValue": [inputValue: MaybeArray<Option> | MaybeArray<string> | null];
574
+ "update:modelValue": [inputValue: Option | Option[] | string | string[] | null];
576
575
  /**
577
576
  * Emitted when user wants to filter a value
578
577
  */