Baptiste Devessier
2025-11-26 14:45:05 +01:00
committed by GitHub
parent 996ccd8353
commit dc2c2c413c
16 changed files with 49 additions and 19 deletions
@@ -49,8 +49,12 @@ export const AdvancedFilterDropdownFilterInput = ({
<AdvancedFilterDropdownTextInput recordFilter={recordFilter} /> <AdvancedFilterDropdownTextInput recordFilter={recordFilter} />
))} ))}
{filterType === 'RATING' && <ObjectFilterDropdownRatingInput />} {filterType === 'RATING' && <ObjectFilterDropdownRatingInput />}
{filterType === 'DATE_TIME' && <ObjectFilterDropdownDateTimeInput />} {filterType === 'DATE_TIME' && (
{filterType === 'DATE' && <ObjectFilterDropdownDateInput />} <ObjectFilterDropdownDateTimeInput instanceId={filterDropdownId} />
)}
{filterType === 'DATE' && (
<ObjectFilterDropdownDateInput instanceId={filterDropdownId} />
)}
{filterType === 'RELATION' && ( {filterType === 'RELATION' && (
<DropdownContent widthInPixels={GenericDropdownContentWidth.ExtraLarge}> <DropdownContent widthInPixels={GenericDropdownContentWidth.ExtraLarge}>
<ObjectFilterDropdownSearchInput /> <ObjectFilterDropdownSearchInput />
@@ -24,7 +24,13 @@ import {
import { dateLocaleState } from '~/localization/states/dateLocaleState'; import { dateLocaleState } from '~/localization/states/dateLocaleState';
import { formatDateString } from '~/utils/string/formatDateString'; import { formatDateString } from '~/utils/string/formatDateString';
export const ObjectFilterDropdownDateInput = () => { type ObjectFilterDropdownDateInputProps = {
instanceId: string;
};
export const ObjectFilterDropdownDateInput = ({
instanceId,
}: ObjectFilterDropdownDateInputProps) => {
const { dateFormat, timeZone } = useContext(UserContext); const { dateFormat, timeZone } = useContext(UserContext);
const dateLocale = useRecoilValue(dateLocaleState); const dateLocale = useRecoilValue(dateLocaleState);
const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState); const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState);
@@ -109,6 +115,7 @@ export const ObjectFilterDropdownDateInput = () => {
return ( return (
<DatePicker <DatePicker
instanceId={instanceId}
relativeDate={relativeDate} relativeDate={relativeDate}
isRelative={isRelativeOperand} isRelative={isRelativeOperand}
date={plainDateValue ?? null} date={plainDateValue ?? null}
@@ -24,7 +24,13 @@ import {
import { dateLocaleState } from '~/localization/states/dateLocaleState'; import { dateLocaleState } from '~/localization/states/dateLocaleState';
import { formatDateTimeString } from '~/utils/string/formatDateTimeString'; import { formatDateTimeString } from '~/utils/string/formatDateTimeString';
export const ObjectFilterDropdownDateTimeInput = () => { type ObjectFilterDropdownDateTimeInputProps = {
instanceId: string;
};
export const ObjectFilterDropdownDateTimeInput = ({
instanceId,
}: ObjectFilterDropdownDateTimeInputProps) => {
const { dateFormat, timeFormat, timeZone } = useContext(UserContext); const { dateFormat, timeFormat, timeZone } = useContext(UserContext);
const dateLocale = useRecoilValue(dateLocaleState); const dateLocale = useRecoilValue(dateLocaleState);
const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState); const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState);
@@ -112,6 +118,7 @@ export const ObjectFilterDropdownDateTimeInput = () => {
return ( return (
<DateTimePicker <DateTimePicker
instanceId={instanceId}
relativeDate={relativeDate} relativeDate={relativeDate}
isRelative={isRelativeOperand} isRelative={isRelativeOperand}
date={internalDate} date={internalDate}
@@ -82,7 +82,7 @@ export const ObjectFilterDropdownFilterInput = ({
<> <>
<ObjectFilterDropdownInnerSelectOperandDropdown /> <ObjectFilterDropdownInnerSelectOperandDropdown />
<DropdownMenuSeparator /> <DropdownMenuSeparator />
<ObjectFilterDropdownDateInput /> <ObjectFilterDropdownDateInput instanceId={filterDropdownId} />
</> </>
); );
} else if (filterType === 'DATE_TIME') { } else if (filterType === 'DATE_TIME') {
@@ -90,7 +90,7 @@ export const ObjectFilterDropdownFilterInput = ({
<> <>
<ObjectFilterDropdownInnerSelectOperandDropdown /> <ObjectFilterDropdownInnerSelectOperandDropdown />
<DropdownMenuSeparator /> <DropdownMenuSeparator />
<ObjectFilterDropdownDateTimeInput /> <ObjectFilterDropdownDateTimeInput instanceId={filterDropdownId} />
</> </>
); );
} else { } else {
@@ -13,13 +13,9 @@ import { useUserTimezone } from '@/ui/input/components/internal/date/hooks/useUs
import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue';
import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState';
import { stringifyRelativeDateFilter } from '@/views/view-filter-value/utils/stringifyRelativeDateFilter'; import { stringifyRelativeDateFilter } from '@/views/view-filter-value/utils/stringifyRelativeDateFilter';
import { DEFAULT_RELATIVE_DATE_FILTER_VALUE } from 'twenty-shared/constants';
import { import { isDefined, type RelativeDateFilter } from 'twenty-shared/utils';
isDefined,
type RelativeDateFilter,
type RelativeDateFilterDirection,
type RelativeDateFilterUnit,
} from 'twenty-shared/utils';
export const useApplyObjectFilterDropdownOperand = () => { export const useApplyObjectFilterDropdownOperand = () => {
const objectFilterDropdownCurrentRecordFilter = useRecoilComponentValue( const objectFilterDropdownCurrentRecordFilter = useRecoilComponentValue(
@@ -108,9 +104,7 @@ export const useApplyObjectFilterDropdownOperand = () => {
recordFilterToUpsert.displayValue = displayValue; recordFilterToUpsert.displayValue = displayValue;
} else if (newOperand === RecordFilterOperand.IS_RELATIVE) { } else if (newOperand === RecordFilterOperand.IS_RELATIVE) {
const defaultRelativeDate: RelativeDateFilter = { const defaultRelativeDate: RelativeDateFilter = {
direction: 'THIS' as RelativeDateFilterDirection, ...DEFAULT_RELATIVE_DATE_FILTER_VALUE,
amount: 1,
unit: 'DAY' as RelativeDateFilterUnit,
timezone: userTimezone, timezone: userTimezone,
}; };
@@ -121,6 +121,7 @@ export const RecordCalendarTopBar = () => {
dropdownComponents={ dropdownComponents={
<DropdownContent widthInPixels={280}> <DropdownContent widthInPixels={280}>
<DateTimePicker <DateTimePicker
instanceId={recordCalendarId}
date={recordCalendarSelectedDate} date={recordCalendarSelectedDate}
onChange={handleDateChange} onChange={handleDateChange}
onClose={handleDateChange} onClose={handleDateChange}
@@ -337,6 +337,7 @@ export const FormDateFieldInput = ({
<StyledDateInputAbsoluteContainer> <StyledDateInputAbsoluteContainer>
<OverlayContainer> <OverlayContainer>
<DatePicker <DatePicker
instanceId={instanceId}
date={pickerDate} date={pickerDate}
onChange={handlePickerChange} onChange={handlePickerChange}
onClose={handlePickerMouseSelect} onClose={handlePickerMouseSelect}
@@ -336,6 +336,7 @@ export const FormDateTimeFieldInput = ({
<StyledDateInputAbsoluteContainer> <StyledDateInputAbsoluteContainer>
<OverlayContainer> <OverlayContainer>
<DateTimePicker <DateTimePicker
instanceId={instanceId}
date={pickerDate ?? new Date()} date={pickerDate ?? new Date()}
onChange={handlePickerChange} onChange={handlePickerChange}
onClose={handlePickerMouseSelect} onClose={handlePickerMouseSelect}
@@ -1,6 +1,7 @@
import { RelativeDatePickerHeader } from '@/ui/input/components/internal/date/components/RelativeDatePickerHeader'; import { RelativeDatePickerHeader } from '@/ui/input/components/internal/date/components/RelativeDatePickerHeader';
import { isNonEmptyString, isString } from '@sniptt/guards'; import { isNonEmptyString, isString } from '@sniptt/guards';
import { useId } from 'react';
import { DEFAULT_RELATIVE_DATE_FILTER_VALUE } from 'twenty-shared/constants'; import { DEFAULT_RELATIVE_DATE_FILTER_VALUE } from 'twenty-shared/constants';
import { import {
@@ -21,6 +22,8 @@ export const FormRelativeDatePicker = ({
onChange, onChange,
readonly, readonly,
}: FormRelativeDatePickerProps) => { }: FormRelativeDatePickerProps) => {
const instanceId = useId();
const value = const value =
isString(defaultValue) && isNonEmptyString(defaultValue) isString(defaultValue) && isNonEmptyString(defaultValue)
? safeParseRelativeDateFilterJSONStringified(defaultValue) ? safeParseRelativeDateFilterJSONStringified(defaultValue)
@@ -32,6 +35,7 @@ export const FormRelativeDatePicker = ({
return ( return (
<RelativeDatePickerHeader <RelativeDatePickerHeader
instanceId={instanceId}
onChange={handleValueChange} onChange={handleValueChange}
direction={value?.direction ?? 'THIS'} direction={value?.direction ?? 'THIS'}
unit={value?.unit ?? 'DAY'} unit={value?.unit ?? 'DAY'}
@@ -109,6 +109,7 @@ export const DateInput = ({
return ( return (
<div ref={wrapperRef}> <div ref={wrapperRef}>
<DatePicker <DatePicker
instanceId={instanceId}
date={internalValue ?? null} date={internalValue ?? null}
onChange={handleChange} onChange={handleChange}
onClose={handleClose} onClose={handleClose}
@@ -109,6 +109,7 @@ export const DateTimeInput = ({
return ( return (
<div ref={wrapperRef}> <div ref={wrapperRef}>
<DateTimePicker <DateTimePicker
instanceId={instanceId}
date={internalValue ?? null} date={internalValue ?? null}
onChange={handleChange} onChange={handleChange}
onClose={handleClose} onClose={handleClose}
@@ -302,6 +302,7 @@ const StyledDatePickerFallback = styled.div`
`; `;
type DatePickerProps = { type DatePickerProps = {
instanceId: string;
isRelative?: boolean; isRelative?: boolean;
hideHeaderInput?: boolean; hideHeaderInput?: boolean;
date: Nullable<string>; date: Nullable<string>;
@@ -333,6 +334,7 @@ const ReactDatePicker = lazy<ComponentType<DatePickerPropsType>>(() =>
); );
export const DatePicker = ({ export const DatePicker = ({
instanceId,
date, date,
onChange, onChange,
onClose, onClose,
@@ -476,6 +478,7 @@ export const DatePicker = ({
}) => }) =>
isRelative ? ( isRelative ? (
<RelativeDatePickerHeader <RelativeDatePickerHeader
instanceId={instanceId}
direction={relativeDate?.direction ?? 'PAST'} direction={relativeDate?.direction ?? 'PAST'}
amount={relativeDate?.amount} amount={relativeDate?.amount}
unit={relativeDate?.unit ?? 'DAY'} unit={relativeDate?.unit ?? 'DAY'}
@@ -300,6 +300,7 @@ const StyledDatePickerFallback = styled.div`
`; `;
type DateTimePickerProps = { type DateTimePickerProps = {
instanceId: string;
isRelative?: boolean; isRelative?: boolean;
hideHeaderInput?: boolean; hideHeaderInput?: boolean;
date: Date | null; date: Date | null;
@@ -331,6 +332,7 @@ const ReactDatePicker = lazy<ComponentType<DatePickerPropsType>>(() =>
); );
export const DateTimePicker = ({ export const DateTimePicker = ({
instanceId,
date, date,
onChange, onChange,
onClose, onClose,
@@ -484,6 +486,7 @@ export const DateTimePicker = ({
}) => }) =>
isRelative ? ( isRelative ? (
<RelativeDatePickerHeader <RelativeDatePickerHeader
instanceId={instanceId}
direction={relativeDate?.direction ?? 'PAST'} direction={relativeDate?.direction ?? 'PAST'}
amount={relativeDate?.amount} amount={relativeDate?.amount}
unit={relativeDate?.unit ?? 'DAY'} unit={relativeDate?.unit ?? 'DAY'}
@@ -21,6 +21,7 @@ const StyledContainer = styled.div<{ noPadding: boolean }>`
`; `;
type RelativeDatePickerHeaderProps = { type RelativeDatePickerHeaderProps = {
instanceId: string;
direction: RelativeDateFilterDirection; direction: RelativeDateFilterDirection;
amount?: Nullable<number>; amount?: Nullable<number>;
unit: RelativeDateFilterUnit; unit: RelativeDateFilterUnit;
@@ -31,6 +32,7 @@ type RelativeDatePickerHeaderProps = {
}; };
export const RelativeDatePickerHeader = ({ export const RelativeDatePickerHeader = ({
instanceId,
direction, direction,
unit, unit,
amount, amount,
@@ -53,7 +55,7 @@ export const RelativeDatePickerHeader = ({
return ( return (
<StyledContainer noPadding={isFormField ?? false}> <StyledContainer noPadding={isFormField ?? false}>
<Select <Select
dropdownId="direction-select" dropdownId={`direction-select-${instanceId}`}
value={direction} value={direction}
onChange={(newDirection) => { onChange={(newDirection) => {
if (amount === undefined && newDirection !== 'THIS') { if (amount === undefined && newDirection !== 'THIS') {
@@ -71,7 +73,7 @@ export const RelativeDatePickerHeader = ({
disabled={readonly} disabled={readonly}
/> />
<SettingsTextInput <SettingsTextInput
instanceId="relative-date-picker-amount" instanceId={`relative-date-picker-amount-${instanceId}`}
width={50} width={50}
value={textInputValue} value={textInputValue}
onChange={(text) => { onChange={(text) => {
@@ -92,7 +94,7 @@ export const RelativeDatePickerHeader = ({
disabled={direction === 'THIS' || readonly} disabled={direction === 'THIS' || readonly}
/> />
<Select <Select
dropdownId="unit-select" dropdownId={`unit-select-${instanceId}`}
value={unit} value={unit}
onChange={(newUnit) => { onChange={(newUnit) => {
if (direction !== 'THIS' && amount === undefined) { if (direction !== 'THIS' && amount === undefined) {
@@ -17,6 +17,7 @@ const meta: Meta<typeof DateTimePicker> = {
const [, updateArgs] = useArgs(); const [, updateArgs] = useArgs();
return ( return (
<DateTimePicker <DateTimePicker
instanceId="story-date-time-picker"
date={isDefined(date) ? new Date(date) : new Date()} date={isDefined(date) ? new Date(date) : new Date()}
onChange={(newDate) => updateArgs({ date: newDate })} onChange={(newDate) => updateArgs({ date: newDate })}
/> />
@@ -3,5 +3,5 @@ import { type RelativeDateFilter } from '@/utils';
export const DEFAULT_RELATIVE_DATE_FILTER_VALUE: RelativeDateFilter = { export const DEFAULT_RELATIVE_DATE_FILTER_VALUE: RelativeDateFilter = {
direction: 'THIS', direction: 'THIS',
unit: 'DAY', unit: 'DAY',
amount: undefined, amount: 1,
}; };