hl-core 0.0.9-beta.9 → 0.0.10-beta.2

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 (72) hide show
  1. package/api/base.api.ts +1109 -0
  2. package/api/index.ts +2 -620
  3. package/api/interceptors.ts +38 -1
  4. package/components/Button/Btn.vue +1 -6
  5. package/components/Complex/MessageBlock.vue +1 -1
  6. package/components/Complex/Page.vue +1 -1
  7. package/components/Complex/TextBlock.vue +23 -0
  8. package/components/Dialog/Dialog.vue +70 -16
  9. package/components/Dialog/FamilyDialog.vue +1 -1
  10. package/components/Form/DynamicForm.vue +100 -0
  11. package/components/Form/FormBlock.vue +12 -3
  12. package/components/Form/FormData.vue +110 -0
  13. package/components/Form/FormSection.vue +3 -3
  14. package/components/Form/FormTextSection.vue +11 -3
  15. package/components/Form/FormToggle.vue +25 -5
  16. package/components/Form/ManagerAttachment.vue +177 -89
  17. package/components/Form/ProductConditionsBlock.vue +59 -6
  18. package/components/Input/Datepicker.vue +43 -7
  19. package/components/Input/DynamicInput.vue +23 -0
  20. package/components/Input/FileInput.vue +25 -5
  21. package/components/Input/FormInput.vue +7 -4
  22. package/components/Input/Monthpicker.vue +34 -0
  23. package/components/Input/PanelInput.vue +5 -1
  24. package/components/Input/RoundedSelect.vue +7 -2
  25. package/components/Input/SwitchInput.vue +64 -0
  26. package/components/Input/TextInput.vue +160 -0
  27. package/components/Layout/Drawer.vue +16 -4
  28. package/components/Layout/Header.vue +23 -2
  29. package/components/Layout/Loader.vue +2 -1
  30. package/components/Layout/SettingsPanel.vue +24 -11
  31. package/components/Menu/InfoMenu.vue +35 -0
  32. package/components/Menu/MenuNav.vue +25 -3
  33. package/components/Pages/Anketa.vue +254 -65
  34. package/components/Pages/Auth.vue +56 -9
  35. package/components/Pages/ContragentForm.vue +9 -9
  36. package/components/Pages/Documents.vue +266 -30
  37. package/components/Pages/InvoiceInfo.vue +1 -1
  38. package/components/Pages/MemberForm.vue +774 -102
  39. package/components/Pages/ProductAgreement.vue +1 -8
  40. package/components/Pages/ProductConditions.vue +1132 -180
  41. package/components/Panel/PanelHandler.vue +626 -49
  42. package/components/Panel/PanelSelectItem.vue +17 -2
  43. package/components/Panel/RightPanelCloser.vue +7 -0
  44. package/components/Transitions/Animation.vue +28 -0
  45. package/components/Utilities/JsonViewer.vue +3 -2
  46. package/components/Utilities/Qr.vue +44 -0
  47. package/composables/axios.ts +1 -0
  48. package/composables/classes.ts +501 -14
  49. package/composables/constants.ts +126 -6
  50. package/composables/fields.ts +328 -0
  51. package/composables/index.ts +355 -20
  52. package/composables/styles.ts +23 -6
  53. package/configs/pwa.ts +63 -0
  54. package/layouts/clear.vue +21 -0
  55. package/layouts/default.vue +62 -3
  56. package/layouts/full.vue +21 -0
  57. package/locales/ru.json +558 -16
  58. package/nuxt.config.ts +11 -15
  59. package/package.json +37 -39
  60. package/pages/Token.vue +0 -13
  61. package/plugins/head.ts +26 -0
  62. package/plugins/vuetifyPlugin.ts +1 -5
  63. package/store/data.store.ts +1610 -321
  64. package/store/extractStore.ts +17 -0
  65. package/store/form.store.ts +13 -1
  66. package/store/member.store.ts +1 -1
  67. package/store/rules.ts +97 -3
  68. package/store/toast.ts +1 -1
  69. package/types/enum.ts +81 -0
  70. package/types/env.d.ts +2 -0
  71. package/types/form.ts +94 -0
  72. package/types/index.ts +419 -24
@@ -0,0 +1,34 @@
1
+ <template>
2
+ <vue-date-picker
3
+ :model-value="modelValue"
4
+ :clearable="false"
5
+ :disabled="disabled"
6
+ :reaonly="readonly"
7
+ month-picker
8
+ locale="ru"
9
+ format="MM.yyyy"
10
+ :teleport="true"
11
+ :close-on-scroll="true"
12
+ cancel-text="Отменить"
13
+ select-text="Выбрать"
14
+ @update:modelValue="$emit('update:modelValue', $event)"
15
+ />
16
+ </template>
17
+
18
+ <script lang="ts">
19
+ export default defineComponent({
20
+ props: {
21
+ modelValue: {
22
+ required: false,
23
+ },
24
+ disabled: {
25
+ type: Boolean,
26
+ default: false,
27
+ },
28
+ readonly: {
29
+ type: Boolean,
30
+ default: false,
31
+ },
32
+ },
33
+ });
34
+ </script>
@@ -24,7 +24,7 @@
24
24
  :suffix="suffix"
25
25
  @keyup.enter.prevent="submitted"
26
26
  @click:control="!props.readonly && $emit('append')"
27
- @click:clear="(props.readonly ? false : clearable) && $emit('update:modelValue', new Value())"
27
+ @click:clear="(props.readonly ? false : clearable) && $emit('update:modelValue', clearValue)"
28
28
  @click:append="!props.readonly && $emit('append-out')"
29
29
  @click:prepend="!props.readonly && $emit('prepend-out')"
30
30
  @click:append-inner="!props.readonly && $emit('append')"
@@ -50,6 +50,10 @@ export default defineComponent({
50
50
  type: Boolean,
51
51
  default: false,
52
52
  },
53
+ clearValue: {
54
+ type: Object,
55
+ default: new Value(),
56
+ },
53
57
  clearable: {
54
58
  type: Boolean,
55
59
  default: true,
@@ -7,7 +7,7 @@
7
7
  :placeholder="placeholder"
8
8
  :label="label"
9
9
  :variant="variant"
10
- :density="(density as any)"
10
+ :density="density"
11
11
  :menu-icon="menuIcon"
12
12
  :clear-icon="clearIcon"
13
13
  :color="color"
@@ -21,6 +21,7 @@
21
21
  :append-inner-icon="appendInnerIcon ? appendInnerIcon : ''"
22
22
  :bg-color="bgColor ? bgColor : ''"
23
23
  :items="items"
24
+ :hide-details="hideDetails"
24
25
  @click:append="!props.readonly && $emit('append-out')"
25
26
  @click:prepend="!props.readonly && $emit('prepend-out')"
26
27
  @click:append-inner="!props.readonly && $emit('append')"
@@ -81,9 +82,13 @@ export default defineComponent({
81
82
  default: 'solo',
82
83
  },
83
84
  density: {
84
- type: String,
85
+ type: String as PropType<any>,
85
86
  default: 'compact',
86
87
  },
88
+ hideDetails: {
89
+ type: Boolean,
90
+ default: false,
91
+ },
87
92
  color: {
88
93
  type: String,
89
94
  default: '#009c73',
@@ -0,0 +1,64 @@
1
+ <template>
2
+ <div class="base-switch-input p-4 bg-white rounded-lg mb-3">
3
+ <v-switch v-model="field.modelValue" v-bind="switchProps" />
4
+ </div>
5
+ </template>
6
+
7
+ <script lang="ts">
8
+ export default defineComponent({
9
+ name: 'asSwitchInput',
10
+ props: {
11
+ field: {
12
+ type: Object as PropType<SwitchInput>,
13
+ required: true,
14
+ },
15
+ },
16
+ setup(props) {
17
+ const switchProps = computed(() => {
18
+ return {
19
+ label: props.field.label,
20
+ direction: props.field.direction,
21
+ disabled: props.field.disabled,
22
+ hideDetails: true,
23
+ color: '#009C73',
24
+ };
25
+ });
26
+ return { switchProps };
27
+ },
28
+ });
29
+ </script>
30
+
31
+ <style>
32
+ .base-switch-input .v-switch label {
33
+ font-size: 14px !important;
34
+ font-weight: 400 !important;
35
+ line-height: 20px !important;
36
+ opacity: 1 !important;
37
+ }
38
+ .base-switch-input .v-switch__track {
39
+ background: white !important;
40
+ border: 1.1px solid #e5e5ea;
41
+ height: 19px !important;
42
+ width: 100px !important;
43
+ border-radius: 16px;
44
+ overflow: hidden;
45
+ }
46
+
47
+ .base-switch-input .switch-block .v-input--horizontal {
48
+ grid-template-areas: unset !important;
49
+ }
50
+
51
+ .base-switch-input .v-switch__thumb {
52
+ color: white;
53
+ width: 20px;
54
+ height: 20px;
55
+ }
56
+
57
+ .base-switch-input .v-selection-control--dirty .v-switch__track {
58
+ background: #009c73 !important;
59
+ }
60
+
61
+ .base-switch-input .v-switch .v-selection-control {
62
+ min-height: unset !important;
63
+ }
64
+ </style>
@@ -0,0 +1,160 @@
1
+ <template>
2
+ <div class="base-text-input flex justify-between items-center pr-4 mb-[1px] bg-[#fff]" @click="$emit('onClickField')">
3
+ <v-text-field v-model="control.modelValue" v-bind="textFieldProps" v-maska="mask">
4
+ <div v-if="hasSuffix" class="absolute top-[27px] left-[18px] flex items-center justify-center">
5
+ <p class="opacity-0 inline-block mr-[2px]">{{ control.modelValue }}</p>
6
+ <span>{{ suffix }}</span>
7
+ </div>
8
+ </v-text-field>
9
+ <v-icon v-if="control.iconName" :icon="`mdi cursor-pointer ${iconsList[control.iconName]}`" color="#A0B3D8" />
10
+ <vue-date-picker v-if="control.maska === 'date'" v-model="control.modelValue" v-bind="datePickerProps" @update:modelValue="$emit('update:modelValue', $event)">
11
+ <template #trigger>
12
+ <v-icon icon="mdi mdi-calendar-blank-outline cursor-pointer" color="#a0b3d8" />
13
+ </template>
14
+ </vue-date-picker>
15
+ </div>
16
+ </template>
17
+
18
+ <script lang="ts">
19
+ const iconsList: { [key: string]: string } = {
20
+ arrowRight: 'mdi-chevron-right',
21
+ search: 'mdi-magnify',
22
+ sms: 'mdi-message-text',
23
+ clear: 'mdi-close',
24
+ };
25
+
26
+ const suffixList: { [key: string]: string } = {
27
+ kzt: '₸',
28
+ usd: '$',
29
+ percent: '%',
30
+ };
31
+
32
+ export default defineComponent({
33
+ props: {
34
+ control: {
35
+ type: Object as PropType<InputType>,
36
+ required: true,
37
+ },
38
+ },
39
+ setup(props) {
40
+ const mask = computed(() => (props.control.maska ? useMask()[props.control.maska] : ''));
41
+ const dataStore = useDataStore();
42
+
43
+ const textFieldProps = computed(() => {
44
+ return {
45
+ label: props.control.label,
46
+ placeholder: props.control.placeholder,
47
+ disabled: props.control.disabled,
48
+ maxLength: props.control.maxLength,
49
+ readonly: props.control.readonly || props.control.iconName === 'arrowRight',
50
+ };
51
+ });
52
+
53
+ const datePickerProps = computed(() => {
54
+ return {
55
+ locale: 'ru',
56
+ flow: ['calendar'],
57
+ modelType: 'dd.MM.yyyy',
58
+ enableTimePicker: false,
59
+ clearable: false,
60
+ disabled: props.control.disabled,
61
+ readonly: props.control.readonly,
62
+ selectText: 'Выбрать',
63
+ cancelText: 'Закрыть',
64
+ closeOnScroll: true,
65
+ transitions: false,
66
+ teleport: true,
67
+ sixWeeks: true,
68
+ };
69
+ });
70
+
71
+ const hasSuffix = computed(() => {
72
+ return props.control.suffix && props.control.type === 'number' && props.control.modelValue;
73
+ });
74
+
75
+ const suffix = computed(() => {
76
+ return hasSuffix.value ? suffixList[props.control.suffix!] : '';
77
+ });
78
+
79
+ const onClickIcon = async () => {
80
+ if (props.control.fetchFrom) {
81
+ dataStore.rightPanel.open = true;
82
+ dataStore.rightPanel.title = 'test panel name';
83
+ }
84
+ };
85
+
86
+ return {
87
+ // State
88
+ datePickerProps,
89
+ textFieldProps,
90
+ hasSuffix,
91
+ mask,
92
+ suffix,
93
+ iconsList,
94
+ // Functions
95
+ onClickIcon,
96
+ };
97
+ },
98
+ });
99
+ </script>
100
+ <style>
101
+ .base-text-input .v-field__append-inner i {
102
+ color: #a0b3d8 !important;
103
+ margin-left: 10px;
104
+ margin-right: 4px;
105
+ }
106
+ .base-text-input .v-field__append-inner {
107
+ margin-top: 12px;
108
+ cursor: pointer;
109
+ padding-right: 6px;
110
+ }
111
+ .base-text-input .v-field__outline,
112
+ .base-text-input .v-field__overlay,
113
+ .base-text-input .v-field__loader {
114
+ display: none !important;
115
+ }
116
+
117
+ .base-text-input .v-input__prepend {
118
+ padding-top: 0;
119
+ display: flex;
120
+ align-items: center;
121
+ }
122
+ .base-text-input .v-field__append-inner {
123
+ display: flex;
124
+ padding: 0;
125
+ align-items: center;
126
+ justify-content: center;
127
+ }
128
+
129
+ .base-text-input .v-file-input {
130
+ padding: 0px;
131
+ }
132
+ .base-text-input .v-messages,
133
+ .base-text-input .v-messages__message,
134
+ .base-text-input .v-input__details {
135
+ min-height: unset !important;
136
+ }
137
+ .base-text-input .v-messages__message {
138
+ transition: all 0.5s;
139
+ margin-bottom: 10px;
140
+ }
141
+ .base-text-input .v-input__details {
142
+ padding-bottom: 0 !important;
143
+ padding-top: 0 !important;
144
+ }
145
+ .base-text-input .dp__action_buttons button {
146
+ padding: 6px 9px;
147
+ height: unset;
148
+ }
149
+ .base-text-input .dp__action_select {
150
+ background: #a0b3d8;
151
+ color: white;
152
+ }
153
+ .base-text-input .dp__action_select:hover {
154
+ background: #97acd6;
155
+ }
156
+ .base-text-input .dp__active_date,
157
+ .base-text-input .dp__overlay_cell_active {
158
+ background: #a0b3d8;
159
+ }
160
+ </style>
@@ -2,9 +2,14 @@
2
2
  <v-navigation-drawer
3
3
  v-model="$dataStore[whichPanel].open"
4
4
  :temporary="$dataStore[whichPanel].overlay"
5
- location="right"
6
- class="sm:!w-[400px] lg:!relative !right-0"
7
- :class="[$dataStore[whichPanel].overlay ? 'lg:!hidden' : '', $dataStore[whichPanel].open ? '!w-full lg:!w-[420px]' : 'lg:!w-[0px]']"
5
+ :location="side"
6
+ class="sm:!w-[400px]"
7
+ :class="[
8
+ $dataStore[whichPanel].overlay ? 'lg:!hidden' : '',
9
+ $dataStore[whichPanel].open ? '!w-full lg:!w-1/4' : 'lg:!w-[0px]',
10
+ side === 'left' ? '!left-0 !absolute' : '!right-0',
11
+ side === 'right' && $dataStore[whichPanel].open ? 'lg:!relative' : '',
12
+ ]"
8
13
  :disable-resize-watcher="true"
9
14
  :disable-route-watcher="true"
10
15
  >
@@ -12,7 +17,10 @@
12
17
  <div v-if="$dataStore.panelAction === null" class="flex flex-col" id="panel-actions">
13
18
  <slot></slot>
14
19
  </div>
15
- <base-panel-handler v-else @task="$emit('task', $event)" />
20
+ <div v-if="side === 'right'" class="flex flex-col" id="right-panel-actions">
21
+ <slot></slot>
22
+ </div>
23
+ <base-panel-handler v-if="side === 'left' && whichPanel === 'panel'" @task="$emit('task', $event)" />
16
24
  <slot name="panel"></slot>
17
25
  </v-navigation-drawer>
18
26
  </template>
@@ -29,6 +37,10 @@ export default defineComponent({
29
37
  type: String as PropType<PanelTypes>,
30
38
  default: 'panel',
31
39
  },
40
+ side: {
41
+ type: String as PropType<'left' | 'right'>,
42
+ default: 'left',
43
+ },
32
44
  },
33
45
  emits: ['task'],
34
46
  setup(props) {
@@ -1,7 +1,14 @@
1
1
  <template>
2
- <header class="relative w-full h-[70px] text-center font-medium align-middle flex items-center border-b-[1px]" :class="[$styles.blueBgLight, $styles.textSimple]">
2
+ <header class="relative w-full min-h-[70px] text-center font-medium align-middle flex items-center border-b-[1px]" :class="[$styles.blueBgLight, $styles.textSimple]">
3
3
  <i v-if="hasBack" @click="$emit('onBack')" class="absolute left-5 mdi text-xl cursor-pointer transition-all" :class="[backIcon, backIconAnim]"></i>
4
4
  <span class="mx-10">{{ title }}</span>
5
+ <i
6
+ v-if="hasInfo && infoItems && infoItems.length && infoItems.filter(i => (typeof i.show === 'boolean' ? i.show : true)).length"
7
+ class="mdi text-xl cursor-pointer transition-all opacity-70"
8
+ :class="[infoIcon, $styles.blueText]"
9
+ >
10
+ <base-info-menu :options="infoItems" @clicked="$dataStore.copyToClipboard($event, false)" />
11
+ </i>
5
12
  <i
6
13
  v-if="hasMore"
7
14
  @click="$emit('onMore')"
@@ -13,6 +20,8 @@
13
20
  </template>
14
21
 
15
22
  <script lang="ts">
23
+ import { MenuItem } from '../../composables/classes';
24
+
16
25
  export default defineComponent({
17
26
  props: {
18
27
  hasBack: {
@@ -33,7 +42,19 @@ export default defineComponent({
33
42
  },
34
43
  moreIcon: {
35
44
  type: String,
36
- default: 'mdi-cog-outline',
45
+ default: 'mdi-dots-vertical',
46
+ },
47
+ hasInfo: {
48
+ type: Boolean,
49
+ default: false,
50
+ },
51
+ infoIcon: {
52
+ type: String,
53
+ default: '',
54
+ },
55
+ infoItems: {
56
+ type: Array as PropType<Array<MenuItem>>,
57
+ default: [],
37
58
  },
38
59
  title: {
39
60
  type: String,
@@ -28,7 +28,8 @@ export default defineComponent({
28
28
  },
29
29
  bgColor: {
30
30
  type: String,
31
- default: '#009C73',
31
+ default:
32
+ import.meta.env.VITE_PRODUCT === 'auletti' || import.meta.env.VITE_PARENT_PRODUCT === 'auletti' || import.meta.env.VITE_PRODUCT === 'lka-auletti' ? '#1B1918' : '#009c73',
32
33
  },
33
34
  },
34
35
  });
@@ -9,11 +9,15 @@
9
9
  <v-text-field v-model="$dataStore.user.fullName" :readonly="true" hide-details variant="plain" :label="$dataStore.user.roles?.join(', ')" />
10
10
  <i class="mdi mdi-account-outline text-2xl text-[#A0B3D8]"></i
11
11
  ></base-panel-item>
12
- <base-panel-item v-if="$dataStore.isEFO && !isProduction && $dataStore.accessToken" @click="changeBridge('lka', $dataStore.accessToken)" class="cursor-pointer">
12
+ <base-panel-item
13
+ v-if="$dataStore.accessToken && (($dataStore.isEFO && $dataStore.hasAccess().toLKA) || ($dataStore.isAULETTI && $dataStore.hasAccess().toLKA_A))"
14
+ @click="changeBridge('lka', $dataStore.accessToken)"
15
+ class="cursor-pointer"
16
+ >
13
17
  {{ $dataStore.t('labels.lkaLong') }}
14
18
  <i class="mdi mdi-chevron-right text-2xl text-[#A0B3D8]"></i
15
19
  ></base-panel-item>
16
- <base-panel-item v-if="$dataStore.isLKA && $dataStore.accessToken" @click="changeBridge('efo', $dataStore.accessToken)" class="cursor-pointer">
20
+ <base-panel-item v-if="($dataStore.isLKA || $dataStore.isLKA_A) && $dataStore.accessToken" @click="changeBridge('efo', $dataStore.accessToken)" class="cursor-pointer">
17
21
  {{ $dataStore.t('labels.efoLong') }}
18
22
  <i class="mdi mdi-web text-2xl text-[#A0B3D8]"></i
19
23
  ></base-panel-item>
@@ -30,18 +34,25 @@
30
34
  {{ $dataStore.t('historyStatementsAndStatuses') }}
31
35
  <i class="mdi mdi-history text-xl text-[#A0B3D8]"></i>
32
36
  </base-panel-item>
37
+ <base-panel-item v-if="hasFAQ" @click="$router.push({ name: 'FAQ' })" class="cursor-pointer">
38
+ FAQ
39
+ <i class="mdi mdi-help text-xl text-[#A0B3D8]"></i>
40
+ </base-panel-item>
33
41
  <base-panel-item @click="dialogSignOut = true" class="cursor-pointer" :class="[$styles.redText]">
34
42
  {{ $dataStore.t('buttons.logout') }}
35
43
  <i class="mdi mdi-logout text-xl"></i>
36
44
  </base-panel-item>
37
- <div v-if="$dataStore.settings.open && 'version' in pkg && pkg.version" class="absolute bottom-2 w-full flex items-center justify-center opacity-30 text-sm">
38
- <p>{{ pkg.version }}</p>
45
+ <div v-if="$dataStore.settings.open" class="absolute bottom-4 w-full flex flex-col items-center opacity-30 text-sm">
46
+ <p v-if="'version' in pkg && pkg.version">{{ pkg.version }}</p>
47
+ <p v-if="commitVersion">{{ `Current: #${commitVersion}` }}</p>
48
+ <p v-if="$dataStore.projectConfig">{{ `Latest: #${$dataStore.projectConfig.version}` }}</p>
39
49
  </div>
40
50
  <base-dialog
41
51
  v-model="dialogSignOut"
42
- :title="$dataStore.t('dialog.exit')"
43
- :subtitle="$dataStore.t('dialog.dataWillClear')"
44
- actions="default"
52
+ :title="$dataStore.t('dialog.confirmExit')"
53
+ :subtitle="$dataStore.t('dialog.exit') + $dataStore.t('dialog.dataWillClear')"
54
+ :confirm="$dataStore.t('confirm.exit')"
55
+ :icon="{ mdi: 'exit-to-app', color: '#FD2D39' }"
45
56
  @yes="logoutUser"
46
57
  @no="dialogSignOut = false"
47
58
  />
@@ -54,6 +65,8 @@ import { changeBridge } from '#imports';
54
65
  import pkg from '../../package.json';
55
66
  const dialogSignOut = ref(false);
56
67
  const dataStore = useDataStore();
68
+ const router = useRouter();
69
+ const commitVersion = String(import.meta.env.VITE_COMMIT_VERSION ?? '');
57
70
 
58
71
  const handleFontSize = (action: 'increase' | 'decrease') => {
59
72
  if (action === 'increase' && dataStore.fontSize < 24) dataStore.fontSize += 2;
@@ -70,13 +83,13 @@ const logoutUser = async () => {
70
83
  await dataStore.logoutUser();
71
84
  };
72
85
 
73
- const isProduction = import.meta.env.VITE_MODE === 'production';
74
-
75
86
  const hasHistory = computed(() => {
76
- return !dataStore.isLKA;
87
+ return !dataStore.isLKA && !dataStore.isLKA_A;
77
88
  });
78
89
 
90
+ const hasFAQ = computed(() => router.hasRoute('FAQ') && !dataStore.isAULETTI && !dataStore.isAulettiParent);
91
+
79
92
  const openHistory = async () => {
80
- dataStore.sendToParent(constants.postActions.toStatementHistory, dataStore.isBridge ? '' : dataStore.product);
93
+ dataStore.sendToParent(constants.postActions.toStatementHistory, dataStore.isBridge || dataStore.isDSO || dataStore.isUU ? '' : dataStore.product);
81
94
  };
82
95
  </script>
@@ -0,0 +1,35 @@
1
+ <template>
2
+ <v-menu
3
+ v-if="options && options.length && options.filter(i => (typeof i.show === 'boolean' ? i.show : true)).length"
4
+ open-on-click
5
+ activator="parent"
6
+ :close-on-content-click="false"
7
+ transition="scale-transition"
8
+ >
9
+ <base-form-text-section class="p-1 border-[1px] flex flex-col gap-3 elevation-3 w-[250px]">
10
+ <v-list lines="two" density="compact" class="!p-0">
11
+ <v-list-item v-for="(option, index) of options.filter(i => (typeof i.show === 'boolean' ? i.show : true))" :key="index" class="!px-3">
12
+ <v-list-item-title :class="[$styles.greenText]">{{ option.title }}</v-list-item-title>
13
+ <v-list-item-subtitle class="!opacity-50">{{ option.description }}</v-list-item-subtitle>
14
+ <template v-slot:append>
15
+ <v-btn color="#faae17" :icon="option.icon ? option.icon : 'mdi-content-copy'" variant="text" size="small" @click="$emit('clicked', option.title)"></v-btn>
16
+ </template>
17
+ </v-list-item>
18
+ </v-list>
19
+ </base-form-text-section>
20
+ </v-menu>
21
+ </template>
22
+
23
+ <script lang="ts">
24
+ import { MenuItem } from '../../composables/classes';
25
+
26
+ export default defineComponent({
27
+ emits: ['clicked'],
28
+ props: {
29
+ options: {
30
+ type: Array as PropType<Array<MenuItem>>,
31
+ default: [],
32
+ },
33
+ },
34
+ });
35
+ </script>
@@ -6,7 +6,10 @@
6
6
  :has-back="hasBack"
7
7
  :back-icon="backIcon"
8
8
  :has-more="hasMore"
9
- :hide-more-on-lg="hideOnLg"
9
+ :has-info="hasInfo"
10
+ :info-icon="infoIcon"
11
+ :info-items="infoItems"
12
+ :hide-more-on-lg="false"
10
13
  :more-icon="moreIcon"
11
14
  @onBack="$emit('onBack')"
12
15
  @onMore="$emit('onMore')"
@@ -47,12 +50,19 @@
47
50
  </div></div
48
51
  ></base-fade-transition>
49
52
  </section>
53
+ <base-text-block
54
+ v-if="$dataStore.showDisabledMessage"
55
+ class="opacity-70 absolute bottom-6 left-0 right-0 ml-auto mr-auto z-[100]"
56
+ :class="[$styles.redBorder]"
57
+ :icon="{ mdi: 'mdi-alert-circle-outline', color: '#FD2D39' }"
58
+ :text="$dataStore.t('toaster.viewError')"
59
+ />
50
60
  </aside>
51
61
  </template>
52
62
 
53
63
  <script lang="ts">
54
64
  import { MenuItem } from '../../composables/classes';
55
- import { RouteLocationNormalized } from 'vue-router';
65
+ import { type RouteLocationNormalized } from 'vue-router';
56
66
 
57
67
  export default defineComponent({
58
68
  props: {
@@ -68,6 +78,18 @@ export default defineComponent({
68
78
  type: Boolean,
69
79
  default: false,
70
80
  },
81
+ hasInfo: {
82
+ type: Boolean,
83
+ default: false,
84
+ },
85
+ infoIcon: {
86
+ type: String,
87
+ default: '',
88
+ },
89
+ infoItems: {
90
+ type: Array as PropType<Array<MenuItem>>,
91
+ default: [],
92
+ },
71
93
  backIcon: {
72
94
  type: String,
73
95
  default: 'mdi-arrow-left',
@@ -78,7 +100,7 @@ export default defineComponent({
78
100
  },
79
101
  moreIcon: {
80
102
  type: String,
81
- default: 'mdi-cog-outline',
103
+ default: 'mdi-dots-vertical',
82
104
  },
83
105
  },
84
106
  emits: ['onLink', 'onBack', 'onMore', 'clicked'],