[WEB-5054]feat: activity filters (#4493)

* draft: added state and assignee filters

* feat: added activity filters for state and assignee

* chore: removed unused funtion

* chore: lint fix

* chore: lint fix

* chore: reverted unwanted changes
This commit is contained in:
Vamsi Krishna
2025-10-15 17:25:52 +05:30
committed by GitHub
parent 0acc003351
commit 24e4d83cd2
9 changed files with 25 additions and 51 deletions
@@ -2,7 +2,8 @@ import { concat, orderBy, set, uniq, update } from "lodash-es";
import { action, makeObservable, observable, runInAction } from "mobx";
import { computedFn } from "mobx-utils";
// plane package imports
import { EActivityFilterType, E_SORT_ORDER } from "@plane/constants";
import type { E_SORT_ORDER } from "@plane/constants";
import { EActivityFilterType } from "@plane/constants";
import type {
TIssueActivityComment,
TIssueActivity,
@@ -34,12 +35,10 @@ export interface IIssueActivityStore extends IIssueActivityStoreActions {
loader: TActivityLoader;
activities: TIssueActivityIdMap;
activityMap: TIssueActivityMap;
sortOrder: E_SORT_ORDER;
// helper methods
getActivitiesByIssueId: (issueId: string) => string[] | undefined;
getActivityById: (activityId: string) => TIssueActivity | undefined;
getActivityAndCommentsByIssueId: (issueId: string, sortOrder: E_SORT_ORDER) => TIssueActivityComment[] | undefined;
toggleSortOrder: () => void;
}
export class IssueActivityStore implements IIssueActivityStore {
@@ -47,7 +46,6 @@ export class IssueActivityStore implements IIssueActivityStore {
loader: TActivityLoader = "fetch";
activities: TIssueActivityIdMap = {};
activityMap: TIssueActivityMap = {};
sortOrder: E_SORT_ORDER = E_SORT_ORDER.ASC;
// services
serviceType;
issueActivityService;
@@ -69,14 +67,6 @@ export class IssueActivityStore implements IIssueActivityStore {
this.issueActivityService = new IssueActivityService(this.serviceType);
}
toggleSortOrder = () => {
if (this.sortOrder === E_SORT_ORDER.ASC) {
this.sortOrder = E_SORT_ORDER.DESC;
} else {
this.sortOrder = E_SORT_ORDER.ASC;
}
};
// helper methods
getActivitiesByIssueId = (issueId: string) => {
if (!issueId) return undefined;
@@ -1,10 +1,10 @@
import { createContext } from "react";
// ce imports
import type { TIssueFields } from "ce/components/issues/issue-modal";
import type { UseFormReset, UseFormWatch } from "react-hook-form";
// plane imports
import type { EditorRefApi } from "@plane/editor";
import type { ISearchIssueResponse, TIssue, TIssuePropertyValues, TIssuePropertyValueErrors } from "@plane/types";
import type { TIssueFields } from "ce/components/issues/issue-modal";
export type TPropertyValuesValidationProps = {
projectId: string | null;
@@ -7,11 +7,11 @@ import { useParams } from "next/navigation";
// plane imports
import { useTranslation } from "@plane/i18n";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { TInitiativeLabel } from "@plane/types";
import { AlertModalCore } from "@plane/ui";
// local imports
import { useInitiatives } from "@/plane-web/hooks/store/use-initiatives";
import type { TInitiativeLabel } from "@plane/types";
type Props = {
isOpen: boolean;
@@ -11,10 +11,10 @@ import { useTranslation } from "@plane/i18n";
// types
import { Tooltip } from "@plane/propel/tooltip";
// local imports
import type { TInitiativeLabel } from "@plane/types";
import { cn } from "@plane/utils";
import { usePlatformOS } from "@/hooks/use-platform-os";
import { useInitiatives } from "@/plane-web/hooks/store/use-initiatives";
import type { TInitiativeLabel } from "@plane/types";
import { InitiativeLabelPropertyDropdown } from "./initiative-label-property-dropdown";
import { getInitiativeLabelsArray } from "./initiative-label-utils";
@@ -1,4 +1,3 @@
import { orderBy } from "lodash-es";
import { makeObservable } from "mobx";
import { computedFn } from "mobx-utils";
// plane package imports
@@ -44,37 +43,13 @@ export class IssueActivityStore extends IssueActivityStoreCe implements IIssueAc
const workspace = this.store.workspaceRoot.currentWorkspace;
if (!workspace?.id || !issueId) return undefined;
const currentStore =
this.serviceType === EIssueServiceType.EPICS ? this.store.issue.epicDetail : this.store.issue.issueDetail;
let activityComments: TIssueActivityComment[] = [];
const activities = this.getActivitiesByIssueId(issueId);
const comments = currentStore.comment.getCommentsByIssueId(issueId);
const worklogs = this.store.workspaceWorklogs.worklogIdsByIssueId(workspace?.id, issueId);
const additionalPropertiesActivities = this.store.issuePropertiesActivity.getPropertyActivityIdsByIssueId(issueId);
if (!activities || !comments || !worklogs || !additionalPropertiesActivities) return undefined;
const baseItems = this.buildActivityAndCommentItems(issueId);
if (!baseItems || !worklogs || !additionalPropertiesActivities) return undefined;
activities.forEach((activityId) => {
const activity = this.getActivityById(activityId);
if (!activity) return;
activityComments.push({
id: activity.id,
activity_type: EActivityFilterType.ACTIVITY,
created_at: activity.created_at,
});
});
comments.forEach((commentId) => {
const comment = currentStore.comment.getCommentById(commentId);
if (!comment) return;
activityComments.push({
id: comment.id,
activity_type: EActivityFilterType.COMMENT,
created_at: comment.created_at,
});
});
const activityComments: TIssueActivityComment[] = [...baseItems];
worklogs.forEach((worklogId) => {
const worklog = this.store.workspaceWorklogs.worklogById(worklogId);
@@ -96,9 +71,7 @@ export class IssueActivityStore extends IssueActivityStoreCe implements IIssueAc
});
});
activityComments = orderBy(activityComments, (e) => new Date(e.created_at || 0), sortOrder);
return activityComments;
return this.sortActivityComments(activityComments, sortOrder);
});
// actions
@@ -42,8 +42,8 @@ export type TExternalInitiativeFilterGroup =
export type TExternalInitiativeFilterExpressionData =
| {
[key in TInitiativeFilterKeys]?: TFilterValue;
}
[key in TInitiativeFilterKeys]?: TFilterValue;
}
| TExternalInitiativeFilterGroup;
export type TInternalInitiativeFilterExpression = TFilterExpression<TInitiativeFilterKeys>;
@@ -201,4 +201,3 @@ export type TInitiativeStats = {
at_risk_updates: number;
off_track_updates: number;
};
+8 -1
View File
@@ -367,6 +367,9 @@ export const defaultActivityFilters: TActivityFilters[] = [
EActivityFilterType.ASSIGNEE,
EActivityFilterType.DEFAULT,
EActivityFilterTypeEE.WORKLOG, // EE: worklog filter.
EActivityFilterType.STATE,
EActivityFilterType.ASSIGNEE,
EActivityFilterType.DEFAULT,
];
export const filterActivityOnSelectedFilters = (
@@ -374,7 +377,11 @@ export const filterActivityOnSelectedFilters = (
filters: TActivityFilters[]
): TIssueActivityComment[] =>
activity.filter(
(activity) => filters.some((filter) => shouldRenderActivity(activity, filter)) // EE: Render activity based on the selected filters.
(activity) =>
filters.some((filter) => {
if (filter === EActivityFilterType.DEFAULT) return true;
return shouldRenderActivity(activity, filter);
}) // EE: Render activity based on the selected filters.
);
export const ENABLE_ISSUE_DEPENDENCIES = true; // EE: enabled only in EE
@@ -2,7 +2,12 @@ import * as React from "react";
import { ISvgIcons } from "./type";
export const InitiativeIcon: React.FC<ISvgIcons> = ({ width = "16", height = "16", className, color = "currentColor" }) => (
export const InitiativeIcon: React.FC<ISvgIcons> = ({
width = "16",
height = "16",
className,
color = "currentColor",
}) => (
<svg
width={width}
height={height}