7665 handle the select all case inside the action menu (#7742)

Closes #7665 
- Handle select all
- Handle Filters

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Raphaël Bosi
2024-10-21 14:22:03 +02:00
committed by GitHub
parent eaab2d0dd2
commit 40152d3b92
52 changed files with 788 additions and 427 deletions

View File

@ -0,0 +1,6 @@
import { createState } from 'twenty-ui';
export const contextStoreNumberOfSelectedRecordsState = createState<number>({
key: 'contextStoreNumberOfSelectedRecordsState',
defaultValue: 0,
});

View File

@ -1,6 +0,0 @@
import { createState } from 'twenty-ui';
export const contextStoreTargetedRecordIdsState = createState<string[]>({
key: 'contextStoreTargetedRecordIdsState',
defaultValue: [],
});

View File

@ -0,0 +1,26 @@
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { createState } from 'twenty-ui';
type ContextStoreTargetedRecordsRuleSelectionMode = {
mode: 'selection';
selectedRecordIds: string[];
};
type ContextStoreTargetedRecordsRuleExclusionMode = {
mode: 'exclusion';
excludedRecordIds: string[];
filters: Filter[];
};
export type ContextStoreTargetedRecordsRule =
| ContextStoreTargetedRecordsRuleSelectionMode
| ContextStoreTargetedRecordsRuleExclusionMode;
export const contextStoreTargetedRecordsRuleState =
createState<ContextStoreTargetedRecordsRule>({
key: 'contextStoreTargetedRecordsRuleState',
defaultValue: {
mode: 'selection',
selectedRecordIds: [],
},
});

View File

@ -0,0 +1,77 @@
import { ContextStoreTargetedRecordsRule } from '@/context-store/states/contextStoreTargetedRecordsRuleState';
import { computeContextStoreFilters } from '@/context-store/utils/computeContextStoreFilters';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
describe('computeContextStoreFilters', () => {
const personObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'person',
)!;
it('should work for selection mode', () => {
const contextStoreTargetedRecordsRule: ContextStoreTargetedRecordsRule = {
mode: 'selection',
selectedRecordIds: ['1', '2', '3'],
};
const filters = computeContextStoreFilters(
contextStoreTargetedRecordsRule,
personObjectMetadataItem,
);
expect(filters).toEqual({
id: {
in: ['1', '2', '3'],
},
});
});
it('should work for exclusion mode', () => {
const contextStoreTargetedRecordsRule: ContextStoreTargetedRecordsRule = {
mode: 'exclusion',
filters: [
{
id: 'name-filter',
variant: 'default',
fieldMetadataId: personObjectMetadataItem.fields.find(
(field) => field.name === 'name',
)!.id,
value: 'John',
displayValue: 'John',
displayAvatarUrl: undefined,
operand: ViewFilterOperand.Contains,
definition: {
fieldMetadataId: personObjectMetadataItem.fields.find(
(field) => field.name === 'name',
)!.id,
label: 'Name',
iconName: 'person',
type: 'TEXT',
},
},
],
excludedRecordIds: ['1', '2', '3'],
};
const filters = computeContextStoreFilters(
contextStoreTargetedRecordsRule,
personObjectMetadataItem,
);
expect(filters).toEqual({
and: [
{
name: {
ilike: '%John%',
},
},
{
not: {
id: {
in: ['1', '2', '3'],
},
},
},
],
});
});
});

View File

@ -0,0 +1,42 @@
import { ContextStoreTargetedRecordsRule } from '@/context-store/states/contextStoreTargetedRecordsRuleState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { RecordGqlOperationFilter } from '@/object-record/graphql/types/RecordGqlOperationFilter';
import { turnFiltersIntoQueryFilter } from '@/object-record/record-filter/utils/turnFiltersIntoQueryFilter';
import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables';
export const computeContextStoreFilters = (
contextStoreTargetedRecordsRule: ContextStoreTargetedRecordsRule,
objectMetadataItem: ObjectMetadataItem,
) => {
let queryFilter: RecordGqlOperationFilter | undefined;
if (contextStoreTargetedRecordsRule.mode === 'exclusion') {
queryFilter = makeAndFilterVariables([
turnFiltersIntoQueryFilter(
contextStoreTargetedRecordsRule.filters,
objectMetadataItem?.fields ?? [],
),
contextStoreTargetedRecordsRule.excludedRecordIds.length > 0
? {
not: {
id: {
in: contextStoreTargetedRecordsRule.excludedRecordIds,
},
},
}
: undefined,
]);
}
if (contextStoreTargetedRecordsRule.mode === 'selection') {
queryFilter =
contextStoreTargetedRecordsRule.selectedRecordIds.length > 0
? {
id: {
in: contextStoreTargetedRecordsRule.selectedRecordIds,
},
}
: undefined;
}
return queryFilter;
};