This is an automated email from the ASF dual-hosted git repository.

riemer pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/streampipes.git


The following commit(s) were added to refs/heads/dev by this push:
     new c400a4d186 style: Improve layout of dataset feature card preview 
(#4193)
c400a4d186 is described below

commit c400a4d186bb3da30ca7fd840962fe878badccdc
Author: Dominik Riemer <[email protected]>
AuthorDate: Mon Feb 23 20:00:14 2026 +0100

    style: Improve layout of dataset feature card preview (#4193)
---
 .../dataset-feature-card.component.html            | 25 +++++-----
 .../dataset-feature-card.component.scss            | 53 +++++++++++++++++++++-
 .../dataset-feature-card.component.ts              | 43 +++++++++++++++---
 3 files changed, 103 insertions(+), 18 deletions(-)

diff --git 
a/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.html
 
b/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.html
index d5904bcc4a..fba5358311 100644
--- 
a/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.html
+++ 
b/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.html
@@ -50,7 +50,7 @@
                             size="small"
                             variant="soft"
                         >
-                            {{ (lastEventTs | date: 'short') || '-' }}
+                            {{ formatDate(lastEventTs) }}
                         </sp-label>
                     </div>
                 </div>
@@ -61,26 +61,29 @@
             </div>
             <div class="dataset-preview-inner">
                 @if (dataPreview && dataPreview.total > 0) {
-                    <div fxLayout="column">
+                    <div class="dataset-preview-table" fxLayout="column">
                         @for (
                             header of dataPreview.headers;
                             let i = $index;
                             track $index
                         ) {
-                            <div fxLayout="row" fxFlex="100">
-                                <span class="text-sm" fxFlex="70">{{
-                                    header
-                                }}</span>
-                                <span class="text-sm font-bold" fxFlex="30">
+                            <div class="dataset-preview-row">
+                                <span class="dataset-preview-key">
+                                    {{ header }}
+                                </span>
+                                <span class="dataset-preview-value">
                                     {{
-                                        dataPreview.allDataSeries[0].rows[0][i]
-                                    }}</span
-                                >
+                                        formatPreviewValue(
+                                            header,
+                                            previewRow[i]
+                                        )
+                                    }}
+                                </span>
                             </div>
                         }
                     </div>
                 } @else {
-                    <span class="text-sm">{{
+                    <span class="text-sm dataset-preview-empty">{{
                         'No data available.' | translate
                     }}</span>
                 }
diff --git 
a/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.scss
 
b/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.scss
index f224c48e64..62796fa7a5 100644
--- 
a/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.scss
+++ 
b/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.scss
@@ -22,8 +22,59 @@
 }
 
 .dataset-preview-inner {
-    overflow-y: scroll;
+    overflow-y: auto;
     min-height: 0;
+    padding: 0.25rem;
+}
+
+.dataset-preview-table {
+    gap: 0.25rem;
+}
+
+.dataset-preview-row {
+    display: grid;
+    grid-template-columns: minmax(6.5rem, 38%) minmax(0, 1fr);
+    gap: 0.75rem;
+    align-items: start;
+    padding: 0.5rem 0.625rem;
+    border-radius: 0.375rem;
+    border: 1px solid transparent;
+}
+
+.dataset-preview-row:nth-child(odd) {
+    background: var(--color-bg-1);
+    border-color: color-mix(in srgb, var(--color-bg-3) 45%, transparent);
+}
+
+.dataset-preview-row:nth-child(even) {
+    background: var(--color-bg-0);
+    border-color: color-mix(in srgb, var(--color-bg-3) 65%, transparent);
+}
+
+.dataset-preview-key {
+    font-size: var(--text-xs, 0.75rem);
+    opacity: 0.78;
+    line-height: 1.2;
+    word-break: break-word;
+    text-transform: capitalize;
+    letter-spacing: 0.03em;
+    padding-top: 0.125rem;
+}
+
+.dataset-preview-value {
+    min-width: 0;
+    font-size: var(--text-sm, 0.85rem);
+    font-weight: var(--font-weight-bold);
+    line-height: 1.3;
+    overflow-wrap: anywhere;
+    border-left: 1px solid var(--color-bg-3);
+    padding-left: 0.75rem;
+    opacity: 0.95;
+}
+
+.dataset-preview-empty {
+    display: block;
+    padding: 0.5rem;
 }
 
 .meta-card {
diff --git 
a/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.ts
 
b/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.ts
index a9703fd3bf..a0bd276574 100644
--- 
a/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.ts
+++ 
b/ui/src/app/dataset/components/dataset-feature-card/dataset-feature-card.component.ts
@@ -19,6 +19,7 @@
 import { Component, inject, Input, OnInit } from '@angular/core';
 import { FlexFillDirective } from '@ngbracket/ngx-layout';
 import {
+    DateFormatService,
     FeatureCardHeaderComponent,
     FeatureCardMetaSectionComponent,
     SpLabelComponent,
@@ -34,9 +35,7 @@ import {
 import { forkJoin } from 'rxjs';
 import { TranslatePipe } from '@ngx-translate/core';
 import { MatIcon } from '@angular/material/icon';
-import { DatePipe } from '@angular/common';
 import {
-    FlexDirective,
     LayoutAlignDirective,
     LayoutDirective,
     LayoutGapDirective,
@@ -48,13 +47,11 @@ import {
     styleUrls: ['./dataset-feature-card.component.scss'],
     imports: [
         FlexFillDirective,
-        FlexDirective,
         LayoutDirective,
         TranslatePipe,
         LayoutAlignDirective,
         LayoutGapDirective,
         MatIcon,
-        DatePipe,
         FeatureCardHeaderComponent,
         FeatureCardMetaSectionComponent,
         SpLabelComponent,
@@ -70,10 +67,12 @@ export class DatasetFeatureCardComponent implements OnInit {
     dataset: DataLakeMeasure;
     assetLinkType: AssetLinkType;
     dataPreview: SpQueryResult;
-    lastEventTs: number;
+    lastEventTs: number | undefined;
+    previewRow: unknown[] = [];
 
     private datalakeRestService = inject(DatalakeRestService);
     private genericStorageService = inject(GenericStorageService);
+    private dateFormatService = inject(DateFormatService);
 
     ngOnInit() {
         forkJoin([
@@ -103,10 +102,42 @@ export class DatasetFeatureCardComponent implements 
OnInit {
             .subscribe(res => {
                 this.dataPreview = res;
                 if (res.total > 0) {
-                    this.lastEventTs = res.allDataSeries[0].rows[0][0];
+                    this.previewRow = res.allDataSeries?.[0]?.rows?.[0] ?? [];
+                    this.lastEventTs = Number(this.previewRow[0]);
+                } else {
+                    this.previewRow = [];
+                    this.lastEventTs = undefined;
                 }
             });
     }
 
+    formatDate(timestamp?: number): string {
+        return this.dateFormatService.formatDate(timestamp);
+    }
+
+    formatPreviewValue(header: string, value: unknown): string {
+        if (value === null || value === undefined || value === '') {
+            return '–';
+        }
+
+        if (this.isTimestampField(header)) {
+            return this.dateFormatService.formatDate(Number(value));
+        }
+
+        if (typeof value === 'object') {
+            try {
+                return JSON.stringify(value);
+            } catch {
+                return String(value);
+            }
+        }
+
+        return String(value);
+    }
+
+    private isTimestampField(header: string): boolean {
+        return 'time' === header;
+    }
+
     navigateToChartView(): void {}
 }

Reply via email to