NotificationInbox

TsgcHTMLComponent_NotificationInbox : une cloche avec un badge de non-lus et une liste déroulante des notifications d'un utilisateur, en Delphi, C++ Builder et .NET. Votre application conserve les lignes, le composant les affiche.

TsgcHTMLComponent_NotificationInbox

La bibliothèque ne stocke rien. Votre application répond à OnLoadNotifications avec les lignes qu'elle conserve et est informée par OnMarkRead et OnMarkAllRead de ce qu'a fait l'utilisateur, afin de pouvoir l'enregistrer. Le composant affiche l'interface et n'applique aucune autorisation. Il fonctionne sur toutes les éditions, via WebSocket ou événements envoyés par le serveur.

Classe du composant

TsgcHTMLComponent_NotificationInbox (unité sgcHTML_Component_NotificationInbox)

Produit

Balisage de menu déroulant Bootstrap : une cloche, un badge de non-lus et une liste

Langages

Delphi, C++ Builder, .NET

Créez-le, gérez trois événements, acheminez les actions

Donnez à la boîte de réception un InboxID, remplissez-la depuis votre propre stockage dans OnLoadNotifications, enregistrez ce qu'a fait l'utilisateur dans OnMarkRead et OnMarkAllRead, et acheminez les actions envoyées vers ProcessAction avec l'utilisateur tiré de la session.

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());

Propriétés & méthodes clés

Les membres que vous utilisez le plus souvent.

Items

Items est une collection TsgcHTMLInboxItems ; chaque TsgcHTMLInboxItem possède Id, Title, Text, Timestamp, Url, Icon et Read. Tout ce qui se trouve dans une ligne est une donnée et est échappé au rendu, y compris Icon : passez un glyphe littéral, jamais une entité HTML ni du balisage. Url est assainie et les liens javascript: et data: sont rejetés.

Événements de stockage

Le composant ne conserve que ce qu'il affiche. OnLoadNotifications(aUserID, aList) se déclenche avec aList déjà vidée : remplissez-la avec les notifications de l'utilisateur, la plus récente en premier. OnMarkRead(aUserID, aNotificationID) se déclenche après que l'élément a été marqué comme lu, et OnMarkAllRead(aUserID) après que tous l'ont été.

Actions côté serveur

LoadNotifications(aUserID), MarkRead(aUserID, aNotificationID) et MarkAllRead(aUserID) font le travail. ProcessAction(aUserID, aAction, aNotificationID) aiguille une action envoyée vers la bonne méthode et renvoie False lorsque l'action n'est pas une action de la boîte de réception, afin que vous puissiez continuer à chercher son propriétaire.

Actions envoyées

Le menu déroulant envoie inboxMarkRead (champs action, inbox, id), inboxMarkAllRead et inboxRefresh (champs action, inbox) sous forme de formulaires data-sgc-ws-send. Le champ inbox porte l'identifiant d'élément de la boîte de réception qui a rendu le formulaire, qui est InboxID lorsque vous le définissez, et c'est ainsi qu'une page avec plusieurs boîtes de réception achemine l'action vers le bon composant.

Autorisation

Le composant affiche l'interface et n'applique aucune autorisation. Chaque action voyage sous forme de données envoyées par le client, de sorte qu'un client hostile peut falsifier n'importe quelle action et n'importe quel identifiant de notification. Aucun identifiant d'utilisateur n'est écrit dans le balisage : prenez l'utilisateur qui agit dans la session de la requête (sgcHTMLRequestSession), jamais dans le formulaire, et vérifiez que l'utilisateur possède l'identifiant de notification reçu avant d'enregistrer quoi que ce soit.

Apparence

Title est l'en-tête du menu déroulant, EmptyText l'espace réservé lorsqu'il n'y a rien à afficher et BellIcon le glyphe du déclencheur, un balisage de confiance avec une entité HTML par défaut. MaxItems plafonne les lignes visibles (10 par défaut, 0 les affiche toutes), ShowMarkAllRead et ShowBadge sont activés par défaut, et AddNotification(aId, aTitle, aText, aTimestamp, aUrl, aIcon) ajoute une ligne ou met à jour celle qui a le même identifiant.

Mises à jour en direct

Chaque notification, le badge et la liste portent un identifiant d'élément stable. Après un changement, ne rendez que le balisage concerné avec GetItemFragmentHTML(aId), GetBadgeFragmentHTML ou GetListFragmentHTML et poussez-le avec TsgcHTMX_Engine_Server.PushFragment ou BroadcastFragment, au lieu de réafficher la page. UnreadCount compte les éléments dont Read vaut False.

Éditions et canaux

L'unité se compile lorsque SGC_HTML est défini, ce que sgcVer.inc ne fait pas pour Android et iOS. Elle fonctionne sur toutes les éditions, via WebSocket ou événements envoyés par le serveur. sgcHTML est un pack autonome, vendu indépendamment de sgcWebSockets.

Page ou push

La boîte de réception ne choisit pas elle-même entre la page et un push : c'est TsgcHTMLComponent_Notification qui le fait, voir Notification et WebPush. Les canaux souhaités par chaque utilisateur se définissent dans NotificationPreferences.

Continuez l'exploration

Aide en ligneRéférence API complète et guide d’utilisation pour ce composant.
Tous les composants sgcHTMLParcourez la matrice complète des fonctionnalités de plus de 80 composants.
Télécharger la version d'essai gratuiteLa version d'essai de 30 jours fournit les projets de démonstration 60.HTML, dont 17.FieldService, qui utilise la boîte de réception.
TarifsLicences Single, Team et Site avec code source complet.
Meilleur rapport qualité-prix : All-AccessTous les produits eSeGeCe, Support Premium inclus, à partir de €1,059/an.
Voir les tarifs All-Access

Prêt à démarrer ?

Téléchargez la version d'essai gratuite et commencez à créer des interfaces web en Delphi, C++ Builder et .NET.