mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
fix reeordering while update
This commit is contained in:
parent
b4416b9172
commit
5d2e89c285
@ -34,12 +34,14 @@ import { IssueArchiveService, IssueDraftService, IssueService } from "services/i
|
|||||||
import set from "lodash/set";
|
import set from "lodash/set";
|
||||||
import { get } from "lodash";
|
import { get } from "lodash";
|
||||||
import { computedFn } from "mobx-utils";
|
import { computedFn } from "mobx-utils";
|
||||||
|
import isEqual from "date-fns/isEqual";
|
||||||
|
|
||||||
export type TIssueDisplayFilterOptions = Exclude<TIssueGroupByOptions, null> | "target_date";
|
export type TIssueDisplayFilterOptions = Exclude<TIssueGroupByOptions, null> | "target_date";
|
||||||
|
|
||||||
export enum EIssueGroupedAction {
|
export enum EIssueGroupedAction {
|
||||||
ADD,
|
ADD,
|
||||||
DELETE,
|
DELETE,
|
||||||
|
REORDER,
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ALL_ISSUES = "All Issues";
|
export const ALL_ISSUES = "All Issues";
|
||||||
@ -79,6 +81,38 @@ const ISSUE_FILTER_DEFAULT_DATA: Record<TIssueDisplayFilterOptions, keyof TIssue
|
|||||||
module: "module_ids",
|
module: "module_ids",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ISSUE_ORDERBY_KEY: Record<TIssueOrderByOptions, keyof TIssue> = {
|
||||||
|
created_at: "created_at",
|
||||||
|
"-created_at": "created_at",
|
||||||
|
updated_at: "updated_at",
|
||||||
|
"-updated_at": "updated_at",
|
||||||
|
priority: "priority",
|
||||||
|
"-priority": "priority",
|
||||||
|
sort_order: "sort_order",
|
||||||
|
state__name: "state_id",
|
||||||
|
"-state__name": "state_id",
|
||||||
|
assignees__first_name: "assignee_ids",
|
||||||
|
"-assignees__first_name": "assignee_ids",
|
||||||
|
labels__name: "label_ids",
|
||||||
|
"-labels__name": "label_ids",
|
||||||
|
modules__name: "module_ids",
|
||||||
|
"-modules__name": "module_ids",
|
||||||
|
cycle__name: "cycle_id",
|
||||||
|
"-cycle__name": "cycle_id",
|
||||||
|
target_date: "target_date",
|
||||||
|
"-target_date": "target_date",
|
||||||
|
estimate_point: "estimate_point",
|
||||||
|
"-estimate_point": "estimate_point",
|
||||||
|
start_date: "start_date",
|
||||||
|
"-start_date": "start_date",
|
||||||
|
link_count: "link_count",
|
||||||
|
"-link_count": "link_count",
|
||||||
|
attachment_count: "attachment_count",
|
||||||
|
"-attachment_count": "attachment_count",
|
||||||
|
sub_issues_count: "sub_issues_count",
|
||||||
|
"-sub_issues_count": "sub_issues_count",
|
||||||
|
};
|
||||||
|
|
||||||
export class BaseIssuesStore implements IBaseIssuesStore {
|
export class BaseIssuesStore implements IBaseIssuesStore {
|
||||||
loader: TLoader = "init-loader";
|
loader: TLoader = "init-loader";
|
||||||
groupedIssueIds: TIssues | undefined = undefined;
|
groupedIssueIds: TIssues | undefined = undefined;
|
||||||
@ -164,6 +198,13 @@ export class BaseIssuesStore implements IBaseIssuesStore {
|
|||||||
return displayFilters?.layout === "kanban" ? displayFilters?.sub_group_by : undefined;
|
return displayFilters?.layout === "kanban" ? displayFilters?.sub_group_by : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get orderByKey() {
|
||||||
|
const orderBy = this.orderBy;
|
||||||
|
if (!orderBy) return;
|
||||||
|
|
||||||
|
return ISSUE_ORDERBY_KEY[orderBy];
|
||||||
|
}
|
||||||
|
|
||||||
get issueGroupKey() {
|
get issueGroupKey() {
|
||||||
const groupBy = this.groupBy;
|
const groupBy = this.groupBy;
|
||||||
|
|
||||||
@ -427,6 +468,13 @@ export class BaseIssuesStore implements IBaseIssuesStore {
|
|||||||
});
|
});
|
||||||
this.updateIssueCount(issueUpdate.path, -1);
|
this.updateIssueCount(issueUpdate.path, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//if update is reorder, reorder it at a particular path
|
||||||
|
if (issueUpdate.action === EIssueGroupedAction.REORDER) {
|
||||||
|
update(this, ["groupedIssueIds", ...issueUpdate.path], (issueIds: string[] = []) => {
|
||||||
|
return this.issuesSortWithOrderBy(issueIds, this.orderBy);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -459,7 +507,9 @@ export class BaseIssuesStore implements IBaseIssuesStore {
|
|||||||
issueBeforeUpdate?: Partial<TIssue>,
|
issueBeforeUpdate?: Partial<TIssue>,
|
||||||
action?: EIssueGroupedAction
|
action?: EIssueGroupedAction
|
||||||
): { path: string[]; action: EIssueGroupedAction }[] => {
|
): { path: string[]; action: EIssueGroupedAction }[] => {
|
||||||
if (!this.issueGroupKey || !issue) return action ? [{ path: [ALL_ISSUES], action }] : [];
|
const orderByUpdates = this.getOrderByUpdateDetails(issue, issueBeforeUpdate);
|
||||||
|
if (!this.issueGroupKey || !issue)
|
||||||
|
return action ? [{ path: [ALL_ISSUES], action }, ...orderByUpdates] : orderByUpdates;
|
||||||
|
|
||||||
const groupActionsArray = this.getDifference(
|
const groupActionsArray = this.getDifference(
|
||||||
this.getArrayStringArray(issue[this.issueGroupKey], this.groupBy),
|
this.getArrayStringArray(issue[this.issueGroupKey], this.groupBy),
|
||||||
@ -467,17 +517,21 @@ export class BaseIssuesStore implements IBaseIssuesStore {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (!this.issueSubGroupKey)
|
if (!this.issueSubGroupKey)
|
||||||
return this.getGroupIssueKeyActions(
|
return [
|
||||||
|
...this.getGroupIssueKeyActions(
|
||||||
groupActionsArray[EIssueGroupedAction.ADD],
|
groupActionsArray[EIssueGroupedAction.ADD],
|
||||||
groupActionsArray[EIssueGroupedAction.DELETE]
|
groupActionsArray[EIssueGroupedAction.DELETE]
|
||||||
);
|
),
|
||||||
|
...orderByUpdates,
|
||||||
|
];
|
||||||
|
|
||||||
const subGroupActionsArray = this.getDifference(
|
const subGroupActionsArray = this.getDifference(
|
||||||
this.getArrayStringArray(issue[this.issueSubGroupKey], this.subGroupBy),
|
this.getArrayStringArray(issue[this.issueSubGroupKey], this.subGroupBy),
|
||||||
this.getArrayStringArray(issueBeforeUpdate?.[this.issueSubGroupKey], this.subGroupBy)
|
this.getArrayStringArray(issueBeforeUpdate?.[this.issueSubGroupKey], this.subGroupBy)
|
||||||
);
|
);
|
||||||
|
|
||||||
return this.getSubGroupIssueKeyActions(
|
return [
|
||||||
|
...this.getSubGroupIssueKeyActions(
|
||||||
groupActionsArray,
|
groupActionsArray,
|
||||||
subGroupActionsArray,
|
subGroupActionsArray,
|
||||||
this.getArrayStringArray(issueBeforeUpdate?.[this.issueGroupKey] ?? issue[this.issueGroupKey], this.groupBy),
|
this.getArrayStringArray(issueBeforeUpdate?.[this.issueGroupKey] ?? issue[this.issueGroupKey], this.groupBy),
|
||||||
@ -487,12 +541,47 @@ export class BaseIssuesStore implements IBaseIssuesStore {
|
|||||||
this.subGroupBy
|
this.subGroupBy
|
||||||
),
|
),
|
||||||
this.getArrayStringArray(issue[this.issueSubGroupKey], this.subGroupBy)
|
this.getArrayStringArray(issue[this.issueSubGroupKey], this.subGroupBy)
|
||||||
);
|
),
|
||||||
|
...orderByUpdates,
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
getOrderByUpdateDetails(issue: Partial<TIssue> | undefined, issueBeforeUpdate: Partial<TIssue> | undefined) {
|
||||||
|
if (
|
||||||
|
!issue ||
|
||||||
|
!issueBeforeUpdate ||
|
||||||
|
!this.orderByKey ||
|
||||||
|
isEqual(issue[this.orderByKey], issueBeforeUpdate[this.orderByKey])
|
||||||
|
)
|
||||||
|
return [];
|
||||||
|
|
||||||
|
if (!this.issueGroupKey) return [{ path: [ALL_ISSUES], action: EIssueGroupedAction.REORDER }];
|
||||||
|
|
||||||
|
const issueKeyActions = [];
|
||||||
|
const groupByValues = this.getArrayStringArray(issue[this.issueGroupKey]);
|
||||||
|
|
||||||
|
if (!this.issueSubGroupKey) {
|
||||||
|
for (const groupKey of groupByValues) {
|
||||||
|
issueKeyActions.push({ path: [groupKey], action: EIssueGroupedAction.REORDER });
|
||||||
|
}
|
||||||
|
|
||||||
|
return issueKeyActions;
|
||||||
|
}
|
||||||
|
|
||||||
|
const subGroupByValues = this.getArrayStringArray(issue[this.issueSubGroupKey]);
|
||||||
|
|
||||||
|
for (const groupKey of groupByValues) {
|
||||||
|
for (const subGroupKey of subGroupByValues) {
|
||||||
|
issueKeyActions.push({ path: [groupKey, subGroupKey], action: EIssueGroupedAction.REORDER });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return issueKeyActions;
|
||||||
|
}
|
||||||
|
|
||||||
getArrayStringArray = (
|
getArrayStringArray = (
|
||||||
value: string | string[] | undefined | null,
|
value: string | string[] | undefined | null,
|
||||||
groupByKey: TIssueGroupByOptions | undefined
|
groupByKey?: TIssueGroupByOptions | undefined
|
||||||
): string[] => {
|
): string[] => {
|
||||||
if (!value) return [];
|
if (!value) return [];
|
||||||
if (Array.isArray(value)) return value;
|
if (Array.isArray(value)) return value;
|
||||||
|
Loading…
Reference in New Issue
Block a user