X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/0c00f9d96076ad46e2ee499230f3f22a1603675d..618af1a3106c399765788be4583463ab35d97cd5:/src/store/collection-panel/collection-panel-files/collection-panel-files-reducer.ts diff --git a/src/store/collection-panel/collection-panel-files/collection-panel-files-reducer.ts b/src/store/collection-panel/collection-panel-files/collection-panel-files-reducer.ts index 25323e27..775930bd 100644 --- a/src/store/collection-panel/collection-panel-files/collection-panel-files-reducer.ts +++ b/src/store/collection-panel/collection-panel-files/collection-panel-files-reducer.ts @@ -4,8 +4,8 @@ import { CollectionPanelFilesState, CollectionPanelFile, CollectionPanelDirectory, mapCollectionFileToCollectionPanelFile, mergeCollectionPanelFilesStates } from './collection-panel-files-state'; import { CollectionPanelFilesAction, collectionPanelFilesAction } from "./collection-panel-files-actions"; -import { createTree, mapTreeValues, getNode, setNode, getNodeAncestorsIds, getNodeDescendantsIds, setNodeValueWith, mapTree } from "~/models/tree"; -import { CollectionFileType } from "~/models/collection-file"; +import { createTree, mapTreeValues, getNode, setNode, getNodeAncestorsIds, getNodeDescendantsIds, setNodeValueWith, mapTree } from "models/tree"; +import { CollectionFileType } from "models/collection-file"; let fetchedFiles: any = {}; @@ -27,8 +27,8 @@ export const collectionPanelFilesReducer = (state: CollectionPanelFilesState = c .map(toggleDescendants(data.id))[0], ON_SEARCH_CHANGE: (searchValue) => { - // node.children = children.filter((id: string) => id.replace(parentId, '').toLowerCase().indexOf(searchValue.toLowerCase()) > -1); - const ids: string[] = []; + const fileIds: string[] = []; + const directoryIds: string[] = []; const filteredFiles = Object.keys(fetchedFiles) .filter((key: string) => { const node = fetchedFiles[key]; @@ -40,28 +40,39 @@ export const collectionPanelFilesReducer = (state: CollectionPanelFilesState = c const { id, value: { type, name } } = node; if (type === CollectionFileType.DIRECTORY) { - ids.push(id); + directoryIds.push(id); return true; } const includeFile = name.toLowerCase().indexOf(searchValue.toLowerCase()) > -1; if (includeFile) { - ids.push(id); + fileIds.push(id); } return includeFile; }) .reduce((prev, next) => { const node = JSON.parse(JSON.stringify(fetchedFiles[next])); - node.children = node.children.filter((key: string) => ids.indexOf(key) > -1); - prev[next] = node; + const { value: { type }, children } = node; + + node.children = node.children.filter((key: string) => { + const isFile = directoryIds.indexOf(key) === -1; + return isFile ? + fileIds.indexOf(key) > -1 : + !!fileIds.find(id => id.indexOf(key) > -1); + }); + + if (type === CollectionFileType.FILE || children.length > 0) { + prev[next] = node; + } + return prev; }, {}); return mapTreeValues((v: CollectionPanelDirectory | CollectionPanelFile) => { if (v.type === CollectionFileType.DIRECTORY) { - return ({ + return ({ ...v, collapsed: searchValue.length === 0, }); @@ -72,10 +83,10 @@ export const collectionPanelFilesReducer = (state: CollectionPanelFilesState = c }, SELECT_ALL_COLLECTION_FILES: () => - mapTreeValues(v => ({ ...v, selected: true }))({ ...state }), + mapTreeValues((v: any) => ({ ...v, selected: true }))({ ...state }), UNSELECT_ALL_COLLECTION_FILES: () => - mapTreeValues(v => ({ ...v, selected: false }))({ ...state }), + mapTreeValues((v: any) => ({ ...v, selected: false }))({ ...state }), default: () => state }) as CollectionPanelFilesState; @@ -97,7 +108,7 @@ const toggleDescendants = (id: string) => (tree: CollectionPanelFilesState) => { if (node && node.value.type === CollectionFileType.DIRECTORY) { return getNodeDescendantsIds(id)(tree) .reduce((newTree, id) => - setNodeValueWith(v => ({ ...v, selected: node.value.selected }))(id)(newTree), tree); + setNodeValueWith((v: any) => ({ ...v, selected: node.value.selected }))(id)(newTree), tree); } return tree; }; @@ -115,7 +126,7 @@ const toggleParentNode = (id: string) => (tree: CollectionPanelFilesState) => { const selected = parentNode.children .map(id => getNode(id)(tree)) .every(node => node !== undefined && node.value.selected); - return setNodeValueWith(v => ({ ...v, selected }))(parentNode.id)(tree); + return setNodeValueWith((v: any) => ({ ...v, selected }))(parentNode.id)(tree); } return setNode(node)(tree); }