Skip to content

Commit f09e37f

Browse files
[WEB - 2779] feat: Added sort order for issue activity (#6087)
* added sort order for issue activity * fixed invalid date generation issue * fixed lint errors, optimized code
1 parent 31c761d commit f09e37f

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"use client";
2+
3+
import { FC, memo } from "react";
4+
import { ArrowUpWideNarrow, ArrowDownWideNarrow } from "lucide-react";
5+
import { getButtonStyling } from "@plane/ui";
6+
// helpers
7+
import { cn } from "@/helpers/common.helper";
8+
9+
export type TActivitySortRoot = {
10+
sortOrder: "asc" | "desc";
11+
toggleSort: () => void;
12+
};
13+
export const ActivitySortRoot: FC<TActivitySortRoot> = memo((props) => (
14+
<div
15+
className={cn(getButtonStyling("neutral-primary", "sm"), "px-2 text-custom-text-300 cursor-pointer")}
16+
onClick={() => {
17+
props.toggleSort();
18+
}}
19+
>
20+
{props.sortOrder === "asc" ? (
21+
<ArrowUpWideNarrow className="size-4 " />
22+
) : (
23+
<ArrowDownWideNarrow className="size-4 " />
24+
)}
25+
</div>
26+
));
27+
28+
ActivitySortRoot.displayName = "ActivitySortRoot";

web/ce/store/issue/issue-details/activity.store.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
/* eslint-disable no-useless-catch */
22

33
import concat from "lodash/concat";
4+
import orderBy from "lodash/orderBy";
45
import set from "lodash/set";
5-
import sortBy from "lodash/sortBy";
66
import uniq from "lodash/uniq";
77
import update from "lodash/update";
88
import { action, makeObservable, observable, runInAction } from "mobx";
@@ -29,17 +29,20 @@ export interface IIssueActivityStoreActions {
2929

3030
export interface IIssueActivityStore extends IIssueActivityStoreActions {
3131
// observables
32+
sortOrder: 'asc' | 'desc'
3233
loader: TActivityLoader;
3334
activities: TIssueActivityIdMap;
3435
activityMap: TIssueActivityMap;
3536
// helper methods
3637
getActivitiesByIssueId: (issueId: string) => string[] | undefined;
3738
getActivityById: (activityId: string) => TIssueActivity | undefined;
3839
getActivityCommentByIssueId: (issueId: string) => TIssueActivityComment[] | undefined;
40+
toggleSortOrder: ()=>void;
3941
}
4042

4143
export class IssueActivityStore implements IIssueActivityStore {
4244
// observables
45+
sortOrder: "asc" | "desc" = 'asc';
4346
loader: TActivityLoader = "fetch";
4447
activities: TIssueActivityIdMap = {};
4548
activityMap: TIssueActivityMap = {};
@@ -50,11 +53,13 @@ export class IssueActivityStore implements IIssueActivityStore {
5053
constructor(protected store: CoreRootStore) {
5154
makeObservable(this, {
5255
// observables
56+
sortOrder: observable.ref,
5357
loader: observable.ref,
5458
activities: observable,
5559
activityMap: observable,
5660
// actions
5761
fetchActivities: action,
62+
toggleSortOrder: action
5863
});
5964
// services
6065
this.issueActivityService = new IssueActivityService();
@@ -99,11 +104,15 @@ export class IssueActivityStore implements IIssueActivityStore {
99104
});
100105
});
101106

102-
activityComments = sortBy(activityComments, "created_at");
107+
activityComments = orderBy(activityComments, (e)=>new Date(e.created_at || 0), this.sortOrder);
103108

104109
return activityComments;
105110
});
106111

112+
toggleSortOrder = ()=>{
113+
this.sortOrder = this.sortOrder === 'asc' ? 'desc' : 'asc';
114+
}
115+
107116
// actions
108117
public async fetchActivities(
109118
workspaceSlug: string,

web/core/components/issues/issue-detail/issue-activity/root.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { IssueActivityCommentRoot } from "@/components/issues/issue-detail";
1414
import { useIssueDetail, useProject, useUser, useUserPermissions } from "@/hooks/store";
1515
// plane web components
1616
import { ActivityFilterRoot, IssueActivityWorklogCreateButton } from "@/plane-web/components/issues/worklog";
17+
import { ActivitySortRoot } from "@/plane-web/components/issues/worklog/activity/sort-root";
1718
// plane web constants
1819
import { TActivityFilters, defaultActivityFilters } from "@/plane-web/constants/issues";
1920
import { EUserPermissions } from "@/plane-web/constants/user-permissions";
@@ -43,6 +44,7 @@ export const IssueActivity: FC<TIssueActivity> = observer((props) => {
4344
// hooks
4445
const {
4546
issue: { getIssueById },
47+
activity: { sortOrder, toggleSortOrder},
4648
createComment,
4749
updateComment,
4850
removeComment,
@@ -162,6 +164,7 @@ export const IssueActivity: FC<TIssueActivity> = observer((props) => {
162164
disabled={disabled}
163165
/>
164166
)}
167+
<ActivitySortRoot sortOrder={sortOrder} toggleSort={toggleSortOrder}/>
165168
<ActivityFilterRoot
166169
selectedFilters={selectedFilters}
167170
toggleFilter={toggleFilter}

0 commit comments

Comments
 (0)