hl-core 0.0.7 → 0.0.8-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 (70) hide show
  1. package/.prettierrc +2 -1
  2. package/api/index.ts +562 -0
  3. package/api/interceptors.ts +38 -0
  4. package/components/Button/Btn.vue +57 -0
  5. package/components/Button/BtnIcon.vue +47 -0
  6. package/components/Button/ScrollButtons.vue +6 -0
  7. package/components/Button/SortArrow.vue +21 -0
  8. package/components/Complex/Content.vue +5 -0
  9. package/components/Complex/ContentBlock.vue +5 -0
  10. package/components/Complex/Page.vue +43 -0
  11. package/components/Dialog/Dialog.vue +76 -0
  12. package/components/Dialog/FamilyDialog.vue +39 -0
  13. package/components/Form/FormBlock.vue +139 -0
  14. package/components/Form/FormSection.vue +18 -0
  15. package/components/Form/FormTextSection.vue +20 -0
  16. package/components/Form/FormToggle.vue +52 -0
  17. package/components/Form/ManagerAttachment.vue +196 -0
  18. package/components/Form/ProductConditionsBlock.vue +72 -0
  19. package/components/Input/Datepicker.vue +41 -0
  20. package/components/Input/EmptyFormField.vue +5 -0
  21. package/components/Input/FileInput.vue +71 -0
  22. package/components/Input/FormInput.vue +183 -0
  23. package/components/Input/PanelInput.vue +133 -0
  24. package/components/Input/RoundedInput.vue +143 -0
  25. package/components/Layout/Drawer.vue +45 -0
  26. package/components/Layout/Header.vue +48 -0
  27. package/components/Layout/Loader.vue +35 -0
  28. package/components/Layout/SettingsPanel.vue +48 -0
  29. package/components/List/ListEmpty.vue +22 -0
  30. package/components/Menu/MenuNav.vue +108 -0
  31. package/components/Menu/MenuNavItem.vue +37 -0
  32. package/components/Pages/Anketa.vue +341 -0
  33. package/components/Pages/Auth.vue +91 -0
  34. package/components/Pages/Documents.vue +108 -0
  35. package/components/Pages/MemberForm.vue +1229 -0
  36. package/components/Pages/ProductAgreement.vue +18 -0
  37. package/components/Pages/ProductConditions.vue +659 -0
  38. package/components/Panel/PanelHandler.vue +233 -0
  39. package/components/Panel/PanelItem.vue +5 -0
  40. package/components/Panel/PanelSelectItem.vue +20 -0
  41. package/components/Transitions/FadeTransition.vue +5 -0
  42. package/components/Transitions/SlideTransition.vue +5 -0
  43. package/composables/axios.ts +11 -0
  44. package/composables/classes.ts +1179 -0
  45. package/composables/constants.ts +71 -0
  46. package/composables/index.ts +168 -2
  47. package/composables/styles.ts +48 -8
  48. package/configs/i18n.ts +19 -0
  49. package/layouts/clear.vue +3 -0
  50. package/layouts/default.vue +75 -0
  51. package/layouts/full.vue +6 -0
  52. package/locales/en.json +403 -0
  53. package/locales/kz.json +403 -0
  54. package/locales/ru.json +403 -0
  55. package/nuxt.config.ts +39 -5
  56. package/package.json +28 -10
  57. package/pages/500.vue +85 -0
  58. package/plugins/helperFunctionsPlugins.ts +19 -2
  59. package/plugins/storePlugin.ts +5 -7
  60. package/plugins/vuetifyPlugin.ts +15 -0
  61. package/store/data.store.js +2291 -8
  62. package/store/form.store.ts +8 -0
  63. package/store/member.store.ts +381 -0
  64. package/store/rules.js +52 -39
  65. package/tailwind.config.js +10 -0
  66. package/types/index.ts +317 -0
  67. package/app.vue +0 -3
  68. package/components/Button/GreenBtn.vue +0 -33
  69. package/store/app.store.js +0 -12
  70. package/store/messages.ts +0 -310
@@ -0,0 +1,6 @@
1
+ <template>
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>
5
+ </div>
6
+ </template>
@@ -0,0 +1,21 @@
1
+ <template>
2
+ <i
3
+ class="transition-all mdi mdi-menu-down text-2xl"
4
+ :class="[$dataStore.isColumnAsc[sortKey] === false ? 'mdi-rotate-180' : '']"
5
+ :style="{
6
+ opacity: $dataStore.isColumnAsc[sortKey] === null ? 0 : 1,
7
+ }"
8
+ ></i>
9
+ </template>
10
+
11
+ <script>
12
+ export default {
13
+ name: 'BaseSortArrow',
14
+ props: {
15
+ sortKey: {
16
+ type: String,
17
+ default: null,
18
+ },
19
+ },
20
+ };
21
+ </script>
@@ -0,0 +1,5 @@
1
+ <template>
2
+ <aside class="w-full lg:flex lg:w-3/4">
3
+ <slot></slot>
4
+ </aside>
5
+ </template>
@@ -0,0 +1,5 @@
1
+ <template>
2
+ <div class="w-full p-4" :class="[$libStyles.blueBgLight, $libStyles.rounded]">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
@@ -0,0 +1,43 @@
1
+ <template>
2
+ <base-content class="flex-col" :class="[$libStyles.whiteBg]">
3
+ <base-header
4
+ class="justify-center lg:pl-14"
5
+ :has-back="hasBack"
6
+ :back-icon="backIcon"
7
+ :has-more="hasMore"
8
+ :more-icon="moreIcon"
9
+ :title="title"
10
+ @onBack="$emit('onBack')"
11
+ @onMore="$emit('onMore')"
12
+ ></base-header>
13
+ <slot></slot>
14
+ </base-content>
15
+ </template>
16
+
17
+ <script lang="ts">
18
+ export default defineComponent({
19
+ props: {
20
+ hasBack: {
21
+ type: Boolean,
22
+ default: false,
23
+ },
24
+ backIcon: {
25
+ type: String,
26
+ default: 'mdi-arrow-left',
27
+ },
28
+ hasMore: {
29
+ type: Boolean,
30
+ default: false,
31
+ },
32
+ moreIcon: {
33
+ type: String,
34
+ default: 'mdi-cog-outline',
35
+ },
36
+ title: {
37
+ type: String,
38
+ default: '',
39
+ },
40
+ },
41
+ emits: ['onBack', 'onMore'],
42
+ });
43
+ </script>
@@ -0,0 +1,76 @@
1
+ <template>
2
+ <v-dialog v-model="fieldModel">
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
+ <v-card-title>
5
+ <slot v-if="!title" name="title"></slot>
6
+ {{ title }}
7
+ </v-card-title>
8
+ <v-card-subtitle>
9
+ <slot v-if="!subtitle" name="subtitle"></slot>
10
+ {{ subtitle }}
11
+ </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')" />
15
+ <slot v-if="actions !== 'default'" name="actions"></slot>
16
+ </v-card-actions>
17
+ </v-card>
18
+ </v-dialog>
19
+ </template>
20
+ <script lang="ts">
21
+ export default defineComponent({
22
+ name: 'BaseDialog',
23
+ props: {
24
+ modelValue: {
25
+ type: Boolean,
26
+ default: false,
27
+ },
28
+ title: {
29
+ type: String,
30
+ default: '',
31
+ },
32
+ subtitle: {
33
+ type: String,
34
+ default: '',
35
+ },
36
+ actions: {
37
+ type: String,
38
+ default: 'default',
39
+ },
40
+ },
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
+ },
75
+ });
76
+ </script>
@@ -0,0 +1,39 @@
1
+ <template>
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>
5
+ </v-list-item>
6
+ <v-list-item
7
+ v-for="familyMember of formStore.birthInfos"
8
+ :key="familyMember.childIIN"
9
+ @click="$emit('selectFamilyMember', familyMember)"
10
+ :append-icon="familyMember && selected && selected.childIIN === familyMember.childIIN ? `mdi-radiobox-marked ${$libStyles.greenText}` : 'mdi-radiobox-blank text-[#636363]'"
11
+ >
12
+ <v-list-item-title :class="[$libStyles.greenText, $libStyles.textTitle]">{{
13
+ `${familyMember.childSurName} ${familyMember.childName} ${familyMember.childPatronymic ? familyMember.childPatronymic : ''}`
14
+ }}</v-list-item-title>
15
+ <v-list-item-subtitle :class="[$libStyles.textSimple]"
16
+ ><span>{{ `${$t('form.iin')}:` }}</span
17
+ >{{ ` ${$reformatIin(familyMember.childIIN!)}` }}</v-list-item-subtitle
18
+ >
19
+ </v-list-item>
20
+ </v-list>
21
+ <base-list-empty class="w-full" v-else></base-list-empty>
22
+ </template>
23
+
24
+ <script lang="ts">
25
+ export default defineComponent({
26
+ props: {
27
+ selected: {
28
+ type: Object as PropType<BirthInfoGKB>,
29
+ },
30
+ },
31
+ emits: ['selectFamilyMember', 'reset'],
32
+ setup() {
33
+ const formStore = useFormStore();
34
+ return {
35
+ formStore,
36
+ };
37
+ },
38
+ });
39
+ </script>
@@ -0,0 +1,139 @@
1
+ <template>
2
+ <div class="pt-3 rounded-lg border-[1px]" :class="[$libStyles.whiteBg, disabled && $libStyles.disabled]">
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>
6
+ </div>
7
+ <div
8
+ class="ml-5 mt-6 grid auto-rows-fr items-center"
9
+ :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 ']"
10
+ >
11
+ <span :class="[$libStyles.textSimple]" class="font-medium">{{ $t('form.fullName') }}</span>
12
+ <span :class="[$libStyles.textSimple]" class="font-medium">{{ $t('form.iin') }}</span>
13
+ <span v-if="!isShort" :class="[$libStyles.textSimple]" class="font-medium hidden lg:block"> {{ $t('form.gender') }}</span>
14
+ <span v-if="!isShort" :class="[$libStyles.textSimple]" class="font-medium"> {{ $t('form.birthDate') }} </span>
15
+ <span v-if="!isShort" :class="[$libStyles.textSimple]" class="font-medium hidden lg:block">{{ $t('form.Country') }} </span>
16
+ <span v-if="!isShort" :class="[$libStyles.textSimple]" class="font-medium hidden lg:block"> {{ $t('code') }}</span>
17
+ </div>
18
+ <div v-if="isMultiple" class="ml-5 flex flex-col" :class="[isShort ? 'mb-6' : '']">
19
+ <div
20
+ v-for="(each, index) of member"
21
+ :key="index"
22
+ class="grid auto-rows-fr items-center relative"
23
+ :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']"
24
+ >
25
+ <span :class="[getMemberInfo(each).fullName === null && $libStyles.emptyBlockCol]">{{ getMemberInfo(each).fullName }}</span>
26
+ <span :class="[getMemberInfo(each).iin === null && $libStyles.emptyBlockCol]">{{ getMemberInfo(each).iin }}</span>
27
+ <span v-if="!isShort" :class="[getMemberInfo(each).gender === null && $libStyles.emptyBlockCol]" class="hidden lg:block">{{ getMemberInfo(each).gender }} </span>
28
+ <span v-if="!isShort" :class="[getMemberInfo(each).birthDate === null && $libStyles.emptyBlockCol]"> {{ getMemberInfo(each).birthDate }} </span>
29
+ <span v-if="!isShort" :class="[getMemberInfo(each).birthPlace === null && $libStyles.emptyBlockCol]" class="hidden lg:block"> {{ getMemberInfo(each).birthPlace }} </span>
30
+ <span v-if="!isShort" :class="[getMemberInfo(each).sectorCode === null && $libStyles.emptyBlockCol]" class="hidden lg:block"> {{ getMemberInfo(each).sectorCode }} </span>
31
+ <div
32
+ v-if="!isShort"
33
+ class="rounded-br-lg transition-all h-[70px] w-[60px] place-self-end"
34
+ :class="[$libStyles.blueBgLight, $libStyles.blueBgLightHover, disabled ? $libStyles.disabled : 'cursor-pointer']"
35
+ @click="!disabled && $emit('onMore', { whichForm, index })"
36
+ >
37
+ <i class="mdi mdi-dots-vertical text-xl absolute top-[20px] right-[20px]"> </i>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ <div
42
+ v-else
43
+ class="ml-5 grid auto-rows-fr items-center relative"
44
+ :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']"
45
+ >
46
+ <span :class="[getMemberInfo(member).fullName === null && $libStyles.emptyBlockCol]">{{ getMemberInfo(member).fullName }}</span>
47
+ <span :class="[getMemberInfo(member).iin === null && $libStyles.emptyBlockCol]">{{ getMemberInfo(member).iin }}</span>
48
+ <span v-if="!isShort" :class="[getMemberInfo(member).gender === null && $libStyles.emptyBlockCol]" class="hidden lg:block">{{ getMemberInfo(member).gender }} </span>
49
+ <span v-if="!isShort" :class="[getMemberInfo(member).birthDate === null && $libStyles.emptyBlockCol]"> {{ getMemberInfo(member).birthDate }} </span>
50
+ <span v-if="!isShort" :class="[getMemberInfo(member).birthPlace === null && $libStyles.emptyBlockCol]" class="hidden lg:block"> {{ getMemberInfo(member).birthPlace }} </span>
51
+ <span v-if="!isShort" :class="[getMemberInfo(member).sectorCode === null && $libStyles.emptyBlockCol]" class="hidden lg:block"> {{ getMemberInfo(member).sectorCode }} </span>
52
+ <div
53
+ v-if="!isShort"
54
+ class="rounded-br-lg transition-all h-[70px] w-[60px] place-self-end"
55
+ :class="[$libStyles.blueBgLight, $libStyles.blueBgLightHover, disabled ? $libStyles.disabled : 'cursor-pointer']"
56
+ @click="!disabled && $emit('onMore', { whichForm })"
57
+ >
58
+ <i class="mdi mdi-dots-vertical text-xl absolute top-[20px] right-[20px]"> </i>
59
+ </div>
60
+ </div>
61
+ <div
62
+ v-if="isMultiple && more && !isShort"
63
+ :class="[$libStyles.blueBg, $libStyles.whiteText, $libStyles.textSimple, disabled ? $libStyles.disabled : 'cursor-pointer']"
64
+ class="rounded-b-lg h-[36px] flex items-center font-medium justify-center"
65
+ @click="!disabled && memberStore.addMember(whichForm)"
66
+ >
67
+ {{ $t('buttons.add') }}
68
+ </div>
69
+ </div>
70
+ </template>
71
+
72
+ <script lang="ts">
73
+ import { Member } from '@/composables/classes';
74
+
75
+ export default defineComponent({
76
+ props: {
77
+ title: {
78
+ type: String,
79
+ default: '',
80
+ },
81
+ subtitle: {
82
+ type: String,
83
+ default: '',
84
+ },
85
+ whichForm: {
86
+ type: String as PropType<MemberFormTypes>,
87
+ default: '',
88
+ },
89
+ more: {
90
+ type: Boolean,
91
+ default: false,
92
+ },
93
+ disabled: {
94
+ type: Boolean,
95
+ default: false,
96
+ },
97
+ type: {
98
+ type: String as PropType<'short' | 'default'>,
99
+ default: 'default',
100
+ },
101
+ },
102
+ emits: ['onMore', 'addMember'],
103
+ setup(props) {
104
+ const dataStore = useDataStore();
105
+ const formStore = useFormStore();
106
+ const memberStore = useMemberStore();
107
+ const multipleMembers = ['insuredForm', 'beneficiaryForm', 'beneficialOwnerForm'];
108
+ const isMultiple = ref(multipleMembers.includes(props.whichForm));
109
+ const member: Member = formStore[props.whichForm as MemberKeys];
110
+
111
+ const isShort = computed(() => props.type === 'short');
112
+
113
+ const getMemberInfo = (memberData: Member) => {
114
+ return {
115
+ fullName: computed(() => (memberData && memberData.getFullNameShorted() ? memberData.getFullNameShorted() : null)).value,
116
+ iin: computed(() => (memberData && memberData.iin ? memberData.iin : null)).value,
117
+ gender: computed(() => (memberData && memberData.gender.nameRu ? (memberData.gender.nameRu as string).charAt(0) : null)).value,
118
+ birthDate: computed(() => (memberData && memberData.birthDate ? memberData.birthDate : null)).value,
119
+ birthPlace: computed(() => (memberData && memberData.birthPlace.nameRu ? (memberData.birthPlace.nameRu as string).substring(0, 3) : null)).value,
120
+ sectorCode: computed(() => (memberData && memberData.economySectorCode.ids ? (memberData.economySectorCode.ids as string).slice(-1) : null)).value,
121
+ };
122
+ };
123
+
124
+ return {
125
+ // State
126
+ formStore,
127
+ memberStore,
128
+ member,
129
+ isMultiple,
130
+
131
+ // Computed
132
+ isShort,
133
+
134
+ // Functions
135
+ getMemberInfo,
136
+ };
137
+ },
138
+ });
139
+ </script>
@@ -0,0 +1,18 @@
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>
4
+ <slot></slot>
5
+ </section>
6
+ </template>
7
+
8
+ <script lang="ts">
9
+ export default defineComponent({
10
+ props: {
11
+ title: {
12
+ type: String,
13
+ default: 'Заголовок',
14
+ required: true,
15
+ },
16
+ },
17
+ });
18
+ </script>
@@ -0,0 +1,20 @@
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>
5
+ <slot></slot>
6
+ </div>
7
+ </template>
8
+
9
+ <script lang="ts">
10
+ export default defineComponent({
11
+ props: {
12
+ title: {
13
+ type: String,
14
+ },
15
+ subtitle: {
16
+ type: String,
17
+ },
18
+ },
19
+ });
20
+ </script>
@@ -0,0 +1,52 @@
1
+ <template>
2
+ <div
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']"
5
+ >
6
+ <v-switch
7
+ class="base-toggle"
8
+ :model-value="modelValue"
9
+ @update:modelValue="
10
+ $emit('update:modelValue', $event);
11
+ $emit('clicked');
12
+ "
13
+ color="#009C73"
14
+ hide-details
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 ? $t('confirm.yes') : $t('confirm.no')}` }}</p>
20
+ </div>
21
+ </template>
22
+
23
+ <script lang="ts">
24
+ export default defineComponent({
25
+ props: {
26
+ modelValue: {
27
+ type: Boolean,
28
+ default: '',
29
+ },
30
+ title: {
31
+ type: String,
32
+ default: '',
33
+ },
34
+ disabled: {
35
+ type: Boolean,
36
+ default: false,
37
+ },
38
+ hasBorder: {
39
+ type: Boolean,
40
+ default: true,
41
+ },
42
+ },
43
+ emits: ['update:modelValue', 'clicked'],
44
+ });
45
+ </script>
46
+
47
+ <style>
48
+ .v-input.base-toggle {
49
+ width: fit-content;
50
+ flex: unset !important;
51
+ }
52
+ </style>
@@ -0,0 +1,196 @@
1
+ <template>
2
+ <div class="rounded-lg border-[1px]" :class="[$libStyles.whiteBg, disabled && $libStyles.disabled]">
3
+ <div class="mt-3 ml-5">
4
+ <p :class="[$libStyles.textTitle, $libStyles.greenText]">{{ $t('form.attachManager') }}</p>
5
+ </div>
6
+ <v-form ref="vForm" class="flex flex-col mt-1">
7
+ <base-panel-input
8
+ class="pl-1"
9
+ v-model="formStore.SaleChanellPolicy"
10
+ :value="formStore.SaleChanellPolicy.nameRu"
11
+ :readonly="isReadonly"
12
+ :clearable="!isReadonly"
13
+ :label="$t('form.salesChanell')"
14
+ :rules="$rules.objectRequired"
15
+ append-inner-icon="mdi mdi-chevron-right"
16
+ @append="openPanel('SaleChanellPolicy', $t('form.salesChanell'))"
17
+ ></base-panel-input>
18
+ <base-panel-input
19
+ class="pl-1"
20
+ v-model="formStore.RegionPolicy"
21
+ :value="formStore.RegionPolicy.nameRu"
22
+ :readonly="isReadonly"
23
+ :clearable="!isReadonly"
24
+ :label="$t('form.Region')"
25
+ :rules="$rules.objectRequired"
26
+ append-inner-icon="mdi mdi-chevron-right"
27
+ @append="openPanel('RegionPolicy', $t('form.Region'))"
28
+ ></base-panel-input>
29
+ <base-panel-input
30
+ class="pl-1"
31
+ v-model="formStore.ManagerPolicy"
32
+ :value="formStore.ManagerPolicy.nameRu"
33
+ :readonly="isReadonly"
34
+ :clearable="!isReadonly"
35
+ :label="$t('form.manager')"
36
+ :rules="$rules.objectRequired"
37
+ append-inner-icon="mdi mdi-chevron-right"
38
+ @append="openPanel('ManagerPolicy', $t('form.manager'))"
39
+ ></base-panel-input>
40
+ <base-panel-input
41
+ class="pl-1"
42
+ v-model="formStore.AgentData"
43
+ :value="formStore.AgentData.fullName"
44
+ :readonly="isReadonly"
45
+ :clearable="!isReadonly"
46
+ :label="$t('form.agent')"
47
+ :rules="$rules.agentDataRequired"
48
+ append-inner-icon="mdi mdi-chevron-right"
49
+ @append="openPanel('AgentData', $t('form.agent'))"
50
+ ></base-panel-input>
51
+ </v-form>
52
+ <Teleport v-if="isPanelOpen" to="#panel-actions">
53
+ <div :class="[$libStyles.scrollPage]" class="flex flex-col items-center">
54
+ <base-rounded-input
55
+ v-model="searchQuery"
56
+ :label="$t('labels.search')"
57
+ class="w-full p-2"
58
+ :hide-details="true"
59
+ :append-inner-icon="currentDictName === 'AgentData' ? 'mdi mdi-magnify' : ''"
60
+ @append="searchAgent"
61
+ ></base-rounded-input>
62
+ <div v-if="dictList && isPanelLoading === false" class="w-full flex flex-col gap-2 p-2">
63
+ <div v-for="(item, index) in dictList" :key="item.id">
64
+ <base-panel-select-item
65
+ :key="index"
66
+ :text="currentDictName === 'AgentData' ? item.fullName : (item.nameRu as string)"
67
+ :selected="currentDictName === 'AgentData' ? item.fullName === panelValue.fullName : item.nameRu === panelValue.nameRu"
68
+ @click="pickPanelValue(item)"
69
+ ></base-panel-select-item>
70
+ </div>
71
+ </div>
72
+ <base-loader v-if="isPanelLoading" class="absolute mt-10" :size="50"></base-loader>
73
+ </div>
74
+ </Teleport>
75
+ </div>
76
+ </template>
77
+
78
+ <script lang="ts">
79
+ import { Value } from '@/composables/classes';
80
+
81
+ export default defineComponent({
82
+ props: {
83
+ title: {
84
+ type: String,
85
+ default: '',
86
+ },
87
+ disabled: {
88
+ type: Boolean,
89
+ default: false,
90
+ },
91
+ },
92
+ setup(props) {
93
+ const route = useRoute();
94
+ const dataStore = useDataStore();
95
+ const formStore = useFormStore();
96
+ const isPanelOpen = ref<boolean>(false);
97
+ const isPanelLoading = ref<boolean>(false);
98
+ const panelValue = ref<Value & AgentData>(new Value());
99
+ const searchQuery = ref<string>('');
100
+ const currentDictName = ref<string>();
101
+
102
+ const dictList = computed(() => {
103
+ if (!currentDictName.value) {
104
+ return [];
105
+ }
106
+ if (currentDictName.value === 'AgentData') {
107
+ return dataStore[currentDictName.value];
108
+ } else {
109
+ // @ts-ignore
110
+ return dataStore[currentDictName.value].filter((item: Value) => {
111
+ // @ts-ignore
112
+ return item.nameRu ? item.nameRu.toLowerCase().includes(searchQuery.value.toLowerCase()) : item.fullName.toLowerCase().includes(searchQuery.value.toLowerCase());
113
+ });
114
+ }
115
+ });
116
+ const isReadonly = computed(
117
+ () =>
118
+ props.disabled ||
119
+ route.params.taskId === '0' ||
120
+ (route.params.taskId !== '0' && (!dataStore.isProcessEditable(formStore.applicationData.statusCode) || !dataStore.isTask())),
121
+ );
122
+
123
+ const openPanel = async (currentDict: string, title: string) => {
124
+ searchQuery.value = '';
125
+ if (dataStore.isTask() && !props.disabled) {
126
+ dataStore.panelAction = null;
127
+ dataStore.panel.open = true;
128
+ dataStore.panel.title = title;
129
+ currentDictName.value = currentDict;
130
+
131
+ if (currentDict === 'ManagerPolicy') {
132
+ isPanelLoading.value = true;
133
+ await dataStore.filterManagerByRegion(formStore.RegionPolicy?.ids);
134
+ }
135
+
136
+ isPanelOpen.value = true;
137
+ panelValue.value = formStore[currentDict as keyof typeof formStore];
138
+ isPanelLoading.value = false;
139
+ } else {
140
+ dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
141
+ }
142
+ };
143
+
144
+ const searchAgent = async () => {
145
+ if (searchQuery.value) {
146
+ isPanelLoading.value = true;
147
+ await dataStore.searchAgentByName(searchQuery.value);
148
+ isPanelLoading.value = false;
149
+ }
150
+ };
151
+
152
+ const pickPanelValue = (answer: any) => {
153
+ // @ts-ignore
154
+ formStore[currentDictName.value] = answer;
155
+ isPanelOpen.value = false;
156
+ dataStore.panel.open = false;
157
+ searchQuery.value = '';
158
+ };
159
+
160
+ watch(searchQuery, () => {
161
+ if (searchQuery.value === null) {
162
+ searchQuery.value = '';
163
+ }
164
+ });
165
+
166
+ watch(
167
+ () => formStore.RegionPolicy,
168
+ (val, oldVal) => {
169
+ if (val.ids !== oldVal.ids) {
170
+ formStore.ManagerPolicy = new Value();
171
+ }
172
+ },
173
+ );
174
+
175
+ return {
176
+ // State
177
+ formStore,
178
+ isPanelOpen,
179
+ isPanelLoading,
180
+ panelValue,
181
+ searchQuery,
182
+ Value,
183
+ currentDictName,
184
+
185
+ // Computed
186
+ dictList,
187
+ isReadonly,
188
+
189
+ // Functions
190
+ openPanel,
191
+ searchAgent,
192
+ pickPanelValue,
193
+ };
194
+ },
195
+ });
196
+ </script>