11<script setup lang="ts">
22import { onMounted , ref , computed } from ' vue' ;
33import { useStore } from ' vuex' ;
4- import Banner from ' @components/Banner/Banner.vue' ;
5- import Checkbox from ' @components/Form/Checkbox/Checkbox.vue' ;
6- import LabeledInput from ' @components/Form/LabeledInput/LabeledInput.vue' ;
74import { MANAGEMENT } from ' @shell/config/types' ;
85import { getVendor } from ' @shell/config/private-label' ;
96import { downloadFile } from ' @shell/utils/download' ;
@@ -215,7 +212,7 @@ const versionColumns = [
215212const downloadColumns = [
216213 {
217214 field: ' label' ,
218- label: t (' about.versions.component' ), // re-use "Component" as Platform header
215+ label: t (' about.versions.component' ),
219216 formatter : (_v : any , row : any ) => {
220217 const div = document .createElement (' div' );
221218
@@ -245,16 +242,30 @@ const downloadColumns = [
245242 }
246243 }
247244];
245+
246+ const reportStatus = computed (() => {
247+ if (reportSuccess .value ) return { message: reportSuccess .value , variant: ' success' };
248+ if (reportError .value ) return { message: reportError .value , variant: ' error' };
249+ return null ;
250+ });
251+
252+ const bundleStatus = computed (() => {
253+ if (supportBundleSuccess .value ) return { message: supportBundleSuccess .value , variant: ' success' };
254+ if (supportBundleError .value ) return { message: supportBundleError .value , variant: ' error' };
255+ return null ;
256+ });
248257 </script >
249258
250259<template >
251260 <div class =" about" >
252- <Banner
261+ <trailhand-tag
253262 v-if =" fetchError"
254- color =" error"
255263 :label =" fetchError"
264+ variant =" error"
265+ size =" md"
256266 class =" mb-20"
257267 />
268+
258269 <template v-if =" version " >
259270 <h1 >
260271 {{ aboutTitleString }}
@@ -291,95 +302,97 @@ const downloadColumns = [
291302 </a >
292303 </template >
293304
294- <section
305+ <div
295306 v-if =" version"
296- class =" download-report "
307+ class =" about-cards "
297308 >
298- <h3 >{{ t('epinio.downloadReport.title') }}</h3 >
299-
300- <div class =" download-report__actions" >
301- <button
302- class =" btn role-primary"
309+ <trailhand-card
310+ icon-name =" info"
311+ class =" about-card"
312+ >
313+ <span slot =" title" >{{ t('epinio.downloadReport.title') }}</span >
314+ <div
315+ slot =" description"
316+ class =" download__body"
317+ >
318+ <p class =" download__description" >
319+ {{ t('epinio.downloadReport.description') }}
320+ </p >
321+ </div >
322+ <trailhand-button
323+ slot =" action"
324+ variant =" secondary"
325+ size =" large"
303326 :disabled =" reportLoading"
304327 @click =" downloadReport"
328+ class =" download__button"
305329 >
306- <i
307- v-if =" reportLoading"
308- class =" icon-spinner animate-spin mr-5"
330+ {{ reportLoading ? 'Downloading...' : t('epinio.downloadReport.action') }}
331+ </trailhand-button >
332+ <span
333+ v-if =" reportStatus"
334+ slot =" footer"
335+ >
336+ <trailhand-tag
337+ :label =" reportStatus.message"
338+ :variant =" reportStatus.variant"
339+ size =" md"
309340 />
310- {{ t('epinio.downloadReport.action') }}
311- </button >
312- </div >
313-
314- <Banner
315- v-if =" reportSuccess"
316- color =" success"
317- :label =" reportSuccess"
318- />
319- <Banner
320- v-if =" reportError"
321- color =" error"
322- :label =" reportError"
323- />
324- </section >
341+ </span >
342+ </trailhand-card >
325343
326- <section
327- v-if =" version"
328- class =" support-bundle"
329- >
330- <h3 >{{ t('epinio.supportBundle.title') }}</h3 >
331- <p class =" text-muted" >
332- {{ t('epinio.supportBundle.description') }}
333- </p >
334-
335- <div class =" support-bundle__controls" >
336- <LabeledInput
337- v-model:value =" tailLines"
338- type =" number"
339- :label =" t('epinio.supportBundle.tail.label')"
340- :tooltip =" t('epinio.supportBundle.tail.help')"
341- :min =" 1"
342- :max =" 10000"
343- :disabled =" supportBundleLoading"
344- />
345- <Checkbox
346- v-model:value =" includeApps"
347- :label =" t('epinio.supportBundle.includeApps')"
348- :disabled =" supportBundleLoading"
349- />
350- </div >
351-
352- <div class =" support-bundle__actions" >
353- <trailhand-button
354- variant =" primary"
355- :disabled =" supportBundleLoading"
356- @click =" downloadSupportBundle"
344+ <trailhand-card
345+ icon-name =" tools"
346+ class =" about-card bundle-card"
347+ >
348+ <span slot =" title" >{{ t('epinio.supportBundle.title') }}</span >
349+ <div
350+ slot =" description"
351+ class =" support-bundle__body"
357352 >
358- <i
359- v-if =" supportBundleLoading"
360- class =" icon-spinner animate-spin mr-5"
361- />
362- {{ t('epinio.supportBundle.action') }}
363- </trailhand-button >
353+ <p class =" support-bundle__description" >
354+ {{ t('epinio.supportBundle.description') }}
355+ </p >
356+ <label class =" checkbox-label" >
357+ <trailhand-checkbox
358+ :checked =" includeApps"
359+ :disabled =" supportBundleLoading"
360+ @checkbox-change =" includeApps = $event.detail.checked"
361+ />
362+ {{ t('epinio.supportBundle.includeApps') }}
363+ </label >
364+ <div class =" support-bundle__controls" >
365+ <div class =" input-button-row" >
366+ <trailhand-text-input
367+ :label =" t('epinio.supportBundle.tail.label')"
368+ :value =" String(tailLines)"
369+ size =" large"
370+ :disabled =" supportBundleLoading"
371+ @text-input-change =" tailLines = sanitizeTail($event.detail.value)"
372+ />
373+ <trailhand-button
374+ variant =" secondary"
375+ size =" large"
376+ :disabled =" supportBundleLoading"
377+ @click =" downloadSupportBundle"
378+ >
379+ {{ supportBundleLoading ? t('epinio.supportBundle.collecting') : t('epinio.supportBundle.action') }}
380+ </trailhand-button >
381+ </div >
382+ </div >
383+ </div >
364384 <span
365- v-if =" supportBundleLoading "
366- class = " support-bundle__progress "
385+ v-if =" bundleStatus "
386+ slot = " footer "
367387 >
368- {{ t('epinio.supportBundle.collecting') }}
388+ <trailhand-tag
389+ :label =" bundleStatus.message"
390+ :variant =" bundleStatus.variant"
391+ size =" md"
392+ />
369393 </span >
370- </div >
371-
372- <Banner
373- v-if =" supportBundleSuccess"
374- color =" success"
375- :label =" supportBundleSuccess"
376- />
377- <Banner
378- v-if =" supportBundleError"
379- color =" error"
380- :label =" supportBundleError"
381- />
382- </section >
394+ </trailhand-card >
395+ </div >
383396 </div >
384397</template >
385398
@@ -393,52 +406,63 @@ const downloadColumns = [
393406 }
394407}
395408
396- .download-report {
409+ .about-cards {
410+ display : grid ;
411+ grid-template-columns : 1fr 1fr ;
412+ gap : 20px ;
397413 margin-top : 40px ;
398- padding : 16px ;
399- border : 1px solid var (--border );
400- border-radius : var (--border-radius );
401- background : var (--default );
402-
403- & __actions {
404- display : flex ;
405- align-items : center ;
406- gap : 12px ;
407- margin-top : 16px ;
408- }
414+ align-items : stretch ;
415+ }
409416
410- .banner {
411- margin-top : 10px ;
412- }
417+ .about-card {
418+ height : 100% ;
413419}
414420
415- .support-bundle {
416- margin-top : 40px ;
417- padding : 16px ;
418- border : 1px solid var (--border );
419- border-radius : var (--border-radius );
420- background : var (--default );
421-
422- & __controls {
423- display : flex ;
424- flex-wrap : wrap ;
425- gap : 16px ;
426- align-items : center ;
427- }
421+ .about-card ::part(card) {
422+ height : 100% ;
423+ box-sizing : border-box ;
424+ }
428425
429- & __actions {
430- display : flex ;
431- align-items : center ;
432- gap : 12px ;
433- margin-top : 16px ;
434- }
426+ .bundle-card ::part(action) {
427+ margin-bottom : 0 ;
428+ }
435429
436- & __progress {
437- color : var (--muted );
438- }
430+ .support-bundle__body ,
431+ .download__body {
432+ display : flex ;
433+ flex-direction : column ;
434+ gap : 12px ;
435+ }
439436
440- .banner {
441- margin-top : 10px ;
442- }
437+ trailhand-button .download__button {
438+ width : 100% ;
439+ }
440+
441+ .support-bundle__description ,
442+ .download__description {
443+ margin : 0 ;
444+ font-size : 14px ;
445+ color : var (--th-color-text-secondary );
446+ }
447+
448+ .support-bundle__controls {
449+ display : flex ;
450+ flex-direction : column ;
451+ gap : 12px ;
452+ }
453+
454+ .input-button-row {
455+ display : grid ;
456+ grid-template-columns : 1fr 1fr ;
457+ gap : 16px ;
458+ align-items : end ;
459+ }
460+
461+ .checkbox-label {
462+ display : flex ;
463+ align-items : center ;
464+ gap : 8px ;
465+ cursor : pointer ;
466+ font-size : 14px ;
443467}
444468 </style >
0 commit comments