bfg-common 1.5.678 → 1.5.682

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 (117) 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/DataGrid.vue +1718 -1718
  10. package/components/atoms/table/dataGrid/DataGridPagination.vue +97 -97
  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/common/backup/storage/actions/add/lib/utils.ts +51 -51
  14. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  15. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  16. package/components/common/diagramMain/port/Port.vue +580 -580
  17. package/components/common/layout/theHeader/TheHeaderNew.vue +315 -315
  18. package/components/common/layout/theHeader/TheHeaderOld.vue +262 -262
  19. package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
  20. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
  21. package/components/common/layout/theHeader/userMenu/modals/changePassword/ChangePassword.vue +93 -93
  22. package/components/common/layout/theHeader/userMenu/modals/changePassword/New.vue +193 -193
  23. package/components/common/layout/theHeader/userMenu/modals/preferences/PreferencesOld.vue +144 -144
  24. package/components/common/layout/theHeader/userMenu/modals/preferences/lib/models/types.ts +7 -7
  25. package/components/common/layout/theHeader/userMenu/modals/preferences/security/Old.vue +216 -216
  26. package/components/common/layout/theHeader/userMenu/modals/preferences/security/Security.vue +31 -31
  27. package/components/common/pages/backups/DetailView.vue +52 -52
  28. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  29. package/components/common/pages/backups/modals/Modals.vue +243 -243
  30. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  31. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
  32. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  33. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  34. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  35. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  36. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  37. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  38. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  39. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  40. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  41. package/components/common/qr/Qr.vue +57 -57
  42. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  43. package/components/common/select/radio/RadioGroup.vue +137 -137
  44. package/components/common/spiceConsole/Drawer.vue +420 -420
  45. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  46. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  47. package/components/common/tools/Actions.vue +207 -207
  48. package/components/common/treeView/TreeView.vue +52 -52
  49. package/components/common/vm/actions/add/New.vue +1 -1
  50. package/components/common/vm/actions/add/Old.vue +1 -1
  51. package/components/common/vm/actions/clone/lib/config/steps.ts +295 -295
  52. package/components/common/vm/actions/clone/new/New.vue +438 -438
  53. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  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/virtualHardware/newHardDisk/NewHardDisk.vue +489 -489
  57. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +156 -156
  58. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  59. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  60. package/components/common/vm/actions/common/select/options/New.vue +264 -264
  61. package/components/common/vm/actions/common/select/options/Old.vue +109 -110
  62. package/components/common/vm/actions/common/select/options/Options.vue +58 -58
  63. package/components/common/vm/actions/common/select/storage/Old.vue +125 -125
  64. package/components/common/vm/actions/common/select/storage/new/New.vue +311 -311
  65. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  66. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  67. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  68. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  69. package/components/common/wizards/common/compatibility/Compatibility.vue +35 -35
  70. package/components/common/wizards/common/compatibility/New.vue +99 -99
  71. package/components/common/wizards/common/compatibility/Old.vue +53 -53
  72. package/components/common/wizards/common/steps/computeResource/New.vue +93 -93
  73. package/components/common/wizards/common/steps/name/Name.vue +178 -178
  74. package/components/common/wizards/common/steps/name/New.vue +221 -221
  75. package/components/common/wizards/common/steps/name/Old.vue +121 -121
  76. package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
  77. package/components/common/wizards/common/steps/name/location/New.vue +40 -40
  78. package/components/common/wizards/datastore/add/Add.vue +228 -228
  79. package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
  80. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  81. package/composables/useAppVersion.ts +21 -21
  82. package/composables/useEnvLanguage.ts +22 -22
  83. package/composables/useLocal.ts +6 -6
  84. package/composables/useLocalCommon.ts +39 -39
  85. package/lib/models/enums.ts +1 -65
  86. package/package.json +1 -1
  87. package/plugins/console.ts +21 -21
  88. package/plugins/mouse.ts +21 -21
  89. package/plugins/panelStates.ts +70 -70
  90. package/plugins/text.ts +59 -59
  91. package/public/spice-console/application/clientgui.js +854 -854
  92. package/public/spice-console/application/packetfactory.js +211 -211
  93. package/public/spice-console/application/virtualmouse.js +147 -147
  94. package/public/spice-console/lib/images/bitmap.js +203 -203
  95. package/public/spice-console/network/spicechannel.js +440 -440
  96. package/public/spice-console/process/cursorprocess.js +128 -128
  97. package/public/spice-console/process/inputprocess.js +227 -227
  98. package/public/spice-console/process/mainprocess.js +212 -212
  99. package/public/spice-console/run.js +210 -210
  100. package/store/main/mutations.ts +7 -7
  101. package/store/main/state.ts +7 -7
  102. package/store/tasks/actions.ts +165 -165
  103. package/store/tasks/mappers/recentTasks.ts +123 -123
  104. package/store/tasks/mutations.ts +82 -82
  105. package/components/common/layout/bottomPanel/BottomPanel.vue +0 -64
  106. package/components/common/layout/bottomPanel/New.vue +0 -227
  107. package/components/common/layout/bottomPanel/Old.vue +0 -144
  108. package/components/common/layout/bottomPanel/lib/config/statusFilter.ts +0 -19
  109. package/components/common/layout/bottomPanel/lib/models/types.ts +0 -1
  110. package/components/common/layout/bottomPanel/recentTasks/RecentTasks.vue +0 -49
  111. package/components/common/layout/bottomPanel/recentTasks/lib/models/interfaces.ts +0 -14
  112. package/components/common/layout/bottomPanel/recentTasks/new/New.vue +0 -428
  113. package/components/common/layout/bottomPanel/recentTasks/new/lib/config/config.ts +0 -259
  114. package/components/common/layout/bottomPanel/recentTasks/old/Old.vue +0 -277
  115. package/components/common/layout/bottomPanel/recentTasks/old/lib/config/recentTaskTable.ts +0 -240
  116. package/components/common/layout/bottomPanel/recentTasks/old/lib/config/tableKeys.ts +0 -15
  117. package/components/common/layout/bottomPanel/recentTasks/old/lib/models/types.ts +0 -14
@@ -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>