Filtering works, but only for first level? :thinking_face:

folders
Rick Carlino 2019-12-08 13:55:54 -06:00
parent 06d0bd1c82
commit 142611deaa
4 changed files with 19 additions and 11 deletions

View File

@ -2,5 +2,5 @@ import { throttle } from "lodash";
/** Too many status updates === too many screen redraws. */ /** Too many status updates === too many screen redraws. */
export const slowDown = export const slowDown =
(fn: (...args: unknown[]) => unknown) => <Returns, Args, Fn extends (u: Args) => Returns>(fn: Fn) =>
throttle(fn, 600, { leading: false, trailing: true }); throttle(fn, 600, { leading: false, trailing: true });

View File

@ -106,9 +106,8 @@ const isSearchMatch =
}; };
/** Given an input search term, returns folder IDs (number) and Sequence UUIDs /** Given an input search term, returns folder IDs (number) and Sequence UUIDs
* that match * that match */
*/ export const searchFoldersAndSequencesForTerm = (props: FolderSearchProps) => {
export function searchFoldersAndSequencesForTerm(props: FolderSearchProps) {
type MappableFolder = FolderNodeMedial | FolderNodeTerminal; type MappableFolder = FolderNodeMedial | FolderNodeTerminal;
const searchTerm = props.input.toLowerCase(); const searchTerm = props.input.toLowerCase();
const sequenceSet = new Set<string>(); const sequenceSet = new Set<string>();
@ -128,17 +127,21 @@ export function searchFoldersAndSequencesForTerm(props: FolderSearchProps) {
} }
}; };
const filter = (finalNode: FolderUnion): FolderUnion => {
return {
...finalNode,
content: finalNode.content.filter(seqUUID => sequenceSet.has(seqUUID))
};
};
climb(props.folders, (node: FolderUnion) => { climb(props.folders, (node: FolderUnion) => {
node.content.map(sequenceMaper(node)); node.content.map(sequenceMaper(node));
const nodes: MappableFolder[] = node.children || []; const nodes: MappableFolder[] = node.children || [];
nodes.map(nodeMapper); nodes.map(nodeMapper);
}); });
return { return Array.from(folderSet).map(filter);
folders: Array.from(folderSet), };
sequences: Array.from(sequenceSet)
};
}
export const toggleFolderOpenState = (id: number) => Promise export const toggleFolderOpenState = (id: number) => Promise
.resolve(store.dispatch({ type: Actions.FOLDER_TOGGLE, payload: { id } })); .resolve(store.dispatch({ type: Actions.FOLDER_TOGGLE, payload: { id } }));

View File

@ -126,6 +126,11 @@ export class RawFolders extends React.Component<Props, State> {
<Row> <Row>
<this.Graph /> <this.Graph />
</Row> </Row>
<Row>
<pre>
{JSON.stringify(this.props.folders, undefined, " ")}
</pre>
</Row>
</Col> </Col>
</Page>; </Page>;
} }

View File

@ -187,8 +187,8 @@ export let resourceReducer =
}) })
.add<string | undefined>(Actions.FOLDER_SEARCH, (s, { payload }) => { .add<string | undefined>(Actions.FOLDER_SEARCH, (s, { payload }) => {
s.index.sequenceFolders.searchTerm = payload; s.index.sequenceFolders.searchTerm = payload;
if (payload && payload.length > 3) { if (payload) {
const { folders } = searchFoldersAndSequencesForTerm({ const folders = searchFoldersAndSequencesForTerm({
references: s.index.references, references: s.index.references,
input: payload, input: payload,
folders: s.index.sequenceFolders.folders folders: s.index.sequenceFolders.folders