[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:
parent
31c761db25
commit
f09e37fed8
3 changed files with 42 additions and 2 deletions
28
web/ce/components/issues/worklog/activity/sort-root.tsx
Normal file
28
web/ce/components/issues/worklog/activity/sort-root.tsx
Normal 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";
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue