bfg-common 1.5.632 → 1.5.633
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.
- package/CODE_STYLE.md +109 -109
- package/assets/img/icons/icons-sprite-dark-3.svg +227 -227
- package/assets/img/icons/icons-sprite-dark-5.svg +488 -488
- package/assets/img/icons/icons-sprite-light-3.svg +227 -227
- package/assets/img/icons/icons-sprite-light-5.svg +488 -488
- package/components/atoms/TheIcon3.vue +50 -50
- package/components/atoms/collapse/CollapseNav.vue +170 -170
- package/components/atoms/perPage/PerPage.vue +58 -58
- package/components/atoms/table/dataGrid/DataGrid.vue +1718 -1718
- package/components/atoms/table/dataGrid/DataGridPagination.vue +97 -97
- package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
- package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
- package/components/common/backup/storage/actions/add/lib/utils.ts +51 -51
- package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
- package/components/common/diagramMain/modals/lib/config/portModal.ts +251 -251
- package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
- package/components/common/diagramMain/port/Port.vue +580 -580
- package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
- package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
- package/components/common/monitor/overview/filters/Filters.vue +169 -170
- package/components/common/pages/backups/DetailView.vue +52 -52
- package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
- package/components/common/pages/backups/modals/Modals.vue +243 -243
- package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
- package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
- package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
- package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
- package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
- package/components/common/pages/home/lib/models/interfaces.ts +48 -48
- package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
- package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
- package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
- package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
- package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
- package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
- package/components/common/select/radio/RadioGroup.vue +137 -137
- package/components/common/spiceConsole/Drawer.vue +420 -420
- package/components/common/spiceConsole/SpiceConsole.vue +184 -184
- package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
- package/components/common/tools/Actions.vue +207 -207
- package/components/common/treeView/TreeView.vue +52 -52
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +283 -283
- package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
- package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
- package/components/common/vm/actions/common/select/storage/Old.vue +125 -125
- package/components/common/vm/actions/common/select/storage/new/New.vue +311 -311
- package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
- package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
- package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
- package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
- package/components/common/vm/actions/register/lib/config/steps.ts +86 -86
- package/components/common/wizards/common/compatibility/Compatibility.vue +35 -35
- package/components/common/wizards/common/compatibility/New.vue +99 -99
- package/components/common/wizards/common/compatibility/Old.vue +53 -53
- package/components/common/wizards/common/steps/computeResource/New.vue +93 -93
- package/components/common/wizards/common/steps/name/Name.vue +178 -178
- package/components/common/wizards/common/steps/name/New.vue +221 -221
- package/components/common/wizards/common/steps/name/Old.vue +121 -121
- package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
- package/components/common/wizards/common/steps/name/location/New.vue +40 -40
- package/components/common/wizards/datastore/add/Add.vue +228 -228
- package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
- package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
- package/composables/useAppVersion.ts +21 -21
- package/composables/useLocal.ts +6 -6
- package/composables/useLocalCommon.ts +39 -39
- package/package.json +1 -1
- package/plugins/console.ts +21 -21
- package/plugins/mouse.ts +21 -21
- package/plugins/panelStates.ts +70 -70
- package/plugins/text.ts +59 -59
- package/public/spice-console/application/clientgui.js +854 -854
- package/public/spice-console/application/packetfactory.js +211 -211
- package/public/spice-console/application/virtualmouse.js +147 -147
- package/public/spice-console/lib/images/bitmap.js +203 -203
- package/public/spice-console/network/spicechannel.js +440 -440
- package/public/spice-console/process/cursorprocess.js +128 -128
- package/public/spice-console/process/inputprocess.js +227 -227
- package/public/spice-console/process/mainprocess.js +212 -212
- package/public/spice-console/run.js +210 -210
- package/store/main/mutations.ts +7 -7
- package/store/main/state.ts +7 -7
- package/store/tasks/actions.ts +165 -165
- package/store/tasks/mappers/recentTasks.ts +118 -118
- package/store/tasks/mutations.ts +82 -82
|
@@ -1,184 +1,184 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div ref="fullScreen" class="spice-console">
|
|
3
|
-
<div id="vmw" ref="vmScreen" @scroll="onConsoleScroll"></div>
|
|
4
|
-
<div
|
|
5
|
-
v-if="isWindow"
|
|
6
|
-
v-show="isShowBlocker"
|
|
7
|
-
class="blocker"
|
|
8
|
-
@click="onFocus"
|
|
9
|
-
>
|
|
10
|
-
<p class="blocker-text">{{ localization.remoteConsole.clickForUse }}</p>
|
|
11
|
-
</div>
|
|
12
|
-
<common-spice-console-drawer
|
|
13
|
-
@toggle-fullscreen="toggle"
|
|
14
|
-
@send-alt-command="onSendAltCommand"
|
|
15
|
-
/>
|
|
16
|
-
</div>
|
|
17
|
-
</template>
|
|
18
|
-
<script setup lang="ts">
|
|
19
|
-
import { useFullscreen } from '@vueuse/core'
|
|
20
|
-
import RFB from '@novnc/novnc/core/rfb.js'
|
|
21
|
-
import SpiceConsole from '~/plugins/spice-console/spice.console'
|
|
22
|
-
import type { UI_I_Localization } from '~/lib/models/interfaces'
|
|
23
|
-
import type { UI_I_VmSettings } from '~/lib/models/store/vm/interfaces'
|
|
24
|
-
|
|
25
|
-
const props = defineProps<{
|
|
26
|
-
wsUrl: string
|
|
27
|
-
vmType: string
|
|
28
|
-
vmId: string
|
|
29
|
-
host: string
|
|
30
|
-
port: number
|
|
31
|
-
}>()
|
|
32
|
-
|
|
33
|
-
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
34
|
-
|
|
35
|
-
let rfb: any
|
|
36
|
-
const vmScreen = ref<any>(null)
|
|
37
|
-
const fullScreen = ref<any>(null)
|
|
38
|
-
const { toggle } = useFullscreen(fullScreen)
|
|
39
|
-
|
|
40
|
-
const connectWS = (): void => {
|
|
41
|
-
if (props.vmType === 'VNC') {
|
|
42
|
-
connectVNC()
|
|
43
|
-
} else if (props.vmType === 'SPICE') {
|
|
44
|
-
SpiceConsole.init(props.wsUrl)
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const connectVNC = (): void => {
|
|
49
|
-
rfb = new RFB(vmScreen.value, props.wsUrl, {
|
|
50
|
-
protocols: {},
|
|
51
|
-
})
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const vmDisconnect = (): void => {
|
|
55
|
-
if (props.vmType === 'VNC') {
|
|
56
|
-
if (rfb) {
|
|
57
|
-
rfb.disconnect()
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const onSendAltCommand = (): void => {
|
|
63
|
-
// @ts-ignore
|
|
64
|
-
window.app.sendCtrlAltDelete()
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const onConsoleScroll = (event: any): void => {
|
|
68
|
-
app.clientGui.setClientOffset(
|
|
69
|
-
app.clientGui.clientOffsetX,
|
|
70
|
-
event.target.scrollTop
|
|
71
|
-
)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const blockCtrlOrCmdCommands = (e): void => {
|
|
75
|
-
const blockedKeys = [
|
|
76
|
-
'e',
|
|
77
|
-
's',
|
|
78
|
-
'p',
|
|
79
|
-
'u',
|
|
80
|
-
'r',
|
|
81
|
-
'o',
|
|
82
|
-
'i',
|
|
83
|
-
'j',
|
|
84
|
-
'k',
|
|
85
|
-
'n',
|
|
86
|
-
't',
|
|
87
|
-
'w',
|
|
88
|
-
'h',
|
|
89
|
-
'd',
|
|
90
|
-
]
|
|
91
|
-
|
|
92
|
-
const key = e.key
|
|
93
|
-
const ctrlOrCmd = e.ctrlKey || e.metaKey
|
|
94
|
-
|
|
95
|
-
// Block Ctrl+key or Cmd+key
|
|
96
|
-
if (ctrlOrCmd && blockedKeys.includes(key.toLowerCase())) {
|
|
97
|
-
e.preventDefault()
|
|
98
|
-
e.stopPropagation()
|
|
99
|
-
// console.log(`Blocked key: ${key}`);
|
|
100
|
-
return false
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Optionally block right-click menu key (context menu)
|
|
104
|
-
// if (e.key === 'ContextMenu') {
|
|
105
|
-
// e.preventDefault();
|
|
106
|
-
// return false;
|
|
107
|
-
// }
|
|
108
|
-
|
|
109
|
-
// Optional: block F5/Reload with Ctrl+R as fallback
|
|
110
|
-
// if (key === 'F5' || (ctrlOrCmd && key.toLowerCase() === 'r')) {
|
|
111
|
-
// e.preventDefault();
|
|
112
|
-
// return false;
|
|
113
|
-
// }
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const isWindow = computed<boolean>(() => useRoute().query.window === 'true')
|
|
117
|
-
const isShowBlocker = ref<boolean>(true)
|
|
118
|
-
const onFocus = (): void => {
|
|
119
|
-
document.getElementById('inputmanager')?.focus()
|
|
120
|
-
isShowBlocker.value = false
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const inputManagerBlur = (): void => {
|
|
124
|
-
isShowBlocker.value = true
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
onMounted(() => {
|
|
128
|
-
connectWS()
|
|
129
|
-
document.addEventListener('keydown', blockCtrlOrCmdCommands)
|
|
130
|
-
window.addEventListener('blur', inputManagerBlur)
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
onBeforeUnmount(() => {
|
|
134
|
-
vmDisconnect()
|
|
135
|
-
document.removeEventListener('keydown', blockCtrlOrCmdCommands)
|
|
136
|
-
window.removeEventListener('blur', inputManagerBlur)
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
// // TODO Этот код решает проблему когда у вм нету пароли, но окно подтверждения все равно открывается
|
|
140
|
-
// const { $store }: any = useNuxtApp()
|
|
141
|
-
// $store.dispatch('vm/A_GET_VM_SETTINGS', props.vmId) // Работает и для Пракуратора и для Сферы
|
|
142
|
-
// const vmSettings = computed<UI_I_VmSettings | null>(
|
|
143
|
-
// () => $store.getters['vm/getVmSettings']
|
|
144
|
-
// )
|
|
145
|
-
// watch(
|
|
146
|
-
// vmSettings,
|
|
147
|
-
// (newValue) => {
|
|
148
|
-
// // @ts-ignore
|
|
149
|
-
// window.vmHasPassword = !!newValue?.options.remote_console.password
|
|
150
|
-
// },
|
|
151
|
-
// { deep: true, immediate: true }
|
|
152
|
-
// )
|
|
153
|
-
</script>
|
|
154
|
-
<style scoped lang="scss">
|
|
155
|
-
.spice-console {
|
|
156
|
-
width: 100vw;
|
|
157
|
-
height: 100vh;
|
|
158
|
-
overflow: hidden;
|
|
159
|
-
position: relative;
|
|
160
|
-
}
|
|
161
|
-
#vmw {
|
|
162
|
-
overflow-y: auto;
|
|
163
|
-
overflow-x: auto;
|
|
164
|
-
position: relative;
|
|
165
|
-
height: 100vh;
|
|
166
|
-
background-color: #000;
|
|
167
|
-
}
|
|
168
|
-
.blocker {
|
|
169
|
-
position: fixed;
|
|
170
|
-
top: 0;
|
|
171
|
-
left: 0;
|
|
172
|
-
width: 100%;
|
|
173
|
-
height: 100%;
|
|
174
|
-
display: flex;
|
|
175
|
-
justify-content: center;
|
|
176
|
-
align-items: center;
|
|
177
|
-
background-color: rgba(0, 0, 0, 0.5);
|
|
178
|
-
z-index: 9999;
|
|
179
|
-
|
|
180
|
-
.blocker-text {
|
|
181
|
-
color: #e4e4e4;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<div ref="fullScreen" class="spice-console">
|
|
3
|
+
<div id="vmw" ref="vmScreen" @scroll="onConsoleScroll"></div>
|
|
4
|
+
<div
|
|
5
|
+
v-if="isWindow"
|
|
6
|
+
v-show="isShowBlocker"
|
|
7
|
+
class="blocker"
|
|
8
|
+
@click="onFocus"
|
|
9
|
+
>
|
|
10
|
+
<p class="blocker-text">{{ localization.remoteConsole.clickForUse }}</p>
|
|
11
|
+
</div>
|
|
12
|
+
<common-spice-console-drawer
|
|
13
|
+
@toggle-fullscreen="toggle"
|
|
14
|
+
@send-alt-command="onSendAltCommand"
|
|
15
|
+
/>
|
|
16
|
+
</div>
|
|
17
|
+
</template>
|
|
18
|
+
<script setup lang="ts">
|
|
19
|
+
import { useFullscreen } from '@vueuse/core'
|
|
20
|
+
import RFB from '@novnc/novnc/core/rfb.js'
|
|
21
|
+
import SpiceConsole from '~/plugins/spice-console/spice.console'
|
|
22
|
+
import type { UI_I_Localization } from '~/lib/models/interfaces'
|
|
23
|
+
import type { UI_I_VmSettings } from '~/lib/models/store/vm/interfaces'
|
|
24
|
+
|
|
25
|
+
const props = defineProps<{
|
|
26
|
+
wsUrl: string
|
|
27
|
+
vmType: string
|
|
28
|
+
vmId: string
|
|
29
|
+
host: string
|
|
30
|
+
port: number
|
|
31
|
+
}>()
|
|
32
|
+
|
|
33
|
+
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
34
|
+
|
|
35
|
+
let rfb: any
|
|
36
|
+
const vmScreen = ref<any>(null)
|
|
37
|
+
const fullScreen = ref<any>(null)
|
|
38
|
+
const { toggle } = useFullscreen(fullScreen)
|
|
39
|
+
|
|
40
|
+
const connectWS = (): void => {
|
|
41
|
+
if (props.vmType === 'VNC') {
|
|
42
|
+
connectVNC()
|
|
43
|
+
} else if (props.vmType === 'SPICE') {
|
|
44
|
+
SpiceConsole.init(props.wsUrl)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const connectVNC = (): void => {
|
|
49
|
+
rfb = new RFB(vmScreen.value, props.wsUrl, {
|
|
50
|
+
protocols: {},
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const vmDisconnect = (): void => {
|
|
55
|
+
if (props.vmType === 'VNC') {
|
|
56
|
+
if (rfb) {
|
|
57
|
+
rfb.disconnect()
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const onSendAltCommand = (): void => {
|
|
63
|
+
// @ts-ignore
|
|
64
|
+
window.app.sendCtrlAltDelete()
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const onConsoleScroll = (event: any): void => {
|
|
68
|
+
app.clientGui.setClientOffset(
|
|
69
|
+
app.clientGui.clientOffsetX,
|
|
70
|
+
event.target.scrollTop
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const blockCtrlOrCmdCommands = (e): void => {
|
|
75
|
+
const blockedKeys = [
|
|
76
|
+
'e',
|
|
77
|
+
's',
|
|
78
|
+
'p',
|
|
79
|
+
'u',
|
|
80
|
+
'r',
|
|
81
|
+
'o',
|
|
82
|
+
'i',
|
|
83
|
+
'j',
|
|
84
|
+
'k',
|
|
85
|
+
'n',
|
|
86
|
+
't',
|
|
87
|
+
'w',
|
|
88
|
+
'h',
|
|
89
|
+
'd',
|
|
90
|
+
]
|
|
91
|
+
|
|
92
|
+
const key = e.key
|
|
93
|
+
const ctrlOrCmd = e.ctrlKey || e.metaKey
|
|
94
|
+
|
|
95
|
+
// Block Ctrl+key or Cmd+key
|
|
96
|
+
if (ctrlOrCmd && blockedKeys.includes(key.toLowerCase())) {
|
|
97
|
+
e.preventDefault()
|
|
98
|
+
e.stopPropagation()
|
|
99
|
+
// console.log(`Blocked key: ${key}`);
|
|
100
|
+
return false
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Optionally block right-click menu key (context menu)
|
|
104
|
+
// if (e.key === 'ContextMenu') {
|
|
105
|
+
// e.preventDefault();
|
|
106
|
+
// return false;
|
|
107
|
+
// }
|
|
108
|
+
|
|
109
|
+
// Optional: block F5/Reload with Ctrl+R as fallback
|
|
110
|
+
// if (key === 'F5' || (ctrlOrCmd && key.toLowerCase() === 'r')) {
|
|
111
|
+
// e.preventDefault();
|
|
112
|
+
// return false;
|
|
113
|
+
// }
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const isWindow = computed<boolean>(() => useRoute().query.window === 'true')
|
|
117
|
+
const isShowBlocker = ref<boolean>(true)
|
|
118
|
+
const onFocus = (): void => {
|
|
119
|
+
document.getElementById('inputmanager')?.focus()
|
|
120
|
+
isShowBlocker.value = false
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const inputManagerBlur = (): void => {
|
|
124
|
+
isShowBlocker.value = true
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
onMounted(() => {
|
|
128
|
+
connectWS()
|
|
129
|
+
document.addEventListener('keydown', blockCtrlOrCmdCommands)
|
|
130
|
+
window.addEventListener('blur', inputManagerBlur)
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
onBeforeUnmount(() => {
|
|
134
|
+
vmDisconnect()
|
|
135
|
+
document.removeEventListener('keydown', blockCtrlOrCmdCommands)
|
|
136
|
+
window.removeEventListener('blur', inputManagerBlur)
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
// // TODO Этот код решает проблему когда у вм нету пароли, но окно подтверждения все равно открывается
|
|
140
|
+
// const { $store }: any = useNuxtApp()
|
|
141
|
+
// $store.dispatch('vm/A_GET_VM_SETTINGS', props.vmId) // Работает и для Пракуратора и для Сферы
|
|
142
|
+
// const vmSettings = computed<UI_I_VmSettings | null>(
|
|
143
|
+
// () => $store.getters['vm/getVmSettings']
|
|
144
|
+
// )
|
|
145
|
+
// watch(
|
|
146
|
+
// vmSettings,
|
|
147
|
+
// (newValue) => {
|
|
148
|
+
// // @ts-ignore
|
|
149
|
+
// window.vmHasPassword = !!newValue?.options.remote_console.password
|
|
150
|
+
// },
|
|
151
|
+
// { deep: true, immediate: true }
|
|
152
|
+
// )
|
|
153
|
+
</script>
|
|
154
|
+
<style scoped lang="scss">
|
|
155
|
+
.spice-console {
|
|
156
|
+
width: 100vw;
|
|
157
|
+
height: 100vh;
|
|
158
|
+
overflow: hidden;
|
|
159
|
+
position: relative;
|
|
160
|
+
}
|
|
161
|
+
#vmw {
|
|
162
|
+
overflow-y: auto;
|
|
163
|
+
overflow-x: auto;
|
|
164
|
+
position: relative;
|
|
165
|
+
height: 100vh;
|
|
166
|
+
background-color: #000;
|
|
167
|
+
}
|
|
168
|
+
.blocker {
|
|
169
|
+
position: fixed;
|
|
170
|
+
top: 0;
|
|
171
|
+
left: 0;
|
|
172
|
+
width: 100%;
|
|
173
|
+
height: 100%;
|
|
174
|
+
display: flex;
|
|
175
|
+
justify-content: center;
|
|
176
|
+
align-items: center;
|
|
177
|
+
background-color: rgba(0, 0, 0, 0.5);
|
|
178
|
+
z-index: 9999;
|
|
179
|
+
|
|
180
|
+
.blocker-text {
|
|
181
|
+
color: #e4e4e4;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
</style>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export interface UI_I_DeviceOption {
|
|
2
|
-
label: string
|
|
3
|
-
value: any
|
|
4
|
-
disabled?: boolean
|
|
5
|
-
}
|
|
1
|
+
export interface UI_I_DeviceOption {
|
|
2
|
+
label: string
|
|
3
|
+
value: any
|
|
4
|
+
disabled?: boolean
|
|
5
|
+
}
|