NotificationInbox

TsgcHTMLComponent_NotificationInbox: eine Glocke mit Ungelesen-Abzeichen und einer Dropdown-Liste der Benachrichtigungen eines Benutzers, in Delphi, C++ Builder und .NET. Ihre Anwendung speichert die Zeilen, die Komponente stellt sie dar.

TsgcHTMLComponent_NotificationInbox

Die Bibliothek speichert nichts. Ihre Anwendung beantwortet OnLoadNotifications mit den Zeilen, die sie speichert, und erfährt über OnMarkRead und OnMarkAllRead, was der Benutzer getan hat, damit sie es dauerhaft speichern kann. Die Komponente stellt die Oberfläche dar und erzwingt keine Autorisierung. Sie funktioniert in jeder Edition, über WebSocket oder Server-Sent Events.

Komponentenklasse

TsgcHTMLComponent_NotificationInbox (Unit sgcHTML_Component_NotificationInbox)

Rendert

Bootstrap-Dropdown-Markup: eine Glocke, ein Ungelesen-Abzeichen und eine Liste

Sprachen

Delphi, C++ Builder, .NET

Anlegen, drei Ereignisse behandeln, die Aktionen weiterleiten

Geben Sie dem Posteingang eine InboxID, füllen Sie ihn in OnLoadNotifications aus Ihrem eigenen Speicher, speichern Sie in OnMarkRead und OnMarkAllRead, was der Benutzer getan hat, und leiten Sie die gesendeten Aktionen an ProcessAction weiter, wobei der Benutzer aus der Sitzung entnommen wird.

uses
  sgcHTML_Session, sgcHTML_Component_NotificationInbox;

var
  oInbox: TsgcHTMLComponent_NotificationInbox;
begin
  oInbox := TsgcHTMLComponent_NotificationInbox.Create(nil);
  try
    oInbox.InboxID := 'inbox';
    oInbox.Title := 'Notifications';
    oInbox.MaxItems := 10;
    oInbox.OnLoadNotifications := InboxLoad;
    oInbox.OnMarkRead := InboxMarkRead;
    oInbox.OnMarkAllRead := InboxMarkAllRead;

    // the user comes from the session, never from the form
    oInbox.LoadNotifications(sgcHTMLRequestSession.UserID);
    Response := oInbox.HTML;   // bell, unread badge and dropdown
  finally
    oInbox.Free;
  end;
end;

// the application owns the rows: fill the list, newest first
procedure TMain.InboxLoad(Sender: TObject; const aUserID: string;
  aList: TsgcHTMLInboxItems);
begin
  with aList.Add do
  begin
    Id := '1042';
    Title := 'New order';
    Text := 'Order #1042 was placed.';
    Timestamp := '2 min ago';
    Read := False;
  end;
end;

procedure TMain.InboxMarkRead(Sender: TObject; const aUserID,
  aNotificationID: string);
begin
  // persist it, after checking that aUserID owns aNotificationID
end;

// in the message handler that receives the actions the inbox posts
if oInbox.ProcessAction(vUser, vAction, vNotificationID) then
  oHTMX.PushFragment(vGuid, oInbox.GetListFragmentHTML +
    oInbox.GetBadgeFragmentHTML);
// includes: sgcHTML_Session.hpp, sgcHTML_Component_NotificationInbox.hpp

TsgcHTMLComponent_NotificationInbox *oInbox = new TsgcHTMLComponent_NotificationInbox(NULL);
try
{
  oInbox->InboxID = "inbox";
  oInbox->Title = "Notifications";
  oInbox->MaxItems = 10;
  oInbox->OnLoadNotifications = InboxLoad;
  oInbox->OnMarkRead = InboxMarkRead;
  oInbox->OnMarkAllRead = InboxMarkAllRead;

  // the user comes from the session, never from the form
  oInbox->LoadNotifications(sgcHTMLRequestSession()->UserID);
  String html = oInbox->HTML;   // bell, unread badge and dropdown
}
__finally
{
  delete oInbox;
}

// the application owns the rows: fill the list, newest first
void __fastcall TMain::InboxLoad(TObject *Sender, const String aUserID,
  TsgcHTMLInboxItems *aList)
{
  TsgcHTMLInboxItem *item = aList->Add();
  item->Id = "1042";
  item->Title = "New order";
  item->Text = "Order #1042 was placed.";
  item->Timestamp = "2 min ago";
  item->Read = false;
}

void __fastcall TMain::InboxMarkRead(TObject *Sender, const String aUserID,
  const String aNotificationID)
{
  // persist it, after checking that aUserID owns aNotificationID
}

// in the message handler that receives the actions the inbox posts
if (oInbox->ProcessAction(vUser, vAction, vNotificationID))
  oHTMX->PushFragment(vGuid, oInbox->GetListFragmentHTML() +
    oInbox->GetBadgeFragmentHTML());
using esegece.sgcWebSockets;

var inbox = new TsgcHTMLComponent_NotificationInbox();
inbox.InboxID = "inbox";
inbox.Title = "Notifications";
inbox.MaxItems = 10;
inbox.OnLoadNotifications += InboxLoad;
inbox.OnMarkRead += InboxMarkRead;
inbox.OnMarkAllRead += InboxMarkAllRead;

// the user comes from the session, never from the form
string user = sgcHTMLSessionHelpers.sgcHTMLRequestSession()?.UserID ?? "";
inbox.LoadNotifications(user);
string html = inbox.HTML;   // bell, unread badge and dropdown

// the application owns the rows: fill the list, newest first
void InboxLoad(object sender, string userID, TsgcHTMLInboxItems list)
{
    var item = list.Add();
    item.Id = "1042";
    item.Title = "New order";
    item.Text = "Order #1042 was placed.";
    item.Timestamp = "2 min ago";
    item.Read = false;
}

void InboxMarkRead(object sender, string userID, string notificationID)
{
    // persist it, after checking that userID owns notificationID
}

// in the message handler that receives the actions the inbox posts
if (inbox.ProcessAction(user, action, notificationId))
    htmx.PushFragment(guid, inbox.GetListFragmentHTML() + inbox.GetBadgeFragmentHTML());

Wichtige Eigenschaften & Methoden

Die Member, die Sie am häufigsten verwenden.

Items

Items ist eine TsgcHTMLInboxItems-Sammlung; jedes TsgcHTMLInboxItem hat Id, Title, Text, Timestamp, Url, Icon und Read. Alles in einer Zeile sind Daten und wird beim Rendern maskiert, auch das Icon: Übergeben Sie ein literales Zeichen, nie eine HTML-Entität oder Markup. Url wird bereinigt, und Links mit javascript: und data: werden abgelehnt.

Speicherereignisse

Die Komponente hält nur, was sie gerade darstellt. OnLoadNotifications(aUserID, aList) wird mit bereits geleertem aList ausgelöst: Füllen Sie sie mit den Benachrichtigungen des Benutzers, die neueste zuerst. OnMarkRead(aUserID, aNotificationID) wird ausgelöst, nachdem das Element als gelesen markiert wurde, und OnMarkAllRead(aUserID), nachdem alle Elemente als gelesen markiert wurden.

Serverseitige Aktionen

LoadNotifications(aUserID), MarkRead(aUserID, aNotificationID) und MarkAllRead(aUserID) erledigen die Arbeit. ProcessAction(aUserID, aAction, aNotificationID) leitet eine gesendete Aktion an die richtige davon weiter und gibt False zurück, wenn die Aktion keine Posteingangs-Aktion ist, sodass Sie weiter nach der zuständigen Komponente suchen können.

Aktionen, die sie sendet

Das Dropdown sendet inboxMarkRead (Felder action, inbox, id), inboxMarkAllRead und inboxRefresh (Felder action, inbox) als data-sgc-ws-send-Formulare. Das Feld inbox enthält die Element-ID des Posteingangs, der das Formular gerendert hat, also InboxID, wenn Sie sie gesetzt haben, und so leitet eine Seite mit mehreren Posteingängen die Aktion an die richtige Komponente weiter.

Autorisierung

Die Komponente stellt die Oberfläche dar und erzwingt keine Autorisierung. Jede Aktion wird als vom Client gesendete Daten übertragen, sodass ein böswilliger Client jede Aktion und jede Benachrichtigungs-ID fälschen kann. Es wird keine Benutzer-ID in das Markup geschrieben: Entnehmen Sie den handelnden Benutzer der Sitzung der Anfrage (sgcHTMLRequestSession), nie dem Formular, und prüfen Sie, dass dem Benutzer die eingegangene Benachrichtigungs-ID gehört, bevor Sie etwas speichern.

Erscheinungsbild

Title ist die Dropdown-Überschrift, EmptyText der Platzhalter, wenn es nichts anzuzeigen gibt, und BellIcon das Trigger-Symbol, vertrauenswürdiges Markup, standardmäßig mit einer HTML-Entität. MaxItems begrenzt die sichtbaren Zeilen (Standard 10, 0 zeigt alle), ShowMarkAllRead und ShowBadge sind standardmäßig aktiviert, und AddNotification(aId, aTitle, aText, aTimestamp, aUrl, aIcon) fügt eine Zeile hinzu oder aktualisiert die mit derselben ID.

Live-Aktualisierungen

Jede Benachrichtigung, das Abzeichen und die Liste tragen eine stabile Element-ID. Rendern Sie nach einer Änderung nur das betroffene Markup mit GetItemFragmentHTML(aId), GetBadgeFragmentHTML oder GetListFragmentHTML und senden Sie es mit TsgcHTMX_Engine_Server.PushFragment oder BroadcastFragment, statt die Seite neu zu rendern. UnreadCount zählt die Elemente, deren Read False ist.

Editionen und Kanäle

Die Unit kompiliert, wenn SGC_HTML definiert ist, was sgcVer.inc für Android und iOS nicht tut. Sie funktioniert in jeder Edition, über WebSocket oder Server-Sent Events. sgcHTML ist ein eigenständiges Paket, das unabhängig von sgcWebSockets verkauft wird.

Seite oder Push

Der Posteingang entscheidet nicht selbst zwischen der Seite und einem Push: Das übernimmt TsgcHTMLComponent_Notification, siehe Notification und WebPush. Welche Kanäle jeder Benutzer möchte, wird in NotificationPreferences festgelegt.

Weiter entdecken

Online-HilfeVollständige API-Referenz und Verwendungshandbuch für diese Komponente.
Alle sgcHTML-KomponentenDurchsuchen Sie die vollständige Funktionsmatrix von über 80 Komponenten.
Kostenlose Testversion herunterladenDie 30-Tage-Testversion enthält die 60.HTML-Demoprojekte, darunter 17.FieldService, das den Posteingang verwendet.
PreiseSingle-, Team- und Site-Lizenzen mit vollständigem Quellcode.
Bestes Preis-Leistungs-Verhältnis: All-AccessAlle eSeGeCe-Produkte, inklusive Premium-Support, ab €1,059 pro Jahr.
All-Access-Preise ansehen

Bereit loszulegen?

Laden Sie die kostenlose Testversion herunter und beginnen Sie, Web-UIs in Delphi, C++ Builder und .NET zu erstellen.