* Add capacity `modify-group-manager`
* Check `modify-group-manager` (backend)
* Check `modify-group-manager` (frontend)
* Update tests
* Rename AdminPermissions to mjs
* Add `ol-adminCapabilities` in frontend tests
* Allow modifying group managers if `adminRolesEnabled` is false
* Add `adminPrivilegeAvailable` check
* Update: set `ol-canModify` boolean instead of `ol-adminCapabilities`
* Mock `hasAnyAccess`
* Use `hasAdminCapability` helper
* Add `ol-canModify` to types
* Remove `isAdminMiddleware` as we don't want to relax the permissions for now
* Fix: pass `res` to `hasAnyAccess` (!!)
* * Check `hasWriteAccess` (`hasAdminCapability('modify-group-manager')` or `staffAccess.groupManagement`) in the Pug file
* Fix: Check `hasWriteAccess` in the publisher and institution pug files (!)
* Revert `hasAnyAccess` changes
* Rename `ol-canModify` to `ol-hasWriteAccess` for consistency with other variables
* Remove redundant file AdminPermissions.mjs
* Update unit test
* Revert changes to UserMembershipController.test.mjs
* Rename to `requireGroupManagersWriteAccess`
GitOrigin-RevId: f3f0b1b17abd1d2f0c363688e87d9063de886e3c
75 lines
1.9 KiB
TypeScript
75 lines
1.9 KiB
TypeScript
import moment from 'moment'
|
|
import { useCallback } from 'react'
|
|
import { useTranslation } from 'react-i18next'
|
|
import { User } from '../../../../../types/group-management/user'
|
|
import OLFormCheckbox from '@/shared/components/ol/ol-form-checkbox'
|
|
import MaterialIcon from '@/shared/components/material-icon'
|
|
|
|
type GroupMemberRowProps = {
|
|
user: User
|
|
selectUser: (user: User) => void
|
|
unselectUser: (user: User) => void
|
|
selected: boolean
|
|
hasWriteAccess: boolean
|
|
}
|
|
|
|
export default function UserRow({
|
|
user,
|
|
selectUser,
|
|
unselectUser,
|
|
selected,
|
|
hasWriteAccess,
|
|
}: GroupMemberRowProps) {
|
|
const { t } = useTranslation()
|
|
|
|
const handleSelectUser = useCallback(
|
|
(event: React.ChangeEvent<HTMLInputElement>, user: User) => {
|
|
if (event.target.checked) {
|
|
selectUser(user)
|
|
} else {
|
|
unselectUser(user)
|
|
}
|
|
},
|
|
[selectUser, unselectUser]
|
|
)
|
|
|
|
return (
|
|
<tr key={`user-${user.email}`} className="managed-entity-row">
|
|
<td className="cell-checkbox">
|
|
{hasWriteAccess && (
|
|
<OLFormCheckbox
|
|
autoComplete="off"
|
|
checked={selected}
|
|
onChange={e => handleSelectUser(e, user)}
|
|
aria-label={t('select_user')}
|
|
data-testid="select-single-checkbox"
|
|
/>
|
|
)}
|
|
</td>
|
|
<td>{user.email}</td>
|
|
<td className="cell-name">
|
|
{user.first_name} {user.last_name}
|
|
</td>
|
|
<td className="cell-last-active">
|
|
{user.last_active_at
|
|
? moment(user.last_active_at).format('Do MMM YYYY')
|
|
: 'N/A'}
|
|
</td>
|
|
<td className="cell-accepted-invite">
|
|
{user.invite ? (
|
|
<MaterialIcon
|
|
type="clear"
|
|
accessibilityLabel={t('invite_not_accepted')}
|
|
/>
|
|
) : (
|
|
<MaterialIcon
|
|
type="check"
|
|
className="text-success"
|
|
accessibilityLabel={t('accepted_invite')}
|
|
/>
|
|
)}
|
|
</td>
|
|
</tr>
|
|
)
|
|
}
|