Compare commits

...
Author SHA1 Message Date
Sonarly Claude Code 651dbb0a76 fix: handle relative date filter values in RLS permission value input
https://sonarly.com/issue/22233?type=bug

When configuring record-level permissions (RLS) on a date/datetime field with a relative date operand (IS_RELATIVE), the value input crashes because the relative date string is passed directly to Temporal.Instant.from() which cannot parse it.
2026-04-06 17:53:54 +00:00
@@ -4,7 +4,7 @@ import { styled } from '@linaria/react';
import { t } from '@lingui/core/macro';
import { useContext, useMemo } from 'react';
import { FieldMetadataType, CoreObjectNameSingular } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { isDefined, type RelativeDateFilter } from 'twenty-shared/utils';
import { AppTooltip, IconEraser, TooltipDelay } from 'twenty-ui/display';
import { type JsonValue } from 'type-fest';
@@ -20,10 +20,13 @@ import { getCompositeSubFieldType } from '@/object-record/object-filter-dropdown
import { isCompositeFieldType } from '@/object-record/object-filter-dropdown/utils/isCompositeFieldType';
import { FormFieldInput } from '@/object-record/record-field/ui/components/FormFieldInput';
import { FormMultiSelectFieldInput } from '@/object-record/record-field/ui/form-types/components/FormMultiSelectFieldInput';
import { FormRelativeDatePicker } from '@/object-record/record-field/ui/form-types/components/FormRelativeDatePicker';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
import { type CompositeFieldType } from '@/settings/data-model/types/CompositeFieldType';
import { createRecordLevelPermissionVariablePicker } from '@/settings/roles/role-permissions/object-level-permissions/record-level-permissions/components/SettingsRolePermissionsObjectLevelRecordLevelPermissionVariablePicker';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { stringifyRelativeDateFilter } from '@/views/view-filter-value/utils/stringifyRelativeDateFilter';
import { ThemeContext, themeCssVariables } from 'twenty-ui/theme-constants';
const StyledContainer = styled.div`
@@ -200,6 +203,14 @@ export const SettingsRolePermissionsObjectLevelRecordLevelPermissionValueInput =
upsertObjectFilterDropdownCurrentFilter(updatedFilter);
};
const handleRelativeDateFilterChange = (
newValue: RelativeDateFilter,
) => {
applyObjectFilterDropdownFilterValue(
stringifyRelativeDateFilter(newValue),
);
};
if (isDynamicMode) {
const tooltipId = `record-level-permission-value-${recordFilterId}`;
const fullLabel = isDefined(workspaceMemberFieldLabel)
@@ -318,6 +329,27 @@ export const SettingsRolePermissionsObjectLevelRecordLevelPermissionValueInput =
);
}
const isFilterableByDateValue =
fieldDefinition.type === FieldMetadataType.DATE ||
fieldDefinition.type === FieldMetadataType.DATE_TIME;
const isRelativeDateFilter =
isFilterableByDateValue &&
recordFilter.operand === RecordFilterOperand.IS_RELATIVE;
if (isRelativeDateFilter) {
return (
<StyledContainer>
<StyledFormFieldInputWrapper>
<FormRelativeDatePicker
defaultValue={recordFilter.value}
onChange={handleRelativeDateFilterChange}
/>
</StyledFormFieldInputWrapper>
</StyledContainer>
);
}
return (
<StyledContainer>
<StyledFormFieldInputWrapper>