0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-02-03 21:48:55 -05:00

fix(console): display no data when no data is found by search filter (#5203)

This commit is contained in:
Xiao Yijun 2024-01-08 11:41:25 +08:00 committed by GitHub
parent 9901f58df3
commit 87f48c716b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 47 additions and 22 deletions

View file

@ -5,6 +5,7 @@ import { useTranslation } from 'react-i18next';
import useSWR from 'swr'; import useSWR from 'swr';
import OrganizationIcon from '@/assets/icons/organization-preview.svg'; import OrganizationIcon from '@/assets/icons/organization-preview.svg';
import NotFoundDataPlaceholder from '@/components/EmptyDataPlaceholder';
import ItemPreview from '@/components/ItemPreview'; import ItemPreview from '@/components/ItemPreview';
import ThemedIcon from '@/components/ThemedIcon'; import ThemedIcon from '@/components/ThemedIcon';
import { defaultPageSize } from '@/consts'; import { defaultPageSize } from '@/consts';
@ -52,9 +53,13 @@ function OrganizationsTable({ isLoading, onCreate }: Props) {
className={pageLayout.table} className={pageLayout.table}
isLoading={isTableLoading} isLoading={isTableLoading}
placeholder={ placeholder={
<EmptyDataPlaceholder keyword ? (
buttonProps={{ title: 'organizations.create_organization', onClick: onCreate }} <NotFoundDataPlaceholder />
/> ) : (
<EmptyDataPlaceholder
buttonProps={{ title: 'organizations.create_organization', onClick: onCreate }}
/>
)
} }
rowGroups={[{ key: 'data', data }]} rowGroups={[{ key: 'data', data }]}
rowClickHandler={({ id }) => { rowClickHandler={({ id }) => {

View file

@ -13,6 +13,7 @@ import UserRoleIconDark from '@/assets/icons/user-role-dark.svg';
import UserRoleIcon from '@/assets/icons/user-role.svg'; import UserRoleIcon from '@/assets/icons/user-role.svg';
import RolesEmptyDark from '@/assets/images/roles-empty-dark.svg'; import RolesEmptyDark from '@/assets/images/roles-empty-dark.svg';
import RolesEmpty from '@/assets/images/roles-empty.svg'; import RolesEmpty from '@/assets/images/roles-empty.svg';
import EmptyDataPlaceholder from '@/components/EmptyDataPlaceholder';
import ItemPreview from '@/components/ItemPreview'; import ItemPreview from '@/components/ItemPreview';
import ListPage from '@/components/ListPage'; import ListPage from '@/components/ListPage';
import { defaultPageSize } from '@/consts'; import { defaultPageSize } from '@/consts';
@ -168,7 +169,9 @@ function Roles() {
updateSearchParameters({ page }); updateSearchParameters({ page });
}, },
}, },
placeholder: ( placeholder: keyword ? (
<EmptyDataPlaceholder />
) : (
<TablePlaceholder <TablePlaceholder
image={<RolesEmpty />} image={<RolesEmpty />}
imageDark={<RolesEmptyDark />} imageDark={<RolesEmptyDark />}

View file

@ -46,6 +46,13 @@
color: var(--color-text-secondary); color: var(--color-text-secondary);
} }
} }
.noDataPlaceholder {
padding: _.unit(2);
color: var(--color-text-secondary);
font: var(--font-body-2);
user-select: none;
}
} }
} }

View file

@ -7,6 +7,7 @@ import { useTranslation } from 'react-i18next';
import Plus from '@/assets/icons/plus.svg'; import Plus from '@/assets/icons/plus.svg';
import SearchIcon from '@/assets/icons/search.svg'; import SearchIcon from '@/assets/icons/search.svg';
import Button from '@/ds-components/Button'; import Button from '@/ds-components/Button';
import DynamicT from '@/ds-components/DynamicT';
import OverlayScrollbar from '@/ds-components/OverlayScrollbar'; import OverlayScrollbar from '@/ds-components/OverlayScrollbar';
import TextInput from '@/ds-components/TextInput'; import TextInput from '@/ds-components/TextInput';
import { onKeyDownHandler } from '@/utils/a11y'; import { onKeyDownHandler } from '@/utils/a11y';
@ -89,25 +90,31 @@ function AddLanguageSelector({ options, onSelect }: Props) {
/> />
)} )}
</div> </div>
{isDropDownOpen && filteredOptions.length > 0 && ( {isDropDownOpen && (
<OverlayScrollbar className={style.dropDown}> <OverlayScrollbar className={style.dropDown}>
{filteredOptions.map((languageTag) => ( {filteredOptions.length === 0 ? (
<div <div className={style.noDataPlaceholder}>
key={languageTag} <DynamicT forKey="errors.empty" />
role="tab"
tabIndex={0}
className={style.dropDownItem}
onKeyDown={onKeyDownHandler(() => {
handleSelect(languageTag);
})}
onClick={() => {
handleSelect(languageTag);
}}
>
<div className={style.languageName}>{uiLanguageNameMapping[languageTag]}</div>
<div className={style.languageTag}>{languageTag}</div>
</div> </div>
))} ) : (
filteredOptions.map((languageTag) => (
<div
key={languageTag}
role="tab"
tabIndex={0}
className={style.dropDownItem}
onKeyDown={onKeyDownHandler(() => {
handleSelect(languageTag);
})}
onClick={() => {
handleSelect(languageTag);
}}
>
<div className={style.languageName}>{uiLanguageNameMapping[languageTag]}</div>
<div className={style.languageTag}>{languageTag}</div>
</div>
))
)}
</OverlayScrollbar> </OverlayScrollbar>
)} )}
</div> </div>

View file

@ -10,6 +10,7 @@ import UsersEmptyDark from '@/assets/images/users-empty-dark.svg';
import UsersEmpty from '@/assets/images/users-empty.svg'; import UsersEmpty from '@/assets/images/users-empty.svg';
import ApplicationName from '@/components/ApplicationName'; import ApplicationName from '@/components/ApplicationName';
import DateTime from '@/components/DateTime'; import DateTime from '@/components/DateTime';
import EmptyDataPlaceholder from '@/components/EmptyDataPlaceholder';
import ItemPreview from '@/components/ItemPreview'; import ItemPreview from '@/components/ItemPreview';
import ListPage from '@/components/ListPage'; import ListPage from '@/components/ListPage';
import UserAvatar from '@/components/UserAvatar'; import UserAvatar from '@/components/UserAvatar';
@ -120,7 +121,9 @@ function Users() {
}} }}
/> />
), ),
placeholder: ( placeholder: keyword ? (
<EmptyDataPlaceholder />
) : (
<TablePlaceholder <TablePlaceholder
image={<UsersEmpty />} image={<UsersEmpty />}
imageDark={<UsersEmptyDark />} imageDark={<UsersEmptyDark />}