import React from 'react'
import { type Meta, type StoryObj } from '@storybook/react-vite'
import { cleanUpValues } from '../../services/FilterHelperServiceTyped'
import { DocsTemplate } from '../../../.storybook'
const FilterDisplay = ({ filters, label }) => {
const cleanedFilters = cleanUpValues(filters)
return (
{label}
Original Filters:
{JSON.stringify(filters, null, 2)}
Cleaned Filters (for URL params):
{JSON.stringify(cleanedFilters, null, 2)}
)
}
export default {
title: 'Helper Functions/cleanUpValues',
component: FilterDisplay,
parameters: {
viewMode: 'docs',
previewTabs: {
canvas: { hidden: true },
},
docs: {
page: () => (
Core features:
-
Transforms filter objects into a standardized format for URL
parameters
-
Handles multiple filter types (dates, include/exclude,
ID-based, strings)
- Returns null if no valid filters are found
,
Supported filter types:
-
Date filters: Processes both timeframe dates
(startDate/endDate) and date ranges (start_date/end_date)
-
Include/exclude filters: Extracts the
defaultValue property
-
ID-based filters: Special handling for
fulfillment, warehouse_status, and purchase_order_states
-
String filters: Passes through non-empty string
values directly
,
Common use cases:
-
Processing filter objects before sending them as URL
parameters
-
Standardizing filter formats across different components
- Preparing filters for API requests
- Normalizing date ranges for consistent processing
,
Best practices:
-
Use this function when preparing filter objects for API
requests
-
Ensure your filter objects follow the expected structure for
each filter type
-
Handle the case when the function returns null (no valid
filters)
,
]}
/>
),
source: {
code: false,
},
},
},
argTypes: {
label: {
control: 'text',
description: 'Label for the filter example',
},
filters: {
control: 'object',
description: 'Filter object to clean up',
},
},
} as Meta
type Story = StoryObj
const Template: Story = {
render: (args) => {
return
},
}
export const DateFilters: Story = {
...Template,
args: {
label: 'Date Filters Example',
filters: {
dates: {
startDate: '2023-01-01',
endDate: '2023-01-31',
},
},
},
}
export const DateRangeFilters: Story = {
...Template,
args: {
label: 'Date Range Filters Example',
filters: {
activity_date: {
start_date: '2023-01-01',
end_date: '2023-01-31',
},
},
},
}
export const IncludeExcludeFilters: Story = {
...Template,
args: {
label: 'Include/Exclude Filters Example',
filters: {
include: {
defaultValue: ['item1', 'item2'],
},
exclude: {
defaultValue: ['item3'],
},
},
},
}
export const IDBasedFilters: Story = {
...Template,
args: {
label: 'ID-Based Filters Example',
filters: {
fulfillment: {
id: 1,
value: 'shipped',
},
warehouse_status: {
id: 2,
state: 'in_progress',
},
purchase_order_states: {
id: 3,
state: 'completed',
},
category: {
id: 4,
name: 'Electronics',
},
},
},
}
export const StringFilters: Story = {
...Template,
args: {
label: 'String Filters Example',
filters: {
search_term: 'example search',
status: 'active',
},
},
}
export const ComplexFilters: Story = {
...Template,
args: {
label: 'Complex Mixed Filters Example',
filters: {
dates: {
startDate: '2023-01-01',
endDate: '2023-01-31',
},
activity_date: {
start_date: '2023-02-01',
end_date: '2023-02-28',
},
include: {
defaultValue: ['item1', 'item2'],
},
fulfillment: {
id: 1,
value: 'shipped',
},
search_term: 'example search',
},
},
}
export const EmptyFilters: Story = {
...Template,
args: {
label: 'Empty Filters Example',
filters: {},
},
}
export const NullFilters: Story = {
...Template,
args: {
label: 'Null Filters Example',
filters: null,
},
}