From dff602f6f927f1b7babb284020874647e697f4a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Magrin?= Date: Mon, 12 Aug 2024 17:52:47 +0200 Subject: [PATCH] feat: working trash filter button --- .../RecordIndexOptionsDropdownContent.tsx | 8 +++--- .../views/components/VariantFilterChip.tsx | 3 +-- .../views/components/ViewBarDetails.tsx | 6 +---- .../factories/args-string.factory.ts | 6 +++-- .../factories/fields-string.factory.ts | 4 --- .../factories/find-many-query.factory.ts | 8 ------ .../factories/relation-field-alias.factory.ts | 8 ------ .../utils/with-soft-deleted.util.ts | 27 +++++++++++++++++++ .../workspace-query-runner.service.ts | 5 ++-- 9 files changed, 40 insertions(+), 35 deletions(-) create mode 100644 packages/twenty-server/src/engine/api/graphql/workspace-query-runner/utils/with-soft-deleted.util.ts diff --git a/packages/twenty-front/src/modules/object-record/record-index/options/components/RecordIndexOptionsDropdownContent.tsx b/packages/twenty-front/src/modules/object-record/record-index/options/components/RecordIndexOptionsDropdownContent.tsx index fdd6fe6a191d..8a2201d8192a 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/options/components/RecordIndexOptionsDropdownContent.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/options/components/RecordIndexOptionsDropdownContent.tsx @@ -38,7 +38,6 @@ import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { ViewType } from '@/views/types/ViewType'; import { useLocation } from 'react-router-dom'; import { useSetRecoilState } from 'recoil'; -import { useCombinedViewFilters } from '@/views/hooks/useCombinedViewFilters'; import { useHandleToggleTrashColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleTrashColumnFilter'; type RecordIndexOptionsMenu = 'fields' | 'hiddenFields'; @@ -62,8 +61,6 @@ export const RecordIndexOptionsDropdownContent = ({ RecordIndexOptionsMenu | undefined >(undefined); - const { upsertCombinedViewFilter } = useCombinedViewFilters(); - const resetMenu = () => setCurrentMenu(undefined); const handleSelectMenu = (option: RecordIndexOptionsMenu) => { @@ -164,7 +161,10 @@ export const RecordIndexOptionsDropdownContent = ({ text={displayedExportProgress(progress)} /> { + handleToggleTrashColumnFilter(); + closeDropdown(); + }} LeftIcon={IconTrash} text="Trash" /> diff --git a/packages/twenty-front/src/modules/views/components/VariantFilterChip.tsx b/packages/twenty-front/src/modules/views/components/VariantFilterChip.tsx index 43d25d1f8602..910e8e77a053 100644 --- a/packages/twenty-front/src/modules/views/components/VariantFilterChip.tsx +++ b/packages/twenty-front/src/modules/views/components/VariantFilterChip.tsx @@ -15,8 +15,7 @@ export const VariantFilterChip = ({ viewFilter }: VariantFilterChipProps) => { const { getIcon } = useIcons(); const handleRemoveClick = () => { - // FixMe: Why it's not working ? - removeCombinedViewFilter(viewFilter.fieldMetadataId); + removeCombinedViewFilter(viewFilter.id); }; const variant = useMemo(() => { diff --git a/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx b/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx index 163475dc1563..d656eb52c197 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx @@ -157,11 +157,6 @@ export const ViewBarDetails = ({ return null; } - console.log( - 'currentViewWithCombinedFiltersAndSorts?.viewFilters: ', - currentViewWithCombinedFiltersAndSorts?.viewFilters, - ); - return ( @@ -171,6 +166,7 @@ export const ViewBarDetails = ({ key={viewFilter.fieldMetadataId} // Why do we have two types, Filter and ViewFilter? // Why key defition is already present in the Filter type and added on the fly here with mapViewFiltersToFilters ? + // Also as filter is spread into viewFilter, definition is present // FixMe: Ugly hack to make it work viewFilter={viewFilter as unknown as Filter} /> diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/args-string.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/args-string.factory.ts index 562886d9d5b8..5755fe413489 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/args-string.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/args-string.factory.ts @@ -3,6 +3,7 @@ import { Injectable } from '@nestjs/common'; import { FieldMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata.interface'; import { stringifyWithoutKeyQuote } from 'src/engine/api/graphql/workspace-query-builder/utils/stringify-without-key-quote.util'; +import { isDefined } from 'src/utils/is-defined'; import { ArgsAliasFactory } from './args-alias.factory'; @@ -20,8 +21,9 @@ export class ArgsStringFactory { } if (softDeletable) { initialArgs.filter = { - deletedAt: { is: 'NULL' }, - ...initialArgs.filter, + and: [initialArgs.filter, { deletedAt: { is: 'NULL' } }].filter( + isDefined, + ), }; } let argsString = ''; diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/fields-string.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/fields-string.factory.ts index cddca887b024..7dbf38b897c8 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/fields-string.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/fields-string.factory.ts @@ -30,8 +30,6 @@ export class FieldsStringFactory { ): Promise { const selectedFields: Partial = graphqlFields(info); - console.log('selectedFields', JSON.stringify(selectedFields, null, 2)); - const res = await this.createFieldsStringRecursive( info, selectedFields, @@ -40,8 +38,6 @@ export class FieldsStringFactory { withSoftDeleted ?? false, ); - console.log('res', res); - return res; } diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/find-many-query.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/find-many-query.factory.ts index 19bb616a8763..03391ce4cb53 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/find-many-query.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/find-many-query.factory.ts @@ -39,14 +39,6 @@ export class FindManyQueryFactory { !options.withSoftDeleted && !!options.objectMetadataItem.isSoftDeletable, ); - console.log( - 'argsString', - args, - argsString, - options.withSoftDeleted, - options.objectMetadataItem.isSoftDeletable, - ); - return ` query { ${computeObjectTargetTable(options.objectMetadataItem)}Collection${ diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/relation-field-alias.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/relation-field-alias.factory.ts index 4229cc5d9fa9..00918785cc97 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/relation-field-alias.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-builder/factories/relation-field-alias.factory.ts @@ -100,14 +100,6 @@ export class RelationFieldAliasFactory { ) { const args = getFieldArgumentsByKey(info, fieldKey); - // If the referenced object is soft deletable, we need to filter out the deleted objects - if (!withSoftDeleted && referencedObjectMetadata.isSoftDeletable) { - args.filter = { - deletedAt: { is: 'NULL' }, - ...args.filter, - }; - } - const argsString = this.argsStringFactory.create( args, referencedObjectMetadata.fields ?? [], diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/utils/with-soft-deleted.util.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/utils/with-soft-deleted.util.ts new file mode 100644 index 000000000000..b6e77d33d07b --- /dev/null +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/utils/with-soft-deleted.util.ts @@ -0,0 +1,27 @@ +import { RecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface'; + +import { isDefined } from 'src/utils/is-defined'; + +export const withSoftDeleted = ( + filter: T | undefined | null, +): boolean => { + if (!isDefined(filter)) { + return false; + } + + if (Array.isArray(filter)) { + return filter.some((item) => withSoftDeleted(item)); + } + + for (const [key, value] of Object.entries(filter)) { + if (key === 'deletedAt') { + return true; + } + + if (typeof value === 'object') { + return withSoftDeleted(value); + } + } + + return false; +}; diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-runner.service.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-runner.service.ts index a3c927b0f92b..c64183f5cbc4 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-runner.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-runner.service.ts @@ -52,6 +52,7 @@ import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global. import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; import { isQueryTimeoutError } from 'src/engine/utils/query-timeout.util'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; +import { withSoftDeleted } from 'src/engine/api/graphql/workspace-query-runner/utils/with-soft-deleted.util'; import { PGGraphQLMutation, @@ -110,7 +111,7 @@ export class WorkspaceQueryRunnerService { computedArgs, { ...options, - withSoftDeleted: !!args.filter?.deletedAt, + withSoftDeleted: withSoftDeleted(args.filter), }, ); @@ -164,7 +165,7 @@ export class WorkspaceQueryRunnerService { computedArgs, { ...options, - withSoftDeleted: !!args.filter?.deletedAt, + withSoftDeleted: withSoftDeleted(args.filter), }, );