Ostatni wpis z tej serii o 25 nowych komponentach sgcHTML. Kończymy trzema, których wcześniej czy później potrzebuje każdy panel administracyjny: kto jest teraz online, kto ma prawo robić co, oraz tabela, w której faktycznie zarządzasz kontami. Wszystkie trzy przesyłają aktualizacje na żywo przez ten sam kanał WebSocket, którego używają już Twoje ekrany czatu i postępu zadań, więc ten zestaw pasuje bezpośrednio do komponentów z poprzednich wpisów.
Presence — lista obecności online w czasie rzeczywistym
TsgcHTMLComponent_Presence renderuje albo nakładający się stos awatarów, albo listę nazwa-status, ograniczoną przez MaxVisible z chipem przepełnienia „+N”. AddUser dodaje lub aktualizuje wpis na liście, SetUserStatus aktualizuje tylko kropkę statusu, a GetUserFragmentHTML przesyła tę pojedynczą zmianę do każdego połączonego klienta.
uses
sgcHTML_Component_Presence;
var
oPresence: TsgcHTMLComponent_Presence;
begin
oPresence := TsgcHTMLComponent_Presence.Create(nil);
try
oPresence.PresenceID := 'roster';
oPresence.Layout := plAvatars;
oPresence.MaxVisible := 5;
oPresence.Title := 'Online';
oPresence.AddUser('u1', 'Ana Torres', psOnline);
oPresence.AddUser('u2', 'Marc Bell', psAway, '', 'Back at 3pm');
oPresence.AddUser('u3', 'Kenji Ito', psBusy);
WebModule.Response := oPresence.HTML; // avatar stack + scoped CSS
finally
oPresence.Free;
end;
end;
// Push a status change to every connected client, no full re-render:
oPresence.SetUserStatus('u2', psOnline);
TsgcHTMX_Engine_Server.BroadcastFragment(oPresence.GetUserFragmentHTML('u2'));
RolesPermissions — macierz uprawnień, a nie formularz pełen checkboxów
TsgcHTMLComponent_RolesPermissions układa role w kolumnach, a uprawnienia w wierszach (pogrupowanych według kategorii), z polem wyboru na każdym przecięciu. AddRole i AddPermission budują obie osie, SetGrant zaznacza początkowe komórki, a każde przełączenie po stronie klienta trafia na serwer jako payload JSON, który Twój handler musi autoryzować przed zastosowaniem za pomocą ProcessGrantChanged.
uses
sgcHTML_Enums, sgcHTML_Component_RolesPermissions;
var
oMatrix: TsgcHTMLComponent_RolesPermissions;
begin
oMatrix := TsgcHTMLComponent_RolesPermissions.Create(nil);
try
oMatrix.MatrixID := 'acl';
oMatrix.StickyHeader := True;
oMatrix.AddRole('admin', 'Administrator').Color := hcDanger;
oMatrix.AddRole('editor', 'Editor');
oMatrix.AddRole('viewer', 'Viewer');
oMatrix.AddPermission('users.edit', 'Edit users', 'Users');
oMatrix.AddPermission('users.delete', 'Delete users', 'Users');
oMatrix.AddPermission('billing.view', 'View invoices', 'Billing');
oMatrix.SetGrant('admin', 'users.edit', True);
oMatrix.SetGrant('admin', 'users.delete', True);
oMatrix.SetGrant('editor', 'users.edit', True);
WebModule.Response := oMatrix.HTML; // matrix table + inline script
finally
oMatrix.Free;
end;
end;
// Server-side handler for a checkbox toggle received over WebSockets.
// ALWAYS verify the acting user is authorized before applying the change:
oMatrix.ProcessGrantChanged('editor', 'users.delete', True);
UserManagement — sama tabela kont
TsgcHTMLComponent_UserManagement to tabela, w której przypisuje się te role: awatar, plakietka statusu, plakietki ról, ostatnie logowanie, pole wyszukiwania oraz rozwijane menu akcji dla każdego wiersza (edycja, wyłączenie/włączenie, reset hasła, a jeśli włączysz tę opcję, także podszywanie się pod użytkownika i usuwanie). AddUser dodaje wiersz i zwraca obiekt TsgcHTMLUser do uzupełnienia; ProcessUserAction obsługuje wszystko, co zwróci rozwijane menu wiersza, znów dopiero po Twojej własnej weryfikacji uprawnień.
uses
sgcHTML_Component_UserManagement;
var
oUsers: TsgcHTMLComponent_UserManagement;
oUser: TsgcHTMLUser;
begin
oUsers := TsgcHTMLComponent_UserManagement.Create(nil);
try
oUsers.TableID := 'users';
oUsers.AllowImpersonate := True;
oUsers.AllowDelete := True;
oUser := oUsers.AddUser('u1', 'ana.torres', 'ana@example.com');
oUser.DisplayName := 'Ana Torres';
oUser.Roles := 'admin,editor';
oUser.Status := usActive;
oUser.LastLogin := '2026-07-15 09:12';
oUsers.AddUser('u2', 'marc.bell', 'marc@example.com').Status := usInvited;
WebModule.Response := oUsers.HTML; // toolbar + table + inline script
finally
oUsers.Free;
end;
end;
// Server-side handler for an action received over WebSockets.
// ALWAYS verify the acting user is authorized before applying it:
oUsers.ProcessUserAction('userDisable', 'u2');
Zwróć uwagę na wzorzec powtarzający się zarówno w RolesPermissions, jak i w UserManagement: komponent zawsze tylko renderuje interfejs i emituje zdarzenie. Stan nie zmienia się, dopóki Twój własny kod po stronie serwera nie zdecyduje, że działający użytkownik ma prawo dokonać tej zmiany, i jawnie nie wywoła ProcessGrantChanged lub ProcessUserAction. Komponent celowo nigdy niczego za Ciebie nie autoryzuje.
To już cała seria
Dwadzieścia pięć komponentów w pięciu wpisach: structured data (TreeGrid, PivotTable, ActivityFeed, Splitter), charts and codes (Heatmap, Sparkline, CandlestickChart, TreeMap, QRCode, Barcode), form inputs (MultiSelect, ColorPicker, Slider, TimePicker, SignaturePad, Transfer), feedback and layout (Badge, PDFViewer, ContextMenu, ProgressBar, JobProgress, LogViewer) oraz dzisiejsze trzy komponenty administracyjne. Pełna macierz funkcji zawiera teraz 83 komponenty w dziewięciu rodzinach, a każdy z nich jest udokumentowany razem z QuickStart w Delphi, C++Builder i .NET na własnej stronie: Presence, RolesPermissions i UserManagement włącznie.
Masz pytania, uwagi albo potrzebujesz pomocy z migracją? Skontaktuj się z nami, odpowie Ci ktoś, kto naprawdę napisał ten kod.
