bfg-common 1.5.656 → 1.5.657

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 (115) 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 -1
  7. package/assets/localization/local_en.json +4 -1
  8. package/assets/localization/local_hy.json +4 -1
  9. package/assets/localization/local_kk.json +4 -1
  10. package/assets/localization/local_ru.json +4 -1
  11. package/assets/localization/local_zh.json +4 -1
  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/theHeader/TheHeader.vue +38 -26
  24. package/components/common/layout/theHeader/TheHeaderNew.vue +315 -310
  25. package/components/common/layout/theHeader/TheHeaderOld.vue +262 -257
  26. package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
  27. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
  28. package/components/common/layout/theHeader/userMenu/UserMenu.vue +8 -3
  29. package/components/common/layout/theHeader/userMenu/modals/changePassword/ChangePassword.vue +99 -99
  30. package/components/common/layout/theHeader/userMenu/modals/changePassword/New.vue +193 -193
  31. package/components/common/layout/theHeader/userMenu/modals/preferences/Preferences.vue +10 -4
  32. package/components/common/layout/theHeader/userMenu/modals/preferences/PreferencesOld.vue +144 -141
  33. package/components/common/layout/theHeader/userMenu/modals/preferences/lib/models/types.ts +7 -7
  34. package/components/common/layout/theHeader/userMenu/modals/preferences/security/Old.vue +210 -120
  35. package/components/common/layout/theHeader/userMenu/modals/preferences/security/Security.vue +31 -23
  36. package/components/common/layout/theHeader/userMenu/modals/preferences/security/lib/models/interfaces.ts +4 -0
  37. package/components/common/pages/backups/DetailView.vue +52 -52
  38. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  39. package/components/common/pages/backups/modals/Modals.vue +243 -243
  40. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  41. package/components/common/pages/backups/modals/createBackup/datastores/tableView/old/lib/config/table.ts +12 -0
  42. package/components/common/pages/backups/modals/createBackup/disks/tableView/old/lib/config/table.ts +9 -0
  43. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
  44. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  45. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  46. package/components/common/pages/backups/modals/restore/disks/tableView/old/lib/config/table.ts +9 -0
  47. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  48. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  49. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  50. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  51. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  52. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  53. package/components/common/pages/licensing/listView/ListView.vue +13 -5
  54. package/components/common/pages/licensing/modals/assign/tableView/TableView.vue +3 -5
  55. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  56. package/components/common/pages/scheduledTasks/table/lib/config/scheduledTasksTable.ts +6 -0
  57. package/components/common/qrcode/Qrcode.vue +56 -0
  58. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  59. package/components/common/select/radio/RadioGroup.vue +137 -137
  60. package/components/common/spiceConsole/Drawer.vue +420 -420
  61. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  62. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  63. package/components/common/tools/Actions.vue +207 -207
  64. package/components/common/treeView/TreeView.vue +52 -52
  65. package/components/common/vm/actions/clone/lib/config/steps.ts +295 -295
  66. package/components/common/vm/actions/clone/new/New.vue +438 -438
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +1 -1
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +283 -283
  70. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +156 -156
  71. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  72. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  73. package/components/common/vm/actions/common/select/options/New.vue +264 -264
  74. package/components/common/vm/actions/common/select/options/Old.vue +110 -110
  75. package/components/common/vm/actions/common/select/options/Options.vue +58 -58
  76. package/components/common/vm/actions/common/select/storage/Old.vue +125 -125
  77. package/components/common/vm/actions/common/select/storage/new/New.vue +311 -311
  78. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  79. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  80. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  81. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  82. package/components/common/wizards/common/compatibility/Compatibility.vue +35 -35
  83. package/components/common/wizards/common/compatibility/New.vue +99 -99
  84. package/components/common/wizards/common/compatibility/Old.vue +53 -53
  85. package/components/common/wizards/common/steps/computeResource/New.vue +93 -93
  86. package/components/common/wizards/common/steps/name/Name.vue +178 -178
  87. package/components/common/wizards/common/steps/name/New.vue +221 -221
  88. package/components/common/wizards/common/steps/name/Old.vue +121 -121
  89. package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
  90. package/components/common/wizards/common/steps/name/location/New.vue +40 -40
  91. package/components/common/wizards/datastore/add/Add.vue +228 -228
  92. package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
  93. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  94. package/composables/useAppVersion.ts +21 -21
  95. package/composables/useLocal.ts +6 -6
  96. package/composables/useLocalCommon.ts +39 -39
  97. package/package.json +3 -2
  98. package/plugins/console.ts +21 -21
  99. package/plugins/mouse.ts +21 -21
  100. package/plugins/panelStates.ts +70 -70
  101. package/plugins/text.ts +59 -59
  102. package/public/spice-console/application/clientgui.js +854 -854
  103. package/public/spice-console/application/packetfactory.js +211 -211
  104. package/public/spice-console/application/virtualmouse.js +147 -147
  105. package/public/spice-console/lib/images/bitmap.js +203 -203
  106. package/public/spice-console/network/spicechannel.js +440 -440
  107. package/public/spice-console/process/cursorprocess.js +128 -128
  108. package/public/spice-console/process/inputprocess.js +227 -227
  109. package/public/spice-console/process/mainprocess.js +212 -212
  110. package/public/spice-console/run.js +210 -210
  111. package/store/main/mutations.ts +7 -7
  112. package/store/main/state.ts +7 -7
  113. package/store/tasks/actions.ts +165 -165
  114. package/store/tasks/mappers/recentTasks.ts +123 -123
  115. package/store/tasks/mutations.ts +82 -82
@@ -100,7 +100,7 @@ watch(
100
100
  }
101
101
 
102
102
  maxCpuInvalid.value = false
103
- model.value.cpu.max_vcpus = 1
103
+ model.value.cpu.max_vcpus = capabilities.value.maxCpus
104
104
  }
105
105
  )
106
106
 
@@ -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>