Compare commits

...

3 Commits

Author SHA1 Message Date
rahulramesha 5a249f28e1 fix sorting of existing values and add sorting to all fields 2023-11-29 11:33:12 +05:30
rahulramesha 1fadcdd1f4 fix profile draft and archived issues 2023-11-28 17:43:52 +05:30
rahulramesha edd1f6e423 fix profile issue filters and kanban 2023-11-27 17:05:08 +05:30
7 changed files with 164 additions and 66 deletions
@@ -18,6 +18,7 @@ export const ProfileIssuesAppliedFiltersRoot: React.FC = observer(() => {
const {
workspace: { workspaceLabels },
workspaceProfileIssuesFilter: { issueFilters, updateFilters },
projectMember: { projectMembers },
} = useMobxStore();
const userFilters = issueFilters?.filters;
@@ -64,7 +65,7 @@ export const ProfileIssuesAppliedFiltersRoot: React.FC = observer(() => {
handleClearAllFilters={handleClearAllFilters}
handleRemoveFilter={handleRemoveFilter}
labels={workspaceLabels ?? []}
members={[]}
members={projectMembers?.map((m) => m.member)}
states={[]}
/>
</div>
+9 -10
View File
@@ -1,12 +1,8 @@
import React, { ReactElement } from "react";
import React from "react";
import { useRouter } from "next/router";
import useSWR from "swr";
import { observer } from "mobx-react-lite";
// layouts
import { AppLayout } from "layouts/app-layout";
import { ProfileAuthWrapper } from "layouts/user-profile-layout";
// components
import { UserProfileHeader } from "components/headers";
import { ProfileIssuesListLayout } from "components/issues/issue-layouts/list/roots/profile-issues-root";
import { ProfileIssuesKanBanLayout } from "components/issues/issue-layouts/kanban/roots/profile-issues-root";
import { ProfileIssuesAppliedFiltersRoot } from "components/issues";
@@ -31,12 +27,15 @@ export const ProfileIssuesPage = observer((props: IProfileIssuesPage) => {
workspaceProfileIssuesFilter: { issueFilters, fetchFilters },
}: RootStore = useMobxStore();
useSWR(workspaceSlug && userId ? `CURRENT_WORKSPACE_PROFILE_ISSUES_${workspaceSlug}_${userId}` : null, async () => {
if (workspaceSlug && userId) {
await fetchFilters(workspaceSlug);
await fetchIssues(workspaceSlug, userId, getIssues ? "mutation" : "init-loader", props.type);
useSWR(
workspaceSlug && userId ? `CURRENT_WORKSPACE_PROFILE_ISSUES_${workspaceSlug}_${userId}_${props.type}` : null,
async () => {
if (workspaceSlug && userId) {
await fetchFilters(workspaceSlug);
await fetchIssues(workspaceSlug, userId, getIssues ? "mutation" : "init-loader", props.type);
}
}
});
);
const activeLayout = issueFilters?.displayFilters?.layout || undefined;
+28 -18
View File
@@ -5,6 +5,7 @@ import { IIssueDisplayFilterOptions, IIssueDisplayProperties, IIssueFilterOption
import { EFilterType } from "store/issues/types";
import { handleIssueQueryParamsByLayout } from "helpers/issue.helper";
import { IssueFilterBaseStore } from "../project-issues/base-issue-filter.store";
import { isEmpty } from "lodash";
interface IProjectIssuesFiltersOptions {
filters: IIssueFilterOptions;
@@ -121,12 +122,18 @@ export class GlobalIssuesFilterStore extends IssueFilterBaseStore implements IGl
let _projectIssueFilters = this.projectIssueFilters;
if (!_projectIssueFilters) _projectIssueFilters = {};
if (!_projectIssueFilters[workspaceSlug])
_projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {}, displayProperties: {} };
_projectIssueFilters[workspaceSlug] = {
..._projectIssueFilters[workspaceSlug],
...issueFilters,
};
if (!_projectIssueFilters[workspaceSlug]) {
_projectIssueFilters[workspaceSlug] = { displayProperties: {} } as IProjectIssuesDisplayOptions;
}
if (
isEmpty(_projectIssueFilters[workspaceSlug].filters) ||
isEmpty(_projectIssueFilters[workspaceSlug].displayFilters)
) {
_projectIssueFilters[workspaceSlug] = {
..._projectIssueFilters[workspaceSlug],
...issueFilters,
};
}
runInAction(() => {
this.projectIssueFilters = _projectIssueFilters;
@@ -192,15 +199,15 @@ export class GlobalIssuesFilterStore extends IssueFilterBaseStore implements IGl
fetchDisplayProperties = async (workspaceSlug: string) => {
try {
const displayProperties: IIssueDisplayProperties = {
assignee: false,
start_date: false,
due_date: false,
assignee: true,
start_date: true,
due_date: true,
labels: false,
key: false,
priority: false,
priority: true,
state: false,
sub_issue_count: false,
link: false,
sub_issue_count: true,
link: true,
attachment_count: false,
estimate: false,
created_on: false,
@@ -209,12 +216,15 @@ export class GlobalIssuesFilterStore extends IssueFilterBaseStore implements IGl
let _projectIssueFilters = { ...this.projectIssueFilters };
if (!_projectIssueFilters) _projectIssueFilters = {};
if (!_projectIssueFilters[workspaceSlug])
_projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {}, displayProperties: {} };
_projectIssueFilters[workspaceSlug] = {
..._projectIssueFilters[workspaceSlug],
displayProperties: displayProperties,
};
if (!_projectIssueFilters[workspaceSlug]) {
_projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {} } as IProjectIssuesDisplayOptions;
}
if (isEmpty(_projectIssueFilters[workspaceSlug].displayProperties)) {
_projectIssueFilters[workspaceSlug] = {
..._projectIssueFilters[workspaceSlug],
displayProperties: displayProperties,
};
}
runInAction(() => {
this.projectIssueFilters = _projectIssueFilters;
+26 -18
View File
@@ -5,6 +5,7 @@ import { IIssueDisplayFilterOptions, IIssueDisplayProperties, IIssueFilterOption
import { EFilterType } from "store/issues/types";
import { handleIssueQueryParamsByLayout } from "helpers/issue.helper";
import { IssueFilterBaseStore } from "../project-issues/base-issue-filter.store";
import isEmpty from "lodash/isEmpty";
interface IProjectIssuesFiltersOptions {
filters: IIssueFilterOptions;
@@ -121,12 +122,18 @@ export class ProfileIssuesFilterStore extends IssueFilterBaseStore implements IP
let _projectIssueFilters = this.projectIssueFilters;
if (!_projectIssueFilters) _projectIssueFilters = {};
if (!_projectIssueFilters[workspaceSlug])
_projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {}, displayProperties: {} };
_projectIssueFilters[workspaceSlug] = {
..._projectIssueFilters[workspaceSlug],
...issueFilters,
};
if (!_projectIssueFilters[workspaceSlug]) {
_projectIssueFilters[workspaceSlug] = { displayProperties: {} } as IProjectIssuesDisplayOptions;
}
if (
isEmpty(_projectIssueFilters[workspaceSlug].filters) ||
isEmpty(_projectIssueFilters[workspaceSlug].displayFilters)
) {
_projectIssueFilters[workspaceSlug] = {
..._projectIssueFilters[workspaceSlug],
...issueFilters,
};
}
runInAction(() => {
this.projectIssueFilters = _projectIssueFilters;
@@ -184,7 +191,6 @@ export class ProfileIssuesFilterStore extends IssueFilterBaseStore implements IP
return _filters;
} catch (error) {
this.fetchDisplayFilters(workspaceSlug);
throw error;
}
};
@@ -192,12 +198,12 @@ export class ProfileIssuesFilterStore extends IssueFilterBaseStore implements IP
fetchDisplayProperties = async (workspaceSlug: string) => {
try {
const displayProperties: IIssueDisplayProperties = {
assignee: false,
assignee: true,
start_date: false,
due_date: false,
labels: false,
key: false,
priority: false,
labels: true,
key: true,
priority: true,
state: false,
sub_issue_count: false,
link: false,
@@ -209,12 +215,15 @@ export class ProfileIssuesFilterStore extends IssueFilterBaseStore implements IP
let _projectIssueFilters = { ...this.projectIssueFilters };
if (!_projectIssueFilters) _projectIssueFilters = {};
if (!_projectIssueFilters[workspaceSlug])
_projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {}, displayProperties: {} };
_projectIssueFilters[workspaceSlug] = {
..._projectIssueFilters[workspaceSlug],
displayProperties: displayProperties,
};
if (!_projectIssueFilters[workspaceSlug]) {
_projectIssueFilters[workspaceSlug] = { filters: {}, displayFilters: {} } as IProjectIssuesDisplayOptions;
}
if (isEmpty(_projectIssueFilters[workspaceSlug].displayProperties)) {
_projectIssueFilters[workspaceSlug] = {
..._projectIssueFilters[workspaceSlug],
displayProperties: displayProperties,
};
}
runInAction(() => {
this.projectIssueFilters = _projectIssueFilters;
@@ -242,7 +251,6 @@ export class ProfileIssuesFilterStore extends IssueFilterBaseStore implements IP
return properties;
} catch (error) {
this.fetchDisplayProperties(workspaceSlug);
throw error;
}
};
+17 -13
View File
@@ -19,7 +19,7 @@ export interface IProfileIssuesStore {
loader: TLoader;
issues: { [user_id: string]: IProfileIssueTabTypes } | undefined;
currentUserId: string | null;
currentUserIssueTab: "assigned" | "created" | "subscribed" | null;
currentUserIssueTab: "assigned" | "created" | "subscribed" | undefined;
// computed
getIssues: IIssueResponse | undefined;
getIssuesIds: IGroupedIssues | ISubGroupedIssues | TUnGroupedIssues | undefined;
@@ -51,7 +51,7 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues
loader: TLoader = "init-loader";
issues: { [user_id: string]: IProfileIssueTabTypes } | undefined = undefined;
currentUserId: string | null = null;
currentUserIssueTab: "assigned" | "created" | "subscribed" | null = null;
currentUserIssueTab: "assigned" | "created" | "subscribed" | undefined = undefined;
// root store
rootStore;
// service
@@ -86,7 +86,9 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues
if (!workspaceSlug || !this.currentUserId || !this.currentUserIssueTab) return;
const userFilters = this.rootStore?.workspaceProfileIssuesFilter?.issueFilters?.filters;
if (userFilters) this.fetchIssues(workspaceSlug, this.currentUserId, "mutation", this.currentUserIssueTab);
if (userFilters) {
this.fetchIssues(workspaceSlug, this.currentUserId, "mutation", this.currentUserIssueTab);
}
});
}
@@ -102,6 +104,7 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues
const displayFilters = this.rootStore?.workspaceProfileIssuesFilter?.issueFilters?.displayFilters;
if (!displayFilters) return undefined;
const subGroupBy = displayFilters?.sub_group_by;
const groupBy = displayFilters?.group_by;
const orderBy = displayFilters?.order_by;
const layout = displayFilters?.layout;
@@ -113,6 +116,15 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues
if (layout === "list" && orderBy) {
if (groupBy) issues = this.groupedIssues(groupBy, orderBy, this.issues[currentUserId][this.currentUserIssueTab]);
else issues = this.unGroupedIssues(orderBy, this.issues[currentUserId][this.currentUserIssueTab]);
} else if (layout === "kanban" && groupBy && orderBy) {
if (subGroupBy)
issues = this.subGroupedIssues(
subGroupBy,
groupBy,
orderBy,
this.issues[currentUserId][this.currentUserIssueTab]
);
else issues = this.groupedIssues(groupBy, orderBy, this.issues[currentUserId][this.currentUserIssueTab]);
}
return issues;
@@ -186,20 +198,12 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues
createIssue = async (workspaceSlug: string, userId: string, data: Partial<IIssue>) => {
try {
const projectId = data.project;
const moduleId = data.module_id;
const cycleId = data.cycle_id;
if (!projectId) return;
let response = {} as IIssue;
response = await this.rootStore.projectIssues.createIssue(workspaceSlug, projectId, data);
// if (moduleId)
// response = await this.rootStore.moduleIssues.addIssueToModule(workspaceSlug, projectId, moduleId, response);
// if (cycleId)
// response = await this.rootStore.cycleIssues.addIssueToCycle(workspaceSlug, projectId, cycleId, response);
let _issues = this.issues;
if (!_issues) _issues = {};
if (!_issues[userId]) _issues[userId] = { assigned: {}, created: {}, subscribed: {} };
@@ -227,8 +231,8 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues
let _issues = { ...this.issues };
if (!_issues) _issues = {};
if (!_issues[userId]) _issues[userId] = { assigned: {}, created: {}, subscribed: {} };
_issues[projectId][this.currentUserIssueTab][userId] = {
..._issues[projectId][this.currentUserIssueTab][userId],
_issues[userId][this.currentUserIssueTab][userId] = {
..._issues[userId][this.currentUserIssueTab][userId],
...data,
};
@@ -119,8 +119,17 @@ export class ProjectArchivedIssuesStore extends IssueBaseStore implements IProje
removeIssue = async (workspaceSlug: string, projectId: string, issueId: string) => {
try {
await this.archivedIssueService.unarchiveIssue(workspaceSlug, projectId, issueId);
return;
let _issues = { ...this.issues };
if (!_issues) _issues = {};
if (!_issues[projectId]) _issues[projectId] = {};
delete _issues?.[projectId]?.[issueId];
runInAction(() => {
this.issues = _issues;
});
const response = await this.archivedIssueService.deleteArchivedIssue(workspaceSlug, projectId, issueId);
return response;
} catch (error) {
throw error;
}
@@ -128,8 +137,17 @@ export class ProjectArchivedIssuesStore extends IssueBaseStore implements IProje
removeIssueFromArchived = async (workspaceSlug: string, projectId: string, issueId: string) => {
try {
await this.archivedIssueService.deleteArchivedIssue(workspaceSlug, projectId, issueId);
return;
let _issues = { ...this.issues };
if (!_issues) _issues = {};
if (!_issues[projectId]) _issues[projectId] = {};
delete _issues?.[projectId]?.[issueId];
runInAction(() => {
this.issues = _issues;
});
const response = await this.archivedIssueService.unarchiveIssue(workspaceSlug, projectId, issueId);
return response;
} catch (error) {
throw error;
}
@@ -122,22 +122,80 @@ export class IssueBaseStore implements IIssueBaseStore {
issuesSortWithOrderBy = (issueObject: IIssueResponse, key: Partial<TIssueOrderByOptions>): IIssue[] => {
let array = _.values(issueObject);
array = _.sortBy(array, "created_at");
array = _.reverse(_.sortBy(array, "created_at"));
switch (key) {
case "sort_order":
return _.sortBy(array, "sort_order");
return _.reverse(_.sortBy(array, "sort_order"));
case "state__name": {
return _.reverse(_.sortBy(array, "state"));
}
case "-state__name": {
return _.sortBy(array, "state");
}
//dates
case "created_at":
return _.sortBy(array, "created_at");
case "-created_at":
return _.reverse(_.sortBy(array, "created_at"));
case "updated_at":
return _.sortBy(array, "updated_at");
case "-updated_at":
return _.reverse(_.sortBy(array, "updated_at"));
case "start_date":
return _.sortBy(array, "start_date");
case "-start_date":
return _.reverse(_.sortBy(array, "start_date"));
case "target_date":
return _.sortBy(array, "target_date");
case "-target_date":
return _.reverse(_.sortBy(array, "target_date"));
//custom
case "priority": {
const sortArray = ISSUE_PRIORITIES.map((i) => i.key);
return _.reverse(_.sortBy(array, (_issue: IIssue) => _.indexOf(sortArray, _issue.priority)));
}
case "-priority": {
const sortArray = ISSUE_PRIORITIES.map((i) => i.key);
return _.sortBy(array, (_issue: IIssue) => _.indexOf(sortArray, _issue.priority));
}
//number
case "attachment_count": {
return _.sortBy(array, "attachment_count");
}
case "-attachment_count": {
return _.reverse(_.sortBy(array, "attachment_count"));
}
case "estimate_point": {
return _.sortBy(array, "estimate_point");
}
case "-estimate_point": {
return _.reverse(_.sortBy(array, "estimate_point"));
}
case "link_count": {
return _.sortBy(array, "link_count");
}
case "-link_count": {
return _.reverse(_.sortBy(array, "link_count"));
}
case "sub_issues_count": {
return _.sortBy(array, "sub_issues_count");
}
case "-sub_issues_count": {
return _.reverse(_.sortBy(array, "sub_issues_count"));
}
//Array
case "labels__name": {
return _.reverse(_.sortBy(array, "labels"));
}
case "-labels__name": {
return _.sortBy(array, "labels");
}
case "assignees__first_name": {
return _.reverse(_.sortBy(array, "assignees"));
}
case "-assignees__first_name": {
return _.sortBy(array, "assignees");
}
default:
return array;
}