import { TreeItem, TreeItemStatus } from '~/components/tree/tree';
import { FileTreeData } from '~/components/file-tree/file-tree-data';
import { FileTree } from '~/components/file-tree/file-tree';
-import { CollectionFileType } from "~/models/collection-file";
import { IconButton, Grid, Typography, StyleRulesCallback, withStyles, WithStyles, CardHeader, Card, Button, Tooltip, CircularProgress } from '@material-ui/core';
import { CustomizeTableIcon } from '~/components/icon/icon';
import { DownloadIcon } from '~/components/icon/icon';
<FileTree
onMenuOpen={(ev, item) => onItemMenuOpen(ev, item, isWritable)}
{...treeProps}
- items={treeProps.items.filter((item) => {
- if (item.data.type === CollectionFileType.FILE) {
- return item.data.name.toLowerCase().indexOf(searchValue.toLowerCase()) > -1;
- }
-
- return true;
- })} /></div>}
+ items={treeProps.items} /></div>}
</>
}
</Card>);
import { createTree, mapTreeValues, getNode, setNode, getNodeAncestorsIds, getNodeDescendantsIds, setNodeValueWith, mapTree } from "~/models/tree";
import { CollectionFileType } from "~/models/collection-file";
+let fetchedFiles: any = {};
+
export const collectionPanelFilesReducer = (state: CollectionPanelFilesState = createTree(), action: CollectionPanelFilesAction) => {
// Low-level tree handling setNode() func does in-place data modifications
// for performance reasons, so we pass a copy of 'state' to avoid side effects.
return collectionPanelFilesAction.match(action, {
- SET_COLLECTION_FILES: files =>
- mergeCollectionPanelFilesStates({ ...state }, mapTree(mapCollectionFileToCollectionPanelFile)(files)),
+ SET_COLLECTION_FILES: files => {
+ fetchedFiles = files;
+ return mergeCollectionPanelFilesStates({ ...state }, mapTree(mapCollectionFileToCollectionPanelFile)(files));
+ },
TOGGLE_COLLECTION_FILE_COLLAPSE: data =>
toggleCollapse(data.id)({ ...state }),
.map(toggleAncestors(data.id))
.map(toggleDescendants(data.id))[0],
- ON_SEARCH_CHANGE: (data) =>
- mapTreeValues((v: CollectionPanelDirectory | CollectionPanelFile) => {
+ ON_SEARCH_CHANGE: (searchValue) => {
+ // node.children = children.filter((id: string) => id.replace(parentId, '').toLowerCase().indexOf(searchValue.toLowerCase()) > -1);
+ const ids: string[] = [];
+ const filteredFiles = Object.keys(fetchedFiles)
+ .filter((key: string) => {
+ const node = fetchedFiles[key];
+
+ if (node.value === undefined) {
+ return false;
+ }
+
+ const { id, value: { type, name } } = node;
+
+ if (type === CollectionFileType.DIRECTORY) {
+ ids.push(id);
+ return true;
+ }
+
+ const includeFile = name.toLowerCase().indexOf(searchValue.toLowerCase()) > -1;
+
+ if (includeFile) {
+ ids.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;
+ return prev;
+ }, {});
+
+ return mapTreeValues((v: CollectionPanelDirectory | CollectionPanelFile) => {
if (v.type === CollectionFileType.DIRECTORY) {
- return ({ ...v, collapsed: data.length === 0 });
+ return ({
+ ...v,
+ collapsed: searchValue.length === 0,
+ });
}
return ({ ...v });
- })({ ...state }),
+ })({ ...filteredFiles });
+ },
SELECT_ALL_COLLECTION_FILES: () =>
mapTreeValues(v => ({ ...v, selected: true }))({ ...state }),