bfg-common 1.5.715 → 1.5.716

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 (107) 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/components/atoms/TheIcon3.vue +50 -50
  7. package/components/atoms/collapse/CollapseNav.vue +170 -170
  8. package/components/atoms/perPage/PerPage.vue +58 -58
  9. package/components/atoms/table/dataGrid/DataGrid.vue +1718 -1718
  10. package/components/atoms/table/dataGrid/DataGridPagination.vue +97 -97
  11. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  12. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  13. package/components/common/backup/storage/actions/add/lib/utils.ts +51 -51
  14. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  15. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  16. package/components/common/diagramMain/port/Port.vue +580 -580
  17. package/components/common/layout/theHeader/TheHeader.vue +51 -37
  18. package/components/common/layout/theHeader/TheHeaderNew.vue +315 -305
  19. package/components/common/layout/theHeader/TheHeaderOld.vue +262 -252
  20. package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
  21. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
  22. package/components/common/layout/theHeader/userMenu/UserMenu.vue +19 -9
  23. package/components/common/layout/theHeader/userMenu/modals/preferences/Preferences.vue +28 -13
  24. package/components/common/layout/theHeader/userMenu/modals/preferences/PreferencesNew.vue +16 -8
  25. package/components/common/layout/theHeader/userMenu/modals/preferences/PreferencesOld.vue +144 -136
  26. package/components/common/layout/theHeader/userMenu/modals/preferences/changeLanguage/ChangeLanguage.vue +4 -10
  27. package/components/common/layout/theHeader/userMenu/modals/preferences/changeLanguage/New.vue +28 -5
  28. package/components/common/layout/theHeader/userMenu/modals/preferences/changeLanguage/Old.vue +28 -5
  29. package/components/common/layout/theHeader/userMenu/modals/preferences/defaultConsole/DefaultConsole.vue +14 -1
  30. package/components/common/layout/theHeader/userMenu/modals/preferences/inventory/Inventory.vue +14 -1
  31. package/components/common/layout/theHeader/userMenu/modals/preferences/lib/models/types.ts +7 -7
  32. package/components/common/layout/theHeader/userMenu/modals/preferences/timeFormat/TimeFormat.vue +15 -2
  33. package/components/common/layout/theHeader/userMenu/modals/preferences/view/View.vue +15 -2
  34. package/components/common/pages/backups/DetailView.vue +52 -52
  35. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  36. package/components/common/pages/backups/modals/Modals.vue +243 -243
  37. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  38. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
  39. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  40. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  41. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  42. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  43. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  44. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  45. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  46. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  47. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  48. package/components/common/pages/tasks/Tasks.vue +125 -122
  49. package/components/common/pages/tasks/table/Table.vue +373 -370
  50. package/components/common/pages/tasks/table/lib/config/config.ts +279 -279
  51. package/components/common/pages/tasks/table/lib/models/interfaces.ts +6 -0
  52. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  53. package/components/common/select/radio/RadioGroup.vue +137 -137
  54. package/components/common/selectLanguage/SelectLanguage.vue +5 -5
  55. package/components/common/spiceConsole/Drawer.vue +420 -420
  56. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  57. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  58. package/components/common/tools/Actions.vue +207 -207
  59. package/components/common/treeView/TreeView.vue +52 -52
  60. package/components/common/vm/actions/clone/lib/config/steps.ts +295 -295
  61. package/components/common/vm/actions/clone/new/New.vue +438 -438
  62. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  63. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +283 -283
  64. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +156 -156
  65. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  66. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  67. package/components/common/vm/actions/common/select/options/New.vue +264 -264
  68. package/components/common/vm/actions/common/select/options/Options.vue +58 -58
  69. package/components/common/vm/actions/common/select/storage/Old.vue +125 -125
  70. package/components/common/vm/actions/common/select/storage/new/New.vue +311 -311
  71. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  72. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  73. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  74. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  75. package/components/common/wizards/common/compatibility/Compatibility.vue +35 -35
  76. package/components/common/wizards/common/steps/computeResource/New.vue +93 -93
  77. package/components/common/wizards/common/steps/name/Name.vue +178 -178
  78. package/components/common/wizards/common/steps/name/New.vue +221 -221
  79. package/components/common/wizards/common/steps/name/Old.vue +121 -121
  80. package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
  81. package/components/common/wizards/common/steps/name/location/New.vue +40 -40
  82. package/components/common/wizards/datastore/add/Add.vue +228 -228
  83. package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
  84. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  85. package/composables/useAppVersion.ts +21 -21
  86. package/composables/useLocal.ts +6 -6
  87. package/composables/useLocalCommon.ts +39 -39
  88. package/package.json +1 -1
  89. package/plugins/console.ts +21 -21
  90. package/plugins/mouse.ts +21 -21
  91. package/plugins/panelStates.ts +70 -70
  92. package/plugins/text.ts +59 -59
  93. package/public/spice-console/application/clientgui.js +854 -854
  94. package/public/spice-console/application/packetfactory.js +211 -211
  95. package/public/spice-console/application/virtualmouse.js +147 -147
  96. package/public/spice-console/lib/images/bitmap.js +203 -203
  97. package/public/spice-console/network/spicechannel.js +440 -440
  98. package/public/spice-console/process/cursorprocess.js +128 -128
  99. package/public/spice-console/process/inputprocess.js +227 -227
  100. package/public/spice-console/process/mainprocess.js +212 -212
  101. package/public/spice-console/run.js +210 -210
  102. package/store/main/mutations.ts +7 -7
  103. package/store/main/state.ts +7 -7
  104. package/store/tasks/actions.ts +1 -1
  105. package/store/tasks/mappers/recentTasks.ts +123 -123
  106. package/store/tasks/mappers/tasks.ts +8 -1
  107. 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>