bfg-common 1.4.877 → 1.4.879

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 (194) hide show
  1. package/assets/img/icons/icons-sprite-dark-3.svg +227 -227
  2. package/assets/img/icons/icons-sprite-dark-5.svg +488 -488
  3. package/assets/img/icons/icons-sprite-light-3.svg +227 -227
  4. package/assets/img/icons/icons-sprite-light-5.svg +488 -488
  5. package/assets/localization/local_ru.json +1 -1
  6. package/assets/scss/common/normalize.scss +361 -361
  7. package/components/atoms/TheIcon3.vue +50 -50
  8. package/components/atoms/autocomplete/Autocomplete.vue +301 -301
  9. package/components/atoms/collapse/CollapseNav.vue +164 -164
  10. package/components/atoms/dropdown/dropdown/Dropdown.vue +168 -168
  11. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  12. package/components/atoms/stack/StackBlock.vue +185 -185
  13. package/components/atoms/table/dataGrid/DataGrid.vue +1704 -1704
  14. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +222 -222
  15. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  16. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  17. package/components/atoms/tabs/lib/models/interfaces.ts +1 -0
  18. package/components/common/browse/BrowseNew.vue +237 -237
  19. package/components/common/browse/BrowseOld.vue +217 -217
  20. package/components/common/browse/blocks/contents/Files.vue +37 -37
  21. package/components/common/browse/blocks/contents/FilesOld.vue +72 -72
  22. package/components/common/browse/blocks/contents/filesNew/FilesNew.vue +96 -96
  23. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  24. package/components/common/browse/blocks/lib/models/types.ts +1 -1
  25. package/components/common/browse/lib/models/interfaces.ts +5 -5
  26. package/components/common/context/Context.vue +111 -111
  27. package/components/common/context/lib/models/interfaces.ts +30 -30
  28. package/components/common/context/recursion/Recursion.vue +87 -87
  29. package/components/common/context/recursion/RecursionOld.vue +227 -227
  30. package/components/common/details/DetailsItem.vue +109 -109
  31. package/components/common/diagramMain/Header.vue +211 -211
  32. package/components/common/diagramMain/adapter/AdapterItems.vue +61 -61
  33. package/components/common/diagramMain/lib/config/initial.ts +50 -50
  34. package/components/common/diagramMain/lib/models/interfaces.ts +1 -1
  35. package/components/common/diagramMain/lib/models/types.ts +21 -21
  36. package/components/common/diagramMain/lib/utils/utils.ts +331 -331
  37. package/components/common/diagramMain/modals/ManagePhysicalAdaptersModal.vue +330 -330
  38. package/components/common/diagramMain/modals/editSettings/ConfirmTeamingSettingsModal.vue +40 -40
  39. package/components/common/diagramMain/modals/editSettings/EditSettings.vue +497 -497
  40. package/components/common/diagramMain/modals/editSettings/EditSettingsModal.vue +812 -812
  41. package/components/common/diagramMain/modals/editSettings/tabs/NetworkProperties.vue +214 -214
  42. package/components/common/diagramMain/modals/editSettings/tabs/Security.vue +189 -189
  43. package/components/common/diagramMain/modals/editSettings/tabs/SwitchProperties.vue +163 -163
  44. package/components/common/diagramMain/modals/editSettings/tabs/TeamingFailover.vue +175 -175
  45. package/components/common/diagramMain/modals/editSettings/tabs/port/IpvFourSettings.vue +346 -346
  46. package/components/common/diagramMain/modals/editSettings/tabs/port/PortProperties.vue +205 -205
  47. package/components/common/diagramMain/modals/lib/config/diagramConfig.ts +23 -23
  48. package/components/common/diagramMain/modals/lib/config/initial.ts +180 -180
  49. package/components/common/diagramMain/modals/lib/config/vmKernelAdapter.ts +90 -90
  50. package/components/common/diagramMain/modals/lib/mappers/mappers.ts +87 -87
  51. package/components/common/diagramMain/modals/lib/utils/index.ts +24 -24
  52. package/components/common/diagramMain/modals/migrateVmkernelAdapter/lib/config/steps.ts +114 -114
  53. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/ConnectionSettings.vue +169 -169
  54. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/SelectVmkernelAdapter.vue +159 -159
  55. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common.ts +14 -14
  56. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings.ts +137 -137
  57. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter.ts +52 -52
  58. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/validations.ts +19 -19
  59. package/components/common/diagramMain/port/Ports.vue +47 -47
  60. package/components/common/graph/Graph.vue +104 -104
  61. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  62. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  63. package/components/common/layout/theHeader/userMenu/modals/preferences/defaultConsole/DefaultConsoleNew.vue +1 -0
  64. package/components/common/layout/theHeader/userMenu/modals/preferences/defaultConsole/DefaultConsoleOld.vue +1 -0
  65. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  66. package/components/common/mainNavigationPanel/MainNavigationPanelNew.vue +335 -327
  67. package/components/common/mainNavigationPanel/MainNavigationPanelOld.vue +312 -300
  68. package/components/common/mainNavigationPanel/lib/models/interfaces.ts +1 -0
  69. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  70. package/components/common/monitor/overview/OverviewNew.vue +142 -142
  71. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  72. package/components/common/monitor/overview/filters/Filters.vue +166 -166
  73. package/components/common/monitor/overview/filters/FiltersNew.vue +172 -172
  74. package/components/common/monitor/overview/filters/FiltersOld.vue +151 -151
  75. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModal.vue +175 -175
  76. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModalOld.vue +161 -161
  77. package/components/common/pages/home/StatusContent.vue +49 -49
  78. package/components/common/pages/home/headline/Headline.vue +45 -45
  79. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  80. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  81. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  82. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  83. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  84. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  85. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  86. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  87. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  88. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  89. package/components/common/pages/packages/Packages.vue +208 -208
  90. package/components/common/pages/shortcuts/block/BlockNew.vue +96 -80
  91. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -55
  92. package/components/common/pages/shortcuts/lib/models/interfaces.ts +1 -0
  93. package/components/common/recursionTree/RecursionTree.vue +223 -223
  94. package/components/common/select/button/ButtonDropdown.vue +108 -108
  95. package/components/common/spiceConsole/Drawer.vue +370 -370
  96. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  97. package/components/common/split/horizontal/HorizontalNew.vue +376 -376
  98. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  99. package/components/common/split/vertical/Vertical.vue +160 -160
  100. package/components/common/vm/actions/add/Add.vue +622 -622
  101. package/components/common/vm/actions/clone/Clone.vue +639 -639
  102. package/components/common/vm/actions/clone/lib/config/steps.ts +129 -129
  103. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +634 -634
  104. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  105. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  106. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  107. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  126. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  127. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +286 -282
  128. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  129. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  130. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  131. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  132. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  133. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  134. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  135. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  136. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  137. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  138. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  139. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  140. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  141. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  142. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  143. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  144. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  145. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  146. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  147. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  148. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  149. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  150. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  151. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  152. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  153. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  154. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  155. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  156. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  157. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  158. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  159. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  160. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  161. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  162. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  163. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  164. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  165. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  166. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  167. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  168. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  169. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  170. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  171. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  172. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  173. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  174. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  175. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  176. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  177. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  178. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  179. package/components/common/wizards/vm/migrate/Migrate.vue +302 -302
  180. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  181. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  182. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  183. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  184. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  185. package/composables/productNameLocal.ts +30 -30
  186. package/composables/useAppVersion.ts +21 -21
  187. package/package.json +1 -1
  188. package/plugins/date.ts +233 -233
  189. package/plugins/recursion.ts +311 -311
  190. package/public/spice-console/lib/images/bitmap.js +203 -203
  191. package/public/spice-console/network/spicechannel.js +383 -383
  192. package/store/main/mutations.ts +7 -7
  193. package/store/main/state.ts +7 -7
  194. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,301 +1,301 @@
1
- <template>
2
- <div class="autocomplete" @click.stop>
3
- <div class="content-search">
4
- <div v-show="props.loading" class="loader">
5
- <atoms-loader-pre-loader
6
- id="loader"
7
- :test-id="`${props.testId}-pre-loader`"
8
- class="content-area__loading"
9
- :show="true"
10
- />
11
- </div>
12
- <div class="search-icon">
13
- <atoms-the-icon
14
- fill="#666"
15
- stroke-width="10"
16
- class="alert-icon search-icon"
17
- name="search"
18
- />
19
- </div>
20
-
21
- <div class="clr-error">
22
- <div class="form-group__input">
23
- <input
24
- :id="`${props.testId}-search-input`"
25
- v-model.trim="search"
26
- :data-id="`${props.testId}-search-input`"
27
- type="text"
28
- class="search-input"
29
- :class="fieldErrorText && 'clr-input'"
30
- autocomplete="off"
31
- :placeholder="props.placeholder"
32
- @blur="onInitValidation"
33
- @input="onSearch"
34
- />
35
- <div v-show="fieldErrorText" class="form-validate">
36
- <atoms-the-icon class="is-error tooltip-trigger" name="info" />
37
- </div>
38
- </div>
39
- <div
40
- v-show="fieldErrorText"
41
- class="form-group__input-error clr-subtext"
42
- >
43
- {{ fieldErrorText }}
44
- </div>
45
- </div>
46
- </div>
47
- <div
48
- v-show="isShow"
49
- :class="['content-filtered', { active: items.length }]"
50
- >
51
- <ul class="dropdown-menu filtered-items">
52
- <li
53
- v-for="(item, key) in items"
54
- :key="`${item}_${key}`"
55
- :class="['item', { active: key === selectedTabIndex }]"
56
- :data-id="item.testId"
57
- @mouseenter="selectedTabIndex = key"
58
- @click="onSelect(key)"
59
- >
60
- {{ item.firstText }}<b>{{ item.secondText }}</b
61
- >{{ item.thirdText }}
62
- </li>
63
- </ul>
64
- </div>
65
- </div>
66
- </template>
67
-
68
- <script setup lang="ts">
69
- import type { UI_I_Localization } from '~/lib/models/interfaces'
70
-
71
- const props = withDefaults(
72
- defineProps<{
73
- placeholder: string
74
- items: string[]
75
- loading?: boolean
76
- testId?: string
77
- ms?: number
78
- showValidation?: boolean
79
- errorText?: string
80
- }>(),
81
- {
82
- testId: 'ui-autocomplete',
83
- ms: 500,
84
- loading: false,
85
- showValidation: false,
86
- errorText: '',
87
- }
88
- )
89
- const emits = defineEmits<{
90
- (event: 'search', value: string): void
91
- (event: 'select', value: string): void
92
- }>()
93
-
94
- const localization = computed<UI_I_Localization>(() => useLocal())
95
-
96
- const search = ref<string>('')
97
-
98
- let timer: NodeJS.Timeout
99
- const onSearch = (): void => {
100
- onInitValidation()
101
- clearTimeout(timer)
102
- timer = setTimeout(
103
- (value) => {
104
- emits('search', value)
105
- },
106
- props.ms,
107
- search.value
108
- )
109
- selectedTabIndex.value = 0
110
- }
111
- const isInitFieldValidation = ref<boolean>(false)
112
- const onInitValidation = (): void => {
113
- isInitFieldValidation.value = true
114
- }
115
- const fieldErrorText = computed<string>(() => {
116
- if (!isInitFieldValidation.value) return ''
117
-
118
- if (!search.value) return localization.value.common.fieldRequired
119
- else if (props.showValidation) return props.errorText
120
- })
121
- const items = computed<any[]>(() => {
122
- return [...props.items].map((text) => {
123
- const term = text.match(new RegExp(search.value, 'i'))?.[0]
124
- const texts = term ? text.split(term) : text
125
- return {
126
- firstText: texts[0],
127
- secondText: term,
128
- thirdText: texts[1],
129
- testId: `${term}-filtered-item`,
130
- }
131
- })
132
- })
133
-
134
- const selectedTabIndex = ref<number>(0)
135
- const onSelect = (key: number): void => {
136
- search.value = props.items[key]
137
- emits('select', search.value)
138
- isHide.value = true
139
- }
140
-
141
- const isHide = ref<boolean>(false)
142
- const isShow = computed<boolean>(
143
- () => Boolean(items.value.length) && !isHide.value
144
- )
145
-
146
- const onKeyDown = (event: KeyboardEvent): void => {
147
- switch (event.code) {
148
- case 'ArrowUp':
149
- prevTabItem()
150
- break
151
- case 'ArrowDown':
152
- nextTabItem()
153
- break
154
- case 'Enter':
155
- event.preventDefault()
156
- onSelect(selectedTabIndex.value)
157
- break
158
- case 'Tab':
159
- isHide.value = true
160
- break
161
- }
162
- }
163
-
164
- const nextTabItem = (): void => {
165
- if (selectedTabIndex.value === items.value.length - 1)
166
- selectedTabIndex.value = 0
167
- else selectedTabIndex.value++
168
- }
169
-
170
- const prevTabItem = (): void => {
171
- if (selectedTabIndex.value === 0)
172
- selectedTabIndex.value = items.value.length - 1
173
- else selectedTabIndex.value--
174
- }
175
-
176
- watch(
177
- () => props.items,
178
- (newValue) => {
179
- if (newValue.length) {
180
- isHide.value = false
181
- }
182
- }
183
- )
184
- window.addEventListener('keydown', onKeyDown, true)
185
- watch(isHide, (newValue) => {
186
- if (!newValue) {
187
- window.addEventListener('keydown', onKeyDown, true)
188
- } else {
189
- window.removeEventListener('keydown', onKeyDown, true)
190
- }
191
- })
192
- watch(
193
- () => props.showValidation,
194
- (newValue: boolean) => {
195
- isInitFieldValidation.value = newValue
196
- },
197
- { immediate: true }
198
- )
199
- </script>
200
-
201
- <style scoped lang="scss">
202
- .autocomplete {
203
- max-width: 180px;
204
- position: relative;
205
-
206
- .content-search {
207
- .loader {
208
- position: absolute;
209
- top: 3px;
210
- left: -6px;
211
- z-index: 1;
212
- height: 16px;
213
- width: 16px;
214
-
215
- #loader {
216
- height: 100%;
217
- width: 100%;
218
-
219
- :deep(.spinner-inverse) {
220
- min-width: auto;
221
- min-height: auto;
222
- width: 100%;
223
- height: 100%;
224
- }
225
- }
226
- }
227
- .search-icon {
228
- position: absolute;
229
- width: 17px;
230
- top: 2px;
231
- bottom: 0;
232
- }
233
- .search-input {
234
- background-color: white;
235
- padding: 0 6px 0 20px;
236
- }
237
- }
238
-
239
- .content-filtered {
240
- position: absolute;
241
- display: block;
242
- overflow-y: visible;
243
- height: auto;
244
- visibility: visible;
245
- will-change: transform;
246
- top: 0;
247
- left: 0;
248
- transform: translate3d(0px, 25px, 0px);
249
- width: 250px;
250
- z-index: 1000;
251
-
252
- &.active .filtered-items {
253
- max-height: 164px;
254
- visibility: visible;
255
- position: absolute;
256
- top: 100%;
257
- left: 0;
258
- min-width: 96px;
259
- max-width: 288px;
260
- border: 0.8px solid #ccc;
261
- padding: 9.6px 0;
262
- z-index: 1060;
263
- overflow: auto;
264
- width: 100%;
265
- margin: 1px 0 0;
266
-
267
- .item {
268
- line-height: 20px;
269
- padding: 5px 0 0 5px;
270
- color: #333;
271
- cursor: pointer;
272
- outline: unset;
273
-
274
- &.active,
275
- &:focus,
276
- &:hover {
277
- background-color: #2b5480;
278
- color: #fff;
279
- }
280
- }
281
- }
282
- }
283
- .form-group {
284
- &__input {
285
- display: flex;
286
- .form-validate {
287
- svg {
288
- width: 24px;
289
- height: 24px;
290
- }
291
- }
292
- input {
293
- width: 100%;
294
- }
295
- &-error {
296
- margin-top: 0;
297
- }
298
- }
299
- }
300
- }
301
- </style>
1
+ <template>
2
+ <div class="autocomplete" @click.stop>
3
+ <div class="content-search">
4
+ <div v-show="props.loading" class="loader">
5
+ <atoms-loader-pre-loader
6
+ id="loader"
7
+ :test-id="`${props.testId}-pre-loader`"
8
+ class="content-area__loading"
9
+ :show="true"
10
+ />
11
+ </div>
12
+ <div class="search-icon">
13
+ <atoms-the-icon
14
+ fill="#666"
15
+ stroke-width="10"
16
+ class="alert-icon search-icon"
17
+ name="search"
18
+ />
19
+ </div>
20
+
21
+ <div class="clr-error">
22
+ <div class="form-group__input">
23
+ <input
24
+ :id="`${props.testId}-search-input`"
25
+ v-model.trim="search"
26
+ :data-id="`${props.testId}-search-input`"
27
+ type="text"
28
+ class="search-input"
29
+ :class="fieldErrorText && 'clr-input'"
30
+ autocomplete="off"
31
+ :placeholder="props.placeholder"
32
+ @blur="onInitValidation"
33
+ @input="onSearch"
34
+ />
35
+ <div v-show="fieldErrorText" class="form-validate">
36
+ <atoms-the-icon class="is-error tooltip-trigger" name="info" />
37
+ </div>
38
+ </div>
39
+ <div
40
+ v-show="fieldErrorText"
41
+ class="form-group__input-error clr-subtext"
42
+ >
43
+ {{ fieldErrorText }}
44
+ </div>
45
+ </div>
46
+ </div>
47
+ <div
48
+ v-show="isShow"
49
+ :class="['content-filtered', { active: items.length }]"
50
+ >
51
+ <ul class="dropdown-menu filtered-items">
52
+ <li
53
+ v-for="(item, key) in items"
54
+ :key="`${item}_${key}`"
55
+ :class="['item', { active: key === selectedTabIndex }]"
56
+ :data-id="item.testId"
57
+ @mouseenter="selectedTabIndex = key"
58
+ @click="onSelect(key)"
59
+ >
60
+ {{ item.firstText }}<b>{{ item.secondText }}</b
61
+ >{{ item.thirdText }}
62
+ </li>
63
+ </ul>
64
+ </div>
65
+ </div>
66
+ </template>
67
+
68
+ <script setup lang="ts">
69
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
70
+
71
+ const props = withDefaults(
72
+ defineProps<{
73
+ placeholder: string
74
+ items: string[]
75
+ loading?: boolean
76
+ testId?: string
77
+ ms?: number
78
+ showValidation?: boolean
79
+ errorText?: string
80
+ }>(),
81
+ {
82
+ testId: 'ui-autocomplete',
83
+ ms: 500,
84
+ loading: false,
85
+ showValidation: false,
86
+ errorText: '',
87
+ }
88
+ )
89
+ const emits = defineEmits<{
90
+ (event: 'search', value: string): void
91
+ (event: 'select', value: string): void
92
+ }>()
93
+
94
+ const localization = computed<UI_I_Localization>(() => useLocal())
95
+
96
+ const search = ref<string>('')
97
+
98
+ let timer: NodeJS.Timeout
99
+ const onSearch = (): void => {
100
+ onInitValidation()
101
+ clearTimeout(timer)
102
+ timer = setTimeout(
103
+ (value) => {
104
+ emits('search', value)
105
+ },
106
+ props.ms,
107
+ search.value
108
+ )
109
+ selectedTabIndex.value = 0
110
+ }
111
+ const isInitFieldValidation = ref<boolean>(false)
112
+ const onInitValidation = (): void => {
113
+ isInitFieldValidation.value = true
114
+ }
115
+ const fieldErrorText = computed<string>(() => {
116
+ if (!isInitFieldValidation.value) return ''
117
+
118
+ if (!search.value) return localization.value.common.fieldRequired
119
+ else if (props.showValidation) return props.errorText
120
+ })
121
+ const items = computed<any[]>(() => {
122
+ return [...props.items].map((text) => {
123
+ const term = text.match(new RegExp(search.value, 'i'))?.[0]
124
+ const texts = term ? text.split(term) : text
125
+ return {
126
+ firstText: texts[0],
127
+ secondText: term,
128
+ thirdText: texts[1],
129
+ testId: `${term}-filtered-item`,
130
+ }
131
+ })
132
+ })
133
+
134
+ const selectedTabIndex = ref<number>(0)
135
+ const onSelect = (key: number): void => {
136
+ search.value = props.items[key]
137
+ emits('select', search.value)
138
+ isHide.value = true
139
+ }
140
+
141
+ const isHide = ref<boolean>(false)
142
+ const isShow = computed<boolean>(
143
+ () => Boolean(items.value.length) && !isHide.value
144
+ )
145
+
146
+ const onKeyDown = (event: KeyboardEvent): void => {
147
+ switch (event.code) {
148
+ case 'ArrowUp':
149
+ prevTabItem()
150
+ break
151
+ case 'ArrowDown':
152
+ nextTabItem()
153
+ break
154
+ case 'Enter':
155
+ event.preventDefault()
156
+ onSelect(selectedTabIndex.value)
157
+ break
158
+ case 'Tab':
159
+ isHide.value = true
160
+ break
161
+ }
162
+ }
163
+
164
+ const nextTabItem = (): void => {
165
+ if (selectedTabIndex.value === items.value.length - 1)
166
+ selectedTabIndex.value = 0
167
+ else selectedTabIndex.value++
168
+ }
169
+
170
+ const prevTabItem = (): void => {
171
+ if (selectedTabIndex.value === 0)
172
+ selectedTabIndex.value = items.value.length - 1
173
+ else selectedTabIndex.value--
174
+ }
175
+
176
+ watch(
177
+ () => props.items,
178
+ (newValue) => {
179
+ if (newValue.length) {
180
+ isHide.value = false
181
+ }
182
+ }
183
+ )
184
+ window.addEventListener('keydown', onKeyDown, true)
185
+ watch(isHide, (newValue) => {
186
+ if (!newValue) {
187
+ window.addEventListener('keydown', onKeyDown, true)
188
+ } else {
189
+ window.removeEventListener('keydown', onKeyDown, true)
190
+ }
191
+ })
192
+ watch(
193
+ () => props.showValidation,
194
+ (newValue: boolean) => {
195
+ isInitFieldValidation.value = newValue
196
+ },
197
+ { immediate: true }
198
+ )
199
+ </script>
200
+
201
+ <style scoped lang="scss">
202
+ .autocomplete {
203
+ max-width: 180px;
204
+ position: relative;
205
+
206
+ .content-search {
207
+ .loader {
208
+ position: absolute;
209
+ top: 3px;
210
+ left: -6px;
211
+ z-index: 1;
212
+ height: 16px;
213
+ width: 16px;
214
+
215
+ #loader {
216
+ height: 100%;
217
+ width: 100%;
218
+
219
+ :deep(.spinner-inverse) {
220
+ min-width: auto;
221
+ min-height: auto;
222
+ width: 100%;
223
+ height: 100%;
224
+ }
225
+ }
226
+ }
227
+ .search-icon {
228
+ position: absolute;
229
+ width: 17px;
230
+ top: 2px;
231
+ bottom: 0;
232
+ }
233
+ .search-input {
234
+ background-color: white;
235
+ padding: 0 6px 0 20px;
236
+ }
237
+ }
238
+
239
+ .content-filtered {
240
+ position: absolute;
241
+ display: block;
242
+ overflow-y: visible;
243
+ height: auto;
244
+ visibility: visible;
245
+ will-change: transform;
246
+ top: 0;
247
+ left: 0;
248
+ transform: translate3d(0px, 25px, 0px);
249
+ width: 250px;
250
+ z-index: 1000;
251
+
252
+ &.active .filtered-items {
253
+ max-height: 164px;
254
+ visibility: visible;
255
+ position: absolute;
256
+ top: 100%;
257
+ left: 0;
258
+ min-width: 96px;
259
+ max-width: 288px;
260
+ border: 0.8px solid #ccc;
261
+ padding: 9.6px 0;
262
+ z-index: 1060;
263
+ overflow: auto;
264
+ width: 100%;
265
+ margin: 1px 0 0;
266
+
267
+ .item {
268
+ line-height: 20px;
269
+ padding: 5px 0 0 5px;
270
+ color: #333;
271
+ cursor: pointer;
272
+ outline: unset;
273
+
274
+ &.active,
275
+ &:focus,
276
+ &:hover {
277
+ background-color: #2b5480;
278
+ color: #fff;
279
+ }
280
+ }
281
+ }
282
+ }
283
+ .form-group {
284
+ &__input {
285
+ display: flex;
286
+ .form-validate {
287
+ svg {
288
+ width: 24px;
289
+ height: 24px;
290
+ }
291
+ }
292
+ input {
293
+ width: 100%;
294
+ }
295
+ &-error {
296
+ margin-top: 0;
297
+ }
298
+ }
299
+ }
300
+ }
301
+ </style>