Merge branch '21128-toolbar-context-menu'
[arvados-workbench2.git] / src / models / collection-file.ts
index 3a7e55c2ad02fb2fcff26d3adf635a8a9e313682..3688557a6154c8e8a3fc9dca87d486d004a6b754 100644 (file)
@@ -2,9 +2,8 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { uniqBy } from 'lodash';
-import { KeepManifestStream, KeepManifestStreamFile, KeepManifest } from "./keep-manifest";
-import { Tree, TreeNode, setNode, createTree } from './tree';
+import { Tree, createTree, setNode, TreeNodeStatus } from './tree';
+import { head, split, pipe, join } from 'lodash/fp';
 
 export type CollectionFilesTree = Tree<CollectionDirectory | CollectionFile>;
 
@@ -14,97 +13,68 @@ export enum CollectionFileType {
 }
 
 export interface CollectionDirectory {
-    parentId: string;
+    path: string;
+    url: string;
     id: string;
     name: string;
     type: CollectionFileType.DIRECTORY;
 }
 
 export interface CollectionFile {
-    parentId: string;
+    path: string;
+    url: string;
     id: string;
     name: string;
     size: number;
     type: CollectionFileType.FILE;
 }
 
-export const mapManifestToCollectionFilesTree = (manifest: KeepManifest): CollectionFilesTree =>
-    manifestToCollectionFiles(manifest)
-        .map(mapCollectionFileToTreeNode)
-        .reduce((tree, node) => setNode(node)(tree), createTree<CollectionFile>());
-
-
-export const mapCollectionFileToTreeNode = (file: CollectionFile): TreeNode<CollectionFile> => ({
-    children: [],
-    id: file.id,
-    parent: file.parentId,
-    value: file
-});
-
-export const manifestToCollectionFiles = (manifest: KeepManifest): Array<CollectionDirectory | CollectionFile> => ([
-    ...mapManifestToDirectories(manifest),
-    ...mapManifestToFiles(manifest)
-]);
-
-export const mapManifestToDirectories = (manifest: KeepManifest): CollectionDirectory[] =>
-    uniqBy(
-        manifest
-            .map(mapStreamDirectory)
-            .map(splitDirectory)
-            .reduce((all, splitted) => ([...all, ...splitted]), []),
-        directory => directory.id);
-
-export const mapManifestToFiles = (manifest: KeepManifest): CollectionFile[] =>
-    manifest
-        .map(stream => stream.files.map(mapStreamFile(stream)))
-        .reduce((all, current) => ([...all, ...current]), []);
-
-const splitDirectory = (directory: CollectionDirectory): CollectionDirectory[] => {
-    return directory.name
-        .split('/')
-        .slice(1)
-        .map(mapPathComponentToDirectory);
-};
-
-const mapPathComponentToDirectory = (component: string, index: number, components: string[]): CollectionDirectory =>
-    createDirectory({
-        parentId: index === 0 ? '' : joinPathComponents(components, index),
-        id: joinPathComponents(components, index + 1),
-        name: component,
-    });
-
-const joinPathComponents = (components: string[], index: number) =>
-    `/${components.slice(0, index).join('/')}`;
-
-const mapStreamDirectory = (stream: KeepManifestStream): CollectionDirectory =>
-    createDirectory({
-        parentId: '',
-        id: stream.name,
-        name: stream.name,
-    });
-
-const mapStreamFile = (stream: KeepManifestStream) =>
-    (file: KeepManifestStreamFile): CollectionFile =>
-        createFile({
-            parentId: stream.name,
-            id: `${stream.name}/${file.name}`,
-            name: file.name,
-            size: file.size,
-        });
+export interface CollectionUploadFile {
+    name: string;
+}
 
-export const createDirectory = (data: Partial<CollectionDirectory>): CollectionDirectory => ({
+export const createCollectionDirectory = (data: Partial<CollectionDirectory>): CollectionDirectory => ({
     id: '',
     name: '',
-    parentId: '',
+    path: '',
+    url: '',
     type: CollectionFileType.DIRECTORY,
     ...data
 });
 
-export const createFile = (data: Partial<CollectionFile>): CollectionFile => ({
+export const createCollectionFile = (data: Partial<CollectionFile>): CollectionFile => ({
     id: '',
     name: '',
-    parentId: '',
+    path: '',
+    url: '',
     size: 0,
     type: CollectionFileType.FILE,
     ...data
-});
\ No newline at end of file
+});
+
+export const createCollectionFilesTree = (data: Array<CollectionDirectory | CollectionFile>, joinParents: Boolean = true) => {
+    const directories = data.filter(item => item.type === CollectionFileType.DIRECTORY);
+    directories.sort((a, b) => a.path.localeCompare(b.path));
+    const files = data.filter(item => item.type === CollectionFileType.FILE);
+    return [...directories, ...files]
+        .reduce((tree, item) => setNode({
+            children: [],
+            id: item.id,
+            parent: joinParents ? getParentId(item) : '',
+            value: item,
+            active: false,
+            selected: false,
+            expanded: false,
+            status: TreeNodeStatus.INITIAL
+        })(tree), createTree<CollectionDirectory | CollectionFile>());
+};
+
+const getParentId = (item: CollectionDirectory | CollectionFile) =>
+    item.path
+        ? join('', [getCollectionResourceCollectionUuid(item.id), item.path])
+        : item.path;
+
+export const getCollectionResourceCollectionUuid = pipe(
+    split('/'),
+    head,
+);