diff --git a/packages/ui/src/components/Filters/Filters.stories.tsx b/packages/ui/src/components/Filters/Filters.stories.tsx index 4b8666c85..d852ebfb4 100644 --- a/packages/ui/src/components/Filters/Filters.stories.tsx +++ b/packages/ui/src/components/Filters/Filters.stories.tsx @@ -279,3 +279,104 @@ export const WithSearchLeading: Story = { hasLeadingItem: true, }, }; + +export const InlineVariant: Story = { + args: { + filters: basicFilters, + initialValues: { + category: '', + price: '', + rating: [], + sort: 'relevance', + search: '', + }, + hasLeadingItem: false, + }, + render: ({ filters, initialValues }) => { + // eslint-disable-next-line react-hooks/rules-of-hooks + const [currentFilters, setCurrentFilters] = useState(initialValues); + + const handleSubmit = (values: Partial) => { + console.log('Filters submitted:', values); + setCurrentFilters({ + ...currentFilters, + ...values, + }); + }; + + const handleReset = () => { + console.log('Filters reset'); + setCurrentFilters(initialValues); + }; + + return ( +
+ +
+

Current Filters:

+
{JSON.stringify(currentFilters, null, 2)}
+
+ + +
+
+ ); + }, +}; + +export const InlineVariantWithSection: Story = { + args: { + filters: basicFilters, + initialValues: { + category: '', + price: '', + rating: [], + sort: 'relevance', + search: '', + }, + hasLeadingItem: false, + }, + render: ({ filters, initialValues }) => { + // eslint-disable-next-line react-hooks/rules-of-hooks + const [currentFilters, setCurrentFilters] = useState(initialValues); + + const handleSubmit = (values: Partial) => { + console.log('Filters submitted:', values); + setCurrentFilters({ + ...currentFilters, + ...values, + }); + }; + + const handleReset = () => { + console.log('Filters reset'); + setCurrentFilters(initialValues); + }; + + return ( +
+ +
+

Current Filters:

+
{JSON.stringify(currentFilters, null, 2)}
+
+
+ ); + }, +}; diff --git a/packages/ui/src/components/Filters/Filters.tsx b/packages/ui/src/components/Filters/Filters.tsx index 23be1add5..e8fe7fa2b 100644 --- a/packages/ui/src/components/Filters/Filters.tsx +++ b/packages/ui/src/components/Filters/Filters.tsx @@ -16,20 +16,17 @@ import { useFiltersContext } from './FiltersContext'; function separateLeadingItem(items: Models.Filters.FilterItem[]) { let leadingItem: Models.Filters.FilterItem | undefined; - let viewModeToggle: Models.Filters.FilterViewModeToggle | undefined; const filteredItems: Models.Filters.FilterItem[] = []; for (const item of items) { - if (item.__typename === 'FilterViewModeToggle') { - viewModeToggle = item; - } else if (item.isLeading === true && leadingItem === undefined) { + if ('isLeading' in item && item.isLeading === true && leadingItem === undefined) { leadingItem = item; } else { filteredItems.push(item); } } - return { leadingItem, viewModeToggle, filteredItems }; + return { leadingItem, filteredItems }; } export const Filters = ({ @@ -37,6 +34,8 @@ export const Filters = ({ initialValues, onSubmit, onReset, + hasLeadingItem, + variant = 'drawer', labels, }: Readonly>) => { const [filtersOpen, setFiltersOpen] = useState(false); @@ -48,7 +47,9 @@ export const Filters = ({ const { label, title, description, submit, reset, items, removeFilters } = filters; - const { leadingItem, viewModeToggle, filteredItems } = separateLeadingItem(items); + const { leadingItem, filteredItems } = hasLeadingItem + ? separateLeadingItem(items) + : { leadingItem: undefined, filteredItems: items }; const handleReset = (e: React.MouseEvent) => { e.preventDefault(); @@ -56,6 +57,57 @@ export const Filters = ({ onReset(); }; + // Inline variant: render filters directly without drawer + if (variant === 'inline') { + return ( +
+ + initialValues={initialValues} + enableReinitialize={true} + onSubmit={(values) => { + countActiveFilters(values); + onSubmit(values); + }} + > + {({ submitForm, setFieldValue }) => ( +
+
+ {/* Filters container - grid layout for desktop, full-width rows for mobile */} +
+ {items.map((item) => ( +
+ +
+ ))} +
+ {/* Action buttons - right-aligned on desktop, stretched on mobile */} +
+ + +
+
+
+ )} + +
+ ); + } + + // Drawer variant: original implementation return (
@@ -70,31 +122,20 @@ export const Filters = ({ {({ submitForm, setFieldValue }) => ( <>
-
- {leadingItem && ( -
- - - -
- )} - {viewModeToggle && ( - - )} -
-
+ {leadingItem !== undefined && ( +
+ + + +
+ )} +
{activeFilters > 0 && (