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

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.

Klasa komponentu

TsgcHTMLComponent_NotificationInbox (jednostka sgcHTML_Component_NotificationInbox)

Renderuje

Znaczniki listy rozwijanej Bootstrap: dzwonek, plakietka nieprzeczytanych i lista

Języki

Delphi, C++ Builder, .NET

Utwórz go, obsłuż trzy zdarzenia, skieruj akcje

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

Kluczowe właściwości i metody

Składniki, po które sięgasz najczęściej.

Pozycje

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.

Zdarzenia magazynu

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.

Akcje po stronie serwera

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.

Akcje, które odsyła

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.

Autoryzacja

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.

Wygląd

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.

Aktualizacje na żywo

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.

Edycje i kanały

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.

Strona czy push

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.

Poznawaj dalej

Pomoc onlinePełna dokumentacja API i przewodnik użytkowania tego komponentu.
Wszystkie komponenty sgcHTMLPrzejrzyj pełną matrycę funkcji 80+ komponentów.
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.
CennikLicencje Single, Team i Site z pełnym kodem źródłowym.
Najkorzystniejsza oferta: All-AccessWszystkie produkty eSeGeCe, ze wsparciem Premium w cenie, już od €1,059 rocznie.
Zobacz cennik All-Access

Gotowy, aby zacząć?

Pobierz bezpłatną wersję próbną i zacznij budować interfejsy webowe w Delphi, C++ Builder i .NET.