Skip to content

Commit 653fd92

Browse files
feat: add Completed at date filter for work items
1 parent 03a2be8 commit 653fd92

5 files changed

Lines changed: 40 additions & 4 deletions

File tree

apps/web/ce/hooks/work-item-filters/use-work-item-filters-config.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import type {
3636
import { Avatar } from "@plane/ui";
3737
import {
3838
getAssigneeFilterConfig,
39+
getCompletedAtFilterConfig,
3940
getCreatedAtFilterConfig,
4041
getCreatedByFilterConfig,
4142
getCycleFilterConfig,
@@ -349,6 +350,17 @@ export const useWorkItemFiltersConfig = (props: TUseWorkItemFiltersConfigProps):
349350
[operatorConfigs]
350351
);
351352

353+
// completed at filter config
354+
const completedAtFilterConfig = useMemo(
355+
() =>
356+
getCompletedAtFilterConfig<TWorkItemFilterProperty>("completed_at")({
357+
isEnabled: true,
358+
filterIcon: CalendarLayoutIcon,
359+
...operatorConfigs,
360+
}),
361+
[operatorConfigs]
362+
);
363+
352364
// project filter config
353365
const projectFilterConfig = useMemo(
354366
() =>
@@ -378,6 +390,7 @@ export const useWorkItemFiltersConfig = (props: TUseWorkItemFiltersConfigProps):
378390
targetDateFilterConfig,
379391
createdAtFilterConfig,
380392
updatedAtFilterConfig,
393+
completedAtFilterConfig,
381394
createdByFilterConfig,
382395
subscriberFilterConfig,
383396
],
@@ -397,6 +410,7 @@ export const useWorkItemFiltersConfig = (props: TUseWorkItemFiltersConfigProps):
397410
target_date: targetDateFilterConfig,
398411
created_at: createdAtFilterConfig,
399412
updated_at: updatedAtFilterConfig,
413+
completed_at: completedAtFilterConfig,
400414
},
401415
isFilterEnabled,
402416
members: members ?? [],

apps/web/core/store/issue/helpers/base-issues-utils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,13 +192,13 @@ export const getIssueIds = (issues: TIssue[]) => issues.map((issue) => issue?.id
192192
/**
193193
* Checks if an issue meets the date filter criteria
194194
* @param issue The issue to check
195-
* @param filterKey The date field to check ('start_date' or 'target_date')
195+
* @param filterKey The date field to check ('start_date', 'target_date', or 'completed_at')
196196
* @param dateFilters Array of date filter strings
197197
* @returns boolean indicating if the issue meets the date criteria
198198
*/
199199
export const checkIssueDateFilter = (
200200
issue: TIssue,
201-
filterKey: "start_date" | "target_date",
201+
filterKey: "start_date" | "target_date" | "completed_at",
202202
dateFilters: string[]
203203
): boolean => {
204204
if (!dateFilters || dateFilters.length === 0) return true;
@@ -254,7 +254,7 @@ export const getFilteredWorkItems = (workItems: TIssue[], filters: IIssueFilterO
254254
// Check all filter conditions (AND operation between different filters)
255255
activeFilters.every(([filterKey, filterValues]) => {
256256
// Handle date filters separately
257-
if (filterKey === "start_date" || filterKey === "target_date") {
257+
if (filterKey === "start_date" || filterKey === "target_date" || filterKey === "completed_at") {
258258
return checkIssueDateFilter(workItem, filterKey, filterValues as string[]);
259259
}
260260
// Handle regular filters

packages/constants/src/issue/filter.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ export type TIssueFiltersToDisplayByPageType = {
111111

112112
export const ISSUE_DISPLAY_FILTERS_BY_PAGE: TIssueFiltersToDisplayByPageType = {
113113
profile_issues: {
114-
filters: ["priority", "state_group", "label_id", "start_date", "target_date"],
114+
filters: ["priority", "state_group", "label_id", "start_date", "target_date", "completed_at"],
115115
layoutOptions: {
116116
list: {
117117
display_properties: ISSUE_DISPLAY_PROPERTIES_KEYS,
@@ -151,6 +151,7 @@ export const ISSUE_DISPLAY_FILTERS_BY_PAGE: TIssueFiltersToDisplayByPageType = {
151151
"label_id",
152152
"start_date",
153153
"target_date",
154+
"completed_at",
154155
],
155156
layoutOptions: {
156157
list: {
@@ -178,6 +179,7 @@ export const ISSUE_DISPLAY_FILTERS_BY_PAGE: TIssueFiltersToDisplayByPageType = {
178179
"project_id",
179180
"start_date",
180181
"target_date",
182+
"completed_at",
181183
],
182184
layoutOptions: {
183185
spreadsheet: {
@@ -216,6 +218,7 @@ export const ISSUE_DISPLAY_FILTERS_BY_PAGE: TIssueFiltersToDisplayByPageType = {
216218
"label_id",
217219
"start_date",
218220
"target_date",
221+
"completed_at",
219222
],
220223
layoutOptions: {
221224
list: {

packages/types/src/view-props.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ export const WORK_ITEM_FILTER_PROPERTY_KEYS = [
109109
"project_id",
110110
"created_at",
111111
"updated_at",
112+
"completed_at",
112113
] as const;
113114
export type TWorkItemFilterProperty = (typeof WORK_ITEM_FILTER_PROPERTY_KEYS)[number];
114115

packages/utils/src/work-item-filters/configs/filters/date.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,21 @@ export const getUpdatedAtFilterConfig =
8383
allowMultipleFilters: true,
8484
supportedOperatorConfigsMap: getSupportedDateOperators(params),
8585
});
86+
87+
/**
88+
* Get the completed at filter config
89+
* @template K - The filter key
90+
* @param key - The filter key to use
91+
* @returns A function that takes parameters and returns the completed at filter config
92+
*/
93+
export const getCompletedAtFilterConfig =
94+
<P extends TFilterProperty>(key: P): TCreateFilterConfig<P, TCreateDateFilterParams> =>
95+
(params: TCreateDateFilterParams) =>
96+
createFilterConfig<P>({
97+
id: key,
98+
label: "Completed at",
99+
...params,
100+
icon: params.filterIcon,
101+
allowMultipleFilters: true,
102+
supportedOperatorConfigsMap: getSupportedDateOperators(params),
103+
});

0 commit comments

Comments
 (0)