NotificationInbox
TsgcHTMLComponent_NotificationInbox: dzwonek z plakietką nieprzeczytanych i rozwijaną listą powiadomień jednego użytkownika, w Delphi, C++ Builder i .NET. Twoja aplikacja przechowuje wiersze, a komponent je renderuje.
TsgcHTMLComponent_NotificationInbox: dzwonek z plakietką nieprzeczytanych i rozwijaną listą powiadomień jednego użytkownika, w Delphi, C++ Builder i .NET. Twoja aplikacja przechowuje wiersze, a komponent je renderuje.
Biblioteka niczego nie przechowuje. Twoja aplikacja odpowiada na OnLoadNotifications wierszami, które przechowuje, a przez OnMarkRead i OnMarkAllRead dowiaduje się, co zrobił użytkownik, aby mogła to zapisać. Komponent renderuje interfejs i nie wymusza autoryzacji. Działa w każdej edycji, przez WebSocket lub Server-Sent Events.
TsgcHTMLComponent_NotificationInbox (jednostka sgcHTML_Component_NotificationInbox)
Znaczniki listy rozwijanej Bootstrap: dzwonek, plakietka nieprzeczytanych i lista
Delphi, C++ Builder, .NET
Nadaj skrzynce InboxID, wypełnij ją z własnego magazynu w OnLoadNotifications, zapisz to, co zrobił użytkownik, w OnMarkRead i OnMarkAllRead, a odesłane akcje kieruj do ProcessAction z użytkownikiem pobranym z sesji.
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());
Składniki, po które sięgasz najczęściej.
Items to kolekcja TsgcHTMLInboxItems; każdy TsgcHTMLInboxItem ma Id, Title, Text, Timestamp, Url, Icon i Read. Wszystko w wierszu to dane i jest escapowane podczas renderowania, także Icon: przekaż dosłowny glif, nigdy encję HTML ani znaczniki. Url jest oczyszczany, a linki javascript: i data: są odrzucane.
Komponent przechowuje tylko to, co renderuje. OnLoadNotifications(aUserID, aList) jest wywoływane z już wyczyszczonym aList: wypełnij je powiadomieniami użytkownika, od najnowszych. OnMarkRead(aUserID, aNotificationID) jest wywoływane po oznaczeniu elementu jako przeczytanego, a OnMarkAllRead(aUserID) po oznaczeniu wszystkich.
LoadNotifications(aUserID), MarkRead(aUserID, aNotificationID) i MarkAllRead(aUserID) wykonują pracę. ProcessAction(aUserID, aAction, aNotificationID) kieruje jedną odesłaną akcję do właściwej z nich i zwraca False, gdy akcja nie jest akcją skrzynki, dzięki czemu możesz dalej szukać jej właściciela.
Lista rozwijana odsyła inboxMarkRead (pola action, inbox, id), inboxMarkAllRead i inboxRefresh (pola action, inbox) jako formularze data-sgc-ws-send. Pole inbox niesie identyfikator elementu skrzynki, która wyrenderowała formularz, czyli InboxID, gdy go ustawisz, i dzięki niemu strona z kilkoma skrzynkami kieruje akcję do właściwego komponentu.
Komponent renderuje interfejs i nie wymusza autoryzacji. Każda akcja podróżuje jako dane wysyłane przez klienta, więc wrogi klient może sfałszować dowolną akcję i dowolny identyfikator powiadomienia. W znacznikach nie zapisano żadnego identyfikatora użytkownika: weź działającego użytkownika z sesji żądania (sgcHTMLRequestSession), nigdy z formularza, i sprawdź, czy użytkownik jest właścicielem otrzymanego identyfikatora powiadomienia, zanim cokolwiek zapiszesz.
Title to nagłówek listy rozwijanej, EmptyText tekst zastępczy, gdy nie ma nic do pokazania, a BellIcon glif wyzwalacza, zaufane znaczniki z domyślną encją HTML. MaxItems ogranicza widoczne wiersze (domyślnie 10, 0 pokazuje wszystkie), ShowMarkAllRead i ShowBadge są domyślnie włączone, a AddNotification(aId, aTitle, aText, aTimestamp, aUrl, aIcon) dodaje wiersz albo aktualizuje ten o tym samym identyfikatorze.
Każde powiadomienie, plakietka i lista mają stabilny identyfikator elementu. Po jednej zmianie wyrenderuj tylko znaczniki, których ona dotyczy, za pomocą GetItemFragmentHTML(aId), GetBadgeFragmentHTML lub GetListFragmentHTML i wypchnij je przez TsgcHTMX_Engine_Server.PushFragment lub BroadcastFragment, zamiast renderować stronę od nowa. UnreadCount liczy elementy, w których Read ma wartość False.
Jednostka kompiluje się, gdy zdefiniowane jest SGC_HTML, czego sgcVer.inc nie robi dla Androida i iOS. Działa w każdej edycji, przez WebSocket lub Server-Sent Events. sgcHTML to samodzielny pakiet, sprzedawany niezależnie od sgcWebSockets.
Skrzynka sama nie wybiera między stroną a push: robi to TsgcHTMLComponent_Notification, zobacz Notification i WebPush. Które kanały chce każdy użytkownik, ustawia się w NotificationPreferences.
| Pomoc onlinePełna dokumentacja API i przewodnik użytkowania tego komponentu. | Otwórz | |
| Wszystkie komponenty sgcHTMLPrzejrzyj pełną matrycę funkcji 80+ komponentów. | Otwórz | |
| Pobierz bezpłatną wersję próbną30-dniowa wersja próbna zawiera projekty demonstracyjne 60.HTML, w tym 17.FieldService, który używa skrzynki. | Otwórz | |
| CennikLicencje Single, Team i Site z pełnym kodem źródłowym. | Otwórz |