From bc2c35b2e13223e4799e3ef745f50838a5500980 Mon Sep 17 00:00:00 2001 From: Chase Rutherford-Jenkins Date: Fri, 11 Jun 2021 14:39:14 -0700 Subject: [PATCH] move search logic into SearchToolbar Co-authored-by: Tim Signed-off-by: Chase Rutherford-Jenkins --- .../src/hooks/useEntityListProvider.tsx | 2 + plugins/catalog-react/src/types.ts | 19 +++++++ .../ScaffolderPage/ScaffolderPage.tsx | 56 +++++-------------- .../SearchToolbar/SearchToolbar.test.tsx | 48 +++++++++++++++- .../SearchToolbar/SearchToolbar.tsx | 30 ++++++---- 5 files changed, 101 insertions(+), 54 deletions(-) diff --git a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx index 13948b4331..525ce0a146 100644 --- a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx +++ b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx @@ -31,6 +31,7 @@ import { EntityLifecycleFilter, EntityOwnerFilter, EntityTagFilter, + EntityTextFilter, EntityTypeFilter, UserListFilter, } from '../types'; @@ -44,6 +45,7 @@ export type DefaultEntityFilters = { owners?: EntityOwnerFilter; lifecycles?: EntityLifecycleFilter; tags?: EntityTagFilter; + text?: EntityTextFilter; }; export type EntityListContextProps< diff --git a/plugins/catalog-react/src/types.ts b/plugins/catalog-react/src/types.ts index 7932e4b735..a41e08024a 100644 --- a/plugins/catalog-react/src/types.ts +++ b/plugins/catalog-react/src/types.ts @@ -66,6 +66,25 @@ export class EntityTagFilter implements EntityFilter { } } +// TODO(chaseajen): add unit test for logic +export class EntityTextFilter implements EntityFilter { + constructor(readonly value: string) {} + + filterEntity(entity: Entity): boolean { + const upperCaseValue = this.value.toLocaleUpperCase('en-US'); + + return ( + `${entity.metadata.title}` + .toLocaleUpperCase('en-US') + .includes(upperCaseValue) || + entity.metadata.tags + ?.join('') + .toLocaleUpperCase('en-US') + .indexOf(upperCaseValue) !== -1 + ); + } +} + export class EntityOwnerFilter implements EntityFilter { constructor(readonly values: string[]) {} diff --git a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx index f1e47a1879..f8043791ee 100644 --- a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx +++ b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx @@ -14,11 +14,7 @@ * limitations under the License. */ -import { - Entity, - EntityMeta, - TemplateEntityV1alpha1, -} from '@backstage/catalog-model'; +import { TemplateEntityV1alpha1 } from '@backstage/catalog-model'; import { Content, ContentHeader, @@ -39,7 +35,7 @@ import { UserListPicker, } from '@backstage/plugin-catalog-react'; import { Button, Link, makeStyles, Typography } from '@material-ui/core'; -import React, { useEffect, useState } from 'react'; +import React from 'react'; import { Link as RouterLink } from 'react-router-dom'; import { registerComponentRouteRef } from '../../routes'; import SearchToolbar from '../SearchToolbar/SearchToolbar'; @@ -58,26 +54,8 @@ export const ScaffolderPageContents = () => { const styles = useStyles(); const { loading, error, entities } = useEntityListProvider(); - const [search, setSearch] = useState(''); - const [matchingEntities, setMatchingEntities] = useState([] as Entity[]); - - const matchesQuery = (metadata: EntityMeta, query: string) => - `${metadata.title}`.toLocaleUpperCase('en-US').includes(query) || - metadata.tags?.join('').toLocaleUpperCase('en-US').indexOf(query) !== -1; - const registerComponentLink = useRouteRef(registerComponentRouteRef); - useEffect(() => { - if (search.length === 0) { - return setMatchingEntities(entities); - } - return setMatchingEntities( - entities.filter(template => - matchesQuery(template.metadata, search.toLocaleUpperCase('en-US')), - ), - ); - }, [search, entities]); - return (
{
- {/* TODO(mtlewis) extract SearchToolbar as a frontend filter */} - +