bfg-common 1.4.860 → 1.4.861

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 (198) hide show
  1. package/.idea/inspectionProfiles/Project_Default.xml +1 -2
  2. package/assets/localization/local_be.json +3009 -3012
  3. package/assets/localization/local_en.json +2 -5
  4. package/assets/localization/local_hy.json +2 -5
  5. package/assets/localization/local_kk.json +2 -5
  6. package/assets/localization/local_ru.json +2 -5
  7. package/assets/localization/local_zh.json +2 -5
  8. package/assets/scss/common/normalize.scss +361 -361
  9. package/components/atoms/TheIcon3.vue +50 -50
  10. package/components/atoms/autocomplete/Autocomplete.vue +301 -301
  11. package/components/atoms/collapse/CollapseNav.vue +164 -164
  12. package/components/atoms/dropdown/dropdown/Dropdown.vue +168 -168
  13. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  14. package/components/atoms/stack/StackBlock.vue +185 -185
  15. package/components/atoms/table/dataGrid/DataGrid.vue +1704 -1704
  16. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +222 -222
  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/browse/BrowseNew.vue +237 -237
  20. package/components/common/browse/BrowseOld.vue +217 -217
  21. package/components/common/browse/blocks/contents/Files.vue +37 -37
  22. package/components/common/browse/blocks/contents/FilesOld.vue +72 -72
  23. package/components/common/browse/blocks/contents/filesNew/FilesNew.vue +96 -96
  24. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  25. package/components/common/chartOptionsModal/counters/timespan/form/Form.vue +313 -40
  26. package/components/common/context/Context.vue +111 -111
  27. package/components/common/context/lib/models/interfaces.ts +30 -30
  28. package/components/common/context/recursion/Recursion.vue +87 -87
  29. package/components/common/context/recursion/RecursionOld.vue +227 -227
  30. package/components/common/details/DetailsItem.vue +109 -109
  31. package/components/common/graph/Graph.vue +104 -104
  32. package/components/common/graph/GraphOld.vue +31 -50
  33. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  34. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  35. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  36. package/components/common/monitor/advanced/Advanced.vue +3 -0
  37. package/components/common/monitor/advanced/AdvancedNew.vue +2 -0
  38. package/components/common/monitor/advanced/AdvancedOld.vue +2 -0
  39. package/components/common/monitor/advanced/graphView/GraphView.vue +18 -16
  40. package/components/common/monitor/advanced/tools/Tools.vue +3 -0
  41. package/components/common/monitor/advanced/tools/ToolsNew.vue +2 -0
  42. package/components/common/monitor/advanced/tools/ToolsOld.vue +2 -0
  43. package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModal.vue +114 -113
  44. package/components/common/monitor/advanced/tools/chartOptionsModal/Notification.vue +20 -13
  45. package/components/common/monitor/advanced/tools/chartOptionsModal/actions/Actions.vue +79 -28
  46. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/Counters.vue +56 -75
  47. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/Table.vue +58 -19
  48. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/{tableOld/lib → lib}/config/tableConfig.ts +1 -1
  49. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/config/utils.ts +1040 -1040
  50. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/Timespan.vue +47 -71
  51. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/Object.vue +26 -21
  52. package/components/common/monitor/advanced/tools/chartOptionsModal/metrics/Metrics.vue +29 -17
  53. package/components/common/monitor/overview/Overview.vue +221 -224
  54. package/components/common/monitor/overview/OverviewNew.vue +142 -142
  55. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  56. package/components/common/monitor/overview/filters/Filters.vue +166 -166
  57. package/components/common/monitor/overview/filters/FiltersNew.vue +172 -172
  58. package/components/common/monitor/overview/filters/FiltersOld.vue +151 -151
  59. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModal.vue +175 -175
  60. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModalNew.vue +181 -186
  61. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModalOld.vue +161 -161
  62. package/components/common/pages/hardwareHealth/historyTestimony/Graph.vue +30 -26
  63. package/components/common/pages/home/StatusContent.vue +49 -49
  64. package/components/common/pages/home/headline/Headline.vue +45 -45
  65. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  66. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  67. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  68. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  69. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  70. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  71. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  72. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  73. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  74. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  75. package/components/common/pages/packages/Packages.vue +208 -208
  76. package/components/common/recursionTree/RecursionTree.vue +223 -223
  77. package/components/common/select/button/ButtonDropdown.vue +108 -108
  78. package/components/common/spiceConsole/Drawer.vue +370 -370
  79. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  80. package/components/common/split/horizontal/HorizontalNew.vue +376 -376
  81. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  82. package/components/common/split/vertical/Vertical.vue +160 -160
  83. package/components/common/vm/actions/add/Add.vue +621 -621
  84. package/components/common/vm/actions/clone/Clone.vue +639 -639
  85. package/components/common/vm/actions/clone/lib/config/steps.ts +129 -129
  86. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +271 -271
  87. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +271 -271
  88. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +174 -174
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +694 -694
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +161 -161
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +165 -165
  94. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  95. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +364 -364
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +229 -229
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +247 -247
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +283 -283
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  126. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  127. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  128. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  129. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  130. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  131. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  132. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  133. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  134. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  135. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  136. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  137. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  138. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  139. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  140. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  141. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  142. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  143. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  144. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  145. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  146. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  147. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  148. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  149. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  150. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  151. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  152. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  153. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  154. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  155. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  156. package/components/common/wizards/vm/migrate/Migrate.vue +302 -302
  157. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  158. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  159. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  160. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  161. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  162. package/composables/productNameLocal.ts +30 -30
  163. package/composables/useAppVersion.ts +21 -21
  164. package/package.json +2 -2
  165. package/plugins/date.ts +233 -233
  166. package/plugins/recursion.ts +311 -311
  167. package/public/spice-console/lib/images/bitmap.js +203 -203
  168. package/public/spice-console/network/spicechannel.js +383 -383
  169. package/store/main/mutations.ts +7 -7
  170. package/store/main/state.ts +7 -7
  171. package/store/tasks/mappers/recentTasks.ts +64 -64
  172. package/components/common/chartOptionsModal/counters/timespan/form/FormNew.vue +0 -241
  173. package/components/common/chartOptionsModal/counters/timespan/form/FormOld.vue +0 -372
  174. package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModalNew.vue +0 -190
  175. package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModalOld.vue +0 -189
  176. package/components/common/monitor/advanced/tools/chartOptionsModal/NotificationNew.vue +0 -20
  177. package/components/common/monitor/advanced/tools/chartOptionsModal/NotificationOld.vue +0 -27
  178. package/components/common/monitor/advanced/tools/chartOptionsModal/actions/ActionsNew.vue +0 -160
  179. package/components/common/monitor/advanced/tools/chartOptionsModal/actions/ActionsOld.vue +0 -114
  180. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/CountersNew.vue +0 -97
  181. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/CountersOld.vue +0 -110
  182. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/tableNew/TableNew.vue +0 -46
  183. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/tableNew/config/options.ts +0 -19
  184. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/tableNew/config/tableData.ts +0 -71
  185. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/tableNew/utils/constructTable.ts +0 -29
  186. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/tableOld/TableOld.vue +0 -85
  187. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/TimespanNew.vue +0 -150
  188. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/TimespanOld.vue +0 -95
  189. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/objectNew/ObjectNew.vue +0 -56
  190. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/objectNew/lib/config/options.ts +0 -25
  191. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/objectNew/lib/config/tableData.ts +0 -47
  192. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/objectNew/lib/utils/constructTable.ts +0 -22
  193. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/objectOld/ObjectOld.vue +0 -84
  194. package/components/common/monitor/advanced/tools/chartOptionsModal/metrics/MetricsOld.vue +0 -32
  195. package/components/common/monitor/advanced/tools/chartOptionsModal/metrics/metricsNew/MetricsNew.vue +0 -101
  196. package/components/common/monitor/advanced/tools/chartOptionsModal/metrics/metricsNew/lib/utils/constructAccordion.ts +0 -32
  197. package/lib/utils/date.ts +0 -12
  198. /package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/{tableOld/lib → lib}/models/types.ts +0 -0
@@ -1,364 +1,364 @@
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
- @remove="emits('remove')"
36
- @roll-back="emits('roll-back')"
37
- @validate-size="onValidateSize"
38
- @change-storage="onChangeStorage"
39
- @remove-error-by-title="emits('remove-error-by-title', $event)"
40
- />
41
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk-old
42
- v-else
43
- v-model:delete-files-from-datastore="deleteFilesFromDatastore"
44
- v-model:size="size"
45
- v-model:hard-disk-type="hardDiskType"
46
- v-model:disk-provisioning="diskProvisioning"
47
- v-model:sharing="sharing"
48
- v-model:limit-iops="limitIops"
49
- v-model:limit-iops-type="limitIopsType"
50
- v-model:limit-iops-invalid="limitIopsInvalid"
51
- v-model:disk-mode="diskMode"
52
- v-model:cache="cache"
53
- v-model:bus="bus"
54
- :is-removable="isRemovable"
55
- :label="label"
56
- :hard-disk-invalid="hardDiskInvalid"
57
- :error-text="hardDiskLocalAndApiErrorsTexts"
58
- :hard-disk-type-error-local-text="hardDiskTypeErrorLocalText"
59
- :is-disabled-size="isDisabledSize"
60
- :hard-disk-type-options="hardDiskTypeOptions"
61
- :max-hard-disk="maxHardDisk"
62
- :location="location"
63
- :is-running="isRunning"
64
- :is-new-hard-disk="!isNotNewHardDisk"
65
- :is-edit="props.isEdit"
66
- :datastore="props.datastore"
67
- :get-datastore-table-func="props.getDatastoreTableFunc"
68
- :error-validation-fields="props.errorValidationFields"
69
- :index="props.index"
70
- :type="props.type"
71
- :hard-disk="props.hardDisk"
72
- :guest-machine-type="props.guestMachineType"
73
- :is-new-type="isNewType"
74
- @remove="emits('remove')"
75
- @roll-back="emits('roll-back')"
76
- @validate-size="onValidateSize"
77
- @change-storage="onChangeStorage"
78
- @remove-error-by-title="emits('remove-error-by-title', $event)"
79
- />
80
- </template>
81
-
82
- <script setup lang="ts">
83
- import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
84
- import type {
85
- UI_I_SendDataNewHardDisk,
86
- UI_I_SendDataNewHardDiskStorage,
87
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
88
- import type { UI_T_HardDiskType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
89
- import type { UI_I_Localization } from '~/lib/models/interfaces'
90
- import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
91
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
92
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
93
- import { binaryOptionsFunc } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/config/binaryOptions'
94
-
95
- const props = defineProps<{
96
- storage: UI_I_DatastoreTableItem | null
97
- hardDisk: UI_I_SendDataNewHardDisk
98
- type: UI_T_HardDiskType
99
- index: number
100
- errorValidationFields: UI_I_ErrorValidationField<string>[]
101
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
102
- datastore: UI_I_DatastoreTableItem[]
103
- isEdit: boolean
104
- state?: string | number
105
- guestMachineType?: UI_I_OptionItem | null
106
- }>()
107
- const emits = defineEmits<{
108
- (event: 'send-data', value: UI_I_SendDataNewHardDisk): void
109
- (event: 'invalid', value: boolean): void
110
- (event: 'remove'): void
111
- (event: 'roll-back'): void
112
- (event: 'remove-error-by-title', value: string): void
113
- }>()
114
-
115
- const { $store, $binary }: any = useNuxtApp()
116
- const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
117
-
118
- const localization = computed<UI_I_Localization>(() => useLocal())
119
-
120
- const isRunning = computed<boolean>(() => {
121
- return props.state === 2
122
- })
123
-
124
- const isRemovable = computed<boolean>(() => {
125
- return (
126
- !props.isEdit ||
127
- !isRunning.value ||
128
- (isRunning.value && bus.value === 'virtio')
129
- )
130
- })
131
-
132
- const isNewType = computed<boolean>(
133
- () => props.type === 'new' || props.type === 'clone'
134
- )
135
-
136
- const typeError = computed<string>(() => `disk_devices[${props.index}].size`)
137
-
138
- const apiErrorLocal = computed<string>(() => {
139
- return (
140
- props.errorValidationFields?.find(
141
- (message) => message.field === typeError.value
142
- )?.error_message || ''
143
- )
144
- })
145
-
146
- // PC-1796
147
- const isNotNewHardDisk = computed<boolean>(
148
- () => props.type === 'edit' || props.type === 'removed'
149
- )
150
- const label = computed<string>(() => {
151
- // if (props.type === 'edit' || props.type === 'removed')
152
- if (isNotNewHardDisk.value)
153
- return `${localization.value.common.hardDisk} ${props.index + 1}`
154
-
155
- return `${localization.value.common.newHardDisk} *`
156
- })
157
-
158
- const maxHardDisk = computed<number>(() => {
159
- if (props.type === 'exist') return $binary.gbToMb(props.hardDisk.size)
160
-
161
- if (!storage.value) return 0
162
-
163
- if (props.isEdit)
164
- return storage.value.capacity.free_mb + $binary.gbToMb(props.hardDisk.size)
165
-
166
- return storage.value.capacity.free_mb
167
- })
168
- const hardDiskTypeErrorLocalText = computed<string>(() => {
169
- if (+sizeInMb.value > maxHardDisk.value) {
170
- return localization.value.common.diskCapacitySpecifiedGreater
171
- }
172
-
173
- if (+sizeInMb.value <= 0) {
174
- return localization.value.common.diskCapacityCannotZero
175
- }
176
-
177
- return ''
178
- })
179
-
180
- const hardDiskLocalAndApiErrorsTexts = computed<string>(() => {
181
- const localError = hardDiskTypeErrorLocalText.value
182
- const apiError = apiErrorLocal.value
183
-
184
- let result = ''
185
- if (localError && !apiError) result = localError
186
- if (!localError && apiError) result = apiError
187
- if (localError && apiError) result = localError + ', ' + apiError
188
- if (!localError && apiError) result = apiError
189
-
190
- return result
191
- })
192
-
193
- const deleteFilesFromDatastore = ref<boolean>(false)
194
-
195
- const hardDiskType = ref<string>('gb')
196
- const hardDiskTypeOptions = ref<UI_I_OptionItem[]>(
197
- binaryOptionsFunc(localization.value)
198
- )
199
-
200
- const size = ref<number>(props.hardDisk.size) // Изначально всегда приходит в gb
201
- const sizeInMb = computed<number>(() => {
202
- if (hardDiskType.value === 'mb') {
203
- return size.value
204
- }
205
-
206
- return $binary.universalFromTo(size.value, hardDiskType.value, 'mb')
207
- })
208
- const onValidateSize = (): void => {
209
- if (props.type !== 'edit') return
210
- if (sizeInMb.value < $binary.gbToMb(props.hardDisk.size)) {
211
- size.value = $binary.universalFromTo(
212
- props.hardDisk.size,
213
- 'gb',
214
- hardDiskType.value
215
- )
216
- }
217
- }
218
-
219
- const isDisabledSize = computed<boolean>(() => {
220
- return props.type === 'exist' || (props.type === 'edit' && readOnly.value)
221
- })
222
-
223
- const location = ref<UI_I_DatastoreTableItem | null>(props.storage || null)
224
- watch(
225
- () => props.storage,
226
- (newValue) => {
227
- location.value = newValue
228
- storage.value = newValue
229
- }
230
- )
231
- const storage = ref<UI_I_DatastoreTableItem | null>(props.storage)
232
- const onChangeStorage = (item: UI_I_DatastoreTableItem): void => {
233
- storage.value = item
234
- }
235
-
236
- const diskProvisioning = ref<string>('thick')
237
- const sharing = ref<string>('')
238
- const shares = ref<number>(0)
239
-
240
- const limitIops = ref<number>(16)
241
- const limitIopsType = ref<string>('unlimited')
242
- const limitIopsInvalid = ref<boolean>(false)
243
-
244
- const diskMode = ref<string>('dependent')
245
-
246
- const cache = ref<string>('none')
247
-
248
- const bus = ref<string>('ide')
249
-
250
- const readOnly = ref<boolean>(false)
251
-
252
- const discard = ref<string>('')
253
-
254
- const io = ref<string>('')
255
-
256
- const target = ref<string>('')
257
-
258
- watch(
259
- [
260
- sizeInMb,
261
- storage,
262
- diskProvisioning,
263
- sharing,
264
- limitIops,
265
- limitIopsType,
266
- diskMode,
267
- cache,
268
- bus,
269
- deleteFilesFromDatastore,
270
- (): void => props.type,
271
- ],
272
- () => {
273
- const limitIopsLocal =
274
- limitIopsType.value === 'unlimited' ? 0 : limitIops.value
275
- const storageLocal: UI_I_SendDataNewHardDiskStorage = {
276
- id: storage.value?.id || '',
277
- name: storage.value?.name || '',
278
- type: storage.value?.type_text || '',
279
- pool: storage.value?.pool_name || '',
280
- user: '',
281
- endpoint: '',
282
- password: '',
283
- protocol: '',
284
- options: '',
285
- }
286
-
287
- emits('send-data', {
288
- create: props.hardDisk.create,
289
- attach: props.hardDisk.attach,
290
- source: props.hardDisk.source,
291
- size: Math.ceil(sizeInMb.value),
292
- bus: bus.value,
293
- target: target.value,
294
- storage: storageLocal,
295
- device_type: 'disk',
296
- provision_type: diskProvisioning.value,
297
- disk_mode: diskMode.value,
298
- sharing: sharing.value === 'yes',
299
- read_only: readOnly.value,
300
- shares: shares.value,
301
- cache: cache.value,
302
- io: io.value,
303
- limit_iops: limitIopsLocal,
304
- discard: discard.value,
305
- capacity: Math.ceil(sizeInMb.value),
306
- boot_order: props.hardDisk.boot_order,
307
- detach: props.type === 'removed',
308
- remove: props.type === 'removed' && deleteFilesFromDatastore.value, // Проверяем если удалили диск и указали Delete files from datastore
309
- })
310
- },
311
- { immediate: true }
312
- )
313
-
314
- // Добавляем данные для редактирования
315
- watch(
316
- () => props.hardDisk,
317
- (newValue) => {
318
- // TODO refactoring
319
- if (props.type === 'exist') {
320
- diskProvisioning.value = newValue.provision_type || 'thick'
321
- return
322
- }
323
- // if (props.type !== 'edit') return
324
- if (props.type !== 'edit' && props.type !== 'clone') return
325
-
326
- diskProvisioning.value = newValue.provision_type || 'thick'
327
- sharing.value = newValue.sharing ? 'yes' : ''
328
- shares.value = newValue.shares || 0
329
- // limitIopsType.value = newValue.io === 'native' ? 'unlimited' : 'custom'
330
- limitIopsType.value = newValue.limit_iops === 0 ? 'unlimited' : 'custom'
331
- limitIops.value = newValue.limit_iops || 16
332
- diskMode.value = newValue.disk_mode || 'dependent'
333
- cache.value = newValue.cache || 'none'
334
- bus.value = newValue.bus || 'ide'
335
- readOnly.value = newValue.read_only || false
336
- discard.value = newValue.discard || ''
337
- io.value = newValue.io || ''
338
- target.value = newValue.target || ''
339
- },
340
- { immediate: true }
341
- )
342
- watch(
343
- isRunning,
344
- (newValue) => {
345
- if (newValue && props.type === 'new') {
346
- bus.value = 'virtio'
347
- }
348
- },
349
- { immediate: true }
350
- )
351
-
352
- const hardDiskInvalid = computed<boolean>(() => {
353
- return !!hardDiskTypeErrorLocalText.value || limitIopsInvalid.value
354
- })
355
- watch(
356
- hardDiskInvalid,
357
- (newValue) => {
358
- emits('invalid', newValue)
359
- },
360
- { immediate: true }
361
- )
362
- </script>
363
-
364
- <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
+ @remove="emits('remove')"
36
+ @roll-back="emits('roll-back')"
37
+ @validate-size="onValidateSize"
38
+ @change-storage="onChangeStorage"
39
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
40
+ />
41
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk-old
42
+ v-else
43
+ v-model:delete-files-from-datastore="deleteFilesFromDatastore"
44
+ v-model:size="size"
45
+ v-model:hard-disk-type="hardDiskType"
46
+ v-model:disk-provisioning="diskProvisioning"
47
+ v-model:sharing="sharing"
48
+ v-model:limit-iops="limitIops"
49
+ v-model:limit-iops-type="limitIopsType"
50
+ v-model:limit-iops-invalid="limitIopsInvalid"
51
+ v-model:disk-mode="diskMode"
52
+ v-model:cache="cache"
53
+ v-model:bus="bus"
54
+ :is-removable="isRemovable"
55
+ :label="label"
56
+ :hard-disk-invalid="hardDiskInvalid"
57
+ :error-text="hardDiskLocalAndApiErrorsTexts"
58
+ :hard-disk-type-error-local-text="hardDiskTypeErrorLocalText"
59
+ :is-disabled-size="isDisabledSize"
60
+ :hard-disk-type-options="hardDiskTypeOptions"
61
+ :max-hard-disk="maxHardDisk"
62
+ :location="location"
63
+ :is-running="isRunning"
64
+ :is-new-hard-disk="!isNotNewHardDisk"
65
+ :is-edit="props.isEdit"
66
+ :datastore="props.datastore"
67
+ :get-datastore-table-func="props.getDatastoreTableFunc"
68
+ :error-validation-fields="props.errorValidationFields"
69
+ :index="props.index"
70
+ :type="props.type"
71
+ :hard-disk="props.hardDisk"
72
+ :guest-machine-type="props.guestMachineType"
73
+ :is-new-type="isNewType"
74
+ @remove="emits('remove')"
75
+ @roll-back="emits('roll-back')"
76
+ @validate-size="onValidateSize"
77
+ @change-storage="onChangeStorage"
78
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
79
+ />
80
+ </template>
81
+
82
+ <script setup lang="ts">
83
+ import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
84
+ import type {
85
+ UI_I_SendDataNewHardDisk,
86
+ UI_I_SendDataNewHardDiskStorage,
87
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
88
+ import type { UI_T_HardDiskType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
89
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
90
+ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
91
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
92
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
93
+ import { binaryOptionsFunc } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/config/binaryOptions'
94
+
95
+ const props = defineProps<{
96
+ storage: UI_I_DatastoreTableItem | null
97
+ hardDisk: UI_I_SendDataNewHardDisk
98
+ type: UI_T_HardDiskType
99
+ index: number
100
+ errorValidationFields: UI_I_ErrorValidationField<string>[]
101
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
102
+ datastore: UI_I_DatastoreTableItem[]
103
+ isEdit: boolean
104
+ state?: string | number
105
+ guestMachineType?: UI_I_OptionItem | null
106
+ }>()
107
+ const emits = defineEmits<{
108
+ (event: 'send-data', value: UI_I_SendDataNewHardDisk): void
109
+ (event: 'invalid', value: boolean): void
110
+ (event: 'remove'): void
111
+ (event: 'roll-back'): void
112
+ (event: 'remove-error-by-title', value: string): void
113
+ }>()
114
+
115
+ const { $store, $binary }: any = useNuxtApp()
116
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
117
+
118
+ const localization = computed<UI_I_Localization>(() => useLocal())
119
+
120
+ const isRunning = computed<boolean>(() => {
121
+ return props.state === 2
122
+ })
123
+
124
+ const isRemovable = computed<boolean>(() => {
125
+ return (
126
+ !props.isEdit ||
127
+ !isRunning.value ||
128
+ (isRunning.value && bus.value === 'virtio')
129
+ )
130
+ })
131
+
132
+ const isNewType = computed<boolean>(
133
+ () => props.type === 'new' || props.type === 'clone'
134
+ )
135
+
136
+ const typeError = computed<string>(() => `disk_devices[${props.index}].size`)
137
+
138
+ const apiErrorLocal = computed<string>(() => {
139
+ return (
140
+ props.errorValidationFields?.find(
141
+ (message) => message.field === typeError.value
142
+ )?.error_message || ''
143
+ )
144
+ })
145
+
146
+ // PC-1796
147
+ const isNotNewHardDisk = computed<boolean>(
148
+ () => props.type === 'edit' || props.type === 'removed'
149
+ )
150
+ const label = computed<string>(() => {
151
+ // if (props.type === 'edit' || props.type === 'removed')
152
+ if (isNotNewHardDisk.value)
153
+ return `${localization.value.common.hardDisk} ${props.index + 1}`
154
+
155
+ return `${localization.value.common.newHardDisk} *`
156
+ })
157
+
158
+ const maxHardDisk = computed<number>(() => {
159
+ if (props.type === 'exist') return $binary.gbToMb(props.hardDisk.size)
160
+
161
+ if (!storage.value) return 0
162
+
163
+ if (props.isEdit)
164
+ return storage.value.capacity.free_mb + $binary.gbToMb(props.hardDisk.size)
165
+
166
+ return storage.value.capacity.free_mb
167
+ })
168
+ const hardDiskTypeErrorLocalText = computed<string>(() => {
169
+ if (+sizeInMb.value > maxHardDisk.value) {
170
+ return localization.value.common.diskCapacitySpecifiedGreater
171
+ }
172
+
173
+ if (+sizeInMb.value <= 0) {
174
+ return localization.value.common.diskCapacityCannotZero
175
+ }
176
+
177
+ return ''
178
+ })
179
+
180
+ const hardDiskLocalAndApiErrorsTexts = computed<string>(() => {
181
+ const localError = hardDiskTypeErrorLocalText.value
182
+ const apiError = apiErrorLocal.value
183
+
184
+ let result = ''
185
+ if (localError && !apiError) result = localError
186
+ if (!localError && apiError) result = apiError
187
+ if (localError && apiError) result = localError + ', ' + apiError
188
+ if (!localError && apiError) result = apiError
189
+
190
+ return result
191
+ })
192
+
193
+ const deleteFilesFromDatastore = ref<boolean>(false)
194
+
195
+ const hardDiskType = ref<string>('gb')
196
+ const hardDiskTypeOptions = ref<UI_I_OptionItem[]>(
197
+ binaryOptionsFunc(localization.value)
198
+ )
199
+
200
+ const size = ref<number>(props.hardDisk.size) // Изначально всегда приходит в gb
201
+ const sizeInMb = computed<number>(() => {
202
+ if (hardDiskType.value === 'mb') {
203
+ return size.value
204
+ }
205
+
206
+ return $binary.universalFromTo(size.value, hardDiskType.value, 'mb')
207
+ })
208
+ const onValidateSize = (): void => {
209
+ if (props.type !== 'edit') return
210
+ if (sizeInMb.value < $binary.gbToMb(props.hardDisk.size)) {
211
+ size.value = $binary.universalFromTo(
212
+ props.hardDisk.size,
213
+ 'gb',
214
+ hardDiskType.value
215
+ )
216
+ }
217
+ }
218
+
219
+ const isDisabledSize = computed<boolean>(() => {
220
+ return props.type === 'exist' || (props.type === 'edit' && readOnly.value)
221
+ })
222
+
223
+ const location = ref<UI_I_DatastoreTableItem | null>(props.storage || null)
224
+ watch(
225
+ () => props.storage,
226
+ (newValue) => {
227
+ location.value = newValue
228
+ storage.value = newValue
229
+ }
230
+ )
231
+ const storage = ref<UI_I_DatastoreTableItem | null>(props.storage)
232
+ const onChangeStorage = (item: UI_I_DatastoreTableItem): void => {
233
+ storage.value = item
234
+ }
235
+
236
+ const diskProvisioning = ref<string>('thick')
237
+ const sharing = ref<string>('')
238
+ const shares = ref<number>(0)
239
+
240
+ const limitIops = ref<number>(16)
241
+ const limitIopsType = ref<string>('unlimited')
242
+ const limitIopsInvalid = ref<boolean>(false)
243
+
244
+ const diskMode = ref<string>('dependent')
245
+
246
+ const cache = ref<string>('none')
247
+
248
+ const bus = ref<string>('ide')
249
+
250
+ const readOnly = ref<boolean>(false)
251
+
252
+ const discard = ref<string>('')
253
+
254
+ const io = ref<string>('')
255
+
256
+ const target = ref<string>('')
257
+
258
+ watch(
259
+ [
260
+ sizeInMb,
261
+ storage,
262
+ diskProvisioning,
263
+ sharing,
264
+ limitIops,
265
+ limitIopsType,
266
+ diskMode,
267
+ cache,
268
+ bus,
269
+ deleteFilesFromDatastore,
270
+ (): void => props.type,
271
+ ],
272
+ () => {
273
+ const limitIopsLocal =
274
+ limitIopsType.value === 'unlimited' ? 0 : limitIops.value
275
+ const storageLocal: UI_I_SendDataNewHardDiskStorage = {
276
+ id: storage.value?.id || '',
277
+ name: storage.value?.name || '',
278
+ type: storage.value?.type_text || '',
279
+ pool: storage.value?.pool_name || '',
280
+ user: '',
281
+ endpoint: '',
282
+ password: '',
283
+ protocol: '',
284
+ options: '',
285
+ }
286
+
287
+ emits('send-data', {
288
+ create: props.hardDisk.create,
289
+ attach: props.hardDisk.attach,
290
+ source: props.hardDisk.source,
291
+ size: Math.ceil(sizeInMb.value),
292
+ bus: bus.value,
293
+ target: target.value,
294
+ storage: storageLocal,
295
+ device_type: 'disk',
296
+ provision_type: diskProvisioning.value,
297
+ disk_mode: diskMode.value,
298
+ sharing: sharing.value === 'yes',
299
+ read_only: readOnly.value,
300
+ shares: shares.value,
301
+ cache: cache.value,
302
+ io: io.value,
303
+ limit_iops: limitIopsLocal,
304
+ discard: discard.value,
305
+ capacity: Math.ceil(sizeInMb.value),
306
+ boot_order: props.hardDisk.boot_order,
307
+ detach: props.type === 'removed',
308
+ remove: props.type === 'removed' && deleteFilesFromDatastore.value, // Проверяем если удалили диск и указали Delete files from datastore
309
+ })
310
+ },
311
+ { immediate: true }
312
+ )
313
+
314
+ // Добавляем данные для редактирования
315
+ watch(
316
+ () => props.hardDisk,
317
+ (newValue) => {
318
+ // TODO refactoring
319
+ if (props.type === 'exist') {
320
+ diskProvisioning.value = newValue.provision_type || 'thick'
321
+ return
322
+ }
323
+ // if (props.type !== 'edit') return
324
+ if (props.type !== 'edit' && props.type !== 'clone') return
325
+
326
+ diskProvisioning.value = newValue.provision_type || 'thick'
327
+ sharing.value = newValue.sharing ? 'yes' : ''
328
+ shares.value = newValue.shares || 0
329
+ // limitIopsType.value = newValue.io === 'native' ? 'unlimited' : 'custom'
330
+ limitIopsType.value = newValue.limit_iops === 0 ? 'unlimited' : 'custom'
331
+ limitIops.value = newValue.limit_iops || 16
332
+ diskMode.value = newValue.disk_mode || 'dependent'
333
+ cache.value = newValue.cache || 'none'
334
+ bus.value = newValue.bus || 'ide'
335
+ readOnly.value = newValue.read_only || false
336
+ discard.value = newValue.discard || ''
337
+ io.value = newValue.io || ''
338
+ target.value = newValue.target || ''
339
+ },
340
+ { immediate: true }
341
+ )
342
+ watch(
343
+ isRunning,
344
+ (newValue) => {
345
+ if (newValue && props.type === 'new') {
346
+ bus.value = 'virtio'
347
+ }
348
+ },
349
+ { immediate: true }
350
+ )
351
+
352
+ const hardDiskInvalid = computed<boolean>(() => {
353
+ return !!hardDiskTypeErrorLocalText.value || limitIopsInvalid.value
354
+ })
355
+ watch(
356
+ hardDiskInvalid,
357
+ (newValue) => {
358
+ emits('invalid', newValue)
359
+ },
360
+ { immediate: true }
361
+ )
362
+ </script>
363
+
364
+ <style scoped lang="scss"></style>