bfg-common 1.6.78 → 1.6.80
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.
- package/assets/localization/local_be.json +21 -7
- package/assets/localization/local_en.json +21 -7
- package/assets/localization/local_hy.json +21 -7
- package/assets/localization/local_kk.json +21 -7
- package/assets/localization/local_ru.json +21 -7
- package/assets/localization/local_zh.json +21 -7
- package/components/common/adapterManager/AdapterManagerNew.vue +1 -0
- package/components/common/certificate/Certificate.vue +16 -6
- package/components/common/certificate/Info/Info.vue +61 -0
- package/components/common/certificate/{CertificateInfo.vue → Info/Old.vue} +6 -34
- package/components/common/certificate/Info/new/New.vue +285 -0
- package/components/common/certificate/Info/new/lib/config/index.ts +59 -0
- package/components/common/certificate/Info/new/lib/models/interfaces.ts +3 -0
- package/components/common/certificate/Info/new/lib/utils/index.ts +10 -0
- package/components/common/certificate/Old.vue +27 -0
- package/components/common/certificate/new/New.vue +30 -0
- package/components/common/certificate/new/Skeleton.vue +155 -0
- package/components/common/certificate/tools/New.vue +48 -0
- package/components/common/certificate/tools/Old.vue +39 -0
- package/components/common/certificate/{Tools.vue → tools/Tools.vue} +18 -23
- package/components/common/certificate/tools/lib/config/tabsPannel.ts +20 -0
- package/components/common/configure/physicalAdapters/tableView/lib/config/settings.ts +29 -29
- package/components/common/diagramMain/modals/Modals.vue +479 -483
- package/components/common/diagramMain/modals/lib/config/adapterModal.ts +147 -147
- package/components/common/diagramMain/modals/lib/config/networkModal.ts +405 -405
- package/components/common/diagramMain/modals/lib/config/portModal.ts +253 -253
- package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
- package/components/common/diagramMain/modals/managePhysicalAdapters/ManagePhysicalAdapters.vue +164 -0
- package/components/common/diagramMain/modals/managePhysicalAdapters/ManagePhysicalAdaptersNew.vue +306 -0
- package/components/common/diagramMain/modals/{ManagePhysicalAdaptersModal.vue → managePhysicalAdapters/ManagePhysicalAdaptersOld.vue} +245 -331
- package/components/common/diagramMain/modals/remove/RemoveModalNew.vue +157 -106
- package/components/common/diagramMain/modals/viewSettings/viewSettingsModal/ViewSettingsModalNew.vue +58 -50
- package/package.json +2 -2
- package/components/common/certificate/lib/config/tabsPannel.ts +0 -22
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="certificate-info-page p-4 h-full">
|
|
3
|
+
<div class="certificate-info-item-box p-4">
|
|
4
|
+
<div class="flex justify-between items-center flex-wrap gap-4">
|
|
5
|
+
<div class="flex items-center gap-3">
|
|
6
|
+
<ui-icon
|
|
7
|
+
v-if="statusIconName"
|
|
8
|
+
:name="statusIconName"
|
|
9
|
+
width="38"
|
|
10
|
+
height="38"
|
|
11
|
+
/>
|
|
12
|
+
<div>
|
|
13
|
+
<p class="status-text mb-1">
|
|
14
|
+
{{ localization.common.status }}: {{ statusText }}
|
|
15
|
+
</p>
|
|
16
|
+
<p class="status-subtext">
|
|
17
|
+
{{ currentExpirationText }}
|
|
18
|
+
</p>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="elapsed-block">
|
|
22
|
+
<div class="flex justify-between items-center gap-2 mb-[10px]">
|
|
23
|
+
<p class="elapsed-text">
|
|
24
|
+
{{ localization.inventoryConfigure.elapsed }}
|
|
25
|
+
</p>
|
|
26
|
+
<p class="elapsed-value">{{ currentElapsedValue }}%</p>
|
|
27
|
+
</div>
|
|
28
|
+
<ui-progress-bar-linear
|
|
29
|
+
:percent="currentElapsedValue"
|
|
30
|
+
:color="elapsedProgressBarColor"
|
|
31
|
+
stroke-width="10"
|
|
32
|
+
border-radius="16"
|
|
33
|
+
/>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="grid cols-2 mt-3 gap-3">
|
|
38
|
+
<div class="certificate-info-item-box p-4">
|
|
39
|
+
<div class="flex items-center gap-3">
|
|
40
|
+
<div class="icon-box">
|
|
41
|
+
<ui-icon name="file" width="20" height="20" />
|
|
42
|
+
</div>
|
|
43
|
+
<p class="title-info-block">{{ localization.common.subject }}</p>
|
|
44
|
+
</div>
|
|
45
|
+
<div class="grid gap-3 mt-4">
|
|
46
|
+
<div
|
|
47
|
+
v-for="(item, key) in subjectInfoItem"
|
|
48
|
+
:key="key"
|
|
49
|
+
class="flex justify-between items-center flex-wrap gap-2"
|
|
50
|
+
>
|
|
51
|
+
<p class="info-label">{{ localization.inventoryConfigure[key] }}</p>
|
|
52
|
+
<p class="info-value">{{ item }}</p>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<div class="certificate-info-item-box p-4">
|
|
57
|
+
<div class="flex items-center gap-3">
|
|
58
|
+
<div class="icon-box">
|
|
59
|
+
<ui-icon name="permission" width="20" height="20" />
|
|
60
|
+
</div>
|
|
61
|
+
<p class="title-info-block">{{ localization.common.issuer }}</p>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="grid gap-3 mt-4">
|
|
64
|
+
<div
|
|
65
|
+
v-for="(item, key) in issuerInfoItem"
|
|
66
|
+
:key="key"
|
|
67
|
+
class="flex justify-between items-center flex-wrap gap-2"
|
|
68
|
+
>
|
|
69
|
+
<p class="info-label">{{ localization.inventoryConfigure[key] }}</p>
|
|
70
|
+
<p class="info-value">{{ item }}</p>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
<p class="valid-period-title mt-5 mb-4">
|
|
76
|
+
{{ localization.inventoryConfigure.validPeriod }}
|
|
77
|
+
</p>
|
|
78
|
+
<div class="certificate-info-item-box p-4">
|
|
79
|
+
<p class="active-dates-title mb-4">
|
|
80
|
+
{{ localization.inventoryConfigure.certificateActiveDates }}
|
|
81
|
+
</p>
|
|
82
|
+
<div class="grid-container-dates grid cols-2">
|
|
83
|
+
<div class="flex items-center gap-3">
|
|
84
|
+
<div class="icon-box">
|
|
85
|
+
<ui-icon name="icon-events" width="20" height="20" />
|
|
86
|
+
</div>
|
|
87
|
+
<div>
|
|
88
|
+
<p class="date-title-info mb-1">
|
|
89
|
+
{{ localization.common.validFrom }}
|
|
90
|
+
</p>
|
|
91
|
+
<p class="date-value-info">{{ props.validFrom }}</p>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
<div class="flex items-center gap-3">
|
|
95
|
+
<div class="icon-box">
|
|
96
|
+
<ui-icon name="icon-events" width="20" height="20" />
|
|
97
|
+
</div>
|
|
98
|
+
<div>
|
|
99
|
+
<p class="date-title-info mb-1">
|
|
100
|
+
{{ localization.common.validTo }}
|
|
101
|
+
</p>
|
|
102
|
+
<p class="date-value-info">{{ props.validTo }}</p>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</template>
|
|
109
|
+
|
|
110
|
+
<script lang="ts" setup>
|
|
111
|
+
import type { UI_I_Localization } from '~/lib/models/interfaces'
|
|
112
|
+
import type { UI_I_Certificate } from '~/components/common/certificate/lib/models/interfaces'
|
|
113
|
+
import type { UI_I_CertificateInfoItem } from '~/components/common/certificate/Info/new/lib/models/interfaces'
|
|
114
|
+
import {
|
|
115
|
+
statusIconNameFunc,
|
|
116
|
+
statusTextFunc,
|
|
117
|
+
expirationTextFunc,
|
|
118
|
+
expirationDaysFunc,
|
|
119
|
+
elapsedValueFunc,
|
|
120
|
+
elapsedProgressBarColorFunc,
|
|
121
|
+
} from '~/components/common/certificate/Info/new/lib/config'
|
|
122
|
+
import { certificateInfo } from '~/components/common/certificate/Info/new/lib/utils'
|
|
123
|
+
|
|
124
|
+
const props = defineProps<{
|
|
125
|
+
certificateData: UI_I_Certificate | {}
|
|
126
|
+
validFrom: string
|
|
127
|
+
validTo: string
|
|
128
|
+
statusText: string
|
|
129
|
+
}>()
|
|
130
|
+
|
|
131
|
+
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
132
|
+
|
|
133
|
+
const currentExpirationDays = computed<number>(() =>
|
|
134
|
+
expirationDaysFunc(props.certificateData)
|
|
135
|
+
)
|
|
136
|
+
const statusIconName = ref<string>(
|
|
137
|
+
statusIconNameFunc(currentExpirationDays.value)
|
|
138
|
+
)
|
|
139
|
+
const statusText = ref<string>(
|
|
140
|
+
statusTextFunc(currentExpirationDays.value, localization.value)
|
|
141
|
+
)
|
|
142
|
+
const currentExpirationText = computed<string>(() =>
|
|
143
|
+
expirationTextFunc(currentExpirationDays.value, localization.value)
|
|
144
|
+
)
|
|
145
|
+
const currentElapsedValue = computed<number>(() =>
|
|
146
|
+
elapsedValueFunc(props.certificateData)
|
|
147
|
+
)
|
|
148
|
+
const elapsedProgressBarColor = computed<string>(() =>
|
|
149
|
+
elapsedProgressBarColorFunc(currentExpirationDays.value)
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
const subjectInfoItem = computed<UI_I_CertificateInfoItem>(() =>
|
|
153
|
+
certificateInfo(props.certificateData, 'subject')
|
|
154
|
+
)
|
|
155
|
+
const issuerInfoItem = computed<UI_I_CertificateInfoItem>(() =>
|
|
156
|
+
certificateInfo(props.certificateData, 'issuer')
|
|
157
|
+
)
|
|
158
|
+
</script>
|
|
159
|
+
|
|
160
|
+
<style>
|
|
161
|
+
:root {
|
|
162
|
+
--certificate-info-page-bg: #ffffff;
|
|
163
|
+
--certificate-info-page-item-box-bg: #ffffff;
|
|
164
|
+
--certificate-info-page-item-box-border: #e9ebed;
|
|
165
|
+
--certificate-info-page-item-status-text: #4d5d69;
|
|
166
|
+
--certificate-info-page-item-status-subtext: #9da6ad;
|
|
167
|
+
--certificate-info-page-item-elapsed-value: #4d5d69;
|
|
168
|
+
--certificate-info-page-item-icon-box-bg: #008fd614;
|
|
169
|
+
--certificate-info-page-item-icon-box-icon: #008fd6;
|
|
170
|
+
--certificate-info-page-item-title-block: #4d5d69;
|
|
171
|
+
--certificate-info-page-item-label: #4d5d69;
|
|
172
|
+
--certificate-info-page-item-value: #182531;
|
|
173
|
+
--certificate-info-page-valid-period-title: #4d5d69;
|
|
174
|
+
--certificate-info-page-active-dates-title: #4d5d69;
|
|
175
|
+
--certificate-info-page-date-value-info: #182531;
|
|
176
|
+
}
|
|
177
|
+
:root.dark-theme {
|
|
178
|
+
--certificate-info-page-bg: #334453;
|
|
179
|
+
--certificate-info-page-item-box-bg: #1b2a371f;
|
|
180
|
+
--certificate-info-page-item-box-border: #e9ebed1f;
|
|
181
|
+
--certificate-info-page-item-status-text: #e9eaec;
|
|
182
|
+
--certificate-info-page-item-status-subtext: #9da6ad;
|
|
183
|
+
--certificate-info-page-item-elapsed-value: #e9eaec;
|
|
184
|
+
--certificate-info-page-item-icon-box-bg: #2ba2de29;
|
|
185
|
+
--certificate-info-page-item-icon-box-icon: #2ba2de;
|
|
186
|
+
--certificate-info-page-item-title-block: #e9eaec;
|
|
187
|
+
--certificate-info-page-item-label: #e9eaec;
|
|
188
|
+
--certificate-info-page-item-value: #e9eaec;
|
|
189
|
+
--certificate-info-page-valid-period-title: #e9eaec;
|
|
190
|
+
--certificate-info-page-active-dates-title: #e9eaec;
|
|
191
|
+
--certificate-info-page-date-value-info: #e9eaec;
|
|
192
|
+
}
|
|
193
|
+
</style>
|
|
194
|
+
|
|
195
|
+
<style lang="scss" scoped>
|
|
196
|
+
.certificate-info-page {
|
|
197
|
+
background-color: var(--certificate-info-page-bg);
|
|
198
|
+
box-shadow: 0 1px 4px 0 #00000014;
|
|
199
|
+
border-radius: 8px;
|
|
200
|
+
|
|
201
|
+
.certificate-info-item-box {
|
|
202
|
+
background-color: var(--certificate-info-page-item-box-bg);
|
|
203
|
+
border: 1px solid var(--certificate-info-page-item-box-border);
|
|
204
|
+
border-radius: 8px;
|
|
205
|
+
|
|
206
|
+
.status-text {
|
|
207
|
+
font-weight: 500;
|
|
208
|
+
font-size: 14px;
|
|
209
|
+
color: var(--certificate-info-page-item-status-text);
|
|
210
|
+
}
|
|
211
|
+
.status-subtext {
|
|
212
|
+
font-weight: 400;
|
|
213
|
+
font-size: 12px;
|
|
214
|
+
color: var(--certificate-info-page-item-status-subtext);
|
|
215
|
+
}
|
|
216
|
+
.elapsed-block {
|
|
217
|
+
min-width: 320px;
|
|
218
|
+
|
|
219
|
+
.elapsed-text {
|
|
220
|
+
font-weight: 400;
|
|
221
|
+
font-size: 13px;
|
|
222
|
+
color: #9da6ad;
|
|
223
|
+
}
|
|
224
|
+
.elapsed-value {
|
|
225
|
+
font-weight: 400;
|
|
226
|
+
font-size: 13px;
|
|
227
|
+
color: var(--certificate-info-page-item-elapsed-value);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
.icon-box {
|
|
231
|
+
width: 40px;
|
|
232
|
+
height: 40px;
|
|
233
|
+
background: var(--certificate-info-page-item-icon-box-bg);
|
|
234
|
+
border-radius: 8px;
|
|
235
|
+
display: flex;
|
|
236
|
+
align-items: center;
|
|
237
|
+
justify-content: center;
|
|
238
|
+
color: var(--certificate-info-page-item-icon-box-icon);
|
|
239
|
+
}
|
|
240
|
+
.title-info-block {
|
|
241
|
+
font-weight: 500;
|
|
242
|
+
font-size: 14px;
|
|
243
|
+
color: var(--certificate-info-page-item-title-block);
|
|
244
|
+
}
|
|
245
|
+
.info-label {
|
|
246
|
+
font-weight: 400;
|
|
247
|
+
font-size: 13px;
|
|
248
|
+
line-height: 18px;
|
|
249
|
+
color: var(--certificate-info-page-item-label);
|
|
250
|
+
}
|
|
251
|
+
.info-value {
|
|
252
|
+
font-weight: 400;
|
|
253
|
+
font-size: 13px;
|
|
254
|
+
line-height: 18px;
|
|
255
|
+
color: var(--certificate-info-page-item-value);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
.valid-period-title {
|
|
259
|
+
font-size: 16px;
|
|
260
|
+
font-weight: 500;
|
|
261
|
+
color: var(--certificate-info-page-valid-period-title);
|
|
262
|
+
}
|
|
263
|
+
.active-dates-title {
|
|
264
|
+
font-size: 14px;
|
|
265
|
+
font-weight: 500;
|
|
266
|
+
color: var(--certificate-info-page-active-dates-title);
|
|
267
|
+
}
|
|
268
|
+
.grid-container-dates {
|
|
269
|
+
grid-gap: 44px;
|
|
270
|
+
|
|
271
|
+
.date-title-info {
|
|
272
|
+
font-size: 13px;
|
|
273
|
+
font-weight: 400;
|
|
274
|
+
line-height: 18px;
|
|
275
|
+
color: #9da6ad;
|
|
276
|
+
}
|
|
277
|
+
.date-value-info {
|
|
278
|
+
font-size: 13px;
|
|
279
|
+
font-weight: 400;
|
|
280
|
+
line-height: 18px;
|
|
281
|
+
color: var(--certificate-info-page-date-value-info);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
</style>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { UI_I_Localization } from '~/lib/models/interfaces'
|
|
2
|
+
import type { UI_I_Certificate } from '~/components/common/certificate/lib/models/interfaces'
|
|
3
|
+
|
|
4
|
+
export const statusIconNameFunc = (days: number): string => {
|
|
5
|
+
let result = ''
|
|
6
|
+
|
|
7
|
+
if (days === 0) result = 'error-circle'
|
|
8
|
+
else if (days >= 30) result = 'success-fill'
|
|
9
|
+
else if (days < 30) result = 'circle-warning'
|
|
10
|
+
|
|
11
|
+
return result
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const statusTextFunc = (
|
|
15
|
+
days: number,
|
|
16
|
+
localization: UI_I_Localization
|
|
17
|
+
): string => {
|
|
18
|
+
let result = ''
|
|
19
|
+
|
|
20
|
+
if (days === 0) result = localization.inventoryConfigure.expiring
|
|
21
|
+
else if (days >= 30) result = localization.common.good
|
|
22
|
+
else if (days < 30) result = localization.inventoryConfigure.expiringSoon
|
|
23
|
+
|
|
24
|
+
return result
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const expirationDaysFunc = (value: UI_I_Certificate | {}): number => {
|
|
28
|
+
const validFrom = new Date(value.valid_from).getTime()
|
|
29
|
+
const validTo = new Date(value.valid_to).getTime()
|
|
30
|
+
|
|
31
|
+
const diffMs = validTo - validFrom
|
|
32
|
+
return diffMs / (1000 * 60 * 60 * 24)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const expirationTextFunc = (
|
|
36
|
+
days: number,
|
|
37
|
+
localization: UI_I_Localization
|
|
38
|
+
): string =>
|
|
39
|
+
localization.inventoryConfigure.certificateExpiration.replace('{0}', days)
|
|
40
|
+
|
|
41
|
+
export const elapsedValueFunc = (value: UI_I_Certificate | {}): number => {
|
|
42
|
+
const start = new Date(value.valid_from).getTime()
|
|
43
|
+
const end = new Date(value.valid_to).getTime()
|
|
44
|
+
const now = new Date().getTime()
|
|
45
|
+
|
|
46
|
+
const percent = ((now - start) / (end - start)) * 100
|
|
47
|
+
|
|
48
|
+
return Math.round(percent)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export const elapsedProgressBarColorFunc = (days: number): string => {
|
|
52
|
+
let result = ''
|
|
53
|
+
|
|
54
|
+
if (days === 0) result = '--progress-bar-0-default'
|
|
55
|
+
else if (days >= 30) result = '--progress-bar-available'
|
|
56
|
+
else if (days < 30) result = '--progress-bar-2-default'
|
|
57
|
+
|
|
58
|
+
return result
|
|
59
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { UI_I_Certificate } from '~/components/common/certificate/lib/models/interfaces'
|
|
2
|
+
import type { UI_I_CertificateInfoItem } from '~/components/common/certificate/Info/new/lib/models/interfaces'
|
|
3
|
+
|
|
4
|
+
export const certificateInfo = (
|
|
5
|
+
data: UI_I_Certificate | {},
|
|
6
|
+
type: string
|
|
7
|
+
): UI_I_CertificateInfoItem =>
|
|
8
|
+
data?.[type]?.match(
|
|
9
|
+
/SERIALNUMBER=(?<serialNumber>[^,]+),CN=(?<commonName>[^,]+),OU=(?<organizationalUnit>[^,]+),O=(?<organization>[^,]+),L=(?<locality>[^,]+),ST=(?<state>[^,]+),C=(?<country>[^,]+)/
|
|
10
|
+
)?.groups
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<atoms-loader v-show="props.loading" test-id="certificate-spinner" />
|
|
3
|
+
<div class="certificate flex flex-col h-full">
|
|
4
|
+
<common-certificate-tools @renew-certificate="emits('renew-certificate')" />
|
|
5
|
+
|
|
6
|
+
<common-certificate-info :certificate-data="props.certificateData" />
|
|
7
|
+
</div>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script lang="ts" setup>
|
|
11
|
+
import type { UI_I_Certificate } from '~/components/common/certificate/lib/models/interfaces'
|
|
12
|
+
|
|
13
|
+
const props = defineProps<{
|
|
14
|
+
loading: boolean
|
|
15
|
+
certificateData: UI_I_Certificate | {}
|
|
16
|
+
}>()
|
|
17
|
+
|
|
18
|
+
const emits = defineEmits<{
|
|
19
|
+
(event: 'renew-certificate'): void
|
|
20
|
+
}>()
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<style lang="scss" scoped>
|
|
24
|
+
.certificate {
|
|
25
|
+
padding-left: 10px;
|
|
26
|
+
}
|
|
27
|
+
</style>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<common-certificate-new-skeleton
|
|
3
|
+
v-if="props.loading"
|
|
4
|
+
test-id="certificate-spinner"
|
|
5
|
+
/>
|
|
6
|
+
<div v-else class="certificate flex flex-col h-full">
|
|
7
|
+
<common-certificate-tools @renew-certificate="emits('renew-certificate')" />
|
|
8
|
+
|
|
9
|
+
<common-certificate-info :certificate-data="props.certificateData" />
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script lang="ts" setup>
|
|
14
|
+
import type { UI_I_Certificate } from '~/components/common/certificate/lib/models/interfaces'
|
|
15
|
+
|
|
16
|
+
const props = defineProps<{
|
|
17
|
+
loading: boolean
|
|
18
|
+
certificateData: UI_I_Certificate | {}
|
|
19
|
+
}>()
|
|
20
|
+
|
|
21
|
+
const emits = defineEmits<{
|
|
22
|
+
(event: 'renew-certificate'): void
|
|
23
|
+
}>()
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<style lang="scss" scoped>
|
|
27
|
+
.certificate {
|
|
28
|
+
padding-left: 10px;
|
|
29
|
+
}
|
|
30
|
+
</style>
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="certificate-skeleton-page grid h-full">
|
|
3
|
+
<div class="flex justify-between flex-wrap gap-4 mb-4">
|
|
4
|
+
<ui-skeleton-item width="160" height="22" />
|
|
5
|
+
<ui-skeleton-item width="106" height="36" border-radius="8" />
|
|
6
|
+
</div>
|
|
7
|
+
|
|
8
|
+
<div class="page-body p-4">
|
|
9
|
+
<div class="info-block-box flex justify-between flex-wrap gap-4 mb-3 p-4">
|
|
10
|
+
<div class="flex gap-3">
|
|
11
|
+
<ui-skeleton-item width="38" height="38" border-radius="50%" />
|
|
12
|
+
<div class="grid gap-1">
|
|
13
|
+
<ui-skeleton-item width="80" height="18" />
|
|
14
|
+
<ui-skeleton-item width="400" height="16" />
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="info-block-top-right-block">
|
|
18
|
+
<div class="flex justify-between gap-3 mb-[10px]">
|
|
19
|
+
<ui-skeleton-item width="64" height="18" />
|
|
20
|
+
<ui-skeleton-item width="64" height="18" />
|
|
21
|
+
</div>
|
|
22
|
+
<ui-skeleton-item width="100%" height="10" />
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="grid cols-2 gap-3">
|
|
26
|
+
<div class="info-block-box p-4">
|
|
27
|
+
<div class="flex items-center gap-3 mb-4">
|
|
28
|
+
<ui-skeleton-item width="40" height="40" border-radius="8" />
|
|
29
|
+
<ui-skeleton-item width="80" height="18" />
|
|
30
|
+
</div>
|
|
31
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
32
|
+
<ui-skeleton-item width="212" height="18" />
|
|
33
|
+
<ui-skeleton-item width="292" height="18" />
|
|
34
|
+
</div>
|
|
35
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
36
|
+
<ui-skeleton-item width="160" height="18" />
|
|
37
|
+
<ui-skeleton-item width="160" height="18" />
|
|
38
|
+
</div>
|
|
39
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
40
|
+
<ui-skeleton-item width="240" height="18" />
|
|
41
|
+
<ui-skeleton-item width="240" height="18" />
|
|
42
|
+
</div>
|
|
43
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
44
|
+
<ui-skeleton-item width="112" height="18" />
|
|
45
|
+
<ui-skeleton-item width="272" height="18" />
|
|
46
|
+
</div>
|
|
47
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
48
|
+
<ui-skeleton-item width="212" height="18" />
|
|
49
|
+
<ui-skeleton-item width="144" height="18" />
|
|
50
|
+
</div>
|
|
51
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
52
|
+
<ui-skeleton-item width="80" height="18" />
|
|
53
|
+
<ui-skeleton-item width="290" height="18" />
|
|
54
|
+
</div>
|
|
55
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
56
|
+
<ui-skeleton-item width="256" height="18" />
|
|
57
|
+
<ui-skeleton-item width="80" height="18" />
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
<div class="info-block-box p-4">
|
|
61
|
+
<div class="flex items-center gap-3 mb-4">
|
|
62
|
+
<ui-skeleton-item width="40" height="40" border-radius="8" />
|
|
63
|
+
<ui-skeleton-item width="80" height="18" />
|
|
64
|
+
</div>
|
|
65
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
66
|
+
<ui-skeleton-item width="212" height="18" />
|
|
67
|
+
<ui-skeleton-item width="292" height="18" />
|
|
68
|
+
</div>
|
|
69
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
70
|
+
<ui-skeleton-item width="160" height="18" />
|
|
71
|
+
<ui-skeleton-item width="160" height="18" />
|
|
72
|
+
</div>
|
|
73
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
74
|
+
<ui-skeleton-item width="240" height="18" />
|
|
75
|
+
<ui-skeleton-item width="240" height="18" />
|
|
76
|
+
</div>
|
|
77
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
78
|
+
<ui-skeleton-item width="112" height="18" />
|
|
79
|
+
<ui-skeleton-item width="272" height="18" />
|
|
80
|
+
</div>
|
|
81
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
82
|
+
<ui-skeleton-item width="212" height="18" />
|
|
83
|
+
<ui-skeleton-item width="144" height="18" />
|
|
84
|
+
</div>
|
|
85
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
86
|
+
<ui-skeleton-item width="80" height="18" />
|
|
87
|
+
<ui-skeleton-item width="290" height="18" />
|
|
88
|
+
</div>
|
|
89
|
+
<div class="flex justify-between gap-4 mb-3">
|
|
90
|
+
<ui-skeleton-item width="256" height="18" />
|
|
91
|
+
<ui-skeleton-item width="80" height="18" />
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
<ui-skeleton-item width="80" height="20" class="mt-4 mb-4" />
|
|
96
|
+
<div class="info-block-box p-4">
|
|
97
|
+
<ui-skeleton-item width="80" height="18" />
|
|
98
|
+
<div class="grid cols-2">
|
|
99
|
+
<div class="flex mt-4">
|
|
100
|
+
<ui-skeleton-item width="40" height="40" border-radius="8" />
|
|
101
|
+
<div class="ml-3">
|
|
102
|
+
<ui-skeleton-item width="80" height="18" class="mb-1" />
|
|
103
|
+
<ui-skeleton-item width="240" height="18" />
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
<div class="flex mt-4">
|
|
107
|
+
<ui-skeleton-item width="40" height="40" border-radius="8" />
|
|
108
|
+
<div class="ml-3">
|
|
109
|
+
<ui-skeleton-item width="80" height="18" class="mb-1" />
|
|
110
|
+
<ui-skeleton-item width="240" height="18" />
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
</template>
|
|
118
|
+
|
|
119
|
+
<script setup lang="ts"></script>
|
|
120
|
+
|
|
121
|
+
<style>
|
|
122
|
+
:root {
|
|
123
|
+
--certificate-page-skeleton-body-bg: #ffffff;
|
|
124
|
+
--certificate-page-skeleton-body-info-block-bg: #ffffff;
|
|
125
|
+
--certificate-page-skeleton-body-info-block-border: #e9ebed;
|
|
126
|
+
}
|
|
127
|
+
:root.dark-theme {
|
|
128
|
+
--certificate-page-skeleton-body-bg: #334453;
|
|
129
|
+
--certificate-page-skeleton-body-info-block-bg: #1b2a371f;
|
|
130
|
+
--certificate-page-skeleton-body-info-block-border: #e9ebed1f;
|
|
131
|
+
}
|
|
132
|
+
</style>
|
|
133
|
+
|
|
134
|
+
<style scoped lang="scss">
|
|
135
|
+
.certificate-skeleton-page {
|
|
136
|
+
grid-template-rows: max-content auto;
|
|
137
|
+
margin-top: 6px;
|
|
138
|
+
|
|
139
|
+
.page-body {
|
|
140
|
+
background-color: var(--certificate-page-skeleton-body-bg);
|
|
141
|
+
box-shadow: 0 1px 4px 0 #00000014;
|
|
142
|
+
border-radius: 8px;
|
|
143
|
+
|
|
144
|
+
.info-block-box {
|
|
145
|
+
background-color: var(--certificate-page-skeleton-body-info-block-bg);
|
|
146
|
+
border: 1px solid var(--certificate-page-skeleton-body-info-block-border);
|
|
147
|
+
border-radius: 8px;
|
|
148
|
+
|
|
149
|
+
.info-block-top-right-block {
|
|
150
|
+
min-width: 320px;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
</style>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="flex flex-wrap justify-between gap-4 mb-4">
|
|
3
|
+
<h3 class="certificate-title text-[18px] font-[500]">
|
|
4
|
+
{{ props.pageTitle }}
|
|
5
|
+
</h3>
|
|
6
|
+
|
|
7
|
+
<ui-button
|
|
8
|
+
test-id="certificate-renew-button"
|
|
9
|
+
size="md"
|
|
10
|
+
@click="emits('show-modal', 'renew')"
|
|
11
|
+
>
|
|
12
|
+
<template #icon> <ui-icon name="update" width="24" /> </template>
|
|
13
|
+
{{ localization.common.renew }}
|
|
14
|
+
</ui-button>
|
|
15
|
+
</div>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<script lang="ts" setup>
|
|
19
|
+
import type { UI_I_CollapseNavItem } from '~/components/atoms/collapse/lib/models/interfaces'
|
|
20
|
+
import type { UI_T_ModeModal } from '~/components/common/certificate/lib/models/types'
|
|
21
|
+
import type { UI_I_Localization } from '~/lib/models/interfaces'
|
|
22
|
+
|
|
23
|
+
const props = defineProps<{
|
|
24
|
+
pageTitle: string
|
|
25
|
+
tabs: UI_I_CollapseNavItem[]
|
|
26
|
+
}>()
|
|
27
|
+
|
|
28
|
+
const emits = defineEmits<{
|
|
29
|
+
(event: 'show-modal', value: UI_T_ModeModal): void
|
|
30
|
+
}>()
|
|
31
|
+
|
|
32
|
+
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<style>
|
|
36
|
+
:root {
|
|
37
|
+
--certificate-page-title: #4d5d69;
|
|
38
|
+
}
|
|
39
|
+
:root.dark-theme {
|
|
40
|
+
--certificate-page-title: #e9eaec;
|
|
41
|
+
}
|
|
42
|
+
</style>
|
|
43
|
+
|
|
44
|
+
<style lang="scss" scoped>
|
|
45
|
+
.certificate-title {
|
|
46
|
+
color: var(--certificate-page-title);
|
|
47
|
+
}
|
|
48
|
+
</style>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="certificate-headline">
|
|
3
|
+
<common-headline :headline="props.pageTitle">
|
|
4
|
+
<template #action>
|
|
5
|
+
<atoms-tabs
|
|
6
|
+
:items="props.tabs"
|
|
7
|
+
test-id="certificate-tabs"
|
|
8
|
+
size="small"
|
|
9
|
+
@change="emits('show-modal', $event)"
|
|
10
|
+
/>
|
|
11
|
+
</template>
|
|
12
|
+
</common-headline>
|
|
13
|
+
</div>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<script lang="ts" setup>
|
|
17
|
+
import type { UI_I_CollapseNavItem } from '~/components/atoms/collapse/lib/models/interfaces'
|
|
18
|
+
import type { UI_T_ModeModal } from '~/components/common/certificate/lib/models/types'
|
|
19
|
+
|
|
20
|
+
const props = defineProps<{
|
|
21
|
+
pageTitle: string
|
|
22
|
+
tabs: UI_I_CollapseNavItem[]
|
|
23
|
+
}>()
|
|
24
|
+
|
|
25
|
+
const emits = defineEmits<{
|
|
26
|
+
(event: 'show-modal', value: UI_T_ModeModal): void
|
|
27
|
+
}>()
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<style lang="scss" scoped>
|
|
31
|
+
.certificate-headline {
|
|
32
|
+
:deep(.heading-block__actions) {
|
|
33
|
+
.nav {
|
|
34
|
+
margin-top: 0;
|
|
35
|
+
align-items: flex-start;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
</style>
|