bfg-common 1.3.322 → 1.3.324

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.
@@ -1,295 +1,299 @@
1
- <template>
2
- <div class="hardware-network">
3
- <atoms-stack-block
4
- :has-children="true"
5
- :removable="isRemovable"
6
- @remove="removeNetwork"
7
- >
8
- <template #stackBlockKey>
9
- <div class="vm-wizard-toggle-block-network flex-align-center">
10
- <span>{{ label }}</span>
11
- <atoms-the-icon
12
- v-show="newNetworkInvalid"
13
- width="24px"
14
- height="24px"
15
- class="is-error tooltip-trigger"
16
- name="info"
17
- />
18
- </div>
19
- </template>
20
- <template #stackBlockContent>
21
- <div class="flex-align-center flex-space-between">
22
- <atoms-tooltip-error
23
- :has-error="!!apiError"
24
- :selector="`.vm-wizard-network-field-${props.index}`"
25
- @remove="onRemoveValidationError"
26
- >
27
- <template #elem>
28
- <div class="select">
29
- <select
30
- :id="`vm-wizard-network-field-${props.index}`"
31
- v-model="selectedLocation"
32
- :data-id="`vm-wizard-network-field-${props.index}`"
33
- :class="`vm-wizard-network-field-${props.index} input-text-color`"
34
- :disabled="props.type === 'edit' && state !== 1"
35
- @click.stop
36
- @change="changeLocation"
37
- >
38
- <option
39
- v-for="(item, key) in locationOptions"
40
- :key="key"
41
- :value="item.value"
42
- >
43
- {{ item.text }}
44
- </option>
45
- </select>
46
- </div>
47
- </template>
48
- <template #content>{{ apiError }}</template>
49
- </atoms-tooltip-error>
50
- </div>
51
- </template>
52
- <template #stackChildren>
53
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-network-adapter-type
54
- v-model:adapter-type="adapterType"
55
- :index="props.index"
56
- :disabled="props.type === 'edit' || isRunning"
57
- :error-validation-fields="props.errorValidationFields"
58
- @remove-error-by-title="emits('remove-error-by-title', $event)"
59
- />
60
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-network-mac-address
61
- v-model:mac-address="macAddress"
62
- v-model:mac-address-type="macAddressType"
63
- :index="props.index"
64
- :disabled="props.type === 'edit'"
65
- :error-validation-fields="props.errorValidationFields"
66
- @invalid="newNetworkInvalid = $event"
67
- @remove-error-by-title="emits('remove-error-by-title', $event)"
68
- />
69
- </template>
70
- </atoms-stack-block>
71
-
72
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-network-location
73
- :location-modal-is-show="locationModalIsShow"
74
- :networks-table="networksTable"
75
- @hide="onHideLocationModal"
76
- @select="onSelectLocation"
77
- />
78
- </div>
79
- </template>
80
-
81
- <script setup lang="ts">
82
- import { UI_I_TablePayload } from '~/lib/models/table/interfaces'
83
- import { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
84
- import { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
85
- import { UI_I_SendDataNewNetwork } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
86
- import { UI_T_NetworkType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
87
- import {
88
- UI_I_Localization,
89
- UI_I_HTMLSelectElement,
90
- } from '~/lib/models/interfaces'
91
- import { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
92
-
93
- const props = defineProps<{
94
- index: number
95
- type: UI_T_NetworkType
96
- network: UI_I_SendDataNewNetwork
97
- networksTable: UI_I_NetworkTableItem[]
98
- errorValidationFields: UI_I_ErrorValidationField[]
99
- isEdit: boolean
100
- state?: string | number
101
- }>()
102
-
103
- const emits = defineEmits<{
104
- (event: 'send-data', value: UI_I_SendDataNewNetwork): void
105
- (event: 'invalid', value: boolean): void
106
- (event: 'remove'): void
107
- (event: 'remove-error-by-title', value: string): void
108
- (event: 'get-networks-table', value: UI_I_TablePayload): void
109
- }>()
110
-
111
- const localization = computed<UI_I_Localization>(() => useLocal())
112
-
113
- const isRunning = computed<boolean>(() => {
114
- return props.state === 2
115
- })
116
-
117
- const isRemovable = computed<boolean>(() => {
118
- return (
119
- !props.isEdit ||
120
- !isRunning.value ||
121
- (isRunning.value && adapterType.value === 'virtio')
122
- )
123
- })
124
-
125
- const label = computed<string>(() => {
126
- if (props.type === 'edit')
127
- return `${localization.value.networkAdapter} ${props.index + 1}`
128
-
129
- return `${localization.value.newNetwork} *`
130
- })
131
-
132
- const removeNetwork = (): void => {
133
- emits('remove')
134
- }
135
-
136
- const selectedLocationOld = ref<string>('')
137
- const selectedLocation = ref<string>('')
138
- const locationOptions = ref<UI_I_OptionItem[]>([])
139
-
140
- const getNetworks = (): void => {
141
- // if (props.networksTable.length) return // Из-за этого кода был баг. Открыть визард вм -> создать сеть -> открыть визард вм и в списке сетей нету новой сети
142
-
143
- const payload: UI_I_TablePayload = {
144
- pagination: {
145
- page: 1,
146
- pageSize: 100,
147
- },
148
- schema: 'full',
149
- type: 'network',
150
- sortBy: null,
151
- }
152
- emits('get-networks-table', payload)
153
- }
154
- getNetworks()
155
- watch(
156
- () => props.networksTable,
157
- (newValue) => {
158
- const isExistValue = newValue.some(
159
- (network) => network.net_bridge === selectedLocation.value
160
- )
161
- if (!newValue.length || props.type === 'edit' || isExistValue) return
162
-
163
- selectedLocationOld.value = newValue[0].net_bridge
164
- selectedLocation.value = newValue[0].net_bridge
165
-
166
- locationOptions.value = [
167
- { text: newValue[0].name, value: newValue[0].net_bridge },
168
- { text: `${localization.value.browse}...`, value: '' },
169
- ]
170
- },
171
- { immediate: true }
172
- )
173
-
174
- const locationModalIsShow = ref<boolean>(false)
175
- const onHideLocationModal = (): void => {
176
- locationModalIsShow.value = false
177
- selectedLocation.value = selectedLocationOld.value
178
- }
179
- const changeLocation = (event: UI_I_HTMLSelectElement): void => {
180
- const value = event.target.value
181
- if (value === '') {
182
- locationModalIsShow.value = true
183
- return
184
- }
185
-
186
- selectedLocationOld.value = value
187
- selectedLocation.value = value
188
- // netBridge.value = value
189
- }
190
- const onSelectLocation = (network: UI_I_NetworkTableItem): void => {
191
- locationModalIsShow.value = false
192
-
193
- selectedLocationOld.value = network.net_bridge
194
- selectedLocation.value = network.net_bridge
195
-
196
- const hasNetwork = locationOptions.value.some(
197
- (option) => option.value === network.net_bridge
198
- )
199
- if (hasNetwork) {
200
- return
201
- }
202
-
203
- locationOptions.value = [
204
- ...locationOptions.value.slice(0, -1),
205
- { text: network.name, value: network.net_bridge },
206
- locationOptions.value[locationOptions.value.length - 1],
207
- ]
208
- }
209
-
210
- const adapterType = ref<string>('rtl8139')
211
-
212
- const target = ref<string>('')
213
-
214
- const macAddress = ref<string>('')
215
- const macAddressType = ref<string>('automatic')
216
- const newNetworkInvalid = ref<boolean>(false)
217
- watch(
218
- newNetworkInvalid,
219
- (newValue) => {
220
- emits('invalid', newValue)
221
- },
222
- { immediate: true }
223
- )
224
-
225
- watch(
226
- [selectedLocation, adapterType, macAddress, macAddressType, locationOptions],
227
- () => {
228
- const option = locationOptions.value.find(
229
- (option) => option.value === selectedLocation.value
230
- )
231
- if (!option) return
232
-
233
- emits('send-data', {
234
- network: option.text,
235
- net_bridge: option.value,
236
- target: target.value,
237
- model: adapterType.value,
238
- mac: macAddress.value,
239
- boot_order: props.network.boot_order,
240
- })
241
- },
242
- { immediate: true }
243
- )
244
-
245
- // Добавляем данные для редактирования
246
- watch(
247
- () => props.network,
248
- (newValue) => {
249
- if (props.type !== 'edit') return
250
-
251
- locationOptions.value = [
252
- { text: newValue.network, value: newValue.net_bridge },
253
- { text: `${localization.value.browse}...`, value: '' },
254
- ]
255
- selectedLocation.value = newValue.net_bridge
256
-
257
- adapterType.value = newValue.model
258
- macAddress.value = newValue.mac
259
- target.value = newValue.target
260
- },
261
- { immediate: true }
262
- )
263
-
264
- watch(
265
- isRunning,
266
- (newValue) => {
267
- if (newValue && props.type === 'new') {
268
- adapterType.value = 'virtio'
269
- }
270
- },
271
- { immediate: true }
272
- )
273
-
274
- const typeError = computed<string>(
275
- () => `network_devices[${props.index}].network`
276
- )
277
-
278
- const apiError = computed<string>(() => {
279
- return (
280
- props.errorValidationFields?.find(
281
- (message) => message.field === typeError.value
282
- )?.error_message || ''
283
- )
284
- })
285
-
286
- const onRemoveValidationError = (): void => {
287
- emits('remove-error-by-title', typeError.value)
288
- }
289
- </script>
290
-
291
- <style scoped lang="scss">
292
- #network-connect {
293
- margin-right: 4px;
294
- }
295
- </style>
1
+ <template>
2
+ <div class="hardware-network">
3
+ <atoms-stack-block
4
+ :has-children="true"
5
+ :removable="isRemovable"
6
+ @remove="removeNetwork"
7
+ >
8
+ <template #stackBlockKey>
9
+ <div class="vm-wizard-toggle-block-network flex-align-center">
10
+ <span>{{ label }}</span>
11
+ <atoms-the-icon
12
+ v-show="newNetworkInvalid"
13
+ width="24px"
14
+ height="24px"
15
+ class="is-error tooltip-trigger"
16
+ name="info"
17
+ />
18
+ </div>
19
+ </template>
20
+ <template #stackBlockContent>
21
+ <div class="flex-align-center flex-space-between">
22
+ <atoms-tooltip-error
23
+ :has-error="!!apiError"
24
+ :selector="`.vm-wizard-network-field-${props.index}`"
25
+ @remove="onRemoveValidationError"
26
+ >
27
+ <template #elem>
28
+ <div class="select">
29
+ <select
30
+ :id="`vm-wizard-network-field-${props.index}`"
31
+ v-model="selectedLocation"
32
+ :data-id="`vm-wizard-network-field-${props.index}`"
33
+ :class="`vm-wizard-network-field-${props.index} input-text-color`"
34
+ :disabled="props.type === 'edit' && state !== 1"
35
+ @click.stop
36
+ @change="changeLocation"
37
+ >
38
+ <option
39
+ v-for="(item, key) in locationOptions"
40
+ :key="key"
41
+ :value="item.value"
42
+ >
43
+ {{ item.text }}
44
+ </option>
45
+ </select>
46
+ </div>
47
+ </template>
48
+ <template #content>{{ apiError }}</template>
49
+ </atoms-tooltip-error>
50
+ </div>
51
+ </template>
52
+ <template #stackChildren>
53
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-network-adapter-type
54
+ v-model:adapter-type="adapterType"
55
+ :index="props.index"
56
+ :disabled="props.type === 'edit' || isRunning"
57
+ :error-validation-fields="props.errorValidationFields"
58
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
59
+ />
60
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-network-mac-address
61
+ v-model:mac-address="macAddress"
62
+ v-model:mac-address-type="macAddressType"
63
+ :index="props.index"
64
+ :disabled="props.type === 'edit'"
65
+ :error-validation-fields="props.errorValidationFields"
66
+ @invalid="newNetworkInvalid = $event"
67
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
68
+ />
69
+ </template>
70
+ </atoms-stack-block>
71
+
72
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-network-location
73
+ :location-modal-is-show="locationModalIsShow"
74
+ :networks-table="networksTable"
75
+ @hide="onHideLocationModal"
76
+ @select="onSelectLocation"
77
+ />
78
+ </div>
79
+ </template>
80
+
81
+ <script setup lang="ts">
82
+ import { UI_T_Project } from '~/lib/models/types'
83
+ import { UI_I_TablePayload } from '~/lib/models/table/interfaces'
84
+ import { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
85
+ import { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
86
+ import { UI_I_SendDataNewNetwork } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
87
+ import { UI_T_NetworkType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
88
+ import {
89
+ UI_I_Localization,
90
+ UI_I_HTMLSelectElement,
91
+ } from '~/lib/models/interfaces'
92
+ import { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
93
+
94
+ const props = defineProps<{
95
+ index: number
96
+ type: UI_T_NetworkType
97
+ network: UI_I_SendDataNewNetwork
98
+ networksTable: UI_I_NetworkTableItem[]
99
+ errorValidationFields: UI_I_ErrorValidationField[]
100
+ isEdit: boolean
101
+ state?: string | number
102
+ project: UI_T_Project
103
+ }>()
104
+
105
+ const emits = defineEmits<{
106
+ (event: 'send-data', value: UI_I_SendDataNewNetwork): void
107
+ (event: 'invalid', value: boolean): void
108
+ (event: 'remove'): void
109
+ (event: 'remove-error-by-title', value: string): void
110
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
111
+ }>()
112
+
113
+ const localization = computed<UI_I_Localization>(() => useLocal())
114
+
115
+ const isRunning = computed<boolean>(() => {
116
+ return props.state === 2
117
+ })
118
+
119
+ const isRemovable = computed<boolean>(() => {
120
+ return (
121
+ !props.isEdit ||
122
+ !isRunning.value ||
123
+ (isRunning.value && adapterType.value === 'virtio')
124
+ )
125
+ })
126
+
127
+ const label = computed<string>(() => {
128
+ if (props.type === 'edit')
129
+ return `${localization.value.networkAdapter} ${props.index + 1}`
130
+
131
+ return `${localization.value.newNetwork} *`
132
+ })
133
+
134
+ const removeNetwork = (): void => {
135
+ emits('remove')
136
+ }
137
+
138
+ const selectedLocationOld = ref<string>('')
139
+ const selectedLocation = ref<string>('')
140
+ const locationOptions = ref<UI_I_OptionItem[]>([])
141
+
142
+ const getNetworks = (): void => {
143
+ // if (props.networksTable.length) return // Из-за этого кода был баг. Открыть визард вм -> создать сеть -> открыть визард вм и в списке сетей нету новой сети
144
+
145
+ const payload: UI_I_TablePayload = {
146
+ pagination: {
147
+ page: 1,
148
+ pageSize: 100,
149
+ },
150
+ schema: 'full',
151
+ type: 'network',
152
+ sortBy: null,
153
+ }
154
+ emits('get-networks-table', payload)
155
+ }
156
+ getNetworks()
157
+
158
+ const valueProp: 'net_bridge' | 'id' = props.project === 'procurator' ? 'net_bridge' : 'id'
159
+ watch(
160
+ () => props.networksTable,
161
+ (newValue) => {
162
+ const isExistValue = newValue.some(
163
+ (network) => network[valueProp] === selectedLocation.value
164
+ )
165
+ if (!newValue.length || props.type === 'edit' || isExistValue) return
166
+
167
+ selectedLocationOld.value = newValue[0][valueProp]
168
+ selectedLocation.value = newValue[0][valueProp]
169
+
170
+ locationOptions.value = [
171
+ { text: newValue[0].name, value: newValue[0][valueProp] },
172
+ { text: `${localization.value.browse}...`, value: '' },
173
+ ]
174
+ },
175
+ { immediate: true }
176
+ )
177
+
178
+ const locationModalIsShow = ref<boolean>(false)
179
+ const onHideLocationModal = (): void => {
180
+ locationModalIsShow.value = false
181
+ selectedLocation.value = selectedLocationOld.value
182
+ }
183
+ const changeLocation = (event: UI_I_HTMLSelectElement): void => {
184
+ const value = event.target.value
185
+ if (value === '') {
186
+ locationModalIsShow.value = true
187
+ return
188
+ }
189
+
190
+ selectedLocationOld.value = value
191
+ selectedLocation.value = value
192
+ // netBridge.value = value
193
+ }
194
+ const onSelectLocation = (network: UI_I_NetworkTableItem): void => {
195
+ locationModalIsShow.value = false
196
+
197
+ selectedLocationOld.value = network[valueProp]
198
+ selectedLocation.value = network[valueProp]
199
+
200
+ const hasNetwork = locationOptions.value.some(
201
+ (option) => option.value === network[valueProp]
202
+ )
203
+ if (hasNetwork) {
204
+ return
205
+ }
206
+
207
+ locationOptions.value = [
208
+ ...locationOptions.value.slice(0, -1),
209
+ { text: network.name, value: network[valueProp] },
210
+ locationOptions.value[locationOptions.value.length - 1],
211
+ ]
212
+ }
213
+
214
+ const adapterType = ref<string>('rtl8139')
215
+
216
+ const target = ref<string>('')
217
+
218
+ const macAddress = ref<string>('')
219
+ const macAddressType = ref<string>('automatic')
220
+ const newNetworkInvalid = ref<boolean>(false)
221
+ watch(
222
+ newNetworkInvalid,
223
+ (newValue) => {
224
+ emits('invalid', newValue)
225
+ },
226
+ { immediate: true }
227
+ )
228
+
229
+ watch(
230
+ [selectedLocation, adapterType, macAddress, macAddressType, locationOptions],
231
+ () => {
232
+ const option = locationOptions.value.find(
233
+ (option) => option.value === selectedLocation.value
234
+ )
235
+ if (!option) return
236
+
237
+ emits('send-data', {
238
+ network: option.text,
239
+ net_bridge: option.value,
240
+ target: target.value,
241
+ model: adapterType.value,
242
+ mac: macAddress.value,
243
+ boot_order: props.network.boot_order,
244
+ })
245
+ },
246
+ { immediate: true }
247
+ )
248
+
249
+ // Добавляем данные для редактирования
250
+ watch(
251
+ () => props.network,
252
+ (newValue) => {
253
+ if (props.type !== 'edit') return
254
+
255
+ locationOptions.value = [
256
+ { text: newValue.network, value: newValue[valueProp] },
257
+ { text: `${localization.value.browse}...`, value: '' },
258
+ ]
259
+ selectedLocation.value = newValue[valueProp]
260
+
261
+ adapterType.value = newValue.model
262
+ macAddress.value = newValue.mac
263
+ target.value = newValue.target
264
+ },
265
+ { immediate: true }
266
+ )
267
+
268
+ watch(
269
+ isRunning,
270
+ (newValue) => {
271
+ if (newValue && props.type === 'new') {
272
+ adapterType.value = 'virtio'
273
+ }
274
+ },
275
+ { immediate: true }
276
+ )
277
+
278
+ const typeError = computed<string>(
279
+ () => `network_devices[${props.index}].network`
280
+ )
281
+
282
+ const apiError = computed<string>(() => {
283
+ return (
284
+ props.errorValidationFields?.find(
285
+ (message) => message.field === typeError.value
286
+ )?.error_message || ''
287
+ )
288
+ })
289
+
290
+ const onRemoveValidationError = (): void => {
291
+ emits('remove-error-by-title', typeError.value)
292
+ }
293
+ </script>
294
+
295
+ <style scoped lang="scss">
296
+ #network-connect {
297
+ margin-right: 4px;
298
+ }
299
+ </style>
@@ -1,3 +1,5 @@
1
+ import { UI_I_State } from '~/lib/models/interfaces'
2
+
1
3
  export interface UI_I_ErrorValidationField<T = string> {
2
4
  error_message: string
3
5
  field: T
@@ -26,7 +28,7 @@ export interface UI_I_RequestBody {
26
28
  export interface API_UI_I_Node {
27
29
  id: string
28
30
  name: string
29
- state: number
31
+ state: number | UI_I_State
30
32
  net_bridge?: string
31
33
  console_type?: string
32
34
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bfg-common",
3
3
  "private": false,
4
- "version": "1.3.322",
4
+ "version": "1.3.324",
5
5
  "scripts": {
6
6
  "build": "nuxt build",
7
7
  "dev": "nuxt dev --port=3002",