[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:
@@ -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;
|
||||
|
||||
+1
-1
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user