bfg-common 1.5.673 → 1.5.674

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 (125) 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/bottomPanel/BottomPanel.vue +80 -0
  18. package/components/common/layout/bottomPanel/New.vue +239 -0
  19. package/components/common/layout/bottomPanel/Old.vue +154 -0
  20. package/components/common/layout/bottomPanel/alarms/Alarms.vue +76 -0
  21. package/components/common/layout/bottomPanel/alarms/lib/models/interfaces.ts +23 -0
  22. package/components/common/layout/bottomPanel/alarms/new/New.vue +212 -0
  23. package/components/common/layout/bottomPanel/alarms/new/lib/config/config.ts +193 -0
  24. package/components/common/layout/bottomPanel/alarms/new/lib/models/enums.ts +10 -0
  25. package/components/common/layout/bottomPanel/alarms/new/lib/models/interfaces.ts +12 -0
  26. package/components/common/layout/bottomPanel/alarms/old/Old.vue +191 -0
  27. package/components/common/layout/bottomPanel/alarms/old/lib/config/alarmTables.ts +89 -0
  28. package/components/common/layout/bottomPanel/alarms/old/lib/config/tableKeys.ts +11 -0
  29. package/components/common/layout/bottomPanel/alarms/old/lib/models/types.ts +8 -0
  30. package/components/common/layout/bottomPanel/lib/config/statusFilter.ts +19 -0
  31. package/components/common/layout/bottomPanel/lib/models/types.ts +1 -0
  32. package/components/common/layout/bottomPanel/recentTasks/RecentTasks.vue +43 -0
  33. package/components/common/layout/bottomPanel/recentTasks/lib/models/interfaces.ts +14 -0
  34. package/components/common/layout/bottomPanel/recentTasks/new/New.vue +419 -0
  35. package/components/common/layout/bottomPanel/recentTasks/new/lib/config/config.ts +259 -0
  36. package/components/common/layout/bottomPanel/recentTasks/old/Old.vue +275 -0
  37. package/components/common/layout/bottomPanel/recentTasks/old/lib/config/recentTaskTable.ts +240 -0
  38. package/components/common/layout/bottomPanel/recentTasks/old/lib/config/tableKeys.ts +15 -0
  39. package/components/common/layout/bottomPanel/recentTasks/old/lib/models/types.ts +14 -0
  40. package/components/common/layout/theHeader/TheHeaderNew.vue +315 -315
  41. package/components/common/layout/theHeader/TheHeaderOld.vue +262 -262
  42. package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
  43. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
  44. package/components/common/layout/theHeader/userMenu/modals/changePassword/ChangePassword.vue +93 -93
  45. package/components/common/layout/theHeader/userMenu/modals/changePassword/New.vue +193 -193
  46. package/components/common/layout/theHeader/userMenu/modals/preferences/PreferencesOld.vue +144 -144
  47. package/components/common/layout/theHeader/userMenu/modals/preferences/lib/models/types.ts +7 -7
  48. package/components/common/layout/theHeader/userMenu/modals/preferences/security/Old.vue +216 -216
  49. package/components/common/layout/theHeader/userMenu/modals/preferences/security/Security.vue +31 -31
  50. package/components/common/pages/backups/DetailView.vue +52 -52
  51. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  52. package/components/common/pages/backups/modals/Modals.vue +243 -243
  53. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  54. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
  55. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  56. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  57. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  58. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  59. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  60. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  61. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  62. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  63. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  64. package/components/common/qr/Qr.vue +57 -57
  65. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  66. package/components/common/select/radio/RadioGroup.vue +137 -137
  67. package/components/common/spiceConsole/Drawer.vue +420 -420
  68. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  69. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  70. package/components/common/tools/Actions.vue +207 -207
  71. package/components/common/treeView/TreeView.vue +52 -52
  72. package/components/common/vm/actions/clone/lib/config/steps.ts +295 -295
  73. package/components/common/vm/actions/clone/new/New.vue +438 -438
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  76. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +283 -283
  77. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +489 -489
  78. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +156 -156
  79. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  80. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  81. package/components/common/vm/actions/common/select/options/New.vue +264 -264
  82. package/components/common/vm/actions/common/select/options/Old.vue +110 -110
  83. package/components/common/vm/actions/common/select/options/Options.vue +58 -58
  84. package/components/common/vm/actions/common/select/storage/Old.vue +125 -125
  85. package/components/common/vm/actions/common/select/storage/new/New.vue +311 -311
  86. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  87. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  88. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  89. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  90. package/components/common/wizards/common/compatibility/Compatibility.vue +35 -35
  91. package/components/common/wizards/common/compatibility/New.vue +99 -99
  92. package/components/common/wizards/common/compatibility/Old.vue +53 -53
  93. package/components/common/wizards/common/steps/computeResource/New.vue +93 -93
  94. package/components/common/wizards/common/steps/name/Name.vue +178 -178
  95. package/components/common/wizards/common/steps/name/New.vue +221 -221
  96. package/components/common/wizards/common/steps/name/Old.vue +121 -121
  97. package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
  98. package/components/common/wizards/common/steps/name/location/New.vue +40 -40
  99. package/components/common/wizards/datastore/add/Add.vue +228 -228
  100. package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
  101. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  102. package/composables/useAppVersion.ts +21 -21
  103. package/composables/useEnvLanguage.ts +22 -22
  104. package/composables/useLocal.ts +6 -6
  105. package/composables/useLocalCommon.ts +39 -39
  106. package/lib/models/enums.ts +65 -1
  107. package/package.json +1 -1
  108. package/plugins/console.ts +21 -21
  109. package/plugins/mouse.ts +21 -21
  110. package/plugins/panelStates.ts +70 -70
  111. package/plugins/text.ts +59 -59
  112. package/public/spice-console/application/clientgui.js +854 -854
  113. package/public/spice-console/application/packetfactory.js +211 -211
  114. package/public/spice-console/application/virtualmouse.js +147 -147
  115. package/public/spice-console/lib/images/bitmap.js +203 -203
  116. package/public/spice-console/network/spicechannel.js +440 -440
  117. package/public/spice-console/process/cursorprocess.js +128 -128
  118. package/public/spice-console/process/inputprocess.js +227 -227
  119. package/public/spice-console/process/mainprocess.js +212 -212
  120. package/public/spice-console/run.js +210 -210
  121. package/store/main/mutations.ts +7 -7
  122. package/store/main/state.ts +7 -7
  123. package/store/tasks/actions.ts +165 -165
  124. package/store/tasks/mappers/recentTasks.ts +123 -123
  125. 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>