ToolJet/frontend/ee/components/UsersPage/UsersTable.jsx
Kiran Ashok 65259afeb2
Feature Homepage and settings redesign (#5763)
* adding colors

* feat :: add button

* feat :: added typography

* feat: init storybook

* removes browserlist

* feat :: adding button styles and button component

* feat :: added sass addon

* stories update

* feat :: replacing with radix colors

* danger variants

* updates buttin story

* fix :: removing default items

* cleanup

* fix icons update

* feat :: folder list component

* fix :: naming

* icon and split button :: init

* intermediate save :: app card component

* renaming

* updates

* update for module imports

* updates icon

* update :: homepage design updates

* design changes dashboard

* updates :: apps section

* workspace stting new design upate

* updates dasboard design

* style :: fixes

* feat :: added context for sidebar nav breadcrumb

* added all solid icons

* intermediate update

* change: conditions for fetching users

* sorybook updates

* design updates :: workspace settings page

* manage users page

* lint fixes

* fix :: styling

* stle fixes :: workspace settings

* homepage redesign

* fix :: all drawer colors and position ,teplate page revamp , database page header fixes

* imported all bulk icons

* svg to jsx : bulk icons

* minor :: cleanup

* fix :: manage users drawer

* fix :: searchboxes , userspage fixes

* fix :: all inputs and minor ui fixes

* database page ui fixes

* fix :: database and folder search functionality and iconlist in homecard

* fixed some db functionality and edge cases for longer texts

* fix :: user addition manage user page

* self review cleanup and change in bulk icon fill state

* fix :: homepage seacbar

* merging develop and resolving conflicts

* remove unwanted stories

* reverting merge with develop

* Revert "reverting merge with develop"

This reverts commit 2150c8ec0c.

* clearing out warnings

* lint fixes

* feat :: added org modal in database page

* fix :: sso loader theme

* fix :: broken styles select

* fixed icon warning and select ui

* fix :: upload bulk and user select dark mode

* merge styles  with develop

* feat :: integrated new ui for database

* removing storybook files

* fix :: all bugs related to users dropdown and cleanup

* fix: user search api for organization page

* cleanup and splitting dropzone component

* fix :: overflow issue in app card time

* fix for scrollbars in homepage

* PR review fixes

* updates :: fix d=global datasource design issues , homepage responsiveness

* tj db operations

* breadcrumb bug fixes

* lint fixes

* removing logs , removed fade in in datasource and database page

* marketplace page ui fix

* removing inital users table fetch

* Pr :: review changes

* remove logs

* fix :: popover bug

* minot style fix

* fix :: remove arrow from all popovers

* fix :: for loading states

* ux :: sidebar items reorder

* style :: fix

* style fix :: templates

* fix :: qa bugs

* fix :: Qa reported bugs

* removes :: folder fetch bug

* share link and datsource bg color fix

* fixes :: rename group ,

* removed logs

* pages popover background fix

* fix :: tj db table addition ui bug

* fix :: ui bug confirm modal password disable

* modal , revert name capitalize in lists, typos fix

* typos , users page route bugfix

* users page header bugfix

* workspace archive btn , datasources form style for select

* groups updated , delete, create flow updated

* avatar bug in profile page fix

* revert styles

* fix :: for create new table nav breadcrumb not being updated

* click state bug fix in avatar

* fix bug with appcard popover

* fix :: text capitalize issue

* fix :: lints and updated icon for filter delete

* fix warnings

---------

Co-authored-by: gandharv <gandharvkumargarg@gmail.com>
Co-authored-by: Vijaykant Yadav <vjy239@gmail.com>
2023-04-21 11:45:48 +05:30

167 lines
6.9 KiB
JavaScript

import React from 'react';
import { CopyToClipboard } from 'react-copy-to-clipboard';
import Avatar from '@/_ui/Avatar';
import Skeleton from 'react-loading-skeleton';
import cx from 'classnames';
import { Pagination } from '@/_components';
import { ButtonSolid } from '@/_ui/AppButton/AppButton';
import SolidIcon from '@/_ui/Icon/SolidIcons';
import { Tooltip } from 'react-tooltip';
const UsersTable = ({
isLoading,
users,
archivingUser,
unarchivingUser,
generateInvitationURL,
invitationLinkCopyHandler,
unarchiveOrgUser,
archiveOrgUser,
meta,
pageChanged,
darkMode,
translator,
}) => {
return (
<div className="workspace-settings-table-wrap mb-4">
<div className="tj-user-table-wrapper">
<div className="card-table fixedHeader table-responsive ">
<table data-testid="usersTable" className="users-table 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>
<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>
<Avatar
avatarId={user.avatar_id}
text={`${user.first_name ? user.first_name[0] : ''}${
user.last_name ? user.last_name[0] : ''
}`}
/>
<span className="mx-3 tj-text-sm" data-cy="user-name">
{user.name}
</span>
</td>
<td className="text-muted">
<a className="text-reset user-email tj-text-sm" data-cy="user-email">
{user.email}
</a>
</td>
{user.status && (
<td className="text-muted">
<span
className={cx('badge', {
'tj-invited': user.status === 'invited',
'tj-archive': user.status === 'archived',
'tj-active': user.status === 'active',
})}
data-cy="status-badge"
></span>
<small className="workspace-user-status tj-text-sm text-capitalize" data-cy="user-status">
{user.status}
</small>
{user.status === 'invited' && 'invitation_token' in user ? (
<div className="workspace-clipboard-wrap">
<CopyToClipboard text={generateInvitationURL(user)} onCopy={invitationLinkCopyHandler}>
<span>
<SolidIcon
data-tooltip-id="tooltip-for-copy-invitation-link"
data-tooltip-content="Copy invitation link"
width="12"
fill="#889096"
data-cy="copy-invitation-link"
name="copy"
/>
<p className="tj-text-xsm">Copy link</p>
</span>
</CopyToClipboard>
<Tooltip id="tooltip-for-copy-invitation-link" className="tooltip" />
</div>
) : (
''
)}
</td>
)}
<td>
<ButtonSolid
variant="dangerSecondary"
style={{ minWidth: '100px' }}
className="workspace-user-archive-btn tj-text-xsm"
disabled={unarchivingUser === user.id || archivingUser === user.id}
leftIcon="archive"
fill="#E54D2E"
iconWidth="12"
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')}
</ButtonSolid>
</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;