hl-core 0.0.10-beta.3 → 0.0.10-beta.30

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 (50) hide show
  1. package/api/base.api.ts +259 -190
  2. package/api/interceptors.ts +3 -5
  3. package/components/Complex/TextBlock.vue +2 -0
  4. package/components/Dialog/Dialog.vue +7 -1
  5. package/components/Dialog/FamilyDialog.vue +2 -0
  6. package/components/Form/DigitalDocument.vue +52 -0
  7. package/components/Form/DynamicForm.vue +1 -0
  8. package/components/Form/FormData.vue +1 -0
  9. package/components/Form/ManagerAttachment.vue +18 -8
  10. package/components/Form/ProductConditionsBlock.vue +12 -6
  11. package/components/Input/DynamicInput.vue +2 -0
  12. package/components/Input/FormInput.vue +2 -0
  13. package/components/Input/OtpInput.vue +25 -0
  14. package/components/Input/PanelInput.vue +1 -0
  15. package/components/Input/RoundedInput.vue +2 -0
  16. package/components/Input/RoundedSelect.vue +4 -0
  17. package/components/Input/SwitchInput.vue +2 -0
  18. package/components/Input/TextInput.vue +2 -0
  19. package/components/Layout/Drawer.vue +2 -0
  20. package/components/Pages/Anketa.vue +166 -167
  21. package/components/Pages/Auth.vue +2 -0
  22. package/components/Pages/ContragentForm.vue +2 -1
  23. package/components/Pages/Documents.vue +244 -6
  24. package/components/Pages/MemberForm.vue +276 -96
  25. package/components/Pages/ProductConditions.vue +275 -96
  26. package/components/Panel/PanelHandler.vue +236 -108
  27. package/components/Transitions/Animation.vue +2 -0
  28. package/components/Utilities/Chip.vue +3 -1
  29. package/components/Utilities/JsonViewer.vue +1 -2
  30. package/composables/classes.ts +117 -42
  31. package/composables/constants.ts +33 -0
  32. package/composables/fields.ts +6 -4
  33. package/composables/index.ts +243 -7
  34. package/composables/styles.ts +8 -24
  35. package/configs/pwa.ts +1 -7
  36. package/layouts/clear.vue +1 -1
  37. package/layouts/default.vue +1 -1
  38. package/layouts/full.vue +1 -1
  39. package/locales/ru.json +34 -10
  40. package/nuxt.config.ts +10 -13
  41. package/package.json +13 -12
  42. package/plugins/head.ts +2 -1
  43. package/store/data.store.ts +380 -389
  44. package/store/member.store.ts +3 -2
  45. package/store/rules.ts +19 -0
  46. package/tsconfig.json +3 -0
  47. package/types/enum.ts +19 -2
  48. package/types/env.d.ts +2 -2
  49. package/types/form.ts +71 -74
  50. package/types/index.ts +916 -873
@@ -1,181 +1,179 @@
1
1
  <template>
2
- <base-fade-transition>
3
- <section v-if="firstQuestionList && firstQuestionList.length && (isFirstPanelOnRight ? true : !firstPanel) && !secondPanel" class="flex flex-col shrink grow max-h-[90vh]">
4
- <base-form-section v-if="$dataStore.isUnderwriter()" class="mx-[10px]">
5
- <base-rounded-select v-model="filterType" class="w-[200px]" :items="filterItems" :label="$dataStore.t('labels.filter')" hide-details />
6
- </base-form-section>
7
- <section :class="[$styles.blueBgLight, $styles.rounded]" class="mx-[10px] my-[14px] p-4 flex flex-col gap-4">
8
- <base-form-toggle
9
- v-model="answerToAll"
10
- :title="$dataStore.t('questionnaireType.answerAllNo')"
11
- :disabled="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
12
- :has-border="false"
13
- @clicked="handleToggler"
2
+ <section v-if="firstQuestionList && firstQuestionList.length && (isFirstPanelOnRight ? true : !firstPanel) && !secondPanel" class="flex flex-col shrink grow max-h-[85svh]">
3
+ <base-form-section v-if="$dataStore.isUnderwriter()" class="mx-[10px]">
4
+ <base-rounded-select v-model="filterType" class="w-[200px]" :items="filterItems" :label="$dataStore.t('labels.filter')" hide-details />
5
+ </base-form-section>
6
+ <section :class="[$styles.blueBgLight, $styles.rounded]" class="mx-[10px] my-[14px] p-4 flex flex-col gap-4">
7
+ <base-form-toggle
8
+ v-model="answerToAll"
9
+ :title="$dataStore.t('questionnaireType.answerAllNo')"
10
+ :disabled="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
11
+ :has-border="false"
12
+ @clicked="handleToggler"
13
+ />
14
+ </section>
15
+ <v-form ref="vForm" class="grow shrink overflow-y-scroll" @submit="submitForm">
16
+ <section
17
+ v-if="firstQuestionList.filter(i => i.first.definedAnswers === 'N').length"
18
+ :class="[$styles.blueBgLight, $styles.rounded]"
19
+ class="mx-[10px] p-4 flex flex-col gap-4"
20
+ >
21
+ <base-form-input
22
+ v-for="(question, index) in firstQuestionList.filter(i => i.first.definedAnswers === 'N')"
23
+ :key="index"
24
+ v-model="question.first.answerText"
25
+ :label="question.first.name"
26
+ :maska="$maska.threeDigit"
27
+ :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
28
+ :rules="$rules.required"
14
29
  />
15
30
  </section>
16
- <v-form ref="vForm" class="grow shrink overflow-y-scroll" @submit="submitForm">
17
- <section
18
- v-if="firstQuestionList.filter(i => i.first.definedAnswers === 'N').length"
19
- :class="[$styles.blueBgLight, $styles.rounded]"
20
- class="mx-[10px] p-4 flex flex-col gap-4"
21
- >
22
- <base-form-input
23
- v-for="(question, index) in firstQuestionList.filter(i => i.first.definedAnswers === 'N')"
24
- :key="index"
25
- v-model="question.first.answerText"
26
- :label="question.first.name"
27
- :maska="$maska.threeDigit"
28
- :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
29
- :rules="$rules.required"
30
- />
31
- </section>
32
- <section
33
- v-if="firstQuestions.filter(i => i.first.definedAnswers === 'Y').length"
34
- :class="[$styles.blueBgLight, $styles.rounded]"
35
- class="mx-[10px] mt-[14px] p-4 flex flex-col gap-4"
36
- >
37
- <base-form-text-section
38
- v-for="(question, index) in firstQuestions.filter(i => i.first.definedAnswers === 'Y')"
39
- :key="index"
40
- :class="[currentQuestion?.first.id === question.first.id && $dataStore.rightPanel.open ? $styles.greenBorder : '']"
41
- >
42
- <base-animation>
43
- <div
44
- v-if="question.first.answerName === 'Да' && question.second"
45
- :class="[$styles.greenBg, $styles.whiteText, $styles.textSimple]"
46
- class="rounded-t-lg pl-6 py-1 cursor-pointer"
47
- @click="openFirstPanel(question)"
48
- >
49
- {{ $dataStore.t('questionnaireType.pleaseAnswer', { text: question.second.length }) }}
50
- </div>
51
- </base-animation>
52
- <span :class="[$styles.textTitle]" class="border-b-[1px] border-b-[#F3F6FC] p-6 flex items-center justify-between">
53
- {{ question.first.name }}
54
- <base-animation>
55
- <i
56
- v-if="question.first.answerName === 'Да' && question.second && question.second.length"
57
- class="mdi mdi-chevron-right text-2xl cursor-pointer"
58
- @click="openFirstPanel(question)"
59
- ></i>
60
- </base-animation>
61
- </span>
62
- <div class="flex items-center justify-start gap-5 px-4 pt-4" :class="[$styles.textSimple]">
63
- <v-radio-group
64
- v-model="question.first.answerName"
65
- class="anketa-radio"
66
- :true-icon="`mdi-radiobox-marked ${$styles.greenText}`"
67
- false-icon="mdi-radiobox-blank text-[#636363]"
68
- :rules="$rules.required"
69
- :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
70
- inline
71
- >
72
- <v-radio label="Да" value="Да" />
73
- <v-radio label="Нет" value="Нет" />
74
- </v-radio-group>
75
- </div>
76
- </base-form-text-section>
77
- </section>
78
- <section
79
- v-if="firstQuestions.filter(i => i.first.definedAnswers === 'D').length"
80
- :class="[$styles.blueBgLight, $styles.rounded]"
81
- class="mx-[10px] mt-[14px] p-4 flex flex-col gap-4"
31
+ <section
32
+ v-if="firstQuestions.filter(i => i.first.definedAnswers === 'Y').length"
33
+ :class="[$styles.blueBgLight, $styles.rounded]"
34
+ class="mx-[10px] mt-[14px] p-4 flex flex-col gap-4"
35
+ >
36
+ <base-form-text-section
37
+ v-for="(question, index) in firstQuestions.filter(i => i.first.definedAnswers === 'Y')"
38
+ :key="index"
39
+ :class="[currentQuestion?.first.id === question.first.id && $dataStore.rightPanel.open ? $styles.greenBorder : '']"
82
40
  >
83
- <base-form-text-section
84
- v-for="(question, index) in firstQuestions.filter(i => i.first.definedAnswers === 'D')"
85
- :key="index"
86
- :class="[currentQuestion?.first.id === question.first.id && $dataStore.rightPanel.open ? $styles.greenBorder : '']"
87
- >
88
- <span :class="[$styles.textTitle]" class="border-b-[1px] border-b-[#F3F6FC] p-6 flex items-center justify-between"> {{ question.first.name }} </span>
89
- <div class="flex items-center justify-start gap-5 px-4 pt-4" :class="[$styles.textSimple]">
90
- <v-radio-group
91
- v-model="question.first.answerName"
92
- class="anketa-radio"
93
- :true-icon="`mdi-radiobox-marked ${$styles.greenText}`"
94
- false-icon="mdi-radiobox-blank text-[#636363]"
95
- :rules="$rules.required"
96
- :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
97
- inline
98
- >
99
- <v-radio label="Да" value="Да" />
100
- <v-radio label="Нет" value="Нет" />
101
- </v-radio-group>
41
+ <base-animation>
42
+ <div
43
+ v-if="question.first.answerName === 'Да' && question.second"
44
+ :class="[$styles.greenBg, $styles.whiteText, $styles.textSimple]"
45
+ class="rounded-t-lg pl-6 py-1 cursor-pointer"
46
+ @click="openFirstPanel(question)"
47
+ >
48
+ {{ $dataStore.t('questionnaireType.pleaseAnswer', { text: question.second.length }) }}
102
49
  </div>
50
+ </base-animation>
51
+ <span :class="[$styles.textTitle]" class="border-b-[1px] border-b-[#F3F6FC] p-6 flex items-center justify-between">
52
+ {{ question.first.name }}
103
53
  <base-animation>
104
- <div v-if="question.first.answerName === 'Да'" :class="[$styles.whiteText, $styles.textSimple]">
105
- <base-form-input
106
- v-model="question.first.answerText"
107
- :label="$dataStore.t('labels.inDetails')"
108
- :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
109
- :rules="$rules.required"
110
- />
111
- </div>
54
+ <i
55
+ v-if="question.first.answerName === 'Да' && question.second && question.second.length"
56
+ class="mdi mdi-chevron-right text-2xl cursor-pointer"
57
+ @click="openFirstPanel(question)"
58
+ ></i>
112
59
  </base-animation>
113
- </base-form-text-section>
114
- </section>
115
- </v-form>
116
- <div class="px-[14px]">
117
- <base-btn
118
- class="my-[14px] self-center"
119
- :loading="isButtonLoading"
120
- :disabled="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
121
- @click="submitForm"
122
- :text="$dataStore.t('buttons.save')"
123
- />
124
- </div>
125
- </section>
126
- <base-btn
127
- v-if="currentQuestion && currentQuestion.second && currentQuestion.second.length && isFirstPanelOnRight ? false : firstPanel"
128
- class="!absolute z-10 self-center w-[96%] bottom-0"
129
- :text="$dataStore.t('buttons.save')"
130
- @click="submitSecondaryForm"
131
- />
132
- <section
133
- ref="firstPanelSection"
134
- v-if="currentQuestion && currentQuestion.second && isFirstPanelOnRight ? false : firstPanel"
135
- class="flex flex-col px-[10px] pb-[14px]"
136
- :class="[$styles.scrollPage]"
137
- >
138
- <v-form
139
- v-if="currentQuestion"
60
+ </span>
61
+ <div class="flex items-center justify-start gap-5 px-4 pt-4" :class="[$styles.textSimple]">
62
+ <v-radio-group
63
+ v-model="question.first.answerName"
64
+ class="anketa-radio"
65
+ :true-icon="`mdi-radiobox-marked ${$styles.greenText}`"
66
+ false-icon="mdi-radiobox-blank text-[#636363]"
67
+ :rules="$rules.required"
68
+ :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
69
+ inline
70
+ >
71
+ <v-radio label="Да" value="Да" />
72
+ <v-radio label="Нет" value="Нет" />
73
+ </v-radio-group>
74
+ </div>
75
+ </base-form-text-section>
76
+ </section>
77
+ <section
78
+ v-if="firstQuestions.filter(i => i.first.definedAnswers === 'D').length"
140
79
  :class="[$styles.blueBgLight, $styles.rounded]"
141
80
  class="mx-[10px] mt-[14px] p-4 flex flex-col gap-4"
142
- ref="vSecondaryForm"
143
- @submit="submitSecondaryForm"
144
81
  >
145
- <base-form-text-section v-for="question in currentQuestion.second" :title="question.name" :key="question.name">
146
- <div v-if="question.definedAnswers === 'N'">
147
- <base-form-input
148
- v-if="question.answerType === 'T' || question.answerType === 'N'"
149
- v-model="question.answerText"
150
- class="border-t-[1px] border-t-[#F3F6FC]"
151
- :placeholder="$dataStore.t('labels.inputText')"
152
- :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
153
- :rules="isSecondRequired ? $rules.required : []"
154
- />
155
- <base-form-input
156
- v-if="question.answerType === 'D'"
157
- v-model="question.answerText"
158
- class="border-t-[1px] border-t-[#F3F6FC]"
159
- :placeholder="$dataStore.t('form.date')"
82
+ <base-form-text-section
83
+ v-for="(question, index) in firstQuestions.filter(i => i.first.definedAnswers === 'D')"
84
+ :key="index"
85
+ :class="[currentQuestion?.first.id === question.first.id && $dataStore.rightPanel.open ? $styles.greenBorder : '']"
86
+ >
87
+ <span :class="[$styles.textTitle]" class="border-b-[1px] border-b-[#F3F6FC] p-6 flex items-center justify-between"> {{ question.first.name }} </span>
88
+ <div class="flex items-center justify-start gap-5 px-4 pt-4" :class="[$styles.textSimple]">
89
+ <v-radio-group
90
+ v-model="question.first.answerName"
91
+ class="anketa-radio"
92
+ :true-icon="`mdi-radiobox-marked ${$styles.greenText}`"
93
+ false-icon="mdi-radiobox-blank text-[#636363]"
94
+ :rules="$rules.required"
160
95
  :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
161
- :rules="isSecondRequired ? $rules.date : []"
162
- :maska="$maska.date"
163
- append-inner-icon="mdi mdi-calendar-blank-outline"
164
- />
96
+ inline
97
+ >
98
+ <v-radio label="Да" value="Да" />
99
+ <v-radio label="Нет" value="Нет" />
100
+ </v-radio-group>
165
101
  </div>
166
- <base-panel-input
167
- v-else
168
- :class="[$styles.textTitle, $styles.greenText]"
169
- :value="question.answerName ? question.answerName : 'Выбрать вариант ответа'"
170
- :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
171
- :clearable="false"
172
- :error-messages="isSecondRequired ? (question.answerName ? [] : ['Выбрать вариант ответа']) : []"
173
- @click="openSecondPanel(question)"
174
- ></base-panel-input>
102
+ <base-animation>
103
+ <div v-if="question.first.answerName === 'Да'" :class="[$styles.whiteText, $styles.textSimple]">
104
+ <base-form-input
105
+ v-model="question.first.answerText"
106
+ :label="$dataStore.t('labels.inDetails')"
107
+ :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
108
+ :rules="$rules.required"
109
+ />
110
+ </div>
111
+ </base-animation>
175
112
  </base-form-text-section>
176
- </v-form>
177
- </section>
178
- </base-fade-transition>
113
+ </section>
114
+ </v-form>
115
+ <div class="px-[14px]">
116
+ <base-btn
117
+ class="my-[14px] self-center"
118
+ :loading="isButtonLoading"
119
+ :disabled="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
120
+ @click="submitForm"
121
+ :text="$dataStore.t('buttons.save')"
122
+ />
123
+ </div>
124
+ </section>
125
+ <base-btn
126
+ v-if="currentQuestion && currentQuestion.second && currentQuestion.second.length && isFirstPanelOnRight ? false : firstPanel"
127
+ class="!absolute z-10 self-center w-[96%] bottom-0"
128
+ :text="$dataStore.t('buttons.save')"
129
+ @click="submitSecondaryForm"
130
+ />
131
+ <section
132
+ ref="firstPanelSection"
133
+ v-if="currentQuestion && currentQuestion.second && isFirstPanelOnRight ? false : firstPanel"
134
+ class="flex flex-col px-[10px] pb-[14px]"
135
+ :class="[$styles.scrollPage]"
136
+ >
137
+ <v-form
138
+ v-if="currentQuestion"
139
+ :class="[$styles.blueBgLight, $styles.rounded]"
140
+ class="mx-[10px] mt-[14px] p-4 flex flex-col gap-4"
141
+ ref="vSecondaryForm"
142
+ @submit="submitSecondaryForm"
143
+ >
144
+ <base-form-text-section v-for="question in currentQuestion.second" :title="question.name" :key="question.name">
145
+ <div v-if="question.definedAnswers === 'N'">
146
+ <base-form-input
147
+ v-if="question.answerType === 'T' || question.answerType === 'N'"
148
+ v-model="question.answerText"
149
+ class="border-t-[1px] border-t-[#F3F6FC]"
150
+ :placeholder="$dataStore.t('labels.inputText')"
151
+ :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
152
+ :rules="isSecondRequired ? $rules.required : []"
153
+ />
154
+ <base-form-input
155
+ v-if="question.answerType === 'D'"
156
+ v-model="question.answerText"
157
+ class="border-t-[1px] border-t-[#F3F6FC]"
158
+ :placeholder="$dataStore.t('form.date')"
159
+ :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
160
+ :rules="isSecondRequired ? $rules.date : []"
161
+ :maska="$maska.date"
162
+ append-inner-icon="mdi mdi-calendar-blank-outline"
163
+ />
164
+ </div>
165
+ <base-panel-input
166
+ v-else
167
+ :class="[$styles.textTitle, $styles.greenText]"
168
+ :value="question.answerName ? question.answerName : 'Выбрать вариант ответа'"
169
+ :readonly="formStore.isDisabled[whichSurvey] || !$dataStore.isTask()"
170
+ :clearable="false"
171
+ :error-messages="isSecondRequired ? (question.answerName ? [] : ['Выбрать вариант ответа']) : []"
172
+ @click="openSecondPanel(question)"
173
+ ></base-panel-input>
174
+ </base-form-text-section>
175
+ </v-form>
176
+ </section>
179
177
  <Teleport v-if="secondPanel" to="#right-panel-actions">
180
178
  <div :class="[$styles.scrollPage]" class="flex flex-col items-center">
181
179
  <base-rounded-input v-model="searchQuery" :label="$dataStore.t('labels.search')" class="w-full p-2" :hide-details="true" />
@@ -234,11 +232,12 @@
234
232
  </v-form>
235
233
  </div>
236
234
  </Teleport>
237
- <base-scroll-buttons v-if="firstQuestionList && firstQuestionList.length" @up="scrollForm('up')" @down="scrollForm('down')" />
235
+ <base-scroll-buttons v-if="firstQuestionList && firstQuestionList.length" class="bottom-[20%]" @up="scrollForm('up')" @down="scrollForm('down')" />
238
236
  </template>
239
237
 
240
238
  <script lang="ts">
241
239
  import { Value } from '../../composables/classes';
240
+ import type { AnketaBody, AnketaSecond, AnswerName } from '../../types';
242
241
 
243
242
  export default defineComponent({
244
243
  setup() {
@@ -274,7 +273,7 @@ export default defineComponent({
274
273
  const currentSecond = ref<AnketaSecond>();
275
274
  const isPanelLoading = ref<boolean>(false);
276
275
  const searchQuery = ref<string>('');
277
- const isFirstPanelOnRight = dataStore.isUnderwriter() && !useEnv().isProduction;
276
+ const isFirstPanelOnRight = dataStore.isUnderwriter();
278
277
 
279
278
  const whichMember = computed(() => ('member' in route.query && !!route.query.member ? (route.query.member as 'insured' | 'policyholder') : 'insured'));
280
279
  const isSecondRequired = computed(() => dataStore.controls.isSecondAnketaRequired);
@@ -125,6 +125,8 @@
125
125
  </template>
126
126
 
127
127
  <script lang="ts">
128
+ import type { InputTypes } from '../../types';
129
+
128
130
  export default defineComponent({
129
131
  setup() {
130
132
  const route = useRoute();
@@ -124,7 +124,7 @@
124
124
  <base-form-input v-model.trim="member.registrationStreet" :rules="$rules.required" :label="$dataStore.t('form.Street')" :readonly="disabled" :clearable="!disabled" />
125
125
  <base-form-input
126
126
  v-model.trim="member.registrationNumberHouse"
127
- :rules="$rules.required"
127
+ :rules="[...$rules.required, $rules.lengthLimit(member.registrationNumberHouse, 10)]"
128
128
  :label="$dataStore.t('form.NumberHouse')"
129
129
  :readonly="disabled"
130
130
  :clearable="!disabled"
@@ -289,6 +289,7 @@
289
289
  <script lang="ts">
290
290
  import { StoreMembers } from '../../types/enum';
291
291
  import { Member, Value } from '../../composables/classes';
292
+ import type { ESBDValidationType } from '../../types';
292
293
 
293
294
  export default defineComponent({
294
295
  props: {