bfg-common 1.5.647 → 1.5.649

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 (101) 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/assets/localization/local_be.json +1 -0
  7. package/assets/localization/local_en.json +1 -0
  8. package/assets/localization/local_hy.json +1 -0
  9. package/assets/localization/local_kk.json +1 -0
  10. package/assets/localization/local_ru.json +1 -0
  11. package/assets/localization/local_zh.json +1 -0
  12. package/components/atoms/TheIcon3.vue +50 -50
  13. package/components/atoms/collapse/CollapseNav.vue +170 -170
  14. package/components/atoms/perPage/PerPage.vue +58 -58
  15. package/components/atoms/table/dataGrid/DataGrid.vue +1718 -1718
  16. package/components/atoms/table/dataGrid/DataGridPagination.vue +97 -97
  17. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  18. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  19. package/components/common/backup/storage/actions/add/lib/utils.ts +51 -51
  20. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  21. package/components/common/diagramMain/modals/lib/config/portModal.ts +251 -251
  22. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  23. package/components/common/diagramMain/port/Port.vue +580 -580
  24. package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
  25. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
  26. package/components/common/layout/theHeader/userMenu/modals/changePassword/ChangePassword.vue +99 -90
  27. package/components/common/layout/theHeader/userMenu/modals/changePassword/{ChangePasswordNew.vue → New.vue} +193 -188
  28. package/components/common/layout/theHeader/userMenu/modals/changePassword/{ChangePasswordOld.vue → Old.vue} +2 -0
  29. package/components/common/layout/theHeader/userMenu/modals/changePassword/lib/models/interfaces.ts +3 -0
  30. package/components/common/pages/backups/DetailView.vue +52 -52
  31. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  32. package/components/common/pages/backups/modals/Modals.vue +243 -243
  33. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  34. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
  35. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  36. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  37. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  38. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  39. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  40. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  41. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  42. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  43. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  44. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  45. package/components/common/select/radio/RadioGroup.vue +137 -137
  46. package/components/common/spiceConsole/Drawer.vue +420 -420
  47. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  48. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  49. package/components/common/tools/Actions.vue +207 -207
  50. package/components/common/treeView/TreeView.vue +52 -52
  51. package/components/common/vm/actions/clone/lib/config/steps.ts +295 -295
  52. package/components/common/vm/actions/clone/new/New.vue +438 -437
  53. package/components/common/vm/actions/clone/old/Old.vue +1 -0
  54. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  55. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +283 -283
  56. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +156 -156
  57. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  58. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  59. package/components/common/vm/actions/common/select/options/New.vue +263 -259
  60. package/components/common/vm/actions/common/select/options/Old.vue +109 -102
  61. package/components/common/vm/actions/common/select/options/Options.vue +58 -53
  62. package/components/common/vm/actions/common/select/storage/Old.vue +125 -125
  63. package/components/common/vm/actions/common/select/storage/new/New.vue +311 -311
  64. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  65. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  66. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  67. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  68. package/components/common/wizards/common/compatibility/Compatibility.vue +35 -35
  69. package/components/common/wizards/common/compatibility/New.vue +99 -99
  70. package/components/common/wizards/common/compatibility/Old.vue +53 -53
  71. package/components/common/wizards/common/steps/computeResource/New.vue +93 -93
  72. package/components/common/wizards/common/steps/name/Name.vue +178 -178
  73. package/components/common/wizards/common/steps/name/New.vue +221 -221
  74. package/components/common/wizards/common/steps/name/Old.vue +121 -121
  75. package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
  76. package/components/common/wizards/common/steps/name/location/New.vue +40 -40
  77. package/components/common/wizards/datastore/add/Add.vue +228 -228
  78. package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
  79. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  80. package/composables/useAppVersion.ts +21 -21
  81. package/composables/useLocal.ts +6 -6
  82. package/composables/useLocalCommon.ts +39 -39
  83. package/package.json +2 -2
  84. package/plugins/console.ts +21 -21
  85. package/plugins/mouse.ts +21 -21
  86. package/plugins/panelStates.ts +70 -70
  87. package/plugins/text.ts +59 -59
  88. package/public/spice-console/application/clientgui.js +854 -854
  89. package/public/spice-console/application/packetfactory.js +211 -211
  90. package/public/spice-console/application/virtualmouse.js +147 -147
  91. package/public/spice-console/lib/images/bitmap.js +203 -203
  92. package/public/spice-console/network/spicechannel.js +440 -440
  93. package/public/spice-console/process/cursorprocess.js +128 -128
  94. package/public/spice-console/process/inputprocess.js +227 -227
  95. package/public/spice-console/process/mainprocess.js +212 -212
  96. package/public/spice-console/run.js +210 -210
  97. package/store/main/mutations.ts +7 -7
  98. package/store/main/state.ts +7 -7
  99. package/store/tasks/actions.ts +165 -165
  100. package/store/tasks/mappers/recentTasks.ts +123 -123
  101. package/store/tasks/mutations.ts +82 -82
@@ -1,93 +1,93 @@
1
- <template>
2
- <div class="compute-resource">
3
- <div class="compute-resource__container-tree">
4
- <ui-tree
5
- :nodes="props.nodes"
6
- :expand-all="false"
7
- :is-loading="props.isLoading"
8
- class="compute-resource__tree"
9
- @toggle-node="onShowNodes"
10
- @select-node="onSelectNode"
11
- >
12
- <template #content="{ node }">
13
- <div class="flex-align-center">
14
- <span :class="['node-icon', node.iconClassName]"></span>
15
- <span class="node-name text-ellipsis">{{ node.name }}</span>
16
- </div>
17
- </template>
18
- </ui-tree>
19
- </div>
20
-
21
- <common-wizards-common-compatibility
22
- :loading="props.isLoading"
23
- :status="props.compatibility[0]"
24
- :text="props.compatibility[1]"
25
- />
26
- </div>
27
- </template>
28
-
29
- <script setup lang="ts">
30
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
31
- import type { UI_T_CompatibilityStatus } from '~/components/common/wizards/common/compatibility/lib/models/types'
32
-
33
- const props = withDefaults(
34
- defineProps<{
35
- nodes: UI_I_TreeNode[]
36
- compatibility: [UI_T_CompatibilityStatus, string]
37
- isLoading?: boolean
38
- }>(),
39
- {
40
- isLoading: false,
41
- }
42
- )
43
- const emits = defineEmits<{
44
- (event: 'select-node', value: UI_I_TreeNode): void
45
- (event: 'show-nodes', value: UI_I_TreeNode): void
46
- }>()
47
-
48
- const onShowNodes = (node: UI_I_TreeNode): void => emits('show-nodes', node)
49
- const onSelectNode = (node: UI_I_TreeNode): void => emits('select-node', node)
50
- </script>
51
-
52
- <style scoped lang="scss">
53
- @import 'assets/scss/common/mixins.scss';
54
- .compute-resource {
55
- &__container-tree {
56
- height: 240px;
57
- background: var(--input-bg);
58
- border: 1px solid var(--line-color);
59
- border-radius: 8px;
60
- overflow: hidden;
61
-
62
- :deep(.compute-resource__tree) {
63
- .node-icon {
64
- margin-right: 8px;
65
- }
66
- .node-name {
67
- font-size: 12px;
68
- }
69
- .tree-content {
70
- padding: 8px 8px 0;
71
-
72
- &::-webkit-scrollbar-thumb {
73
- background: var(--move-to-tree-scrollbar-thumb-bg);
74
- border-radius: 8px;
75
- border: solid 3px var(--scrollbar-thumb-transparent-border);
76
- }
77
- &::-webkit-scrollbar-track {
78
- background: transparent;
79
- }
80
- &::-webkit-scrollbar-corner {
81
- background: transparent;
82
- }
83
-
84
- .node-wrapper {
85
- border-top-right-radius: 4px;
86
- border-bottom-right-radius: 4px;
87
- min-height: 26px;
88
- }
89
- }
90
- }
91
- }
92
- }
93
- </style>
1
+ <template>
2
+ <div class="compute-resource">
3
+ <div class="compute-resource__container-tree">
4
+ <ui-tree
5
+ :nodes="props.nodes"
6
+ :expand-all="false"
7
+ :is-loading="props.isLoading"
8
+ class="compute-resource__tree"
9
+ @toggle-node="onShowNodes"
10
+ @select-node="onSelectNode"
11
+ >
12
+ <template #content="{ node }">
13
+ <div class="flex-align-center">
14
+ <span :class="['node-icon', node.iconClassName]"></span>
15
+ <span class="node-name text-ellipsis">{{ node.name }}</span>
16
+ </div>
17
+ </template>
18
+ </ui-tree>
19
+ </div>
20
+
21
+ <common-wizards-common-compatibility
22
+ :loading="props.isLoading"
23
+ :status="props.compatibility[0]"
24
+ :text="props.compatibility[1]"
25
+ />
26
+ </div>
27
+ </template>
28
+
29
+ <script setup lang="ts">
30
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
31
+ import type { UI_T_CompatibilityStatus } from '~/components/common/wizards/common/compatibility/lib/models/types'
32
+
33
+ const props = withDefaults(
34
+ defineProps<{
35
+ nodes: UI_I_TreeNode[]
36
+ compatibility: [UI_T_CompatibilityStatus, string]
37
+ isLoading?: boolean
38
+ }>(),
39
+ {
40
+ isLoading: false,
41
+ }
42
+ )
43
+ const emits = defineEmits<{
44
+ (event: 'select-node', value: UI_I_TreeNode): void
45
+ (event: 'show-nodes', value: UI_I_TreeNode): void
46
+ }>()
47
+
48
+ const onShowNodes = (node: UI_I_TreeNode): void => emits('show-nodes', node)
49
+ const onSelectNode = (node: UI_I_TreeNode): void => emits('select-node', node)
50
+ </script>
51
+
52
+ <style scoped lang="scss">
53
+ @import 'assets/scss/common/mixins.scss';
54
+ .compute-resource {
55
+ &__container-tree {
56
+ height: 240px;
57
+ background: var(--input-bg);
58
+ border: 1px solid var(--line-color);
59
+ border-radius: 8px;
60
+ overflow: hidden;
61
+
62
+ :deep(.compute-resource__tree) {
63
+ .node-icon {
64
+ margin-right: 8px;
65
+ }
66
+ .node-name {
67
+ font-size: 12px;
68
+ }
69
+ .tree-content {
70
+ padding: 8px 8px 0;
71
+
72
+ &::-webkit-scrollbar-thumb {
73
+ background: var(--move-to-tree-scrollbar-thumb-bg);
74
+ border-radius: 8px;
75
+ border: solid 3px var(--scrollbar-thumb-transparent-border);
76
+ }
77
+ &::-webkit-scrollbar-track {
78
+ background: transparent;
79
+ }
80
+ &::-webkit-scrollbar-corner {
81
+ background: transparent;
82
+ }
83
+
84
+ .node-wrapper {
85
+ border-top-right-radius: 4px;
86
+ border-bottom-right-radius: 4px;
87
+ min-height: 26px;
88
+ }
89
+ }
90
+ }
91
+ }
92
+ }
93
+ </style>
@@ -1,178 +1,178 @@
1
- <template>
2
- <common-wizards-common-steps-name-new
3
- v-if="isNewView"
4
- v-model:name="name"
5
- v-model:location="location"
6
- :has-location="props.hasLocation"
7
- :errors="errors"
8
- :location-nodes="props.locationNodes"
9
- :test-ids="props.testIds"
10
- @remove-validation-errors="onRemoveValidationErrors"
11
- />
12
- <common-wizards-common-steps-name-old
13
- v-else
14
- v-model:name="name"
15
- v-model:location="location"
16
- :has-location="props.hasLocation"
17
- :errors="errors"
18
- :location-nodes="props.locationNodes"
19
- :location-description="props.locationDescription"
20
- :test-ids="props.testIds"
21
- @remove-validation-errors="onRemoveValidationErrors"
22
- />
23
- </template>
24
-
25
- <script setup lang="ts">
26
- import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
27
- import type { UI_I_Localization } from '~/lib/models/interfaces'
28
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
29
- import type { UI_I_NameTestIds } from '~/components/common/wizards/common/steps/name/lib/models/interfaces'
30
-
31
- const name = defineModel<string>('name', { required: true })
32
- const location = defineModel<UI_I_TreeNode | null>('location') // для сферы
33
-
34
- const props = withDefaults(
35
- defineProps<{
36
- show: boolean
37
- nameFormSubmit: null | Function
38
- nameRequestUrl: string
39
- nameExistValidationDescription: string
40
- testIds: UI_I_NameTestIds
41
- validationDescription?: string
42
- hasLocation?: boolean
43
- validateEmptyName?: boolean
44
- locationNodes?: UI_I_TreeNode[]
45
- locationDescription?: string
46
- allowedLocationKinds?: number[]
47
- }>(),
48
- {
49
- hasLocation: false,
50
- validateEmptyName: false,
51
- locationDescription: '',
52
- locationNodes: () => [],
53
- allowedLocationKinds: () => [],
54
- }
55
- )
56
- const emits = defineEmits<{
57
- (event: 'submit', value: [string, UI_I_TreeNode | null]): void
58
- (event: 'has-errors', value: boolean): void
59
- }>()
60
-
61
- const { $store }: any = useNuxtApp()
62
- const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
63
-
64
- const localization = computed<UI_I_Localization>(() => useLocal())
65
-
66
- watch(
67
- () => props.nameFormSubmit,
68
- (newValue) => {
69
- newValue && submit(newValue)
70
- }
71
- )
72
-
73
- // TODO defineExpose({
74
- // submit,
75
- // })
76
- const submit = async (cb: Function): Promise<void> => {
77
- if (props.validateEmptyName && name.value === '') {
78
- showValidationErrors([
79
- localization.value.common.emptyNameValidationDescription,
80
- ])
81
- cb(false)
82
- return
83
- }
84
- if (name.value !== '') {
85
- const isNameValid = await checkNameIsValid(name.value)
86
- if (!isNameValid) {
87
- cb(false)
88
- return
89
- }
90
- }
91
-
92
- if (props.hasLocation) {
93
- if (
94
- !location.value ||
95
- (location.value &&
96
- !props.allowedLocationKinds.includes(location.value.kind))
97
- ) {
98
- showValidationErrors([
99
- props.validationDescription,
100
- ])
101
- cb(false)
102
- return
103
- }
104
- }
105
-
106
- onRemoveValidationErrors()
107
- emits('submit', [name.value, location.value])
108
- cb(true)
109
- }
110
- const checkNameIsValid = async (nameLocal: string): Promise<boolean> => {
111
- const nameRequestUrlLocal = props.nameRequestUrl.replace('{name}', nameLocal)
112
- const { error } = await useMyFetch<null, API_UI_I_Error>(
113
- nameRequestUrlLocal,
114
- {
115
- method: 'GET',
116
- }
117
- )
118
- const status = error.value?.statusCode || 200
119
- switch (status) {
120
- case 400: // Empty name
121
- showValidationErrors([
122
- localization.value.common.emptyNameValidationDescription,
123
- ])
124
- return false
125
- case 405: // Invalid kind
126
- showValidationErrors([
127
- localization.value.common.kindValidationDescription,
128
- ])
129
- return false
130
- case 406: // Invalid name
131
- showValidationErrors([
132
- localization.value.common.nameValidationDescription,
133
- ])
134
- return false
135
- case 409: // Name exist
136
- showValidationErrors([
137
- props.nameExistValidationDescription,
138
- ])
139
- return false
140
- }
141
-
142
- return true
143
- }
144
-
145
- const errors = ref<string[]>([])
146
- const showValidationErrors = (data: string[]): void => {
147
- errors.value = data
148
- }
149
- const onRemoveValidationErrors = (): void => {
150
- errors.value = []
151
- }
152
- watch(
153
- errors,
154
- (newValue) => {
155
- emits('has-errors', !newValue.length)
156
- },
157
- { immediate: true, deep: true }
158
- )
159
-
160
- // TODO defineExpose({
161
- // focusNameInput,
162
- // })
163
- watch(
164
- () => props.show,
165
- (newValue) => {
166
- if (!newValue) return
167
-
168
- const input = document.getElementById('virtual-machine-name')
169
- if (!input) return
170
-
171
- setTimeout(() => {
172
- input.focus()
173
- }, 0)
174
- }
175
- )
176
- </script>
177
-
178
- <style scoped lang="scss"></style>
1
+ <template>
2
+ <common-wizards-common-steps-name-new
3
+ v-if="isNewView"
4
+ v-model:name="name"
5
+ v-model:location="location"
6
+ :has-location="props.hasLocation"
7
+ :errors="errors"
8
+ :location-nodes="props.locationNodes"
9
+ :test-ids="props.testIds"
10
+ @remove-validation-errors="onRemoveValidationErrors"
11
+ />
12
+ <common-wizards-common-steps-name-old
13
+ v-else
14
+ v-model:name="name"
15
+ v-model:location="location"
16
+ :has-location="props.hasLocation"
17
+ :errors="errors"
18
+ :location-nodes="props.locationNodes"
19
+ :location-description="props.locationDescription"
20
+ :test-ids="props.testIds"
21
+ @remove-validation-errors="onRemoveValidationErrors"
22
+ />
23
+ </template>
24
+
25
+ <script setup lang="ts">
26
+ import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
27
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
28
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
29
+ import type { UI_I_NameTestIds } from '~/components/common/wizards/common/steps/name/lib/models/interfaces'
30
+
31
+ const name = defineModel<string>('name', { required: true })
32
+ const location = defineModel<UI_I_TreeNode | null>('location') // для сферы
33
+
34
+ const props = withDefaults(
35
+ defineProps<{
36
+ show: boolean
37
+ nameFormSubmit: null | Function
38
+ nameRequestUrl: string
39
+ nameExistValidationDescription: string
40
+ testIds: UI_I_NameTestIds
41
+ validationDescription?: string
42
+ hasLocation?: boolean
43
+ validateEmptyName?: boolean
44
+ locationNodes?: UI_I_TreeNode[]
45
+ locationDescription?: string
46
+ allowedLocationKinds?: number[]
47
+ }>(),
48
+ {
49
+ hasLocation: false,
50
+ validateEmptyName: false,
51
+ locationDescription: '',
52
+ locationNodes: () => [],
53
+ allowedLocationKinds: () => [],
54
+ }
55
+ )
56
+ const emits = defineEmits<{
57
+ (event: 'submit', value: [string, UI_I_TreeNode | null]): void
58
+ (event: 'has-errors', value: boolean): void
59
+ }>()
60
+
61
+ const { $store }: any = useNuxtApp()
62
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
63
+
64
+ const localization = computed<UI_I_Localization>(() => useLocal())
65
+
66
+ watch(
67
+ () => props.nameFormSubmit,
68
+ (newValue) => {
69
+ newValue && submit(newValue)
70
+ }
71
+ )
72
+
73
+ // TODO defineExpose({
74
+ // submit,
75
+ // })
76
+ const submit = async (cb: Function): Promise<void> => {
77
+ if (props.validateEmptyName && name.value === '') {
78
+ showValidationErrors([
79
+ localization.value.common.emptyNameValidationDescription,
80
+ ])
81
+ cb(false)
82
+ return
83
+ }
84
+ if (name.value !== '') {
85
+ const isNameValid = await checkNameIsValid(name.value)
86
+ if (!isNameValid) {
87
+ cb(false)
88
+ return
89
+ }
90
+ }
91
+
92
+ if (props.hasLocation) {
93
+ if (
94
+ !location.value ||
95
+ (location.value &&
96
+ !props.allowedLocationKinds.includes(location.value.kind))
97
+ ) {
98
+ showValidationErrors([
99
+ props.validationDescription,
100
+ ])
101
+ cb(false)
102
+ return
103
+ }
104
+ }
105
+
106
+ onRemoveValidationErrors()
107
+ emits('submit', [name.value, location.value])
108
+ cb(true)
109
+ }
110
+ const checkNameIsValid = async (nameLocal: string): Promise<boolean> => {
111
+ const nameRequestUrlLocal = props.nameRequestUrl.replace('{name}', nameLocal)
112
+ const { error } = await useMyFetch<null, API_UI_I_Error>(
113
+ nameRequestUrlLocal,
114
+ {
115
+ method: 'GET',
116
+ }
117
+ )
118
+ const status = error.value?.statusCode || 200
119
+ switch (status) {
120
+ case 400: // Empty name
121
+ showValidationErrors([
122
+ localization.value.common.emptyNameValidationDescription,
123
+ ])
124
+ return false
125
+ case 405: // Invalid kind
126
+ showValidationErrors([
127
+ localization.value.common.kindValidationDescription,
128
+ ])
129
+ return false
130
+ case 406: // Invalid name
131
+ showValidationErrors([
132
+ localization.value.common.nameValidationDescription,
133
+ ])
134
+ return false
135
+ case 409: // Name exist
136
+ showValidationErrors([
137
+ props.nameExistValidationDescription,
138
+ ])
139
+ return false
140
+ }
141
+
142
+ return true
143
+ }
144
+
145
+ const errors = ref<string[]>([])
146
+ const showValidationErrors = (data: string[]): void => {
147
+ errors.value = data
148
+ }
149
+ const onRemoveValidationErrors = (): void => {
150
+ errors.value = []
151
+ }
152
+ watch(
153
+ errors,
154
+ (newValue) => {
155
+ emits('has-errors', !newValue.length)
156
+ },
157
+ { immediate: true, deep: true }
158
+ )
159
+
160
+ // TODO defineExpose({
161
+ // focusNameInput,
162
+ // })
163
+ watch(
164
+ () => props.show,
165
+ (newValue) => {
166
+ if (!newValue) return
167
+
168
+ const input = document.getElementById('virtual-machine-name')
169
+ if (!input) return
170
+
171
+ setTimeout(() => {
172
+ input.focus()
173
+ }, 0)
174
+ }
175
+ )
176
+ </script>
177
+
178
+ <style scoped lang="scss"></style>