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.
Files changed (34) hide show
  1. package/assets/localization/local_be.json +21 -7
  2. package/assets/localization/local_en.json +21 -7
  3. package/assets/localization/local_hy.json +21 -7
  4. package/assets/localization/local_kk.json +21 -7
  5. package/assets/localization/local_ru.json +21 -7
  6. package/assets/localization/local_zh.json +21 -7
  7. package/components/common/adapterManager/AdapterManagerNew.vue +1 -0
  8. package/components/common/certificate/Certificate.vue +16 -6
  9. package/components/common/certificate/Info/Info.vue +61 -0
  10. package/components/common/certificate/{CertificateInfo.vue → Info/Old.vue} +6 -34
  11. package/components/common/certificate/Info/new/New.vue +285 -0
  12. package/components/common/certificate/Info/new/lib/config/index.ts +59 -0
  13. package/components/common/certificate/Info/new/lib/models/interfaces.ts +3 -0
  14. package/components/common/certificate/Info/new/lib/utils/index.ts +10 -0
  15. package/components/common/certificate/Old.vue +27 -0
  16. package/components/common/certificate/new/New.vue +30 -0
  17. package/components/common/certificate/new/Skeleton.vue +155 -0
  18. package/components/common/certificate/tools/New.vue +48 -0
  19. package/components/common/certificate/tools/Old.vue +39 -0
  20. package/components/common/certificate/{Tools.vue → tools/Tools.vue} +18 -23
  21. package/components/common/certificate/tools/lib/config/tabsPannel.ts +20 -0
  22. package/components/common/configure/physicalAdapters/tableView/lib/config/settings.ts +29 -29
  23. package/components/common/diagramMain/modals/Modals.vue +479 -483
  24. package/components/common/diagramMain/modals/lib/config/adapterModal.ts +147 -147
  25. package/components/common/diagramMain/modals/lib/config/networkModal.ts +405 -405
  26. package/components/common/diagramMain/modals/lib/config/portModal.ts +253 -253
  27. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  28. package/components/common/diagramMain/modals/managePhysicalAdapters/ManagePhysicalAdapters.vue +164 -0
  29. package/components/common/diagramMain/modals/managePhysicalAdapters/ManagePhysicalAdaptersNew.vue +306 -0
  30. package/components/common/diagramMain/modals/{ManagePhysicalAdaptersModal.vue → managePhysicalAdapters/ManagePhysicalAdaptersOld.vue} +245 -331
  31. package/components/common/diagramMain/modals/remove/RemoveModalNew.vue +157 -106
  32. package/components/common/diagramMain/modals/viewSettings/viewSettingsModal/ViewSettingsModalNew.vue +58 -50
  33. package/package.json +2 -2
  34. 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,3 @@
1
+ export interface UI_I_CertificateInfoItem {
2
+ [key: string]: string
3
+ }
@@ -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>