mirror of
https://github.com/ToolJet/ToolJet
synced 2026-05-06 14:58:27 +00:00
* Fix: User group permissions error on Openshift platform (#4041) * update dockerfile for file permissions on root group * add permissions from the user group on dockerfile * bump to v1.24.4 * bump to v1.25.0 * [feature] Added pagination and filtering features to users page (#3921) * added pagination and filtering in backend * added pagination - created a seperate component for users table - added pagination * Added filter UI * temporary css fix for pagination footer * fixed pagination width issue * now result will also clear when user clicks on clear icon * Added seperate api for comment mentions * Now we can search mentions by email, first and last names * Fixed a bug - email didn't send for comment mentions * refactoring the code * resolved PR changes * Added isAdmin guard * adding some checks * fixed lint errors * added wild card search * Added no result found text * fixed failing test case * Working on PR changes * Now users table avatars will load image too * replaced skeleton classes with skeleton library component * Completed PR changes * added orderby * Fixed some issues * fixed failed test case * have fixed some css issues * replaced query with quersrting package * fixed minor width issue * Fixed some css issues * fixed darkMode issue * implemented on enter press search * Refactored the code * fixed white space issue * refactored the code * fixed overlapping issue * refactored the code * fixing some issues * fixes * removed guard * code cleanup * comments notification fix * fixed conflict issues * fixed css height issue Co-authored-by: gsmithun4 <gsmithun4@gmail.com> * Remove signup guard from set-password-from-token API (#4050) * Remove sign up guard set-password-from-token API * test cases fix * Bump to v1.25.1 * Feature: Add PG_DB_OWNER env var to disable db and extension creation (#4055) * add PG_DB_OWNER env var to disable db and extension creation * update docs * bump to v1.25.2 Co-authored-by: Akshay <akshaysasidharan93@gmail.com> Co-authored-by: Muhsin Shah C P <muhsinshah21@gmail.com>
157 lines
6.4 KiB
JavaScript
157 lines
6.4 KiB
JavaScript
import React from 'react';
|
|
import { CopyToClipboard } from 'react-copy-to-clipboard';
|
|
import Avatar from '../../../src/_ui/Avatar';
|
|
import Skeleton from 'react-loading-skeleton';
|
|
import cx from 'classnames';
|
|
import { Pagination } from '@/_components';
|
|
|
|
const UsersTable = ({
|
|
isLoading,
|
|
users,
|
|
archivingUser,
|
|
unarchivingUser,
|
|
generateInvitationURL,
|
|
invitationLinkCopyHandler,
|
|
unarchiveOrgUser,
|
|
archiveOrgUser,
|
|
meta,
|
|
pageChanged,
|
|
darkMode,
|
|
translator,
|
|
}) => {
|
|
return (
|
|
<div className="container-xl mb-4">
|
|
<div className="card">
|
|
<div className="card-table fixedHeader table-responsive table-bordered">
|
|
<table data-testid="usersTable" className="table table-vcenter h-100">
|
|
<thead>
|
|
<tr>
|
|
<th data-cy="name-title">{translator('header.organization.menus.manageUsers.name', 'Name')}</th>
|
|
<th data-cy="email-title">{translator('header.organization.menus.manageUsers.email', 'Email')}</th>
|
|
{users && users[0]?.status ? (
|
|
<th data-cy="status-title">{translator('header.organization.menus.manageUsers.status', 'Status')}</th>
|
|
) : (
|
|
<th className="w-1"></th>
|
|
)}
|
|
<th className="w-1"></th>
|
|
</tr>
|
|
</thead>
|
|
{isLoading ? (
|
|
<tbody className="w-100 h-auto">
|
|
{Array.from(Array(4)).map((_item, index) => (
|
|
<tr key={index}>
|
|
<td className="col-2 p-3">
|
|
<div className="d-flex align-items-center">
|
|
<Skeleton circle="15%" className="col-auto" style={{ width: '35px', height: '35px' }} />
|
|
<Skeleton className="mx-3" width={100} />
|
|
</div>
|
|
</td>
|
|
<td className="col-4 p-3">
|
|
<Skeleton />
|
|
</td>
|
|
{users && users[0]?.status && (
|
|
<td className="col-2 p-3">
|
|
<Skeleton />
|
|
</td>
|
|
)}
|
|
<td className="text-muted col-auto col-1 pt-3">
|
|
<Skeleton />
|
|
</td>
|
|
<td className="text-muted col-auto col-1 pt-3">
|
|
<Skeleton />
|
|
</td>
|
|
</tr>
|
|
))}
|
|
</tbody>
|
|
) : (
|
|
<tbody>
|
|
{Array.isArray(users) &&
|
|
users.length > 0 &&
|
|
users.map((user) => (
|
|
<tr key={user.id}>
|
|
<td className="d-flex align-items-center">
|
|
<Avatar
|
|
avatarId={user.avatar_id}
|
|
text={`${user.first_name ? user.first_name[0] : ''}${
|
|
user.last_name ? user.last_name[0] : ''
|
|
}`}
|
|
/>
|
|
<span className="mx-3" data-cy="user-name">
|
|
{user.name}
|
|
</span>
|
|
</td>
|
|
<td className="text-muted">
|
|
<a className="text-reset user-email" data-cy="user-email">
|
|
{user.email}
|
|
</a>
|
|
</td>
|
|
{user.status && (
|
|
<td className="text-muted">
|
|
<span
|
|
className={cx('badge me-1 m-1', {
|
|
'bg-warning': user.status === 'invited',
|
|
'bg-danger': user.status === 'archived',
|
|
'bg-success': user.status === 'active',
|
|
})}
|
|
data-cy="status-badge"
|
|
></span>
|
|
<small className="user-status" data-cy="user-status">
|
|
{user.status}
|
|
</small>
|
|
{user.status === 'invited' && 'invitation_token' in user ? (
|
|
<CopyToClipboard text={generateInvitationURL(user)} onCopy={invitationLinkCopyHandler}>
|
|
<img
|
|
data-tip="Copy invitation link"
|
|
className="svg-icon cursor-pointer"
|
|
src="assets/images/icons/copy.svg"
|
|
width="15"
|
|
height="15"
|
|
data-cy="copy-invitation-link"
|
|
></img>
|
|
</CopyToClipboard>
|
|
) : (
|
|
''
|
|
)}
|
|
</td>
|
|
)}
|
|
<td>
|
|
<button
|
|
type="button"
|
|
style={{ minWidth: '100px' }}
|
|
className={cx('btn btn-sm', {
|
|
'btn-outline-success': user.status === 'archived',
|
|
'btn-outline-danger': user.status === 'active' || user.status === 'invited',
|
|
'btn-loading': unarchivingUser === user.id || archivingUser === user.id,
|
|
})}
|
|
disabled={unarchivingUser === user.id || archivingUser === user.id}
|
|
onClick={() => {
|
|
user.status === 'archived' ? unarchiveOrgUser(user.id) : archiveOrgUser(user.id);
|
|
}}
|
|
data-cy="user-state"
|
|
>
|
|
{user.status === 'archived'
|
|
? translator('header.organization.menus.manageUsers.unarchive', 'Unarchive')
|
|
: translator('header.organization.menus.manageUsers.archive', 'Archive')}
|
|
</button>
|
|
</td>
|
|
</tr>
|
|
))}
|
|
</tbody>
|
|
)}
|
|
</table>
|
|
</div>
|
|
{meta.total_count > 10 && (
|
|
<Pagination
|
|
currentPage={meta.current_page}
|
|
count={meta.total_count}
|
|
pageChanged={pageChanged}
|
|
itemsPerPage={10}
|
|
darkMode={darkMode}
|
|
/>
|
|
)}
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default UsersTable;
|