feat(APP-1003): DAO permissions viewer with list and graph views - #1276
Open
evanaronson wants to merge 57 commits into
Open
feat(APP-1003): DAO permissions viewer with list and graph views#1276evanaronson wants to merge 57 commits into
evanaronson wants to merge 57 commits into
Conversation
Refinement pass over the permissions graph (APP-942 finished in #1238). - Consolidate the view into a single graph screen driven by toggles; remove the Granted/Other tabs - Treat each permission as a distinct node instead of merging under a shared "anyone" header - Standardize resource-link display and show the permission ID above the name - Replace explicit "no condition"/"no description" labels with a dash placeholder - Add graph full-screen mode with Escape-to-exit - Add informational tooltips to the Who / subplugin filter toggles - Move DAO self-permission stacks south of the DAO node and align the stack handles - Filter uninstalled/stale plugins out of the graph data
…raph-finish # Conflicts: # apps/app/package.json # pnpm-lock.yaml
… drill-in dialogs Owner rejected the previous feedback-round implementation: no dialog was asked for, the summary card duplicated the details, and the details sat behind a click. Corrected to the graph detail-card pattern: below md each row renders the permission name as its header, the existing details definition list directly (extracted verbatim to the shared PermissionDetailsList, also used by the expanded accordion), and a Details/Condition toggle only when a condition exists that switches to the interior condition component. The PERMISSION_DETAILS dialog, its registry entries, and the PermissionDetailContent initialTab addition are removed. On md+ the two-column expanded layout is preserved with a blank right column when no condition exists. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…subplugin filter to Where, sort list by Where Owner feedback round 2, proof-first. Unrecognized conditions (payload cannot be resolved) behave like unconditional grants for the breakdown affordances — blank right column on desktop, no toggle on the mobile card or graph detail card — while the details list still names them with their address; present-but-unregistered condition types keep their breakdown. The hide-subplugin toggle now hides rows only when the target (Where) is a subplugin, with the caller (Who) never counting; isSubpluginEndpoint and rowTouchesSubplugin fold into one rowTargetsSubplugin predicate and the tooltip copy states the Where-based rule. The list view sorts rows by the resolved Where label (stable, case-insensitive, presentation-only — both views still receive the identical filtered row array). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: Evan Aronson <93671071+evanaronson@users.noreply.github.com>
…diation.md Signed-off-by: Evan Aronson <93671071+evanaronson@users.noreply.github.com>
…details list Owner-approved simplification round. Test intent is unchanged — the same fixtures and assertions move into it.each tables (filter keeps/ hides guard tables, entity visuals, graph layout/handle pairs, SPP Safe-group pairs), five worthless or fully-subsumed tests are deleted after per-assertion subsumption checks, and two real gaps close: a new permissionCondition dispatch suite pins all four outcomes (making the 'none' branch reachable, which is why NoConditionSlot stays registered), and getPermissionRowToggleAvailability gains direct unit coverage so the page tests only wiring. The unfailable selector- narrowing test gains a falsifying assertion and the structuredClone polyfill lives once in jest setup. Production: PermissionSummaryField is deleted (its labels were unreachable at every breakpoint since mobile left the accordion), and the graph detail card renders the shared PermissionDetailsList instead of its own hand-rolled list — sentinel rows there adopt the list rendering (single label plus copy affordance) and the redundant permissionName prop is gone. Net -597 lines (-89 production, -508 test); tests 221 -> 218. Cumulative production delta vs the audit base is now net -38 lines. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Safe branch hoisted brandId into the label but then rendered parentPluginName as the secondary line, so a Safe body inside a process displayed the process name (e.g. "Core Governance") underneath its address — reading as though the address were that plugin, and colliding with the Where row that legitimately carries the same name. The backend field is correct; the detail slot names the address, not its container. The Safe brand table asserted the label but never the detail name, which is how this survived the earlier brand-precedence fix; both cases now carry a parentPluginName fixture and pin detailName. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…prefix condition slot id
…aceholder label Unknown who/where endpoints rendered a literal "Unknown address" label in the collapsed cells and graph nodes — both from the local resolver fallback and from the backend's own hardcoded generic label, which is now treated as "no name" like the existing "Process internal" handling. An unresolved address presents as its truncated address; the expanded row already suppresses the duplicate description line. "Unresolved contract" stays: the backend recognized a contract there, which is information the address alone does not carry. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This was referenced Aug 3, 2026
Added new permission constants for VeGovernance and linked accounts. Signed-off-by: Evan Aronson <93671071+evanaronson@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds the DAO settings permissions page: list and graph views of the DAO's on-chain permissions, backed by a single permissions fetch, with two explicit visibility toggles (hide DAO-granted rows, hide rows targeting subplugins) applied identically to both views.
What this contains
(who, where)hub nodes (all of an actor's grants on a body stack into one node), and the bundle lazy-loads behind the graph view.DefinitionList.Itemlink/description/copyValue; condition and token addresses link to the explorer; Safe bodies resolve through the sharedPermissionEntityBrandIddomain type.domain/enum/, shared test generators.Verification
tsc --noEmitclean; biome clean.