diff --git a/api/src/graphql/parts.sdl.ts b/api/src/graphql/parts.sdl.ts index 52869fc..b113a84 100644 --- a/api/src/graphql/parts.sdl.ts +++ b/api/src/graphql/parts.sdl.ts @@ -14,6 +14,7 @@ export const schema = gql` page: Int! sort: SortMethod! order: SortOrder! + search: String } enum SortMethod { @@ -30,7 +31,12 @@ export const schema = gql` } type Query { - partPage(page: Int, sort: SortMethod, order: SortOrder): PartPage @skipAuth + partPage( + page: Int! + sort: SortMethod! + order: SortOrder! + searchQuery: String + ): PartPage @skipAuth parts: [Part!]! @skipAuth part(id: Int!): Part @skipAuth } diff --git a/api/src/services/parts/parts.ts b/api/src/services/parts/parts.ts index d75c9b6..602a0eb 100644 --- a/api/src/services/parts/parts.ts +++ b/api/src/services/parts/parts.ts @@ -1,10 +1,5 @@ import * as Filestack from 'filestack-js' -import type { - QueryResolvers, - MutationResolvers, - SortMethod, - SortOrder, -} from 'types/graphql' +import type { QueryResolvers, MutationResolvers } from 'types/graphql' import { db } from 'src/lib/db' @@ -23,14 +18,11 @@ export const part: QueryResolvers['part'] = ({ id }) => { }) } -export const partPage = ({ +export const partPage: QueryResolvers['partPage'] = async ({ page = 1, sort = 'id', order = 'ascending', -}: { - page: number - sort: SortMethod - order: SortOrder + searchQuery, }) => { const offset = (page - 1) * PARTS_PER_PAGE let orderByCase @@ -63,17 +55,42 @@ export const partPage = ({ break } - return { - parts: db.part.findMany({ - take: PARTS_PER_PAGE, - skip: offset, - orderBy: orderByCase, - }), - count: db.part.count(), - page, - sort, - order, - } + if (searchQuery && searchQuery.length > 0) + return { + parts: await db.part.findMany({ + where: { + name: { + contains: searchQuery, + }, + }, + take: PARTS_PER_PAGE, + skip: offset, + orderBy: orderByCase, + }), + count: await db.part.count({ + where: { + name: { + contains: searchQuery, + }, + }, + }), + page, + sort, + order, + search: searchQuery, + } + else + return { + parts: await db.part.findMany({ + take: PARTS_PER_PAGE, + skip: offset, + orderBy: orderByCase, + }), + count: await db.part.count(), + page, + sort, + order, + } } export const createPart: MutationResolvers['createPart'] = ({ input }) => { diff --git a/web/src/components/PartsCell/PartsCell.tsx b/web/src/components/PartsCell/PartsCell.tsx index 89e30cb..b78b09c 100644 --- a/web/src/components/PartsCell/PartsCell.tsx +++ b/web/src/components/PartsCell/PartsCell.tsx @@ -1,4 +1,6 @@ /* eslint-disable jsx-a11y/no-noninteractive-tabindex */ +import { useState } from 'react' + import { mdiAlert, mdiChevronRight, @@ -16,7 +18,7 @@ import PartsGridUnit from '../PartsGridUnit/PartsGridUnit' const POSTS_PER_PAGE = 8 -export const beforeQuery = ({ page, sort, order }) => { +export const beforeQuery = ({ page, sort, order, search }) => { page = page ? parseInt(page, 10) : 1 sort = sort && @@ -26,12 +28,17 @@ export const beforeQuery = ({ page, sort, order }) => { order = order && (['ascending', 'descending'].includes(order) ? order : 'ascending') - return { variables: { page, sort, order } } + return { variables: { page, sort, order, search } } } export const QUERY = gql` - query PartsQuery($page: Int, $sort: SortMethod, $order: SortOrder) { - partPage(page: $page, sort: $sort, order: $order) { + query PartsQuery( + $page: Int! + $sort: SortMethod! + $order: SortOrder! + $search: String + ) { + partPage(page: $page, sort: $sort, order: $order, searchQuery: $search) { parts { id name @@ -44,6 +51,7 @@ export const QUERY = gql` page sort order + search } } ` @@ -54,8 +62,33 @@ export const Loading = () => ( ) -export const Empty = () => ( -
+export const Empty = ( + search: string, + setSearch: { + (value: React.SetStateAction): void + (arg0: string): void + } +) => ( +
+
+ setSearch(e.target.value)} + /> + + Search + +

It's empty in here...

@@ -112,13 +145,37 @@ export const Success = ({ partPage }: CellSuccessProps) => { return orderText } - if (partPage.count == 0) return Empty() + const [search, setSearch] = useState(partPage.search ?? '') + + if (partPage.count == 0) return Empty(search, setSearch) else { const sortByText: string = sortMethodToText(partPage.sort) const orderText: string = sortOrderToText(partPage.order) return (
+
+ setSearch(e.target.value)} + /> + + Search + +
- + ) }