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

SvenO3 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 3961df2671 feat: Improve dataset details and feature card views (#4703)
3961df2671 is described below

commit 3961df26713a5e21858cefa3d7d6be2fe816dd21
Author: Sven Oehler <[email protected]>
AuthorDate: Fri Jul 10 11:05:43 2026 +0200

    feat: Improve dataset details and feature card views (#4703)
---
 .../dataset-details-events.component.html          | 12 ++++-
 .../dataset-details-events.component.ts            |  9 +++-
 .../dataset-feature-card.component.html            | 20 +++++++
 .../dataset-feature-card.component.ts              | 62 +++++++++++++---------
 4 files changed, 77 insertions(+), 26 deletions(-)

diff --git 
a/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.html
 
b/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.html
index d647754863..83102bde15 100644
--- 
a/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.html
+++ 
b/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.html
@@ -45,7 +45,7 @@
                 </sp-element-id>
             </div>
 
-            <div fxLayout="row" fxLayoutAlign="end center">
+            <div fxLayout="row" fxLayoutAlign="end center" 
fxLayoutGap="0.5rem">
                 <mat-form-field
                     appearance="outline"
                     subscriptSizing="dynamic"
@@ -62,6 +62,16 @@
                         data-cy="dataset-details-event-limit"
                     />
                 </mat-form-field>
+                <button
+                    mat-icon-button
+                    color="accent"
+                    [matTooltip]="'Refresh' | translate"
+                    [disabled]="loadingEvents"
+                    data-cy="dataset-details-refresh-events"
+                    (click)="refreshLatestEvents()"
+                >
+                    <mat-icon>refresh</mat-icon>
+                </button>
             </div>
 
             <div fxLayout="column" class="events-preview-section">
diff --git 
a/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.ts
 
b/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.ts
index 7c19543d72..561adef0f1 100644
--- 
a/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.ts
+++ 
b/ui/src/app/dataset/components/dataset-details/dataset-details-events/dataset-details-events.component.ts
@@ -31,11 +31,12 @@ import {
     LayoutDirective,
     LayoutGapDirective,
 } from '@ngbracket/ngx-layout/flex';
-import { MatButton } from '@angular/material/button';
+import { MatButton, MatIconButton } from '@angular/material/button';
 import { MatIcon } from '@angular/material/icon';
 import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { MatFormField, MatLabel } from '@angular/material/form-field';
 import { MatInput } from '@angular/material/input';
+import { MatTooltip } from '@angular/material/tooltip';
 import { FormsModule } from '@angular/forms';
 import { TranslatePipe } from '@ngx-translate/core';
 import { catchError, finalize, of } from 'rxjs';
@@ -62,6 +63,8 @@ type PreviewRow = Record<string, unknown>;
         MatFormField,
         MatLabel,
         MatInput,
+        MatIconButton,
+        MatTooltip,
         FormsModule,
         TranslatePipe,
     ],
@@ -124,6 +127,10 @@ export class DatasetDetailsEventsComponent
         this.loadLatestEvents();
     }
 
+    refreshLatestEvents(): void {
+        this.onEventLimitChange(this.eventLimit);
+    }
+
     navigateToCreateChart(): void {
         this.router.navigate(['chart', 'create'], {
             queryParams: {
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 9c46386282..f6ccb81b0d 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
@@ -54,6 +54,26 @@
                         </sp-label>
                     </div>
                 </div>
+
+                <div
+                    class="feature-card-meta-box"
+                    fxLayout="row"
+                    fxLayoutAlign="start center"
+                    fxLayoutGap="0.75rem"
+                >
+                    <mat-icon class="feature-card-meta-icon">numbers</mat-icon>
+                    <div>
+                        <div class="feature-card-meta-field-label">
+                            {{ 'Total events' | translate }}
+                        </div>
+                        <div
+                            class="feature-card-meta-field-value mt-xs"
+                            data-cy="dataset-feature-card-total-events"
+                        >
+                            {{ totalEventCount ?? '-' }}
+                        </div>
+                    </div>
+                </div>
             </sp-feature-card-meta-section>
 
             <div class="feature-card-meta-section__label">
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 f14d2f9332..84adc59302 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
@@ -35,7 +35,7 @@ import {
     GenericStorageService,
     SpQueryResult,
 } from '@streampipes/platform-services';
-import { forkJoin } from 'rxjs';
+import { catchError, forkJoin, Observable, of } from 'rxjs';
 import { TranslatePipe } from '@ngx-translate/core';
 import { MatIcon } from '@angular/material/icon';
 import {
@@ -72,6 +72,7 @@ export class DatasetFeatureCardComponent implements OnInit {
     assetLinkType: AssetLinkType;
     dataPreview: SpQueryResult;
     lastEventTs: number | undefined;
+    totalEventCount: number | undefined;
     previewRows: PreviewRow[] = [];
 
     private datalakeRestService = inject(DatalakeRestService);
@@ -93,30 +94,43 @@ export class DatasetFeatureCardComponent implements OnInit {
     }
 
     loadSampleData(): void {
-        this.datalakeRestService
-            .getData(this.dataset.measureName, {
-                endDate: new Date().getTime(),
-                startDate: 0,
-                limit: 1,
-                order: 'DESC',
-                missingValueBehaviour: 'empty',
-                columns: this.dataset.eventSchema.eventProperties
-                    .map(ep => ep.runtimeName)
-                    .toString(),
-            })
-            .subscribe(res => {
-                this.dataPreview = res;
-                if (res.total > 0) {
-                    const previewRow = res.allDataSeries?.[0]?.rows?.[0] ?? [];
-                    this.lastEventTs = Number(previewRow[0]);
-                    this.previewRows = res.headers.map((header, index) =>
+        forkJoin({
+            dataPreview: this.datalakeRestService
+                .getData(this.dataset.measureName, {
+                    endDate: new Date().getTime(),
+                    startDate: 0,
+                    limit: 1,
+                    order: 'DESC',
+                    missingValueBehaviour: 'empty',
+                    columns: this.dataset.eventSchema.eventProperties
+                        .map(ep => ep.runtimeName)
+                        .toString(),
+                })
+                .pipe(catchError(() => of(new SpQueryResult()))),
+            totalEventCount: this.loadTotalEventCount(),
+        }).subscribe(res => {
+            this.dataPreview = res.dataPreview;
+            this.totalEventCount = res.totalEventCount;
+
+            if (res.dataPreview.total > 0) {
+                const previewRow =
+                    res.dataPreview.allDataSeries?.[0]?.rows?.[0] ?? [];
+                this.lastEventTs = Number(previewRow[0]);
+                this.previewRows = res.dataPreview.headers.map(
+                    (header, index) =>
                         this.toPreviewRow(header, previewRow[index]),
-                    );
-                } else {
-                    this.previewRows = [];
-                    this.lastEventTs = undefined;
-                }
-            });
+                );
+            } else {
+                this.previewRows = [];
+                this.lastEventTs = undefined;
+            }
+        });
+    }
+
+    private loadTotalEventCount(): Observable<number> {
+        return this.datalakeRestService
+            .getMeasurementEntryCount(this.dataset.elementId)
+            .pipe(catchError(() => of(0)));
     }
 
     formatDate(timestamp?: number): string {

Reply via email to