From 1621bd7ae3019a6d0165dca8a453515107aaa5ea Mon Sep 17 00:00:00 2001 From: Xiao Yijun Date: Mon, 16 Jan 2023 13:52:21 +0800 Subject: [PATCH] refactor(console): users page (#2943) --- .../components/ItemPreview/index.module.scss | 5 +- .../console/src/pages/Users/index.module.scss | 32 +--- packages/console/src/pages/Users/index.tsx | 166 ++++++++---------- 3 files changed, 77 insertions(+), 126 deletions(-) diff --git a/packages/console/src/components/ItemPreview/index.module.scss b/packages/console/src/components/ItemPreview/index.module.scss index e8f53fa71..e8fe6067b 100644 --- a/packages/console/src/components/ItemPreview/index.module.scss +++ b/packages/console/src/components/ItemPreview/index.module.scss @@ -17,14 +17,13 @@ font: var(--font-body-medium); color: var(--color-text-link); text-decoration: none; + @include _.text-ellipsis; } .subtitle { font: var(--font-body-small); color: var(--color-text-secondary); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + @include _.text-ellipsis; } } diff --git a/packages/console/src/pages/Users/index.module.scss b/packages/console/src/pages/Users/index.module.scss index 3073bb03b..ea95c17b1 100644 --- a/packages/console/src/pages/Users/index.module.scss +++ b/packages/console/src/pages/Users/index.module.scss @@ -1,28 +1,5 @@ -@use '@/scss/underscore' as _; - -.filter { - padding: _.unit(3); - background-color: var(--color-layer-1); - border-bottom: 1px solid var(--color-divider); - border-radius: 12px 12px 0 0; - - .searchInput { - width: 338px; - } -} - -.tableLayout { - display: flex; - flex-direction: column; - - .tableContainer { - border-top-left-radius: 0; - border-top-right-radius: 0; - } -} - -.pagination { - margin-top: _.unit(4); +.searchInput { + width: 338px; } .avatar { @@ -32,8 +9,3 @@ object-fit: cover; flex-shrink: 0; } - -.userName { - width: 360px; - font: var(--font-body-medium); -} diff --git a/packages/console/src/pages/Users/index.tsx b/packages/console/src/pages/Users/index.tsx index f26a3495d..08a8739e7 100644 --- a/packages/console/src/pages/Users/index.tsx +++ b/packages/console/src/pages/Users/index.tsx @@ -1,8 +1,7 @@ import type { User } from '@logto/schemas'; import { conditional } from '@silverhand/essentials'; -import classNames from 'classnames'; import { useTranslation } from 'react-i18next'; -import { useLocation, useNavigate, useSearchParams } from 'react-router-dom'; +import { useLocation, useNavigate } from 'react-router-dom'; import useSWR from 'swr'; import Plus from '@/assets/images/plus.svg'; @@ -11,40 +10,33 @@ import Button from '@/components/Button'; import CardTitle from '@/components/CardTitle'; import DateTime from '@/components/DateTime'; import ItemPreview from '@/components/ItemPreview'; -import Pagination from '@/components/Pagination'; import Search from '@/components/Search'; -import TableEmpty from '@/components/Table/TableEmpty'; -import TableError from '@/components/Table/TableError'; -import TableLoading from '@/components/Table/TableLoading'; +import Table from '@/components/Table'; import UserAvatar from '@/components/UserAvatar'; import { UserDetailsTabs } from '@/consts/page-tabs'; import type { RequestError } from '@/hooks/use-api'; +import useTableSearchParams from '@/hooks/use-table-search-params'; import * as resourcesStyles from '@/scss/resources.module.scss'; -import * as tableStyles from '@/scss/table.module.scss'; import { buildUrl } from '@/utilities/url'; import CreateForm from './components/CreateForm'; import * as styles from './index.module.scss'; -const pageSize = 20; - -const userTableColumn = 3; - const usersPathname = '/users'; const createUserPathname = `${usersPathname}/create`; const buildDetailsPathname = (id: string) => `${usersPathname}/${id}/${UserDetailsTabs.Settings}`; const Users = () => { - const { pathname } = useLocation(); + const { pathname, search } = useLocation(); const isCreateNew = pathname === createUserPathname; const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); - const [query, setQuery] = useSearchParams(); - const search = query.toString(); - const pageIndex = Number(query.get('page') ?? '1'); - const keyword = query.get('search') ?? ''; + const { + pagination: { pageIndex, pageSize, setPageIndex }, + search: { keyword, setKeyword }, + } = useTableSearchParams(); const url = buildUrl('/api/users', { - hideAdminUser: 'true', + hideAdminUser: String(true), page: String(pageIndex), page_size: String(pageSize), ...conditional(keyword && { search: `%${keyword}%` }), @@ -82,93 +74,81 @@ const Users = () => { /> )} -
-
+ ( + } + to={buildDetailsPathname(id)} + size="compact" + /> + ), + }, + { + title: t('users.application_name'), + dataIndex: 'app', + colSpan: 5, + render: ({ applicationId }) => + applicationId ? :
-
, + }, + { + title: t('users.latest_sign_in'), + dataIndex: 'lastSignInAt', + colSpan: 5, + render: ({ lastSignInAt }) => {lastSignInAt}, + }, + ]} + filter={ { - setQuery(value ? { search: value } : {}); + setKeyword(value); + setPageIndex(1); }} onClearSearch={() => { - setQuery({}); + setKeyword(''); + setPageIndex(1); }} /> - -
-
- - - - - - - - - - - - - - {!data && error && ( - mutate(undefined, true)} - /> - )} - {isLoading && } - {users?.length === 0 && ( - - { - navigate(buildDetailsPathname(id)); - }} - > - - - - - ))} - -
{t('users.user_name')}{t('users.application_name')}{t('users.latest_sign_in')}
- } - to={buildDetailsPathname(id)} - size="compact" - /> - {applicationId ? : '-'} - {lastSignInAt} -
-
-
- { - setQuery({ page: String(page), ...conditional(keyword && { search: keyword }) }); + } + placeholder={{ + content: ( +