@ -1,4 +1,5 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
import { v4 } from 'uuid';
|
||||||
|
|
||||||
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
||||||
import { InternalDatePicker } from '@/ui/input/components/internal/date/components/InternalDatePicker';
|
import { InternalDatePicker } from '@/ui/input/components/internal/date/components/InternalDatePicker';
|
||||||
@ -8,6 +9,7 @@ export const ObjectFilterDropdownDateInput = () => {
|
|||||||
const {
|
const {
|
||||||
filterDefinitionUsedInDropdownState,
|
filterDefinitionUsedInDropdownState,
|
||||||
selectedOperandInDropdownState,
|
selectedOperandInDropdownState,
|
||||||
|
selectedFilterState,
|
||||||
setIsObjectFilterDropdownUnfolded,
|
setIsObjectFilterDropdownUnfolded,
|
||||||
selectFilter,
|
selectFilter,
|
||||||
} = useFilterDropdown();
|
} = useFilterDropdown();
|
||||||
@ -19,10 +21,13 @@ export const ObjectFilterDropdownDateInput = () => {
|
|||||||
selectedOperandInDropdownState,
|
selectedOperandInDropdownState,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const selectedFilter = useRecoilValue(selectedFilterState);
|
||||||
|
|
||||||
const handleChange = (date: Date | null) => {
|
const handleChange = (date: Date | null) => {
|
||||||
if (!filterDefinitionUsedInDropdown || !selectedOperandInDropdown) return;
|
if (!filterDefinitionUsedInDropdown || !selectedOperandInDropdown) return;
|
||||||
|
|
||||||
selectFilter?.({
|
selectFilter?.({
|
||||||
|
id: selectedFilter?.id ? selectedFilter.id : v4(),
|
||||||
fieldMetadataId: filterDefinitionUsedInDropdown.fieldMetadataId,
|
fieldMetadataId: filterDefinitionUsedInDropdown.fieldMetadataId,
|
||||||
value: isDefined(date) ? date.toISOString() : '',
|
value: isDefined(date) ? date.toISOString() : '',
|
||||||
operand: selectedOperandInDropdown,
|
operand: selectedOperandInDropdown,
|
||||||
|
|||||||
@ -1,127 +0,0 @@
|
|||||||
import { useEffect, useState } from 'react';
|
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
|
|
||||||
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
|
||||||
import { SingleEntitySelectMenuItems } from '@/object-record/relation-picker/components/SingleEntitySelectMenuItems';
|
|
||||||
import { EntitiesForMultipleEntitySelect } from '@/object-record/relation-picker/types/EntitiesForMultipleEntitySelect';
|
|
||||||
import { EntityForSelect } from '@/object-record/relation-picker/types/EntityForSelect';
|
|
||||||
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
|
||||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
|
||||||
|
|
||||||
export const ObjectFilterDropdownEntitySearchSelect = ({
|
|
||||||
entitiesForSelect,
|
|
||||||
}: {
|
|
||||||
entitiesForSelect: EntitiesForMultipleEntitySelect<EntityForSelect>;
|
|
||||||
}) => {
|
|
||||||
const {
|
|
||||||
setObjectFilterDropdownSelectedEntityId,
|
|
||||||
filterDefinitionUsedInDropdownState,
|
|
||||||
selectedOperandInDropdownState,
|
|
||||||
objectFilterDropdownSearchInputState,
|
|
||||||
selectedFilterState,
|
|
||||||
selectFilter,
|
|
||||||
} = useFilterDropdown();
|
|
||||||
|
|
||||||
const filterDefinitionUsedInDropdown = useRecoilValue(
|
|
||||||
filterDefinitionUsedInDropdownState,
|
|
||||||
);
|
|
||||||
const selectedOperandInDropdown = useRecoilValue(
|
|
||||||
selectedOperandInDropdownState,
|
|
||||||
);
|
|
||||||
const objectFilterDropdownSearchInput = useRecoilValue(
|
|
||||||
objectFilterDropdownSearchInputState,
|
|
||||||
);
|
|
||||||
const selectedFilter = useRecoilValue(selectedFilterState);
|
|
||||||
|
|
||||||
const { closeDropdown } = useDropdown(OBJECT_FILTER_DROPDOWN_ID);
|
|
||||||
|
|
||||||
const [isAllEntitySelected, setIsAllEntitySelected] = useState(false);
|
|
||||||
|
|
||||||
const handleRecordSelected = (
|
|
||||||
selectedEntity: EntityForSelect | null | undefined,
|
|
||||||
) => {
|
|
||||||
if (
|
|
||||||
!filterDefinitionUsedInDropdown ||
|
|
||||||
!selectedOperandInDropdown ||
|
|
||||||
!selectedEntity
|
|
||||||
) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isAllEntitySelected) {
|
|
||||||
setIsAllEntitySelected(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
setObjectFilterDropdownSelectedEntityId(selectedEntity.id);
|
|
||||||
|
|
||||||
selectFilter?.({
|
|
||||||
displayValue: selectedEntity.name,
|
|
||||||
fieldMetadataId: filterDefinitionUsedInDropdown.fieldMetadataId,
|
|
||||||
operand: selectedOperandInDropdown,
|
|
||||||
value: selectedEntity.id,
|
|
||||||
displayAvatarUrl: selectedEntity.avatarUrl,
|
|
||||||
definition: filterDefinitionUsedInDropdown,
|
|
||||||
});
|
|
||||||
closeDropdown();
|
|
||||||
};
|
|
||||||
|
|
||||||
const isAllEntitySelectShown =
|
|
||||||
!!filterDefinitionUsedInDropdown?.selectAllLabel &&
|
|
||||||
!!filterDefinitionUsedInDropdown?.SelectAllIcon &&
|
|
||||||
(isAllEntitySelected ||
|
|
||||||
filterDefinitionUsedInDropdown?.selectAllLabel
|
|
||||||
.toLocaleLowerCase()
|
|
||||||
.includes(objectFilterDropdownSearchInput.toLocaleLowerCase()));
|
|
||||||
|
|
||||||
const handleAllEntitySelectClick = () => {
|
|
||||||
if (
|
|
||||||
!filterDefinitionUsedInDropdown ||
|
|
||||||
!selectedOperandInDropdown ||
|
|
||||||
!filterDefinitionUsedInDropdown.selectAllLabel
|
|
||||||
) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setIsAllEntitySelected(true);
|
|
||||||
setObjectFilterDropdownSelectedEntityId(null);
|
|
||||||
closeDropdown();
|
|
||||||
|
|
||||||
selectFilter?.({
|
|
||||||
displayValue: filterDefinitionUsedInDropdown.selectAllLabel,
|
|
||||||
fieldMetadataId: filterDefinitionUsedInDropdown.fieldMetadataId,
|
|
||||||
operand: ViewFilterOperand.IsNotNull,
|
|
||||||
value: '',
|
|
||||||
definition: filterDefinitionUsedInDropdown,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!selectedFilter) {
|
|
||||||
setObjectFilterDropdownSelectedEntityId(null);
|
|
||||||
} else {
|
|
||||||
setObjectFilterDropdownSelectedEntityId(selectedFilter.value);
|
|
||||||
setIsAllEntitySelected(
|
|
||||||
selectedFilter.operand === ViewFilterOperand.IsNotNull,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}, [
|
|
||||||
selectedFilter,
|
|
||||||
setObjectFilterDropdownSelectedEntityId,
|
|
||||||
entitiesForSelect.selectedEntities,
|
|
||||||
]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<SingleEntitySelectMenuItems
|
|
||||||
entitiesToSelect={entitiesForSelect.entitiesToSelect}
|
|
||||||
selectedEntity={entitiesForSelect.selectedEntities[0]}
|
|
||||||
loading={entitiesForSelect.loading}
|
|
||||||
onEntitySelected={handleRecordSelected}
|
|
||||||
SelectAllIcon={filterDefinitionUsedInDropdown?.SelectAllIcon}
|
|
||||||
selectAllLabel={filterDefinitionUsedInDropdown?.selectAllLabel}
|
|
||||||
isAllEntitySelected={isAllEntitySelected}
|
|
||||||
isAllEntitySelectShown={isAllEntitySelectShown}
|
|
||||||
onAllEntitySelected={handleAllEntitySelectClick}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@ -1,5 +1,6 @@
|
|||||||
import { ChangeEvent } from 'react';
|
import { ChangeEvent } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
import { v4 } from 'uuid';
|
||||||
|
|
||||||
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
||||||
import { DropdownMenuInput } from '@/ui/layout/dropdown/components/DropdownMenuInput';
|
import { DropdownMenuInput } from '@/ui/layout/dropdown/components/DropdownMenuInput';
|
||||||
@ -8,6 +9,7 @@ export const ObjectFilterDropdownNumberInput = () => {
|
|||||||
const {
|
const {
|
||||||
selectedOperandInDropdownState,
|
selectedOperandInDropdownState,
|
||||||
filterDefinitionUsedInDropdownState,
|
filterDefinitionUsedInDropdownState,
|
||||||
|
selectedFilterState,
|
||||||
selectFilter,
|
selectFilter,
|
||||||
} = useFilterDropdown();
|
} = useFilterDropdown();
|
||||||
|
|
||||||
@ -18,6 +20,8 @@ export const ObjectFilterDropdownNumberInput = () => {
|
|||||||
selectedOperandInDropdownState,
|
selectedOperandInDropdownState,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const selectedFilter = useRecoilValue(selectedFilterState);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
filterDefinitionUsedInDropdown &&
|
filterDefinitionUsedInDropdown &&
|
||||||
selectedOperandInDropdown && (
|
selectedOperandInDropdown && (
|
||||||
@ -27,6 +31,7 @@ export const ObjectFilterDropdownNumberInput = () => {
|
|||||||
placeholder={filterDefinitionUsedInDropdown.label}
|
placeholder={filterDefinitionUsedInDropdown.label}
|
||||||
onChange={(event: ChangeEvent<HTMLInputElement>) => {
|
onChange={(event: ChangeEvent<HTMLInputElement>) => {
|
||||||
selectFilter?.({
|
selectFilter?.({
|
||||||
|
id: selectedFilter?.id ? selectedFilter.id : v4(),
|
||||||
fieldMetadataId: filterDefinitionUsedInDropdown.fieldMetadataId,
|
fieldMetadataId: filterDefinitionUsedInDropdown.fieldMetadataId,
|
||||||
value: event.target.value,
|
value: event.target.value,
|
||||||
operand: selectedOperandInDropdown,
|
operand: selectedOperandInDropdown,
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
import { v4 } from 'uuid';
|
||||||
|
|
||||||
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
@ -42,6 +43,7 @@ export const ObjectFilterDropdownOperandSelect = () => {
|
|||||||
isDefined(selectedFilter)
|
isDefined(selectedFilter)
|
||||||
) {
|
) {
|
||||||
selectFilter?.({
|
selectFilter?.({
|
||||||
|
id: selectedFilter.id ? selectedFilter.id : v4(),
|
||||||
fieldMetadataId: selectedFilter.fieldMetadataId,
|
fieldMetadataId: selectedFilter.fieldMetadataId,
|
||||||
displayValue: selectedFilter.displayValue,
|
displayValue: selectedFilter.displayValue,
|
||||||
operand: newOperand,
|
operand: newOperand,
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
import { v4 } from 'uuid';
|
||||||
|
|
||||||
import { FieldMetadataItemOption } from '@/object-metadata/types/FieldMetadataItem';
|
import { FieldMetadataItemOption } from '@/object-metadata/types/FieldMetadataItem';
|
||||||
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
||||||
@ -22,6 +23,7 @@ export const ObjectFilterDropdownOptionSelect = () => {
|
|||||||
objectFilterDropdownSearchInputState,
|
objectFilterDropdownSearchInputState,
|
||||||
selectedOperandInDropdownState,
|
selectedOperandInDropdownState,
|
||||||
objectFilterDropdownSelectedOptionValuesState,
|
objectFilterDropdownSelectedOptionValuesState,
|
||||||
|
selectedFilterState,
|
||||||
selectFilter,
|
selectFilter,
|
||||||
} = useFilterDropdown();
|
} = useFilterDropdown();
|
||||||
|
|
||||||
@ -38,6 +40,8 @@ export const ObjectFilterDropdownOptionSelect = () => {
|
|||||||
objectFilterDropdownSelectedOptionValuesState,
|
objectFilterDropdownSelectedOptionValuesState,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const selectedFilter = useRecoilValue(selectedFilterState);
|
||||||
|
|
||||||
const fieldMetaDataId = filterDefinitionUsedInDropdown?.fieldMetadataId ?? '';
|
const fieldMetaDataId = filterDefinitionUsedInDropdown?.fieldMetadataId ?? '';
|
||||||
|
|
||||||
const { selectOptions } = useOptionsForSelect(fieldMetaDataId);
|
const { selectOptions } = useOptionsForSelect(fieldMetaDataId);
|
||||||
@ -96,6 +100,7 @@ export const ObjectFilterDropdownOptionSelect = () => {
|
|||||||
: EMPTY_FILTER_VALUE;
|
: EMPTY_FILTER_VALUE;
|
||||||
|
|
||||||
selectFilter({
|
selectFilter({
|
||||||
|
id: selectedFilter?.id ? selectedFilter.id : v4(),
|
||||||
definition: filterDefinitionUsedInDropdown,
|
definition: filterDefinitionUsedInDropdown,
|
||||||
operand: selectedOperandInDropdown,
|
operand: selectedOperandInDropdown,
|
||||||
displayValue: filterDisplayValue,
|
displayValue: filterDisplayValue,
|
||||||
|
|||||||
@ -1,9 +1,13 @@
|
|||||||
|
import { useState } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
import { v4 } from 'uuid';
|
||||||
|
|
||||||
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
||||||
import { MultipleRecordSelectDropdown } from '@/object-record/select/components/MultipleRecordSelectDropdown';
|
import { MultipleRecordSelectDropdown } from '@/object-record/select/components/MultipleRecordSelectDropdown';
|
||||||
import { useRecordsForSelect } from '@/object-record/select/hooks/useRecordsForSelect';
|
import { useRecordsForSelect } from '@/object-record/select/hooks/useRecordsForSelect';
|
||||||
import { SelectableRecord } from '@/object-record/select/types/SelectableRecord';
|
import { SelectableRecord } from '@/object-record/select/types/SelectableRecord';
|
||||||
|
import { useCombinedViewFilters } from '@/views/hooks/useCombinedViewFilters';
|
||||||
|
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
|
||||||
import { isDefined } from '~/utils/isDefined';
|
import { isDefined } from '~/utils/isDefined';
|
||||||
|
|
||||||
export const EMPTY_FILTER_VALUE = '[]';
|
export const EMPTY_FILTER_VALUE = '[]';
|
||||||
@ -14,12 +18,16 @@ export const ObjectFilterDropdownRecordSelect = () => {
|
|||||||
filterDefinitionUsedInDropdownState,
|
filterDefinitionUsedInDropdownState,
|
||||||
objectFilterDropdownSearchInputState,
|
objectFilterDropdownSearchInputState,
|
||||||
selectedOperandInDropdownState,
|
selectedOperandInDropdownState,
|
||||||
|
selectedFilterState,
|
||||||
setObjectFilterDropdownSelectedRecordIds,
|
setObjectFilterDropdownSelectedRecordIds,
|
||||||
objectFilterDropdownSelectedRecordIdsState,
|
objectFilterDropdownSelectedRecordIdsState,
|
||||||
selectFilter,
|
selectFilter,
|
||||||
emptyFilterButKeepDefinition,
|
emptyFilterButKeepDefinition,
|
||||||
} = useFilterDropdown();
|
} = useFilterDropdown();
|
||||||
|
|
||||||
|
const { removeCombinedViewFilter } = useCombinedViewFilters();
|
||||||
|
const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
|
||||||
|
|
||||||
const filterDefinitionUsedInDropdown = useRecoilValue(
|
const filterDefinitionUsedInDropdown = useRecoilValue(
|
||||||
filterDefinitionUsedInDropdownState,
|
filterDefinitionUsedInDropdownState,
|
||||||
);
|
);
|
||||||
@ -32,6 +40,9 @@ export const ObjectFilterDropdownRecordSelect = () => {
|
|||||||
const objectFilterDropdownSelectedRecordIds = useRecoilValue(
|
const objectFilterDropdownSelectedRecordIds = useRecoilValue(
|
||||||
objectFilterDropdownSelectedRecordIdsState,
|
objectFilterDropdownSelectedRecordIdsState,
|
||||||
);
|
);
|
||||||
|
const [fieldId] = useState(v4());
|
||||||
|
|
||||||
|
const selectedFilter = useRecoilValue(selectedFilterState);
|
||||||
|
|
||||||
const objectNameSingular =
|
const objectNameSingular =
|
||||||
filterDefinitionUsedInDropdown?.relationObjectMetadataNameSingular ?? '';
|
filterDefinitionUsedInDropdown?.relationObjectMetadataNameSingular ?? '';
|
||||||
@ -60,6 +71,7 @@ export const ObjectFilterDropdownRecordSelect = () => {
|
|||||||
|
|
||||||
if (newSelectedRecordIds.length === 0) {
|
if (newSelectedRecordIds.length === 0) {
|
||||||
emptyFilterButKeepDefinition();
|
emptyFilterButKeepDefinition();
|
||||||
|
removeCombinedViewFilter(fieldId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,7 +103,17 @@ export const ObjectFilterDropdownRecordSelect = () => {
|
|||||||
? JSON.stringify(newSelectedRecordIds)
|
? JSON.stringify(newSelectedRecordIds)
|
||||||
: EMPTY_FILTER_VALUE;
|
: EMPTY_FILTER_VALUE;
|
||||||
|
|
||||||
|
const viewFilter =
|
||||||
|
currentViewWithCombinedFiltersAndSorts?.viewFilters.find(
|
||||||
|
(viewFilter) =>
|
||||||
|
viewFilter.fieldMetadataId ===
|
||||||
|
filterDefinitionUsedInDropdown.fieldMetadataId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const filterId = viewFilter?.id ?? fieldId;
|
||||||
|
|
||||||
selectFilter({
|
selectFilter({
|
||||||
|
id: selectedFilter?.id ? selectedFilter.id : filterId,
|
||||||
definition: filterDefinitionUsedInDropdown,
|
definition: filterDefinitionUsedInDropdown,
|
||||||
operand: selectedOperandInDropdown,
|
operand: selectedOperandInDropdown,
|
||||||
displayValue: filterDisplayValue,
|
displayValue: filterDisplayValue,
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { ChangeEvent } from 'react';
|
import { ChangeEvent, useState } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
import { v4 } from 'uuid';
|
||||||
|
|
||||||
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
||||||
import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput';
|
import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput';
|
||||||
@ -14,6 +15,8 @@ export const ObjectFilterDropdownTextSearchInput = () => {
|
|||||||
selectFilter,
|
selectFilter,
|
||||||
} = useFilterDropdown();
|
} = useFilterDropdown();
|
||||||
|
|
||||||
|
const [filterId] = useState(v4());
|
||||||
|
|
||||||
const filterDefinitionUsedInDropdown = useRecoilValue(
|
const filterDefinitionUsedInDropdown = useRecoilValue(
|
||||||
filterDefinitionUsedInDropdownState,
|
filterDefinitionUsedInDropdownState,
|
||||||
);
|
);
|
||||||
@ -37,6 +40,7 @@ export const ObjectFilterDropdownTextSearchInput = () => {
|
|||||||
setObjectFilterDropdownSearchInput(event.target.value);
|
setObjectFilterDropdownSearchInput(event.target.value);
|
||||||
|
|
||||||
selectFilter?.({
|
selectFilter?.({
|
||||||
|
id: selectedFilter?.id ? selectedFilter.id : filterId,
|
||||||
fieldMetadataId: filterDefinitionUsedInDropdown.fieldMetadataId,
|
fieldMetadataId: filterDefinitionUsedInDropdown.fieldMetadataId,
|
||||||
value: event.target.value,
|
value: event.target.value,
|
||||||
operand: selectedOperandInDropdown,
|
operand: selectedOperandInDropdown,
|
||||||
|
|||||||
@ -23,6 +23,7 @@ const filterDefinitions: FilterDefinition[] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
const mockFilter: Filter = {
|
const mockFilter: Filter = {
|
||||||
|
id: 'id',
|
||||||
definition: filterDefinitions[0],
|
definition: filterDefinitions[0],
|
||||||
displayValue: '',
|
displayValue: '',
|
||||||
fieldMetadataId: '',
|
fieldMetadataId: '',
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
|||||||
import { FilterDefinition } from './FilterDefinition';
|
import { FilterDefinition } from './FilterDefinition';
|
||||||
|
|
||||||
export type Filter = {
|
export type Filter = {
|
||||||
|
id: string;
|
||||||
fieldMetadataId: string;
|
fieldMetadataId: string;
|
||||||
value: string;
|
value: string;
|
||||||
displayValue: string;
|
displayValue: string;
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
|
import { v4 } from 'uuid';
|
||||||
|
|
||||||
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
|
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
@ -46,6 +47,7 @@ export const useHandleToggleColumnFilter = ({
|
|||||||
const defaultOperand = availableOperandsForFilter[0];
|
const defaultOperand = availableOperandsForFilter[0];
|
||||||
|
|
||||||
const newFilter: Filter = {
|
const newFilter: Filter = {
|
||||||
|
id: v4(),
|
||||||
fieldMetadataId,
|
fieldMetadataId,
|
||||||
operand: defaultOperand,
|
operand: defaultOperand,
|
||||||
displayValue: '',
|
displayValue: '',
|
||||||
|
|||||||
@ -16,8 +16,8 @@ export const EditableFilterChip = ({
|
|||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
return (
|
return (
|
||||||
<SortOrFilterChip
|
<SortOrFilterChip
|
||||||
key={viewFilter.fieldMetadataId}
|
key={viewFilter.id}
|
||||||
testId={viewFilter.fieldMetadataId}
|
testId={viewFilter.id}
|
||||||
labelKey={viewFilter.definition.label}
|
labelKey={viewFilter.definition.label}
|
||||||
labelValue={`${getOperandLabelShort(viewFilter.operand)} ${
|
labelValue={`${getOperandLabelShort(viewFilter.operand)} ${
|
||||||
viewFilter.displayValue
|
viewFilter.displayValue
|
||||||
|
|||||||
@ -62,13 +62,13 @@ export const EditableFilterDropdownButton = ({
|
|||||||
const handleRemove = () => {
|
const handleRemove = () => {
|
||||||
closeDropdown();
|
closeDropdown();
|
||||||
|
|
||||||
removeCombinedViewFilter(viewFilter.fieldMetadataId);
|
removeCombinedViewFilter(viewFilter.id);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleDropdownClickOutside = useCallback(() => {
|
const handleDropdownClickOutside = useCallback(() => {
|
||||||
const { value, fieldMetadataId } = viewFilter;
|
const { id: fieldId, value } = viewFilter;
|
||||||
if (!value) {
|
if (!value) {
|
||||||
removeCombinedViewFilter(fieldMetadataId);
|
removeCombinedViewFilter(fieldId);
|
||||||
}
|
}
|
||||||
}, [viewFilter, removeCombinedViewFilter]);
|
}, [viewFilter, removeCombinedViewFilter]);
|
||||||
|
|
||||||
|
|||||||
@ -153,19 +153,17 @@ export const ViewBarDetails = ({
|
|||||||
availableFilterDefinitions,
|
availableFilterDefinitions,
|
||||||
).map((viewFilter) => (
|
).map((viewFilter) => (
|
||||||
<ObjectFilterDropdownScope
|
<ObjectFilterDropdownScope
|
||||||
key={viewFilter.fieldMetadataId}
|
key={viewFilter.id}
|
||||||
filterScopeId={viewFilter.fieldMetadataId}
|
filterScopeId={viewFilter.id}
|
||||||
>
|
>
|
||||||
<DropdownScope dropdownScopeId={viewFilter.fieldMetadataId}>
|
<DropdownScope dropdownScopeId={viewFilter.id}>
|
||||||
<ViewBarFilterEffect
|
<ViewBarFilterEffect filterDropdownId={viewFilter.id} />
|
||||||
filterDropdownId={viewFilter.fieldMetadataId}
|
|
||||||
/>
|
|
||||||
<EditableFilterDropdownButton
|
<EditableFilterDropdownButton
|
||||||
viewFilter={viewFilter}
|
viewFilter={viewFilter}
|
||||||
hotkeyScope={{
|
hotkeyScope={{
|
||||||
scope: viewFilter.fieldMetadataId,
|
scope: viewFilter.id,
|
||||||
}}
|
}}
|
||||||
viewFilterDropdownId={viewFilter.fieldMetadataId}
|
viewFilterDropdownId={viewFilter.id}
|
||||||
/>
|
/>
|
||||||
</DropdownScope>
|
</DropdownScope>
|
||||||
</ObjectFilterDropdownScope>
|
</ObjectFilterDropdownScope>
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/
|
|||||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
||||||
import { useViewStates } from '@/views/hooks/internal/useViewStates';
|
import { useViewStates } from '@/views/hooks/internal/useViewStates';
|
||||||
import { useCombinedViewFilters } from '@/views/hooks/useCombinedViewFilters';
|
import { useCombinedViewFilters } from '@/views/hooks/useCombinedViewFilters';
|
||||||
|
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
|
||||||
import { isDefined } from '~/utils/isDefined';
|
import { isDefined } from '~/utils/isDefined';
|
||||||
|
|
||||||
type ViewBarFilterEffectProps = {
|
type ViewBarFilterEffectProps = {
|
||||||
@ -15,11 +16,12 @@ type ViewBarFilterEffectProps = {
|
|||||||
export const ViewBarFilterEffect = ({
|
export const ViewBarFilterEffect = ({
|
||||||
filterDropdownId,
|
filterDropdownId,
|
||||||
}: ViewBarFilterEffectProps) => {
|
}: ViewBarFilterEffectProps) => {
|
||||||
const { availableFilterDefinitionsState, unsavedToUpsertViewFiltersState } =
|
const { availableFilterDefinitionsState } = useViewStates();
|
||||||
useViewStates();
|
|
||||||
|
|
||||||
const { upsertCombinedViewFilter } = useCombinedViewFilters();
|
const { upsertCombinedViewFilter } = useCombinedViewFilters();
|
||||||
|
|
||||||
|
const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
|
||||||
|
|
||||||
const availableFilterDefinitions = useRecoilValue(
|
const availableFilterDefinitions = useRecoilValue(
|
||||||
availableFilterDefinitionsState,
|
availableFilterDefinitionsState,
|
||||||
);
|
);
|
||||||
@ -51,47 +53,41 @@ export const ViewBarFilterEffect = ({
|
|||||||
upsertCombinedViewFilter,
|
upsertCombinedViewFilter,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const unsavedToUpsertViewFilters = useRecoilValue(
|
|
||||||
unsavedToUpsertViewFiltersState,
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (filterDefinitionUsedInDropdown?.type === 'RELATION') {
|
if (filterDefinitionUsedInDropdown?.type === 'RELATION') {
|
||||||
const viewFilterUsedInDropdown = unsavedToUpsertViewFilters.find(
|
const viewFilterUsedInDropdown =
|
||||||
(filter) =>
|
currentViewWithCombinedFiltersAndSorts?.viewFilters.find(
|
||||||
filter.fieldMetadataId ===
|
(filter) =>
|
||||||
filterDefinitionUsedInDropdown.fieldMetadataId,
|
filter.fieldMetadataId ===
|
||||||
);
|
filterDefinitionUsedInDropdown?.fieldMetadataId,
|
||||||
|
);
|
||||||
|
|
||||||
const viewFilterSelectedRecordIds = isNonEmptyString(
|
const viewFilterSelectedRecords = isNonEmptyString(
|
||||||
viewFilterUsedInDropdown?.value,
|
viewFilterUsedInDropdown?.value,
|
||||||
)
|
)
|
||||||
? JSON.parse(viewFilterUsedInDropdown.value)
|
? JSON.parse(viewFilterUsedInDropdown.value)
|
||||||
: [];
|
: [];
|
||||||
|
setObjectFilterDropdownSelectedRecordIds(viewFilterSelectedRecords);
|
||||||
setObjectFilterDropdownSelectedRecordIds(viewFilterSelectedRecordIds);
|
|
||||||
} else if (filterDefinitionUsedInDropdown?.type === 'SELECT') {
|
} else if (filterDefinitionUsedInDropdown?.type === 'SELECT') {
|
||||||
const viewFilterUsedInDropdown = unsavedToUpsertViewFilters.find(
|
const viewFilterUsedInDropdown =
|
||||||
(filter) =>
|
currentViewWithCombinedFiltersAndSorts?.viewFilters.find(
|
||||||
filter.fieldMetadataId ===
|
(filter) =>
|
||||||
filterDefinitionUsedInDropdown.fieldMetadataId,
|
filter.fieldMetadataId ===
|
||||||
);
|
filterDefinitionUsedInDropdown?.fieldMetadataId,
|
||||||
|
);
|
||||||
|
|
||||||
const viewFilterSelectedOptionValues = isNonEmptyString(
|
const viewFilterSelectedRecords = isNonEmptyString(
|
||||||
viewFilterUsedInDropdown?.value,
|
viewFilterUsedInDropdown?.value,
|
||||||
)
|
)
|
||||||
? JSON.parse(viewFilterUsedInDropdown.value)
|
? JSON.parse(viewFilterUsedInDropdown.value)
|
||||||
: [];
|
: [];
|
||||||
|
setObjectFilterDropdownSelectedOptionValues(viewFilterSelectedRecords);
|
||||||
setObjectFilterDropdownSelectedOptionValues(
|
|
||||||
viewFilterSelectedOptionValues,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}, [
|
}, [
|
||||||
filterDefinitionUsedInDropdown,
|
filterDefinitionUsedInDropdown,
|
||||||
setObjectFilterDropdownSelectedRecordIds,
|
setObjectFilterDropdownSelectedRecordIds,
|
||||||
setObjectFilterDropdownSelectedOptionValues,
|
setObjectFilterDropdownSelectedOptionValues,
|
||||||
unsavedToUpsertViewFilters,
|
currentViewWithCombinedFiltersAndSorts,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return <></>;
|
return <></>;
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
import { v4 } from 'uuid';
|
|
||||||
|
|
||||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
@ -43,13 +42,11 @@ export const useCombinedViewFilters = (viewBarComponentId?: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const matchingFilterInCurrentView = currentView.viewFilters.find(
|
const matchingFilterInCurrentView = currentView.viewFilters.find(
|
||||||
(viewFilter) =>
|
(viewFilter) => viewFilter.id === upsertedFilter.id,
|
||||||
viewFilter.fieldMetadataId === upsertedFilter.fieldMetadataId,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const matchingFilterInUnsavedFilters = unsavedToUpsertViewFilters.find(
|
const matchingFilterInUnsavedFilters = unsavedToUpsertViewFilters.find(
|
||||||
(viewFilter) =>
|
(viewFilter) => viewFilter.id === upsertedFilter.id,
|
||||||
viewFilter.fieldMetadataId === upsertedFilter.fieldMetadataId,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
if (isDefined(matchingFilterInUnsavedFilters)) {
|
if (isDefined(matchingFilterInUnsavedFilters)) {
|
||||||
@ -81,7 +78,6 @@ export const useCombinedViewFilters = (viewBarComponentId?: string) => {
|
|||||||
...unsavedToUpsertViewFilters,
|
...unsavedToUpsertViewFilters,
|
||||||
{
|
{
|
||||||
...upsertedFilter,
|
...upsertedFilter,
|
||||||
id: v4(),
|
|
||||||
__typename: 'ViewFilter',
|
__typename: 'ViewFilter',
|
||||||
} satisfies ViewFilter,
|
} satisfies ViewFilter,
|
||||||
]);
|
]);
|
||||||
@ -95,7 +91,7 @@ export const useCombinedViewFilters = (viewBarComponentId?: string) => {
|
|||||||
);
|
);
|
||||||
const removeCombinedViewFilter = useRecoilCallback(
|
const removeCombinedViewFilter = useRecoilCallback(
|
||||||
({ snapshot, set }) =>
|
({ snapshot, set }) =>
|
||||||
async (fieldMetadataId: string) => {
|
async (fieldId: string) => {
|
||||||
const unsavedToUpsertViewFilters = getSnapshotValue(
|
const unsavedToUpsertViewFilters = getSnapshotValue(
|
||||||
snapshot,
|
snapshot,
|
||||||
unsavedToUpsertViewFiltersState,
|
unsavedToUpsertViewFiltersState,
|
||||||
@ -119,18 +115,18 @@ export const useCombinedViewFilters = (viewBarComponentId?: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const matchingFilterInCurrentView = currentView.viewFilters.find(
|
const matchingFilterInCurrentView = currentView.viewFilters.find(
|
||||||
(viewFilter) => viewFilter.fieldMetadataId === fieldMetadataId,
|
(viewFilter) => viewFilter.id === fieldId,
|
||||||
);
|
);
|
||||||
|
|
||||||
const matchingFilterInUnsavedFilters = unsavedToUpsertViewFilters.find(
|
const matchingFilterInUnsavedFilters = unsavedToUpsertViewFilters.find(
|
||||||
(viewFilter) => viewFilter.fieldMetadataId === fieldMetadataId,
|
(viewFilter) => viewFilter.id === fieldId,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (isDefined(matchingFilterInUnsavedFilters)) {
|
if (isDefined(matchingFilterInUnsavedFilters)) {
|
||||||
set(
|
set(
|
||||||
unsavedToUpsertViewFiltersState,
|
unsavedToUpsertViewFiltersState,
|
||||||
unsavedToUpsertViewFilters.filter(
|
unsavedToUpsertViewFilters.filter(
|
||||||
(viewFilter) => viewFilter.fieldMetadataId !== fieldMetadataId,
|
(viewFilter) => viewFilter.id !== fieldId,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -55,6 +55,7 @@ describe('mapViewFiltersToFilters', () => {
|
|||||||
];
|
];
|
||||||
const expectedFilters: Filter[] = [
|
const expectedFilters: Filter[] = [
|
||||||
{
|
{
|
||||||
|
id: 'id',
|
||||||
fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482',
|
fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482',
|
||||||
value: 'testValue',
|
value: 'testValue',
|
||||||
displayValue: 'Test Display Value',
|
displayValue: 'Test Display Value',
|
||||||
|
|||||||
@ -28,9 +28,6 @@ export const combinedViewFilters = (
|
|||||||
.concat(toCreateViewFilters);
|
.concat(toCreateViewFilters);
|
||||||
|
|
||||||
return Object.values(
|
return Object.values(
|
||||||
combinedViewFilters.reduce(
|
combinedViewFilters.reduce((acc, obj) => ({ ...acc, [obj.id]: obj }), {}),
|
||||||
(acc, obj) => ({ ...acc, [obj.fieldMetadataId]: obj }),
|
|
||||||
{},
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -18,6 +18,7 @@ export const mapViewFiltersToFilters = (
|
|||||||
if (!availableFilterDefinition) return null;
|
if (!availableFilterDefinition) return null;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
id: viewFilter.id,
|
||||||
fieldMetadataId: viewFilter.fieldMetadataId,
|
fieldMetadataId: viewFilter.fieldMetadataId,
|
||||||
value: viewFilter.value,
|
value: viewFilter.value,
|
||||||
displayValue: viewFilter.displayValue,
|
displayValue: viewFilter.displayValue,
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
import { v4 } from 'uuid';
|
||||||
|
|
||||||
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
|
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
|
||||||
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
|
||||||
@ -29,6 +30,7 @@ export const TasksEffect = ({ filterDropdownId }: TasksEffectProps) => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isDefined(currentWorkspaceMember)) {
|
if (isDefined(currentWorkspaceMember)) {
|
||||||
setSelectedFilter({
|
setSelectedFilter({
|
||||||
|
id: v4(),
|
||||||
fieldMetadataId: 'assigneeId',
|
fieldMetadataId: 'assigneeId',
|
||||||
value: JSON.stringify(currentWorkspaceMember.id),
|
value: JSON.stringify(currentWorkspaceMember.id),
|
||||||
operand: ViewFilterOperand.Is,
|
operand: ViewFilterOperand.Is,
|
||||||
|
|||||||
Reference in New Issue
Block a user