Sechs neue sgcHTML-Feedback-Komponenten: Badge, PDFViewer, ContextMenu, ProgressBar, JobProgress und LogViewer | eSeGeCe Blog

Sechs neue sgcHTML-Feedback-Komponenten: Badge, PDFViewer, ContextMenu, ProgressBar, JobProgress und LogViewer

· Komponenten

Vierter Beitrag in dieser Serie über die 25 neuen Komponenten von sgcHTML. In dieser Folge geht es darum, einem Besucher zu zeigen, was gerade passiert: eine Zahl auf einem Glockensymbol, ein Dokument, das direkt eingebettet geöffnet wird, ein Rechtsklick-Menü und drei verschiedene Arten, laufende Arbeit darzustellen — ein einzelner Balken, eine Liste von Hintergrundaufgaben und ein scrollendes Protokoll. Alle sechs sind serverseitig gerenderte Delphi-/C++Builder-/.NET-Komponenten; keine davon benötigt eine clientseitige Diagramm- oder PDF-Bibliothek, die Sie selbst einbinden müssten.

Badge — ein Label, eine Pille oder ein Benachrichtigungspunkt

TsgcHTMLComponent_Badge rendert ein einzelnes Bootstrap-5-<span class="badge">. Setzen Sie Positioned, und es wird zu einem absolut positionierten Benachrichtigungspunkt, verankert an dem position-relative-Element, das es umgibt, der klassische Zähler auf einem Glockensymbol.

uses
  sgcHTML_Enums, sgcHTML_Component_Badge;

var
  oBadge: TsgcHTMLComponent_Badge;
begin
  oBadge := TsgcHTMLComponent_Badge.Create(nil);
  try
    oBadge.Text := '3';
    oBadge.Color := bgDanger;
    oBadge.Pill := True;
    oBadge.Positioned := True;

    WebModule.Response := oBadge.HTML;   // <span class="badge bg-danger rounded-pill ...">
  finally
    oBadge.Free;
  end;
end;

// Or the one-line static helper for a simple inline badge:
WebModule.Response := TsgcHTMLComponent_Badge.Build('New', bgSuccess, True);

PDFViewer — ein Dokument auf der Seite, kein Plugin

TsgcHTMLComponent_PDFViewer rendert eine Werkzeugleiste und eine Zeichenfläche auf Basis von pdf.js, mit integrierter Seitennavigation, Zoom, Suche, Download und Druck. Verweisen Sie mit PDFURL auf ein Dokument (oder betten Sie die Bytes mit Base64Data ein), und das Rendering erfolgt vollständig clientseitig.

uses
  sgcHTML_Component_PDFViewer;

var
  oViewer: TsgcHTMLComponent_PDFViewer;
begin
  oViewer := TsgcHTMLComponent_PDFViewer.Create(nil);
  try
    oViewer.ViewerID := 'invoice';
    oViewer.PDFURL := '/invoices/INV-2026-0042.pdf';
    oViewer.Height := '700px';
    oViewer.InitialPage := 1;
    oViewer.Zoom := 'page-width';
    oViewer.Theme := pvLight;
    oViewer.DownloadFileName := 'invoice-0042.pdf';

    WebModule.Response := oViewer.HTML;   // toolbar + canvas + pdf.js init script
  finally
    oViewer.Free;
  end;
end;

ContextMenu — ein Rechtsklick-Menü, begrenzt auf einen Selektor

TsgcHTMLComponent_ContextMenu rendert ein Bootstrap-Dropdown, das sich per Rechtsklick öffnet und auf Elemente beschränkt ist, die TargetSelector entsprechen. Einträge mit einer DataAction senden über denselben Kanal, den Ihre Formulare bereits verwenden, und lösen ein DOM-Ereignis aus, in das Sie sich einklinken können.

uses
  sgcHTML_Component_ContextMenu;

var
  oMenu: TsgcHTMLComponent_ContextMenu;
  oItem: TsgcHTMLContextMenuItem;
begin
  oMenu := TsgcHTMLComponent_ContextMenu.Create(nil);
  try
    oMenu.MenuID := 'grid_menu';
    oMenu.TargetSelector := '.grid-row';

    oItem := oMenu.Items.Add;
    oItem.Caption := 'Edit';
    oItem.Icon := 'bi bi-pencil';
    oItem.DataAction := 'row:edit';

    oItem := oMenu.Items.Add;
    oItem.Caption := 'Delete';
    oItem.Icon := 'bi bi-trash';
    oItem.DataAction := 'row:delete';

    oItem := oMenu.Items.Add;
    oItem.Divider := True;

    oItem := oMenu.Items.Add;
    oItem.Caption := 'Open in new tab';
    oItem.Href := '/grid/open';

    WebModule.Response := oMenu.HTML;   // hidden <ul> + right-click binding script
  finally
    oMenu.Free;
  end;
end;

ProgressBar — einzelner Balken oder gestapelte Segmente

TsgcHTMLComponent_ProgressBar deckt sowohl den einfachen Fall ab, ein Value/Max, gestreift und animiert, als auch den gestapelten Fall: Fügen Sie Einträge zu Bars hinzu, und sie ersetzen den einzelnen Balken durch einen mehrsegmentigen, jedes Segment mit eigener Farbe und Beschriftung.

uses
  sgcHTML_Enums, sgcHTML_Component_ProgressBar;

var
  oBar: TsgcHTMLComponent_ProgressBar;
begin
  oBar := TsgcHTMLComponent_ProgressBar.Create(nil);
  try
    oBar.ProgressBarID := 'upload';
    oBar.Value := 72;
    oBar.Max := 100;
    oBar.ColorStyle := hcSuccess;
    oBar.Striped := True;
    oBar.Animated := True;
    oBar.ShowLabel := True;
    oBar.LabelFormat := '%d%% complete';

    WebModule.Response := oBar.HTML;   // Bootstrap progress bar
  finally
    oBar.Free;
  end;
end;

// Or a stacked, multi-segment bar:
with oBar.Bars.Add do
begin
  Value := 40;
  ColorStyle := hcPrimary;
  Label_ := 'Done';
end;
with oBar.Bars.Add do
begin
  Value := 20;
  ColorStyle := hcWarning;
  Label_ := 'In progress';
end;

JobProgress — eine Live-Liste von Hintergrundaufgaben

TsgcHTMLComponent_JobProgress ist das, wozu eine ProgressBar wird, sobald Sie mehr als eine Sache gleichzeitig verfolgen: eine Karte, die jede Hintergrundaufgabe auflistet, jede mit eigenem Status-Badge und eigener Fortschrittsleiste. AddJob registriert eine Aufgabe, UpdateJob bringt sie voran, und GetJobFragmentHTML überträgt nur diese eine Zeile an verbundene Clients, statt die ganze Liste neu zu rendern.

uses
  sgcHTML_Enums, sgcHTML_Component_JobProgress;

var
  oJobs: TsgcHTMLComponent_JobProgress;
begin
  oJobs := TsgcHTMLComponent_JobProgress.Create(nil);
  try
    oJobs.JobsID := 'exports';
    oJobs.Title := 'Background Exports';
    oJobs.ShowCompleted := False;

    oJobs.AddJob('exp-42', 'Export customers.csv', 'Generating CSV export');

    WebModule.Response := oJobs.HTML;   // card + progress rows + cancel-form script
  finally
    oJobs.Free;
  end;
end;

// On a later progress tick, push just that row over the WebSocket:
oJobs.UpdateJob('exp-42', 65, jsRunning);
Engine.BroadcastFragment(oJobs.GetJobFragmentHTML('exp-42'));

LogViewer — ein streamendes Terminal, inklusive Stufenfilter

TsgcHTMLComponent_LogViewer rendert ein dunkles oder helles Panel im Terminal-Stil mit Suchfeld und Stufenfilter, gestützt auf einen begrenzten Ringpuffer (MaxLines), damit es nie unbegrenzt wächst. AddLine fügt einen mit Zeitstempel versehenen, farbcodierten Eintrag hinzu; GetLastLineFragmentHTML überträgt neue Zeilen an jeden geöffneten Client, ohne die Seite komplett neu zu rendern.

uses
  sgcHTML_Component_LogViewer;

var
  oLog: TsgcHTMLComponent_LogViewer;
begin
  oLog := TsgcHTMLComponent_LogViewer.Create(nil);
  try
    oLog.LogID := 'applog';
    oLog.Theme := ltDark;
    oLog.MaxLines := 500;
    oLog.Height := '400px';

    oLog.AddLine(llInfo, 'Service started', 'app');
    oLog.AddLine(llWarning, 'Low disk space', 'monitor');
    oLog.AddLine(llError, 'Connection refused', 'db');

    WebModule.Response := oLog.HTML;   // toolbar + log body + inline script
  finally
    oLog.Free;
  end;
end;

// Push one more line to every connected client, no full re-render:
oLog.AddLine(llInfo, 'New order received', 'orders');
TsgcHTMX_Engine_Server.BroadcastFragment(oLog.GetLastLineFragmentHTML);

Ausprobieren

Die vollständige Dokumentation, Referenzen der wichtigsten Eigenschaften und Delphi-/C++Builder-/.NET-Codebeispiele finden Sie auf der jeweiligen Komponentenseite: Badge, PDFViewer, ContextMenu, ProgressBar, JobProgress und LogViewer. Letzter Beitrag dieser Serie: Präsenz, Rollen und Benutzerverwaltung.

Fragen, Feedback oder Hilfe bei der Migration? Kontaktieren Sie uns — Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.