feat(FR-2225): implement role assignment management with assign/revoke#5772
Merged
graphite-app[bot] merged 1 commit intomainfrom Mar 20, 2026
Conversation
This was referenced Mar 6, 2026
Contributor
Author
5 tasks
Contributor
Coverage report for
|
St.❔ |
Category | Percentage | Covered / Total |
|---|---|---|---|
| 🔴 | Statements | 7.79% (-0.03% 🔻) |
1296/16639 |
| 🔴 | Branches | 6.84% (-0.03% 🔻) |
798/11661 |
| 🔴 | Functions | 5.23% (-0.03% 🔻) |
244/4667 |
| 🔴 | Lines | 7.56% (-0.03% 🔻) |
1225/16209 |
Show new covered files 🐣
St.❔ |
File | Statements | Branches | Functions | Lines |
|---|---|---|---|---|---|
| 🔴 | ... / AssignRoleModal.tsx |
0% | 0% | 0% | 0% |
| 🔴 | ... / RoleAssignmentTab.tsx |
0% | 0% | 0% | 0% |
Test suite run success
685 tests passing in 36 suites.
Report generated by 🧪jest coverage report action from 1a8a39a
2 tasks
920979a to
863bf54
Compare
This was referenced Mar 6, 2026
44c0fd3 to
d8ed05b
Compare
863bf54 to
9a24eae
Compare
9a24eae to
e54711e
Compare
d8ed05b to
89a0dbf
Compare
Contributor
There was a problem hiding this comment.
Pull request overview
Implements the RBAC role “Assignments” UI in the WebUI by replacing the placeholder tab content with a working assignment list and assign/revoke flows backed by new GraphQL mutations/queries.
Changes:
- Added
RoleAssignmentTabto list role assignments and revoke assignments viaadminRoleAssignments+adminRevokeRole. - Added
AssignRoleModalto search users (adminUsersV2) and assign a role viaadminAssignRole. - Wired the new tab into
RoleDetailDrawerContentand added new i18n keys (Assign,GrantedAt,SelectUser) inen/ko.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| resources/i18n/en.json | Adds new RBAC strings used by the assignment UI. |
| resources/i18n/ko.json | Adds Korean translations for the new RBAC strings. |
| react/src/components/RoleDetailDrawer.tsx | Passes fetchKey into drawer content to support refetch behavior. |
| react/src/components/RoleDetailDrawerContent.tsx | Replaces placeholder Assignments tab with RoleAssignmentTab under Suspense. |
| react/src/components/RoleAssignmentTab.tsx | New assignments table + assign/revoke mutations and confirmation flow. |
| react/src/components/AssignRoleModal.tsx | New modal for searching/selecting a user and triggering assignment. |
You can also share your feedback on Copilot code review. Take the survey.
This was referenced Mar 10, 2026
64df86a to
d38b634
Compare
e1c0760 to
654bac2
Compare
46f0b87 to
dc79fc4
Compare
654bac2 to
982439f
Compare
dc79fc4 to
a0b8a45
Compare
982439f to
5c7eb69
Compare
agatha197
previously requested changes
Mar 18, 2026
5c7eb69 to
efd10c4
Compare
a0b8a45 to
9c67966
Compare
9 tasks
efd10c4 to
ea7ddc9
Compare
9c67966 to
b9c0cf2
Compare
ea7ddc9 to
a1a2768
Compare
b9c0cf2 to
de84651
Compare
Review feedback will be addressed collectively in #6034.
Merge activity
|
#5772) Resolves #5764(FR-2225) ## Summary - Create `RoleAssignmentTab` with `useFragment` on `Role.users` sub-connection - Create `AssignRoleModal` with user search via `adminUsersV2` (email search, fullName display) - Add `adminAssignRole` and `adminRevokeRole` mutations - Revoke uses `modal.confirm` with danger styling - Wire assignment tab into `RoleDetailDrawerContent` replacing placeholder - Add i18n keys: Assign, GrantedAt, SelectUser > Note: Bulk assign/revoke (`adminBulkAssignRole`) is implemented in a separate stacked branch (`03-06-feat_add_bulk_role_assignment_mutations`) for testing isolation, as it requires backend branch `feat/BA-4877-bulk-role-gql`. ## Test plan - [ ] Verify Assignments tab shows assigned users with email, name, and granted date - [ ] Verify Add User button opens user search modal - [ ] Verify assigning a user shows success toast and refreshes list - [ ] Verify revoke button shows confirmation and removes assignment 🤖 Generated with [Claude Code](https://claude.com/claude-code)
a1a2768 to
35e2efa
Compare
de84651 to
1a8a39a
Compare
Base automatically changed from
03-06-feat_fr-2224_add_role_delete_and_purge_with_confirmation_dialogs
to
main
March 20, 2026 10:20
graphite-app Bot
pushed a commit
that referenced
this pull request
Mar 24, 2026
## Summary Resolve review feedback from RBAC stack PRs (#5767 ~ #5891) raised by @nowgnuesLee and @agatha197. ### Round 1 — Resolved Feedback | Source PR | Reviewer | Issue | Resolution | |-----------|----------|-------|------------| | #5767 | @nowgnuesLee | Remove unnecessary Suspense wrapping around RoleNodes | Removed `<Suspense>` — RoleNodes uses `useFragment` only | | #5767 | @nowgnuesLee | Override actions column pattern | Added `customizeColumns` prop to RoleNodes | | #5769 | @nowgnuesLee | `onClickEdit` position — should not be managed at Page level | Moved edit modal into `RoleDetailDrawer` | | #5769 | @nowgnuesLee | Null/missing value handling in RoleDetailDrawerContent | Added null fallbacks for `source` and `status` | | #5770 | @nowgnuesLee | RoleFormModal(edit) position — should be inside Drawer | RoleFormModal now rendered inside `RoleDetailDrawerInner` | | #5772 | @agatha197 | Modal closes on outside click | Added `maskClosable={false}` to AssignRoleModal | | #5772 | @agatha197 | Full Name filter not working in user search | Added client-side `filterOption` | | #5772 | @agatha197 | Danger button hover shows blue border | Added `danger` prop to bulk revoke button | | #5773 | @nowgnuesLee | Mutation handling pattern in CreatePermissionModal | Fixed Promise resolve/reject pattern | | #5773 | @nowgnuesLee | Use BAISelect instead of antd Select | Replaced in CreatePermissionModal | | #5778 | Copilot | i18n interpolation variables translated | Fixed back to `{{total}}`, `{{name}}` | | #5778 | Copilot | `rbac.RoleDeleted` key unused | Removed from all 19 language files | | #5782 | @nowgnuesLee | `onAssign` separate prop pattern | Replaced with `onRequestClose` pattern | | #5890 | @nowgnuesLee | Select prop passing pattern inconsistent | Unified `{...selectProps}` spread | ### Round 2 — Resolved Feedback | Source PR | Reviewer | Issue | Resolution | |-----------|----------|-------|------------| | #5891 | @agatha197 | "Deleted" vs "Inactive" terminology mismatch | Unified to "Inactive" in `RoleDetailDrawerContent` | | #5891 | @agatha197 | Search text not clearing on select | Added `setSearch('')` in `onChange` | | #5891 | @agatha197 | CreatePermissionModal/RoleFormModal close on outside click | Added `maskClosable={false}` | | #5889 | @nowgnuesLee | BAIDeploymentSelect can't show name when value is pre-set | Added `deployment(id:)` ValueQuery | | #5767 | @agatha197 | Popconfirm placement="left" | Intentional — right-fixed column | | #5891 | @agatha197 | Version controlling | Route guard `supports('rbac')` already present | | #5768 | @nowgnuesLee | Duplicate role names | `isDuplicateError()` implemented; backend constraint TBD | | #5773 | @nowgnuesLee | Error on RoleDetailDrawer open | Backend error — fix requested | | #5891 | @agatha197 | Admin role detail panel not working | Backend error — fix requested | ### Round 3 — Resolved Feedback (PR #6034 review) | # | File | Reviewer | Issue | Resolution | |---|------|----------|-------|------------| | 1 | AssignRoleModal.tsx | copilot | `filterOption` won't match full-name (server filters email only) | Removed `filterOption`, set `filterOption={false}` | | 2 | AssignRoleModal.tsx | @nowgnuesLee | Deprecated props | Removed deprecated `filterOption` callback | | 3 | AssignRoleModal.tsx | @nowgnuesLee | Use BAISelect | Replaced antd `Select` with `BAISelect` | | 4 | RoleNodes.tsx | @nowgnuesLee | `order` prop override unnecessary | Removed — inherited from BAITableProps | | 5 | RoleNodes.tsx | @nowgnuesLee | Control column should be in RBACManagementPage | Moved via `customizeColumns` | | 6 | RoleNodes.tsx | @nowgnuesLee | Use `fixed: 'left'` | Applied in RBACManagementPage control column | | 7 | RoleNodes.tsx | @nowgnuesLee | Activate/purge in RBACManagementPage | Moved via `customizeColumns` | | 8 | RoleDetailDrawer.tsx | @nowgnuesLee | Use `size` instead of deprecated `width` | Changed to `size="large"` | | 9 | RoleDetailDrawer.tsx | @nowgnuesLee | Show error instead of null when data missing | Shows `Alert` with warning message | | 10 | RoleAssignmentTab.tsx | @nowgnuesLee | Add `borderColor` to bulk revoke button | Added `borderColor: token.colorBorder` | | 11 | CreatePermissionModal.tsx | @nowgnuesLee | Why keep Promise pattern? | Explained: bridges Relay callback API with BAIModal Promise-based `onOk` | ### Verification ``` === Relay: PASS === === Lint: PASS === === Format: PASS === === TypeScript: PASS === === ALL PASS === ``` ## Test plan - [ ] Role list page loads correctly, control column renders via customizeColumns - [ ] Deactivate/activate/purge actions work from RBACManagementPage control column - [ ] Role detail drawer opens with `size="large"`, shows Alert on missing data - [ ] Edit modal opens correctly inside drawer - [ ] AssignRoleModal uses BAISelect, search clears on selection, no outside-click close - [ ] CreatePermissionModal and RoleFormModal don't close on outside click - [ ] RoleDetailDrawer shows "Inactive" for deactivated roles - [ ] BAIDeploymentSelect shows deployment name when editing existing permission - [ ] Bulk revoke button has correct border color 🤖 Generated with [Claude Code](https://claude.com/claude-code)
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.

Resolves #5764(FR-2225)
Summary
RoleAssignmentTabwithuseFragmentonRole.userssub-connectionAssignRoleModalwith user search viaadminUsersV2(email search, fullName display)adminAssignRoleandadminRevokeRolemutationsmodal.confirmwith danger stylingRoleDetailDrawerContentreplacing placeholderTest plan
🤖 Generated with Claude Code