@noya-app/noya-file-explorer 0.0.2 → 0.0.3
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 +11 -11
- package/CHANGELOG.md +9 -0
- package/dist/index.css +22 -7
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +21 -1
- package/dist/index.d.ts +21 -1
- package/dist/index.js +55 -25
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +54 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/MediaCollection.tsx +33 -29
- package/src/__tests__/renameMediaItemAndDescendantPaths.test.ts +139 -0
- package/src/utils/files.ts +45 -0
- package/tsup.config.ts +1 -3
package/dist/index.mjs
CHANGED
|
@@ -1222,10 +1222,33 @@ var getParentDirectories = (mediaMap, folderId) => {
|
|
|
1222
1222
|
if (!indexPath) return [rootMediaItem];
|
|
1223
1223
|
return tree.accessPath(rootMediaItem, indexPath);
|
|
1224
1224
|
};
|
|
1225
|
+
var renameMediaItemAndDescendantPaths = ({
|
|
1226
|
+
newName,
|
|
1227
|
+
selectedItemPath,
|
|
1228
|
+
media,
|
|
1229
|
+
tree
|
|
1230
|
+
}) => {
|
|
1231
|
+
const mediaClone = { ...media };
|
|
1232
|
+
const selectedItem = mediaClone[selectedItemPath];
|
|
1233
|
+
if (!selectedItem) return mediaClone;
|
|
1234
|
+
const parentPath = path2.dirname(selectedItemPath);
|
|
1235
|
+
const newItemPath = path2.join(parentPath, newName);
|
|
1236
|
+
const descendants = tree.flat(selectedItem).map((item) => tree.idToPathMap.get(item.id));
|
|
1237
|
+
for (const descendantPath of descendants) {
|
|
1238
|
+
if (!descendantPath) continue;
|
|
1239
|
+
const newDescendantPath = descendantPath.replace(
|
|
1240
|
+
selectedItemPath,
|
|
1241
|
+
newItemPath
|
|
1242
|
+
);
|
|
1243
|
+
mediaClone[newDescendantPath] = mediaClone[descendantPath];
|
|
1244
|
+
delete mediaClone[descendantPath];
|
|
1245
|
+
}
|
|
1246
|
+
return mediaClone;
|
|
1247
|
+
};
|
|
1225
1248
|
|
|
1226
1249
|
// src/MediaCollection.tsx
|
|
1227
1250
|
var MediaThumbnailInternal = memoGeneric(
|
|
1228
|
-
({ item, selected }) => {
|
|
1251
|
+
({ item, selected, size }) => {
|
|
1229
1252
|
const asset = useAsset(item.kind === "asset" ? item.assetId : void 0);
|
|
1230
1253
|
const isRoot = item.id === rootMediaItem.id;
|
|
1231
1254
|
const isFolder = item.kind === "folder";
|
|
@@ -1235,7 +1258,8 @@ var MediaThumbnailInternal = memoGeneric(
|
|
|
1235
1258
|
contentType: asset?.contentType,
|
|
1236
1259
|
iconName: isRoot ? "HomeIcon" : isFolder ? "FolderIcon" : void 0,
|
|
1237
1260
|
url: asset?.url,
|
|
1238
|
-
selected
|
|
1261
|
+
selected,
|
|
1262
|
+
size
|
|
1239
1263
|
}
|
|
1240
1264
|
);
|
|
1241
1265
|
}
|
|
@@ -1269,13 +1293,24 @@ var MediaCollection = memo(
|
|
|
1269
1293
|
const [tempItem, setTempItem] = useState(
|
|
1270
1294
|
void 0
|
|
1271
1295
|
);
|
|
1272
|
-
const
|
|
1273
|
-
() =>
|
|
1296
|
+
const mediaWithTempItem = useMemo(
|
|
1297
|
+
() => ({
|
|
1274
1298
|
...media,
|
|
1275
1299
|
...tempItem ? { [tempItem[0]]: tempItem[1] } : {}
|
|
1276
1300
|
}),
|
|
1277
1301
|
[media, tempItem]
|
|
1278
1302
|
);
|
|
1303
|
+
const treeWithTempItem = useMemo(
|
|
1304
|
+
() => createMediaItemTree(mediaWithTempItem),
|
|
1305
|
+
[mediaWithTempItem]
|
|
1306
|
+
);
|
|
1307
|
+
const temp = useMemo(
|
|
1308
|
+
() => ({
|
|
1309
|
+
media: mediaWithTempItem,
|
|
1310
|
+
tree: treeWithTempItem
|
|
1311
|
+
}),
|
|
1312
|
+
[mediaWithTempItem, treeWithTempItem]
|
|
1313
|
+
);
|
|
1279
1314
|
const [selectedIds, setSelectedIds] = useControlledOrUncontrolled(
|
|
1280
1315
|
{
|
|
1281
1316
|
defaultValue: [],
|
|
@@ -1330,12 +1365,6 @@ var MediaCollection = memo(
|
|
|
1330
1365
|
if (!itemPath || !firstSelectedPath) return false;
|
|
1331
1366
|
return itemPath.startsWith(path3.dirname(firstSelectedPath));
|
|
1332
1367
|
});
|
|
1333
|
-
const gridSize = useMemo(() => {
|
|
1334
|
-
if (viewType === "grid") {
|
|
1335
|
-
return size;
|
|
1336
|
-
}
|
|
1337
|
-
return "medium";
|
|
1338
|
-
}, [viewType, size]);
|
|
1339
1368
|
useEffect(() => {
|
|
1340
1369
|
if (initialExpanded) {
|
|
1341
1370
|
setExpandedMap(initialExpanded);
|
|
@@ -1369,31 +1398,28 @@ var MediaCollection = memo(
|
|
|
1369
1398
|
selectedItem.id
|
|
1370
1399
|
);
|
|
1371
1400
|
if (!selectedItemPath) return;
|
|
1372
|
-
const mediaWithTempItem = {
|
|
1373
|
-
...media,
|
|
1374
|
-
...tempItem ? { [tempItem[0]]: tempItem[1] } : {}
|
|
1375
|
-
};
|
|
1376
1401
|
const renameIsValid = validateMediaItemRename({
|
|
1377
1402
|
basename: newName,
|
|
1378
1403
|
selectedItemPath,
|
|
1379
|
-
media:
|
|
1404
|
+
media: temp.media
|
|
1380
1405
|
});
|
|
1381
1406
|
if (!renameIsValid) {
|
|
1382
1407
|
setTempItem(void 0);
|
|
1383
1408
|
return;
|
|
1384
1409
|
}
|
|
1385
|
-
const
|
|
1386
|
-
|
|
1410
|
+
const mediaWithRenamedDescendantPaths = renameMediaItemAndDescendantPaths({
|
|
1411
|
+
newName,
|
|
1412
|
+
selectedItemPath,
|
|
1413
|
+
media: temp.media,
|
|
1414
|
+
tree: temp.tree
|
|
1415
|
+
});
|
|
1387
1416
|
setMedia(
|
|
1388
1417
|
{ name: "Rename media item", timestamp: Date.now() },
|
|
1389
|
-
|
|
1390
|
-
...mediaClone,
|
|
1391
|
-
[path3.join(path3.dirname(selectedItemPath), newName)]: selectedItem
|
|
1392
|
-
}
|
|
1418
|
+
mediaWithRenamedDescendantPaths
|
|
1393
1419
|
);
|
|
1394
1420
|
setTempItem(void 0);
|
|
1395
1421
|
},
|
|
1396
|
-
[
|
|
1422
|
+
[renamable, setMedia, temp.media, temp.tree, treeWithTempItem.idToPathMap]
|
|
1397
1423
|
);
|
|
1398
1424
|
const handleAddFolder = useCallback(
|
|
1399
1425
|
(currentFolderId) => {
|
|
@@ -1673,6 +1699,7 @@ var MediaCollection = memo(
|
|
|
1673
1699
|
onSelect: (action) => handleMenuAction(action, selectedMediaItems),
|
|
1674
1700
|
selected,
|
|
1675
1701
|
onOpenChange,
|
|
1702
|
+
variant: viewType === "grid" ? "normal" : "bare",
|
|
1676
1703
|
style: {
|
|
1677
1704
|
backgroundColor: selected ? cssVars.colors.primaryPastel : "transparent"
|
|
1678
1705
|
}
|
|
@@ -1682,7 +1709,8 @@ var MediaCollection = memo(
|
|
|
1682
1709
|
assetContextMenuItems,
|
|
1683
1710
|
handleMenuAction,
|
|
1684
1711
|
renderActionProp,
|
|
1685
|
-
selectedMediaItems
|
|
1712
|
+
selectedMediaItems,
|
|
1713
|
+
viewType
|
|
1686
1714
|
]);
|
|
1687
1715
|
useImperativeHandle(ref, () => ({
|
|
1688
1716
|
upload: (selectedId) => handleUpload(selectedId),
|
|
@@ -1717,7 +1745,7 @@ var MediaCollection = memo(
|
|
|
1717
1745
|
scrollable,
|
|
1718
1746
|
items: visibleItems,
|
|
1719
1747
|
viewType,
|
|
1720
|
-
size
|
|
1748
|
+
size,
|
|
1721
1749
|
getId: (file) => file.id,
|
|
1722
1750
|
getName: (file) => {
|
|
1723
1751
|
if (file.id === tempItem?.[1].id) {
|
|
@@ -1756,7 +1784,7 @@ var MediaCollection = memo(
|
|
|
1756
1784
|
if (file.kind !== "asset") return null;
|
|
1757
1785
|
const asset = assets.find((a) => a.id === file.assetId);
|
|
1758
1786
|
if (!asset) return null;
|
|
1759
|
-
return /* @__PURE__ */ React.createElement(FileExplorerDetail, { selected }, (asset.size / 1024).toFixed(1), "KB");
|
|
1787
|
+
return /* @__PURE__ */ React.createElement(FileExplorerDetail, { selected, size }, (asset.size / 1024).toFixed(1), "KB");
|
|
1760
1788
|
},
|
|
1761
1789
|
renderEmptyState: () => renderEmptyState?.() ?? /* @__PURE__ */ React.createElement(FileExplorerEmptyState, null),
|
|
1762
1790
|
itemRoleDescription: "clickable file item",
|
|
@@ -1848,6 +1876,7 @@ export {
|
|
|
1848
1876
|
moveMediaInsideFolder,
|
|
1849
1877
|
movePathsIntoTarget,
|
|
1850
1878
|
moveUpAFolder,
|
|
1879
|
+
renameMediaItemAndDescendantPaths,
|
|
1851
1880
|
rootMediaItem,
|
|
1852
1881
|
rootMediaItemName,
|
|
1853
1882
|
rootMediaItemPath,
|