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 : 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.
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.
TsgcHTMLComponent_NotificationInbox (unité sgcHTML_Component_NotificationInbox)
Balisage de menu déroulant Bootstrap : une cloche, un badge de non-lus et une liste
Delphi, C++ Builder, .NET
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());
Les membres que vous utilisez le plus souvent.
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.
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é.
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.
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.
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.
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.
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.
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.
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.
| Aide en ligneRéférence API complète et guide d’utilisation pour ce composant. | Ouvrir | |
| Tous les composants sgcHTMLParcourez la matrice complète des fonctionnalités de plus de 80 composants. | Ouvrir | |
| 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. | Ouvrir | |
| TarifsLicences Single, Team et Site avec code source complet. | Ouvrir |