Add fulltext search to measures page

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2026-03-19 12:32:59 +01:00
parent c3be391e9d
commit a6c88c9631

View File

@@ -13,9 +13,11 @@ import {
DropdownItem, DropdownItem,
FileButton, FileButton,
IconFolderUpload, IconFolderUpload,
IconMagnifyingGlass,
IconPencil, IconPencil,
IconPlusLarge, IconPlusLarge,
IconTrashCan, IconTrashCan,
Input,
Option, Option,
PageHeader, PageHeader,
Select, Select,
@@ -99,6 +101,7 @@ const measuresPageFragment = graphql`
@argumentDefinitions( @argumentDefinitions(
first: { type: "Int", defaultValue: 20 } first: { type: "Int", defaultValue: 20 }
after: { type: "CursorKey" } after: { type: "CursorKey" }
query: { type: "String", defaultValue: null }
state: { type: "MeasureState", defaultValue: null } state: { type: "MeasureState", defaultValue: null }
category: { type: "String", defaultValue: null } category: { type: "String", defaultValue: null }
) { ) {
@@ -106,7 +109,7 @@ const measuresPageFragment = graphql`
measures( measures(
first: $first first: $first
after: $after after: $after
filter: { state: $state, category: $category } filter: { query: $query, state: $state, category: $category }
) )
@connection( @connection(
key: "MeasuresPage_measures" key: "MeasuresPage_measures"
@@ -162,6 +165,7 @@ export default function MeasuresPage({ queryRef }: MeasuresPageProps) {
} }
const [isPending, startTransition] = useTransition(); const [isPending, startTransition] = useTransition();
const [queryFilter, setQueryFilter] = useState<string | null>(null);
const [stateFilter, setStateFilter] = useState<MeasureState | null>(null); const [stateFilter, setStateFilter] = useState<MeasureState | null>(null);
const [categoryFilter, setCategoryFilter] = useState<string | null>(null); const [categoryFilter, setCategoryFilter] = useState<string | null>(null);
@@ -175,6 +179,7 @@ export default function MeasuresPage({ queryRef }: MeasuresPageProps) {
startTransition(() => { startTransition(() => {
refetch( refetch(
{ {
query: queryFilter,
state: stateFilter, state: stateFilter,
category: categoryFilter, category: categoryFilter,
...overrides, ...overrides,
@@ -184,6 +189,12 @@ export default function MeasuresPage({ queryRef }: MeasuresPageProps) {
}); });
}; };
const handleQueryFilterChange = (value: string) => {
const newQuery = value === "" ? null : value;
setQueryFilter(newQuery);
refetchFilters({ query: newQuery });
};
const handleStateFilterChange = (value: string) => { const handleStateFilterChange = (value: string) => {
const newState = value === "ALL" ? null : (value as MeasureState); const newState = value === "ALL" ? null : (value as MeasureState);
setStateFilter(newState); setStateFilter(newState);
@@ -197,6 +208,7 @@ export default function MeasuresPage({ queryRef }: MeasuresPageProps) {
}; };
const currentFilter = { const currentFilter = {
query: queryFilter,
state: stateFilter, state: stateFilter,
category: categoryFilter, category: categoryFilter,
}; };
@@ -209,9 +221,9 @@ export default function MeasuresPage({ queryRef }: MeasuresPageProps) {
const allFiltersNullConnectionId = ConnectionHandler.getConnectionID( const allFiltersNullConnectionId = ConnectionHandler.getConnectionID(
organizationId, organizationId,
MeasuresConnectionKey, MeasuresConnectionKey,
{ filter: { state: null, category: null } }, { filter: { query: null, state: null, category: null } },
); );
const hasActiveFilter = stateFilter || categoryFilter; const hasActiveFilter = queryFilter || stateFilter || categoryFilter;
const createConnectionIds = hasActiveFilter const createConnectionIds = hasActiveFilter
? [allFiltersNullConnectionId, connectionId] ? [allFiltersNullConnectionId, connectionId]
: [connectionId]; : [connectionId];
@@ -282,6 +294,12 @@ export default function MeasuresPage({ queryRef }: MeasuresPageProps) {
</PageHeader> </PageHeader>
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
<Input
icon={IconMagnifyingGlass}
placeholder={__("Search measures...")}
value={queryFilter ?? ""}
onValueChange={handleQueryFilterChange}
/>
<Select <Select
value={stateFilter ?? "ALL"} value={stateFilter ?? "ALL"}
onValueChange={handleStateFilterChange} onValueChange={handleStateFilterChange}