bfg-common 1.5.595 → 1.5.597

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 (172) 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 -0
  7. package/assets/localization/local_en.json +4 -0
  8. package/assets/localization/local_hy.json +4 -0
  9. package/assets/localization/local_kk.json +4 -0
  10. package/assets/localization/local_ru.json +4 -0
  11. package/assets/localization/local_zh.json +4 -0
  12. package/components/atoms/TheIcon3.vue +50 -50
  13. package/components/atoms/collapse/CollapseNav.vue +170 -170
  14. package/components/atoms/perPage/PerPage.vue +58 -58
  15. package/components/atoms/table/dataGrid/DataGrid.vue +1718 -1718
  16. package/components/atoms/table/dataGrid/DataGridPagination.vue +97 -97
  17. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  18. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  19. package/components/common/backup/storage/actions/add/lib/utils.ts +51 -51
  20. package/components/common/browse/Browse.vue +9 -0
  21. package/components/common/browse/BrowseNew.vue +2 -1
  22. package/components/common/browse/BrowseOld.vue +2 -1
  23. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  24. package/components/common/diagramMain/modals/lib/config/portModal.ts +251 -251
  25. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  26. package/components/common/diagramMain/port/Port.vue +580 -580
  27. package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
  28. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
  29. package/components/common/pages/backups/DetailView.vue +52 -52
  30. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  31. package/components/common/pages/backups/modals/Modals.vue +243 -243
  32. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  33. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
  34. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  35. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  36. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  37. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  38. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  39. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  40. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  41. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  42. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  43. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  44. package/components/common/select/radio/RadioGroup.vue +137 -137
  45. package/components/common/spiceConsole/Drawer.vue +420 -420
  46. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  47. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  48. package/components/common/tools/Actions.vue +207 -207
  49. package/components/common/treeView/TreeView.vue +52 -52
  50. package/components/common/vm/actions/add/Add.vue +819 -819
  51. package/components/common/vm/actions/clone/Clone.vue +694 -694
  52. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +205 -205
  53. package/components/common/vm/actions/common/customizeHardware/New.vue +325 -325
  54. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +679 -679
  55. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +101 -101
  56. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +227 -227
  57. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +29 -29
  58. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +323 -323
  59. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/coresPerSocket/CoresPerSocket.vue +81 -81
  60. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/hotPlug/HotPlug.vue +40 -40
  61. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/maxCpu/MaxCpu.vue +91 -91
  62. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/model/Model.vue +92 -92
  63. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +133 -133
  64. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  65. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/tooltip/Tooltip.vue +27 -27
  66. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +214 -214
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +280 -280
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/New.vue +158 -158
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Old.vue +155 -155
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/hotPlug/HotPlug.vue +29 -29
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +483 -483
  72. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/cache/Cache.vue +59 -59
  73. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/file/File.vue +24 -24
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/limitIops/LimitIops.vue +96 -96
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +142 -142
  76. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/storageModal/StorageModal.vue +55 -55
  77. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/maximumSize/MaximumSize.vue +26 -26
  78. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/Mode.vue +61 -61
  79. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/provisioning/Provisioning.vue +57 -57
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/Sharing.vue +59 -59
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +257 -257
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/adapterType/AdapterType.vue +56 -56
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/Location.vue +65 -65
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +111 -111
  85. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +199 -199
  86. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIo.vue +27 -27
  87. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +29 -29
  88. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +23 -23
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +40 -40
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/typeSelection/TypeSelection.vue +34 -34
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbController.vue +47 -47
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +15 -15
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/inputDevices/InputDevices.vue +15 -15
  94. package/components/common/vm/actions/common/customizeHardware/virtualHardware/reservation/Reservation.vue +194 -194
  95. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCard.vue +129 -129
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/model/Model.vue +35 -35
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/numberDisplays/NumberDisplays.vue +50 -50
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemory.vue +104 -104
  99. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +70 -70
  100. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptions.vue +42 -42
  101. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +32 -32
  102. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  103. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/Menu.vue +25 -25
  104. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +155 -155
  105. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptions.vue +82 -82
  106. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/RemoteConsoleOptions.vue +74 -74
  107. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPaste.vue +25 -25
  108. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransfer.vue +25 -25
  109. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharing.vue +17 -17
  110. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  111. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +99 -99
  112. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  113. package/components/common/vm/actions/common/customizeHardware/vmoptions/tools/Tools.vue +42 -42
  114. package/components/common/vm/actions/common/select/compatibility/Compatibility.vue +105 -105
  115. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  116. package/components/common/vm/actions/common/select/createType/CreateType.vue +36 -36
  117. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  118. package/components/common/vm/actions/common/select/options/Options.vue +53 -53
  119. package/components/common/vm/actions/common/select/os/Os.vue +152 -152
  120. package/components/common/vm/actions/common/select/storage/Old.vue +125 -125
  121. package/components/common/vm/actions/common/select/storage/Storage.vue +170 -170
  122. package/components/common/vm/actions/common/select/storage/new/New.vue +311 -311
  123. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  124. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  125. package/components/common/vm/actions/common/select/template/Template.vue +75 -75
  126. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  127. package/components/common/vm/actions/common/select/template/treeView/TreeView.vue +85 -85
  128. package/components/common/vm/actions/editSettings/EditSettings.vue +169 -169
  129. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  130. package/components/common/vm/actions/register/New.vue +218 -0
  131. package/components/common/vm/actions/register/Old.vue +127 -0
  132. package/components/common/vm/actions/register/Register.vue +36 -75
  133. package/components/common/vm/actions/register/lib/config/index.ts +1 -0
  134. package/components/common/vm/actions/register/lib/config/steps.ts +86 -86
  135. package/components/common/wizards/common/compatibility/Compatibility.vue +35 -35
  136. package/components/common/wizards/common/compatibility/New.vue +99 -99
  137. package/components/common/wizards/common/compatibility/Old.vue +53 -53
  138. package/components/common/wizards/common/steps/computeResource/ComputeResource.vue +86 -86
  139. package/components/common/wizards/common/steps/computeResource/New.vue +93 -93
  140. package/components/common/wizards/common/steps/name/Name.vue +178 -178
  141. package/components/common/wizards/common/steps/name/New.vue +221 -221
  142. package/components/common/wizards/common/steps/name/Old.vue +121 -121
  143. package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
  144. package/components/common/wizards/common/steps/name/location/Location.vue +85 -85
  145. package/components/common/wizards/common/steps/name/location/New.vue +40 -40
  146. package/components/common/wizards/datastore/add/Add.vue +228 -228
  147. package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
  148. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  149. package/components/common/wizards/vm/migrate/select/computeResource/ComputeResource.vue +205 -205
  150. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  151. package/composables/useAppVersion.ts +21 -21
  152. package/composables/useLocal.ts +6 -6
  153. package/composables/useLocalCommon.ts +39 -39
  154. package/lib/models/interfaces.ts +1 -0
  155. package/package.json +2 -2
  156. package/plugins/console.ts +21 -21
  157. package/plugins/date.ts +233 -233
  158. package/plugins/mouse.ts +21 -21
  159. package/plugins/panelStates.ts +70 -70
  160. package/plugins/text.ts +59 -59
  161. package/plugins/time.ts +58 -58
  162. package/public/spice-console/application/clientgui.js +854 -854
  163. package/public/spice-console/application/packetfactory.js +211 -211
  164. package/public/spice-console/application/virtualmouse.js +147 -147
  165. package/public/spice-console/lib/images/bitmap.js +203 -203
  166. package/public/spice-console/network/spicechannel.js +440 -440
  167. package/public/spice-console/process/cursorprocess.js +121 -121
  168. package/public/spice-console/process/inputprocess.js +227 -227
  169. package/public/spice-console/process/mainprocess.js +210 -210
  170. package/public/spice-console/run.js +210 -210
  171. package/store/main/mutations.ts +7 -7
  172. package/store/main/state.ts +7 -7
@@ -1,483 +1,483 @@
1
- <template>
2
- <component
3
- :is="currentComponent"
4
- v-model:delete-files-from-datastore="deleteFilesFromDatastore"
5
- v-model:size="sizeLocal"
6
- v-model:hard-disk-type="hardDiskType"
7
- v-model:disk-provisioning="provisionType"
8
- v-model:sharing="sharingLocal"
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
- v-model:source="source"
16
- :is-removable="isRemovable"
17
- :label="label"
18
- :hard-disk-invalid="hardDiskInvalid"
19
- :error-text="hardDiskLocalAndApiErrorsTexts"
20
- :hard-disk-type-error-local-text="hardDiskTypeErrorLocalText"
21
- :is-disabled-size="isDisabledSize"
22
- :is-disabled-provisioning="isDisabledProvisioning"
23
- :is-disabled-sharing="isDisabledSharing"
24
- :is-disabled-limit-iops="isDisabledLimitIops"
25
- :is-disabled-mode="isDisabledMode"
26
- :is-disabled-cache="isDisabledCache"
27
- :is-disabled-bus="isDisabledBus"
28
- :hard-disk-type-options="hardDiskTypeOptions"
29
- :max-hard-disk="maxHardDisk"
30
- :location="location"
31
- :is-running="isRunning"
32
- :is-new-hard-disk="isNewHardDisk"
33
- :is-edit="props.isEdit"
34
- :datastore="props.datastore"
35
- :is-datastore-loading="props.isDatastoreLoading"
36
- :get-datastore-table-func="props.getDatastoreTableFunc"
37
- :error-validation-fields="props.errorValidationFields"
38
- :index="props.index"
39
- :type="props.type"
40
- :guest-machine-type="props.guestMachineType"
41
- :compute-resource="props.computeResource"
42
- @remove="emits('remove')"
43
- @roll-back="emits('roll-back')"
44
- @validate-size="onValidateSize"
45
- @change-storage="onChangeStorage"
46
- @remove-error-by-title="emits('remove-error-by-title', $event)"
47
- />
48
- </template>
49
-
50
- <script setup lang="ts">
51
- import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
52
- // import type {
53
- // UI_I_SendDataNewHardDisk,
54
- // UI_I_SendDataNewHardDiskStorage,
55
- // } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
56
- import type { UI_T_HardDiskType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
57
- import type { UI_I_Localization } from '~/lib/models/interfaces'
58
- import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
59
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
60
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
61
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
62
- import { binaryOptionsFunc } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/config/binaryOptions'
63
-
64
- const size = defineModel<number>('size', { required: true })
65
- const initialSize = size.value
66
- // const provisionType = ref<string>('thick')
67
- const provisionType = defineModel<string>('provisionType', { required: true })
68
- // const sharing = ref<string>('')
69
- const sharing = defineModel<boolean>('sharing', { required: true })
70
- // const sharingLocal = ref<string>(sharing.value ? 'yes' : '')
71
- const sharingLocal = computed<string>({
72
- set(newValue) {
73
- sharing.value = newValue === 'yes'
74
- },
75
- get() {
76
- return sharing.value ? 'yes' : ''
77
- },
78
- })
79
- // const shares = ref<number>(0)
80
- const shares = defineModel<number>('shares', { required: true })
81
-
82
- // const limitIops = ref<number>(16)
83
- const limitIops = defineModel<number>('limitIops', { required: true })
84
- const limitIopsType = ref<string>('unlimited') // ??
85
- const limitIopsInvalid = ref<boolean>(false) // ??
86
-
87
- // const diskMode = ref<string>('dependent')
88
- const diskMode = defineModel<string>('diskMode', { required: true })
89
-
90
- // const cache = ref<string>('none')
91
- const cache = defineModel<string>('cache', { required: true })
92
-
93
- // const bus = ref<string>('ide')
94
- const bus = defineModel<string>('bus', { required: true })
95
-
96
- // const readOnly = ref<boolean>(false)
97
- const readOnly = defineModel<boolean>('readOnly', { required: true })
98
-
99
- // const discard = ref<string>('')
100
- const discard = defineModel<string>('discard', { required: true })
101
-
102
- // const io = ref<string>('')
103
- const io = defineModel<string>('io', { required: true })
104
-
105
- // const target = ref<string>('')
106
- const target = defineModel<string>('target', { required: true })
107
-
108
- const source = defineModel<string>('source', { required: true })
109
-
110
- const storage = defineModel<any>('storage', { required: true })
111
-
112
- const remove = defineModel<boolean>('remove', { required: true })
113
- const detach = defineModel<boolean>('detach', { required: true })
114
-
115
- const props = withDefaults(
116
- defineProps<{
117
- mainStorage: UI_I_DatastoreTableItem | null
118
- // hardDisk: UI_I_SendDataNewHardDisk
119
- type: UI_T_HardDiskType
120
- index: number
121
- errorValidationFields: UI_I_ErrorValidationField[]
122
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
123
- datastore: UI_I_DatastoreTableItem[]
124
- isDatastoreLoading: boolean
125
- isEdit: boolean
126
- state?: string | number
127
- guestMachineType?: UI_I_OptionItem | null
128
- computeResource?: UI_I_TreeNode | null
129
- }>(),
130
- {
131
- state: undefined,
132
- guestMachineType: undefined,
133
- computeResource: undefined,
134
- }
135
- )
136
- const emits = defineEmits<{
137
- // (event: 'send-data', value: UI_I_SendDataNewHardDisk): void
138
- (event: 'invalid', value: boolean): void
139
- (event: 'remove'): void
140
- (event: 'roll-back'): void
141
- (event: 'remove-error-by-title', value: string): void
142
- }>()
143
-
144
- watch(
145
- () => props.type,
146
- (newValue) => {
147
- detach.value = newValue === 'removed'
148
- }
149
- )
150
-
151
- const { $store, $binary }: any = useNuxtApp()
152
- const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
153
- const currentComponent = computed(() =>
154
- isNewView.value
155
- ? defineAsyncComponent(() => import('./New.vue'))
156
- : defineAsyncComponent(() => import('./Old.vue'))
157
- )
158
-
159
- const localization = computed<UI_I_Localization>(() => useLocal())
160
-
161
- const isRunning = computed<boolean>(() => {
162
- return props.state === 2
163
- })
164
-
165
- const isRemovable = computed<boolean>(() => {
166
- return (
167
- !props.isEdit ||
168
- !isRunning.value ||
169
- (isRunning.value && bus.value === 'virtio')
170
- )
171
- })
172
-
173
- const typeError = computed<string>(() => `disk_devices[${props.index}].size`)
174
-
175
- const apiErrorLocal = computed<string>(() => {
176
- return (
177
- props.errorValidationFields?.find(
178
- (message) => message.field === typeError.value
179
- )?.error_message || ''
180
- )
181
- })
182
-
183
- // PC-1796
184
- // const isNotNewHardDisk = computed<boolean>(
185
- // () => props.type === 'edit' || props.type === 'removed'
186
- // )
187
- const isNewHardDisk = computed<boolean>(
188
- () => props.type !== 'edit' && props.type !== 'removed'
189
- )
190
- const label = computed<string>(() => {
191
- // if (props.type === 'edit' || props.type === 'removed')
192
- if (!isNewHardDisk.value)
193
- return `${localization.value.common.hardDisk} ${props.index + 1}`
194
-
195
- return `${localization.value.common.newHardDisk} *`
196
- })
197
-
198
- const maxHardDisk = computed<number>(() => {
199
- // const hardDiskSizeMb = $binary.gbToMb(props.hardDisk.size)
200
-
201
- if (props.type === 'exist') return initialSize
202
-
203
- if (!storageLocal.value) return 0
204
- const free = (storageLocal.value.capacity.free_mb ||
205
- storageLocal.value.capacity) as number // TODO fix
206
-
207
- if (props.isEdit) return free + initialSize
208
-
209
- return free
210
- })
211
- const hardDiskTypeErrorLocalText = computed<string>(() => {
212
- if (size.value > maxHardDisk.value) {
213
- return localization.value.common.diskCapacitySpecifiedGreater
214
- }
215
-
216
- if (size.value <= 0) {
217
- return localization.value.common.diskCapacityCannotZero
218
- }
219
-
220
- return ''
221
- })
222
-
223
- const hardDiskLocalAndApiErrorsTexts = computed<string>(() => {
224
- const localError = hardDiskTypeErrorLocalText.value
225
- const apiError = apiErrorLocal.value
226
-
227
- let result = ''
228
- if (localError && !apiError) result = localError
229
- if (!localError && apiError) result = apiError
230
- if (localError && apiError) result = localError + ', ' + apiError
231
- if (!localError && apiError) result = apiError
232
-
233
- return result
234
- })
235
-
236
- const deleteFilesFromDatastore = ref<boolean>(false)
237
- watch(deleteFilesFromDatastore, (newValue) => {
238
- remove.value = props.type === 'removed' && newValue
239
- })
240
-
241
- const hardDiskType = ref<string>(size.value < 1024 ? 'mb' : 'gb')
242
- watch(hardDiskType, (newValue) => {
243
- size.value = $binary.universalFromTo(sizeLocal.value, newValue, 'mb')
244
- })
245
- const hardDiskTypeOptions = ref<UI_I_OptionItem[]>(
246
- binaryOptionsFunc(localization.value)
247
- )
248
-
249
- const sizeLocal = ref<number>(
250
- size.value < 1024 ? size.value : $binary.mbToGb(size.value)
251
- )
252
- watch(sizeLocal, (newValue) => {
253
- if (hardDiskType.value === 'mb') {
254
- size.value = newValue
255
- }
256
-
257
- size.value = $binary.universalFromTo(newValue, hardDiskType.value, 'mb')
258
- })
259
- // const sizeInMb = computed<number>(() => {
260
- // if (hardDiskType.value === 'mb') {
261
- // return size.value
262
- // }
263
- //
264
- // return $binary.universalFromTo(size.value, hardDiskType.value, 'mb')
265
- // })
266
- const onValidateSize = (): void => {
267
- if (props.type !== 'edit') return
268
- if (size.value < initialSize) {
269
- sizeLocal.value = $binary.universalFromTo(
270
- initialSize,
271
- 'mb',
272
- hardDiskType.value
273
- )
274
- }
275
- }
276
-
277
- const isDisabledSize = computed<boolean>(() => {
278
- if (isNewHardDisk.value) return false
279
- return (
280
- props.type === 'exist' ||
281
- (props.type === 'edit' && readOnly.value) ||
282
- (isRunning.value && provisionType.value === 'thick')
283
- )
284
- })
285
- const isDisabledProvisioning = computed<boolean>(() => {
286
- if (isNewHardDisk.value) return false
287
- return props.isEdit || isRunning.value
288
- })
289
- const isDisabledSharing = computed<boolean>(() => {
290
- return isRunning.value && !isNewHardDisk.value
291
- })
292
- const isDisabledLimitIops = computed<boolean>(() => {
293
- return isRunning.value && !isNewHardDisk.value
294
- })
295
- const isDisabledMode = computed<boolean>(() => {
296
- return isRunning.value && !isNewHardDisk.value
297
- })
298
- const isDisabledCache = computed<boolean>(() => {
299
- if (isNewHardDisk.value) return false
300
- return props.isEdit || isRunning.value
301
- })
302
- const isDisabledBus = computed<boolean>(() => {
303
- return !isNewHardDisk.value && isRunning.value
304
- })
305
-
306
- const location = ref<UI_I_DatastoreTableItem | null>(props.mainStorage || null)
307
- const storageLocal = ref<UI_I_DatastoreTableItem | null>(props.mainStorage)
308
- watch(
309
- () => props.mainStorage,
310
- (newValue) => {
311
- location.value = newValue
312
- storageLocal.value = newValue
313
-
314
- storage.value = {
315
- id: newValue?.id || '',
316
- name: newValue?.name || '',
317
- type: newValue?.type_text || '',
318
- pool: newValue?.pool_name || '',
319
- user: '',
320
- endpoint: '',
321
- password: '',
322
- protocol: '',
323
- options: '',
324
- }
325
- },
326
- {
327
- immediate: true,
328
- deep: true,
329
- }
330
- )
331
- const onChangeStorage = (item: UI_I_DatastoreTableItem): void => {
332
- storageLocal.value = item
333
-
334
- storage.value = {
335
- id: item?.id || '',
336
- name: item?.name || '',
337
- type: item?.type_text || '',
338
- pool: item?.pool_name || '',
339
- user: '',
340
- endpoint: '',
341
- password: '',
342
- protocol: '',
343
- options: '',
344
- }
345
- }
346
-
347
- // const diskProvisioning = ref<string>('thick')
348
- // const sharing = ref<string>('')
349
- // const shares = ref<number>(0)
350
- //
351
- // const limitIops = ref<number>(16)
352
- // const limitIopsType = ref<string>('unlimited')
353
- // const limitIopsInvalid = ref<boolean>(false)
354
- //
355
- // const diskMode = ref<string>('dependent')
356
- //
357
- // const cache = ref<string>('none')
358
- //
359
- // const bus = ref<string>('ide')
360
- //
361
- // const readOnly = ref<boolean>(false)
362
- //
363
- // const discard = ref<string>('')
364
- //
365
- // const io = ref<string>('')
366
- //
367
- // const target = ref<string>('')
368
-
369
- // watch(
370
- // [
371
- // sizeInMb,
372
- // storage,
373
- // diskProvisioning,
374
- // sharing,
375
- // limitIops,
376
- // limitIopsType,
377
- // diskMode,
378
- // cache,
379
- // bus,
380
- // deleteFilesFromDatastore,
381
- // (): void => props.type,
382
- // ],
383
- // () => {
384
- // const limitIopsLocal =
385
- // limitIopsType.value === 'unlimited' ? 0 : limitIops.value
386
- // const storageLocal: UI_I_SendDataNewHardDiskStorage = {
387
- // id: storage.value?.id || '',
388
- // name: storage.value?.name || '',
389
- // type: storage.value?.type_text || '',
390
- // pool: storage.value?.pool_name || '',
391
- // user: '',
392
- // endpoint: '',
393
- // password: '',
394
- // protocol: '',
395
- // options: '',
396
- // }
397
- //
398
- // emits('send-data', {
399
- // create: props.hardDisk.create,
400
- // attach: props.hardDisk.attach,
401
- // source: props.hardDisk.source,
402
- // size: Math.ceil(sizeInMb.value),
403
- // bus: bus.value,
404
- // target: target.value,
405
- // storage: storageLocal,
406
- // device_type: 'disk',
407
- // provision_type: diskProvisioning.value,
408
- // disk_mode: diskMode.value,
409
- // sharing: sharing.value === 'yes',
410
- // read_only: readOnly.value,
411
- // shares: shares.value,
412
- // cache: cache.value,
413
- // io: io.value,
414
- // limit_iops: limitIopsLocal,
415
- // discard: discard.value,
416
- // capacity: Math.ceil(sizeInMb.value),
417
- // boot_order: props.hardDisk.boot_order,
418
- // detach: props.type === 'removed',
419
- // remove: props.type === 'removed' && deleteFilesFromDatastore.value, // Проверяем если удалили диск и указали Delete files from datastore
420
- // })
421
- // },
422
- // { immediate: true }
423
- // )
424
-
425
- // Добавляем данные для редактирования
426
- // watch(
427
- // () => props.hardDisk,
428
- // (newValue) => {
429
- // // TODO refactoring
430
- // if (props.type === 'exist') {
431
- // diskProvisioning.value = newValue.provision_type || 'thick'
432
- // return
433
- // }
434
- // // if (props.type !== 'edit') return
435
- // if (props.type !== 'edit' && props.type !== 'clone') return
436
- //
437
- // const sizeInGb = $binary.mbToGb(newValue.size)
438
- // if (sizeInGb < 1) {
439
- // size.value = newValue.size
440
- // hardDiskType.value = 'mb'
441
- // } else {
442
- // size.value = sizeInGb
443
- // hardDiskType.value = 'gb'
444
- // }
445
- // diskProvisioning.value = newValue.provision_type || 'thick'
446
- // sharing.value = newValue.sharing ? 'yes' : ''
447
- // shares.value = newValue.shares || 0
448
- // // limitIopsType.value = newValue.io === 'native' ? 'unlimited' : 'custom'
449
- // limitIopsType.value = newValue.limit_iops === 0 ? 'unlimited' : 'custom'
450
- // limitIops.value = newValue.limit_iops || 16
451
- // diskMode.value = newValue.disk_mode || 'dependent'
452
- // cache.value = newValue.cache || 'none'
453
- // bus.value = newValue.bus || 'ide'
454
- // readOnly.value = newValue.read_only || false
455
- // discard.value = newValue.discard || ''
456
- // io.value = newValue.io || ''
457
- // target.value = newValue.target || ''
458
- // },
459
- // { immediate: true }
460
- // )
461
- watch(
462
- isRunning,
463
- (newValue) => {
464
- if (newValue && props.type === 'new') {
465
- bus.value = 'virtio'
466
- }
467
- },
468
- { immediate: true }
469
- )
470
-
471
- const hardDiskInvalid = computed<boolean>(() => {
472
- return !!hardDiskTypeErrorLocalText.value || limitIopsInvalid.value
473
- })
474
- watch(
475
- hardDiskInvalid,
476
- (newValue) => {
477
- emits('invalid', newValue)
478
- },
479
- { immediate: true }
480
- )
481
- </script>
482
-
483
- <style scoped lang="scss"></style>
1
+ <template>
2
+ <component
3
+ :is="currentComponent"
4
+ v-model:delete-files-from-datastore="deleteFilesFromDatastore"
5
+ v-model:size="sizeLocal"
6
+ v-model:hard-disk-type="hardDiskType"
7
+ v-model:disk-provisioning="provisionType"
8
+ v-model:sharing="sharingLocal"
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
+ v-model:source="source"
16
+ :is-removable="isRemovable"
17
+ :label="label"
18
+ :hard-disk-invalid="hardDiskInvalid"
19
+ :error-text="hardDiskLocalAndApiErrorsTexts"
20
+ :hard-disk-type-error-local-text="hardDiskTypeErrorLocalText"
21
+ :is-disabled-size="isDisabledSize"
22
+ :is-disabled-provisioning="isDisabledProvisioning"
23
+ :is-disabled-sharing="isDisabledSharing"
24
+ :is-disabled-limit-iops="isDisabledLimitIops"
25
+ :is-disabled-mode="isDisabledMode"
26
+ :is-disabled-cache="isDisabledCache"
27
+ :is-disabled-bus="isDisabledBus"
28
+ :hard-disk-type-options="hardDiskTypeOptions"
29
+ :max-hard-disk="maxHardDisk"
30
+ :location="location"
31
+ :is-running="isRunning"
32
+ :is-new-hard-disk="isNewHardDisk"
33
+ :is-edit="props.isEdit"
34
+ :datastore="props.datastore"
35
+ :is-datastore-loading="props.isDatastoreLoading"
36
+ :get-datastore-table-func="props.getDatastoreTableFunc"
37
+ :error-validation-fields="props.errorValidationFields"
38
+ :index="props.index"
39
+ :type="props.type"
40
+ :guest-machine-type="props.guestMachineType"
41
+ :compute-resource="props.computeResource"
42
+ @remove="emits('remove')"
43
+ @roll-back="emits('roll-back')"
44
+ @validate-size="onValidateSize"
45
+ @change-storage="onChangeStorage"
46
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
47
+ />
48
+ </template>
49
+
50
+ <script setup lang="ts">
51
+ import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
52
+ // import type {
53
+ // UI_I_SendDataNewHardDisk,
54
+ // UI_I_SendDataNewHardDiskStorage,
55
+ // } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
56
+ import type { UI_T_HardDiskType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
57
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
58
+ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
59
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
60
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
61
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
62
+ import { binaryOptionsFunc } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/config/binaryOptions'
63
+
64
+ const size = defineModel<number>('size', { required: true })
65
+ const initialSize = size.value
66
+ // const provisionType = ref<string>('thick')
67
+ const provisionType = defineModel<string>('provisionType', { required: true })
68
+ // const sharing = ref<string>('')
69
+ const sharing = defineModel<boolean>('sharing', { required: true })
70
+ // const sharingLocal = ref<string>(sharing.value ? 'yes' : '')
71
+ const sharingLocal = computed<string>({
72
+ set(newValue) {
73
+ sharing.value = newValue === 'yes'
74
+ },
75
+ get() {
76
+ return sharing.value ? 'yes' : ''
77
+ },
78
+ })
79
+ // const shares = ref<number>(0)
80
+ const shares = defineModel<number>('shares', { required: true })
81
+
82
+ // const limitIops = ref<number>(16)
83
+ const limitIops = defineModel<number>('limitIops', { required: true })
84
+ const limitIopsType = ref<string>('unlimited') // ??
85
+ const limitIopsInvalid = ref<boolean>(false) // ??
86
+
87
+ // const diskMode = ref<string>('dependent')
88
+ const diskMode = defineModel<string>('diskMode', { required: true })
89
+
90
+ // const cache = ref<string>('none')
91
+ const cache = defineModel<string>('cache', { required: true })
92
+
93
+ // const bus = ref<string>('ide')
94
+ const bus = defineModel<string>('bus', { required: true })
95
+
96
+ // const readOnly = ref<boolean>(false)
97
+ const readOnly = defineModel<boolean>('readOnly', { required: true })
98
+
99
+ // const discard = ref<string>('')
100
+ const discard = defineModel<string>('discard', { required: true })
101
+
102
+ // const io = ref<string>('')
103
+ const io = defineModel<string>('io', { required: true })
104
+
105
+ // const target = ref<string>('')
106
+ const target = defineModel<string>('target', { required: true })
107
+
108
+ const source = defineModel<string>('source', { required: true })
109
+
110
+ const storage = defineModel<any>('storage', { required: true })
111
+
112
+ const remove = defineModel<boolean>('remove', { required: true })
113
+ const detach = defineModel<boolean>('detach', { required: true })
114
+
115
+ const props = withDefaults(
116
+ defineProps<{
117
+ mainStorage: UI_I_DatastoreTableItem | null
118
+ // hardDisk: UI_I_SendDataNewHardDisk
119
+ type: UI_T_HardDiskType
120
+ index: number
121
+ errorValidationFields: UI_I_ErrorValidationField[]
122
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
123
+ datastore: UI_I_DatastoreTableItem[]
124
+ isDatastoreLoading: boolean
125
+ isEdit: boolean
126
+ state?: string | number
127
+ guestMachineType?: UI_I_OptionItem | null
128
+ computeResource?: UI_I_TreeNode | null
129
+ }>(),
130
+ {
131
+ state: undefined,
132
+ guestMachineType: undefined,
133
+ computeResource: undefined,
134
+ }
135
+ )
136
+ const emits = defineEmits<{
137
+ // (event: 'send-data', value: UI_I_SendDataNewHardDisk): void
138
+ (event: 'invalid', value: boolean): void
139
+ (event: 'remove'): void
140
+ (event: 'roll-back'): void
141
+ (event: 'remove-error-by-title', value: string): void
142
+ }>()
143
+
144
+ watch(
145
+ () => props.type,
146
+ (newValue) => {
147
+ detach.value = newValue === 'removed'
148
+ }
149
+ )
150
+
151
+ const { $store, $binary }: any = useNuxtApp()
152
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
153
+ const currentComponent = computed(() =>
154
+ isNewView.value
155
+ ? defineAsyncComponent(() => import('./New.vue'))
156
+ : defineAsyncComponent(() => import('./Old.vue'))
157
+ )
158
+
159
+ const localization = computed<UI_I_Localization>(() => useLocal())
160
+
161
+ const isRunning = computed<boolean>(() => {
162
+ return props.state === 2
163
+ })
164
+
165
+ const isRemovable = computed<boolean>(() => {
166
+ return (
167
+ !props.isEdit ||
168
+ !isRunning.value ||
169
+ (isRunning.value && bus.value === 'virtio')
170
+ )
171
+ })
172
+
173
+ const typeError = computed<string>(() => `disk_devices[${props.index}].size`)
174
+
175
+ const apiErrorLocal = computed<string>(() => {
176
+ return (
177
+ props.errorValidationFields?.find(
178
+ (message) => message.field === typeError.value
179
+ )?.error_message || ''
180
+ )
181
+ })
182
+
183
+ // PC-1796
184
+ // const isNotNewHardDisk = computed<boolean>(
185
+ // () => props.type === 'edit' || props.type === 'removed'
186
+ // )
187
+ const isNewHardDisk = computed<boolean>(
188
+ () => props.type !== 'edit' && props.type !== 'removed'
189
+ )
190
+ const label = computed<string>(() => {
191
+ // if (props.type === 'edit' || props.type === 'removed')
192
+ if (!isNewHardDisk.value)
193
+ return `${localization.value.common.hardDisk} ${props.index + 1}`
194
+
195
+ return `${localization.value.common.newHardDisk} *`
196
+ })
197
+
198
+ const maxHardDisk = computed<number>(() => {
199
+ // const hardDiskSizeMb = $binary.gbToMb(props.hardDisk.size)
200
+
201
+ if (props.type === 'exist') return initialSize
202
+
203
+ if (!storageLocal.value) return 0
204
+ const free = (storageLocal.value.capacity.free_mb ||
205
+ storageLocal.value.capacity) as number // TODO fix
206
+
207
+ if (props.isEdit) return free + initialSize
208
+
209
+ return free
210
+ })
211
+ const hardDiskTypeErrorLocalText = computed<string>(() => {
212
+ if (size.value > maxHardDisk.value) {
213
+ return localization.value.common.diskCapacitySpecifiedGreater
214
+ }
215
+
216
+ if (size.value <= 0) {
217
+ return localization.value.common.diskCapacityCannotZero
218
+ }
219
+
220
+ return ''
221
+ })
222
+
223
+ const hardDiskLocalAndApiErrorsTexts = computed<string>(() => {
224
+ const localError = hardDiskTypeErrorLocalText.value
225
+ const apiError = apiErrorLocal.value
226
+
227
+ let result = ''
228
+ if (localError && !apiError) result = localError
229
+ if (!localError && apiError) result = apiError
230
+ if (localError && apiError) result = localError + ', ' + apiError
231
+ if (!localError && apiError) result = apiError
232
+
233
+ return result
234
+ })
235
+
236
+ const deleteFilesFromDatastore = ref<boolean>(false)
237
+ watch(deleteFilesFromDatastore, (newValue) => {
238
+ remove.value = props.type === 'removed' && newValue
239
+ })
240
+
241
+ const hardDiskType = ref<string>(size.value < 1024 ? 'mb' : 'gb')
242
+ watch(hardDiskType, (newValue) => {
243
+ size.value = $binary.universalFromTo(sizeLocal.value, newValue, 'mb')
244
+ })
245
+ const hardDiskTypeOptions = ref<UI_I_OptionItem[]>(
246
+ binaryOptionsFunc(localization.value)
247
+ )
248
+
249
+ const sizeLocal = ref<number>(
250
+ size.value < 1024 ? size.value : $binary.mbToGb(size.value)
251
+ )
252
+ watch(sizeLocal, (newValue) => {
253
+ if (hardDiskType.value === 'mb') {
254
+ size.value = newValue
255
+ }
256
+
257
+ size.value = $binary.universalFromTo(newValue, hardDiskType.value, 'mb')
258
+ })
259
+ // const sizeInMb = computed<number>(() => {
260
+ // if (hardDiskType.value === 'mb') {
261
+ // return size.value
262
+ // }
263
+ //
264
+ // return $binary.universalFromTo(size.value, hardDiskType.value, 'mb')
265
+ // })
266
+ const onValidateSize = (): void => {
267
+ if (props.type !== 'edit') return
268
+ if (size.value < initialSize) {
269
+ sizeLocal.value = $binary.universalFromTo(
270
+ initialSize,
271
+ 'mb',
272
+ hardDiskType.value
273
+ )
274
+ }
275
+ }
276
+
277
+ const isDisabledSize = computed<boolean>(() => {
278
+ if (isNewHardDisk.value) return false
279
+ return (
280
+ props.type === 'exist' ||
281
+ (props.type === 'edit' && readOnly.value) ||
282
+ (isRunning.value && provisionType.value === 'thick')
283
+ )
284
+ })
285
+ const isDisabledProvisioning = computed<boolean>(() => {
286
+ if (isNewHardDisk.value) return false
287
+ return props.isEdit || isRunning.value
288
+ })
289
+ const isDisabledSharing = computed<boolean>(() => {
290
+ return isRunning.value && !isNewHardDisk.value
291
+ })
292
+ const isDisabledLimitIops = computed<boolean>(() => {
293
+ return isRunning.value && !isNewHardDisk.value
294
+ })
295
+ const isDisabledMode = computed<boolean>(() => {
296
+ return isRunning.value && !isNewHardDisk.value
297
+ })
298
+ const isDisabledCache = computed<boolean>(() => {
299
+ if (isNewHardDisk.value) return false
300
+ return props.isEdit || isRunning.value
301
+ })
302
+ const isDisabledBus = computed<boolean>(() => {
303
+ return !isNewHardDisk.value && isRunning.value
304
+ })
305
+
306
+ const location = ref<UI_I_DatastoreTableItem | null>(props.mainStorage || null)
307
+ const storageLocal = ref<UI_I_DatastoreTableItem | null>(props.mainStorage)
308
+ watch(
309
+ () => props.mainStorage,
310
+ (newValue) => {
311
+ location.value = newValue
312
+ storageLocal.value = newValue
313
+
314
+ storage.value = {
315
+ id: newValue?.id || '',
316
+ name: newValue?.name || '',
317
+ type: newValue?.type_text || '',
318
+ pool: newValue?.pool_name || '',
319
+ user: '',
320
+ endpoint: '',
321
+ password: '',
322
+ protocol: '',
323
+ options: '',
324
+ }
325
+ },
326
+ {
327
+ immediate: true,
328
+ deep: true,
329
+ }
330
+ )
331
+ const onChangeStorage = (item: UI_I_DatastoreTableItem): void => {
332
+ storageLocal.value = item
333
+
334
+ storage.value = {
335
+ id: item?.id || '',
336
+ name: item?.name || '',
337
+ type: item?.type_text || '',
338
+ pool: item?.pool_name || '',
339
+ user: '',
340
+ endpoint: '',
341
+ password: '',
342
+ protocol: '',
343
+ options: '',
344
+ }
345
+ }
346
+
347
+ // const diskProvisioning = ref<string>('thick')
348
+ // const sharing = ref<string>('')
349
+ // const shares = ref<number>(0)
350
+ //
351
+ // const limitIops = ref<number>(16)
352
+ // const limitIopsType = ref<string>('unlimited')
353
+ // const limitIopsInvalid = ref<boolean>(false)
354
+ //
355
+ // const diskMode = ref<string>('dependent')
356
+ //
357
+ // const cache = ref<string>('none')
358
+ //
359
+ // const bus = ref<string>('ide')
360
+ //
361
+ // const readOnly = ref<boolean>(false)
362
+ //
363
+ // const discard = ref<string>('')
364
+ //
365
+ // const io = ref<string>('')
366
+ //
367
+ // const target = ref<string>('')
368
+
369
+ // watch(
370
+ // [
371
+ // sizeInMb,
372
+ // storage,
373
+ // diskProvisioning,
374
+ // sharing,
375
+ // limitIops,
376
+ // limitIopsType,
377
+ // diskMode,
378
+ // cache,
379
+ // bus,
380
+ // deleteFilesFromDatastore,
381
+ // (): void => props.type,
382
+ // ],
383
+ // () => {
384
+ // const limitIopsLocal =
385
+ // limitIopsType.value === 'unlimited' ? 0 : limitIops.value
386
+ // const storageLocal: UI_I_SendDataNewHardDiskStorage = {
387
+ // id: storage.value?.id || '',
388
+ // name: storage.value?.name || '',
389
+ // type: storage.value?.type_text || '',
390
+ // pool: storage.value?.pool_name || '',
391
+ // user: '',
392
+ // endpoint: '',
393
+ // password: '',
394
+ // protocol: '',
395
+ // options: '',
396
+ // }
397
+ //
398
+ // emits('send-data', {
399
+ // create: props.hardDisk.create,
400
+ // attach: props.hardDisk.attach,
401
+ // source: props.hardDisk.source,
402
+ // size: Math.ceil(sizeInMb.value),
403
+ // bus: bus.value,
404
+ // target: target.value,
405
+ // storage: storageLocal,
406
+ // device_type: 'disk',
407
+ // provision_type: diskProvisioning.value,
408
+ // disk_mode: diskMode.value,
409
+ // sharing: sharing.value === 'yes',
410
+ // read_only: readOnly.value,
411
+ // shares: shares.value,
412
+ // cache: cache.value,
413
+ // io: io.value,
414
+ // limit_iops: limitIopsLocal,
415
+ // discard: discard.value,
416
+ // capacity: Math.ceil(sizeInMb.value),
417
+ // boot_order: props.hardDisk.boot_order,
418
+ // detach: props.type === 'removed',
419
+ // remove: props.type === 'removed' && deleteFilesFromDatastore.value, // Проверяем если удалили диск и указали Delete files from datastore
420
+ // })
421
+ // },
422
+ // { immediate: true }
423
+ // )
424
+
425
+ // Добавляем данные для редактирования
426
+ // watch(
427
+ // () => props.hardDisk,
428
+ // (newValue) => {
429
+ // // TODO refactoring
430
+ // if (props.type === 'exist') {
431
+ // diskProvisioning.value = newValue.provision_type || 'thick'
432
+ // return
433
+ // }
434
+ // // if (props.type !== 'edit') return
435
+ // if (props.type !== 'edit' && props.type !== 'clone') return
436
+ //
437
+ // const sizeInGb = $binary.mbToGb(newValue.size)
438
+ // if (sizeInGb < 1) {
439
+ // size.value = newValue.size
440
+ // hardDiskType.value = 'mb'
441
+ // } else {
442
+ // size.value = sizeInGb
443
+ // hardDiskType.value = 'gb'
444
+ // }
445
+ // diskProvisioning.value = newValue.provision_type || 'thick'
446
+ // sharing.value = newValue.sharing ? 'yes' : ''
447
+ // shares.value = newValue.shares || 0
448
+ // // limitIopsType.value = newValue.io === 'native' ? 'unlimited' : 'custom'
449
+ // limitIopsType.value = newValue.limit_iops === 0 ? 'unlimited' : 'custom'
450
+ // limitIops.value = newValue.limit_iops || 16
451
+ // diskMode.value = newValue.disk_mode || 'dependent'
452
+ // cache.value = newValue.cache || 'none'
453
+ // bus.value = newValue.bus || 'ide'
454
+ // readOnly.value = newValue.read_only || false
455
+ // discard.value = newValue.discard || ''
456
+ // io.value = newValue.io || ''
457
+ // target.value = newValue.target || ''
458
+ // },
459
+ // { immediate: true }
460
+ // )
461
+ watch(
462
+ isRunning,
463
+ (newValue) => {
464
+ if (newValue && props.type === 'new') {
465
+ bus.value = 'virtio'
466
+ }
467
+ },
468
+ { immediate: true }
469
+ )
470
+
471
+ const hardDiskInvalid = computed<boolean>(() => {
472
+ return !!hardDiskTypeErrorLocalText.value || limitIopsInvalid.value
473
+ })
474
+ watch(
475
+ hardDiskInvalid,
476
+ (newValue) => {
477
+ emits('invalid', newValue)
478
+ },
479
+ { immediate: true }
480
+ )
481
+ </script>
482
+
483
+ <style scoped lang="scss"></style>