)]}'
{
  "commit": "75b365de4d63db567ce0a2122fd599b656bc60c2",
  "tree": "b82a67ddd7fc061a5459228d7b9457950308c85a",
  "parents": [
    "bb9b0ba3d1fd9eb708a905a89385b86385db6f07"
  ],
  "author": {
    "name": "Nipuna Bandara",
    "email": "137793168+NipunaDB@users.noreply.github.com",
    "time": "Mon Jul 13 11:25:55 2026 +0530"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon Jul 13 01:55:55 2026 -0400"
  },
  "message": "Add Users \u0026 Permissions admin section with role management (#520)\n\n* Add Users \u0026 Permissions admin section with role management\n\nAdds User Management and Role Management tabs under /admin/users, backed\nby a shared client-side context: browsable/filterable users table with\nroles and external identities, a role-permission matrix mapped to the\nportal\u0027s left-nav sections, and a create/edit role dialog that can assign\nroles to users directly.\n\n* Replace role-assign dropdown with a Manage Roles modal\n\nRoles are now assigned/unassigned from a centered \"Manage roles\" modal\nopened via an \"Edit roles\" button in the user drawer, instead of an\ninline dropdown in the users table. Each role renders as its own card\nshowing only the privileges it actually grants, changes are buffered\nlocally and only applied on Save, and the modal\u0027s backdrop now renders\ncorrectly when nested inside the non-modal side drawer.\n\nAlso moves the users-admin context, types, and permission helpers out\nof the admin/users route into @/shared/users-admin so the account\ndropdown\u0027s new \"My Permissions\" dialog can reuse them, and lifts\nUsersAdminProvider up to the portal layout.\n\n* Add Apache license headers to the users-admin source files\n\nThese files were added without the ASF header used elsewhere in the repo.\n\n* Remove My Permissions item from the account menu\n\nDrops the dropdown entry and its now-unused dialog; permissions are\nalready reviewable from the Users \u0026 Permissions admin drawer.\n\n* Gate the Users \u0026 Permissions nav item behind read:User\n\nEvery other admin nav entry already checks an ability; this one had\nnone, so it rendered for any signed-in user regardless of privileges.\n\n* Scope UsersAdminProvider to the admin/users layout\n\nAddresses review feedback: the mock users-admin state was wrapping the\nwhole portal layout, but only pages under admin/users ever read it.",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4ae8d4c5a2179a6bf036572ac4a81e790e92fd23",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/UsersNav.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0e7e087b32be73c1c5cefe9b9c87c33ae06744fa",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/layout.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0f5633ead0af469c73a732c14c093ef5a93528e5",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/management/IdentitiesCell.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7b5732850a3a01d4429ccd691d3789bb77c623a2",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/management/PermissionsDrawer.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cb27a86a0862dcf7cb49ec82bc84fc7dc4012a96",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/management/RoleAssignMenu.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7b221d892be4bb4c0050a8a46776b5776003867a",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/management/RolesCell.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "402e0da7e98bd47ca24a42aab1f9b8369fb7e0b8",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/management/UsersTable.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "59f296fd7ab7d5739c68c7d53b57f19b484c15b4",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/management/identities.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "321e17ee01258552fe5863b1ce7380bdf03aca77",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/management/page.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1b71f6315d28c20b5c979c5710f93503d61f1be4",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/page.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "29a1bcf86bd261beeac176dcc032ff2ef4a8b96d",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/roles/PermissionMatrixEditor.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0b0b78d0c432df4800d2a978163e23afdb88f2b0",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/roles/RoleCard.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f57f6406c64958cfb6d2bf939d7f7a75584be9cc",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/roles/RoleFormDialog.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "26c04a0256f4326277010e39c56633326edbd9c7",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/roles/RolesGrid.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "680e3c1659f73d83870a2b52d5988125d809fa4c",
      "new_mode": 33188,
      "new_path": "web/src/app/(portal)/admin/users/roles/page.tsx"
    },
    {
      "type": "modify",
      "old_id": "7bac8ac6648f1951e64196e17060d13a968014fa",
      "old_mode": 33188,
      "old_path": "web/src/features/core/allocations/components/AllocationsList.tsx",
      "new_id": "35df38d9c6a8b60df3dbfde441f60bc85af76515",
      "new_mode": 33188,
      "new_path": "web/src/features/core/allocations/components/AllocationsList.tsx"
    },
    {
      "type": "modify",
      "old_id": "74dce1ea66b8946bac6521e5313a4a472a2515b8",
      "old_mode": 33188,
      "old_path": "web/src/shared/layout/UserPill.tsx",
      "new_id": "3811c4a289aa6e058b58369ef41856b6298107c1",
      "new_mode": 33188,
      "new_path": "web/src/shared/layout/UserPill.tsx"
    },
    {
      "type": "modify",
      "old_id": "9934686b32ee0aabe0117f74db3bea2455775187",
      "old_mode": 33188,
      "old_path": "web/src/shared/layout/nav.ts",
      "new_id": "99d0c69918d040230ce8a427ceb5c97d3736cc5c",
      "new_mode": 33188,
      "new_path": "web/src/shared/layout/nav.ts"
    },
    {
      "type": "modify",
      "old_id": "cbd5e70eca7c3deb71bcdc7b19917a689814cd3d",
      "old_mode": 33188,
      "old_path": "web/src/shared/ui/DataTable.tsx",
      "new_id": "475074258e7389fd18191c72128b6c104d08718b",
      "new_mode": 33188,
      "new_path": "web/src/shared/ui/DataTable.tsx"
    },
    {
      "type": "modify",
      "old_id": "acca24514f99c192e7d96ed440ea24c1cc0deff9",
      "old_mode": 33188,
      "old_path": "web/src/shared/ui/SideDrawer.tsx",
      "new_id": "24d60d18e465d07175f31b42a598da50c6b12b57",
      "new_mode": 33188,
      "new_path": "web/src/shared/ui/SideDrawer.tsx"
    },
    {
      "type": "modify",
      "old_id": "6a76d934ba2fd3b2e2c5126fb98f409d7a787e02",
      "old_mode": 33188,
      "old_path": "web/src/shared/ui/dialog.tsx",
      "new_id": "a6a6014078ff8930da61f0c7eedeba416b06f707",
      "new_mode": 33188,
      "new_path": "web/src/shared/ui/dialog.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "74a80cd3191f103e6757448b97266702c74e1c6b",
      "new_mode": 33188,
      "new_path": "web/src/shared/users-admin/PermissionRW.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "59d91e4511b3859aa4863f43de2ee2878d77d031",
      "new_mode": 33188,
      "new_path": "web/src/shared/users-admin/UsersAdminContext.tsx"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "12a6b4fdd41ff6a8f63313007fc80b44863ee86c",
      "new_mode": 33188,
      "new_path": "web/src/shared/users-admin/permissions.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ff09246ceb0f4145fb818cf30f10827555dc0fc7",
      "new_mode": 33188,
      "new_path": "web/src/shared/users-admin/roles-catalog.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e3d5533c4e2ff07bee2fddb30cb6fba508cf35bc",
      "new_mode": 33188,
      "new_path": "web/src/shared/users-admin/seed-users.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "64b484c3bbb039cba00560a0cf13b6273fe0c3d3",
      "new_mode": 33188,
      "new_path": "web/src/shared/users-admin/types.ts"
    }
  ]
}
