bfg-common 1.5.199 → 1.5.200

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 (125) hide show
  1. package/CODE_STYLE.md +109 -109
  2. package/components/atoms/TheIcon3.vue +50 -50
  3. package/components/atoms/perPage/PerPage.vue +58 -58
  4. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  5. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  6. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  7. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  8. package/components/common/context/lib/models/interfaces.ts +31 -31
  9. package/components/common/context/recursion/RecursionNew.vue +238 -238
  10. package/components/common/diagramMain/DiagramMain.vue +897 -897
  11. package/components/common/diagramMain/Header.vue +214 -214
  12. package/components/common/graph/GraphOld.vue +50 -50
  13. package/components/common/graph/graphNew/GraphNew.vue +194 -194
  14. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  15. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  16. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/config/utils.ts +1040 -1040
  17. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  18. package/components/common/pages/home/headline/Headline.vue +45 -45
  19. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  20. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  21. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  22. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  23. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  24. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  25. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  26. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  27. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  28. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  29. package/components/common/pages/packages/Packages.vue +208 -208
  30. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  31. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  32. package/components/common/recursionTree/RecursionTree.vue +223 -223
  33. package/components/common/select/button/ButtonDropdown.vue +108 -108
  34. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  35. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  36. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  37. package/components/common/vm/actions/add/folderTreeView/Old.vue +50 -50
  38. package/components/common/vm/actions/add/lib/config/steps.ts +263 -263
  39. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  40. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  41. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +337 -337
  42. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +480 -480
  43. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  44. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  45. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +100 -100
  46. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  47. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  48. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  49. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +78 -78
  50. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  51. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +2 -17
  52. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/CpuNew.vue +190 -190
  53. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/model/ModelNew.vue +237 -237
  54. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  55. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  56. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/tooltip/TooltipNew.vue +154 -154
  57. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  58. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +288 -304
  59. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/MemoryNew.vue +154 -154
  60. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +375 -382
  61. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +289 -289
  62. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +151 -151
  63. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationNew.vue +73 -73
  64. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +83 -83
  65. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +288 -288
  66. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +94 -94
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  72. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  73. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  76. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  77. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  78. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  79. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/inputDevices/InputDevicesNew.vue +40 -40
  80. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  81. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +106 -106
  82. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +81 -81
  83. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +32 -32
  84. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +60 -60
  85. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +174 -174
  86. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +67 -67
  87. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +149 -149
  88. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  89. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +31 -31
  90. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +31 -31
  91. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  92. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +128 -128
  93. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  94. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +39 -39
  95. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  96. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -52
  97. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  98. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +134 -134
  99. package/components/common/vm/actions/common/select/computeResource/treeView/New.vue +44 -44
  100. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +118 -118
  101. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  102. package/components/common/vm/actions/common/select/createType/New.vue +84 -84
  103. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  104. package/components/common/vm/actions/common/select/name/Name.vue +167 -167
  105. package/components/common/vm/actions/common/select/os/New.vue +122 -122
  106. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  107. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  108. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  109. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  110. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  111. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  112. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  113. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  114. package/components/common/wizards/vm/migrate/select/computeResource/tableView/TableView.vue +137 -137
  115. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  116. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  117. package/composables/productNameLocal.ts +30 -30
  118. package/composables/useAppVersion.ts +21 -21
  119. package/package.json +2 -2
  120. package/plugins/date.ts +233 -233
  121. package/public/spice-console/lib/images/bitmap.js +203 -203
  122. package/public/spice-console/network/spicechannel.js +383 -383
  123. package/store/main/mutations.ts +7 -7
  124. package/store/main/state.ts +7 -7
  125. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,382 +1,375 @@
1
- <template>
2
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk-new
3
- v-if="isNewView"
4
- v-model:delete-files-from-datastore="deleteFilesFromDatastore"
5
- v-model:size="size"
6
- v-model:hard-disk-type="hardDiskType"
7
- v-model:disk-provisioning="diskProvisioning"
8
- v-model:sharing="sharing"
9
- v-model:limit-iops="limitIops"
10
- v-model:limit-iops-type="limitIopsType"
11
- v-model:limit-iops-invalid="limitIopsInvalid"
12
- v-model:disk-mode="diskMode"
13
- v-model:cache="cache"
14
- v-model:bus="bus"
15
- :is-removable="isRemovable"
16
- :label="label"
17
- :hard-disk-invalid="hardDiskInvalid"
18
- :error-text="hardDiskLocalAndApiErrorsTexts"
19
- :hard-disk-type-error-local-text="hardDiskTypeErrorLocalText"
20
- :is-disabled-size="isDisabledSize"
21
- :hard-disk-type-options="hardDiskTypeOptions"
22
- :max-hard-disk="maxHardDisk"
23
- :location="location"
24
- :is-running="isRunning"
25
- :is-new-hard-disk="!isNotNewHardDisk"
26
- :is-edit="props.isEdit"
27
- :datastore="props.datastore"
28
- :get-datastore-table-func="props.getDatastoreTableFunc"
29
- :error-validation-fields="props.errorValidationFields"
30
- :index="props.index"
31
- :type="props.type"
32
- :hard-disk="props.hardDisk"
33
- :guest-machine-type="props.guestMachineType"
34
- :is-new-type="isNewType"
35
- :compute-resource="props.computeResource"
36
- @remove="emits('remove')"
37
- @roll-back="emits('roll-back')"
38
- @validate-size="onValidateSize"
39
- @change-storage="onChangeStorage"
40
- @remove-error-by-title="emits('remove-error-by-title', $event)"
41
- />
42
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk-old
43
- v-else
44
- v-model:delete-files-from-datastore="deleteFilesFromDatastore"
45
- v-model:size="size"
46
- v-model:hard-disk-type="hardDiskType"
47
- v-model:disk-provisioning="diskProvisioning"
48
- v-model:sharing="sharing"
49
- v-model:limit-iops="limitIops"
50
- v-model:limit-iops-type="limitIopsType"
51
- v-model:limit-iops-invalid="limitIopsInvalid"
52
- v-model:disk-mode="diskMode"
53
- v-model:cache="cache"
54
- v-model:bus="bus"
55
- :is-removable="isRemovable"
56
- :label="label"
57
- :hard-disk-invalid="hardDiskInvalid"
58
- :error-text="hardDiskLocalAndApiErrorsTexts"
59
- :hard-disk-type-error-local-text="hardDiskTypeErrorLocalText"
60
- :is-disabled-size="isDisabledSize"
61
- :hard-disk-type-options="hardDiskTypeOptions"
62
- :max-hard-disk="maxHardDisk"
63
- :location="location"
64
- :is-running="isRunning"
65
- :is-new-hard-disk="!isNotNewHardDisk"
66
- :is-edit="props.isEdit"
67
- :datastore="props.datastore"
68
- :get-datastore-table-func="props.getDatastoreTableFunc"
69
- :error-validation-fields="props.errorValidationFields"
70
- :index="props.index"
71
- :type="props.type"
72
- :hard-disk="props.hardDisk"
73
- :guest-machine-type="props.guestMachineType"
74
- :is-new-type="isNewType"
75
- :compute-resource="props.computeResource"
76
- @remove="emits('remove')"
77
- @roll-back="emits('roll-back')"
78
- @validate-size="onValidateSize"
79
- @change-storage="onChangeStorage"
80
- @remove-error-by-title="emits('remove-error-by-title', $event)"
81
- />
82
- </template>
83
-
84
- <script setup lang="ts">
85
- import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
86
- import type {
87
- UI_I_SendDataNewHardDisk,
88
- UI_I_SendDataNewHardDiskStorage,
89
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
90
- import type { UI_T_HardDiskType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
91
- import type { UI_I_Localization } from '~/lib/models/interfaces'
92
- import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
93
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
94
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
95
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
96
- import { binaryOptionsFunc } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/config/binaryOptions'
97
-
98
- const props = defineProps<{
99
- storage: UI_I_DatastoreTableItem | null
100
- hardDisk: UI_I_SendDataNewHardDisk
101
- type: UI_T_HardDiskType
102
- index: number
103
- errorValidationFields: UI_I_ErrorValidationField[]
104
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
105
- datastore: UI_I_DatastoreTableItem[]
106
- isEdit: boolean
107
- state?: string | number
108
- guestMachineType?: UI_I_OptionItem | null
109
- computeResource?: UI_I_TreeNode | null
110
- }>()
111
- const emits = defineEmits<{
112
- (event: 'send-data', value: UI_I_SendDataNewHardDisk): void
113
- (event: 'invalid', value: boolean): void
114
- (event: 'remove'): void
115
- (event: 'roll-back'): void
116
- (event: 'remove-error-by-title', value: string): void
117
- }>()
118
-
119
- const { $store, $binary }: any = useNuxtApp()
120
- const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
121
-
122
- const localization = computed<UI_I_Localization>(() => useLocal())
123
-
124
- const isRunning = computed<boolean>(() => {
125
- return props.state === 2
126
- })
127
-
128
- const isRemovable = computed<boolean>(() => {
129
- return (
130
- !props.isEdit ||
131
- !isRunning.value ||
132
- (isRunning.value && bus.value === 'virtio')
133
- )
134
- })
135
-
136
- const isNewType = computed<boolean>(
137
- () => props.type === 'new' || props.type === 'clone'
138
- )
139
-
140
- const typeError = computed<string>(() => `disk_devices[${props.index}].size`)
141
-
142
- const apiErrorLocal = computed<string>(() => {
143
- return (
144
- props.errorValidationFields?.find(
145
- (message) => message.field === typeError.value
146
- )?.error_message || ''
147
- )
148
- })
149
-
150
- // PC-1796
151
- const isNotNewHardDisk = computed<boolean>(
152
- () => props.type === 'edit' || props.type === 'removed'
153
- )
154
- const label = computed<string>(() => {
155
- // if (props.type === 'edit' || props.type === 'removed')
156
- if (isNotNewHardDisk.value)
157
- return `${localization.value.common.hardDisk} ${props.index + 1}`
158
-
159
- return `${localization.value.common.newHardDisk} *`
160
- })
161
-
162
- const maxHardDisk = computed<number>(() => {
163
- const hardDiskSizeMb = $binary.gbToMb(props.hardDisk.size)
164
-
165
- if (props.type === 'exist') return hardDiskSizeMb
166
-
167
- if (!storage.value) return 0
168
- const free = storage.value.capacity.free_mb || storage.value.capacity // TODO fix
169
-
170
- if (props.isEdit) return free + hardDiskSizeMb
171
-
172
- return free
173
- })
174
- const hardDiskTypeErrorLocalText = computed<string>(() => {
175
- if (+sizeInMb.value > maxHardDisk.value) {
176
- return localization.value.common.diskCapacitySpecifiedGreater
177
- }
178
-
179
- if (+sizeInMb.value <= 0) {
180
- return localization.value.common.diskCapacityCannotZero
181
- }
182
-
183
- return ''
184
- })
185
-
186
- const hardDiskLocalAndApiErrorsTexts = computed<string>(() => {
187
- const localError = hardDiskTypeErrorLocalText.value
188
- const apiError = apiErrorLocal.value
189
-
190
- let result = ''
191
- if (localError && !apiError) result = localError
192
- if (!localError && apiError) result = apiError
193
- if (localError && apiError) result = localError + ', ' + apiError
194
- if (!localError && apiError) result = apiError
195
-
196
- return result
197
- })
198
-
199
- const deleteFilesFromDatastore = ref<boolean>(false)
200
-
201
- const hardDiskType = ref<string>('gb')
202
- const hardDiskTypeOptions = ref<UI_I_OptionItem[]>(
203
- binaryOptionsFunc(localization.value)
204
- )
205
-
206
- const size = ref<number>(props.hardDisk.size) // Изначально всегда приходит в gb
207
- const sizeInMb = computed<number>(() => {
208
- if (hardDiskType.value === 'mb') {
209
- return size.value
210
- }
211
-
212
- return $binary.universalFromTo(size.value, hardDiskType.value, 'mb')
213
- })
214
- const onValidateSize = (): void => {
215
- if (props.type !== 'edit') return
216
- if (sizeInMb.value < props.hardDisk.size) {
217
- size.value = $binary.universalFromTo(
218
- props.hardDisk.size,
219
- 'mb',
220
- hardDiskType.value
221
- )
222
- }
223
- }
224
-
225
- const isDisabledSize = computed<boolean>(() => {
226
- return props.type === 'exist' || (props.type === 'edit' && readOnly.value)
227
- })
228
-
229
- const location = ref<UI_I_DatastoreTableItem | null>(props.storage || null)
230
- const storage = ref<UI_I_DatastoreTableItem | null>(props.storage)
231
- watch(
232
- () => props.storage,
233
- (newValue) => {
234
- location.value = newValue
235
- storage.value = newValue
236
- },
237
- {
238
- immediate: true,
239
- deep: true,
240
- }
241
- )
242
- const onChangeStorage = (item: UI_I_DatastoreTableItem): void => {
243
- storage.value = item
244
- }
245
-
246
- const diskProvisioning = ref<string>('thick')
247
- const sharing = ref<string>('')
248
- const shares = ref<number>(0)
249
-
250
- const limitIops = ref<number>(16)
251
- const limitIopsType = ref<string>('unlimited')
252
- const limitIopsInvalid = ref<boolean>(false)
253
-
254
- const diskMode = ref<string>('dependent')
255
-
256
- const cache = ref<string>('none')
257
-
258
- const bus = ref<string>('ide')
259
-
260
- const readOnly = ref<boolean>(false)
261
-
262
- const discard = ref<string>('')
263
-
264
- const io = ref<string>('')
265
-
266
- const target = ref<string>('')
267
-
268
- watch(
269
- [
270
- sizeInMb,
271
- storage,
272
- diskProvisioning,
273
- sharing,
274
- limitIops,
275
- limitIopsType,
276
- diskMode,
277
- cache,
278
- bus,
279
- deleteFilesFromDatastore,
280
- (): void => props.type,
281
- ],
282
- () => {
283
- const limitIopsLocal =
284
- limitIopsType.value === 'unlimited' ? 0 : limitIops.value
285
- const storageLocal: UI_I_SendDataNewHardDiskStorage = {
286
- id: storage.value?.id || '',
287
- name: storage.value?.name || '',
288
- type: storage.value?.type_text || '',
289
- pool: storage.value?.pool_name || '',
290
- user: '',
291
- endpoint: '',
292
- password: '',
293
- protocol: '',
294
- options: '',
295
- }
296
-
297
- emits('send-data', {
298
- create: props.hardDisk.create,
299
- attach: props.hardDisk.attach,
300
- source: props.hardDisk.source,
301
- size: Math.ceil(sizeInMb.value),
302
- bus: bus.value,
303
- target: target.value,
304
- storage: storageLocal,
305
- device_type: 'disk',
306
- provision_type: diskProvisioning.value,
307
- disk_mode: diskMode.value,
308
- sharing: sharing.value === 'yes',
309
- read_only: readOnly.value,
310
- shares: shares.value,
311
- cache: cache.value,
312
- io: io.value,
313
- limit_iops: limitIopsLocal,
314
- discard: discard.value,
315
- capacity: Math.ceil(sizeInMb.value),
316
- boot_order: props.hardDisk.boot_order,
317
- detach: props.type === 'removed',
318
- remove: props.type === 'removed' && deleteFilesFromDatastore.value, // Проверяем если удалили диск и указали Delete files from datastore
319
- })
320
- },
321
- { immediate: true }
322
- )
323
-
324
- // Добавляем данные для редактирования
325
- watch(
326
- () => props.hardDisk,
327
- (newValue) => {
328
- // TODO refactoring
329
- if (props.type === 'exist') {
330
- diskProvisioning.value = newValue.provision_type || 'thick'
331
- return
332
- }
333
- // if (props.type !== 'edit') return
334
- if (props.type !== 'edit' && props.type !== 'clone') return
335
-
336
- const sizeInGb = $binary.mbToGb(newValue.size)
337
- if (sizeInGb < 1) {
338
- size.value = newValue.size
339
- hardDiskType.value = 'mb'
340
- } else {
341
- size.value = sizeInGb
342
- hardDiskType.value = 'gb'
343
- }
344
- diskProvisioning.value = newValue.provision_type || 'thick'
345
- sharing.value = newValue.sharing ? 'yes' : ''
346
- shares.value = newValue.shares || 0
347
- // limitIopsType.value = newValue.io === 'native' ? 'unlimited' : 'custom'
348
- limitIopsType.value = newValue.limit_iops === 0 ? 'unlimited' : 'custom'
349
- limitIops.value = newValue.limit_iops || 16
350
- diskMode.value = newValue.disk_mode || 'dependent'
351
- cache.value = newValue.cache || 'none'
352
- bus.value = newValue.bus || 'ide'
353
- readOnly.value = newValue.read_only || false
354
- discard.value = newValue.discard || ''
355
- io.value = newValue.io || ''
356
- target.value = newValue.target || ''
357
- },
358
- { immediate: true }
359
- )
360
- watch(
361
- isRunning,
362
- (newValue) => {
363
- if (newValue && props.type === 'new') {
364
- bus.value = 'virtio'
365
- }
366
- },
367
- { immediate: true }
368
- )
369
-
370
- const hardDiskInvalid = computed<boolean>(() => {
371
- return !!hardDiskTypeErrorLocalText.value || limitIopsInvalid.value
372
- })
373
- watch(
374
- hardDiskInvalid,
375
- (newValue) => {
376
- emits('invalid', newValue)
377
- },
378
- { immediate: true }
379
- )
380
- </script>
381
-
382
- <style scoped lang="scss"></style>
1
+ <template>
2
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk-new
3
+ v-if="isNewView"
4
+ v-model:delete-files-from-datastore="deleteFilesFromDatastore"
5
+ v-model:size="size"
6
+ v-model:hard-disk-type="hardDiskType"
7
+ v-model:disk-provisioning="diskProvisioning"
8
+ v-model:sharing="sharing"
9
+ v-model:limit-iops="limitIops"
10
+ v-model:limit-iops-type="limitIopsType"
11
+ v-model:limit-iops-invalid="limitIopsInvalid"
12
+ v-model:disk-mode="diskMode"
13
+ v-model:cache="cache"
14
+ v-model:bus="bus"
15
+ :is-removable="isRemovable"
16
+ :label="label"
17
+ :hard-disk-invalid="hardDiskInvalid"
18
+ :error-text="hardDiskLocalAndApiErrorsTexts"
19
+ :hard-disk-type-error-local-text="hardDiskTypeErrorLocalText"
20
+ :is-disabled-size="isDisabledSize"
21
+ :hard-disk-type-options="hardDiskTypeOptions"
22
+ :max-hard-disk="maxHardDisk"
23
+ :location="location"
24
+ :is-running="isRunning"
25
+ :is-new-hard-disk="!isNotNewHardDisk"
26
+ :is-edit="props.isEdit"
27
+ :datastore="props.datastore"
28
+ :get-datastore-table-func="props.getDatastoreTableFunc"
29
+ :error-validation-fields="props.errorValidationFields"
30
+ :index="props.index"
31
+ :type="props.type"
32
+ :hard-disk="props.hardDisk"
33
+ :guest-machine-type="props.guestMachineType"
34
+ :is-new-type="isNewType"
35
+ :compute-resource="props.computeResource"
36
+ @remove="emits('remove')"
37
+ @roll-back="emits('roll-back')"
38
+ @validate-size="onValidateSize"
39
+ @change-storage="onChangeStorage"
40
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
41
+ />
42
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk-old
43
+ v-else
44
+ v-model:delete-files-from-datastore="deleteFilesFromDatastore"
45
+ v-model:size="size"
46
+ v-model:hard-disk-type="hardDiskType"
47
+ v-model:disk-provisioning="diskProvisioning"
48
+ v-model:sharing="sharing"
49
+ v-model:limit-iops="limitIops"
50
+ v-model:limit-iops-type="limitIopsType"
51
+ v-model:limit-iops-invalid="limitIopsInvalid"
52
+ v-model:disk-mode="diskMode"
53
+ v-model:cache="cache"
54
+ v-model:bus="bus"
55
+ :is-removable="isRemovable"
56
+ :label="label"
57
+ :hard-disk-invalid="hardDiskInvalid"
58
+ :error-text="hardDiskLocalAndApiErrorsTexts"
59
+ :hard-disk-type-error-local-text="hardDiskTypeErrorLocalText"
60
+ :is-disabled-size="isDisabledSize"
61
+ :hard-disk-type-options="hardDiskTypeOptions"
62
+ :max-hard-disk="maxHardDisk"
63
+ :location="location"
64
+ :is-running="isRunning"
65
+ :is-new-hard-disk="!isNotNewHardDisk"
66
+ :is-edit="props.isEdit"
67
+ :datastore="props.datastore"
68
+ :get-datastore-table-func="props.getDatastoreTableFunc"
69
+ :error-validation-fields="props.errorValidationFields"
70
+ :index="props.index"
71
+ :type="props.type"
72
+ :hard-disk="props.hardDisk"
73
+ :guest-machine-type="props.guestMachineType"
74
+ :is-new-type="isNewType"
75
+ :compute-resource="props.computeResource"
76
+ @remove="emits('remove')"
77
+ @roll-back="emits('roll-back')"
78
+ @validate-size="onValidateSize"
79
+ @change-storage="onChangeStorage"
80
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
81
+ />
82
+ </template>
83
+
84
+ <script setup lang="ts">
85
+ import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
86
+ import type {
87
+ UI_I_SendDataNewHardDisk,
88
+ UI_I_SendDataNewHardDiskStorage,
89
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
90
+ import type { UI_T_HardDiskType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
91
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
92
+ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
93
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
94
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
95
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
96
+ import { binaryOptionsFunc } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/config/binaryOptions'
97
+
98
+ const props = defineProps<{
99
+ storage: UI_I_DatastoreTableItem | null
100
+ hardDisk: UI_I_SendDataNewHardDisk
101
+ type: UI_T_HardDiskType
102
+ index: number
103
+ errorValidationFields: UI_I_ErrorValidationField[]
104
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
105
+ datastore: UI_I_DatastoreTableItem[]
106
+ isEdit: boolean
107
+ state?: string | number
108
+ guestMachineType?: UI_I_OptionItem | null
109
+ computeResource?: UI_I_TreeNode | null
110
+ }>()
111
+ const emits = defineEmits<{
112
+ (event: 'send-data', value: UI_I_SendDataNewHardDisk): void
113
+ (event: 'invalid', value: boolean): void
114
+ (event: 'remove'): void
115
+ (event: 'roll-back'): void
116
+ (event: 'remove-error-by-title', value: string): void
117
+ }>()
118
+
119
+ const { $store, $binary }: any = useNuxtApp()
120
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
121
+
122
+ const localization = computed<UI_I_Localization>(() => useLocal())
123
+
124
+ const isRunning = computed<boolean>(() => {
125
+ return props.state === 2
126
+ })
127
+
128
+ const isRemovable = computed<boolean>(() => {
129
+ return (
130
+ !props.isEdit ||
131
+ !isRunning.value ||
132
+ (isRunning.value && bus.value === 'virtio')
133
+ )
134
+ })
135
+
136
+ const isNewType = computed<boolean>(
137
+ () => props.type === 'new' || props.type === 'clone'
138
+ )
139
+
140
+ const typeError = computed<string>(() => `disk_devices[${props.index}].size`)
141
+
142
+ const apiErrorLocal = computed<string>(() => {
143
+ return (
144
+ props.errorValidationFields?.find(
145
+ (message) => message.field === typeError.value
146
+ )?.error_message || ''
147
+ )
148
+ })
149
+
150
+ // PC-1796
151
+ const isNotNewHardDisk = computed<boolean>(
152
+ () => props.type === 'edit' || props.type === 'removed'
153
+ )
154
+ const label = computed<string>(() => {
155
+ // if (props.type === 'edit' || props.type === 'removed')
156
+ if (isNotNewHardDisk.value)
157
+ return `${localization.value.common.hardDisk} ${props.index + 1}`
158
+
159
+ return `${localization.value.common.newHardDisk} *`
160
+ })
161
+
162
+ const maxHardDisk = computed<number>(() => {
163
+ const hardDiskSizeMb = $binary.gbToMb(props.hardDisk.size)
164
+
165
+ if (props.type === 'exist') return hardDiskSizeMb
166
+
167
+ if (!storage.value) return 0
168
+ const free = storage.value.capacity.free_mb || storage.value.capacity // TODO fix
169
+
170
+ if (props.isEdit)
171
+ return free + hardDiskSizeMb
172
+
173
+ return free
174
+ })
175
+ const hardDiskTypeErrorLocalText = computed<string>(() => {
176
+ if (+sizeInMb.value > maxHardDisk.value) {
177
+ return localization.value.common.diskCapacitySpecifiedGreater
178
+ }
179
+
180
+ if (+sizeInMb.value <= 0) {
181
+ return localization.value.common.diskCapacityCannotZero
182
+ }
183
+
184
+ return ''
185
+ })
186
+
187
+ const hardDiskLocalAndApiErrorsTexts = computed<string>(() => {
188
+ const localError = hardDiskTypeErrorLocalText.value
189
+ const apiError = apiErrorLocal.value
190
+
191
+ let result = ''
192
+ if (localError && !apiError) result = localError
193
+ if (!localError && apiError) result = apiError
194
+ if (localError && apiError) result = localError + ', ' + apiError
195
+ if (!localError && apiError) result = apiError
196
+
197
+ return result
198
+ })
199
+
200
+ const deleteFilesFromDatastore = ref<boolean>(false)
201
+
202
+ const hardDiskType = ref<string>('gb')
203
+ const hardDiskTypeOptions = ref<UI_I_OptionItem[]>(
204
+ binaryOptionsFunc(localization.value)
205
+ )
206
+
207
+ const size = ref<number>(props.hardDisk.size) // Изначально всегда приходит в gb
208
+ const sizeInMb = computed<number>(() => {
209
+ if (hardDiskType.value === 'mb') {
210
+ return size.value
211
+ }
212
+
213
+ return $binary.universalFromTo(size.value, hardDiskType.value, 'mb')
214
+ })
215
+ const onValidateSize = (): void => {
216
+ if (props.type !== 'edit') return
217
+ if (sizeInMb.value < $binary.gbToMb(props.hardDisk.size)) {
218
+ size.value = $binary.universalFromTo(
219
+ props.hardDisk.size,
220
+ 'gb',
221
+ hardDiskType.value
222
+ )
223
+ }
224
+ }
225
+
226
+ const isDisabledSize = computed<boolean>(() => {
227
+ return props.type === 'exist' || (props.type === 'edit' && readOnly.value)
228
+ })
229
+
230
+ const location = ref<UI_I_DatastoreTableItem | null>(props.storage || null)
231
+ const storage = ref<UI_I_DatastoreTableItem | null>(props.storage)
232
+ watch(
233
+ () => props.storage,
234
+ (newValue) => {
235
+ location.value = newValue
236
+ storage.value = newValue
237
+ },
238
+ {
239
+ immediate: true,
240
+ deep: true,
241
+ }
242
+ )
243
+ const onChangeStorage = (item: UI_I_DatastoreTableItem): void => {
244
+ storage.value = item
245
+ }
246
+
247
+ const diskProvisioning = ref<string>('thick')
248
+ const sharing = ref<string>('')
249
+ const shares = ref<number>(0)
250
+
251
+ const limitIops = ref<number>(16)
252
+ const limitIopsType = ref<string>('unlimited')
253
+ const limitIopsInvalid = ref<boolean>(false)
254
+
255
+ const diskMode = ref<string>('dependent')
256
+
257
+ const cache = ref<string>('none')
258
+
259
+ const bus = ref<string>('ide')
260
+
261
+ const readOnly = ref<boolean>(false)
262
+
263
+ const discard = ref<string>('')
264
+
265
+ const io = ref<string>('')
266
+
267
+ const target = ref<string>('')
268
+
269
+ watch(
270
+ [
271
+ sizeInMb,
272
+ storage,
273
+ diskProvisioning,
274
+ sharing,
275
+ limitIops,
276
+ limitIopsType,
277
+ diskMode,
278
+ cache,
279
+ bus,
280
+ deleteFilesFromDatastore,
281
+ (): void => props.type,
282
+ ],
283
+ () => {
284
+ const limitIopsLocal =
285
+ limitIopsType.value === 'unlimited' ? 0 : limitIops.value
286
+ const storageLocal: UI_I_SendDataNewHardDiskStorage = {
287
+ id: storage.value?.id || '',
288
+ name: storage.value?.name || '',
289
+ type: storage.value?.type_text || '',
290
+ pool: storage.value?.pool_name || '',
291
+ user: '',
292
+ endpoint: '',
293
+ password: '',
294
+ protocol: '',
295
+ options: '',
296
+ }
297
+
298
+ emits('send-data', {
299
+ create: props.hardDisk.create,
300
+ attach: props.hardDisk.attach,
301
+ source: props.hardDisk.source,
302
+ size: Math.ceil(sizeInMb.value),
303
+ bus: bus.value,
304
+ target: target.value,
305
+ storage: storageLocal,
306
+ device_type: 'disk',
307
+ provision_type: diskProvisioning.value,
308
+ disk_mode: diskMode.value,
309
+ sharing: sharing.value === 'yes',
310
+ read_only: readOnly.value,
311
+ shares: shares.value,
312
+ cache: cache.value,
313
+ io: io.value,
314
+ limit_iops: limitIopsLocal,
315
+ discard: discard.value,
316
+ capacity: Math.ceil(sizeInMb.value),
317
+ boot_order: props.hardDisk.boot_order,
318
+ detach: props.type === 'removed',
319
+ remove: props.type === 'removed' && deleteFilesFromDatastore.value, // Проверяем если удалили диск и указали Delete files from datastore
320
+ })
321
+ },
322
+ { immediate: true }
323
+ )
324
+
325
+ // Добавляем данные для редактирования
326
+ watch(
327
+ () => props.hardDisk,
328
+ (newValue) => {
329
+ // TODO refactoring
330
+ if (props.type === 'exist') {
331
+ diskProvisioning.value = newValue.provision_type || 'thick'
332
+ return
333
+ }
334
+ // if (props.type !== 'edit') return
335
+ if (props.type !== 'edit' && props.type !== 'clone') return
336
+
337
+ diskProvisioning.value = newValue.provision_type || 'thick'
338
+ sharing.value = newValue.sharing ? 'yes' : ''
339
+ shares.value = newValue.shares || 0
340
+ // limitIopsType.value = newValue.io === 'native' ? 'unlimited' : 'custom'
341
+ limitIopsType.value = newValue.limit_iops === 0 ? 'unlimited' : 'custom'
342
+ limitIops.value = newValue.limit_iops || 16
343
+ diskMode.value = newValue.disk_mode || 'dependent'
344
+ cache.value = newValue.cache || 'none'
345
+ bus.value = newValue.bus || 'ide'
346
+ readOnly.value = newValue.read_only || false
347
+ discard.value = newValue.discard || ''
348
+ io.value = newValue.io || ''
349
+ target.value = newValue.target || ''
350
+ },
351
+ { immediate: true }
352
+ )
353
+ watch(
354
+ isRunning,
355
+ (newValue) => {
356
+ if (newValue && props.type === 'new') {
357
+ bus.value = 'virtio'
358
+ }
359
+ },
360
+ { immediate: true }
361
+ )
362
+
363
+ const hardDiskInvalid = computed<boolean>(() => {
364
+ return !!hardDiskTypeErrorLocalText.value || limitIopsInvalid.value
365
+ })
366
+ watch(
367
+ hardDiskInvalid,
368
+ (newValue) => {
369
+ emits('invalid', newValue)
370
+ },
371
+ { immediate: true }
372
+ )
373
+ </script>
374
+
375
+ <style scoped lang="scss"></style>