diff --git a/src/components/RangeDatePicker/__stories__/RangeDatePickerWithPresets.scss b/src/components/RangeDatePicker/__stories__/RangeDatePickerWithPresets.scss new file mode 100644 index 0000000..0fe2689 --- /dev/null +++ b/src/components/RangeDatePicker/__stories__/RangeDatePickerWithPresets.scss @@ -0,0 +1,17 @@ +@use '../../variables'; + +$tabs: '.#{variables.$ns}range-date-picker-with-preset__tabs'; +$range: '.#{variables.$ns}range-date-picker-with-preset__range'; + +#{$tabs} { + padding: 0 12px; +} + +#{$range} { + padding: 8px 0 8px 8px; + + cursor: pointer; + + border: none; + background: none; +} diff --git a/src/components/RangeDatePicker/__stories__/RangeDatePickerWithPresets.stories.tsx b/src/components/RangeDatePicker/__stories__/RangeDatePickerWithPresets.stories.tsx new file mode 100644 index 0000000..d2c5e06 --- /dev/null +++ b/src/components/RangeDatePicker/__stories__/RangeDatePickerWithPresets.stories.tsx @@ -0,0 +1,143 @@ +import React from 'react'; + +import {dateTimeParse} from '@gravity-ui/date-utils'; +import {Flex, Tab, TabList, TabPanel, TabProvider} from '@gravity-ui/uikit'; +import type {Meta, StoryObj} from '@storybook/react-webpack5'; +import {action} from 'storybook/actions'; + +import {RangeCalendar} from '../../Calendar'; +import {RangeDatePicker} from '../RangeDatePicker'; + +import {Default} from './RangeDatePicker.stories'; + +import './RangeDatePickerWithPresets.scss'; + +const meta: Meta = { + title: 'Components/RangeDatePicker', + component: RangeDatePicker, + tags: ['autodocs'], + args: { + onFocus: action('onFocus'), + onBlur: action('onBlur'), + }, +}; + +export default meta; + +type Story = StoryObj; + +type DurationUnit = 'days' | 'months' | 'quarters' | 'years'; +type DurationRange = {start: string; end: string}; + +type DateRandgeMode = {id: DurationUnit; title: string}; + +const DATE_RANGE_MODES: DateRandgeMode[] = [ + {id: 'days', title: 'Day'}, + {id: 'months', title: 'Month'}, + {id: 'quarters', title: 'Quarter'}, + {id: 'years', title: 'Year'}, +]; + +type DateRangePreset = { + [key in DurationUnit]: Array<{ + title: string; + value: DurationRange; + }>; +}; + +const DATE_RANGE_PRESETS: DateRangePreset = { + days: [ + {title: '7 days', value: {start: 'now-7d', end: 'now'}}, + {title: '30 days', value: {start: 'now-30d', end: 'now'}}, + {title: '90 days', value: {start: 'now-90d', end: 'now'}}, + { + title: '365 days', + value: {start: 'now-365d', end: 'now'}, + }, + ], + months: [ + { + title: 'Past', + value: {start: 'now-1M/M', end: 'now-1M/M+1M-1d'}, + }, + { + title: 'Current', + value: {start: 'now/M', end: 'now/M+1M-1d'}, + }, + ], + quarters: [ + { + title: 'Past', + value: {start: 'now-1Q/Q', end: 'now-1Q/Q+1Q-1d'}, + }, + { + title: 'Current', + value: {start: 'now/Q', end: 'now/Q+1Q-1d'}, + }, + ], + years: [ + { + title: 'Past', + value: {start: 'now-1y/y', end: 'now-1y/y+1y-1d'}, + }, + { + title: 'Current', + value: {start: 'now/y', end: 'now/y+1y-1d'}, + }, + ], +}; + +export const WithPresets = { + ...Default, + render: function WithPresets(args) { + const [mode, setMode] = React.useState('days'); + + return ( +
+ {Default.render({ + ...args, + children: (props) => ( + setMode(value as DurationUnit)} + > + + {DATE_RANGE_MODES.map(({id, title}) => ( + + {title} + + ))} + + + + {DATE_RANGE_PRESETS[mode].map(({title, value}) => ( + + ))} + + + + + ), + })} +
+ ); + }, +} satisfies Story;