Allow DATE_TIME IS operand to filter on a whole day (#17529)

Fixes:  https://github.com/twentyhq/core-team-issues/issues/2027

We've replaced the DATE_TIME picker with DATE picker, and changed the
logic to filter for complete day period.



https://github.com/user-attachments/assets/ba7e1078-bab3-4c62-a803-d6a851f14b7d

---------

Co-authored-by: Arun kumar <arunkumar@Aruns-MacBook-Air.local>
Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
This commit is contained in:
Arun
2026-02-18 19:14:05 +05:30
committed by GitHub
parent 88146c2170
commit 8e6b267ff3
15 changed files with 245 additions and 52 deletions
@@ -0,0 +1 @@
export const DEFAULT_TIMEZONE = 'UTC';
@@ -12,6 +12,7 @@ import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadat
import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction';
import { ViewQueryParamsService } from 'src/engine/metadata-modules/view/services/view-query-params.service';
import { ViewService } from 'src/engine/metadata-modules/view/services/view.service';
import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager';
describe('ViewQueryParamsService', () => {
let viewQueryParamsService: ViewQueryParamsService;
@@ -73,6 +74,12 @@ describe('ViewQueryParamsService', () => {
getOrRecomputeManyOrAllFlatEntityMaps: jest.fn(),
},
},
{
provide: GlobalWorkspaceOrmManager,
useValue: {
getRepository: jest.fn(),
},
},
],
}).compile();
@@ -20,7 +20,10 @@ import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadat
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction';
import { DEFAULT_TIMEZONE } from 'src/engine/metadata-modules/view/constants/default-timezone.constant';
import { ViewService } from 'src/engine/metadata-modules/view/services/view.service';
import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager';
import { type WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';
export type ViewQueryParams = {
objectNameSingular: string;
@@ -35,6 +38,7 @@ export class ViewQueryParamsService {
constructor(
private readonly viewService: ViewService,
private readonly flatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService,
private readonly globalWorkspaceOrmManager: GlobalWorkspaceOrmManager,
) {}
async resolveViewToQueryParams(
@@ -61,6 +65,11 @@ export class ViewQueryParamsService {
flatEntityMaps: flatObjectMetadataMaps,
});
const timeZone = await this.getWorkspaceMemberTimezoneIfAvailable(
workspaceId,
currentWorkspaceMemberId,
);
const recordFilters: RecordFilter[] = (view.viewFilters ?? [])
.map((viewFilter) => {
const field = findFlatEntityByIdInFlatEntityMaps({
@@ -122,7 +131,7 @@ export class ViewQueryParamsService {
fields,
recordFilters,
recordFilterGroups,
filterValueDependencies: { currentWorkspaceMemberId, timeZone: 'UTC' }, // TODO: check if we need to put workspace member timezone here
filterValueDependencies: { currentWorkspaceMemberId, timeZone },
});
const orderBy: ObjectRecordOrderBy = (view.viewSorts ?? [])
@@ -151,4 +160,29 @@ export class ViewQueryParamsService {
viewType: view.type,
};
}
private async getWorkspaceMemberTimezoneIfAvailable(
workspaceId: string,
currentWorkspaceMemberId?: string,
): Promise<string> {
if (!isDefined(currentWorkspaceMemberId)) {
return DEFAULT_TIMEZONE;
}
try {
const workspaceMemberRepository =
await this.globalWorkspaceOrmManager.getRepository<WorkspaceMemberWorkspaceEntity>(
workspaceId,
'workspaceMember',
);
const workspaceMember = await workspaceMemberRepository.findOne({
where: { id: currentWorkspaceMemberId },
});
return workspaceMember?.timeZone ?? DEFAULT_TIMEZONE;
} catch {
return DEFAULT_TIMEZONE;
}
}
}