Skip to content

Commit f0036ff

Browse files
authored
feat(RelativeDate): support custom relative date input parser (#65)
1 parent 08e6838 commit f0036ff

File tree

5 files changed

+33
-11
lines changed

5 files changed

+33
-11
lines changed

src/components/RelativeDateField/hooks/useRelativeDateFieldState.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import React from 'react';
22

3-
import {dateTimeParse, isValid} from '@gravity-ui/date-utils';
3+
import {
4+
dateTimeParse,
5+
// @ts-expect-error added in new version of date-utils
6+
isLikeRelative,
7+
isValid,
8+
} from '@gravity-ui/date-utils';
49
import type {DateTime} from '@gravity-ui/date-utils';
510
import {useControlledState} from '@gravity-ui/uikit';
611

@@ -99,5 +104,8 @@ export function useRelativeDateFieldState(props: RelativeDateFieldOptions): Rela
99104
}
100105

101106
function isLikeRelativeDate(text: string) {
107+
if (typeof isLikeRelative === 'function') {
108+
return isLikeRelative(text);
109+
}
102110
return /^now/i.test(text);
103111
}

src/components/RelativeRangeDatePicker/RelativeRangeDatePicker.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import type {
1818
import {getButtonSizeForInput} from '../utils/getButtonSizeForInput';
1919

2020
import {PickerDialog} from './components/PickerDialog/PickerDialog';
21+
import type {Preset} from './components/Presets/defaultPresets';
2122
import type {PresetTab} from './components/Presets/utils';
2223
import {useRelativeRangeDatePickerState} from './hooks/useRelativeRangeDatePickerState';
2324
import type {RelativeRangeDatePickerStateOptions} from './hooks/useRelativeRangeDatePickerState';
@@ -47,6 +48,8 @@ export interface RelativeRangeDatePickerProps
4748
withPresets?: boolean;
4849
/** Custom preset tabs */
4950
presetTabs?: PresetTab[];
51+
/** Custom docs for presets, if empty array docs will be hidden */
52+
docs?: Preset[];
5053
/** Show selected relative values as absolute dates */
5154
alwaysShowAsAbsolute?: boolean;
5255
/** */

src/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ function DialogContent(
135135
);
136136
}}
137137
minValue={props.minValue}
138+
docs={props.docs}
138139
/>
139140
) : null}
140141
{props.withZonesList ? (

src/components/RelativeRangeDatePicker/components/Presets/Presets.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface PresetProps {
2121
minValue?: DateTime;
2222
size?: 's' | 'm' | 'l' | 'xl';
2323
presetTabs?: PresetTab[];
24+
docs?: Preset[];
2425
}
2526
export function Presets({
2627
className,
@@ -29,6 +30,7 @@ export function Presets({
2930
withTime,
3031
onChoosePreset,
3132
presetTabs,
33+
docs,
3234
}: PresetProps) {
3335
const tabs = React.useMemo(() => {
3436
return filterPresetTabs(presetTabs ?? getDefaultPresetTabs({withTime}), {minValue});
@@ -58,7 +60,7 @@ export function Presets({
5860
items={tabs}
5961
size={size === 's' ? 'm' : size}
6062
/>
61-
<PresetsDoc className={b('doc')} size={size} />
63+
<PresetsDoc className={b('doc')} size={size} docs={docs} />
6264
</div>
6365
<div className={b('content')}>
6466
<PresetsList

src/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.tsx

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,22 +75,24 @@ const data: Preset[] = [
7575

7676
interface PresetsExamplesProps {
7777
size?: 's' | 'm' | 'l' | 'xl';
78+
docs: Preset[];
7879
}
79-
function PresetsExamples({size}: PresetsExamplesProps) {
80-
return <Table columns={columns} data={data} className={b('table', {size})} />;
80+
function PresetsExamples({size, docs}: PresetsExamplesProps) {
81+
return <Table columns={columns} data={docs} className={b('table', {size})} />;
8182
}
8283

8384
interface DesktopDocProps {
8485
className?: string;
8586
size?: 's' | 'm' | 'l' | 'xl';
87+
docs: Preset[];
8688
}
87-
function DesktopDoc({className, size}: DesktopDocProps) {
89+
function DesktopDoc({className, size, docs}: DesktopDocProps) {
8890
return (
8991
<Popover
9092
className={b(null, className)}
9193
tooltipContentClassName={b('content')}
9294
hasArrow={false}
93-
content={<PresetsExamples size={size} />}
95+
content={<PresetsExamples size={size} docs={docs} />}
9496
>
9597
<Button
9698
className={b('button')}
@@ -106,8 +108,9 @@ function DesktopDoc({className, size}: DesktopDocProps) {
106108
interface MobileDocProps {
107109
className?: string;
108110
size?: 's' | 'm' | 'l' | 'xl';
111+
docs: Preset[];
109112
}
110-
function MobileDoc({className, size}: MobileDocProps) {
113+
function MobileDoc({className, size, docs}: MobileDocProps) {
111114
const [open, setOpen] = React.useState(false);
112115
return (
113116
<div className={b(null, className)}>
@@ -122,7 +125,7 @@ function MobileDoc({className, size}: MobileDocProps) {
122125
<Icon data={CircleQuestion} />
123126
</Button>
124127
<Sheet visible={open} onClose={() => setOpen(false)}>
125-
<PresetsExamples size={size} />
128+
<PresetsExamples size={size} docs={docs} />
126129
</Sheet>
127130
</div>
128131
);
@@ -131,14 +134,19 @@ function MobileDoc({className, size}: MobileDocProps) {
131134
interface PresetsDocProps {
132135
className?: string;
133136
size?: 's' | 'm' | 'l' | 'xl';
137+
docs?: Preset[];
134138
}
135139

136-
export function PresetsDoc({className, size}: PresetsDocProps) {
140+
export function PresetsDoc({className, size, docs = data}: PresetsDocProps) {
137141
const isMobile = useMobile();
138142

143+
if (!Array.isArray(docs) || docs.length === 0) {
144+
return null;
145+
}
146+
139147
if (isMobile) {
140-
return <MobileDoc className={className} size={size} />;
148+
return <MobileDoc className={className} size={size} docs={docs} />;
141149
}
142150

143-
return <DesktopDoc className={className} size={size} />;
151+
return <DesktopDoc className={className} size={size} docs={docs} />;
144152
}

0 commit comments

Comments
 (0)