@noya-app/noya-file-explorer 0.0.16 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +13 -13
- package/CHANGELOG.md +13 -0
- package/dist/index.css +853 -894
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +624 -33
- package/dist/index.d.ts +624 -33
- package/dist/index.js +1346 -265
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1384 -262
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -7
- package/src/MediaCollection.tsx +74 -53
- package/src/ResourceExplorer.tsx +1141 -0
- package/src/__tests__/deleteMediaItems.test.ts +7 -7
- package/src/__tests__/getDepthMap.test.ts +7 -7
- package/src/__tests__/getParentDirectories.test.ts +6 -6
- package/src/__tests__/getVisibleItems.test.ts +9 -9
- package/src/__tests__/moveMediaInsideFolder.test.ts +11 -11
- package/src/__tests__/movePathsIntoTarget.test.ts +9 -9
- package/src/__tests__/moveUpAFolder.test.ts +7 -7
- package/src/__tests__/renameMediaItemAndDescendantPaths.test.ts +6 -6
- package/src/__tests__/updateExpandedMap.test.ts +8 -8
- package/src/__tests__/validateMediaItemRename.test.ts +11 -11
- package/src/index.ts +2 -0
- package/src/utils/files.ts +25 -37
- package/src/utils/handleFileDrop.ts +38 -15
- package/src/utils/resourceUtils.ts +329 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MediaMap } from "@noya-app/noya-schemas";
|
|
2
2
|
import { expect, it } from "bun:test";
|
|
3
|
-
import {
|
|
3
|
+
import { mediaDeleteMediaItems } from "../utils/files";
|
|
4
4
|
import {
|
|
5
5
|
createMediaAsset,
|
|
6
6
|
createMediaFolder,
|
|
@@ -12,7 +12,7 @@ it("should delete a folder with no children", () => {
|
|
|
12
12
|
|
|
13
13
|
const tree = createMediaItemTree(media);
|
|
14
14
|
|
|
15
|
-
const result =
|
|
15
|
+
const result = mediaDeleteMediaItems({
|
|
16
16
|
selectedIds: [dir1.id],
|
|
17
17
|
media,
|
|
18
18
|
tree,
|
|
@@ -34,7 +34,7 @@ it("should delete a folder and its immediate children", () => {
|
|
|
34
34
|
};
|
|
35
35
|
const tree = createMediaItemTree(media);
|
|
36
36
|
|
|
37
|
-
const result =
|
|
37
|
+
const result = mediaDeleteMediaItems({
|
|
38
38
|
selectedIds: [dir1.id],
|
|
39
39
|
media,
|
|
40
40
|
tree,
|
|
@@ -57,7 +57,7 @@ it("should delete a folder and all nested descendants", () => {
|
|
|
57
57
|
dir4,
|
|
58
58
|
};
|
|
59
59
|
const tree = createMediaItemTree(media);
|
|
60
|
-
const result =
|
|
60
|
+
const result = mediaDeleteMediaItems({
|
|
61
61
|
selectedIds: [dir1.id],
|
|
62
62
|
media,
|
|
63
63
|
tree,
|
|
@@ -80,7 +80,7 @@ it("should handle deleting folder with mixed content types", () => {
|
|
|
80
80
|
asset3,
|
|
81
81
|
};
|
|
82
82
|
const tree = createMediaItemTree(media);
|
|
83
|
-
const result =
|
|
83
|
+
const result = mediaDeleteMediaItems({
|
|
84
84
|
selectedIds: [dir1.id],
|
|
85
85
|
media,
|
|
86
86
|
tree,
|
|
@@ -94,7 +94,7 @@ it("should handle attempting to delete non-existent folder", () => {
|
|
|
94
94
|
const asset1 = createMediaAsset({ assetId: "asset1" });
|
|
95
95
|
const media: MediaMap = { dir1, asset1 };
|
|
96
96
|
const tree = createMediaItemTree(media);
|
|
97
|
-
const result =
|
|
97
|
+
const result = mediaDeleteMediaItems({
|
|
98
98
|
selectedIds: ["non-existent"],
|
|
99
99
|
media,
|
|
100
100
|
tree,
|
|
@@ -115,7 +115,7 @@ it("should preserve sibling directories and their contents", () => {
|
|
|
115
115
|
"dir2/asset2": asset2,
|
|
116
116
|
};
|
|
117
117
|
const tree = createMediaItemTree(media);
|
|
118
|
-
const result =
|
|
118
|
+
const result = mediaDeleteMediaItems({
|
|
119
119
|
selectedIds: [dir1.id],
|
|
120
120
|
media,
|
|
121
121
|
tree,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { expect, it } from "bun:test";
|
|
2
|
-
import {
|
|
2
|
+
import { mediaGetDepthMap } from "../utils/files";
|
|
3
3
|
import {
|
|
4
4
|
createMediaAsset,
|
|
5
5
|
createMediaFolder,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
|
|
10
10
|
it("should return empty map for empty tree", () => {
|
|
11
11
|
const tree = createMediaItemTree({});
|
|
12
|
-
const result =
|
|
12
|
+
const result = mediaGetDepthMap(rootMediaItem, tree, true);
|
|
13
13
|
expect(result).toEqual({ [rootMediaItem.id]: 0 });
|
|
14
14
|
});
|
|
15
15
|
|
|
@@ -17,7 +17,7 @@ it("should set depth 0 for root level items", () => {
|
|
|
17
17
|
const asset1 = createMediaAsset({ assetId: "1" });
|
|
18
18
|
const asset2 = createMediaAsset({ assetId: "2" });
|
|
19
19
|
const tree = createMediaItemTree({ asset1, asset2 });
|
|
20
|
-
const result =
|
|
20
|
+
const result = mediaGetDepthMap(rootMediaItem, tree, true);
|
|
21
21
|
expect(result[asset1.id]).toBe(0);
|
|
22
22
|
expect(result[asset2.id]).toBe(0);
|
|
23
23
|
});
|
|
@@ -33,7 +33,7 @@ it("should calculate correct depths for nested items", () => {
|
|
|
33
33
|
"parent/child": child,
|
|
34
34
|
"parent/child/grandChild": grandChild,
|
|
35
35
|
});
|
|
36
|
-
const result =
|
|
36
|
+
const result = mediaGetDepthMap(rootMediaItem, tree, true);
|
|
37
37
|
expect(result[parent.id]).toBe(0);
|
|
38
38
|
expect(result[child.id]).toBe(1);
|
|
39
39
|
expect(result[grandChild.id]).toBe(2);
|
|
@@ -52,7 +52,7 @@ it("should handle multiple branches with different depths", () => {
|
|
|
52
52
|
"parent2/child2": child2,
|
|
53
53
|
"parent1/child1/grandChild": grandChild,
|
|
54
54
|
});
|
|
55
|
-
const result =
|
|
55
|
+
const result = mediaGetDepthMap(rootMediaItem, tree, true);
|
|
56
56
|
expect(result[parent1.id]).toBe(0);
|
|
57
57
|
expect(result[parent2.id]).toBe(0);
|
|
58
58
|
expect(result[child1.id]).toBe(1);
|
|
@@ -67,7 +67,7 @@ it("should handle orphaned items", () => {
|
|
|
67
67
|
"non-existent": asset1,
|
|
68
68
|
asset2,
|
|
69
69
|
});
|
|
70
|
-
const result =
|
|
70
|
+
const result = mediaGetDepthMap(rootMediaItem, tree, true);
|
|
71
71
|
expect(result[rootMediaItem.id]).toBe(0);
|
|
72
72
|
expect(result[asset2.id]).toBe(0);
|
|
73
73
|
expect(result[asset1.id]).toBe(0);
|
|
@@ -77,7 +77,7 @@ it("should set all depths to 0 when showAllDescendants is false", () => {
|
|
|
77
77
|
const dir = createMediaFolder();
|
|
78
78
|
const asset = createMediaAsset({ assetId: "1" });
|
|
79
79
|
const tree = createMediaItemTree({ dir, "dir/asset": asset });
|
|
80
|
-
const result =
|
|
80
|
+
const result = mediaGetDepthMap(rootMediaItem, tree, false);
|
|
81
81
|
expect(result[rootMediaItem.id]).toBe(0);
|
|
82
82
|
expect(result[dir.id]).toBe(0);
|
|
83
83
|
expect(result[asset.id]).toBe(0);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MediaMap } from "@noya-app/noya-schemas";
|
|
2
2
|
import { expect, it } from "bun:test";
|
|
3
|
-
import {
|
|
3
|
+
import { mediaGetParentDirectories } from "../utils/files";
|
|
4
4
|
import {
|
|
5
5
|
createMediaAsset,
|
|
6
6
|
createMediaFolder,
|
|
@@ -13,7 +13,7 @@ it("should return root for non-existent directory", () => {
|
|
|
13
13
|
dir1: dir1,
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
const result =
|
|
16
|
+
const result = mediaGetParentDirectories(mediaMap, "non-existent");
|
|
17
17
|
expect(result).toEqual([rootMediaItem]);
|
|
18
18
|
});
|
|
19
19
|
|
|
@@ -23,7 +23,7 @@ it("should return root and directory item for root-level directory", () => {
|
|
|
23
23
|
dir1,
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
const result =
|
|
26
|
+
const result = mediaGetParentDirectories(mediaMap, dir1.id);
|
|
27
27
|
expect(result).toEqual([rootMediaItem, dir1]);
|
|
28
28
|
});
|
|
29
29
|
|
|
@@ -37,7 +37,7 @@ it("should return path for nested directory", () => {
|
|
|
37
37
|
"dir1/dir2/dir3": dir3,
|
|
38
38
|
};
|
|
39
39
|
|
|
40
|
-
const result =
|
|
40
|
+
const result = mediaGetParentDirectories(mediaMap, dir3.id);
|
|
41
41
|
expect(result).toEqual([rootMediaItem, dir1, dir2, dir3]);
|
|
42
42
|
});
|
|
43
43
|
|
|
@@ -47,7 +47,7 @@ it("should handle missing parent by returning root", () => {
|
|
|
47
47
|
"dir3/asset1": asset1,
|
|
48
48
|
};
|
|
49
49
|
|
|
50
|
-
const result =
|
|
50
|
+
const result = mediaGetParentDirectories(mediaMap, asset1.id);
|
|
51
51
|
expect(result).toEqual([rootMediaItem]);
|
|
52
52
|
});
|
|
53
53
|
|
|
@@ -63,6 +63,6 @@ it("should work with mixed file types in media array", () => {
|
|
|
63
63
|
"dir1/dir2/file2": file2,
|
|
64
64
|
};
|
|
65
65
|
|
|
66
|
-
const result =
|
|
66
|
+
const result = mediaGetParentDirectories(mediaMap, dir2.id);
|
|
67
67
|
expect(result).toEqual([rootMediaItem, dir1, dir2]);
|
|
68
68
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MediaMap } from "@noya-app/noya-schemas";
|
|
2
2
|
import { expect, it } from "bun:test";
|
|
3
|
-
import {
|
|
3
|
+
import { mediaGetVisibleItems } from "../utils/files";
|
|
4
4
|
import {
|
|
5
5
|
createMediaAsset,
|
|
6
6
|
createMediaFolder,
|
|
@@ -13,7 +13,7 @@ it("should return all items if no filter is applied", () => {
|
|
|
13
13
|
const item2 = createMediaAsset({ assetId: "2" });
|
|
14
14
|
const media: MediaMap = { item1, item2 };
|
|
15
15
|
const tree = createMediaItemTree(media);
|
|
16
|
-
const result =
|
|
16
|
+
const result = mediaGetVisibleItems({
|
|
17
17
|
expandedMap: {},
|
|
18
18
|
fileKindFilter: "assets",
|
|
19
19
|
rootItemId: rootMediaItem.id,
|
|
@@ -30,7 +30,7 @@ it("should filter by file type - files only", () => {
|
|
|
30
30
|
const asset2 = createMediaAsset({ assetId: "2" });
|
|
31
31
|
const media: MediaMap = { asset1, folder, asset2 };
|
|
32
32
|
const tree = createMediaItemTree(media);
|
|
33
|
-
const result =
|
|
33
|
+
const result = mediaGetVisibleItems({
|
|
34
34
|
tree,
|
|
35
35
|
expandedMap: {},
|
|
36
36
|
fileKindFilter: "assets",
|
|
@@ -47,7 +47,7 @@ it("should filter by file type - directories only", () => {
|
|
|
47
47
|
const asset2 = createMediaAsset({ assetId: "2" });
|
|
48
48
|
const media: MediaMap = { asset1, folder, asset2 };
|
|
49
49
|
const tree = createMediaItemTree(media);
|
|
50
|
-
const result =
|
|
50
|
+
const result = mediaGetVisibleItems({
|
|
51
51
|
tree,
|
|
52
52
|
expandedMap: {},
|
|
53
53
|
fileKindFilter: "directories",
|
|
@@ -68,7 +68,7 @@ it("should filter by parent ID", () => {
|
|
|
68
68
|
});
|
|
69
69
|
const media: MediaMap = { parent, asset1, "parent/asset2": asset2 };
|
|
70
70
|
const tree = createMediaItemTree(media);
|
|
71
|
-
const result =
|
|
71
|
+
const result = mediaGetVisibleItems({
|
|
72
72
|
tree,
|
|
73
73
|
expandedMap: {},
|
|
74
74
|
fileKindFilter: "all",
|
|
@@ -87,7 +87,7 @@ it("should show root level items when filtering by root ID", () => {
|
|
|
87
87
|
const asset3 = createMediaAsset({ assetId: "3" });
|
|
88
88
|
const media: MediaMap = { asset1, "does not exist/asset2": asset2, asset3 };
|
|
89
89
|
const tree = createMediaItemTree(media);
|
|
90
|
-
const result =
|
|
90
|
+
const result = mediaGetVisibleItems({
|
|
91
91
|
tree,
|
|
92
92
|
expandedMap: {},
|
|
93
93
|
fileKindFilter: "all",
|
|
@@ -114,7 +114,7 @@ it("should show items based on expanded state", () => {
|
|
|
114
114
|
"dir2/asset2": asset2,
|
|
115
115
|
};
|
|
116
116
|
const tree = createMediaItemTree(media);
|
|
117
|
-
const result =
|
|
117
|
+
const result = mediaGetVisibleItems({
|
|
118
118
|
tree,
|
|
119
119
|
expandedMap: { [dir1.id]: true, [dir2.id]: false },
|
|
120
120
|
fileKindFilter: "all",
|
|
@@ -139,7 +139,7 @@ it("should combine file type and parent ID filters", () => {
|
|
|
139
139
|
"parent1/parent2": parent2,
|
|
140
140
|
};
|
|
141
141
|
const tree = createMediaItemTree(media);
|
|
142
|
-
const result =
|
|
142
|
+
const result = mediaGetVisibleItems({
|
|
143
143
|
tree,
|
|
144
144
|
expandedMap: {},
|
|
145
145
|
fileKindFilter: "assets",
|
|
@@ -169,7 +169,7 @@ it("should hide items in parent directories that are not expanded", () => {
|
|
|
169
169
|
"parent1/parent2/asset3": asset3,
|
|
170
170
|
};
|
|
171
171
|
const tree = createMediaItemTree(media);
|
|
172
|
-
const result =
|
|
172
|
+
const result = mediaGetVisibleItems({
|
|
173
173
|
tree,
|
|
174
174
|
expandedMap: {
|
|
175
175
|
[parent1.id]: true,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MediaMap } from "@noya-app/noya-schemas";
|
|
2
2
|
import { expect, it } from "bun:test";
|
|
3
|
-
import {
|
|
3
|
+
import { mediaMoveMediaInsideFolder } from "../utils/files";
|
|
4
4
|
import {
|
|
5
5
|
createMediaAsset,
|
|
6
6
|
createMediaFolder,
|
|
@@ -24,7 +24,7 @@ it("should move an item into a target folder", () => {
|
|
|
24
24
|
const tree = createMediaItemTree(media);
|
|
25
25
|
|
|
26
26
|
// Move Asset 1 into Folder 1
|
|
27
|
-
const result =
|
|
27
|
+
const result = mediaMoveMediaInsideFolder({
|
|
28
28
|
sourceItemIds: [asset1.id],
|
|
29
29
|
targetItemId: folder1.id,
|
|
30
30
|
media,
|
|
@@ -56,7 +56,7 @@ it("should move an item to the root level", () => {
|
|
|
56
56
|
const tree = createMediaItemTree(media);
|
|
57
57
|
|
|
58
58
|
// Move Asset 1 to root
|
|
59
|
-
const result =
|
|
59
|
+
const result = mediaMoveMediaInsideFolder({
|
|
60
60
|
sourceItemIds: [asset1.id],
|
|
61
61
|
targetItemId: rootMediaItem.id,
|
|
62
62
|
media,
|
|
@@ -83,7 +83,7 @@ it("should move a folder into another folder", () => {
|
|
|
83
83
|
};
|
|
84
84
|
const tree = createMediaItemTree(media);
|
|
85
85
|
// Move Folder 2 into Folder 1
|
|
86
|
-
const result =
|
|
86
|
+
const result = mediaMoveMediaInsideFolder({
|
|
87
87
|
sourceItemIds: [folder2.id],
|
|
88
88
|
targetItemId: folder1.id,
|
|
89
89
|
media,
|
|
@@ -120,7 +120,7 @@ it("should not modify other items in the array", () => {
|
|
|
120
120
|
const tree = createMediaItemTree(media);
|
|
121
121
|
|
|
122
122
|
// Move Asset 1 into Folder 1
|
|
123
|
-
const result =
|
|
123
|
+
const result = mediaMoveMediaInsideFolder({
|
|
124
124
|
sourceItemIds: [asset1.id],
|
|
125
125
|
targetItemId: folder1.id,
|
|
126
126
|
media,
|
|
@@ -143,7 +143,7 @@ it("should handle moving an item that doesn't exist", () => {
|
|
|
143
143
|
};
|
|
144
144
|
const tree = createMediaItemTree(media);
|
|
145
145
|
// Try to move a non-existent item
|
|
146
|
-
const result =
|
|
146
|
+
const result = mediaMoveMediaInsideFolder({
|
|
147
147
|
sourceItemIds: ["nonexistent"],
|
|
148
148
|
targetItemId: folder1.id,
|
|
149
149
|
media,
|
|
@@ -164,7 +164,7 @@ it("should handle moving to a target that doesn't exist", () => {
|
|
|
164
164
|
const tree = createMediaItemTree(media);
|
|
165
165
|
|
|
166
166
|
// Try to move to a non-existent folder
|
|
167
|
-
const result =
|
|
167
|
+
const result = mediaMoveMediaInsideFolder({
|
|
168
168
|
sourceItemIds: [asset1.id],
|
|
169
169
|
targetItemId: "nonexistent",
|
|
170
170
|
media,
|
|
@@ -198,7 +198,7 @@ it("should move a folder and all its descendants into another folder", () => {
|
|
|
198
198
|
const tree = createMediaItemTree(media);
|
|
199
199
|
|
|
200
200
|
// Move Folder 2 (and its descendants) into Folder 1
|
|
201
|
-
const result =
|
|
201
|
+
const result = mediaMoveMediaInsideFolder({
|
|
202
202
|
sourceItemIds: [folder2.id],
|
|
203
203
|
targetItemId: folder1.id,
|
|
204
204
|
media,
|
|
@@ -238,7 +238,7 @@ it("should move a folder and all its descendants to the root", () => {
|
|
|
238
238
|
const tree = createMediaItemTree(media);
|
|
239
239
|
|
|
240
240
|
// Move Folder 2 (and its descendants) to the root
|
|
241
|
-
const result =
|
|
241
|
+
const result = mediaMoveMediaInsideFolder({
|
|
242
242
|
sourceItemIds: [folder2.id],
|
|
243
243
|
targetItemId: rootMediaItem.id,
|
|
244
244
|
media,
|
|
@@ -284,7 +284,7 @@ it("should preserve the structure when moving a folder with multiple levels of n
|
|
|
284
284
|
const tree = createMediaItemTree(media);
|
|
285
285
|
|
|
286
286
|
// Move the source folder to the target folder
|
|
287
|
-
const result =
|
|
287
|
+
const result = mediaMoveMediaInsideFolder({
|
|
288
288
|
sourceItemIds: [sourceFolder.id],
|
|
289
289
|
targetItemId: targetFolder.id,
|
|
290
290
|
media,
|
|
@@ -335,7 +335,7 @@ it("should handle moving both a sibling item and a folder to another folder", ()
|
|
|
335
335
|
};
|
|
336
336
|
const tree = createMediaItemTree(media);
|
|
337
337
|
// move folder 3 and asset 1 to folder 1
|
|
338
|
-
const result =
|
|
338
|
+
const result = mediaMoveMediaInsideFolder({
|
|
339
339
|
sourceItemIds: [folder3.id, asset1.id],
|
|
340
340
|
targetItemId: folder1.id,
|
|
341
341
|
media,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MediaMap } from "@noya-app/noya-schemas";
|
|
2
2
|
import { expect, it } from "bun:test";
|
|
3
|
-
import {
|
|
3
|
+
import { mediaMovePathsIntoTarget } from "../utils/files";
|
|
4
4
|
import {
|
|
5
5
|
createMediaAsset,
|
|
6
6
|
createMediaFolder,
|
|
@@ -18,7 +18,7 @@ it("should move a single file to a target directory", () => {
|
|
|
18
18
|
const tree = createMediaItemTree(media);
|
|
19
19
|
|
|
20
20
|
// Execute
|
|
21
|
-
const result =
|
|
21
|
+
const result = mediaMovePathsIntoTarget({
|
|
22
22
|
media: media,
|
|
23
23
|
sourceItemPaths: ["file1.jpg"],
|
|
24
24
|
targetItemPath: "target",
|
|
@@ -47,7 +47,7 @@ it("should move a folder and its contents to a target directory", () => {
|
|
|
47
47
|
const tree = createMediaItemTree(media);
|
|
48
48
|
|
|
49
49
|
// Execute
|
|
50
|
-
const result =
|
|
50
|
+
const result = mediaMovePathsIntoTarget({
|
|
51
51
|
media: media,
|
|
52
52
|
sourceItemPaths: ["source"],
|
|
53
53
|
targetItemPath: "target",
|
|
@@ -78,7 +78,7 @@ it("should move multiple items to a target directory", () => {
|
|
|
78
78
|
const tree = createMediaItemTree(media);
|
|
79
79
|
|
|
80
80
|
// Execute
|
|
81
|
-
const result =
|
|
81
|
+
const result = mediaMovePathsIntoTarget({
|
|
82
82
|
media: media,
|
|
83
83
|
sourceItemPaths: ["file1.jpg", "file2.jpg"],
|
|
84
84
|
targetItemPath: "target",
|
|
@@ -111,7 +111,7 @@ it("should handle nested folder structures correctly", () => {
|
|
|
111
111
|
const tree = createMediaItemTree(media);
|
|
112
112
|
|
|
113
113
|
// Execute
|
|
114
|
-
const result =
|
|
114
|
+
const result = mediaMovePathsIntoTarget({
|
|
115
115
|
media: media,
|
|
116
116
|
sourceItemPaths: ["folder1"],
|
|
117
117
|
targetItemPath: "target",
|
|
@@ -142,7 +142,7 @@ it("should handle moving items to the root directory", () => {
|
|
|
142
142
|
const tree = createMediaItemTree(media);
|
|
143
143
|
|
|
144
144
|
// Execute
|
|
145
|
-
const result =
|
|
145
|
+
const result = mediaMovePathsIntoTarget({
|
|
146
146
|
media: media,
|
|
147
147
|
sourceItemPaths: ["folder/file1.jpg"],
|
|
148
148
|
targetItemPath: ".",
|
|
@@ -171,7 +171,7 @@ it("should handle moving items with the same basename", () => {
|
|
|
171
171
|
const tree = createMediaItemTree(media);
|
|
172
172
|
|
|
173
173
|
// Execute
|
|
174
|
-
const result =
|
|
174
|
+
const result = mediaMovePathsIntoTarget({
|
|
175
175
|
media: media,
|
|
176
176
|
sourceItemPaths: ["folder1/file.jpg", "folder2/file.jpg"],
|
|
177
177
|
targetItemPath: ".",
|
|
@@ -196,7 +196,7 @@ it("should handle empty source paths array", () => {
|
|
|
196
196
|
const tree = createMediaItemTree(media);
|
|
197
197
|
|
|
198
198
|
// Execute
|
|
199
|
-
const result =
|
|
199
|
+
const result = mediaMovePathsIntoTarget({
|
|
200
200
|
media: media,
|
|
201
201
|
sourceItemPaths: [],
|
|
202
202
|
targetItemPath: "target",
|
|
@@ -217,7 +217,7 @@ it("should handle non-existent source paths", () => {
|
|
|
217
217
|
const tree = createMediaItemTree(media);
|
|
218
218
|
|
|
219
219
|
// Execute
|
|
220
|
-
const result =
|
|
220
|
+
const result = mediaMovePathsIntoTarget({
|
|
221
221
|
media: media,
|
|
222
222
|
sourceItemPaths: ["non-existent.jpg"],
|
|
223
223
|
targetItemPath: "target",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MediaMap } from "@noya-app/noya-schemas";
|
|
2
2
|
import { expect, it } from "bun:test";
|
|
3
|
-
import {
|
|
3
|
+
import { mediaMoveUpAFolder } from "../utils/files";
|
|
4
4
|
import {
|
|
5
5
|
createMediaAsset,
|
|
6
6
|
createMediaFolder,
|
|
@@ -26,7 +26,7 @@ it("should move an item up one level in the folder hierarchy", () => {
|
|
|
26
26
|
const tree = createMediaItemTree(media);
|
|
27
27
|
|
|
28
28
|
// Move Asset 1 up from Folder 2 to Folder 1
|
|
29
|
-
const result =
|
|
29
|
+
const result = mediaMoveUpAFolder({
|
|
30
30
|
tree,
|
|
31
31
|
media: media,
|
|
32
32
|
selectedIds: [asset1.id],
|
|
@@ -65,7 +65,7 @@ it("should move multiple items up one level at once", () => {
|
|
|
65
65
|
const tree = createMediaItemTree(media);
|
|
66
66
|
|
|
67
67
|
// Move both assets up from Folder 2 to Folder 1
|
|
68
|
-
const result =
|
|
68
|
+
const result = mediaMoveUpAFolder({
|
|
69
69
|
tree,
|
|
70
70
|
media: media,
|
|
71
71
|
selectedIds: [asset1.id, asset2.id],
|
|
@@ -86,7 +86,7 @@ it("should return undefined if the selected item is not found", () => {
|
|
|
86
86
|
};
|
|
87
87
|
const tree = createMediaItemTree(media);
|
|
88
88
|
|
|
89
|
-
const result =
|
|
89
|
+
const result = mediaMoveUpAFolder({
|
|
90
90
|
tree,
|
|
91
91
|
media: media,
|
|
92
92
|
selectedIds: ["nonexistent"],
|
|
@@ -109,7 +109,7 @@ it("should not move items at root level", () => {
|
|
|
109
109
|
const tree = createMediaItemTree(media);
|
|
110
110
|
|
|
111
111
|
// Try to move Asset 1 up, but it's already at the root
|
|
112
|
-
const result =
|
|
112
|
+
const result = mediaMoveUpAFolder({
|
|
113
113
|
tree,
|
|
114
114
|
media: media,
|
|
115
115
|
selectedIds: [asset1.id],
|
|
@@ -137,7 +137,7 @@ it("should move items from a subfolder to root if parent is at root level", () =
|
|
|
137
137
|
const tree = createMediaItemTree(media);
|
|
138
138
|
|
|
139
139
|
// Move Asset 1 up from Folder 1 to Root
|
|
140
|
-
const result =
|
|
140
|
+
const result = mediaMoveUpAFolder({
|
|
141
141
|
tree,
|
|
142
142
|
media: media,
|
|
143
143
|
selectedIds: [asset1.id],
|
|
@@ -165,7 +165,7 @@ it("should move a folders descendants up a folder", () => {
|
|
|
165
165
|
};
|
|
166
166
|
const tree = createMediaItemTree(media);
|
|
167
167
|
|
|
168
|
-
const result =
|
|
168
|
+
const result = mediaMoveUpAFolder({
|
|
169
169
|
tree,
|
|
170
170
|
media: media,
|
|
171
171
|
selectedIds: [folder2.id],
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MediaMap } from "@noya-app/noya-schemas";
|
|
2
2
|
import { expect, it } from "bun:test";
|
|
3
|
-
import {
|
|
3
|
+
import { mediaRenameMediaItemAndDescendantPaths } from "../utils/files";
|
|
4
4
|
import {
|
|
5
5
|
createMediaAsset,
|
|
6
6
|
createMediaFolder,
|
|
@@ -13,7 +13,7 @@ it("should rename a folder with no children", () => {
|
|
|
13
13
|
|
|
14
14
|
const tree = createMediaItemTree(media);
|
|
15
15
|
|
|
16
|
-
const result =
|
|
16
|
+
const result = mediaRenameMediaItemAndDescendantPaths({
|
|
17
17
|
newName: "renamed-dir",
|
|
18
18
|
selectedItemPath: "dir1",
|
|
19
19
|
media,
|
|
@@ -35,7 +35,7 @@ it("should rename a folder and update paths of its immediate children", () => {
|
|
|
35
35
|
};
|
|
36
36
|
const tree = createMediaItemTree(media);
|
|
37
37
|
|
|
38
|
-
const result =
|
|
38
|
+
const result = mediaRenameMediaItemAndDescendantPaths({
|
|
39
39
|
newName: "renamed-dir",
|
|
40
40
|
selectedItemPath: "dir1",
|
|
41
41
|
media,
|
|
@@ -65,7 +65,7 @@ it("should rename a folder and update paths of all nested descendants", () => {
|
|
|
65
65
|
};
|
|
66
66
|
const tree = createMediaItemTree(media);
|
|
67
67
|
|
|
68
|
-
const result =
|
|
68
|
+
const result = mediaRenameMediaItemAndDescendantPaths({
|
|
69
69
|
newName: "renamed-dir",
|
|
70
70
|
selectedItemPath: "dir1",
|
|
71
71
|
media,
|
|
@@ -95,7 +95,7 @@ it("should rename a file (asset) correctly", () => {
|
|
|
95
95
|
};
|
|
96
96
|
const tree = createMediaItemTree(media);
|
|
97
97
|
|
|
98
|
-
const result =
|
|
98
|
+
const result = mediaRenameMediaItemAndDescendantPaths({
|
|
99
99
|
newName: "renamed-asset.png",
|
|
100
100
|
selectedItemPath: "dir1/asset1",
|
|
101
101
|
media,
|
|
@@ -123,7 +123,7 @@ it("should preserve other unrelated paths when renaming", () => {
|
|
|
123
123
|
};
|
|
124
124
|
const tree = createMediaItemTree(media);
|
|
125
125
|
|
|
126
|
-
const result =
|
|
126
|
+
const result = mediaRenameMediaItemAndDescendantPaths({
|
|
127
127
|
newName: "renamed-dir",
|
|
128
128
|
selectedItemPath: "dir1",
|
|
129
129
|
media,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MediaMap } from "@noya-app/noya-schemas";
|
|
2
2
|
import { expect, it } from "bun:test";
|
|
3
|
-
import {
|
|
3
|
+
import { mediaUpdateExpandedMap } from "../utils/files";
|
|
4
4
|
import {
|
|
5
5
|
createMediaFolder,
|
|
6
6
|
createMediaItemTree,
|
|
@@ -13,7 +13,7 @@ it("should expand a folder", () => {
|
|
|
13
13
|
const tree = createMediaItemTree(media);
|
|
14
14
|
const expandedMap = {};
|
|
15
15
|
|
|
16
|
-
const result =
|
|
16
|
+
const result = mediaUpdateExpandedMap({
|
|
17
17
|
item: dir1,
|
|
18
18
|
expanded: true,
|
|
19
19
|
tree,
|
|
@@ -36,7 +36,7 @@ it("should collapse a folder and all its children", () => {
|
|
|
36
36
|
const tree = createMediaItemTree(media);
|
|
37
37
|
const expandedMap = { [dir1.id]: true, [dir2.id]: true, [dir3.id]: true };
|
|
38
38
|
|
|
39
|
-
const result =
|
|
39
|
+
const result = mediaUpdateExpandedMap({
|
|
40
40
|
item: dir1,
|
|
41
41
|
expanded: false,
|
|
42
42
|
tree,
|
|
@@ -57,7 +57,7 @@ it("should not modify map if expandable is false", () => {
|
|
|
57
57
|
const tree = createMediaItemTree(media);
|
|
58
58
|
const expandedMap = { someOtherId: true };
|
|
59
59
|
|
|
60
|
-
const result =
|
|
60
|
+
const result = mediaUpdateExpandedMap({
|
|
61
61
|
item,
|
|
62
62
|
expanded: true,
|
|
63
63
|
tree,
|
|
@@ -73,7 +73,7 @@ it("should not modify root item expansion state", () => {
|
|
|
73
73
|
const tree = createMediaItemTree(media);
|
|
74
74
|
const expandedMap = { someOtherId: true };
|
|
75
75
|
|
|
76
|
-
const result =
|
|
76
|
+
const result = mediaUpdateExpandedMap({
|
|
77
77
|
item: rootMediaItem,
|
|
78
78
|
expanded: true,
|
|
79
79
|
tree,
|
|
@@ -96,7 +96,7 @@ it("should handle deeply nested folder structure", () => {
|
|
|
96
96
|
const tree = createMediaItemTree(media);
|
|
97
97
|
const expandedMap = { [dir1.id]: true, [dir2.id]: true, [dir3.id]: true };
|
|
98
98
|
|
|
99
|
-
const result =
|
|
99
|
+
const result = mediaUpdateExpandedMap({
|
|
100
100
|
item: dir1,
|
|
101
101
|
expanded: false,
|
|
102
102
|
tree,
|
|
@@ -118,7 +118,7 @@ it("should preserve other expanded states when modifying one folder", () => {
|
|
|
118
118
|
const tree = createMediaItemTree(media);
|
|
119
119
|
const expandedMap = { [dir1.id]: false, [dir2.id]: true };
|
|
120
120
|
|
|
121
|
-
const result =
|
|
121
|
+
const result = mediaUpdateExpandedMap({
|
|
122
122
|
item: dir1,
|
|
123
123
|
expanded: true,
|
|
124
124
|
tree,
|
|
@@ -140,7 +140,7 @@ it("should handle collapsing with missing children in media array", () => {
|
|
|
140
140
|
missingChild2: true,
|
|
141
141
|
};
|
|
142
142
|
|
|
143
|
-
const result =
|
|
143
|
+
const result = mediaUpdateExpandedMap({
|
|
144
144
|
item: dir1,
|
|
145
145
|
expanded: false,
|
|
146
146
|
tree,
|