hl-core 0.0.8 → 0.0.9-beta.10

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 (73) hide show
  1. package/api/index.ts +202 -161
  2. package/api/interceptors.ts +23 -17
  3. package/components/Button/Btn.vue +4 -4
  4. package/components/Button/ScrollButtons.vue +2 -2
  5. package/components/Complex/ContentBlock.vue +1 -1
  6. package/components/Complex/MessageBlock.vue +26 -0
  7. package/components/Complex/Page.vue +8 -2
  8. package/components/Complex/WhiteBlock.vue +7 -0
  9. package/components/Dialog/Dialog.vue +9 -39
  10. package/components/Dialog/FamilyDialog.vue +10 -7
  11. package/components/Form/FormBlock.vue +91 -45
  12. package/components/Form/FormSection.vue +5 -2
  13. package/components/Form/FormTextSection.vue +3 -3
  14. package/components/Form/FormToggle.vue +4 -5
  15. package/components/Form/ManagerAttachment.vue +210 -0
  16. package/components/Form/ProductConditionsBlock.vue +70 -16
  17. package/components/Input/Datepicker.vue +45 -0
  18. package/components/Input/EmptyFormField.vue +1 -1
  19. package/components/Input/FileInput.vue +2 -3
  20. package/components/Input/FormInput.vue +31 -7
  21. package/components/Input/PanelInput.vue +7 -2
  22. package/components/Input/RoundedEmptyField.vue +5 -0
  23. package/components/Input/RoundedInput.vue +2 -2
  24. package/components/Input/RoundedSelect.vue +150 -0
  25. package/components/Layout/Drawer.vue +5 -2
  26. package/components/Layout/Header.vue +41 -5
  27. package/components/Layout/Loader.vue +1 -1
  28. package/components/Layout/SettingsPanel.vue +47 -13
  29. package/components/List/ListEmpty.vue +1 -1
  30. package/components/Menu/MenuHover.vue +30 -0
  31. package/components/Menu/MenuNav.vue +30 -14
  32. package/components/Menu/MenuNavItem.vue +10 -7
  33. package/components/Pages/Anketa.vue +68 -47
  34. package/components/Pages/Auth.vue +139 -46
  35. package/components/Pages/ContragentForm.vue +505 -0
  36. package/components/Pages/Documents.vue +11 -11
  37. package/components/Pages/InvoiceInfo.vue +30 -0
  38. package/components/Pages/MemberForm.vue +574 -316
  39. package/components/Pages/ProductAgreement.vue +2 -2
  40. package/components/Pages/ProductConditions.vue +671 -78
  41. package/components/Panel/PanelHandler.vue +309 -0
  42. package/components/Panel/PanelSelectItem.vue +3 -3
  43. package/components/Transitions/SlideTransition.vue +5 -0
  44. package/components/Utilities/Chip.vue +27 -0
  45. package/components/Utilities/IconBorder.vue +17 -0
  46. package/components/Utilities/JsonViewer.vue +27 -0
  47. package/composables/axios.ts +2 -2
  48. package/composables/classes.ts +227 -107
  49. package/composables/constants.ts +31 -51
  50. package/composables/index.ts +106 -2
  51. package/composables/styles.ts +33 -11
  52. package/configs/i18n.ts +15 -0
  53. package/layouts/default.vue +11 -8
  54. package/layouts/full.vue +1 -1
  55. package/locales/ru.json +647 -0
  56. package/nuxt.config.ts +14 -2
  57. package/package.json +35 -12
  58. package/pages/500.vue +4 -4
  59. package/pages/Token.vue +52 -0
  60. package/plugins/helperFunctionsPlugins.ts +11 -6
  61. package/plugins/storePlugin.ts +0 -1
  62. package/plugins/vuetifyPlugin.ts +8 -1
  63. package/store/data.store.ts +2666 -0
  64. package/store/form.store.ts +1 -1
  65. package/store/member.store.ts +164 -52
  66. package/store/rules.ts +193 -0
  67. package/types/enum.ts +83 -0
  68. package/types/env.d.ts +10 -0
  69. package/types/index.ts +279 -8
  70. package/components/Button/BtnIcon.vue +0 -47
  71. package/store/data.store.js +0 -2482
  72. package/store/messages.ts +0 -429
  73. package/store/rules.js +0 -153
@@ -1,13 +1,15 @@
1
- import { AxiosInstance } from 'axios';
1
+ import { AxiosError, AxiosInstance } from 'axios';
2
2
 
3
3
  export default function (axios: AxiosInstance) {
4
4
  axios.interceptors.request.use(
5
5
  request => {
6
6
  const dataStore = useDataStore();
7
- request.headers.Authorization = `Bearer ${dataStore.accessToken}`;
7
+ if (dataStore.accessToken) {
8
+ request.headers.Authorization = `Bearer ${dataStore.accessToken}`;
9
+ }
8
10
  return request;
9
11
  },
10
- error => {
12
+ (error: AxiosError) => {
11
13
  return Promise.reject(error);
12
14
  },
13
15
  );
@@ -15,21 +17,25 @@ export default function (axios: AxiosInstance) {
15
17
  response => {
16
18
  return response;
17
19
  },
18
- error => {
20
+ (error: AxiosError) => {
19
21
  const dataStore = useDataStore();
20
- const router = useRouter();
21
- if (error.response.status === 401) {
22
- dataStore.$reset();
23
- localStorage.clear();
24
- if (dataStore.isEFO) {
25
- router.push({ name: 'Auth', query: { error: 401 } });
26
- } else {
27
- dataStore.sendToParent(constants.postActions.Error401, 401);
28
- }
29
- }
30
- if (error.response.status >= 500) {
31
- if (router.currentRoute.value.name !== 'Auth') {
32
- dataStore.showToaster('error', error.stack, 5000);
22
+ if (!dataStore.isCalculator) {
23
+ const router = useRouter();
24
+ if (error && error.response && error.response.status) {
25
+ if (error.response.status === 401) {
26
+ dataStore.$reset();
27
+ localStorage.clear();
28
+ if (dataStore.isBridge) {
29
+ router.push({ name: 'Auth', query: { error: 401 } });
30
+ } else {
31
+ dataStore.sendToParent(constants.postActions.Error401, 401);
32
+ }
33
+ }
34
+ if (error.response.status >= 500) {
35
+ if (router.currentRoute.value.name !== 'Auth') {
36
+ dataStore.showToaster('error', error.stack ?? dataStore.t('toaster.error'), 5000);
37
+ }
38
+ }
33
39
  }
34
40
  }
35
41
  return Promise.reject(error);
@@ -1,18 +1,18 @@
1
1
  <template>
2
2
  <button
3
3
  type="button"
4
- class="transition-all"
4
+ class="transition-all border-solid"
5
5
  @click="$emit('clicked')"
6
6
  :disabled="disabled || loading"
7
7
  :class="[
8
8
  disabled ? 'disabled' : '',
9
9
  classes,
10
10
  btn,
11
- $libStyles[`btnH${$capitalize(size)}` as keyof typeof $libStyles],
11
+ $styles[`btnH${$capitalize(size)}` as keyof typeof $styles],
12
12
  ]"
13
13
  >
14
- <base-loader v-if="loading" :size="24" color="#FFF" bg-color="" :width="2"></base-loader>
15
- <span v-if="!loading">{{ text }}</span>
14
+ <base-loader v-if="loading" :size="24" color="#FFF" bg-color="" :width="2" />
15
+ <span class="!text-inherit" v-if="!loading">{{ text }}</span>
16
16
  </button>
17
17
  </template>
18
18
 
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div class="absolute bottom-[12%] right-1 flex flex-col gap-4">
3
- <v-btn style="backdrop-filter: blur(5px)" color="#A0B3D8" variant="outlined" icon="mdi mdi-arrow-up" @click="$emit('up')"></v-btn>
4
- <v-btn style="backdrop-filter: blur(5px)" color="#A0B3D8" variant="outlined" icon="mdi mdi-arrow-down" @click="$emit('down')"></v-btn>
3
+ <v-btn style="backdrop-filter: blur(5px)" color="#A0B3D8" variant="outlined" icon="mdi mdi-arrow-up" @click="$emit('up')" />
4
+ <v-btn style="backdrop-filter: blur(5px)" color="#A0B3D8" variant="outlined" icon="mdi mdi-arrow-down" @click="$emit('down')" />
5
5
  </div>
6
6
  </template>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="w-full p-4" :class="[$libStyles.blueBgLight, $libStyles.rounded]">
2
+ <div class="w-full p-4" :class="[$styles.blueBgLight, $styles.rounded]">
3
3
  <slot></slot>
4
4
  </div>
5
5
  </template>
@@ -0,0 +1,26 @@
1
+ <template>
2
+ <div class="text-left p-6" :class="[color, $styles.rounded, $styles.textTitle]">
3
+ <v-icon :icon="icon" class="mr-4"></v-icon>
4
+ {{ text }}
5
+ </div>
6
+ </template>
7
+
8
+ <script lang="ts">
9
+ export default defineComponent({
10
+ name: 'BaseMessageBlock',
11
+ props: {
12
+ text: {
13
+ type: String,
14
+ default: '',
15
+ },
16
+ icon: {
17
+ type: String,
18
+ default: 'mdi-alert',
19
+ },
20
+ color: {
21
+ type: String,
22
+ default: 'bg-rose-500 text-white',
23
+ },
24
+ },
25
+ });
26
+ </script>
@@ -1,6 +1,7 @@
1
1
  <template>
2
- <base-content class="flex-col" :class="[$libStyles.whiteBg]">
2
+ <base-content class="flex-col" :class="[$styles.whiteBg]">
3
3
  <base-header
4
+ v-if="customHeader === false"
4
5
  class="justify-center lg:pl-14"
5
6
  :has-back="hasBack"
6
7
  :back-icon="backIcon"
@@ -9,7 +10,8 @@
9
10
  :title="title"
10
11
  @onBack="$emit('onBack')"
11
12
  @onMore="$emit('onMore')"
12
- ></base-header>
13
+ />
14
+ <slot name="header"></slot>
13
15
  <slot></slot>
14
16
  </base-content>
15
17
  </template>
@@ -37,6 +39,10 @@ export default defineComponent({
37
39
  type: String,
38
40
  default: '',
39
41
  },
42
+ customHeader: {
43
+ type: Boolean,
44
+ default: false,
45
+ },
40
46
  },
41
47
  emits: ['onBack', 'onMore'],
42
48
  });
@@ -0,0 +1,7 @@
1
+ <template>
2
+ <div :class="[$styles.rounded, $styles.whiteBg]" class="p-4 shadow">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts"></script>
@@ -1,17 +1,18 @@
1
1
  <template>
2
- <v-dialog v-model="fieldModel">
2
+ <v-dialog :model-value="modelValue" @update:modelValue="$emit('update:modelValue', $event)" :persistent="true">
3
3
  <v-card class="self-center w-full sm:w-3/4 md:w-2/3 lg:w-2/4 xl:w-[600px] rounded-lg !p-2">
4
4
  <v-card-title>
5
5
  <slot v-if="!title" name="title"></slot>
6
6
  {{ title }}
7
+ <v-btn class="!absolute top-2 right-3" icon="mdi mdi-window-close" variant="plain" @click="$emit('update:modelValue', null)" />
7
8
  </v-card-title>
8
9
  <v-card-subtitle>
9
10
  <slot v-if="!subtitle" name="subtitle"></slot>
10
11
  {{ subtitle }}
11
12
  </v-card-subtitle>
12
- <v-card-actions class="gap-[16px]">
13
- <base-btn v-if="actions === 'default'" class="!w-fit px-6" size="sm" :text="$t('confirm.yes')" :btn="$libStyles.blueBtn" @click="$emit('yes')"></base-btn>
14
- <base-btn v-if="actions === 'default'" class="!w-fit px-6" size="sm" :text="$t('confirm.no')" :btn="$libStyles.blueBtn" @click="$emit('no')" />
13
+ <v-card-actions class="gap-[16px] m-2">
14
+ <base-btn v-if="actions === 'default'" class="!w-fit px-6" size="sm" :text="$dataStore.t('confirm.yes')" :btn="$styles.blueBtn" @click="$emit('yes')" />
15
+ <base-btn v-if="actions === 'default'" class="!w-fit px-6" size="sm" :text="$dataStore.t('confirm.no')" :btn="$styles.blueBtn" @click="$emit('no')" />
15
16
  <slot v-if="actions !== 'default'" name="actions"></slot>
16
17
  </v-card-actions>
17
18
  </v-card>
@@ -27,7 +28,9 @@ export default defineComponent({
27
28
  },
28
29
  title: {
29
30
  type: String,
30
- default: '',
31
+ default() {
32
+ return useDataStore().t('dialog.title');
33
+ },
31
34
  },
32
35
  subtitle: {
33
36
  type: String,
@@ -38,39 +41,6 @@ export default defineComponent({
38
41
  default: 'default',
39
42
  },
40
43
  },
41
- emits: ['update:modelValue', 'submitted', 'yes', 'no'],
42
- setup(props, { emit }) {
43
- const fieldModel = ref(props.modelValue);
44
-
45
- const updateValue = (event: boolean) => {
46
- fieldModel.value = event;
47
- };
48
-
49
- const submitted = (event: any) => {
50
- emit('submitted', event);
51
- };
52
-
53
- watch(
54
- fieldModel,
55
- () => {
56
- emit('update:modelValue', fieldModel.value);
57
- },
58
- { immediate: true },
59
- );
60
-
61
- watch(
62
- () => props.modelValue,
63
- () => {
64
- fieldModel.value = props.modelValue;
65
- },
66
- { immediate: true },
67
- );
68
-
69
- return {
70
- fieldModel,
71
- submitted,
72
- updateValue,
73
- };
74
- },
44
+ emits: ['update:modelValue', 'yes', 'no'],
75
45
  });
76
46
  </script>
@@ -1,24 +1,27 @@
1
1
  <template>
2
2
  <v-list lines="two" v-if="formStore.birthInfos && formStore.birthInfos.length" class="w-full !py-0">
3
- <v-list-item @click="$emit('reset')" :append-icon="selected && Object.keys(selected).length === 0 ? `mdi-radiobox-marked ${$libStyles.greenText}` : 'mdi-radiobox-blank text-[#636363]'">
4
- <v-list-item-title :class="[$libStyles.greenText, $libStyles.textTitle]">{{ $t('form.notChosen') }}</v-list-item-title>
3
+ <v-list-item
4
+ @click="$emit('reset')"
5
+ :append-icon="selected && Object.keys(selected).length === 0 ? `mdi-radiobox-marked ${$styles.greenText}` : 'mdi-radiobox-blank text-[#636363]'"
6
+ >
7
+ <v-list-item-title :class="[$styles.greenText, $styles.textTitle]">{{ $dataStore.t('form.notChosen') }}</v-list-item-title>
5
8
  </v-list-item>
6
9
  <v-list-item
7
10
  v-for="familyMember of formStore.birthInfos"
8
11
  :key="familyMember.childIIN"
9
12
  @click="$emit('selectFamilyMember', familyMember)"
10
- :append-icon="familyMember && selected && selected.childIIN === familyMember.childIIN ? `mdi-radiobox-marked ${$libStyles.greenText}` : 'mdi-radiobox-blank text-[#636363]'"
13
+ :append-icon="familyMember && selected && selected.childIIN === familyMember.childIIN ? `mdi-radiobox-marked ${$styles.greenText}` : 'mdi-radiobox-blank text-[#636363]'"
11
14
  >
12
- <v-list-item-title :class="[$libStyles.greenText, $libStyles.textTitle]">{{
15
+ <v-list-item-title :class="[$styles.greenText, $styles.textTitle]">{{
13
16
  `${familyMember.childSurName} ${familyMember.childName} ${familyMember.childPatronymic ? familyMember.childPatronymic : ''}`
14
17
  }}</v-list-item-title>
15
- <v-list-item-subtitle :class="[$libStyles.textSimple]"
16
- ><span>{{ `${$t('form.iin')}:` }}</span
18
+ <v-list-item-subtitle :class="[$styles.textSimple]"
19
+ ><span>{{ `${$dataStore.t('form.iin')}:` }}</span
17
20
  >{{ ` ${$reformatIin(familyMember.childIIN!)}` }}</v-list-item-subtitle
18
21
  >
19
22
  </v-list-item>
20
23
  </v-list>
21
- <base-list-empty class="w-full" v-else></base-list-empty>
24
+ <base-list-empty class="w-full" v-else />
22
25
  </template>
23
26
 
24
27
  <script lang="ts">
@@ -1,62 +1,91 @@
1
1
  <template>
2
- <div class="pt-3 rounded-lg border-[1px]" :class="[$libStyles.whiteBg]">
2
+ <div class="pt-3 rounded-lg border-[1px]" :class="[$styles.whiteBg, disabled && $styles.disabled]">
3
3
  <div class="ml-5">
4
- <p :class="[$libStyles.textTitle, $libStyles.greenText]">{{ title }}</p>
5
- <p v-if="!!subtitle" :class="[$libStyles.greyText, $libStyles.textSimple]">{{ subtitle }}</p>
4
+ <div class="flex justify-between mr-5">
5
+ <p :class="[$styles.textTitle, $styles.greenText]">{{ title }}</p>
6
+ <div
7
+ v-if="isMultiple && more && !isShort && isActionsAvailable"
8
+ :class="[$styles.blueBg, $styles.whiteText, $styles.textSimple, disabled ? $styles.disabled : 'cursor-pointer']"
9
+ class="lg:flex transition-all rounded-lg h-[36px] flex items-center font-medium justify-center opacity-50 hover:opacity-90 w-[120px]"
10
+ @click="!disabled && memberStore.addMember(whichForm)"
11
+ >
12
+ {{ $dataStore.t('buttons.add') }}
13
+ </div>
14
+ </div>
15
+ <p v-if="!!subtitle" :class="[$styles.greyText, $styles.textSimple]">{{ subtitle }}</p>
6
16
  </div>
7
- <div class="ml-5 mt-6 grid grid-cols-4 md:gap-5 md:grid-cols-4 lg:grid-cols-7 auto-rows-fr items-center">
8
- <span :class="[$libStyles.textSimple]" class="font-medium">{{ $t('form.fullName') }}</span>
9
- <span :class="[$libStyles.textSimple]" class="font-medium">{{ $t('form.iin') }}</span>
10
- <span :class="[$libStyles.textSimple]" class="font-medium hidden lg:block"> {{ $t('form.gender') }}</span>
11
- <span :class="[$libStyles.textSimple]" class="font-medium"> {{ $t('form.birthDate') }} </span>
12
- <span :class="[$libStyles.textSimple]" class="font-medium hidden lg:block">{{ $t('form.Country') }} </span>
13
- <span :class="[$libStyles.textSimple]" class="font-medium hidden lg:block"> {{ $t('code') }}</span>
17
+ <div
18
+ class="ml-5 mt-6 grid auto-rows-fr items-center"
19
+ :class="[isShort ? 'grid-cols-2 md:gap-5 md:grid-cols-2 lg:grid-cols-2 mb-6' : 'grid-cols-4 md:gap-5 md:grid-cols-4 lg:grid-cols-7 ']"
20
+ >
21
+ <span :class="[$styles.textSimple]" class="font-medium">{{ $dataStore.t('form.fullName') }}</span>
22
+ <span :class="[$styles.textSimple]" class="font-medium">{{ $dataStore.t('form.iin') }}</span>
23
+ <span v-if="!isShort" :class="[$styles.textSimple]" class="font-medium hidden lg:block"> {{ $dataStore.t('form.gender') }}</span>
24
+ <span v-if="!isShort" :class="[$styles.textSimple]" class="font-medium"> {{ $dataStore.t('form.birthDate') }} </span>
25
+ <span v-if="!isShort" :class="[$styles.textSimple]" class="font-medium hidden lg:block">{{ $dataStore.t('form.Country') }} </span>
26
+ <span v-if="!isShort" :class="[$styles.textSimple]" class="font-medium hidden lg:block"> {{ $dataStore.t('code') }}</span>
14
27
  </div>
15
- <div v-if="isMultiple" class="ml-5 flex flex-col">
16
- <div v-for="(each, index) of member" :key="index" class="grid grid-cols-4 md:gap-5 md:grid-cols-4 lg:grid-cols-7 auto-rows-fr items-center relative">
17
- <span :class="[getMemberInfo(each).fullName === null && $libStyles.emptyBlockCol]">{{ getMemberInfo(each).fullName }}</span>
18
- <span :class="[getMemberInfo(each).iin === null && $libStyles.emptyBlockCol]">{{ getMemberInfo(each).iin }}</span>
19
- <span :class="[getMemberInfo(each).gender === null && $libStyles.emptyBlockCol]" class="hidden lg:block">{{ getMemberInfo(each).gender }} </span>
20
- <span :class="[getMemberInfo(each).birthDate === null && $libStyles.emptyBlockCol]"> {{ getMemberInfo(each).birthDate }} </span>
21
- <span :class="[getMemberInfo(each).birthPlace === null && $libStyles.emptyBlockCol]" class="hidden lg:block"> {{ getMemberInfo(each).birthPlace }} </span>
22
- <span :class="[getMemberInfo(each).sectorCode === null && $libStyles.emptyBlockCol]" class="hidden lg:block"> {{ getMemberInfo(each).sectorCode }} </span>
28
+ <div v-if="isMultiple && multipleMember !== null" class="ml-5 flex flex-col" :class="[isShort ? 'mb-6' : '']">
29
+ <div
30
+ v-for="(each, index) of multipleMember"
31
+ :key="index"
32
+ class="grid auto-rows-fr items-center relative"
33
+ :class="[isShort ? 'grid-cols-2 md:gap-5 md:grid-cols-2 lg:grid-cols-2' : 'grid-cols-4 md:gap-5 md:grid-cols-4 lg:grid-cols-7']"
34
+ >
35
+ <span :class="[getMemberInfo(each).fullName === null && $styles.emptyBlockCol]">{{ getMemberInfo(each).fullName }}</span>
36
+ <span :class="[getMemberInfo(each).iin === null && $styles.emptyBlockCol]">{{ getMemberInfo(each).iin }}</span>
37
+ <span v-if="!isShort" :class="[getMemberInfo(each).gender === null && $styles.emptyBlockCol]" class="hidden lg:block">{{ getMemberInfo(each).gender }} </span>
38
+ <span v-if="!isShort" :class="[getMemberInfo(each).birthDate === null && $styles.emptyBlockCol]"> {{ getMemberInfo(each).birthDate }} </span>
39
+ <span v-if="!isShort" :class="[getMemberInfo(each).birthPlace === null && $styles.emptyBlockCol]" class="hidden lg:block"> {{ getMemberInfo(each).birthPlace }} </span>
40
+ <span v-if="!isShort" :class="[getMemberInfo(each).sectorCode === null && $styles.emptyBlockCol]" class="hidden lg:block"> {{ getMemberInfo(each).sectorCode }} </span>
23
41
  <div
24
- class="rounded-br-lg transition-all h-[70px] w-[60px] place-self-end cursor-pointer"
25
- :class="[$libStyles.blueBgLight, $libStyles.blueBgLightHover]"
26
- @click="$emit('onMore', { whichForm, index })"
42
+ v-if="!isShort"
43
+ class="rounded-br-lg transition-all h-[70px] w-[60px] place-self-end"
44
+ :class="[$styles.blueBgLight, $styles.blueBgLightHover, disabled ? $styles.disabled : 'cursor-pointer']"
45
+ @click="!disabled && $emit('onMore', { whichForm, index })"
27
46
  >
28
- <i class="mdi mdi-dots-vertical text-xl absolute top-[20px] right-[20px]"> </i>
47
+ <i class="mdi mdi-dots-vertical text-xl absolute top-[20px] right-[20px]"></i>
29
48
  </div>
30
49
  </div>
31
50
  </div>
32
- <div v-else class="ml-5 grid grid-cols-4 md:gap-5 md:grid-cols-4 lg:grid-cols-7 auto-rows-fr items-center relative">
33
- <span :class="[getMemberInfo(member).fullName === null && $libStyles.emptyBlockCol]">{{ getMemberInfo(member).fullName }}</span>
34
- <span :class="[getMemberInfo(member).iin === null && $libStyles.emptyBlockCol]">{{ getMemberInfo(member).iin }}</span>
35
- <span :class="[getMemberInfo(member).gender === null && $libStyles.emptyBlockCol]" class="hidden lg:block">{{ getMemberInfo(member).gender }} </span>
36
- <span :class="[getMemberInfo(member).birthDate === null && $libStyles.emptyBlockCol]"> {{ getMemberInfo(member).birthDate }} </span>
37
- <span :class="[getMemberInfo(member).birthPlace === null && $libStyles.emptyBlockCol]" class="hidden lg:block"> {{ getMemberInfo(member).birthPlace }} </span>
38
- <span :class="[getMemberInfo(member).sectorCode === null && $libStyles.emptyBlockCol]" class="hidden lg:block"> {{ getMemberInfo(member).sectorCode }} </span>
51
+ <div
52
+ v-if="singleMember !== null"
53
+ class="ml-5 grid auto-rows-fr items-center relative"
54
+ :class="[isShort ? 'grid-cols-2 md:gap-5 md:grid-cols-2 lg:grid-cols-2' : 'grid-cols-4 md:gap-5 md:grid-cols-4 lg:grid-cols-7']"
55
+ >
56
+ <span :class="[getMemberInfo(singleMember).fullName === null && $styles.emptyBlockCol]">{{ getMemberInfo(singleMember).fullName }}</span>
57
+ <span :class="[getMemberInfo(singleMember).iin === null && $styles.emptyBlockCol]">{{ getMemberInfo(singleMember).iin }}</span>
58
+ <span v-if="!isShort" :class="[getMemberInfo(singleMember).gender === null && $styles.emptyBlockCol]" class="hidden lg:block">{{ getMemberInfo(singleMember).gender }} </span>
59
+ <span v-if="!isShort" :class="[getMemberInfo(singleMember).birthDate === null && $styles.emptyBlockCol]"> {{ getMemberInfo(singleMember).birthDate }} </span>
60
+ <span v-if="!isShort" :class="[getMemberInfo(singleMember).birthPlace === null && $styles.emptyBlockCol]" class="hidden lg:block">
61
+ {{ getMemberInfo(singleMember).birthPlace }}
62
+ </span>
63
+ <span v-if="!isShort" :class="[getMemberInfo(singleMember).sectorCode === null && $styles.emptyBlockCol]" class="hidden lg:block">
64
+ {{ getMemberInfo(singleMember).sectorCode }}
65
+ </span>
39
66
  <div
40
- class="rounded-br-lg transition-all h-[70px] w-[60px] place-self-end cursor-pointer"
41
- :class="[$libStyles.blueBgLight, $libStyles.blueBgLightHover]"
42
- @click="$emit('onMore', { whichForm })"
67
+ v-if="!isShort"
68
+ class="rounded-br-lg transition-all h-[70px] w-[60px] place-self-end"
69
+ :class="[$styles.blueBgLight, $styles.blueBgLightHover, disabled ? $styles.disabled : 'cursor-pointer']"
70
+ @click="!disabled && $emit('onMore', { whichForm })"
43
71
  >
44
- <i class="mdi mdi-dots-vertical text-xl absolute top-[20px] right-[20px]"> </i>
72
+ <i class="mdi mdi-dots-vertical text-xl absolute top-[20px] right-[20px]"></i>
45
73
  </div>
46
74
  </div>
47
75
  <div
48
- v-if="isMultiple && more"
49
- :class="[$libStyles.blueBg, $libStyles.whiteText, $libStyles.textSimple]"
50
- class="cursor-pointer rounded-b-lg h-[36px] flex items-center font-medium justify-center"
51
- @click="memberStore.addMember(whichForm)"
76
+ v-if="isMultiple && more && !isShort && isActionsAvailable"
77
+ :class="[$styles.blueBg, $styles.whiteText, $styles.textSimple, disabled ? $styles.disabled : 'cursor-pointer']"
78
+ class="lg:hidden transition-all rounded-b-lg h-[36px] flex items-center font-medium justify-center opacity-50 hover:opacity-90"
79
+ @click="!disabled && memberStore.addMember(whichForm)"
52
80
  >
53
- {{ $t('buttons.add') }}
81
+ {{ $dataStore.t('buttons.add') }}
54
82
  </div>
55
83
  </div>
56
84
  </template>
57
85
 
58
86
  <script lang="ts">
59
- import { Member } from '@/composables/classes';
87
+ import { StoreMembers } from '../../types/enum';
88
+ import { Member } from '../../composables/classes';
60
89
 
61
90
  export default defineComponent({
62
91
  props: {
@@ -69,22 +98,36 @@ export default defineComponent({
69
98
  default: '',
70
99
  },
71
100
  whichForm: {
72
- type: String as PropType<MemberFormTypes>,
101
+ type: String as PropType<keyof typeof StoreMembers>,
73
102
  default: '',
74
103
  },
75
104
  more: {
76
105
  type: Boolean,
77
106
  default: false,
78
107
  },
108
+ disabled: {
109
+ type: Boolean,
110
+ default: false,
111
+ },
112
+ type: {
113
+ type: String as PropType<'short' | 'default'>,
114
+ default: 'default',
115
+ },
79
116
  },
80
117
  emits: ['onMore', 'addMember'],
81
118
  setup(props) {
82
- const dataStore = useDataStore();
83
119
  const formStore = useFormStore();
84
120
  const memberStore = useMemberStore();
85
- const multipleMembers = ['insuredForm', 'beneficiaryForm', 'beneficialOwnerForm'];
86
- const isMultiple = ref(multipleMembers.includes(props.whichForm));
87
- const member: Member = formStore[props.whichForm as MemberKeys];
121
+ const isMultiple = computed(() => [StoreMembers.insuredForm, StoreMembers.beneficiaryForm, StoreMembers.beneficialOwnerForm].includes(props.whichForm as StoreMembers));
122
+ const singleMember: Member | null =
123
+ props.whichForm === StoreMembers.policyholderForm || props.whichForm === StoreMembers.policyholdersRepresentativeForm ? formStore[props.whichForm] : null;
124
+ const multipleMember: Member[] | null =
125
+ props.whichForm === StoreMembers.insuredForm || props.whichForm === StoreMembers.beneficiaryForm || props.whichForm === StoreMembers.beneficialOwnerForm
126
+ ? formStore[props.whichForm]
127
+ : null;
128
+
129
+ const isShort = computed(() => props.type === 'short');
130
+ const isActionsAvailable = computed(() => memberStore.isStatementEditible(props.whichForm));
88
131
 
89
132
  const getMemberInfo = (memberData: Member) => {
90
133
  return {
@@ -101,10 +144,13 @@ export default defineComponent({
101
144
  // State
102
145
  formStore,
103
146
  memberStore,
104
- member,
147
+ singleMember,
148
+ multipleMember,
105
149
  isMultiple,
106
150
 
107
151
  // Computed
152
+ isShort,
153
+ isActionsAvailable,
108
154
 
109
155
  // Functions
110
156
  getMemberInfo,
@@ -1,6 +1,9 @@
1
1
  <template>
2
- <section :class="[$libStyles.blueBgLight, $libStyles.rounded]" class="mt-[14px] p-4 flex flex-col gap-[1px]">
3
- <h2 :class="[$libStyles.textTitle]" class="font-medium text-center w-full mb-4">{{ title }}</h2>
2
+ <section :class="[$styles.blueBgLight, $styles.rounded]" class="mt-[14px] p-4 flex flex-col gap-[1px]">
3
+ <h2 :class="[$styles.textTitle]" class="font-medium text-center w-full mb-4">
4
+ {{ title }}
5
+ <slot name="icon"></slot>
6
+ </h2>
4
7
  <slot></slot>
5
8
  </section>
6
9
  </template>
@@ -1,7 +1,7 @@
1
1
  <template>
2
- <div class="flex flex-col justify-between rounded-lg" :class="[$libStyles.whiteBg]">
3
- <span v-if="title" class="p-4" :class="[$libStyles.textTitle]">{{ title }}</span>
4
- <span v-if="subtitle" class="p-4 text-[#99A3B3] border-t-[1px]" :class="[$libStyles.textSimple]">{{ subtitle }}</span>
2
+ <div class="flex flex-col justify-between rounded-lg" :class="[$styles.whiteBg]">
3
+ <span v-if="title" class="p-4" :class="[$styles.textTitle]">{{ title }}</span>
4
+ <span v-if="subtitle" class="p-4 text-[#99A3B3] border-t-[1px]" :class="[$styles.textSimple]">{{ subtitle }}</span>
5
5
  <slot></slot>
6
6
  </div>
7
7
  </template>
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div
3
3
  class="h-[74px] !pl-2 md:!pl-5 flex items-center justify-start gap-4"
4
- :class="[$libStyles.whiteBg, hasBorder ? 'border-[1px] rounded-lg' : 'border-b-[1px] border-b-[#f3f6fc] rounded']"
4
+ :class="[$styles.whiteBg, hasBorder ? 'border-[1px] rounded-lg' : 'border-b-[1px] border-b-[#f3f6fc] rounded']"
5
5
  >
6
6
  <v-switch
7
7
  class="base-toggle"
@@ -13,10 +13,9 @@
13
13
  color="#009C73"
14
14
  hide-details
15
15
  :disabled="disabled"
16
- >
17
- </v-switch>
18
- <p :class="[$libStyles.textSimple]">{{ `${title}` }}</p>
19
- <p class="mr-3" :class="[modelValue ? $libStyles.greenText : '', $libStyles.textSimple]">{{ `${modelValue ? $dataStore.t('confirm.yes') : $dataStore.t('confirm.no')}` }}</p>
16
+ />
17
+ <p :class="[$styles.textSimple]">{{ `${title}` }}</p>
18
+ <p class="mr-3" :class="[modelValue ? $styles.greenText : '', $styles.textSimple]">{{ `${modelValue ? $dataStore.t('confirm.yes') : $dataStore.t('confirm.no')}` }}</p>
20
19
  </div>
21
20
  </template>
22
21