From 2a005646f3d0ea5540794a938da8ced48b894a62 Mon Sep 17 00:00:00 2001 From: riyadhafraa <49757212-riyadhafraa@users.noreply.replit.com> Date: Fri, 1 May 2026 14:58:32 +0000 Subject: [PATCH] Task #196: Add inline "Recent activity" sections to admin detail panels - Added shared `RecentActivityForTarget` component in `artifacts/tx-os/src/pages/admin.tsx` that lists the 10 most recent audit entries for a given (targetType, targetId), reusing `formatAuditSummary` for consistent wording with the audit log section, plus actor + timestamp metadata. Renders loading / empty / list states with stable data-testids. - Added `openAuditLogForTarget(targetType, targetId)` helper inside `AdminPage`. Writes the URL hash with `section=audit-log&targetType=&targetId=` BEFORE calling `setSection("audit-log")` so the existing section-sync effect (which would otherwise drop section-scoped params on a section change) preserves the deep-link parameters. Also closes any open editor modals. - Wired the component into all five entity detail panels: * App edit modal * Service edit modal * `UserGroupsEditor` (user edit) * `GroupDetailEditor` (history tab) * Role edit dialog GroupsPanel and RolesPanel previously took no props; both now accept and forward an `onOpenAuditLogForTarget` prop. `OpenAuditLogForTarget` type is shared. - Added i18n keys `admin.audit.recent.{title,loading,empty,viewAll,viewAllAria}` in both `en.json` and `ar.json`. - Verified end-to-end via Playwright runTest: deep-link hash, modal closure, and audit-log filter pre-population all work for app/service/group/role/user panels. No backend changes required (the existing `targetType`/`targetId` filter on `GET /api/audit` was already supported). Replit-Task-Id: c03451f9-a6bb-4dd4-b082-f34ce3b6001d --- artifacts/tx-os/public/opengraph.jpg | Bin 25908 -> 24561 bytes artifacts/tx-os/src/locales/ar.json | 7 + artifacts/tx-os/src/locales/en.json | 7 + artifacts/tx-os/src/pages/admin.tsx | 234 ++++++++++++++++++++++++++- 4 files changed, 243 insertions(+), 5 deletions(-) diff --git a/artifacts/tx-os/public/opengraph.jpg b/artifacts/tx-os/public/opengraph.jpg index 335bec3cee1342ac80798e5ab2c3d00d9b922f84..3c74bc774ba1a685a4205304d6bf08128f639274 100644 GIT binary patch literal 24561 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

C^R)?9<>p`)zx!qrJZ;U$6g{`7gw?oh(vZO zs5y8x1hAO(tf!covcx2xDo@;C-=||S(3-Cwdi!=C<;$$eIqWN3TD3}&t&wvIjGXKv zMzUm&uUy{CAWrpdOf3={zUAIE_8rBQOwE4BOr~?msD=8@S zoVn4uf|9fA#;^j%{9+WRxl`b&+VC(DX;(xiuj2IVb1Wz zf&Q>4w6Mljj_e#L8p9g;XiFyzkO%_#wxwacH0JsuDCkC9qNbn9mrWb9cw^aX zQ(roAXJt0VCfb&C@i>tZUz?5CY3|@3r1)13+$m=c*$ha-NQO18kx}2qk$-q$r0^8PmoBcMIa}m5_`_SCXm68zz_%aIg5tn zWO$BDg}nx_OCGpmnNhb;fboI9C|NWa?kXAK9-R$>MnE7`iJAcpCv&{3z}z{&=;Z7m z0CKJZPtwDq9bQ-bvDVDNC_4Yb^Jqh3axKSQQ&7MGf7~xj8u7qLBss)Jd^7XQACZ)7 zo4`l*iCeNwW?}kT9Iu-?T4EobUm0G+#1YiZC7Vlx(TewW%JFkmU7R+Lu}#xc_45r` zp#HB3jTXK&vQ_Pi2~{Zce=*(M<5QjWmAKvCrIh)8szX?##F*&X=$E7AbE7wg3lY5a z4aD;gx3k%HNvHH$hQ*c;d(+(`)_-_l(I-juL*JTLz}N7c>)xBR z4pFjsSIBX1xN7H(b0E^TGfJg*OSTn$(u*wWBnhlxk8tPPraH~*mcmRU~~`ZA7V1qlJ~$rPN3VbXM|bY}N{I6S^m>yvML(|q_qy{GB!NM;j3Ys$N0 zJBRgNT)=LLfyL@E;rrj=Q-J+;8og#yv6H%}$)eO*Q>A z74KJ@R*YA|bY)oNM-k;p@Y8cU_maahXTN)I+o7d=*4);OC*!2$l{{_Su#M9%aJ;!* zTncNj5)0lf-xQxmbMortzELdlY5v2h=t$F1AHF1FYKsr1#eYmM=z6A_eQJCL$v+hr z7P{%A)t@pV!pZ)5xn0A_G~s)~aFCy1YTPZy7l;V=)%ZM;Otqg<`ke1P_(n$7Z{$H6 z;!y|PlB-5(@<}hJrQY(sZ*m&16V=6D;ASz>y)L``HY;vxf$w~UyT^%N#uHauHrUNX zyyzC<>s@PHmjoT-tfG?r)|c=lBD_8_%N>y(d$DLbuaogCe5$cnAxxacd`gec$kxJ| znR==CwkDf-uNJOp)vbKn2~Vn9%bOM96H2rSQ&OA;#TV?45=~w9hxRLd+vD?ReH~@W z7dXRSm;FQk%P(r+Y;x&Cm_NW=R)&H z+xszLg_GmB(EriP)rUis_kDU}r8Z?4!<5*pMXpXvB)!;>Hd^FmFjJZn#kest$d)YK z(!8~5Nz=0OGRw}GOl}&ZY-G+9q0msIBCBaq>rT66+ui$n#_m4X^WSrMp6i+GnmNDu zo!^;juFv=N{J!7wagsfLL~gquTleanWZ*&%bXZJh49H%ObzZz7nsmPK^A;}G*ga$8 z+oX@qk5NXWTvSJnS(YaGzrH5rlTbCA&Of;|w4ataV(gLl-M6P}e!Owx+?k1!>Ga`W zN8-LHo~fOF-u3QkxB6LT)}0>i8MakM%6`g3^Z9_=qBk)`w3woZ7{QEd94~EOz>Pa& zw^E)%wee|x=O%WIoyesJezNZ$4_nep##mp_Hb0wkjWakmJIol~JMdwqX8;M=yN|D& zO#bEKUrP?Pj=$BNTQg--9chS%c z>_8IH=H>_jp1V~j$DaD5BE&+3^bw0yI~Uw5=p&+JgzuY*d7z#c%nrL^n^4Yvt`yk= zE8XAmSZvHS9@Z#XklyvX;<+569Iy&yBg#Ija3XkoQn$OpKa4Tr{{3^5Td9OMYzbNxM5+%!HInb=jJJMN#`~V5zLZ`lI6$dIcRftnRdrA8>ZhsLC6>fN zN0hG+vbw5#5;R2JgXC?Kg>1mPZJcd)7g|5gE>5g`cqD77`;m7k0}nSljdwm2j$-JR zZzCi>U%AzDUG+grLIXU+kx6~}WB<#k-9K(k7m1>-r1wsIz1^*=^Ap;?1!{!BOj

BG2bjCccA5tMS8SgZv$egR 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 { + if (typeof window !== "undefined") { + const params = new URLSearchParams( + window.location.hash.replace(/^#/, ""), + ); + params.set("section", "audit-log"); + params.set("targetType", targetType); + params.set("targetId", String(targetId)); + window.history.replaceState(null, "", `#${params.toString()}`); + } + // Close any open editor modals so the audit-log view is unobstructed. + setEditingApp(null); + setEditingService(null); + setSection("audit-log"); + }; + const handleSaveApp = () => { if (!editingApp) return; if (editingApp.id) { @@ -1193,6 +1217,17 @@ export default function AdminPage() { }} /> )} + {editingApp.id !== undefined && ( + + openAuditLogForTarget("app", editingApp.id!) + } + /> + )}
@@ -1244,6 +1279,17 @@ export default function AdminPage() { onCheckedChange={(v) => setEditingService({ ...editingService, form: { ...editingService.form, isAvailable: v } })} />
+ {editingService.id !== undefined && ( + + openAuditLogForTarget("service", editingService.id!) + } + /> + )}
@@ -1586,10 +1632,15 @@ export default function AdminPage() { }, ) } + onOpenAuditLogForTarget={openAuditLogForTarget} /> )} - {section === "groups" && } - {section === "roles" && } + {section === "groups" && ( + + )} + {section === "roles" && ( + + )} {section === "audit-log" && } {section === "settings" && ( @@ -3323,16 +3374,23 @@ function DependencyRow({ // ===== Users Management Panel ===== type UserSortKey = "username" | "email" | "createdAt"; +type OpenAuditLogForTarget = ( + targetType: "app" | "service" | "user" | "group" | "role", + targetId: number, +) => void; + function UsersPanel({ currentUserId, highlightedUserId, userRowRefs, onIssueResetLink, + onOpenAuditLogForTarget, }: { currentUserId: number; highlightedUserId: number | null; userRowRefs: React.MutableRefObject>; onIssueResetLink: (userId: number, username: string) => void; + onOpenAuditLogForTarget: OpenAuditLogForTarget; }) { const { t, i18n } = useTranslation(); const lang = i18n.language; @@ -3742,6 +3800,7 @@ function UsersPanel({ groups={groups ?? []} onClose={() => setEditingUser(null)} onSaved={() => { invalidateUsers(); setEditingUser(null); }} + onOpenAuditLogForTarget={onOpenAuditLogForTarget} /> )} @@ -3798,11 +3857,13 @@ function UserGroupsEditor({ groups, onClose, onSaved, + onOpenAuditLogForTarget, }: { user: UserProfile; groups: Group[]; onClose: () => void; onSaved: () => void; + onOpenAuditLogForTarget: OpenAuditLogForTarget; }) { const { t, i18n } = useTranslation(); const { toast } = useToast(); @@ -4047,6 +4108,13 @@ function UserGroupsEditor({ return r ? r.name : `#${id}`; }} /> + onOpenAuditLogForTarget("user", user.id)} + /> +
+ ); +} + // Parses targetType / targetId values out of the admin page URL hash so the // audit log panel can deep-link to a pre-filtered view (e.g. when an admin // clicks a dependency chip on a forced-delete row).