bfg-common 1.5.368 → 1.5.370

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 (152) 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 +7 -1
  7. package/assets/localization/local_en.json +7 -1
  8. package/assets/localization/local_hy.json +7 -1
  9. package/assets/localization/local_kk.json +7 -1
  10. package/assets/localization/local_ru.json +7 -1
  11. package/assets/localization/local_zh.json +7 -1
  12. package/components/atoms/TheIcon3.vue +50 -50
  13. package/components/atoms/collapse/CollapseNav.vue +170 -170
  14. package/components/atoms/collapse/CollapseNavItem.vue +226 -226
  15. package/components/atoms/nav/NavBar.vue +147 -147
  16. package/components/atoms/perPage/PerPage.vue +58 -58
  17. package/components/atoms/table/dataGrid/DataGrid.vue +1717 -1717
  18. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  19. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  20. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  21. package/components/common/backup/storage/actions/add/lib/config/steps.ts +168 -168
  22. package/components/common/backup/storage/actions/add/steps/hostAccessibility/HostAccessibility.vue +52 -52
  23. package/components/common/backup/storage/actions/add/steps/readyComplete/ReadyComplete.vue +45 -45
  24. package/components/common/backup/storage/actions/delete/Delete.vue +65 -65
  25. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  26. package/components/common/context/lib/models/interfaces.ts +33 -33
  27. package/components/common/diagramMain/DiagramMain.vue +897 -897
  28. package/components/common/diagramMain/modals/lib/config/networkModal.ts +398 -398
  29. package/components/common/diagramMain/network/Network.vue +141 -141
  30. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  31. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  32. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  33. package/components/common/pages/home/headline/Headline.vue +45 -45
  34. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  35. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  36. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  37. package/components/common/pages/home/widgets/WidgetsNew.vue +88 -88
  38. package/components/common/pages/home/widgets/WidgetsOld.vue +36 -36
  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/Vms.vue +26 -26
  42. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  43. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  44. package/components/common/pages/packages/Packages.vue +208 -208
  45. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  46. package/components/common/readyToComplete/New.vue +129 -129
  47. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  48. package/components/common/recursionTree/RecursionTree.vue +223 -223
  49. package/components/common/select/button/ButtonDropdown.vue +112 -112
  50. package/components/common/spiceConsole/Drawer.vue +377 -377
  51. package/components/common/spiceConsole/SpiceConsole.vue +127 -127
  52. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  53. package/components/common/tools/Actions.vue +207 -207
  54. package/components/common/vm/actions/add/New.vue +14 -0
  55. package/components/common/vm/actions/add/Old.vue +388 -388
  56. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  57. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  58. package/components/common/vm/actions/add/folderTreeView/Old.vue +50 -50
  59. package/components/common/vm/actions/clone/Clone.vue +823 -823
  60. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  61. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  62. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +321 -321
  63. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +227 -227
  64. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +100 -100
  65. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  66. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +78 -78
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  72. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/tooltip/TooltipNew.vue +154 -154
  73. package/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/config/dropdownItems.ts +155 -155
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +307 -307
  76. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +385 -385
  77. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +154 -154
  78. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +85 -85
  79. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +288 -288
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +94 -94
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  85. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  86. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  87. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  88. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCard.vue +154 -154
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/numberDisplays/NumberDisplays.vue +53 -53
  94. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +155 -155
  95. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +130 -130
  96. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsOld.vue +113 -113
  97. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +32 -32
  98. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +60 -60
  99. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +174 -174
  100. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptions.vue +95 -95
  101. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsOld.vue +155 -155
  102. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  103. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapOld.vue +44 -44
  104. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  105. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  106. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  107. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  108. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +143 -143
  109. package/components/common/vm/actions/common/select/computeResource/New.vue +184 -184
  110. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +131 -131
  111. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  112. package/components/common/vm/actions/common/select/createType/lib/config/items.ts +48 -48
  113. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  114. package/components/common/vm/actions/common/select/name/Name.vue +174 -174
  115. package/components/common/vm/actions/common/select/options/New.vue +189 -0
  116. package/components/common/vm/actions/common/select/options/Old.vue +70 -0
  117. package/components/common/vm/actions/common/select/options/Options.vue +15 -57
  118. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  119. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  120. package/components/common/vm/actions/common/select/storage/Storage.vue +155 -155
  121. package/components/common/vm/actions/common/select/storage/new/New.vue +300 -300
  122. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  123. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  124. package/components/common/vm/actions/common/select/template/Template.vue +26 -20
  125. package/components/common/vm/actions/common/select/template/new/New.vue +42 -0
  126. package/components/common/vm/actions/common/select/template/old/Old.vue +34 -0
  127. package/components/common/vm/actions/common/select/template/treeView/New.vue +89 -0
  128. package/components/common/vm/actions/common/select/template/treeView/Old.vue +50 -0
  129. package/components/common/vm/actions/common/select/template/{TemplateTreeView.vue → treeView/TreeView.vue} +30 -38
  130. package/components/common/vm/actions/editSettings/EditSettings.vue +242 -242
  131. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  132. package/components/common/vmt/actions/add/lib/models/interfaces.ts +23 -23
  133. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +104 -104
  134. package/components/common/wizards/network/add/steps/SelectedTargetDevice.vue +467 -467
  135. package/components/common/wizards/vm/migrate/Migrate.vue +349 -349
  136. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  137. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  138. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  139. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  140. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  141. package/components/common/wizards/vm/migrate/select/type/lib/config/typeOptions.ts +45 -45
  142. package/composables/productNameLocal.ts +30 -30
  143. package/composables/useAppVersion.ts +21 -21
  144. package/package.json +1 -1
  145. package/plugins/date.ts +233 -233
  146. package/plugins/panelStates.ts +70 -70
  147. package/plugins/text.ts +59 -59
  148. package/public/spice-console/lib/images/bitmap.js +203 -203
  149. package/public/spice-console/network/spicechannel.js +387 -387
  150. package/store/main/mutations.ts +7 -7
  151. package/store/main/state.ts +7 -7
  152. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,174 +1,174 @@
1
- <template>
2
- <common-vm-actions-common-select-name-new
3
- v-if="isNewView"
4
- v-model:vm-name="vmName"
5
- v-model:is-show-help="isShowHelp"
6
- :project="props.project"
7
- :errors="errors"
8
- :data-center="props.dataCenter"
9
- @remove-validation-errors="onRemoveValidationErrors"
10
- @select-node="onSelectNode"
11
- />
12
- <common-vm-actions-common-select-name-old
13
- v-else
14
- v-model:vm-name="vmName"
15
- v-model:is-show-help="isShowHelp"
16
- :project="props.project"
17
- :errors="errors"
18
- :data-center="props.dataCenter"
19
- @remove-validation-errors="onRemoveValidationErrors"
20
- @select-node="onSelectNode"
21
- />
22
- </template>
23
-
24
- <script setup lang="ts">
25
- // import { API_UI_I_Error } from '~/lib/models/store/interfaces'
26
- import type { UI_I_Localization } from '~/lib/models/interfaces'
27
- import type { UI_T_Project } from '~/lib/models/types'
28
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
29
-
30
- const props = defineProps<{
31
- nameFormSubmit: null | Function
32
- show: boolean
33
- project: UI_T_Project
34
- dataCenter?: UI_I_TreeNode // для сферы
35
- }>()
36
- const emits = defineEmits<{
37
- (event: 'submit', value: [string, UI_I_TreeNode | null]): void
38
- (event: 'loading', value: boolean): void
39
- (
40
- event: 'check-name',
41
- value: [[string, UI_I_TreeNode | null], (error: any) => void]
42
- ): void
43
- (event: 'has-errors', value: boolean): void
44
- }>()
45
-
46
- const { $store }: any = useNuxtApp()
47
- const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
48
-
49
- const localization = computed<UI_I_Localization>(() => useLocal())
50
-
51
- const vmName = ref<string>('')
52
-
53
- const selectedNode = ref<UI_I_TreeNode | null>(null)
54
- const onSelectNode = (node: UI_I_TreeNode): void => {
55
- selectedNode.value = node
56
- }
57
-
58
- watch(
59
- () => props.nameFormSubmit,
60
- (newValue) => {
61
- newValue && submit(newValue)
62
- }
63
- )
64
-
65
- const isParentDatacenter = (node: UI_I_TreeNode | null): boolean => {
66
- if (!node) return false
67
-
68
- if (node.parent?.type === 'datacenter') return true
69
- if (node.parent?.type === 'folder') return isParentDatacenter(node.parent)
70
- return false
71
- }
72
- const submit = async (cb: Function): Promise<void> => {
73
- const name = vmName.value
74
-
75
- if (name !== '') {
76
- const isNameValid = await checkNameIsValid(name)
77
- if (!isNameValid) {
78
- cb(false)
79
- return
80
- }
81
- }
82
-
83
- if (props.project === 'sphere') {
84
- // const isDatacenterFolder = isParentDatacenter(selectedNode.value)
85
-
86
- if (
87
- // selectedNode.value?.type !== 'datacenter' &&
88
- // selectedNode.value?.type === 'folder' &&
89
- // !isDatacenterFolder
90
- // TODO рефакторинг, здесь сейчас проверяем является ли выбранный элемент датацентром или папкой(вм)
91
- ![3, 7].includes(selectedNode.value?.kind)
92
- ) {
93
- showValidationErrors([
94
- localization.value.common.enterValidLocationVirtualMachine,
95
- ])
96
- cb(false)
97
- return
98
- }
99
- }
100
-
101
- onRemoveValidationErrors()
102
- emits('submit', [name, selectedNode.value])
103
- cb(true)
104
- }
105
- const checkNameIsValid = async (name: string): Promise<boolean> => {
106
- emits('loading', true)
107
-
108
- return new Promise((resolve) => {
109
- emits('check-name', [
110
- [name, selectedNode.value],
111
- (error) => {
112
- emits('loading', false)
113
-
114
- const status = error?.statusCode || 200
115
- switch (status) {
116
- case 405: // Invalid kind
117
- showValidationErrors([
118
- localization.value.common.kindValidationDescription,
119
- ])
120
- resolve(false)
121
- break
122
- case 406: // Invalid name
123
- showValidationErrors([
124
- localization.value.common.vmNameValidationDescription,
125
- ])
126
- resolve(false)
127
- break
128
- case 409: // Name exist
129
- showValidationErrors([
130
- localization.value.common.vmNameExistInSelectedLocation,
131
- ])
132
- resolve(false)
133
- break
134
- }
135
-
136
- resolve(true)
137
- },
138
- ])
139
- })
140
- }
141
-
142
- const errors = ref<string[]>([])
143
- const showValidationErrors = (data: string[]): void => {
144
- errors.value = data
145
- }
146
- const onRemoveValidationErrors = (): void => {
147
- errors.value = []
148
- }
149
- watch(
150
- errors,
151
- (newValue) => {
152
- emits('has-errors', !newValue.length)
153
- },
154
- { immediate: true, deep: true }
155
- )
156
-
157
- watch(
158
- () => props.show,
159
- (newValue) => {
160
- if (!newValue) return
161
-
162
- const input = document.getElementById('virtual-machine-name')
163
- if (!input) return
164
-
165
- setTimeout(() => {
166
- input.focus()
167
- }, 0)
168
- }
169
- )
170
-
171
- const isShowHelp = ref<boolean>(false)
172
- </script>
173
-
174
- <style scoped lang="scss"></style>
1
+ <template>
2
+ <common-vm-actions-common-select-name-new
3
+ v-if="isNewView"
4
+ v-model:vm-name="vmName"
5
+ v-model:is-show-help="isShowHelp"
6
+ :project="props.project"
7
+ :errors="errors"
8
+ :data-center="props.dataCenter"
9
+ @remove-validation-errors="onRemoveValidationErrors"
10
+ @select-node="onSelectNode"
11
+ />
12
+ <common-vm-actions-common-select-name-old
13
+ v-else
14
+ v-model:vm-name="vmName"
15
+ v-model:is-show-help="isShowHelp"
16
+ :project="props.project"
17
+ :errors="errors"
18
+ :data-center="props.dataCenter"
19
+ @remove-validation-errors="onRemoveValidationErrors"
20
+ @select-node="onSelectNode"
21
+ />
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ // import { API_UI_I_Error } from '~/lib/models/store/interfaces'
26
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
27
+ import type { UI_T_Project } from '~/lib/models/types'
28
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
29
+
30
+ const props = defineProps<{
31
+ nameFormSubmit: null | Function
32
+ show: boolean
33
+ project: UI_T_Project
34
+ dataCenter?: UI_I_TreeNode // для сферы
35
+ }>()
36
+ const emits = defineEmits<{
37
+ (event: 'submit', value: [string, UI_I_TreeNode | null]): void
38
+ (event: 'loading', value: boolean): void
39
+ (
40
+ event: 'check-name',
41
+ value: [[string, UI_I_TreeNode | null], (error: any) => void]
42
+ ): void
43
+ (event: 'has-errors', value: boolean): void
44
+ }>()
45
+
46
+ const { $store }: any = useNuxtApp()
47
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
48
+
49
+ const localization = computed<UI_I_Localization>(() => useLocal())
50
+
51
+ const vmName = ref<string>('')
52
+
53
+ const selectedNode = ref<UI_I_TreeNode | null>(null)
54
+ const onSelectNode = (node: UI_I_TreeNode): void => {
55
+ selectedNode.value = node
56
+ }
57
+
58
+ watch(
59
+ () => props.nameFormSubmit,
60
+ (newValue) => {
61
+ newValue && submit(newValue)
62
+ }
63
+ )
64
+
65
+ const isParentDatacenter = (node: UI_I_TreeNode | null): boolean => {
66
+ if (!node) return false
67
+
68
+ if (node.parent?.type === 'datacenter') return true
69
+ if (node.parent?.type === 'folder') return isParentDatacenter(node.parent)
70
+ return false
71
+ }
72
+ const submit = async (cb: Function): Promise<void> => {
73
+ const name = vmName.value
74
+
75
+ if (name !== '') {
76
+ const isNameValid = await checkNameIsValid(name)
77
+ if (!isNameValid) {
78
+ cb(false)
79
+ return
80
+ }
81
+ }
82
+
83
+ if (props.project === 'sphere') {
84
+ // const isDatacenterFolder = isParentDatacenter(selectedNode.value)
85
+
86
+ if (
87
+ // selectedNode.value?.type !== 'datacenter' &&
88
+ // selectedNode.value?.type === 'folder' &&
89
+ // !isDatacenterFolder
90
+ // TODO рефакторинг, здесь сейчас проверяем является ли выбранный элемент датацентром или папкой(вм)
91
+ ![3, 7].includes(selectedNode.value?.kind)
92
+ ) {
93
+ showValidationErrors([
94
+ localization.value.common.enterValidLocationVirtualMachine,
95
+ ])
96
+ cb(false)
97
+ return
98
+ }
99
+ }
100
+
101
+ onRemoveValidationErrors()
102
+ emits('submit', [name, selectedNode.value])
103
+ cb(true)
104
+ }
105
+ const checkNameIsValid = async (name: string): Promise<boolean> => {
106
+ emits('loading', true)
107
+
108
+ return new Promise((resolve) => {
109
+ emits('check-name', [
110
+ [name, selectedNode.value],
111
+ (error) => {
112
+ emits('loading', false)
113
+
114
+ const status = error?.statusCode || 200
115
+ switch (status) {
116
+ case 405: // Invalid kind
117
+ showValidationErrors([
118
+ localization.value.common.kindValidationDescription,
119
+ ])
120
+ resolve(false)
121
+ break
122
+ case 406: // Invalid name
123
+ showValidationErrors([
124
+ localization.value.common.vmNameValidationDescription,
125
+ ])
126
+ resolve(false)
127
+ break
128
+ case 409: // Name exist
129
+ showValidationErrors([
130
+ localization.value.common.vmNameExistInSelectedLocation,
131
+ ])
132
+ resolve(false)
133
+ break
134
+ }
135
+
136
+ resolve(true)
137
+ },
138
+ ])
139
+ })
140
+ }
141
+
142
+ const errors = ref<string[]>([])
143
+ const showValidationErrors = (data: string[]): void => {
144
+ errors.value = data
145
+ }
146
+ const onRemoveValidationErrors = (): void => {
147
+ errors.value = []
148
+ }
149
+ watch(
150
+ errors,
151
+ (newValue) => {
152
+ emits('has-errors', !newValue.length)
153
+ },
154
+ { immediate: true, deep: true }
155
+ )
156
+
157
+ watch(
158
+ () => props.show,
159
+ (newValue) => {
160
+ if (!newValue) return
161
+
162
+ const input = document.getElementById('virtual-machine-name')
163
+ if (!input) return
164
+
165
+ setTimeout(() => {
166
+ input.focus()
167
+ }, 0)
168
+ }
169
+ )
170
+
171
+ const isShowHelp = ref<boolean>(false)
172
+ </script>
173
+
174
+ <style scoped lang="scss"></style>
@@ -0,0 +1,189 @@
1
+ <template>
2
+ <div
3
+ ref="mainContainer"
4
+ :class="['select-options grid gap-3 mt-4', { 'is-sm-size': isContainerSm }]"
5
+ >
6
+ <div
7
+ :class="[
8
+ 'checkbox-container',
9
+ { checked: isCustomizeOs },
10
+ { disabled: props.isCreateTemplate },
11
+ ]"
12
+ @click.stop.prevent="onToggleCustomizeOs"
13
+ >
14
+ <ui-checkbox
15
+ v-model="isCustomizeOs"
16
+ :label-text="localization.vmWizard.customizeOS"
17
+ :title="localization.vmWizard.customizeOS"
18
+ :disabled="props.isCreateTemplate"
19
+ test-id="customize-os"
20
+ />
21
+ <p class="checkbox-block-description mt-2 ml-7 mr-3">
22
+ {{ localization.vmWizard.customizeOperatingSystem }}
23
+ </p>
24
+ </div>
25
+ <div
26
+ v-if="!props.isCreateTemplate"
27
+ :class="[
28
+ 'checkbox-container',
29
+ { checked: isCustomizeHardware },
30
+ { disabled: props.isCreateTemplate },
31
+ ]"
32
+ @click.stop.prevent="onToggleCustomizeHardware"
33
+ >
34
+ <ui-checkbox
35
+ v-model="isCustomizeHardware"
36
+ :label-text="localization.common.customizeHardware"
37
+ :title="localization.common.customizeHardware"
38
+ :disabled="props.isCreateTemplate"
39
+ test-id="customize-hardware"
40
+ />
41
+ <p class="checkbox-block-description mt-2 ml-7 mr-3">
42
+ {{ localization.vmWizard.customizeVMHardware }}
43
+ </p>
44
+ </div>
45
+ <div
46
+ :class="[
47
+ 'checkbox-container',
48
+ { checked: isPowerOn },
49
+ { disabled: props.isCreateTemplate },
50
+ ]"
51
+ @click.stop.prevent="onTogglePowerOn"
52
+ >
53
+ <ui-checkbox
54
+ v-model="isPowerOn"
55
+ :label-text="localization.vmWizard.autoPowerOn"
56
+ :title="localization.vmWizard.autoPowerOn"
57
+ :disabled="props.isCreateTemplate"
58
+ test-id="power-on"
59
+ />
60
+ <p class="checkbox-block-description mt-2 ml-7 mr-3">
61
+ {{ localization.vmWizard.powerVMAfterCreation }}
62
+ </p>
63
+ </div>
64
+ </div>
65
+ </template>
66
+
67
+ <script setup lang="ts">
68
+ import { useElementSize } from '@vueuse/core'
69
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
70
+
71
+ const modelValue = defineModel<string[]>({ required: true })
72
+
73
+ const props = defineProps<{
74
+ isCreateTemplate?: boolean // TODO change
75
+ }>()
76
+
77
+ const localization = computed<UI_I_Localization>(() => useLocal())
78
+
79
+ const mainContainer = ref<HTMLElement | null>(null)
80
+ const { width: mainContainerWidth } = useElementSize(mainContainer)
81
+
82
+ const isCustomizeOs = ref<boolean>(false)
83
+ const isCustomizeHardware = ref<boolean>(false)
84
+ const isPowerOn = ref<boolean>(false)
85
+
86
+ const onToggleCustomizeOs = (): void => {
87
+ if (props.isCreateTemplate) return
88
+
89
+ isCustomizeOs.value = !isCustomizeOs.value
90
+ if (isCustomizeOs.value) {
91
+ !modelValue.value.includes('customize-os') &&
92
+ modelValue.value.push('customize-os')
93
+ } else {
94
+ modelValue.value = modelValue.value.filter(
95
+ (item) => item !== 'customize-os'
96
+ )
97
+ }
98
+ }
99
+
100
+ const onToggleCustomizeHardware = (): void => {
101
+ if (props.isCreateTemplate) return
102
+
103
+ isCustomizeHardware.value = !isCustomizeHardware.value
104
+ if (isCustomizeHardware.value) {
105
+ !modelValue.value.includes('customize-hardware') &&
106
+ modelValue.value.push('customize-hardware')
107
+ } else {
108
+ modelValue.value = modelValue.value.filter(
109
+ (item) => item !== 'customize-hardware'
110
+ )
111
+ }
112
+ }
113
+
114
+ const onTogglePowerOn = (): void => {
115
+ if (props.isCreateTemplate) return
116
+
117
+ isPowerOn.value = !isPowerOn.value
118
+ if (isPowerOn.value) {
119
+ !modelValue.value.includes('power-on') && modelValue.value.push('power-on')
120
+ } else {
121
+ modelValue.value = modelValue.value.filter((item) => item !== 'power-on')
122
+ }
123
+ }
124
+
125
+ const isContainerSm = ref<boolean>(false)
126
+ watch(
127
+ mainContainerWidth,
128
+ (newValue) => {
129
+ isContainerSm.value = newValue <= 600
130
+ },
131
+ { immediate: true }
132
+ )
133
+ </script>
134
+
135
+ <style>
136
+ :root {
137
+ --radio-btn-active-label-bg-color: #f0f8fd;
138
+ --radio-btn-active-label-border-color: #008fd6;
139
+ }
140
+ :root.dark-theme {
141
+ --radio-btn-active-label-bg-color: #2ba2de14;
142
+ --radio-btn-active-label-border-color: #2ba2de;
143
+ }
144
+ </style>
145
+
146
+ <style scoped lang="scss">
147
+ .select-options {
148
+ grid-template-columns: 1fr 1fr 1fr;
149
+ grid-template-rows: max-content;
150
+ overflow-y: auto;
151
+ padding-bottom: 16px;
152
+
153
+ &.is-sm-size {
154
+ grid-template-columns: 1fr;
155
+ }
156
+
157
+ .checkbox-container {
158
+ width: 100%;
159
+ background-color: var(--select-bg);
160
+ border-radius: 8px;
161
+ padding: 12px;
162
+ transition: box-shadow 0.1s ease-in-out;
163
+ box-shadow: inset 0 0 0 1px var(--line-color);
164
+
165
+ &.disabled {
166
+ cursor: not-allowed;
167
+ }
168
+ &:not(.disabled):hover {
169
+ cursor: pointer;
170
+ }
171
+ &:not(.disabled):not(.checked):hover {
172
+ box-shadow: inset 0 0 0 1px var(--select-border);
173
+ }
174
+ &.checked {
175
+ background-color: var(--radio-btn-active-label-bg-color);
176
+ box-shadow: inset 0 0 0 1.5px var(--radio-btn-active-label-border-color);
177
+ }
178
+
179
+ :deep(.ui-checkbox-label) {
180
+ align-items: flex-start;
181
+ }
182
+
183
+ .checkbox-block-description {
184
+ color: #9da6ad;
185
+ line-height: 18px;
186
+ }
187
+ }
188
+ }
189
+ </style>
@@ -0,0 +1,70 @@
1
+ <template>
2
+ <div :class="['select-options', { disabled: props.isCreateTemplate }]">
3
+ <div class="checkbox">
4
+ <input
5
+ id="customize-os"
6
+ v-model="modelValue"
7
+ data-id="customize-os"
8
+ type="checkbox"
9
+ value="customize-os"
10
+ :disabled="props.isCreateTemplate"
11
+ />
12
+ <label for="customize-os">{{
13
+ localization.common.customizeTheOperatingSystem
14
+ }}</label>
15
+ </div>
16
+ <div v-if="!props.isCreateTemplate" class="checkbox">
17
+ <input
18
+ id="customize-hardware"
19
+ v-model="modelValue"
20
+ data-id="customize-hardware"
21
+ type="checkbox"
22
+ value="customize-hardware"
23
+ />
24
+ <label for="customize-hardware">{{
25
+ localization.common.customizeThisVirtualMachineHardware
26
+ }}</label>
27
+ </div>
28
+ <div class="checkbox">
29
+ <input
30
+ id="power-on"
31
+ v-model="modelValue"
32
+ data-id="power-on"
33
+ type="checkbox"
34
+ value="power-on"
35
+ :disabled="props.isCreateTemplate"
36
+ />
37
+ <label for="power-on">{{
38
+ localization.common.powerOnVirtualMachineAfterCreation
39
+ }}</label>
40
+ </div>
41
+ </div>
42
+ </template>
43
+
44
+ <script setup lang="ts">
45
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
46
+
47
+ const modelValue = defineModel<string[]>()
48
+
49
+ const props = defineProps<{
50
+ isCreateTemplate?: boolean // TODO change
51
+ }>()
52
+
53
+ const localization = computed<UI_I_Localization>(() => useLocal())
54
+ </script>
55
+
56
+ <style scoped lang="scss">
57
+ .select-options {
58
+ padding: 12px 0 0;
59
+
60
+ &.disabled {
61
+ input,
62
+ label {
63
+ cursor: not-allowed;
64
+ }
65
+ }
66
+ .checkbox {
67
+ margin: 6px 0;
68
+ }
69
+ }
70
+ </style>