diff --git a/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoardQueryEffect.tsx b/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoardQueryEffect.tsx index f59acbdb6c..eda346b723 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoardQueryEffect.tsx +++ b/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoardQueryEffect.tsx @@ -3,7 +3,9 @@ import { useTriggerRecordBoardInitialQuery } from '@/object-record/record-board/ import { lastRecordBoardQueryIdentifierComponentState } from '@/object-record/record-board/states/lastRecordBoardQueryIdentifierComponentState'; import { lastRecordGroupIdsComponentState } from '@/object-record/record-board/states/lastRecordGroupIdsComponentState'; import { recordBoardCurrentGroupByQueryOffsetComponentState } from '@/object-record/record-board/states/recordBoardCurrentGroupByQueryOffsetComponentState'; +import { recordBoardIsFetchingMoreComponentState } from '@/object-record/record-board/states/recordBoardIsFetchingMoreComponentState'; import { recordBoardShouldFetchMoreComponentState } from '@/object-record/record-board/states/recordBoardShouldFetchMoreComponentState'; +import { recordBoardHasColumnsToFetchMoreComponentSelector } from '@/object-record/record-board/states/selectors/recordBoardHasColumnsToFetchMoreComponentSelector'; import { isDraggingRecordComponentState } from '@/object-record/record-drag/states/isDraggingRecordComponentState'; import { recordGroupIdsComponentState } from '@/object-record/record-group/states/recordGroupIdsComponentState'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; @@ -12,6 +14,7 @@ import { useRecordIndexGroupCommonQueryVariables } from '@/object-record/record- import { recordIndexRecordGroupsAreInInitialLoadingComponentState } from '@/object-record/record-index/states/recordIndexRecordGroupsAreInInitialLoadingComponentState'; import { getQueryIdentifier } from '@/object-record/utils/getQueryIdentifier'; import { useScrollWrapperHTMLElement } from '@/ui/utilities/scroll/hooks/useScrollWrapperHTMLElement'; +import { useAtomComponentSelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentSelectorValue'; import { useAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useAtomComponentState'; import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue'; import { useSetAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useSetAtomComponentState'; @@ -59,6 +62,14 @@ export const RecordBoardQueryEffect = () => { recordBoardShouldFetchMoreComponentState, ); + const recordBoardIsFetchingMore = useAtomComponentStateValue( + recordBoardIsFetchingMoreComponentState, + ); + + const recordBoardHasColumnsToFetchMore = useAtomComponentSelectorValue( + recordBoardHasColumnsToFetchMoreComponentSelector, + ); + const { triggerRecordBoardFetchMore } = useTriggerRecordBoardFetchMore(); const { triggerRecordBoardInitialQuery } = @@ -86,7 +97,9 @@ export const RecordBoardQueryEffect = () => { } else if ( !recordIndexRecordGroupsAreInInitialLoading && recordBoardShouldFetchMore && - !queryIdentifierHasChanged + recordBoardHasColumnsToFetchMore && + !queryIdentifierHasChanged && + !recordBoardIsFetchingMore ) { triggerRecordBoardFetchMore(); } @@ -99,6 +112,8 @@ export const RecordBoardQueryEffect = () => { scrollWrapperHTMLElement, recordIndexRecordGroupsAreInInitialLoading, recordBoardShouldFetchMore, + recordBoardIsFetchingMore, + recordBoardHasColumnsToFetchMore, triggerRecordBoardFetchMore, setLastRecordGroupIds, recordGroupIds, diff --git a/packages/twenty-front/src/modules/object-record/record-board/hooks/useTriggerRecordBoardFetchMore.ts b/packages/twenty-front/src/modules/object-record/record-board/hooks/useTriggerRecordBoardFetchMore.ts index cf140b7a6f..4cbcdb0ba1 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/hooks/useTriggerRecordBoardFetchMore.ts +++ b/packages/twenty-front/src/modules/object-record/record-board/hooks/useTriggerRecordBoardFetchMore.ts @@ -116,9 +116,7 @@ export const useTriggerRecordBoardFetchMore = () => { ...recordGroupOptionsFilter, }, }, - }); - - store.set(recordBoardCurrentGroupByQueryOffsetCallbackState, newOffset); + }).catch(() => null); if (!isDefined(recordIndexGroupsRecordsGroupByLazyQueryResult)) { cleanStateBeforeExit(); @@ -126,6 +124,8 @@ export const useTriggerRecordBoardFetchMore = () => { return; } + store.set(recordBoardCurrentGroupByQueryOffsetCallbackState, newOffset); + const queryFieldName = getGroupByQueryResultGqlFieldName(objectMetadataItem); diff --git a/packages/twenty-front/src/modules/object-record/record-board/states/selectors/recordBoardHasColumnsToFetchMoreComponentSelector.ts b/packages/twenty-front/src/modules/object-record/record-board/states/selectors/recordBoardHasColumnsToFetchMoreComponentSelector.ts new file mode 100644 index 0000000000..bf11a6dce4 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-board/states/selectors/recordBoardHasColumnsToFetchMoreComponentSelector.ts @@ -0,0 +1,25 @@ +import { RecordBoardComponentInstanceContext } from '@/object-record/record-board/states/contexts/RecordBoardComponentInstanceContext'; +import { recordBoardShouldFetchMoreInColumnComponentFamilyState } from '@/object-record/record-board/states/recordBoardShouldFetchMoreInColumnComponentFamilyState'; +import { recordGroupDefinitionsComponentSelector } from '@/object-record/record-group/states/selectors/recordGroupDefinitionsComponentSelector'; +import { createAtomComponentSelector } from '@/ui/utilities/state/jotai/utils/createAtomComponentSelector'; + +export const recordBoardHasColumnsToFetchMoreComponentSelector = + createAtomComponentSelector({ + key: 'recordBoardHasColumnsToFetchMoreComponentSelector', + componentInstanceContext: RecordBoardComponentInstanceContext, + get: + ({ instanceId }) => + ({ get }) => { + const recordGroupDefinitions = get( + recordGroupDefinitionsComponentSelector, + { instanceId }, + ); + + return recordGroupDefinitions.some((recordGroupDefinition) => + get(recordBoardShouldFetchMoreInColumnComponentFamilyState, { + instanceId, + familyKey: recordGroupDefinition.id, + }), + ); + }, + }); diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/opportunity-data-seeds.constant.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/opportunity-data-seeds.constant.ts index 0ce21bb5f8..37d634d633 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/opportunity-data-seeds.constant.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/opportunity-data-seeds.constant.ts @@ -45,10 +45,12 @@ export const OPPORTUNITY_DATA_SEED_COLUMNS: (keyof OpportunityDataSeed)[] = [ 'updatedByName', ]; +const OPPORTUNITY_DATA_SEED_COUNT = 150; + const GENERATE_OPPORTUNITY_IDS = (): Record => { const OPPORTUNITY_IDS: Record = {}; - for (let INDEX = 1; INDEX <= 50; INDEX++) { + for (let INDEX = 1; INDEX <= OPPORTUNITY_DATA_SEED_COUNT; INDEX++) { const HEX_INDEX = INDEX.toString(16).padStart(4, '0'); OPPORTUNITY_IDS[`ID_${INDEX}`] = @@ -173,7 +175,7 @@ const OPPORTUNITY_TEMPLATES = [ const GENERATE_OPPORTUNITY_SEEDS = (): OpportunityDataSeed[] => { const OPPORTUNITY_SEEDS: OpportunityDataSeed[] = []; - for (let INDEX = 1; INDEX <= 50; INDEX++) { + for (let INDEX = 1; INDEX <= OPPORTUNITY_DATA_SEED_COUNT; INDEX++) { const TEMPLATE_INDEX = (INDEX - 1) % OPPORTUNITY_TEMPLATES.length; const TEMPLATE = OPPORTUNITY_TEMPLATES[TEMPLATE_INDEX];