bfg-common 1.5.122 → 1.5.124

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/localization/local_be.json +3084 -3084
  3. package/assets/localization/local_en.json +3088 -3088
  4. package/assets/localization/local_hy.json +2 -2
  5. package/assets/localization/local_kk.json +2 -2
  6. package/assets/localization/local_ru.json +2 -2
  7. package/assets/localization/local_zh.json +3085 -3085
  8. package/components/atoms/TheIcon3.vue +50 -50
  9. package/components/atoms/perPage/PerPage.vue +58 -58
  10. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  11. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  12. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  13. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  14. package/components/common/context/lib/models/interfaces.ts +31 -31
  15. package/components/common/context/recursion/Recursion.vue +87 -87
  16. package/components/common/context/recursion/RecursionNew.vue +238 -238
  17. package/components/common/diagramMain/DiagramMain.vue +897 -897
  18. package/components/common/diagramMain/Header.vue +214 -214
  19. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  20. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  21. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/config/utils.ts +1040 -1040
  22. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  23. package/components/common/pages/home/headline/Headline.vue +45 -45
  24. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  25. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  26. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  27. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  28. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  29. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  30. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  31. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  32. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  33. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  34. package/components/common/pages/packages/Packages.vue +208 -208
  35. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  36. package/components/common/readyToComplete/New.vue +66 -66
  37. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  38. package/components/common/recursionTree/RecursionTree.vue +223 -223
  39. package/components/common/select/button/ButtonDropdown.vue +108 -108
  40. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  41. package/components/common/vm/actions/add/Add.vue +785 -785
  42. package/components/common/vm/actions/add/New.vue +556 -556
  43. package/components/common/vm/actions/add/Old.vue +371 -371
  44. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  45. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  46. package/components/common/vm/actions/add/folderTreeView/Old.vue +50 -50
  47. package/components/common/vm/actions/add/lib/config/steps.ts +263 -263
  48. package/components/common/vm/actions/clone/Clone.vue +801 -798
  49. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  50. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +626 -626
  51. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  52. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  53. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  54. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  55. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  56. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  57. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  58. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  59. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  60. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  61. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  62. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  63. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  64. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  65. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +149 -149
  66. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationNew.vue +74 -74
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +83 -83
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +288 -288
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +94 -94
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  72. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  73. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  76. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  77. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  78. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  79. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  82. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  83. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  84. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  85. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  86. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  87. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  88. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  89. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  90. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  91. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  92. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  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/Compatibility.vue +100 -100
  98. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  99. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +134 -134
  100. package/components/common/vm/actions/common/select/computeResource/treeView/New.vue +44 -44
  101. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +118 -118
  102. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  103. package/components/common/vm/actions/common/select/createType/New.vue +84 -84
  104. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  105. package/components/common/vm/actions/common/select/name/Name.vue +167 -167
  106. package/components/common/vm/actions/common/select/os/New.vue +122 -122
  107. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  108. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  109. package/components/common/vm/actions/common/select/storage/Storage.vue +131 -131
  110. package/components/common/vm/actions/common/select/storage/new/lib/config/table.ts +326 -326
  111. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  112. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  113. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  114. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +105 -105
  115. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  116. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  117. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  118. package/components/common/wizards/vm/migrate/select/computeResource/tableView/TableView.vue +137 -137
  119. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  120. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  121. package/components/common/wizards/vm/migrate/vmOrigin/lib/models/interfaces.ts +1 -0
  122. package/composables/productNameLocal.ts +30 -30
  123. package/composables/useAppVersion.ts +21 -21
  124. package/package.json +1 -1
  125. package/plugins/date.ts +233 -233
  126. package/plugins/directives.ts +24 -24
  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,368 +1,368 @@
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<string>[]
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
- if (props.type === 'exist') return $binary.gbToMb(props.hardDisk.size)
164
-
165
- if (!storage.value) return 0
166
-
167
- if (props.isEdit)
168
- return storage.value.capacity.free_mb + $binary.gbToMb(props.hardDisk.size)
169
-
170
- return storage.value.capacity.free_mb
171
- })
172
- const hardDiskTypeErrorLocalText = computed<string>(() => {
173
- if (+sizeInMb.value > maxHardDisk.value) {
174
- return localization.value.common.diskCapacitySpecifiedGreater
175
- }
176
-
177
- if (+sizeInMb.value <= 0) {
178
- return localization.value.common.diskCapacityCannotZero
179
- }
180
-
181
- return ''
182
- })
183
-
184
- const hardDiskLocalAndApiErrorsTexts = computed<string>(() => {
185
- const localError = hardDiskTypeErrorLocalText.value
186
- const apiError = apiErrorLocal.value
187
-
188
- let result = ''
189
- if (localError && !apiError) result = localError
190
- if (!localError && apiError) result = apiError
191
- if (localError && apiError) result = localError + ', ' + apiError
192
- if (!localError && apiError) result = apiError
193
-
194
- return result
195
- })
196
-
197
- const deleteFilesFromDatastore = ref<boolean>(false)
198
-
199
- const hardDiskType = ref<string>('gb')
200
- const hardDiskTypeOptions = ref<UI_I_OptionItem[]>(
201
- binaryOptionsFunc(localization.value)
202
- )
203
-
204
- const size = ref<number>(props.hardDisk.size) // Изначально всегда приходит в gb
205
- const sizeInMb = computed<number>(() => {
206
- if (hardDiskType.value === 'mb') {
207
- return size.value
208
- }
209
-
210
- return $binary.universalFromTo(size.value, hardDiskType.value, 'mb')
211
- })
212
- const onValidateSize = (): void => {
213
- if (props.type !== 'edit') return
214
- if (sizeInMb.value < $binary.gbToMb(props.hardDisk.size)) {
215
- size.value = $binary.universalFromTo(
216
- props.hardDisk.size,
217
- 'gb',
218
- hardDiskType.value
219
- )
220
- }
221
- }
222
-
223
- const isDisabledSize = computed<boolean>(() => {
224
- return props.type === 'exist' || (props.type === 'edit' && readOnly.value)
225
- })
226
-
227
- const location = ref<UI_I_DatastoreTableItem | null>(props.storage || null)
228
- watch(
229
- () => props.storage,
230
- (newValue) => {
231
- location.value = newValue
232
- storage.value = newValue
233
- }
234
- )
235
- const storage = ref<UI_I_DatastoreTableItem | null>(props.storage)
236
- const onChangeStorage = (item: UI_I_DatastoreTableItem): void => {
237
- storage.value = item
238
- }
239
-
240
- const diskProvisioning = ref<string>('thick')
241
- const sharing = ref<string>('')
242
- const shares = ref<number>(0)
243
-
244
- const limitIops = ref<number>(16)
245
- const limitIopsType = ref<string>('unlimited')
246
- const limitIopsInvalid = ref<boolean>(false)
247
-
248
- const diskMode = ref<string>('dependent')
249
-
250
- const cache = ref<string>('none')
251
-
252
- const bus = ref<string>('ide')
253
-
254
- const readOnly = ref<boolean>(false)
255
-
256
- const discard = ref<string>('')
257
-
258
- const io = ref<string>('')
259
-
260
- const target = ref<string>('')
261
-
262
- watch(
263
- [
264
- sizeInMb,
265
- storage,
266
- diskProvisioning,
267
- sharing,
268
- limitIops,
269
- limitIopsType,
270
- diskMode,
271
- cache,
272
- bus,
273
- deleteFilesFromDatastore,
274
- (): void => props.type,
275
- ],
276
- () => {
277
- const limitIopsLocal =
278
- limitIopsType.value === 'unlimited' ? 0 : limitIops.value
279
- const storageLocal: UI_I_SendDataNewHardDiskStorage = {
280
- id: storage.value?.id || '',
281
- name: storage.value?.name || '',
282
- type: storage.value?.type_text || '',
283
- pool: storage.value?.pool_name || '',
284
- user: '',
285
- endpoint: '',
286
- password: '',
287
- protocol: '',
288
- options: '',
289
- }
290
-
291
- emits('send-data', {
292
- create: props.hardDisk.create,
293
- attach: props.hardDisk.attach,
294
- source: props.hardDisk.source,
295
- size: Math.ceil(sizeInMb.value),
296
- bus: bus.value,
297
- target: target.value,
298
- storage: storageLocal,
299
- device_type: 'disk',
300
- provision_type: diskProvisioning.value,
301
- disk_mode: diskMode.value,
302
- sharing: sharing.value === 'yes',
303
- read_only: readOnly.value,
304
- shares: shares.value,
305
- cache: cache.value,
306
- io: io.value,
307
- limit_iops: limitIopsLocal,
308
- discard: discard.value,
309
- capacity: Math.ceil(sizeInMb.value),
310
- boot_order: props.hardDisk.boot_order,
311
- detach: props.type === 'removed',
312
- remove: props.type === 'removed' && deleteFilesFromDatastore.value, // Проверяем если удалили диск и указали Delete files from datastore
313
- })
314
- },
315
- { immediate: true }
316
- )
317
-
318
- // Добавляем данные для редактирования
319
- watch(
320
- () => props.hardDisk,
321
- (newValue) => {
322
- // TODO refactoring
323
- if (props.type === 'exist') {
324
- diskProvisioning.value = newValue.provision_type || 'thick'
325
- return
326
- }
327
- // if (props.type !== 'edit') return
328
- if (props.type !== 'edit' && props.type !== 'clone') return
329
-
330
- diskProvisioning.value = newValue.provision_type || 'thick'
331
- sharing.value = newValue.sharing ? 'yes' : ''
332
- shares.value = newValue.shares || 0
333
- // limitIopsType.value = newValue.io === 'native' ? 'unlimited' : 'custom'
334
- limitIopsType.value = newValue.limit_iops === 0 ? 'unlimited' : 'custom'
335
- limitIops.value = newValue.limit_iops || 16
336
- diskMode.value = newValue.disk_mode || 'dependent'
337
- cache.value = newValue.cache || 'none'
338
- bus.value = newValue.bus || 'ide'
339
- readOnly.value = newValue.read_only || false
340
- discard.value = newValue.discard || ''
341
- io.value = newValue.io || ''
342
- target.value = newValue.target || ''
343
- },
344
- { immediate: true }
345
- )
346
- watch(
347
- isRunning,
348
- (newValue) => {
349
- if (newValue && props.type === 'new') {
350
- bus.value = 'virtio'
351
- }
352
- },
353
- { immediate: true }
354
- )
355
-
356
- const hardDiskInvalid = computed<boolean>(() => {
357
- return !!hardDiskTypeErrorLocalText.value || limitIopsInvalid.value
358
- })
359
- watch(
360
- hardDiskInvalid,
361
- (newValue) => {
362
- emits('invalid', newValue)
363
- },
364
- { immediate: true }
365
- )
366
- </script>
367
-
368
- <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<string>[]
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
+ if (props.type === 'exist') return $binary.gbToMb(props.hardDisk.size)
164
+
165
+ if (!storage.value) return 0
166
+
167
+ if (props.isEdit)
168
+ return storage.value.capacity.free_mb + $binary.gbToMb(props.hardDisk.size)
169
+
170
+ return storage.value.capacity.free_mb
171
+ })
172
+ const hardDiskTypeErrorLocalText = computed<string>(() => {
173
+ if (+sizeInMb.value > maxHardDisk.value) {
174
+ return localization.value.common.diskCapacitySpecifiedGreater
175
+ }
176
+
177
+ if (+sizeInMb.value <= 0) {
178
+ return localization.value.common.diskCapacityCannotZero
179
+ }
180
+
181
+ return ''
182
+ })
183
+
184
+ const hardDiskLocalAndApiErrorsTexts = computed<string>(() => {
185
+ const localError = hardDiskTypeErrorLocalText.value
186
+ const apiError = apiErrorLocal.value
187
+
188
+ let result = ''
189
+ if (localError && !apiError) result = localError
190
+ if (!localError && apiError) result = apiError
191
+ if (localError && apiError) result = localError + ', ' + apiError
192
+ if (!localError && apiError) result = apiError
193
+
194
+ return result
195
+ })
196
+
197
+ const deleteFilesFromDatastore = ref<boolean>(false)
198
+
199
+ const hardDiskType = ref<string>('gb')
200
+ const hardDiskTypeOptions = ref<UI_I_OptionItem[]>(
201
+ binaryOptionsFunc(localization.value)
202
+ )
203
+
204
+ const size = ref<number>(props.hardDisk.size) // Изначально всегда приходит в gb
205
+ const sizeInMb = computed<number>(() => {
206
+ if (hardDiskType.value === 'mb') {
207
+ return size.value
208
+ }
209
+
210
+ return $binary.universalFromTo(size.value, hardDiskType.value, 'mb')
211
+ })
212
+ const onValidateSize = (): void => {
213
+ if (props.type !== 'edit') return
214
+ if (sizeInMb.value < $binary.gbToMb(props.hardDisk.size)) {
215
+ size.value = $binary.universalFromTo(
216
+ props.hardDisk.size,
217
+ 'gb',
218
+ hardDiskType.value
219
+ )
220
+ }
221
+ }
222
+
223
+ const isDisabledSize = computed<boolean>(() => {
224
+ return props.type === 'exist' || (props.type === 'edit' && readOnly.value)
225
+ })
226
+
227
+ const location = ref<UI_I_DatastoreTableItem | null>(props.storage || null)
228
+ watch(
229
+ () => props.storage,
230
+ (newValue) => {
231
+ location.value = newValue
232
+ storage.value = newValue
233
+ }
234
+ )
235
+ const storage = ref<UI_I_DatastoreTableItem | null>(props.storage)
236
+ const onChangeStorage = (item: UI_I_DatastoreTableItem): void => {
237
+ storage.value = item
238
+ }
239
+
240
+ const diskProvisioning = ref<string>('thick')
241
+ const sharing = ref<string>('')
242
+ const shares = ref<number>(0)
243
+
244
+ const limitIops = ref<number>(16)
245
+ const limitIopsType = ref<string>('unlimited')
246
+ const limitIopsInvalid = ref<boolean>(false)
247
+
248
+ const diskMode = ref<string>('dependent')
249
+
250
+ const cache = ref<string>('none')
251
+
252
+ const bus = ref<string>('ide')
253
+
254
+ const readOnly = ref<boolean>(false)
255
+
256
+ const discard = ref<string>('')
257
+
258
+ const io = ref<string>('')
259
+
260
+ const target = ref<string>('')
261
+
262
+ watch(
263
+ [
264
+ sizeInMb,
265
+ storage,
266
+ diskProvisioning,
267
+ sharing,
268
+ limitIops,
269
+ limitIopsType,
270
+ diskMode,
271
+ cache,
272
+ bus,
273
+ deleteFilesFromDatastore,
274
+ (): void => props.type,
275
+ ],
276
+ () => {
277
+ const limitIopsLocal =
278
+ limitIopsType.value === 'unlimited' ? 0 : limitIops.value
279
+ const storageLocal: UI_I_SendDataNewHardDiskStorage = {
280
+ id: storage.value?.id || '',
281
+ name: storage.value?.name || '',
282
+ type: storage.value?.type_text || '',
283
+ pool: storage.value?.pool_name || '',
284
+ user: '',
285
+ endpoint: '',
286
+ password: '',
287
+ protocol: '',
288
+ options: '',
289
+ }
290
+
291
+ emits('send-data', {
292
+ create: props.hardDisk.create,
293
+ attach: props.hardDisk.attach,
294
+ source: props.hardDisk.source,
295
+ size: Math.ceil(sizeInMb.value),
296
+ bus: bus.value,
297
+ target: target.value,
298
+ storage: storageLocal,
299
+ device_type: 'disk',
300
+ provision_type: diskProvisioning.value,
301
+ disk_mode: diskMode.value,
302
+ sharing: sharing.value === 'yes',
303
+ read_only: readOnly.value,
304
+ shares: shares.value,
305
+ cache: cache.value,
306
+ io: io.value,
307
+ limit_iops: limitIopsLocal,
308
+ discard: discard.value,
309
+ capacity: Math.ceil(sizeInMb.value),
310
+ boot_order: props.hardDisk.boot_order,
311
+ detach: props.type === 'removed',
312
+ remove: props.type === 'removed' && deleteFilesFromDatastore.value, // Проверяем если удалили диск и указали Delete files from datastore
313
+ })
314
+ },
315
+ { immediate: true }
316
+ )
317
+
318
+ // Добавляем данные для редактирования
319
+ watch(
320
+ () => props.hardDisk,
321
+ (newValue) => {
322
+ // TODO refactoring
323
+ if (props.type === 'exist') {
324
+ diskProvisioning.value = newValue.provision_type || 'thick'
325
+ return
326
+ }
327
+ // if (props.type !== 'edit') return
328
+ if (props.type !== 'edit' && props.type !== 'clone') return
329
+
330
+ diskProvisioning.value = newValue.provision_type || 'thick'
331
+ sharing.value = newValue.sharing ? 'yes' : ''
332
+ shares.value = newValue.shares || 0
333
+ // limitIopsType.value = newValue.io === 'native' ? 'unlimited' : 'custom'
334
+ limitIopsType.value = newValue.limit_iops === 0 ? 'unlimited' : 'custom'
335
+ limitIops.value = newValue.limit_iops || 16
336
+ diskMode.value = newValue.disk_mode || 'dependent'
337
+ cache.value = newValue.cache || 'none'
338
+ bus.value = newValue.bus || 'ide'
339
+ readOnly.value = newValue.read_only || false
340
+ discard.value = newValue.discard || ''
341
+ io.value = newValue.io || ''
342
+ target.value = newValue.target || ''
343
+ },
344
+ { immediate: true }
345
+ )
346
+ watch(
347
+ isRunning,
348
+ (newValue) => {
349
+ if (newValue && props.type === 'new') {
350
+ bus.value = 'virtio'
351
+ }
352
+ },
353
+ { immediate: true }
354
+ )
355
+
356
+ const hardDiskInvalid = computed<boolean>(() => {
357
+ return !!hardDiskTypeErrorLocalText.value || limitIopsInvalid.value
358
+ })
359
+ watch(
360
+ hardDiskInvalid,
361
+ (newValue) => {
362
+ emits('invalid', newValue)
363
+ },
364
+ { immediate: true }
365
+ )
366
+ </script>
367
+
368
+ <style scoped lang="scss"></style>