bfg-common 1.5.431 → 1.5.433

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/CODE_STYLE.md +109 -109
  2. package/assets/img/icons/icons-sprite-dark-3.svg +227 -227
  3. package/assets/img/icons/icons-sprite-dark-5.svg +488 -488
  4. package/assets/img/icons/icons-sprite-light-3.svg +227 -227
  5. package/assets/img/icons/icons-sprite-light-5.svg +488 -488
  6. package/components/atoms/TheIcon3.vue +50 -50
  7. package/components/atoms/collapse/CollapseNav.vue +170 -170
  8. package/components/atoms/perPage/PerPage.vue +58 -58
  9. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  10. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  11. package/components/atoms/wizard/Wizard.vue +2 -2
  12. package/components/atoms/wizard/lib/models/enums.ts +8 -0
  13. package/components/atoms/wizard/lib/models/interfaces.ts +59 -0
  14. package/components/atoms/wizard/lib/utils/utils.ts +954 -0
  15. package/components/atoms/wizard/step/Step.vue +1 -1
  16. package/components/common/backup/storage/actions/add/Add.vue +5 -5
  17. package/components/common/backup/storage/actions/add/Old.vue +1 -1
  18. package/components/common/backup/storage/actions/add/lib/config/steps.ts +2 -2
  19. package/components/common/backup/storage/actions/add/lib/validations.ts +4 -4
  20. package/components/common/backup/storage/actions/add/steps/name/Name.vue +1 -1
  21. package/components/common/backup/storage/actions/add/steps/name/New.vue +1 -1
  22. package/components/common/backup/storage/actions/add/steps/name/Old.vue +1 -1
  23. package/components/common/backup/storage/actions/add/steps/nameAndConfigure/NameAndConfigure.vue +1 -1
  24. package/components/common/backup/storage/actions/add/steps/nameAndConfigure/NameAndConfigureNew.vue +1 -1
  25. package/components/common/backup/storage/actions/add/steps/nameAndConfigure/NameAndConfigureOld.vue +1 -1
  26. package/components/common/browse/BrowseNew.vue +1 -0
  27. package/components/common/browse/blocks/Container.vue +235 -235
  28. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  29. package/components/common/browse/blocks/lib/models/types.ts +1 -1
  30. package/components/common/browse/lib/models/interfaces.ts +5 -5
  31. package/components/common/context/lib/models/interfaces.ts +33 -33
  32. package/components/common/diagramMain/lib/config/initial.ts +50 -50
  33. package/components/common/diagramMain/lib/models/types.ts +21 -21
  34. package/components/common/diagramMain/lib/utils/utils.ts +331 -331
  35. package/components/common/diagramMain/modals/lib/config/networkModal.ts +398 -398
  36. package/components/common/diagramMain/modals/lib/config/portModal.ts +251 -251
  37. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  38. package/components/common/diagramMain/modals/lib/config/vmKernelAdapter.ts +90 -90
  39. package/components/common/diagramMain/modals/lib/mappers/mappers.ts +87 -87
  40. package/components/common/diagramMain/modals/lib/utils/index.ts +24 -24
  41. package/components/common/diagramMain/modals/migrateVmkernelAdapter/MigrateVmkernelAdapter.vue +5 -5
  42. package/components/common/diagramMain/modals/migrateVmkernelAdapter/lib/config/steps.ts +2 -2
  43. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/ConnectionSettings.vue +2 -2
  44. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common.ts +14 -14
  45. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings.ts +5 -5
  46. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter.ts +2 -2
  47. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/validations.ts +19 -19
  48. package/components/common/diagramMain/port/Port.vue +580 -580
  49. package/components/common/diagramMain/port/Ports.vue +47 -47
  50. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  51. package/components/common/pages/backups/Backups.vue +102 -102
  52. package/components/common/pages/backups/DetailView.vue +52 -52
  53. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  54. package/components/common/pages/backups/modals/Modals.vue +1 -1
  55. package/components/common/pages/backups/modals/createBackup/CreateBackup.vue +2 -5
  56. package/components/common/pages/backups/modals/createBackup/configuration/Configuration.vue +29 -29
  57. package/components/common/pages/backups/modals/createBackup/configuration/backupWindow/BackupWindow.vue +26 -26
  58. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/MaxBandwidth.vue +66 -66
  59. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  60. package/components/common/pages/backups/modals/createBackup/configuration/strategy/Strategy.vue +35 -35
  61. package/components/common/pages/backups/modals/createBackup/datastores/Datastores.vue +59 -59
  62. package/components/common/pages/backups/modals/createBackup/datastores/tableView/TableView.vue +95 -95
  63. package/components/common/pages/backups/modals/createBackup/disks/tableView/lib/config/table.ts +117 -117
  64. package/components/common/pages/backups/modals/createBackup/general/General.vue +135 -135
  65. package/components/common/pages/backups/modals/createBackup/lib/config/steps.ts +117 -117
  66. package/components/common/pages/backups/modals/createBackup/lib/config/strategyOptions.ts +12 -12
  67. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  68. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  69. package/components/common/pages/backups/modals/restore/Restore.vue +417 -417
  70. package/components/common/pages/backups/modals/restore/disks/Disks.vue +27 -27
  71. package/components/common/pages/backups/modals/restore/disks/tableView/TableView.vue +102 -102
  72. package/components/common/pages/backups/modals/restore/disks/tableView/lib/config/table.ts +117 -117
  73. package/components/common/pages/backups/modals/restore/lib/config/steps.ts +108 -108
  74. package/components/common/pages/backups/modals/restore/name/Name.vue +160 -160
  75. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  76. package/components/common/pages/backups/modals/restore/networks/Networks.vue +67 -67
  77. package/components/common/pages/backups/modals/restore/networks/table/Table.vue +214 -214
  78. package/components/common/pages/backups/modals/restore/types/lib/config/typeOptions.ts +25 -25
  79. package/components/common/pages/backups/tools/Tools.vue +75 -75
  80. package/components/common/pages/backups/tools/lib/config/tabs.ts +36 -36
  81. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  82. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  83. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  84. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  85. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  86. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  87. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  88. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  89. package/components/common/select/radio/RadioGroup.vue +137 -137
  90. package/components/common/spiceConsole/Drawer.vue +381 -381
  91. package/components/common/spiceConsole/SpiceConsole.vue +127 -127
  92. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  93. package/components/common/tools/Actions.vue +207 -207
  94. package/components/common/treeView/TreeView.vue +52 -52
  95. package/components/common/vm/actions/add/Add.vue +5 -5
  96. package/components/common/vm/actions/add/New.vue +2 -2
  97. package/components/common/vm/actions/add/Old.vue +2 -2
  98. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  99. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  100. package/components/common/vm/actions/add/lib/config/steps.ts +2 -2
  101. package/components/common/vm/actions/clone/Clone.vue +5 -5
  102. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  103. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +5 -5
  104. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +2 -2
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +78 -78
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +154 -154
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +85 -85
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/storageModal/new/New.vue +1 -1
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/Table.vue +99 -92
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/numberDisplays/NumberDisplays.vue +53 -53
  125. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +32 -32
  126. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +60 -60
  127. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +174 -174
  128. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  129. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapOld.vue +44 -44
  130. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  131. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  132. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  133. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  134. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +143 -143
  135. package/components/common/vm/actions/common/select/computeResource/New.vue +184 -184
  136. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +131 -131
  137. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  138. package/components/common/vm/actions/common/select/createType/lib/config/items.ts +48 -48
  139. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  140. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  141. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  142. package/components/common/vm/actions/common/select/storage/new/New.vue +14 -14
  143. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  144. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  145. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  146. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  147. package/components/common/vmt/actions/add/Add.vue +5 -5
  148. package/components/common/vmt/actions/add/New.vue +3 -2
  149. package/components/common/vmt/actions/add/Old.vue +2 -2
  150. package/components/common/vmt/actions/add/lib/config/steps.ts +2 -2
  151. package/components/common/wizards/datastore/add/Add.vue +2 -2
  152. package/components/common/wizards/datastore/add/Old.vue +2 -2
  153. package/components/common/wizards/datastore/add/lib/config/steps.ts +2 -2
  154. package/components/common/wizards/datastore/add/lib/utils.ts +1 -1
  155. package/components/common/wizards/datastore/add/lib/validations.ts +3 -3
  156. package/components/common/wizards/datastore/add/steps/_local/Local.vue +1 -1
  157. package/components/common/wizards/datastore/add/steps/_local/createName/CreateName.vue +1 -1
  158. package/components/common/wizards/datastore/add/steps/nameAndConfigure/NameAndConfigure.vue +1 -2
  159. package/components/common/wizards/datastore/add/steps/nameAndConfigure/NameAndConfigureNew.vue +1 -1
  160. package/components/common/wizards/datastore/add/steps/nameAndConfigure/NameAndConfigureOld.vue +1 -1
  161. package/components/common/wizards/datastore/add/steps/nameAndDevice/NameAndDevice.vue +1 -1
  162. package/components/common/wizards/datastore/add/steps/nameAndDevice/NameAndDeviceNew.vue +1 -1
  163. package/components/common/wizards/datastore/add/steps/nameAndDevice/NameAndDeviceOld.vue +1 -1
  164. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  165. package/components/common/wizards/network/add/Add.vue +7 -7
  166. package/components/common/wizards/network/add/lib/config/steps.ts +5 -5
  167. package/components/common/wizards/network/add/steps/ConnectionSettings.vue +2 -2
  168. package/components/common/wizards/network/add/steps/IpFourSettings.vue +2 -2
  169. package/components/common/wizards/network/add/steps/PortProperties.vue +2 -2
  170. package/components/common/wizards/network/add/steps/SelectedTargetDevice.vue +2 -2
  171. package/components/common/wizards/network/add/validations/connectionSettings.ts +5 -5
  172. package/components/common/wizards/network/add/validations/createStandardSwitch.ts +4 -4
  173. package/components/common/wizards/network/add/validations/ipFourSettings.ts +5 -5
  174. package/components/common/wizards/network/add/validations/networkValidation.ts +4 -4
  175. package/components/common/wizards/network/add/validations/physicalAdapter.ts +4 -4
  176. package/components/common/wizards/network/add/validations/portProperties.ts +2 -2
  177. package/components/common/wizards/network/add/validations/targetDevice.ts +5 -5
  178. package/components/common/wizards/vm/migrate/Migrate.vue +2 -2
  179. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  180. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  181. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  182. package/components/common/wizards/vm/migrate/select/targetServer/new/New.vue +1 -1
  183. package/components/common/wizards/vm/migrate/select/targetServer/targetServer.vue +1 -1
  184. package/components/common/wizards/vm/migrate/select/type/lib/config/typeOptions.ts +45 -45
  185. package/composables/productNameLocal.ts +30 -30
  186. package/composables/useAppVersion.ts +21 -21
  187. package/package.json +42 -42
  188. package/plugins/date.ts +233 -233
  189. package/plugins/panelStates.ts +70 -70
  190. package/plugins/text.ts +59 -59
  191. package/public/spice-console/lib/images/bitmap.js +203 -203
  192. package/public/spice-console/network/spicechannel.js +390 -390
  193. package/store/main/mutations.ts +7 -7
  194. package/store/main/state.ts +7 -7
@@ -1,381 +1,381 @@
1
- <template>
2
- <div
3
- :class="['vmw-drawer animation', { show: isShow }]"
4
- data-id="spice-console-drawer"
5
- @click.capture="onInputManagerFocus"
6
- >
7
- <div
8
- v-if="!isShow"
9
- :style="`top: ${y}px;`"
10
- ref="grab"
11
- data-id="spice-console-drawer-toggle"
12
- class="vmw-drawer__open"
13
- @click="toggleDrawer"
14
- >
15
- <atoms-the-icon name="arrow" class="vmw-drawer__open-icon" />
16
- <atoms-the-icon2 name="drag" class="vmw-drawer__drag-icon" />
17
- </div>
18
-
19
- <div class="vmw-drawer-header">
20
- <h3>{{ localization.common.consolePanel }}</h3>
21
- <atoms-the-icon
22
- class="vmw-drawer-header__close"
23
- data-id="spice-console-drawer-toggle-icon"
24
- name="close"
25
- @click="toggleDrawer"
26
- />
27
- </div>
28
-
29
- <div class="vmw-drawer-body">
30
- <button
31
- class="vmw-drawer-body__btn animation toggle-fullscreen"
32
- data-id="spice-console-drawer-toggle-fullscreen"
33
- @click="emits('toggle-fullscreen')"
34
- >
35
- {{ localization.common.toggleFullscreenMode }}
36
- </button>
37
- <button
38
- class="vmw-drawer-body__btn animation toggle-fullscreen"
39
- @click="emits('send-alt-command')"
40
- >
41
- {{ localization.common.sendAltCommand }}
42
- </button>
43
- <label
44
- v-development="true"
45
- class="vmw-drawer-body__btn animation relative"
46
- >
47
- {{ localization.remoteConsole.uploadFolder }}
48
- <input type="file" webkitdirectory directory multiple />
49
- </label>
50
- <label
51
- v-development="true"
52
- class="vmw-drawer-body__btn animation relative"
53
- >
54
- {{ localization.remoteConsole.uploadFiles }}
55
- <input type="file" multiple />
56
- </label>
57
-
58
- <select
59
- v-model="usbDevice"
60
- v-development="true"
61
- @mouseenter="hover = true"
62
- @mouseleave="hover = false"
63
- @change="onChangeUsbDevice"
64
- >
65
- <option
66
- v-for="item in usbDevices"
67
- :key="item.value"
68
- :value="item.value"
69
- :disabled="item.disabled"
70
- >
71
- {{ item.label }}
72
- </option>
73
- </select>
74
-
75
- <select
76
- :value="codec"
77
- @mouseenter="hover = true"
78
- @mouseleave="hover = false"
79
- @change="onChangeCodec"
80
- >
81
- <option :value="1">MJPEG</option>
82
- <option :value="2">VP8</option>
83
- <option :value="3">H264</option>
84
- <option :value="4" disabled>VP9</option>
85
- <option :value="5">H265</option>
86
- </select>
87
-
88
- <hr />
89
- <button
90
- class="vmw-drawer-body__btn animation show-keyboard"
91
- @click="onToggleKeyboard"
92
- >
93
- {{ showOrHideKeyboard }}
94
- </button>
95
- </div>
96
-
97
- <div class="vmw-drawer-footer">
98
- <div class="size-info">
99
- <p class="size-info-text">View size: {{ viewSize }}</p>
100
- <p class="size-info-text">Canvas size: {{ canvasSize }}</p>
101
- </div>
102
- <div id="debug-stream"></div>
103
- </div>
104
- <div v-if="isKeyboardShown">
105
- <common-spice-console-keyboard />
106
- </div>
107
- </div>
108
- </template>
109
- <script setup lang="ts">
110
- import { useDraggable } from '@vueuse/core'
111
- import type { UI_I_DeviceOption } from '~/components/common/spiceConsole/lib/models/interfaces'
112
- import type { UI_I_Localization } from '~/lib/models/interfaces'
113
- import type { UI_T_CODEC } from '~/components/common/spiceConsole/lib/models/types'
114
- import {
115
- getUSBDeviceType,
116
- identifyHIDDevice,
117
- } from '~/components/common/spiceConsole/lib/utils/getDeviceType'
118
-
119
- const emits = defineEmits<{
120
- (event: 'toggle-fullscreen'): void
121
- (event: 'send-alt-command'): void
122
- }>()
123
-
124
- const { $console }: any = useNuxtApp()
125
-
126
- const codec = computed<UI_T_CODEC>(() => $console.codec.value)
127
- const onChangeCodec = (event: any): void => {
128
- const value = +event.target.value
129
- $console.changeCodec(value)
130
- // @ts-ignore
131
- if (!window.app) return
132
- // @ts-ignore
133
- const channels = window.app.spiceConnection.channels
134
- for (const i in channels) {
135
- const channel = channels[i]
136
- if (channel.channel === wdi.SpiceVars.SPICE_CHANNEL_DISPLAY) {
137
- channel.changeCodec(value)
138
- }
139
- }
140
- document.getElementById('inputmanager')?.focus()
141
- }
142
-
143
- const isKeyboardShown = ref<boolean>(false)
144
- const onToggleKeyboard = (): void => {
145
- isKeyboardShown.value = !isKeyboardShown.value
146
- }
147
-
148
- const isShow = ref<boolean>(false)
149
- const grab = ref<HTMLDivElement | null>(null)
150
- const localization = computed<UI_I_Localization>(() => useLocal())
151
- const initialTop = window.innerHeight / 2 - 15
152
- const { y } = useDraggable(grab, {
153
- initialValue: { x: -30, y: initialTop },
154
- })
155
-
156
- const showOrHideKeyboard = computed<string>(() =>
157
- isKeyboardShown.value
158
- ? localization.value.common.hideKeyboard
159
- : localization.value.common.showKeyboard
160
- )
161
-
162
- watch(y, () => {
163
- isDrag = true
164
- })
165
-
166
- let isDrag = false
167
- const toggleDrawer = (): void => {
168
- if (isDrag) {
169
- isDrag = false
170
- return
171
- }
172
- isShow.value = !isShow.value
173
- }
174
-
175
- const hover = ref<boolean>(false)
176
- const onInputManagerFocus = (): void => {
177
- if (hover.value) return
178
- document.getElementById('inputmanager')?.focus()
179
- }
180
-
181
- const viewSize = ref<string>('0 x 0')
182
- const canvasSize = ref<string>('0 x 0')
183
- const displaySizeInfo = (): void => {
184
- const layout = document.getElementById('eventLayer')
185
- viewSize.value = `${window.innerWidth}px x ${window.innerHeight}px`
186
- if (layout) {
187
- canvasSize.value = `${layout.width || 0}px x ${layout.height || 0}px`
188
- }
189
-
190
- requestAnimationFrame(displaySizeInfo)
191
- }
192
- displaySizeInfo()
193
-
194
- const usbDevice = ref<number | string>(-1)
195
- const usbDevices = ref<UI_I_DeviceOption[]>([
196
- { label: 'USB Device', value: -1, disabled: true },
197
- { label: 'Add USB device', value: -2 },
198
- ])
199
- const onChangeUsbDevice = (data: any): void => {
200
- if (data.target.value === '-2') {
201
- getUSBDeviceInformation()
202
- }
203
- }
204
-
205
- const getUSBDeviceInformation = async (): Promise<void> => {
206
- try {
207
- // Запросить устройство
208
- const device = await navigator.usb.requestDevice({ filters: [] })
209
- usbDevice.value = setDevice(device)
210
- } catch (error) {
211
- console.error('Error:', error)
212
- }
213
- }
214
-
215
- const setDevice = (device: any): string => {
216
- const interfaces = device.configuration.interfaces
217
-
218
- const types: any = new Set()
219
- interfaces.forEach((item: any) => {
220
- const classCode = item.alternate.interfaceClass
221
- const subclassCode = item.alternate.interfaceSubclass
222
- const protocolCode = item.alternate.interfaceProtocol
223
-
224
- if (classCode === 0x03) {
225
- // HID класс
226
- types.add(identifyHIDDevice(subclassCode, protocolCode))
227
- } else {
228
- types.add(getUSBDeviceType(classCode))
229
- }
230
- })
231
-
232
- const value = `${device.productId}_${device.vendorId}`
233
- if (usbDevices.value.every((device) => device.value !== value)) {
234
- usbDevices.value.push({
235
- value,
236
- label: Array.from(types).join(' / '),
237
- })
238
- }
239
-
240
- return value
241
- }
242
-
243
- const setDefaultDevices = async (): Promise<void> => {
244
- const devices = await navigator.usb.getDevices()
245
- devices.forEach((device: any) => {
246
- setDevice(device)
247
- })
248
- }
249
- setDefaultDevices()
250
- </script>
251
- <style lang="scss" scoped>
252
- .vmw-drawer {
253
- background-color: #314351;
254
- position: absolute;
255
- top: 0;
256
- right: -300px;
257
- width: 300px;
258
- height: 100vh;
259
- padding: 20px;
260
- z-index: var(--z-modal);
261
-
262
- &.show {
263
- right: 0;
264
-
265
- .vmw-drawer__open {
266
- z-index: var(--z-negative);
267
- }
268
- }
269
-
270
- &__open {
271
- width: 65px;
272
- height: 40px;
273
- background-color: #314351;
274
- position: absolute;
275
- left: -30px;
276
- cursor: pointer;
277
- border-top-left-radius: 20px;
278
- border-bottom-left-radius: 20px;
279
- box-shadow: 0 0 15px 5px #31435169;
280
- transition: left 0.5s;
281
- user-select: none;
282
-
283
- &.moving {
284
- cursor: grabbing;
285
- }
286
-
287
- &:hover {
288
- left: -60px;
289
- }
290
-
291
- & .vmw-drawer__open-icon {
292
- fill: #ffffff;
293
- transform: rotate(-90deg);
294
- width: 30px;
295
- height: 40px;
296
- z-index: var(--z-dropdown);
297
- }
298
-
299
- & .vmw-drawer__drag-icon {
300
- fill: #ffffff;
301
- width: 40px;
302
- position: absolute;
303
- left: 21px;
304
- z-index: calc(var(--z-default) + 1);
305
- cursor: grabbing;
306
- }
307
- }
308
-
309
- .vmw-drawer-header {
310
- & h3 {
311
- color: #fff;
312
- font-weight: bold;
313
- font-size: 20px;
314
- text-align: center;
315
- }
316
-
317
- &__close {
318
- width: 30px;
319
- fill: #fff;
320
- position: absolute;
321
- right: 10px;
322
- top: 10px;
323
- cursor: pointer;
324
- }
325
- }
326
-
327
- .vmw-drawer-body {
328
- margin-top: 50px;
329
-
330
- & select,
331
- &__btn {
332
- display: block;
333
- width: 100%;
334
- color: #fff;
335
- cursor: pointer;
336
- font-size: 15px;
337
- border: 1px solid #fff;
338
- padding: 5px;
339
- border-radius: 5px;
340
- text-align: center;
341
- margin-bottom: 20px;
342
- background-color: transparent;
343
-
344
- &:not(.disable):hover {
345
- background-color: #ffffff;
346
- color: #314351;
347
- }
348
-
349
- &.disable {
350
- opacity: 0.5;
351
- cursor: not-allowed;
352
- }
353
-
354
- input[type='file'] {
355
- position: absolute;
356
- top: 0;
357
- left: 0;
358
- right: 0;
359
- bottom: 0;
360
- opacity: 0;
361
- }
362
- }
363
-
364
- & > hr {
365
- margin-bottom: 20px;
366
- border-color: #ffffff40;
367
- box-shadow: 0 0 20px 0.5px #ffffff2e;
368
- }
369
- }
370
-
371
- .vmw-drawer-footer {
372
- .size-info {
373
- margin-bottom: 10px;
374
-
375
- .size-info-text {
376
- color: #ffffff;
377
- }
378
- }
379
- }
380
- }
381
- </style>
1
+ <template>
2
+ <div
3
+ :class="['vmw-drawer animation', { show: isShow }]"
4
+ data-id="spice-console-drawer"
5
+ @click.capture="onInputManagerFocus"
6
+ >
7
+ <div
8
+ v-if="!isShow"
9
+ :style="`top: ${y}px;`"
10
+ ref="grab"
11
+ data-id="spice-console-drawer-toggle"
12
+ class="vmw-drawer__open"
13
+ @click="toggleDrawer"
14
+ >
15
+ <atoms-the-icon name="arrow" class="vmw-drawer__open-icon" />
16
+ <atoms-the-icon2 name="drag" class="vmw-drawer__drag-icon" />
17
+ </div>
18
+
19
+ <div class="vmw-drawer-header">
20
+ <h3>{{ localization.common.consolePanel }}</h3>
21
+ <atoms-the-icon
22
+ class="vmw-drawer-header__close"
23
+ data-id="spice-console-drawer-toggle-icon"
24
+ name="close"
25
+ @click="toggleDrawer"
26
+ />
27
+ </div>
28
+
29
+ <div class="vmw-drawer-body">
30
+ <button
31
+ class="vmw-drawer-body__btn animation toggle-fullscreen"
32
+ data-id="spice-console-drawer-toggle-fullscreen"
33
+ @click="emits('toggle-fullscreen')"
34
+ >
35
+ {{ localization.common.toggleFullscreenMode }}
36
+ </button>
37
+ <button
38
+ class="vmw-drawer-body__btn animation toggle-fullscreen"
39
+ @click="emits('send-alt-command')"
40
+ >
41
+ {{ localization.common.sendAltCommand }}
42
+ </button>
43
+ <label
44
+ v-development="true"
45
+ class="vmw-drawer-body__btn animation relative"
46
+ >
47
+ {{ localization.remoteConsole.uploadFolder }}
48
+ <input type="file" webkitdirectory directory multiple />
49
+ </label>
50
+ <label
51
+ v-development="true"
52
+ class="vmw-drawer-body__btn animation relative"
53
+ >
54
+ {{ localization.remoteConsole.uploadFiles }}
55
+ <input type="file" multiple />
56
+ </label>
57
+
58
+ <select
59
+ v-model="usbDevice"
60
+ v-development="true"
61
+ @mouseenter="hover = true"
62
+ @mouseleave="hover = false"
63
+ @change="onChangeUsbDevice"
64
+ >
65
+ <option
66
+ v-for="item in usbDevices"
67
+ :key="item.value"
68
+ :value="item.value"
69
+ :disabled="item.disabled"
70
+ >
71
+ {{ item.label }}
72
+ </option>
73
+ </select>
74
+
75
+ <select
76
+ :value="codec"
77
+ @mouseenter="hover = true"
78
+ @mouseleave="hover = false"
79
+ @change="onChangeCodec"
80
+ >
81
+ <option :value="1">MJPEG</option>
82
+ <option :value="2">VP8</option>
83
+ <option :value="3">H264</option>
84
+ <option :value="4" disabled>VP9</option>
85
+ <option :value="5">H265</option>
86
+ </select>
87
+
88
+ <hr />
89
+ <button
90
+ class="vmw-drawer-body__btn animation show-keyboard"
91
+ @click="onToggleKeyboard"
92
+ >
93
+ {{ showOrHideKeyboard }}
94
+ </button>
95
+ </div>
96
+
97
+ <div class="vmw-drawer-footer">
98
+ <div class="size-info">
99
+ <p class="size-info-text">View size: {{ viewSize }}</p>
100
+ <p class="size-info-text">Canvas size: {{ canvasSize }}</p>
101
+ </div>
102
+ <div id="debug-stream"></div>
103
+ </div>
104
+ <div v-if="isKeyboardShown">
105
+ <common-spice-console-keyboard />
106
+ </div>
107
+ </div>
108
+ </template>
109
+ <script setup lang="ts">
110
+ import { useDraggable } from '@vueuse/core'
111
+ import type { UI_I_DeviceOption } from '~/components/common/spiceConsole/lib/models/interfaces'
112
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
113
+ import type { UI_T_CODEC } from '~/components/common/spiceConsole/lib/models/types'
114
+ import {
115
+ getUSBDeviceType,
116
+ identifyHIDDevice,
117
+ } from '~/components/common/spiceConsole/lib/utils/getDeviceType'
118
+
119
+ const emits = defineEmits<{
120
+ (event: 'toggle-fullscreen'): void
121
+ (event: 'send-alt-command'): void
122
+ }>()
123
+
124
+ const { $console }: any = useNuxtApp()
125
+
126
+ const codec = computed<UI_T_CODEC>(() => $console.codec.value)
127
+ const onChangeCodec = (event: any): void => {
128
+ const value = +event.target.value
129
+ $console.changeCodec(value)
130
+ // @ts-ignore
131
+ if (!window.app) return
132
+ // @ts-ignore
133
+ const channels = window.app.spiceConnection.channels
134
+ for (const i in channels) {
135
+ const channel = channels[i]
136
+ if (channel.channel === wdi.SpiceVars.SPICE_CHANNEL_DISPLAY) {
137
+ channel.changeCodec(value)
138
+ }
139
+ }
140
+ document.getElementById('inputmanager')?.focus()
141
+ }
142
+
143
+ const isKeyboardShown = ref<boolean>(false)
144
+ const onToggleKeyboard = (): void => {
145
+ isKeyboardShown.value = !isKeyboardShown.value
146
+ }
147
+
148
+ const isShow = ref<boolean>(false)
149
+ const grab = ref<HTMLDivElement | null>(null)
150
+ const localization = computed<UI_I_Localization>(() => useLocal())
151
+ const initialTop = window.innerHeight / 2 - 15
152
+ const { y } = useDraggable(grab, {
153
+ initialValue: { x: -30, y: initialTop },
154
+ })
155
+
156
+ const showOrHideKeyboard = computed<string>(() =>
157
+ isKeyboardShown.value
158
+ ? localization.value.common.hideKeyboard
159
+ : localization.value.common.showKeyboard
160
+ )
161
+
162
+ watch(y, () => {
163
+ isDrag = true
164
+ })
165
+
166
+ let isDrag = false
167
+ const toggleDrawer = (): void => {
168
+ if (isDrag) {
169
+ isDrag = false
170
+ return
171
+ }
172
+ isShow.value = !isShow.value
173
+ }
174
+
175
+ const hover = ref<boolean>(false)
176
+ const onInputManagerFocus = (): void => {
177
+ if (hover.value) return
178
+ document.getElementById('inputmanager')?.focus()
179
+ }
180
+
181
+ const viewSize = ref<string>('0 x 0')
182
+ const canvasSize = ref<string>('0 x 0')
183
+ const displaySizeInfo = (): void => {
184
+ const layout = document.getElementById('eventLayer')
185
+ viewSize.value = `${window.innerWidth}px x ${window.innerHeight}px`
186
+ if (layout) {
187
+ canvasSize.value = `${layout.width || 0}px x ${layout.height || 0}px`
188
+ }
189
+
190
+ requestAnimationFrame(displaySizeInfo)
191
+ }
192
+ displaySizeInfo()
193
+
194
+ const usbDevice = ref<number | string>(-1)
195
+ const usbDevices = ref<UI_I_DeviceOption[]>([
196
+ { label: 'USB Device', value: -1, disabled: true },
197
+ { label: 'Add USB device', value: -2 },
198
+ ])
199
+ const onChangeUsbDevice = (data: any): void => {
200
+ if (data.target.value === '-2') {
201
+ getUSBDeviceInformation()
202
+ }
203
+ }
204
+
205
+ const getUSBDeviceInformation = async (): Promise<void> => {
206
+ try {
207
+ // Запросить устройство
208
+ const device = await navigator.usb.requestDevice({ filters: [] })
209
+ usbDevice.value = setDevice(device)
210
+ } catch (error) {
211
+ console.error('Error:', error)
212
+ }
213
+ }
214
+
215
+ const setDevice = (device: any): string => {
216
+ const interfaces = device.configuration.interfaces
217
+
218
+ const types: any = new Set()
219
+ interfaces.forEach((item: any) => {
220
+ const classCode = item.alternate.interfaceClass
221
+ const subclassCode = item.alternate.interfaceSubclass
222
+ const protocolCode = item.alternate.interfaceProtocol
223
+
224
+ if (classCode === 0x03) {
225
+ // HID класс
226
+ types.add(identifyHIDDevice(subclassCode, protocolCode))
227
+ } else {
228
+ types.add(getUSBDeviceType(classCode))
229
+ }
230
+ })
231
+
232
+ const value = `${device.productId}_${device.vendorId}`
233
+ if (usbDevices.value.every((device) => device.value !== value)) {
234
+ usbDevices.value.push({
235
+ value,
236
+ label: Array.from(types).join(' / '),
237
+ })
238
+ }
239
+
240
+ return value
241
+ }
242
+
243
+ const setDefaultDevices = async (): Promise<void> => {
244
+ const devices = await navigator.usb.getDevices()
245
+ devices.forEach((device: any) => {
246
+ setDevice(device)
247
+ })
248
+ }
249
+ setDefaultDevices()
250
+ </script>
251
+ <style lang="scss" scoped>
252
+ .vmw-drawer {
253
+ background-color: #314351;
254
+ position: absolute;
255
+ top: 0;
256
+ right: -300px;
257
+ width: 300px;
258
+ height: 100vh;
259
+ padding: 20px;
260
+ z-index: var(--z-modal);
261
+
262
+ &.show {
263
+ right: 0;
264
+
265
+ .vmw-drawer__open {
266
+ z-index: var(--z-negative);
267
+ }
268
+ }
269
+
270
+ &__open {
271
+ width: 65px;
272
+ height: 40px;
273
+ background-color: #314351;
274
+ position: absolute;
275
+ left: -30px;
276
+ cursor: pointer;
277
+ border-top-left-radius: 20px;
278
+ border-bottom-left-radius: 20px;
279
+ box-shadow: 0 0 15px 5px #31435169;
280
+ transition: left 0.5s;
281
+ user-select: none;
282
+
283
+ &.moving {
284
+ cursor: grabbing;
285
+ }
286
+
287
+ &:hover {
288
+ left: -60px;
289
+ }
290
+
291
+ & .vmw-drawer__open-icon {
292
+ fill: #ffffff;
293
+ transform: rotate(-90deg);
294
+ width: 30px;
295
+ height: 40px;
296
+ z-index: var(--z-dropdown);
297
+ }
298
+
299
+ & .vmw-drawer__drag-icon {
300
+ fill: #ffffff;
301
+ width: 40px;
302
+ position: absolute;
303
+ left: 21px;
304
+ z-index: calc(var(--z-default) + 1);
305
+ cursor: grabbing;
306
+ }
307
+ }
308
+
309
+ .vmw-drawer-header {
310
+ & h3 {
311
+ color: #fff;
312
+ font-weight: bold;
313
+ font-size: 20px;
314
+ text-align: center;
315
+ }
316
+
317
+ &__close {
318
+ width: 30px;
319
+ fill: #fff;
320
+ position: absolute;
321
+ right: 10px;
322
+ top: 10px;
323
+ cursor: pointer;
324
+ }
325
+ }
326
+
327
+ .vmw-drawer-body {
328
+ margin-top: 50px;
329
+
330
+ & select,
331
+ &__btn {
332
+ display: block;
333
+ width: 100%;
334
+ color: #fff;
335
+ cursor: pointer;
336
+ font-size: 15px;
337
+ border: 1px solid #fff;
338
+ padding: 5px;
339
+ border-radius: 5px;
340
+ text-align: center;
341
+ margin-bottom: 20px;
342
+ background-color: transparent;
343
+
344
+ &:not(.disable):hover {
345
+ background-color: #ffffff;
346
+ color: #314351;
347
+ }
348
+
349
+ &.disable {
350
+ opacity: 0.5;
351
+ cursor: not-allowed;
352
+ }
353
+
354
+ input[type='file'] {
355
+ position: absolute;
356
+ top: 0;
357
+ left: 0;
358
+ right: 0;
359
+ bottom: 0;
360
+ opacity: 0;
361
+ }
362
+ }
363
+
364
+ & > hr {
365
+ margin-bottom: 20px;
366
+ border-color: #ffffff40;
367
+ box-shadow: 0 0 20px 0.5px #ffffff2e;
368
+ }
369
+ }
370
+
371
+ .vmw-drawer-footer {
372
+ .size-info {
373
+ margin-bottom: 10px;
374
+
375
+ .size-info-text {
376
+ color: #ffffff;
377
+ }
378
+ }
379
+ }
380
+ }
381
+ </style>