New branch based on feedback in PR #8950 and issue #8016 --------- Co-authored-by: ad-elias <elias@autodiligence.com> Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
This commit is contained in:
@ -10,6 +10,7 @@ import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-sta
|
||||
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
|
||||
import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters';
|
||||
import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState';
|
||||
import { relationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/relationFilterValueSchema';
|
||||
import { isDefined } from '~/utils/isDefined';
|
||||
|
||||
type ViewBarFilterEffectProps = {
|
||||
@ -69,12 +70,14 @@ export const ViewBarFilterEffect = ({
|
||||
filterDefinitionUsedInDropdown?.fieldMetadataId,
|
||||
);
|
||||
|
||||
const viewFilterSelectedRecords = isNonEmptyString(
|
||||
viewFilterUsedInDropdown?.value,
|
||||
)
|
||||
? JSON.parse(viewFilterUsedInDropdown.value)
|
||||
: [];
|
||||
setObjectFilterDropdownSelectedRecordIds(viewFilterSelectedRecords);
|
||||
const { selectedRecordIds } = relationFilterValueSchema
|
||||
.catch({
|
||||
isCurrentWorkspaceMemberSelected: false,
|
||||
selectedRecordIds: [],
|
||||
})
|
||||
.parse(viewFilterUsedInDropdown?.value);
|
||||
|
||||
setObjectFilterDropdownSelectedRecordIds(selectedRecordIds);
|
||||
} else if (
|
||||
isDefined(filterDefinitionUsedInDropdown) &&
|
||||
['SELECT', 'MULTI_SELECT'].includes(filterDefinitionUsedInDropdown.type)
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
import { useActiveFieldMetadataItems } from '@/object-metadata/hooks/useActiveFieldMetadataItems';
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { useFilterValueDependencies } from '@/object-record/record-filter/hooks/useFilterValueDependencies';
|
||||
import { useViewOrDefaultViewFromPrefetchedViews } from '@/views/hooks/useViewOrDefaultViewFromPrefetchedViews';
|
||||
import { getQueryVariablesFromView } from '@/views/utils/getQueryVariablesFromView';
|
||||
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
|
||||
@ -22,11 +23,14 @@ export const useQueryVariablesFromActiveFieldsOfViewOrDefaultView = ({
|
||||
|
||||
const isJsonFilterEnabled = useIsFeatureEnabled('IS_JSON_FILTER_ENABLED');
|
||||
|
||||
const { filterValueDependencies } = useFilterValueDependencies();
|
||||
|
||||
const { filter, orderBy } = getQueryVariablesFromView({
|
||||
fieldMetadataItems: activeFieldMetadataItems,
|
||||
objectMetadataItem,
|
||||
view,
|
||||
isJsonFilterEnabled,
|
||||
filterValueDependencies,
|
||||
});
|
||||
|
||||
return {
|
||||
|
||||
@ -3,6 +3,7 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { formatFieldMetadataItemsAsFilterDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
|
||||
import { formatFieldMetadataItemsAsSortDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsSortDefinitions';
|
||||
import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy';
|
||||
import { FilterValueDependencies } from '@/object-record/record-filter/types/FilterValueDependencies';
|
||||
import { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter';
|
||||
import { View } from '@/views/types/View';
|
||||
import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters';
|
||||
@ -14,11 +15,13 @@ export const getQueryVariablesFromView = ({
|
||||
fieldMetadataItems,
|
||||
objectMetadataItem,
|
||||
isJsonFilterEnabled,
|
||||
filterValueDependencies,
|
||||
}: {
|
||||
view: View | null | undefined;
|
||||
fieldMetadataItems: FieldMetadataItem[];
|
||||
objectMetadataItem: ObjectMetadataItem;
|
||||
isJsonFilterEnabled: boolean;
|
||||
filterValueDependencies: FilterValueDependencies;
|
||||
}) => {
|
||||
if (!isDefined(view)) {
|
||||
return {
|
||||
@ -39,6 +42,7 @@ export const getQueryVariablesFromView = ({
|
||||
});
|
||||
|
||||
const filter = computeViewRecordGqlOperationFilter(
|
||||
filterValueDependencies,
|
||||
mapViewFiltersToFilters(viewFilters, filterDefinitions),
|
||||
objectMetadataItem?.fields ?? [],
|
||||
viewFilterGroups ?? [],
|
||||
|
||||
@ -0,0 +1,4 @@
|
||||
import { relationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/relationFilterValueSchema';
|
||||
import { z } from 'zod';
|
||||
|
||||
export type RelationFilterValue = z.infer<typeof relationFilterValueSchema>;
|
||||
@ -1,7 +0,0 @@
|
||||
import { ViewFilter } from '@/views/types/ViewFilter';
|
||||
|
||||
export const resolveBooleanViewFilterValue = (
|
||||
viewFilter: Pick<ViewFilter, 'value'>,
|
||||
) => {
|
||||
return viewFilter.value === 'true';
|
||||
};
|
||||
@ -1,53 +0,0 @@
|
||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
||||
import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType';
|
||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||
import { resolveNumberViewFilterValue } from '@/views/view-filter-value/utils/resolveNumberViewFilterValue';
|
||||
import { resolveSelectViewFilterValue } from '@/views/view-filter-value/utils/resolveSelectViewFilterValue';
|
||||
import {
|
||||
resolveDateViewFilterValue,
|
||||
ResolvedDateViewFilterValue,
|
||||
} from './resolveDateViewFilterValue';
|
||||
import { resolveBooleanViewFilterValue } from '@/views/view-filter-value/utils/resolveBooleanViewFilterValue';
|
||||
|
||||
type ResolvedFilterValue<
|
||||
T extends FilterableFieldType,
|
||||
O extends ViewFilterOperand,
|
||||
> = T extends 'DATE' | 'DATE_TIME'
|
||||
? ResolvedDateViewFilterValue<O>
|
||||
: T extends 'NUMBER'
|
||||
? ReturnType<typeof resolveNumberViewFilterValue>
|
||||
: T extends 'SELECT' | 'MULTI_SELECT'
|
||||
? string[]
|
||||
: T extends 'BOOLEAN'
|
||||
? boolean
|
||||
: string;
|
||||
|
||||
type PartialFilter<
|
||||
T extends FilterableFieldType,
|
||||
O extends ViewFilterOperand,
|
||||
> = Pick<Filter, 'value'> & {
|
||||
definition: { type: T };
|
||||
operand: O;
|
||||
};
|
||||
|
||||
export const resolveFilterValue = <
|
||||
T extends FilterableFieldType,
|
||||
O extends ViewFilterOperand,
|
||||
>(
|
||||
filter: PartialFilter<T, O>,
|
||||
) => {
|
||||
switch (filter.definition.type) {
|
||||
case 'DATE':
|
||||
case 'DATE_TIME':
|
||||
return resolveDateViewFilterValue(filter) as ResolvedFilterValue<T, O>;
|
||||
case 'NUMBER':
|
||||
return resolveNumberViewFilterValue(filter) as ResolvedFilterValue<T, O>;
|
||||
case 'SELECT':
|
||||
case 'MULTI_SELECT':
|
||||
return resolveSelectViewFilterValue(filter) as ResolvedFilterValue<T, O>;
|
||||
case 'BOOLEAN':
|
||||
return resolveBooleanViewFilterValue(filter) as ResolvedFilterValue<T, O>;
|
||||
default:
|
||||
return filter.value as ResolvedFilterValue<T, O>;
|
||||
}
|
||||
};
|
||||
@ -1,7 +0,0 @@
|
||||
import { ViewFilter } from '@/views/types/ViewFilter';
|
||||
|
||||
export const resolveNumberViewFilterValue = (
|
||||
viewFilter: Pick<ViewFilter, 'value'>,
|
||||
) => {
|
||||
return viewFilter.value === '' ? null : +viewFilter.value;
|
||||
};
|
||||
@ -0,0 +1,21 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export const relationFilterValueSchema = z
|
||||
.string()
|
||||
.transform((value, ctx) => {
|
||||
try {
|
||||
return JSON.parse(value);
|
||||
} catch (error) {
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: (error as Error).message,
|
||||
});
|
||||
return z.NEVER;
|
||||
}
|
||||
})
|
||||
.pipe(
|
||||
z.object({
|
||||
isCurrentWorkspaceMemberSelected: z.boolean(),
|
||||
selectedRecordIds: z.array(z.string()),
|
||||
}),
|
||||
);
|
||||
Reference in New Issue
Block a user