Skip to content

Commit 63bc01f

Browse files
[WEB-2774]fix:reordering favorites and favorite folders (#6119)
* fixed re order for favorites * fixed lint errors * added reorder * fixed reorder inside folder * fixed lint issues * memoized reorder * removed unnecessary comments * seprated duplicate logic to a common file * removed code comments * fixed favorite remove while reorder inside folder * fixed folder remove while reorder inside folder * fixed-reorder issue * added last child to drop handled * fixed orderby function * removed unncessasary comments
1 parent 1953d6f commit 63bc01f

File tree

4 files changed

+40
-60
lines changed

4 files changed

+40
-60
lines changed

web/core/components/workspace/sidebar/favorites/favorite-folder.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ type Props = {
3434
favorite: IFavorite;
3535
handleRemoveFromFavorites: (favorite: IFavorite) => void;
3636
handleRemoveFromFavoritesFolder: (favoriteId: string) => void;
37-
handleReorder: (favoriteId: string, sequence: number) => void;
3837
handleDrop: (self: DropTargetRecord,source: ElementDragPayload, location: DragLocationHistory) => void;
3938
};
4039

web/core/components/workspace/sidebar/favorites/favorites-menu.tsx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { usePlatformOS } from "@/hooks/use-platform-os";
2828
// plane web components
2929
import { FavoriteFolder } from "./favorite-folder";
3030
import { FavoriteRoot } from "./favorite-items";
31-
import { getDestinationStateSequence, getInstructionFromPayload, TargetData } from "./favorites.helpers";
31+
import { getInstructionFromPayload, TargetData } from "./favorites.helpers";
3232
import { NewFavoriteFolder } from "./new-fav-folder";
3333

3434
export const SidebarFavoritesMenu = observer(() => {
@@ -94,22 +94,20 @@ export const SidebarFavoritesMenu = observer(() => {
9494
handleMoveToFolder(sourceData.id, parentId);
9595
}
9696
//handle remove from folder if dropped outside of the folder
97-
if (parentId && sourceData.isChild) {
97+
if (parentId && parentId !== sourceData.parentId && sourceData.isChild) {
9898
handleRemoveFromFavoritesFolder(sourceData.id);
9999
}
100100

101101
// handle reordering at root level
102102
if (droppedFavId) {
103103
if (instruction != "make-child") {
104-
const destinationSequence = getDestinationStateSequence(groupedFavorites, droppedFavId, instruction);
105-
handleReorder(sourceData.id, destinationSequence || 0);
104+
handleReorder(sourceData.id, droppedFavId, instruction);
106105
}
107106
}
108107
} else {
109108
//handling reordering for favorites
110109
if (droppedFavId) {
111-
const destinationSequence = getDestinationStateSequence(groupedFavorites, droppedFavId, instruction);
112-
handleReorder(sourceData.id, destinationSequence || 0);
110+
handleReorder(sourceData.id, droppedFavId, instruction);
113111
}
114112

115113
// handle removal from folder if dropped outside a folder
@@ -147,10 +145,8 @@ export const SidebarFavoritesMenu = observer(() => {
147145
};
148146

149147
const handleReorder = useCallback(
150-
(favoriteId: string, sequence: number) => {
151-
reOrderFavorite(workspaceSlug.toString(), favoriteId, {
152-
sequence: sequence,
153-
}).catch(() => {
148+
(favoriteId: string, droppedFavId: string, edge: string | undefined) => {
149+
reOrderFavorite(workspaceSlug.toString(), favoriteId, droppedFavId, edge).catch(() => {
154150
setToast({
155151
type: TOAST_TYPE.ERROR,
156152
title: "Error!",
@@ -271,7 +267,6 @@ export const SidebarFavoritesMenu = observer(() => {
271267
isLastChild={index === length - 1}
272268
handleRemoveFromFavorites={handleRemoveFromFavorites}
273269
handleRemoveFromFavoritesFolder={handleRemoveFromFavoritesFolder}
274-
handleReorder={handleReorder}
275270
handleDrop={handleDrop}
276271
/>
277272
) : (

web/core/components/workspace/sidebar/favorites/favorites.helpers.ts

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,47 +9,6 @@ export type TargetData = {
99
isChild: boolean;
1010
}
1111

12-
export const getDestinationStateSequence = (
13-
favoriteMap: Record<string, IFavorite>,
14-
destinationId: string,
15-
edge: string | undefined
16-
) => {
17-
const defaultSequence = 65535;
18-
if (!edge) return defaultSequence;
19-
20-
21-
const favoriteIds = orderBy(Object.values(favoriteMap), "sequence", "desc")
22-
.filter((fav: IFavorite) => !fav.parent)
23-
.map((fav: IFavorite) => fav.id);
24-
const destinationStateIndex = favoriteIds.findIndex((id) => id === destinationId);
25-
const destinationStateSequence = favoriteMap[destinationId]?.sequence || undefined;
26-
27-
if (!destinationStateSequence) return defaultSequence;
28-
29-
30-
let resultSequence = defaultSequence;
31-
if (edge === "reorder-above") {
32-
const prevStateSequence = favoriteMap[favoriteIds[destinationStateIndex - 1]]?.sequence || undefined;
33-
34-
if (prevStateSequence === undefined) {
35-
resultSequence = destinationStateSequence + defaultSequence;
36-
}else {
37-
resultSequence = (destinationStateSequence + prevStateSequence) / 2
38-
}
39-
} else if (edge === "reorder-below") {
40-
const nextStateSequence = favoriteMap[favoriteIds[destinationStateIndex + 1]]?.sequence || undefined;
41-
42-
if (nextStateSequence === undefined) {
43-
resultSequence = destinationStateSequence - defaultSequence;
44-
} else {
45-
resultSequence = (destinationStateSequence + nextStateSequence) / 2;
46-
}
47-
}
48-
resultSequence = Math.round(resultSequence)
49-
50-
return resultSequence;
51-
};
52-
5312
/**
5413
* extracts the Payload and translates the instruction for the current dropTarget based on drag and drop payload
5514
* @param dropTarget dropTarget for which the instruction is required

web/core/store/favorite.store.ts

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { uniqBy } from "lodash";
1+
import { orderBy, result, uniqBy } from "lodash";
22
import set from "lodash/set";
33
import { action, observable, makeObservable, runInAction, computed } from "mobx";
44
import { v4 as uuidv4 } from "uuid";
@@ -28,7 +28,12 @@ export interface IFavoriteStore {
2828
getGroupedFavorites: (workspaceSlug: string, favoriteId: string) => Promise<IFavorite[]>;
2929
moveFavoriteToFolder: (workspaceSlug: string, favoriteId: string, data: Partial<IFavorite>) => Promise<void>;
3030
removeFavoriteEntity: (workspaceSlug: string, entityId: string) => Promise<void>;
31-
reOrderFavorite: (workspaceSlug: string, favoriteId: string, data: Partial<IFavorite>) => Promise<void>;
31+
reOrderFavorite: (
32+
workspaceSlug: string,
33+
favoriteId: string,
34+
destinationId: string,
35+
edge: string | undefined
36+
) => Promise<void>;
3237
removeFromFavoriteFolder: (workspaceSlug: string, favoriteId: string) => Promise<void>;
3338
removeFavoriteFromStore: (entity_identifier: string) => void;
3439
}
@@ -190,14 +195,37 @@ export class FavoriteStore implements IFavoriteStore {
190195
}
191196
};
192197

193-
reOrderFavorite = async (workspaceSlug: string, favoriteId: string, data: Partial<IFavorite>) => {
198+
reOrderFavorite = async (
199+
workspaceSlug: string,
200+
favoriteId: string,
201+
destinationId: string,
202+
edge: string | undefined
203+
) => {
194204
const initialSequence = this.favoriteMap[favoriteId].sequence;
195205
try {
206+
let resultSequence = 10000;
207+
if (edge) {
208+
const sortedIds = orderBy(Object.values(this.favoriteMap), "sequence", "desc").map((fav: IFavorite) => fav.id);
209+
const destinationSequence = this.favoriteMap[destinationId]?.sequence || undefined;
210+
if (destinationSequence) {
211+
const destinationIndex = sortedIds.findIndex((id) => id === destinationId);
212+
if (edge === "reorder-above") {
213+
const prevSequence = this.favoriteMap[sortedIds[destinationIndex - 1]]?.sequence || undefined;
214+
if (prevSequence) {
215+
resultSequence = (destinationSequence + prevSequence) / 2;
216+
} else {
217+
resultSequence = destinationSequence + resultSequence;
218+
}
219+
} else {
220+
resultSequence = destinationSequence - resultSequence;
221+
}
222+
}
223+
}
196224
runInAction(() => {
197-
set(this.favoriteMap, [favoriteId, "sequence"], data.sequence);
225+
set(this.favoriteMap, [favoriteId, "sequence"], resultSequence);
198226
});
199227

200-
await this.favoriteService.updateFavorite(workspaceSlug, favoriteId, data);
228+
await this.favoriteService.updateFavorite(workspaceSlug, favoriteId, { sequence: resultSequence });
201229
} catch (error) {
202230
console.error("Failed to move favorite folder");
203231
runInAction(() => {
@@ -214,8 +242,7 @@ export class FavoriteStore implements IFavoriteStore {
214242
//remove parent
215243
set(this.favoriteMap, [favoriteId, "parent"], null);
216244
});
217-
await this.favoriteService.updateFavorite(workspaceSlug, favoriteId, { parent: null});
218-
245+
await this.favoriteService.updateFavorite(workspaceSlug, favoriteId, { parent: null });
219246
} catch (error) {
220247
console.error("Failed to move favorite");
221248
runInAction(() => {

0 commit comments

Comments
 (0)