[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
This commit is contained in:
Vamsi Krishna 2024-11-26 18:58:01 +05:30 committed by GitHub
parent 31c761db25
commit f09e37fed8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 42 additions and 2 deletions

View file

@ -0,0 +1,28 @@
"use client";
import { FC, memo } from "react";
import { ArrowUpWideNarrow, ArrowDownWideNarrow } from "lucide-react";
import { getButtonStyling } from "@plane/ui";
// helpers
import { cn } from "@/helpers/common.helper";
export type TActivitySortRoot = {
sortOrder: "asc" | "desc";
toggleSort: () => void;
};
export const ActivitySortRoot: FC<TActivitySortRoot> = memo((props) => (
<div
className={cn(getButtonStyling("neutral-primary", "sm"), "px-2 text-custom-text-300 cursor-pointer")}
onClick={() => {
props.toggleSort();
}}
>
{props.sortOrder === "asc" ? (
<ArrowUpWideNarrow className="size-4 " />
) : (
<ArrowDownWideNarrow className="size-4 " />
)}
</div>
));
ActivitySortRoot.displayName = "ActivitySortRoot";

View file

@ -1,8 +1,8 @@
/* eslint-disable no-useless-catch */ /* eslint-disable no-useless-catch */
import concat from "lodash/concat"; import concat from "lodash/concat";
import orderBy from "lodash/orderBy";
import set from "lodash/set"; import set from "lodash/set";
import sortBy from "lodash/sortBy";
import uniq from "lodash/uniq"; import uniq from "lodash/uniq";
import update from "lodash/update"; import update from "lodash/update";
import { action, makeObservable, observable, runInAction } from "mobx"; import { action, makeObservable, observable, runInAction } from "mobx";
@ -29,6 +29,7 @@ export interface IIssueActivityStoreActions {
export interface IIssueActivityStore extends IIssueActivityStoreActions { export interface IIssueActivityStore extends IIssueActivityStoreActions {
// observables // observables
sortOrder: 'asc' | 'desc'
loader: TActivityLoader; loader: TActivityLoader;
activities: TIssueActivityIdMap; activities: TIssueActivityIdMap;
activityMap: TIssueActivityMap; activityMap: TIssueActivityMap;
@ -36,10 +37,12 @@ export interface IIssueActivityStore extends IIssueActivityStoreActions {
getActivitiesByIssueId: (issueId: string) => string[] | undefined; getActivitiesByIssueId: (issueId: string) => string[] | undefined;
getActivityById: (activityId: string) => TIssueActivity | undefined; getActivityById: (activityId: string) => TIssueActivity | undefined;
getActivityCommentByIssueId: (issueId: string) => TIssueActivityComment[] | undefined; getActivityCommentByIssueId: (issueId: string) => TIssueActivityComment[] | undefined;
toggleSortOrder: ()=>void;
} }
export class IssueActivityStore implements IIssueActivityStore { export class IssueActivityStore implements IIssueActivityStore {
// observables // observables
sortOrder: "asc" | "desc" = 'asc';
loader: TActivityLoader = "fetch"; loader: TActivityLoader = "fetch";
activities: TIssueActivityIdMap = {}; activities: TIssueActivityIdMap = {};
activityMap: TIssueActivityMap = {}; activityMap: TIssueActivityMap = {};
@ -50,11 +53,13 @@ export class IssueActivityStore implements IIssueActivityStore {
constructor(protected store: CoreRootStore) { constructor(protected store: CoreRootStore) {
makeObservable(this, { makeObservable(this, {
// observables // observables
sortOrder: observable.ref,
loader: observable.ref, loader: observable.ref,
activities: observable, activities: observable,
activityMap: observable, activityMap: observable,
// actions // actions
fetchActivities: action, fetchActivities: action,
toggleSortOrder: action
}); });
// services // services
this.issueActivityService = new IssueActivityService(); this.issueActivityService = new IssueActivityService();
@ -99,11 +104,15 @@ export class IssueActivityStore implements IIssueActivityStore {
}); });
}); });
activityComments = sortBy(activityComments, "created_at"); activityComments = orderBy(activityComments, (e)=>new Date(e.created_at || 0), this.sortOrder);
return activityComments; return activityComments;
}); });
toggleSortOrder = ()=>{
this.sortOrder = this.sortOrder === 'asc' ? 'desc' : 'asc';
}
// actions // actions
public async fetchActivities( public async fetchActivities(
workspaceSlug: string, workspaceSlug: string,

View file

@ -14,6 +14,7 @@ import { IssueActivityCommentRoot } from "@/components/issues/issue-detail";
import { useIssueDetail, useProject, useUser, useUserPermissions } from "@/hooks/store"; import { useIssueDetail, useProject, useUser, useUserPermissions } from "@/hooks/store";
// plane web components // plane web components
import { ActivityFilterRoot, IssueActivityWorklogCreateButton } from "@/plane-web/components/issues/worklog"; import { ActivityFilterRoot, IssueActivityWorklogCreateButton } from "@/plane-web/components/issues/worklog";
import { ActivitySortRoot } from "@/plane-web/components/issues/worklog/activity/sort-root";
// plane web constants // plane web constants
import { TActivityFilters, defaultActivityFilters } from "@/plane-web/constants/issues"; import { TActivityFilters, defaultActivityFilters } from "@/plane-web/constants/issues";
import { EUserPermissions } from "@/plane-web/constants/user-permissions"; import { EUserPermissions } from "@/plane-web/constants/user-permissions";
@ -43,6 +44,7 @@ export const IssueActivity: FC<TIssueActivity> = observer((props) => {
// hooks // hooks
const { const {
issue: { getIssueById }, issue: { getIssueById },
activity: { sortOrder, toggleSortOrder},
createComment, createComment,
updateComment, updateComment,
removeComment, removeComment,
@ -162,6 +164,7 @@ export const IssueActivity: FC<TIssueActivity> = observer((props) => {
disabled={disabled} disabled={disabled}
/> />
)} )}
<ActivitySortRoot sortOrder={sortOrder} toggleSort={toggleSortOrder}/>
<ActivityFilterRoot <ActivityFilterRoot
selectedFilters={selectedFilters} selectedFilters={selectedFilters}
toggleFilter={toggleFilter} toggleFilter={toggleFilter}