bfg-common 1.5.30 → 1.5.32

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 (170) hide show
  1. package/CODE_STYLE.md +109 -109
  2. package/assets/localization/local_ru.json +5 -5
  3. package/assets/scss/common/normalize.scss +339 -339
  4. package/components/atoms/TheIcon3.vue +50 -50
  5. package/components/atoms/collapse/CollapseNav.vue +165 -165
  6. package/components/atoms/dropdown/dropdown/Dropdown.vue +168 -168
  7. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  8. package/components/atoms/perPage/PerPage.vue +58 -58
  9. package/components/atoms/stack/StackBlock.vue +185 -185
  10. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +222 -222
  11. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  12. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  13. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  14. package/components/atoms/tooltip/Signpost.vue +227 -227
  15. package/components/atoms/tooltip/Signpost.vue~ +229 -229
  16. package/components/common/accordion/Recursion.vue +222 -222
  17. package/components/common/browse/BrowseNew.vue +237 -237
  18. package/components/common/browse/BrowseOld.vue +217 -217
  19. package/components/common/browse/blocks/contents/Files.vue +37 -37
  20. package/components/common/browse/blocks/contents/FilesOld.vue +72 -72
  21. package/components/common/browse/blocks/contents/filesNew/FilesNew.vue +96 -96
  22. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  23. package/components/common/context/Context.vue +111 -111
  24. package/components/common/context/lib/models/interfaces.ts +31 -31
  25. package/components/common/context/recursion/Recursion.vue +87 -87
  26. package/components/common/context/recursion/RecursionNew.vue +238 -238
  27. package/components/common/context/recursion/RecursionOld.vue +228 -228
  28. package/components/common/details/DetailsItem.vue +109 -109
  29. package/components/common/diagramMain/DiagramMain.vue +897 -897
  30. package/components/common/diagramMain/Header.vue +214 -214
  31. package/components/common/graph/Graph.vue +120 -104
  32. package/components/common/graph/Graph.vue~ +104 -0
  33. package/components/common/graph/graphNew/GraphNew.vue +194 -0
  34. package/components/common/graph/graphNew/lib/models/enums.ts +9 -0
  35. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  36. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  37. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  38. package/components/common/mainNavigationPanel/MainNavigationPanelNew.vue +336 -336
  39. package/components/common/mainNavigationPanel/MainNavigationPanelOld.vue +311 -311
  40. package/components/common/modals/confirmByInput/ConfirmByInputNew.vue +1 -1
  41. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  42. package/components/common/monitor/advanced/graphView/GraphView.vue +2 -2
  43. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/config/utils.ts +1040 -1040
  44. package/components/common/monitor/overview/Overview.vue +5 -3
  45. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  46. package/components/common/pages/home/StatusContent.vue +49 -49
  47. package/components/common/pages/home/headline/Headline.vue +45 -45
  48. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  49. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  50. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  51. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  52. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  53. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  54. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  55. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  56. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  57. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  58. package/components/common/pages/packages/Packages.vue +208 -208
  59. package/components/common/pages/shortcuts/block/BlockNew.vue +96 -96
  60. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  61. package/components/common/portlets/customAttributes/Portlet.vue +667 -667
  62. package/components/common/portlets/tag/Portlet.vue +433 -433
  63. package/components/common/recursionTree/RecursionTree.vue +223 -223
  64. package/components/common/select/button/ButtonDropdown.vue +108 -108
  65. package/components/common/spiceConsole/Drawer.vue +370 -370
  66. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  67. package/components/common/split/horizontal/HorizontalNew.vue +376 -376
  68. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  69. package/components/common/split/vertical/Vertical.vue +160 -160
  70. package/components/common/tools/Actions.vue +188 -188
  71. package/components/common/vm/actions/add/Add.vue +622 -622
  72. package/components/common/vm/actions/clone/Clone.vue +639 -639
  73. package/components/common/vm/actions/clone/lib/config/steps.ts +129 -129
  74. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +634 -634
  75. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  76. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  77. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  78. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  79. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  85. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  86. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  87. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  88. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  94. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  95. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +286 -286
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  124. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  125. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  126. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  127. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  128. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  129. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  130. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  131. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  132. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  133. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  134. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  135. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  136. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  137. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  138. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  139. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  140. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  141. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  142. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  143. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  144. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  145. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  146. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  147. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  148. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  149. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  150. package/components/common/wizards/datastore/add/nfs/accessibility/Accessibility.vue +60 -60
  151. package/components/common/wizards/datastore/add/readyComplete/ReadyComplete.vue +92 -92
  152. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +105 -105
  153. package/components/common/wizards/vm/migrate/Migrate.vue +302 -302
  154. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  155. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  156. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  157. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  158. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  159. package/composables/productNameLocal.ts +30 -30
  160. package/composables/useAppVersion.ts +21 -21
  161. package/package.json +3 -3
  162. package/package.json~ +3 -3
  163. package/plugins/date.ts +233 -233
  164. package/plugins/directives.ts +24 -24
  165. package/public/spice-console/lib/images/bitmap.js +203 -203
  166. package/public/spice-console/network/spicechannel.js +383 -383
  167. package/store/main/mutations.ts +7 -7
  168. package/store/main/state.ts +7 -7
  169. package/store/tasks/mappers/recentTasks.ts +64 -64
  170. package/components/common/graph/GraphNew.vue +0 -179
@@ -1,229 +1,229 @@
1
- <template>
2
- <Teleport to="body">
3
- <div
4
- id="signpost"
5
- :class="['signpost', signpostClass]"
6
- :data-id="`${props.testId}-signpost`"
7
- :style="signpostStyles"
8
- @click.stop
9
- @mouseenter="hovered = true"
10
- @mouseleave="hovered = false"
11
- >
12
- <div class="signpost-wrap">
13
- <div class="popover-pointer" />
14
- <div class="signpost-content-header">
15
- <button
16
- :id="`${props.testId}-close-icon`"
17
- :data-id="`${props.testId}-close-icon`"
18
- class="signpost-action close"
19
- @click="hide"
20
- >
21
- <atoms-the-icon class="close-icon" name="close" />
22
- </button>
23
- </div>
24
- <div class="signpost-content-body">
25
- <slot />
26
- </div>
27
- </div>
28
- </div>
29
- </Teleport>
30
- </template>
31
-
32
- <script setup lang="ts">
33
- import type { UI_I_ElPosition } from '~/components/atoms/tooltip/lib/models/interfaces'
34
- const props = withDefaults(
35
- defineProps<{
36
- elemId: string
37
- testId?: string
38
- }>(),
39
- { testId: 'ui-signpost' }
40
- )
41
- const emits = defineEmits<{
42
- (event: 'hide'): void
43
- }>()
44
- const hide = (): void => {
45
- emits('hide')
46
- }
47
-
48
- const signpostStyles = ref<UI_I_ElPosition | null>(null)
49
- watch(
50
- () => props.elemId,
51
- (newValue: string) => {
52
- const element =
53
- (document.getElementById(newValue) as HTMLDivElement) || null
54
- const { width, x, y } = element.getBoundingClientRect()
55
-
56
- signpostStyles.value = {
57
- top: `${y}px`,
58
- left: `${x + width / 2}px`,
59
- }
60
- setTimeout(() => {
61
- setSignpostPosition()
62
- }, 0)
63
- },
64
- { immediate: true }
65
- )
66
- const signpostClass = ref<string[]>([])
67
- const setSignpostPosition = (): void => {
68
- const signpost =
69
- (document.getElementById('signpost') as HTMLDivElement) || null
70
- const signpostRect = (signpost?.getBoundingClientRect() as DOMRect) || null
71
-
72
- type PositionX = 'right' | 'left'
73
- let positionX: PositionX = 'right'
74
-
75
- type PositionY = 'top' | 'middle'
76
- let positionY: PositionY = 'middle'
77
-
78
- const isOutRight = signpostRect.left + signpostRect.width > window.innerWidth
79
- const isOutTop = signpostRect.top < 0
80
-
81
- if (isOutTop) {
82
- positionY = 'top'
83
- }
84
- if (isOutRight) {
85
- positionX = 'left'
86
- }
87
-
88
- signpostClass.value.push(positionY)
89
- signpostClass.value.push(positionX)
90
- signpostClass.value.push('show')
91
- }
92
-
93
- const hovered = ref<boolean>(false)
94
- const windowClick = (): void => {
95
- hide()
96
- }
97
- const windowScroll = (): void => {
98
- if (hovered.value) {
99
- return
100
- }
101
- hide()
102
- }
103
- onMounted(() => {
104
- setTimeout(() => {
105
- window.addEventListener('click', windowClick)
106
- window.addEventListener('scroll', windowScroll, true)
107
- })
108
- })
109
- onUnmounted(() => {
110
- window.removeEventListener('click', windowClick)
111
- window.removeEventListener('scroll', windowScroll, true)
112
- })
113
- </script>
114
-
115
- <style scoped lang="scss">
116
- .signpost {
117
- opacity: 0;
118
- position: fixed;
119
- cursor: default;
120
- transform: translateY(calc(-50% + 14px)) translateX(20px);
121
- z-index: var(--z-popover);
122
-
123
- &.show {
124
- opacity: 1;
125
- }
126
- &.left {
127
- transform: translateY(calc(-50% + 14px)) translateX(calc(-100% - 20px));
128
-
129
- .signpost-wrap {
130
- .popover-pointer {
131
- left: 100%;
132
- border-right: unset;
133
- border-left: 12px solid var(--signpost-border-color);
134
-
135
- &::before {
136
- border-right: unset;
137
- border-left: 12px solid var(--signpost-bgcolor);
138
- left: unset;
139
- right: 2px;
140
- }
141
- }
142
- }
143
- }
144
- &.top {
145
- transform: translateY(calc(0% + 10px)) translateX(20px);
146
-
147
- &.left {
148
- transform: translateY(calc(0% + 10px)) translateX(calc(-100% - 20px));
149
-
150
- .popover-pointer {
151
- top: 5px;
152
- }
153
- }
154
-
155
- .signpost-wrap {
156
- .popover-pointer {
157
- top: 5px;
158
- }
159
- }
160
- }
161
-
162
- .signpost-wrap {
163
- border-radius: 3px;
164
- border: 1px solid var(--signpost-border-color);
165
- background-color: var(--signpost-bgcolor);
166
- position: relative;
167
-
168
- .popover-pointer {
169
- border-bottom: 12px solid transparent;
170
- top: 50%;
171
- transform: translateY(-50%);
172
- border-right: 12px solid var(--signpost-border-color);
173
- left: -12px;
174
- height: 0;
175
- width: 0;
176
- position: absolute;
177
-
178
- &::before {
179
- border-bottom: 12px solid transparent;
180
- top: 1px;
181
- border-right: 12px solid var(--signpost-bgcolor);
182
- left: 2px;
183
- content: '';
184
- height: 0;
185
- width: 0;
186
- position: absolute;
187
- }
188
- }
189
-
190
- .signpost-content-header {
191
- display: flex;
192
- justify-content: flex-end;
193
- position: absolute;
194
- width: 100%;
195
- background-color: inherit;
196
- top: 0;
197
-
198
- button {
199
- line-height: 24px;
200
-
201
- .close-icon {
202
- width: 16px;
203
- height: 16px;
204
- }
205
- }
206
- }
207
-
208
- .signpost-content-body {
209
- padding: 24px;
210
- max-height: 480px;
211
- overflow-y: auto;
212
- text-transform: none;
213
- }
214
- }
215
- }
216
- </style>
217
-
218
- <style>
219
- :root {
220
- --signpost-bgcolor: #fff;
221
- --signpost-border-color: #b3b3b3;
222
- --signpost-color: #acbac3;
223
- }
224
- :root.dark-theme {
225
- --signpost-bgcolor: #21333b;
226
- --signpost-border-color: #000;
227
- --signpost-color: #acbac3;
228
- }
229
- </style>
1
+ <template>
2
+ <Teleport to="body">
3
+ <div
4
+ id="signpost"
5
+ :class="['signpost', signpostClass]"
6
+ :data-id="`${props.testId}-signpost`"
7
+ :style="signpostStyles"
8
+ @click.stop
9
+ @mouseenter="hovered = true"
10
+ @mouseleave="hovered = false"
11
+ >
12
+ <div class="signpost-wrap">
13
+ <div class="popover-pointer" />
14
+ <div class="signpost-content-header">
15
+ <button
16
+ :id="`${props.testId}-close-icon`"
17
+ :data-id="`${props.testId}-close-icon`"
18
+ class="signpost-action close"
19
+ @click="hide"
20
+ >
21
+ <atoms-the-icon class="close-icon" name="close" />
22
+ </button>
23
+ </div>
24
+ <div class="signpost-content-body">
25
+ <slot />
26
+ </div>
27
+ </div>
28
+ </div>
29
+ </Teleport>
30
+ </template>
31
+
32
+ <script setup lang="ts">
33
+ import type { UI_I_ElPosition } from '~/components/atoms/tooltip/lib/models/interfaces'
34
+ const props = withDefaults(
35
+ defineProps<{
36
+ elemId: string
37
+ testId?: string
38
+ }>(),
39
+ { testId: 'ui-signpost' }
40
+ )
41
+ const emits = defineEmits<{
42
+ (event: 'hide'): void
43
+ }>()
44
+ const hide = (): void => {
45
+ emits('hide')
46
+ }
47
+
48
+ const signpostStyles = ref<UI_I_ElPosition | null>(null)
49
+ watch(
50
+ () => props.elemId,
51
+ (newValue: string) => {
52
+ const element =
53
+ (document.getElementById(newValue) as HTMLDivElement) || null
54
+ const { width, x, y } = element.getBoundingClientRect()
55
+
56
+ signpostStyles.value = {
57
+ top: `${y}px`,
58
+ left: `${x + width / 2}px`,
59
+ }
60
+ setTimeout(() => {
61
+ setSignpostPosition()
62
+ }, 0)
63
+ },
64
+ { immediate: true }
65
+ )
66
+ const signpostClass = ref<string[]>([])
67
+ const setSignpostPosition = (): void => {
68
+ const signpost =
69
+ (document.getElementById('signpost') as HTMLDivElement) || null
70
+ const signpostRect = (signpost?.getBoundingClientRect() as DOMRect) || null
71
+
72
+ type PositionX = 'right' | 'left'
73
+ let positionX: PositionX = 'right'
74
+
75
+ type PositionY = 'top' | 'middle'
76
+ let positionY: PositionY = 'middle'
77
+
78
+ const isOutRight = signpostRect.left + signpostRect.width > window.innerWidth
79
+ const isOutTop = signpostRect.top < 0
80
+
81
+ if (isOutTop) {
82
+ positionY = 'top'
83
+ }
84
+ if (isOutRight) {
85
+ positionX = 'left'
86
+ }
87
+
88
+ signpostClass.value.push(positionY)
89
+ signpostClass.value.push(positionX)
90
+ signpostClass.value.push('show')
91
+ }
92
+
93
+ const hovered = ref<boolean>(false)
94
+ const windowClick = (): void => {
95
+ hide()
96
+ }
97
+ const windowScroll = (): void => {
98
+ if (hovered.value) {
99
+ return
100
+ }
101
+ hide()
102
+ }
103
+ onMounted(() => {
104
+ setTimeout(() => {
105
+ window.addEventListener('click', windowClick)
106
+ window.addEventListener('scroll', windowScroll, true)
107
+ })
108
+ })
109
+ onUnmounted(() => {
110
+ window.removeEventListener('click', windowClick)
111
+ window.removeEventListener('scroll', windowScroll, true)
112
+ })
113
+ </script>
114
+
115
+ <style scoped lang="scss">
116
+ .signpost {
117
+ opacity: 0;
118
+ position: fixed;
119
+ cursor: default;
120
+ transform: translateY(calc(-50% + 14px)) translateX(20px);
121
+ z-index: var(--z-popover);
122
+
123
+ &.show {
124
+ opacity: 1;
125
+ }
126
+ &.left {
127
+ transform: translateY(calc(-50% + 14px)) translateX(calc(-100% - 20px));
128
+
129
+ .signpost-wrap {
130
+ .popover-pointer {
131
+ left: 100%;
132
+ border-right: unset;
133
+ border-left: 12px solid var(--signpost-border-color);
134
+
135
+ &::before {
136
+ border-right: unset;
137
+ border-left: 12px solid var(--signpost-bgcolor);
138
+ left: unset;
139
+ right: 2px;
140
+ }
141
+ }
142
+ }
143
+ }
144
+ &.top {
145
+ transform: translateY(calc(0% + 10px)) translateX(20px);
146
+
147
+ &.left {
148
+ transform: translateY(calc(0% + 10px)) translateX(calc(-100% - 20px));
149
+
150
+ .popover-pointer {
151
+ top: 5px;
152
+ }
153
+ }
154
+
155
+ .signpost-wrap {
156
+ .popover-pointer {
157
+ top: 5px;
158
+ }
159
+ }
160
+ }
161
+
162
+ .signpost-wrap {
163
+ border-radius: 3px;
164
+ border: 1px solid var(--signpost-border-color);
165
+ background-color: var(--signpost-bgcolor);
166
+ position: relative;
167
+
168
+ .popover-pointer {
169
+ border-bottom: 12px solid transparent;
170
+ top: 50%;
171
+ transform: translateY(-50%);
172
+ border-right: 12px solid var(--signpost-border-color);
173
+ left: -12px;
174
+ height: 0;
175
+ width: 0;
176
+ position: absolute;
177
+
178
+ &::before {
179
+ border-bottom: 12px solid transparent;
180
+ top: 1px;
181
+ border-right: 12px solid var(--signpost-bgcolor);
182
+ left: 2px;
183
+ content: '';
184
+ height: 0;
185
+ width: 0;
186
+ position: absolute;
187
+ }
188
+ }
189
+
190
+ .signpost-content-header {
191
+ display: flex;
192
+ justify-content: flex-end;
193
+ position: absolute;
194
+ width: 100%;
195
+ background-color: inherit;
196
+ top: 0;
197
+
198
+ button {
199
+ line-height: 24px;
200
+
201
+ .close-icon {
202
+ width: 16px;
203
+ height: 16px;
204
+ }
205
+ }
206
+ }
207
+
208
+ .signpost-content-body {
209
+ padding: 24px;
210
+ max-height: 480px;
211
+ overflow-y: auto;
212
+ text-transform: none;
213
+ }
214
+ }
215
+ }
216
+ </style>
217
+
218
+ <style>
219
+ :root {
220
+ --signpost-bgcolor: #fff;
221
+ --signpost-border-color: #b3b3b3;
222
+ --signpost-color: #acbac3;
223
+ }
224
+ :root.dark-theme {
225
+ --signpost-bgcolor: #21333b;
226
+ --signpost-border-color: #000;
227
+ --signpost-color: #acbac3;
228
+ }
229
+ </style>