bfg-common 1.5.165 → 1.5.166

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 (131) 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 +4 -3
  7. package/assets/localization/local_en.json +5 -4
  8. package/assets/localization/local_hy.json +4 -3
  9. package/assets/localization/local_kk.json +4 -3
  10. package/assets/localization/local_ru.json +5 -4
  11. package/assets/localization/local_zh.json +2 -1
  12. package/components/atoms/TheIcon3.vue +50 -50
  13. package/components/atoms/modal/Modal.vue +0 -1
  14. package/components/atoms/perPage/PerPage.vue +58 -58
  15. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  16. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  17. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  18. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  19. package/components/common/context/lib/models/interfaces.ts +31 -31
  20. package/components/common/context/recursion/RecursionNew.vue +238 -238
  21. package/components/common/diagramMain/DiagramMain.vue +897 -897
  22. package/components/common/diagramMain/Header.vue +214 -214
  23. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  24. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  25. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  26. package/components/common/pages/home/headline/Headline.vue +45 -45
  27. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  28. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  29. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  30. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  31. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  32. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  33. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  34. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  35. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  36. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  37. package/components/common/pages/packages/Packages.vue +208 -208
  38. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  39. package/components/common/readyToComplete/New.vue +66 -66
  40. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  41. package/components/common/recursionTree/RecursionTree.vue +223 -223
  42. package/components/common/select/button/ButtonDropdown.vue +108 -108
  43. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  44. package/components/common/vm/actions/add/Add.vue +785 -785
  45. package/components/common/vm/actions/add/New.vue +556 -556
  46. package/components/common/vm/actions/add/Old.vue +371 -371
  47. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  48. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  49. package/components/common/vm/actions/add/folderTreeView/Old.vue +50 -50
  50. package/components/common/vm/actions/add/lib/config/steps.ts +263 -263
  51. package/components/common/vm/actions/clone/Clone.vue +810 -810
  52. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  53. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +626 -626
  54. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  55. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  56. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  57. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +100 -100
  58. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  59. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  60. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  61. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  62. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  63. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  64. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  65. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  66. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +375 -375
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +149 -149
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationNew.vue +74 -74
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +83 -83
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +288 -288
  72. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +94 -94
  73. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  76. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  77. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  78. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  79. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  85. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  86. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  87. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  88. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  89. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  90. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  91. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  92. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  93. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  94. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  95. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  96. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  97. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +39 -39
  98. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  99. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -52
  100. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  101. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +134 -134
  102. package/components/common/vm/actions/common/select/computeResource/treeView/New.vue +44 -44
  103. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +118 -118
  104. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  105. package/components/common/vm/actions/common/select/createType/New.vue +84 -84
  106. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  107. package/components/common/vm/actions/common/select/name/Name.vue +167 -167
  108. package/components/common/vm/actions/common/select/os/New.vue +122 -122
  109. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  110. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  111. package/components/common/vm/actions/common/select/storage/Storage.vue +129 -129
  112. package/components/common/vm/actions/common/select/storage/new/lib/config/table.ts +326 -326
  113. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  114. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  115. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  116. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  117. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  118. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  119. package/components/common/wizards/vm/migrate/select/computeResource/tableView/TableView.vue +137 -137
  120. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  121. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  122. package/composables/productNameLocal.ts +30 -30
  123. package/composables/useAppVersion.ts +21 -21
  124. package/lib/models/store/vm/interfaces.ts +142 -0
  125. package/package.json +1 -1
  126. package/plugins/date.ts +233 -233
  127. package/public/spice-console/lib/images/bitmap.js +203 -203
  128. package/public/spice-console/network/spicechannel.js +383 -383
  129. package/store/main/mutations.ts +7 -7
  130. package/store/main/state.ts +7 -7
  131. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,84 +1,84 @@
1
- <template>
2
- <div class="select-create-type py-3">
3
- <div
4
- v-for="item in props.items"
5
- v-development="item.disabled"
6
- :key="item.value"
7
- :class="[
8
- 'select-create-type-block',
9
- { selected: item.value === model, disabled: item.disabled },
10
- ]"
11
- @click="model = item.value"
12
- >
13
- <ui-radio
14
- v-model="model"
15
- :label="item.text"
16
- :value="item.value"
17
- :test-id="item.testId"
18
- :disabled="item.disabled"
19
- size="md"
20
- />
21
-
22
- <p class="description">
23
- {{ item.description }}
24
- </p>
25
- </div>
26
- </div>
27
- </template>
28
-
29
- <script setup lang="ts">
30
- import type { UI_I_VmCreateTypeOption } from '~/components/common/vm/actions/common/select/createType/lib/models/interfaces'
31
-
32
- const model = defineModel<string>()
33
-
34
- const props = defineProps<{
35
- items: UI_I_VmCreateTypeOption[]
36
- }>()
37
- </script>
38
-
39
- <style>
40
- :root {
41
- --select-create-type-block-bg-color: #ffffff;
42
- --select-create-type-block-border-color: #e9ebed;
43
- --select-create-type-block-border-hover-color: #d3d6da;
44
- --select-create-type-block-selected-bg-color: #f0f8fd;
45
- --select-create-type-block-selected-border-color: #008fd6;
46
- }
47
- :root.dark-theme {
48
- --select-create-type-block-bg-color: transparent;
49
- --select-create-type-block-border-color: #e9ebed1f;
50
- --select-create-type-block-border-hover-color: #e9ebed3d;
51
- --select-create-type-block-selected-bg-color: #2ba2de14;
52
- --select-create-type-block-selected-border-color: #2ba2de;
53
- }
54
- </style>
55
- <style scoped lang="scss">
56
- .select-create-type-block {
57
- background-color: var(--select-create-type-block-bg-color);
58
- border: 1px solid var(--select-create-type-block-border-color);
59
- padding: 12px;
60
- border-radius: 8px;
61
-
62
- &:not(.selected):not(.disabled) {
63
- cursor: pointer;
64
- &:hover {
65
- border-color: var(--select-create-type-block-border-hover-color);
66
- }
67
- }
68
-
69
- &.selected {
70
- background-color: var(--select-create-type-block-selected-bg-color);
71
- border: 1.5px solid var(--select-create-type-block-selected-border-color);
72
- }
73
-
74
- &:not(:last-child) {
75
- margin-bottom: 12px;
76
- }
77
-
78
- .description {
79
- font-size: 13px;
80
- color: #9da6ad;
81
- margin: 8px 0 0 28px;
82
- }
83
- }
84
- </style>
1
+ <template>
2
+ <div class="select-create-type py-3">
3
+ <div
4
+ v-for="item in props.items"
5
+ v-development="item.disabled"
6
+ :key="item.value"
7
+ :class="[
8
+ 'select-create-type-block',
9
+ { selected: item.value === model, disabled: item.disabled },
10
+ ]"
11
+ @click="model = item.value"
12
+ >
13
+ <ui-radio
14
+ v-model="model"
15
+ :label="item.text"
16
+ :value="item.value"
17
+ :test-id="item.testId"
18
+ :disabled="item.disabled"
19
+ size="md"
20
+ />
21
+
22
+ <p class="description">
23
+ {{ item.description }}
24
+ </p>
25
+ </div>
26
+ </div>
27
+ </template>
28
+
29
+ <script setup lang="ts">
30
+ import type { UI_I_VmCreateTypeOption } from '~/components/common/vm/actions/common/select/createType/lib/models/interfaces'
31
+
32
+ const model = defineModel<string>()
33
+
34
+ const props = defineProps<{
35
+ items: UI_I_VmCreateTypeOption[]
36
+ }>()
37
+ </script>
38
+
39
+ <style>
40
+ :root {
41
+ --select-create-type-block-bg-color: #ffffff;
42
+ --select-create-type-block-border-color: #e9ebed;
43
+ --select-create-type-block-border-hover-color: #d3d6da;
44
+ --select-create-type-block-selected-bg-color: #f0f8fd;
45
+ --select-create-type-block-selected-border-color: #008fd6;
46
+ }
47
+ :root.dark-theme {
48
+ --select-create-type-block-bg-color: transparent;
49
+ --select-create-type-block-border-color: #e9ebed1f;
50
+ --select-create-type-block-border-hover-color: #e9ebed3d;
51
+ --select-create-type-block-selected-bg-color: #2ba2de14;
52
+ --select-create-type-block-selected-border-color: #2ba2de;
53
+ }
54
+ </style>
55
+ <style scoped lang="scss">
56
+ .select-create-type-block {
57
+ background-color: var(--select-create-type-block-bg-color);
58
+ border: 1px solid var(--select-create-type-block-border-color);
59
+ padding: 12px;
60
+ border-radius: 8px;
61
+
62
+ &:not(.selected):not(.disabled) {
63
+ cursor: pointer;
64
+ &:hover {
65
+ border-color: var(--select-create-type-block-border-hover-color);
66
+ }
67
+ }
68
+
69
+ &.selected {
70
+ background-color: var(--select-create-type-block-selected-bg-color);
71
+ border: 1.5px solid var(--select-create-type-block-selected-border-color);
72
+ }
73
+
74
+ &:not(:last-child) {
75
+ margin-bottom: 12px;
76
+ }
77
+
78
+ .description {
79
+ font-size: 13px;
80
+ color: #9da6ad;
81
+ margin: 8px 0 0 28px;
82
+ }
83
+ }
84
+ </style>
@@ -1,5 +1,5 @@
1
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
2
-
3
- export interface UI_I_VmCreateTypeOption extends UI_I_OptionItem {
4
- description: string
5
- }
1
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
2
+
3
+ export interface UI_I_VmCreateTypeOption extends UI_I_OptionItem {
4
+ description: string
5
+ }
@@ -1,167 +1,167 @@
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
- }>()
44
-
45
- const { $store }: any = useNuxtApp()
46
- const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
47
-
48
- const localization = computed<UI_I_Localization>(() => useLocal())
49
-
50
- const vmName = ref<string>('')
51
-
52
- const selectedNode = ref<UI_I_TreeNode | null>(null)
53
- const onSelectNode = (node: UI_I_TreeNode): void => {
54
- selectedNode.value = node
55
- }
56
-
57
- watch(
58
- () => props.nameFormSubmit,
59
- (newValue) => {
60
- newValue && submit(newValue)
61
- }
62
- )
63
-
64
- const isParentDatacenter = (node: UI_I_TreeNode | null): boolean => {
65
- if (!node) return false
66
-
67
- if (node.parent?.type === 'datacenter') return true
68
- if (node.parent?.type === 'folder') return isParentDatacenter(node.parent)
69
- return false
70
- }
71
- const submit = async (cb: Function): Promise<void> => {
72
- const name = vmName.value
73
-
74
- if (name !== '') {
75
- const isNameValid = await checkNameIsValid(name)
76
- if (!isNameValid) {
77
- cb(false)
78
- return
79
- }
80
- }
81
-
82
- if (props.project === 'sphere') {
83
- // const isDatacenterFolder = isParentDatacenter(selectedNode.value)
84
-
85
- if (
86
- // selectedNode.value?.type !== 'datacenter' &&
87
- // selectedNode.value?.type === 'folder' &&
88
- // !isDatacenterFolder
89
- // TODO рефакторинг, здесь сейчас проверяем является ли выбранный элемент датацентром или папкой(вм)
90
- ![3, 7].includes(selectedNode.value?.kind)
91
- ) {
92
- showValidationErrors([
93
- localization.value.common.enterValidLocationVirtualMachine,
94
- ])
95
- cb(false)
96
- return
97
- }
98
- }
99
-
100
- onRemoveValidationErrors()
101
- emits('submit', [name, selectedNode.value])
102
- cb(true)
103
- }
104
- const checkNameIsValid = async (name: string): Promise<boolean> => {
105
- emits('loading', true)
106
-
107
- return new Promise((resolve) => {
108
- emits('check-name', [
109
- [name, selectedNode.value],
110
- (error) => {
111
- emits('loading', false)
112
-
113
- const status = error?.statusCode || 200
114
- switch (status) {
115
- case 405: // Invalid kind
116
- showValidationErrors([
117
- localization.value.common.kindValidationDescription,
118
- ])
119
- resolve(false)
120
- break
121
- case 406: // Invalid name
122
- showValidationErrors([
123
- localization.value.common.vmNameValidationDescription,
124
- ])
125
- resolve(false)
126
- break
127
- case 409: // Name exist
128
- showValidationErrors([
129
- localization.value.common.vmNameExistInSelectedLocation,
130
- ])
131
- resolve(false)
132
- break
133
- }
134
-
135
- resolve(true)
136
- },
137
- ])
138
- })
139
- }
140
-
141
- const errors = ref<string[]>([])
142
- const showValidationErrors = (data: string[]): void => {
143
- errors.value = data
144
- }
145
- const onRemoveValidationErrors = (): void => {
146
- errors.value = []
147
- }
148
-
149
- watch(
150
- () => props.show,
151
- (newValue) => {
152
- if (!newValue) return
153
-
154
- const input = document.getElementById('virtual-machine-name')
155
- if (!input) return
156
-
157
- setTimeout(() => {
158
- input.focus()
159
- }, 0)
160
- }
161
- )
162
-
163
- const isShowHelp = ref<boolean>(false)
164
- </script>
165
-
166
- <style scoped lang="scss">
167
- </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
+ }>()
44
+
45
+ const { $store }: any = useNuxtApp()
46
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
47
+
48
+ const localization = computed<UI_I_Localization>(() => useLocal())
49
+
50
+ const vmName = ref<string>('')
51
+
52
+ const selectedNode = ref<UI_I_TreeNode | null>(null)
53
+ const onSelectNode = (node: UI_I_TreeNode): void => {
54
+ selectedNode.value = node
55
+ }
56
+
57
+ watch(
58
+ () => props.nameFormSubmit,
59
+ (newValue) => {
60
+ newValue && submit(newValue)
61
+ }
62
+ )
63
+
64
+ const isParentDatacenter = (node: UI_I_TreeNode | null): boolean => {
65
+ if (!node) return false
66
+
67
+ if (node.parent?.type === 'datacenter') return true
68
+ if (node.parent?.type === 'folder') return isParentDatacenter(node.parent)
69
+ return false
70
+ }
71
+ const submit = async (cb: Function): Promise<void> => {
72
+ const name = vmName.value
73
+
74
+ if (name !== '') {
75
+ const isNameValid = await checkNameIsValid(name)
76
+ if (!isNameValid) {
77
+ cb(false)
78
+ return
79
+ }
80
+ }
81
+
82
+ if (props.project === 'sphere') {
83
+ // const isDatacenterFolder = isParentDatacenter(selectedNode.value)
84
+
85
+ if (
86
+ // selectedNode.value?.type !== 'datacenter' &&
87
+ // selectedNode.value?.type === 'folder' &&
88
+ // !isDatacenterFolder
89
+ // TODO рефакторинг, здесь сейчас проверяем является ли выбранный элемент датацентром или папкой(вм)
90
+ ![3, 7].includes(selectedNode.value?.kind)
91
+ ) {
92
+ showValidationErrors([
93
+ localization.value.common.enterValidLocationVirtualMachine,
94
+ ])
95
+ cb(false)
96
+ return
97
+ }
98
+ }
99
+
100
+ onRemoveValidationErrors()
101
+ emits('submit', [name, selectedNode.value])
102
+ cb(true)
103
+ }
104
+ const checkNameIsValid = async (name: string): Promise<boolean> => {
105
+ emits('loading', true)
106
+
107
+ return new Promise((resolve) => {
108
+ emits('check-name', [
109
+ [name, selectedNode.value],
110
+ (error) => {
111
+ emits('loading', false)
112
+
113
+ const status = error?.statusCode || 200
114
+ switch (status) {
115
+ case 405: // Invalid kind
116
+ showValidationErrors([
117
+ localization.value.common.kindValidationDescription,
118
+ ])
119
+ resolve(false)
120
+ break
121
+ case 406: // Invalid name
122
+ showValidationErrors([
123
+ localization.value.common.vmNameValidationDescription,
124
+ ])
125
+ resolve(false)
126
+ break
127
+ case 409: // Name exist
128
+ showValidationErrors([
129
+ localization.value.common.vmNameExistInSelectedLocation,
130
+ ])
131
+ resolve(false)
132
+ break
133
+ }
134
+
135
+ resolve(true)
136
+ },
137
+ ])
138
+ })
139
+ }
140
+
141
+ const errors = ref<string[]>([])
142
+ const showValidationErrors = (data: string[]): void => {
143
+ errors.value = data
144
+ }
145
+ const onRemoveValidationErrors = (): void => {
146
+ errors.value = []
147
+ }
148
+
149
+ watch(
150
+ () => props.show,
151
+ (newValue) => {
152
+ if (!newValue) return
153
+
154
+ const input = document.getElementById('virtual-machine-name')
155
+ if (!input) return
156
+
157
+ setTimeout(() => {
158
+ input.focus()
159
+ }, 0)
160
+ }
161
+ )
162
+
163
+ const isShowHelp = ref<boolean>(false)
164
+ </script>
165
+
166
+ <style scoped lang="scss">
167
+ </style>