bfg-common 1.5.755 → 1.5.757

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,448 +1,444 @@
1
- <template>
2
- <common-pages-backups-backups-new-skeleton v-if="props.backupsLoading" />
3
- <div
4
- v-else
5
- :class="[
6
- 'backups-page grid h-inherit p-4 overflow-hidden ',
7
- { 'selected gap-3': props.detailData },
8
- ]"
9
- >
10
- <div class="left-content overflow-auto grid p-4">
11
- <div class="flex justify-between gap-4 flex-wrap">
12
- <h3 class="title-block font-[500] text-[16px]">
13
- {{ localization.inventoryTabs.backups }} ({{
14
- props.backupsTree.length
15
- }})
16
- </h3>
17
- <ui-button
18
- v-if="props.typeFromRoute === 'vm'"
19
- v-permission="props.createBackupPermission"
20
- test-id="take-backup-btn"
21
- size="md"
22
- class="create-backup-button"
23
- @click="emits('set-action', 'createBackup')"
24
- >
25
- <ui-icon name="plus" width="20" height="20" class="mr-2 icon" />
26
- {{ localization.common.createBackup }}
27
- </ui-button>
28
- </div>
29
- <div
30
- v-if="props.backupsTree.length"
31
- class="backups-tree-content overflow-y-auto my-4 px-2 pb-2"
32
- >
33
- <ui-tree
34
- :nodes="props.backupsTree"
35
- @select-node="emits('select-node', $event)"
36
- @toggle-node="emits('show-nodes', $event.id)"
37
- @show-context-menu="showContextMenu"
38
- >
39
- <template #content="{ node }">
40
- <div class="flex-align-center gap-2">
41
- <span :class="['node-icon', node.iconClassName]"></span>
42
- <span class="node-name text-ellipsis text-3">{{
43
- node.name
44
- }}</span>
45
- </div>
46
- </template>
47
- </ui-tree>
48
- </div>
49
- <div v-else class="empty-block grid justify-items-center content-center">
50
- <ui-icon
51
- name="not-found-magnifier"
52
- width="28"
53
- height="28"
54
- color="#9da6ad"
55
- />
56
- <p class="title-block font-[400] text-[16px] mt-2">
57
- {{ localization.common.noBackupsAvailable }}
58
- </p>
59
- <p class="description-block mt-[6px] text-[13px] text-center">
60
- {{ localization.common.noBackupsAvailableDesc }}
61
- </p>
62
- </div>
63
- <ui-button
64
- v-permission="props.deleteAllPermission"
65
- :disabled="!props.backupsTree.length"
66
- :class="[
67
- 'delete-all w-max ml-auto',
68
- { disabled: !props.backupsTree.length },
69
- ]"
70
- test-id="delete-all-backups-btn"
71
- size="md"
72
- variant="text"
73
- is-without-sizes
74
- is-without-height
75
- @click="emits('set-action', 'deleteBackupAll')"
76
- >
77
- <ui-icon name="delete" width="20" height="20" class="mr-2" />
78
- {{ localization.common.deleteAll }}
79
- </ui-button>
80
- </div>
81
- <div
82
- v-if="props.detailData"
83
- class="backups-details overflow-hidden flex-direction-column p-4"
84
- >
85
- <div class="flex justify-between mb-6 gap-4 pr-4 flex-wrap">
86
- <h3 class="title-block font-[500] text-[16px]">
87
- {{ localization.common.backupDetails }}
88
- </h3>
89
- <div class="details-actions-block flex column-gap-4">
90
- <ui-tooltip
91
- id="restore-backups-btn"
92
- test-id="restore-backups-btn-tooltip"
93
- size="md"
94
- position="bottom"
95
- position-by-tooltip="center"
96
- show-type="variant-1"
97
- >
98
- <template #target>
99
- <div id="restore-backups-btn" class="popped tooltip">
100
- <ui-button
101
- v-permission="props.restoreBackupPermission"
102
- test-id="restore-backups-btn"
103
- size="md"
104
- variant="text"
105
- class="restore-backups-btn"
106
- is-without-sizes
107
- is-without-height
108
- @click="emits('set-action', 'restoreBackup')"
109
- >
110
- <ui-icon name="update" width="20" height="20" />
111
- </ui-button>
112
- </div>
113
- </template>
114
- <template #content>
115
- {{ localization.common.restore }}
116
- </template>
117
- </ui-tooltip>
118
- <div class="border-line"></div>
119
- <ui-tooltip
120
- id="delete-backups-btn"
121
- test-id="delete-backups-btn-tooltip"
122
- size="md"
123
- position="bottom"
124
- position-by-tooltip="center"
125
- show-type="variant-1"
126
- >
127
- <template #target>
128
- <div id="delete-backups-btn" class="popped tooltip">
129
- <ui-button
130
- v-permission="props.deleteBackupPermission"
131
- test-id="delete-backups-btn"
132
- size="md"
133
- variant="text"
134
- class="delete-backups-btn"
135
- is-without-sizes
136
- is-without-height
137
- @click="emits('set-action', 'deleteBackup')"
138
- >
139
- <ui-icon name="delete" width="20" height="20" />
140
- </ui-button>
141
- </div>
142
- </template>
143
- <template #content>
144
- {{ localization.common.delete }}
145
- </template>
146
- </ui-tooltip>
147
- </div>
148
- </div>
149
- <div
150
- ref="detailsScrollBlock"
151
- :class="[
152
- 'grid row-gap-3 pr-4 overflow-y-auto details-scroll-block',
153
- { 'has-scroll': hasScroll },
154
- ]"
155
- >
156
- <ui-info-block
157
- v-for="(item, index) in currentDetailsData"
158
- :key="index"
159
- :data="item"
160
- >
161
- <template v-if="item.labelIcon" #labelBlock>
162
- <div class="info-block-label-content flex items-start">
163
- <ui-icon
164
- v-if="item.labelIcon"
165
- :name="item.labelIcon"
166
- :class="[
167
- 'info-label-icon mr-[10px]',
168
- `icon-name-${item.labelIcon}`,
169
- ]"
170
- width="20"
171
- height="20"
172
- />
173
- <span class="info-label">{{ item.label }}</span>
174
- </div>
175
- </template>
176
- <template #valueBlock>
177
- <span
178
- v-if="item.value === 'empty-description'"
179
- class="empty-description"
180
- >
181
- {{ localization.common.backupHasNoDescriptionYet }}
182
- </span>
183
- </template>
184
- </ui-info-block>
185
- </div>
186
- </div>
187
- </div>
188
-
189
- <common-pages-backups-backups-new-context-menu-view
190
- :show="contextMenuShow"
191
- :context-data="contextMenu"
192
- :restore-backup-permission="props.restoreBackupPermission"
193
- :delete-backup-permission="props.deleteBackupPermission"
194
- @select-action="onSelectContextMenuItem"
195
- />
196
- </template>
197
-
198
- <script setup lang="ts">
199
- import { useElementSize } from '@vueuse/core'
200
- import type { UI_I_InfoBlock } from '~/node_modules/bfg-uikit/components/ui/infoBlock/models/interfaces'
201
- import type { UI_I_Localization } from '~/lib/models/interfaces'
202
- import type { UI_I_BackupsTreeNode } from '~/components/common/pages/backups/lib/models/interfaces'
203
- import type {
204
- UI_T_TargetType,
205
- UI_T_BackupActionType,
206
- } from '~/components/common/pages/backups/lib/models/types'
207
- import * as utils from '~/components/common/pages/backups/backupsNew/lib/utils/contextMenu'
208
- import { constructDetails } from '~/components/common/pages/backups/backupsNew/lib/utils/details'
209
-
210
- const props = defineProps<{
211
- backupsTree: UI_I_BackupsTreeNode[]
212
- backupsLoading: boolean
213
- typeFromRoute: UI_T_TargetType
214
- detailData: UI_I_BackupsTreeNode | null
215
- createBackupPermission: string
216
- restoreBackupPermission: string
217
- deleteBackupPermission: string
218
- deleteAllPermission: string
219
- }>()
220
-
221
- const emits = defineEmits<{
222
- (event: 'show-nodes', value: string | number): void
223
- (event: 'set-action', value: UI_T_BackupActionType): void
224
- (event: 'select-node', value: UI_I_BackupsTreeNode): void
225
- }>()
226
-
227
- const localization = computed<UI_I_Localization>(() => useLocal())
228
-
229
- const { showContextMenu, contextMenuShow, contextMenu } = utils.getContextMenu()
230
-
231
- const onSelectContextMenuItem = (actionType: UI_T_BackupActionType): void => {
232
- emits('set-action', actionType)
233
- }
234
-
235
- const currentDetailsData = computed<UI_I_InfoBlock[]>(() =>
236
- constructDetails(localization.value, props.detailData)
237
- )
238
-
239
- const detailsScrollBlock = ref<HTMLElement | null>(null)
240
- const { height } = useElementSize(detailsScrollBlock)
241
- const hasScroll = ref<boolean>(false)
242
- const checkScroll = (): void => {
243
- const element = detailsScrollBlock.value
244
- if (element) {
245
- hasScroll.value = element.scrollHeight > element.clientHeight
246
- }
247
- }
248
-
249
- watch(height, () => {
250
- checkScroll()
251
- })
252
- </script>
253
-
254
- <style>
255
- :root {
256
- --backups-page-inner-block-bg: #ffffff;
257
- --backups-page-title-color: #4d5d69;
258
- --backups-page-tree-border-color: #e9ebed;
259
- --backups-page-tree-block-bg-color: #ffffff;
260
- --backups-page-details-action-color: #4d5d69;
261
- --backups-page-details-action-line-color: #e9ebeda3;
262
- --backups-page-details-action-hover-color: #213444;
263
- --backups-page-info-block-label-color: #4d5d69;
264
- --backups-page-info-block-value-color: #182531;
265
- }
266
- :root.dark-theme {
267
- --backups-page-inner-block-bg: #334453;
268
- --backups-page-title-color: #e9eaec;
269
- --backups-page-tree-border-color: #e9ebed1f;
270
- --backups-page-tree-block-bg-color: #1b2a371f;
271
- --backups-page-details-action-color: #e9eaec;
272
- --backups-page-details-action-line-color: #e9ebed1f;
273
- --backups-page-details-action-hover-color: #ffffff;
274
- --backups-page-info-block-label-color: #e9eaec;
275
- --backups-page-info-block-value-color: #e9eaec;
276
- }
277
- </style>
278
-
279
- <style scoped lang="scss">
280
- .backups-page {
281
- &.selected {
282
- grid-template-columns: repeat(2, calc(50% - 6px));
283
- }
284
-
285
- .title-block {
286
- color: var(--backups-page-title-color);
287
- }
288
- .create-backup-button {
289
- white-space: nowrap;
290
-
291
- .icon {
292
- min-width: 20px;
293
- }
294
- }
295
-
296
- .left-content {
297
- background-color: var(--backups-page-inner-block-bg);
298
- box-shadow: 0 1px 4px 0 #00000014;
299
- border-radius: 8px;
300
- grid-template-rows: max-content 1fr max-content;
301
-
302
- .backups-tree-content {
303
- border: 1px solid var(--backups-page-tree-border-color);
304
- border-radius: 8px;
305
- background-color: var(--backups-page-tree-block-bg-color);
306
-
307
- :deep(.tree-container) {
308
- width: max-content;
309
- min-width: 100%;
310
-
311
- .tree-content {
312
- //padding-right: 8px;
313
-
314
- .node-wrapper {
315
- border-radius: 4px;
316
-
317
- .toggle-button-empty {
318
- display: none;
319
- }
320
- .node-element {
321
- line-height: 20px;
322
- }
323
- }
324
- }
325
- }
326
- }
327
-
328
- .empty-block {
329
- .description-block {
330
- color: #9da6ad;
331
- }
332
- }
333
- .delete-all {
334
- &.disabled {
335
- color: #bdc3c7;
336
- }
337
-
338
- &:not(.disabled) {
339
- color: #ea3223;
340
- }
341
- }
342
- }
343
- .backups-details {
344
- background-color: var(--backups-page-inner-block-bg);
345
- box-shadow: 0 1px 4px 0 #00000014;
346
- border-radius: 8px;
347
- padding-right: 0;
348
-
349
- .details-actions-block {
350
- .border-line {
351
- width: 1px;
352
- height: 20px;
353
- background-color: var(--backups-page-details-action-line-color);
354
- }
355
- .restore-backups-btn {
356
- :deep(path) {
357
- stroke-width: 1.7;
358
- }
359
- }
360
- .restore-backups-btn,
361
- .edit-backups-btn {
362
- color: var(--backups-page-details-action-color);
363
-
364
- &:hover {
365
- color: var(--backups-page-details-action-hover-color);
366
- }
367
- }
368
- .delete-backups-btn {
369
- color: #ea3223;
370
- }
371
- }
372
- .details-scroll-block {
373
- padding-right: 0;
374
-
375
- &:not(.has-scroll) {
376
- padding-right: 16px;
377
- }
378
- }
379
- .info-block-label-content {
380
- .info-label-icon {
381
- color: #9da6ad;
382
- min-width: 20px;
383
-
384
- &.icon-name-vsphere-icon-storage-system-refresh {
385
- :deep(path) {
386
- stroke-width: 1.4;
387
- }
388
- }
389
- }
390
- .info-label {
391
- margin-top: 1px;
392
- line-height: 18px;
393
- color: var(--backups-page-info-block-label-color);
394
- }
395
- }
396
- .empty-description {
397
- color: #9da6ad;
398
- margin-top: 1px;
399
- line-height: 18px;
400
- text-align: right;
401
- }
402
- :deep(.ui-main-info-block-item) {
403
- grid-column-gap: 10px;
404
- }
405
- :deep(.ui-main-info-block-item-right) {
406
- white-space: unset !important;
407
- max-width: 50%;
408
- }
409
- :deep(.ui-main-info-block-item-right-value-parent) {
410
- white-space: unset !important;
411
- }
412
- :deep(.ui-main-info-block-item-right-value) {
413
- color: var(--backups-page-info-block-value-color);
414
- font-size: 13px;
415
- font-weight: 400;
416
- line-height: 18px;
417
- margin-top: 1px;
418
- }
419
- :deep(.ui-main-info-block-item-right-open) {
420
- display: none;
421
- }
422
- }
423
- }
424
- :root.dark-theme {
425
- .left-content {
426
- .delete-all {
427
- &.disabled {
428
- opacity: 0.44;
429
- }
430
- }
431
- }
432
- }
433
-
434
- @media (max-width: 1200px) {
435
- .backups-page {
436
- overflow-y: auto;
437
-
438
- &.selected {
439
- grid-template-columns: 1fr;
440
- grid-template-rows: minmax(189px, 1fr) 1fr;
441
- }
442
-
443
- .backups-details {
444
- height: max-content;
445
- }
446
- }
447
- }
448
- </style>
1
+ <template>
2
+ <common-pages-backups-backups-new-skeleton v-if="props.backupsLoading" />
3
+ <div
4
+ v-else
5
+ :class="[
6
+ 'backups-page grid h-inherit p-4 overflow-hidden ',
7
+ { 'selected gap-3': props.detailData },
8
+ ]"
9
+ >
10
+ <div class="left-content overflow-auto grid p-4">
11
+ <div class="flex justify-between gap-4 flex-wrap">
12
+ <h3 class="title-block font-[500] text-[16px]">
13
+ {{ localization.inventoryTabs.backups }} ({{
14
+ props.backupsTree.length
15
+ }})
16
+ </h3>
17
+ <ui-button
18
+ v-if="props.typeFromRoute === 'vm'"
19
+ v-permission="props.createBackupPermission"
20
+ test-id="take-backup-btn"
21
+ size="md"
22
+ class="create-backup-button"
23
+ @click="emits('set-action', 'createBackup')"
24
+ >
25
+ <ui-icon name="plus" width="20" height="20" class="mr-2 icon" />
26
+ {{ localization.common.createBackup }}
27
+ </ui-button>
28
+ </div>
29
+ <div
30
+ v-if="props.backupsTree.length"
31
+ class="backups-tree-content overflow-y-auto my-4 px-2 pb-2"
32
+ >
33
+ <ui-tree
34
+ :nodes="props.backupsTree"
35
+ @select-node="emits('select-node', $event)"
36
+ @toggle-node="emits('show-nodes', $event.id)"
37
+ @show-context-menu="showContextMenu"
38
+ >
39
+ <template #content="{ node }">
40
+ <div class="flex-align-center gap-2">
41
+ <span :class="['node-icon', node.iconClassName]"></span>
42
+ <span class="node-name text-ellipsis text-3">{{
43
+ node.name
44
+ }}</span>
45
+ </div>
46
+ </template>
47
+ </ui-tree>
48
+ </div>
49
+ <div v-else class="empty-block grid justify-items-center content-center">
50
+ <ui-icon
51
+ name="not-found-magnifier"
52
+ width="28"
53
+ height="28"
54
+ color="#9da6ad"
55
+ />
56
+ <p class="title-block font-[400] text-[16px] mt-2">
57
+ {{ localization.common.noBackupsAvailable }}
58
+ </p>
59
+ <p class="description-block mt-[6px] text-[13px] text-center">
60
+ {{ localization.common.noBackupsAvailableDesc }}
61
+ </p>
62
+ </div>
63
+ <ui-button
64
+ v-permission="props.deleteAllPermission"
65
+ :disabled="!props.backupsTree.length"
66
+ :class="[
67
+ 'delete-all w-max ml-auto',
68
+ { disabled: !props.backupsTree.length },
69
+ ]"
70
+ test-id="delete-all-backups-btn"
71
+ size="md"
72
+ variant="text"
73
+ is-without-sizes
74
+ is-without-height
75
+ @click="emits('set-action', 'deleteBackupAll')"
76
+ >
77
+ <ui-icon name="delete" width="20" height="20" class="mr-2" />
78
+ {{ localization.common.deleteAll }}
79
+ </ui-button>
80
+ </div>
81
+ <div
82
+ v-if="props.detailData"
83
+ class="backups-details overflow-hidden flex-direction-column p-4"
84
+ >
85
+ <div class="flex justify-between mb-6 gap-4 pr-4 flex-wrap">
86
+ <h3 class="title-block font-[500] text-[16px]">
87
+ {{ localization.common.backupDetails }}
88
+ </h3>
89
+ <div class="details-actions-block flex column-gap-4">
90
+ <ui-tooltip
91
+ id="restore-backups-btn"
92
+ test-id="restore-backups-btn-tooltip"
93
+ size="md"
94
+ position="bottom"
95
+ position-by-tooltip="center"
96
+ show-type="variant-1"
97
+ >
98
+ <template #target>
99
+ <div id="restore-backups-btn" class="popped tooltip">
100
+ <ui-button
101
+ v-permission="props.restoreBackupPermission"
102
+ test-id="restore-backups-btn"
103
+ size="md"
104
+ variant="text"
105
+ class="restore-backups-btn"
106
+ is-without-sizes
107
+ is-without-height
108
+ @click="emits('set-action', 'restoreBackup')"
109
+ >
110
+ <ui-icon name="update" width="20" height="20" />
111
+ </ui-button>
112
+ </div>
113
+ </template>
114
+ <template #content>
115
+ {{ localization.common.restore }}
116
+ </template>
117
+ </ui-tooltip>
118
+ <div class="border-line"></div>
119
+ <ui-tooltip
120
+ id="delete-backups-btn"
121
+ test-id="delete-backups-btn-tooltip"
122
+ size="md"
123
+ position="bottom"
124
+ position-by-tooltip="center"
125
+ show-type="variant-1"
126
+ >
127
+ <template #target>
128
+ <div id="delete-backups-btn" class="popped tooltip">
129
+ <ui-button
130
+ v-permission="props.deleteBackupPermission"
131
+ test-id="delete-backups-btn"
132
+ size="md"
133
+ variant="text"
134
+ class="delete-backups-btn"
135
+ is-without-sizes
136
+ is-without-height
137
+ @click="emits('set-action', 'deleteBackup')"
138
+ >
139
+ <ui-icon name="delete" width="20" height="20" />
140
+ </ui-button>
141
+ </div>
142
+ </template>
143
+ <template #content>
144
+ {{ localization.common.delete }}
145
+ </template>
146
+ </ui-tooltip>
147
+ </div>
148
+ </div>
149
+ <div
150
+ ref="detailsScrollBlock"
151
+ :class="[
152
+ 'grid row-gap-3 pr-4 overflow-y-auto details-scroll-block',
153
+ { 'has-scroll': hasScroll },
154
+ ]"
155
+ >
156
+ <ui-info-block
157
+ v-for="(item, index) in currentDetailsData"
158
+ :key="index"
159
+ :data="item"
160
+ >
161
+ <template v-if="item.labelIcon" #labelBlock>
162
+ <div class="info-block-label-content flex items-start">
163
+ <ui-icon
164
+ v-if="item.labelIcon"
165
+ :name="item.labelIcon"
166
+ :class="[
167
+ 'info-label-icon mr-[10px]',
168
+ `icon-name-${item.labelIcon}`,
169
+ ]"
170
+ width="20"
171
+ height="20"
172
+ />
173
+ <span class="info-label">{{ item.label }}</span>
174
+ </div>
175
+ </template>
176
+ <template #valueBlock>
177
+ <span
178
+ v-if="item.value === 'empty-description'"
179
+ class="empty-description"
180
+ >
181
+ {{ localization.common.backupHasNoDescriptionYet }}
182
+ </span>
183
+ </template>
184
+ </ui-info-block>
185
+ </div>
186
+ </div>
187
+ </div>
188
+
189
+ <common-pages-backups-backups-new-context-menu-view
190
+ :show="contextMenuShow"
191
+ :context-data="contextMenu"
192
+ :restore-backup-permission="props.restoreBackupPermission"
193
+ :delete-backup-permission="props.deleteBackupPermission"
194
+ @select-action="onSelectContextMenuItem"
195
+ />
196
+ </template>
197
+
198
+ <script setup lang="ts">
199
+ import { useTemplateRef } from 'vue'
200
+ import { useElementSize } from '@vueuse/core'
201
+ import type { UI_I_InfoBlock } from '~/node_modules/bfg-uikit/components/ui/infoBlock/models/interfaces'
202
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
203
+ import type { UI_I_BackupsTreeNode } from '~/components/common/pages/backups/lib/models/interfaces'
204
+ import type {
205
+ UI_T_TargetType,
206
+ UI_T_BackupActionType,
207
+ } from '~/components/common/pages/backups/lib/models/types'
208
+ import * as utils from '~/components/common/pages/backups/backupsNew/lib/utils/contextMenu'
209
+ import { constructDetails } from '~/components/common/pages/backups/backupsNew/lib/utils/details'
210
+
211
+ const props = defineProps<{
212
+ backupsTree: UI_I_BackupsTreeNode[]
213
+ backupsLoading: boolean
214
+ typeFromRoute: UI_T_TargetType
215
+ detailData: UI_I_BackupsTreeNode | null
216
+ createBackupPermission: string
217
+ restoreBackupPermission: string
218
+ deleteBackupPermission: string
219
+ deleteAllPermission: string
220
+ }>()
221
+
222
+ const emits = defineEmits<{
223
+ (event: 'show-nodes', value: string | number): void
224
+ (event: 'set-action', value: UI_T_BackupActionType): void
225
+ (event: 'select-node', value: UI_I_BackupsTreeNode): void
226
+ }>()
227
+
228
+ const localization = computed<UI_I_Localization>(() => useLocal())
229
+
230
+ const { showContextMenu, contextMenuShow, contextMenu } = utils.getContextMenu()
231
+
232
+ const onSelectContextMenuItem = (actionType: UI_T_BackupActionType): void => {
233
+ emits('set-action', actionType)
234
+ }
235
+
236
+ const currentDetailsData = computed<UI_I_InfoBlock[]>(() =>
237
+ constructDetails(localization.value, props.detailData)
238
+ )
239
+
240
+ const detailsElement = useTemplateRef<HTMLDivElement>('detailsScrollBlock')
241
+ const { height } = useElementSize(detailsElement)
242
+
243
+ const hasScroll = computed<boolean>(
244
+ () =>
245
+ height.value &&
246
+ detailsElement.value?.scrollHeight > detailsElement.value?.clientHeight
247
+ )
248
+ </script>
249
+
250
+ <style>
251
+ :root {
252
+ --backups-page-inner-block-bg: #ffffff;
253
+ --backups-page-title-color: #4d5d69;
254
+ --backups-page-tree-border-color: #e9ebed;
255
+ --backups-page-tree-block-bg-color: #ffffff;
256
+ --backups-page-details-action-color: #4d5d69;
257
+ --backups-page-details-action-line-color: #e9ebeda3;
258
+ --backups-page-details-action-hover-color: #213444;
259
+ --backups-page-info-block-label-color: #4d5d69;
260
+ --backups-page-info-block-value-color: #182531;
261
+ }
262
+ :root.dark-theme {
263
+ --backups-page-inner-block-bg: #334453;
264
+ --backups-page-title-color: #e9eaec;
265
+ --backups-page-tree-border-color: #e9ebed1f;
266
+ --backups-page-tree-block-bg-color: #1b2a371f;
267
+ --backups-page-details-action-color: #e9eaec;
268
+ --backups-page-details-action-line-color: #e9ebed1f;
269
+ --backups-page-details-action-hover-color: #ffffff;
270
+ --backups-page-info-block-label-color: #e9eaec;
271
+ --backups-page-info-block-value-color: #e9eaec;
272
+ }
273
+ </style>
274
+
275
+ <style scoped lang="scss">
276
+ .backups-page {
277
+ &.selected {
278
+ grid-template-columns: repeat(2, calc(50% - 6px));
279
+ }
280
+
281
+ .title-block {
282
+ color: var(--backups-page-title-color);
283
+ }
284
+ .create-backup-button {
285
+ white-space: nowrap;
286
+
287
+ .icon {
288
+ min-width: 20px;
289
+ }
290
+ }
291
+
292
+ .left-content {
293
+ background-color: var(--backups-page-inner-block-bg);
294
+ box-shadow: 0 1px 4px 0 #00000014;
295
+ border-radius: 8px;
296
+ grid-template-rows: max-content 1fr max-content;
297
+
298
+ .backups-tree-content {
299
+ border: 1px solid var(--backups-page-tree-border-color);
300
+ border-radius: 8px;
301
+ background-color: var(--backups-page-tree-block-bg-color);
302
+
303
+ :deep(.tree-container) {
304
+ width: max-content;
305
+ min-width: 100%;
306
+
307
+ .tree-content {
308
+ //padding-right: 8px;
309
+
310
+ .node-wrapper {
311
+ border-radius: 4px;
312
+
313
+ .toggle-button-empty {
314
+ display: none;
315
+ }
316
+ .node-element {
317
+ line-height: 20px;
318
+ }
319
+ }
320
+ }
321
+ }
322
+ }
323
+
324
+ .empty-block {
325
+ .description-block {
326
+ color: #9da6ad;
327
+ }
328
+ }
329
+ .delete-all {
330
+ &.disabled {
331
+ color: #bdc3c7;
332
+ }
333
+
334
+ &:not(.disabled) {
335
+ color: #ea3223;
336
+ }
337
+ }
338
+ }
339
+ .backups-details {
340
+ background-color: var(--backups-page-inner-block-bg);
341
+ box-shadow: 0 1px 4px 0 #00000014;
342
+ border-radius: 8px;
343
+ padding-right: 0;
344
+
345
+ .details-actions-block {
346
+ .border-line {
347
+ width: 1px;
348
+ height: 20px;
349
+ background-color: var(--backups-page-details-action-line-color);
350
+ }
351
+ .restore-backups-btn {
352
+ :deep(path) {
353
+ stroke-width: 1.7;
354
+ }
355
+ }
356
+ .restore-backups-btn,
357
+ .edit-backups-btn {
358
+ color: var(--backups-page-details-action-color);
359
+
360
+ &:hover {
361
+ color: var(--backups-page-details-action-hover-color);
362
+ }
363
+ }
364
+ .delete-backups-btn {
365
+ color: #ea3223;
366
+ }
367
+ }
368
+ .details-scroll-block {
369
+ padding-right: 0;
370
+
371
+ &:not(.has-scroll) {
372
+ padding-right: 16px;
373
+ }
374
+ }
375
+ .info-block-label-content {
376
+ .info-label-icon {
377
+ color: #9da6ad;
378
+ min-width: 20px;
379
+
380
+ &.icon-name-vsphere-icon-storage-system-refresh {
381
+ :deep(path) {
382
+ stroke-width: 1.4;
383
+ }
384
+ }
385
+ }
386
+ .info-label {
387
+ margin-top: 1px;
388
+ line-height: 18px;
389
+ color: var(--backups-page-info-block-label-color);
390
+ }
391
+ }
392
+ .empty-description {
393
+ color: #9da6ad;
394
+ margin-top: 1px;
395
+ line-height: 18px;
396
+ text-align: right;
397
+ }
398
+ :deep(.ui-main-info-block-item) {
399
+ grid-column-gap: 10px;
400
+ }
401
+ :deep(.ui-main-info-block-item-right) {
402
+ white-space: unset !important;
403
+ max-width: 50%;
404
+ }
405
+ :deep(.ui-main-info-block-item-right-value-parent) {
406
+ white-space: unset !important;
407
+ }
408
+ :deep(.ui-main-info-block-item-right-value) {
409
+ color: var(--backups-page-info-block-value-color);
410
+ font-size: 13px;
411
+ font-weight: 400;
412
+ line-height: 18px;
413
+ margin-top: 1px;
414
+ }
415
+ :deep(.ui-main-info-block-item-right-open) {
416
+ display: none;
417
+ }
418
+ }
419
+ }
420
+ :root.dark-theme {
421
+ .left-content {
422
+ .delete-all {
423
+ &.disabled {
424
+ opacity: 0.44;
425
+ }
426
+ }
427
+ }
428
+ }
429
+
430
+ @media (max-width: 1200px) {
431
+ .backups-page {
432
+ overflow-y: auto;
433
+
434
+ &.selected {
435
+ grid-template-columns: 1fr;
436
+ grid-template-rows: minmax(189px, 1fr) 1fr;
437
+ }
438
+
439
+ .backups-details {
440
+ height: max-content;
441
+ }
442
+ }
443
+ }
444
+ </style>