bfg-common 1.5.737 → 1.5.739

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 (109) 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 -2
  7. package/assets/localization/local_en.json +4 -2
  8. package/assets/localization/local_hy.json +4 -2
  9. package/assets/localization/local_kk.json +4 -2
  10. package/assets/localization/local_ru.json +4 -2
  11. package/assets/localization/local_zh.json +4 -2
  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/blocks/contents/filesNew/Skeleton.vue +18 -18
  21. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  22. package/components/common/diagramMain/port/Port.vue +580 -580
  23. package/components/common/layout/console/Console.vue +70 -70
  24. package/components/common/layout/theHeader/userMenu/modals/preferences/lib/models/types.ts +7 -7
  25. package/components/common/pages/backups/DetailView.vue +52 -52
  26. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  27. package/components/common/pages/backups/modals/Modals.vue +243 -243
  28. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  29. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
  30. package/components/common/pages/backups/modals/lib/config/restore.ts +116 -115
  31. package/components/common/pages/backups/modals/lib/models/interfaces.ts +187 -186
  32. package/components/common/pages/backups/modals/restore/Old.vue +5 -0
  33. package/components/common/pages/backups/modals/restore/Restore.vue +302 -289
  34. package/components/common/pages/backups/modals/restore/disks/Disks.vue +50 -32
  35. package/components/common/pages/backups/modals/restore/disks/DisksNew.vue +2 -2
  36. package/components/common/pages/backups/modals/restore/disks/DisksOld.vue +2 -2
  37. package/components/common/pages/backups/modals/restore/lib/config/readyToCompleteOptions.ts +94 -85
  38. package/components/common/pages/backups/modals/restore/lib/config/restoreCodes.ts +0 -1
  39. package/components/common/pages/backups/modals/restore/lib/config/steps.ts +130 -121
  40. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  41. package/components/common/pages/backups/modals/restore/types/New.vue +95 -95
  42. package/components/common/pages/backups/modals/restore/types/Old.vue +62 -62
  43. package/components/common/pages/backups/modals/restore/types/Types.vue +31 -31
  44. package/components/common/pages/backups/modals/restore/types/lib/config/typeOptions.ts +0 -5
  45. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  46. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  47. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  48. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  49. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  50. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  51. package/components/common/pages/tasks/Tasks.vue +125 -125
  52. package/components/common/pages/tasks/table/Table.vue +373 -373
  53. package/components/common/pages/tasks/table/lib/config/config.ts +279 -279
  54. package/components/common/pages/tasks/table/lib/models/interfaces.ts +9 -9
  55. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  56. package/components/common/select/radio/RadioGroup.vue +137 -137
  57. package/components/common/spiceConsole/Drawer.vue +420 -420
  58. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  59. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  60. package/components/common/tools/Actions.vue +207 -207
  61. package/components/common/treeView/TreeView.vue +52 -52
  62. package/components/common/vm/actions/clone/lib/config/steps.ts +295 -295
  63. package/components/common/vm/actions/clone/new/New.vue +438 -438
  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/memory/Memory.vue +283 -283
  66. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +156 -156
  67. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  68. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  69. package/components/common/vm/actions/common/select/options/New.vue +264 -264
  70. package/components/common/vm/actions/common/select/options/Options.vue +58 -58
  71. package/components/common/vm/actions/common/select/storage/Old.vue +125 -125
  72. package/components/common/vm/actions/common/select/storage/new/New.vue +311 -311
  73. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  74. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  75. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  76. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  77. package/components/common/wizards/common/compatibility/Compatibility.vue +35 -35
  78. package/components/common/wizards/common/steps/computeResource/New.vue +93 -93
  79. package/components/common/wizards/common/steps/name/Name.vue +178 -178
  80. package/components/common/wizards/common/steps/name/New.vue +221 -221
  81. package/components/common/wizards/common/steps/name/Old.vue +121 -121
  82. package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
  83. package/components/common/wizards/common/steps/name/location/New.vue +40 -40
  84. package/components/common/wizards/datastore/add/Add.vue +227 -228
  85. package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
  86. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  87. package/composables/useAppVersion.ts +21 -21
  88. package/composables/useBrowse.ts +24 -24
  89. package/composables/useLocal.ts +6 -6
  90. package/composables/useLocalCommon.ts +39 -39
  91. package/lib/models/types.ts +59 -59
  92. package/package.json +1 -1
  93. package/plugins/console.ts +21 -21
  94. package/plugins/mouse.ts +21 -21
  95. package/plugins/panelStates.ts +70 -70
  96. package/plugins/text.ts +59 -59
  97. package/public/spice-console/application/clientgui.js +854 -854
  98. package/public/spice-console/application/packetfactory.js +211 -211
  99. package/public/spice-console/application/virtualmouse.js +147 -147
  100. package/public/spice-console/lib/images/bitmap.js +203 -203
  101. package/public/spice-console/network/spicechannel.js +440 -440
  102. package/public/spice-console/process/cursorprocess.js +128 -128
  103. package/public/spice-console/process/inputprocess.js +227 -227
  104. package/public/spice-console/process/mainprocess.js +212 -212
  105. package/public/spice-console/run.js +210 -210
  106. package/store/main/mutations.ts +7 -7
  107. package/store/main/state.ts +7 -7
  108. package/store/tasks/mappers/recentTasks.ts +123 -123
  109. package/store/tasks/mutations.ts +82 -82
@@ -1,28 +1,28 @@
1
- import type { UI_I_Localization } from '~/lib/models/interfaces'
2
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
3
-
4
- export const sharesOptionsFunc = (
5
- localization: UI_I_Localization,
6
- maxShares: number
7
- ): UI_I_OptionItem[] => {
8
- return [
9
- {
10
- text: `${localization.common.minimum} 2`,
11
- value: 2,
12
- },
13
- {
14
- text: `${localization.common.maximum} ${maxShares}`,
15
- value: maxShares,
16
- },
17
- ]
18
- }
19
- export const sharesTypeOptionsFunc = (
20
- localization: UI_I_Localization
21
- ): UI_I_OptionItem[] => {
22
- return [
23
- { text: localization.common.low, value: '1000' },
24
- { text: localization.common.normal, value: '2000' },
25
- { text: localization.common.high, value: '4000' },
26
- { text: localization.common.custom, value: '2' },
27
- ]
28
- }
1
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
2
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
3
+
4
+ export const sharesOptionsFunc = (
5
+ localization: UI_I_Localization,
6
+ maxShares: number
7
+ ): UI_I_OptionItem[] => {
8
+ return [
9
+ {
10
+ text: `${localization.common.minimum} 2`,
11
+ value: 2,
12
+ },
13
+ {
14
+ text: `${localization.common.maximum} ${maxShares}`,
15
+ value: maxShares,
16
+ },
17
+ ]
18
+ }
19
+ export const sharesTypeOptionsFunc = (
20
+ localization: UI_I_Localization
21
+ ): UI_I_OptionItem[] => {
22
+ return [
23
+ { text: localization.common.low, value: '1000' },
24
+ { text: localization.common.normal, value: '2000' },
25
+ { text: localization.common.high, value: '4000' },
26
+ { text: localization.common.custom, value: '2' },
27
+ ]
28
+ }
@@ -1,283 +1,283 @@
1
- <template>
2
- <!-- TODO если убрать див будет баг при редактировании, при изменения selectedMemory значение не меняется-->
3
- <div>
4
- <component
5
- :is="currentComponent"
6
- v-model:selected-memory="selectedMemory"
7
- v-model:memory-type="memoryType"
8
- v-model:reservation="reservation"
9
- v-model:reservation-type="reservationType"
10
- v-model:reserve-guest-memory="reserveGuestMemory"
11
- v-model:reservation-invalid="reservationInvalid"
12
- v-model:limit="limit"
13
- v-model:limit-type="limitType"
14
- v-model:limit-invalid="limitInvalid"
15
- v-model:memory-hot-plug="model.memory.hotplug"
16
- :error-validation-fields="props.errorValidationFields"
17
- :memory-invalid="memoryInvalid"
18
- :error-text="memorySizeLocalAndApiErrorsTexts"
19
- :memory-options="memoryOptions"
20
- :is-memory-disabled="isMemoryDisabled"
21
- :memory-type-options="memoryTypeOptions"
22
- :is-disabled="isDisabled"
23
- :limit-options="limitOptions"
24
- :is-disabled-memory-hot-plug="isDisabledMemoryHotPlug"
25
- @select-memory="onSelectMemory"
26
- @remove-error="onRemoveValidationError"
27
- @remove-error-by-title="emits('remove-error-by-title', $event)"
28
- />
29
- </div>
30
- </template>
31
-
32
- <script setup lang="ts">
33
- import type { UI_I_Localization } from '~/lib/models/interfaces'
34
- import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
35
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
36
- import type { UI_I_CreateVmData } from '~/components/common/vm/actions/common/lib/models/interfaces'
37
- import {
38
- memoryOptionsFunc,
39
- memoryTypeOptionsFunc,
40
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/lib/config/memoryOptions'
41
-
42
- const model = defineModel<UI_I_CreateVmData>({ required: true })
43
-
44
- const props = withDefaults(
45
- defineProps<{
46
- maxMemory: number
47
- isEdit: boolean
48
- errorValidationFields: UI_I_ErrorValidationField[]
49
- state?: string | number
50
- }>(),
51
- {
52
- state: undefined,
53
- }
54
- )
55
- const emits = defineEmits<{
56
- (event: 'invalid', value: boolean): void
57
- (event: 'remove-error-by-title', value: string): void
58
- }>()
59
-
60
- const { $store, $binary }: any = useNuxtApp()
61
- const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
62
- const currentComponent = computed(() =>
63
- isNewView.value
64
- ? defineAsyncComponent(() => import('./New.vue'))
65
- : defineAsyncComponent(() => import('./Old.vue'))
66
- )
67
-
68
- const localization = computed<UI_I_Localization>(() => useLocal())
69
-
70
- const minMemoryInMb = 128
71
- watch(
72
- () => props.maxMemory,
73
- (newValue) => {
74
- memoryOptions.value = memoryOptionsFunc(
75
- localization.value,
76
- minMemoryInMb,
77
- newValue
78
- )
79
- }
80
- )
81
-
82
- const isDisabled = computed<boolean>(() => {
83
- return props.state === 2
84
- })
85
-
86
- const isMemoryDisabled = computed<boolean>(
87
- () => isDisabled.value && !model.value.memory.hotplug
88
- )
89
-
90
- const selectedMemory = ref<number>(4)
91
- watch(selectedMemory, (newValue) => {
92
- const valueInt = parseInt('' + newValue)
93
- selectedMemory.value = isNaN(valueInt) ? 0 : valueInt
94
- })
95
- const memoryType = ref<string>('gb')
96
- const memoryTypeOptions = ref<UI_I_OptionItem[]>(
97
- memoryTypeOptionsFunc(localization.value)
98
- )
99
- const memoryInMb = computed<number>(() => {
100
- if (memoryType.value === 'mb') {
101
- return +selectedMemory.value
102
- }
103
-
104
- return $binary.universalFromTo(+selectedMemory.value, memoryType.value, 'mb')
105
- })
106
- watch(memoryInMb, (newValue) => {
107
- model.value.memory.size_mb = newValue
108
- })
109
- if (model.value.memory.size_mb !== 4096) {
110
- const sizeInGb = $binary.mbToGb(model.value.memory.size_mb)
111
- if (sizeInGb < 1) {
112
- selectedMemory.value = model.value.memory.size_mb
113
- memoryType.value = 'mb'
114
- } else {
115
- selectedMemory.value = sizeInGb
116
- }
117
- }
118
-
119
- const memoryOptions = ref<UI_I_OptionItem[]>(
120
- memoryOptionsFunc(localization.value, minMemoryInMb, props.maxMemory)
121
- )
122
- const onSelectMemory = ({
123
- value,
124
- type,
125
- }: {
126
- value: number
127
- type: string
128
- }): void => {
129
- selectedMemory.value = value
130
- if (memoryType.value !== type) {
131
- memoryType.value = type
132
- }
133
- // if (memoryType.value === 'mb') {
134
- // selectedMemory.value = mb
135
- // return
136
- // }
137
- //
138
- // selectedMemory.value = $binary.universalFromTo(mb, 'mb', memoryType.value, 12)
139
- }
140
-
141
- const memoryErrorLocalText = computed<string>(() => {
142
- const validValue = /^\d+(\.\d+)?$/.test(selectedMemory.value + '')
143
- if (!validValue) {
144
- return localization.value.common.inputContainsInvalidCharacters
145
- }
146
-
147
- const maxMemoryInGb = $binary.mbToGb(props.maxMemory)
148
- if (memoryInMb.value < minMemoryInMb || memoryInMb.value > props.maxMemory) {
149
- return localization.value.common.memoryMustBe
150
- .replace('{0}', `${minMemoryInMb} ${localization.value.common.mb}`)
151
- .replace('{1}', `${maxMemoryInGb} ${localization.value.common.gb}`)
152
- }
153
-
154
- if (memoryInMb.value % 2 !== 0) {
155
- return localization.value.common.valueShouldMultiple.replace(
156
- '{0}',
157
- `${2} ${localization.value.common.mb}`
158
- )
159
- }
160
- return ''
161
- })
162
-
163
- const apiErrorLocal = computed<string>(() => {
164
- return (
165
- props.errorValidationFields?.find(
166
- (message) => message.field === 'memory.size_mb'
167
- )?.error_message || ''
168
- )
169
- })
170
-
171
- const memorySizeLocalAndApiErrorsTexts = computed<string>(() => {
172
- const localError = memoryErrorLocalText.value
173
- const apiError = apiErrorLocal.value
174
-
175
- let result = ''
176
- if (localError && !apiError) result = localError
177
- if (apiError && !localError) result = apiError
178
- if (localError && apiError) result = localError + ', ' + apiError
179
- if (!localError && apiError) result = apiError
180
-
181
- return result
182
- })
183
-
184
- const reservationInvalid = ref<boolean>(false)
185
- const limitInvalid = ref<boolean>(false)
186
- const memoryInvalid = computed<boolean>(
187
- () =>
188
- !!memorySizeLocalAndApiErrorsTexts.value ||
189
- reservationInvalid.value ||
190
- limitInvalid.value
191
- )
192
- watch(
193
- memoryInvalid,
194
- (newValue) => {
195
- emits('invalid', newValue)
196
- },
197
- { immediate: true }
198
- )
199
-
200
- const reservation = ref<string>('2')
201
- watch(reservation, (newValue) => {
202
- const valueInt = parseInt('' + newValue)
203
- reservation.value = isNaN(valueInt) ? '0' : '' + valueInt
204
- })
205
- const reservationType = ref<string>('mb')
206
- const reserveGuestMemory = ref<boolean>(false)
207
- if (model.value.memory.reservation_mb !== 2) {
208
- const reservationInGb = $binary.mbToGb(model.value.memory.reservation_mb)
209
- if (reservationInGb < 1) {
210
- reservation.value = model.value.memory.reservation_mb.toString()
211
- reservationType.value = 'mb'
212
- } else {
213
- reservation.value = reservationInGb
214
- reservationType.value = 'gb'
215
- }
216
- }
217
- watch(
218
- [reservation, reservationType],
219
- () => {
220
- model.value.memory.reservation_mb =
221
- reservationType.value === 'gb'
222
- ? $binary.gbToMb(+reservation.value)
223
- : +reservation.value
224
- },
225
- { deep: true, immediate: true }
226
- )
227
-
228
- const limit = ref<string>('Unlimited')
229
- watch(limit, (newValue) => {
230
- const valueInt = parseInt('' + newValue)
231
- limit.value !== 'Unlimited' &&
232
- (limit.value = isNaN(valueInt) ? '0' : '' + valueInt)
233
- })
234
- const limitType = ref<string>('mb')
235
- const limitOptions = computed<UI_I_OptionItem[] | undefined>(() => {
236
- if (model.value.memory.hotplug)
237
- return memoryOptionsFunc(
238
- localization.value,
239
- memoryInMb.value,
240
- props.maxMemory
241
- )
242
- })
243
- if (model.value.memory.limit_mb !== null) {
244
- if (typeof model.value.memory.limit_mb === 'string')
245
- limit.value = model.value.memory.limit_mb
246
- else {
247
- const limitInGb = $binary.mbToGb(model.value.memory.limit_mb)
248
- if (limitInGb < 1) {
249
- limit.value = model.value.memory.limit_mb.toString()
250
- limitType.value = 'mb'
251
- } else {
252
- limit.value = limitInGb
253
- limitType.value = 'gb'
254
- }
255
- }
256
- }
257
- watch(
258
- [limit, limitType],
259
- () => {
260
- model.value.memory.limit_mb =
261
- limit.value === 'Unlimited'
262
- ? limit.value
263
- : limitType.value === 'gb'
264
- ? $binary.gbToMb(+limit.value)
265
- : +limit.value
266
- },
267
- { deep: true, immediate: true }
268
- )
269
-
270
- // const memoryHotPlug = ref<boolean>(false)
271
- const isDisabledMemoryHotPlug = computed<boolean>(
272
- () => memoryInMb.value >= props.maxMemory || isDisabled.value
273
- )
274
- watch(isDisabledMemoryHotPlug, (newValue) => {
275
- if (newValue) model.value.memory.hotplug = false
276
- })
277
-
278
- const onRemoveValidationError = (): void => {
279
- emits('remove-error-by-title', 'memory.size_mb')
280
- }
281
- </script>
282
-
283
- <style scoped lang="scss"></style>
1
+ <template>
2
+ <!-- TODO если убрать див будет баг при редактировании, при изменения selectedMemory значение не меняется-->
3
+ <div>
4
+ <component
5
+ :is="currentComponent"
6
+ v-model:selected-memory="selectedMemory"
7
+ v-model:memory-type="memoryType"
8
+ v-model:reservation="reservation"
9
+ v-model:reservation-type="reservationType"
10
+ v-model:reserve-guest-memory="reserveGuestMemory"
11
+ v-model:reservation-invalid="reservationInvalid"
12
+ v-model:limit="limit"
13
+ v-model:limit-type="limitType"
14
+ v-model:limit-invalid="limitInvalid"
15
+ v-model:memory-hot-plug="model.memory.hotplug"
16
+ :error-validation-fields="props.errorValidationFields"
17
+ :memory-invalid="memoryInvalid"
18
+ :error-text="memorySizeLocalAndApiErrorsTexts"
19
+ :memory-options="memoryOptions"
20
+ :is-memory-disabled="isMemoryDisabled"
21
+ :memory-type-options="memoryTypeOptions"
22
+ :is-disabled="isDisabled"
23
+ :limit-options="limitOptions"
24
+ :is-disabled-memory-hot-plug="isDisabledMemoryHotPlug"
25
+ @select-memory="onSelectMemory"
26
+ @remove-error="onRemoveValidationError"
27
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
28
+ />
29
+ </div>
30
+ </template>
31
+
32
+ <script setup lang="ts">
33
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
34
+ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
35
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
36
+ import type { UI_I_CreateVmData } from '~/components/common/vm/actions/common/lib/models/interfaces'
37
+ import {
38
+ memoryOptionsFunc,
39
+ memoryTypeOptionsFunc,
40
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/lib/config/memoryOptions'
41
+
42
+ const model = defineModel<UI_I_CreateVmData>({ required: true })
43
+
44
+ const props = withDefaults(
45
+ defineProps<{
46
+ maxMemory: number
47
+ isEdit: boolean
48
+ errorValidationFields: UI_I_ErrorValidationField[]
49
+ state?: string | number
50
+ }>(),
51
+ {
52
+ state: undefined,
53
+ }
54
+ )
55
+ const emits = defineEmits<{
56
+ (event: 'invalid', value: boolean): void
57
+ (event: 'remove-error-by-title', value: string): void
58
+ }>()
59
+
60
+ const { $store, $binary }: any = useNuxtApp()
61
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
62
+ const currentComponent = computed(() =>
63
+ isNewView.value
64
+ ? defineAsyncComponent(() => import('./New.vue'))
65
+ : defineAsyncComponent(() => import('./Old.vue'))
66
+ )
67
+
68
+ const localization = computed<UI_I_Localization>(() => useLocal())
69
+
70
+ const minMemoryInMb = 128
71
+ watch(
72
+ () => props.maxMemory,
73
+ (newValue) => {
74
+ memoryOptions.value = memoryOptionsFunc(
75
+ localization.value,
76
+ minMemoryInMb,
77
+ newValue
78
+ )
79
+ }
80
+ )
81
+
82
+ const isDisabled = computed<boolean>(() => {
83
+ return props.state === 2
84
+ })
85
+
86
+ const isMemoryDisabled = computed<boolean>(
87
+ () => isDisabled.value && !model.value.memory.hotplug
88
+ )
89
+
90
+ const selectedMemory = ref<number>(4)
91
+ watch(selectedMemory, (newValue) => {
92
+ const valueInt = parseInt('' + newValue)
93
+ selectedMemory.value = isNaN(valueInt) ? 0 : valueInt
94
+ })
95
+ const memoryType = ref<string>('gb')
96
+ const memoryTypeOptions = ref<UI_I_OptionItem[]>(
97
+ memoryTypeOptionsFunc(localization.value)
98
+ )
99
+ const memoryInMb = computed<number>(() => {
100
+ if (memoryType.value === 'mb') {
101
+ return +selectedMemory.value
102
+ }
103
+
104
+ return $binary.universalFromTo(+selectedMemory.value, memoryType.value, 'mb')
105
+ })
106
+ watch(memoryInMb, (newValue) => {
107
+ model.value.memory.size_mb = newValue
108
+ })
109
+ if (model.value.memory.size_mb !== 4096) {
110
+ const sizeInGb = $binary.mbToGb(model.value.memory.size_mb)
111
+ if (sizeInGb < 1) {
112
+ selectedMemory.value = model.value.memory.size_mb
113
+ memoryType.value = 'mb'
114
+ } else {
115
+ selectedMemory.value = sizeInGb
116
+ }
117
+ }
118
+
119
+ const memoryOptions = ref<UI_I_OptionItem[]>(
120
+ memoryOptionsFunc(localization.value, minMemoryInMb, props.maxMemory)
121
+ )
122
+ const onSelectMemory = ({
123
+ value,
124
+ type,
125
+ }: {
126
+ value: number
127
+ type: string
128
+ }): void => {
129
+ selectedMemory.value = value
130
+ if (memoryType.value !== type) {
131
+ memoryType.value = type
132
+ }
133
+ // if (memoryType.value === 'mb') {
134
+ // selectedMemory.value = mb
135
+ // return
136
+ // }
137
+ //
138
+ // selectedMemory.value = $binary.universalFromTo(mb, 'mb', memoryType.value, 12)
139
+ }
140
+
141
+ const memoryErrorLocalText = computed<string>(() => {
142
+ const validValue = /^\d+(\.\d+)?$/.test(selectedMemory.value + '')
143
+ if (!validValue) {
144
+ return localization.value.common.inputContainsInvalidCharacters
145
+ }
146
+
147
+ const maxMemoryInGb = $binary.mbToGb(props.maxMemory)
148
+ if (memoryInMb.value < minMemoryInMb || memoryInMb.value > props.maxMemory) {
149
+ return localization.value.common.memoryMustBe
150
+ .replace('{0}', `${minMemoryInMb} ${localization.value.common.mb}`)
151
+ .replace('{1}', `${maxMemoryInGb} ${localization.value.common.gb}`)
152
+ }
153
+
154
+ if (memoryInMb.value % 2 !== 0) {
155
+ return localization.value.common.valueShouldMultiple.replace(
156
+ '{0}',
157
+ `${2} ${localization.value.common.mb}`
158
+ )
159
+ }
160
+ return ''
161
+ })
162
+
163
+ const apiErrorLocal = computed<string>(() => {
164
+ return (
165
+ props.errorValidationFields?.find(
166
+ (message) => message.field === 'memory.size_mb'
167
+ )?.error_message || ''
168
+ )
169
+ })
170
+
171
+ const memorySizeLocalAndApiErrorsTexts = computed<string>(() => {
172
+ const localError = memoryErrorLocalText.value
173
+ const apiError = apiErrorLocal.value
174
+
175
+ let result = ''
176
+ if (localError && !apiError) result = localError
177
+ if (apiError && !localError) result = apiError
178
+ if (localError && apiError) result = localError + ', ' + apiError
179
+ if (!localError && apiError) result = apiError
180
+
181
+ return result
182
+ })
183
+
184
+ const reservationInvalid = ref<boolean>(false)
185
+ const limitInvalid = ref<boolean>(false)
186
+ const memoryInvalid = computed<boolean>(
187
+ () =>
188
+ !!memorySizeLocalAndApiErrorsTexts.value ||
189
+ reservationInvalid.value ||
190
+ limitInvalid.value
191
+ )
192
+ watch(
193
+ memoryInvalid,
194
+ (newValue) => {
195
+ emits('invalid', newValue)
196
+ },
197
+ { immediate: true }
198
+ )
199
+
200
+ const reservation = ref<string>('2')
201
+ watch(reservation, (newValue) => {
202
+ const valueInt = parseInt('' + newValue)
203
+ reservation.value = isNaN(valueInt) ? '0' : '' + valueInt
204
+ })
205
+ const reservationType = ref<string>('mb')
206
+ const reserveGuestMemory = ref<boolean>(false)
207
+ if (model.value.memory.reservation_mb !== 2) {
208
+ const reservationInGb = $binary.mbToGb(model.value.memory.reservation_mb)
209
+ if (reservationInGb < 1) {
210
+ reservation.value = model.value.memory.reservation_mb.toString()
211
+ reservationType.value = 'mb'
212
+ } else {
213
+ reservation.value = reservationInGb
214
+ reservationType.value = 'gb'
215
+ }
216
+ }
217
+ watch(
218
+ [reservation, reservationType],
219
+ () => {
220
+ model.value.memory.reservation_mb =
221
+ reservationType.value === 'gb'
222
+ ? $binary.gbToMb(+reservation.value)
223
+ : +reservation.value
224
+ },
225
+ { deep: true, immediate: true }
226
+ )
227
+
228
+ const limit = ref<string>('Unlimited')
229
+ watch(limit, (newValue) => {
230
+ const valueInt = parseInt('' + newValue)
231
+ limit.value !== 'Unlimited' &&
232
+ (limit.value = isNaN(valueInt) ? '0' : '' + valueInt)
233
+ })
234
+ const limitType = ref<string>('mb')
235
+ const limitOptions = computed<UI_I_OptionItem[] | undefined>(() => {
236
+ if (model.value.memory.hotplug)
237
+ return memoryOptionsFunc(
238
+ localization.value,
239
+ memoryInMb.value,
240
+ props.maxMemory
241
+ )
242
+ })
243
+ if (model.value.memory.limit_mb !== null) {
244
+ if (typeof model.value.memory.limit_mb === 'string')
245
+ limit.value = model.value.memory.limit_mb
246
+ else {
247
+ const limitInGb = $binary.mbToGb(model.value.memory.limit_mb)
248
+ if (limitInGb < 1) {
249
+ limit.value = model.value.memory.limit_mb.toString()
250
+ limitType.value = 'mb'
251
+ } else {
252
+ limit.value = limitInGb
253
+ limitType.value = 'gb'
254
+ }
255
+ }
256
+ }
257
+ watch(
258
+ [limit, limitType],
259
+ () => {
260
+ model.value.memory.limit_mb =
261
+ limit.value === 'Unlimited'
262
+ ? limit.value
263
+ : limitType.value === 'gb'
264
+ ? $binary.gbToMb(+limit.value)
265
+ : +limit.value
266
+ },
267
+ { deep: true, immediate: true }
268
+ )
269
+
270
+ // const memoryHotPlug = ref<boolean>(false)
271
+ const isDisabledMemoryHotPlug = computed<boolean>(
272
+ () => memoryInMb.value >= props.maxMemory || isDisabled.value
273
+ )
274
+ watch(isDisabledMemoryHotPlug, (newValue) => {
275
+ if (newValue) model.value.memory.hotplug = false
276
+ })
277
+
278
+ const onRemoveValidationError = (): void => {
279
+ emits('remove-error-by-title', 'memory.size_mb')
280
+ }
281
+ </script>
282
+
283
+ <style scoped lang="scss"></style>