Filtering works, but only for first level? :thinking_face:
parent
06d0bd1c82
commit
142611deaa
|
@ -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 });
|
||||||
|
|
|
@ -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 } }));
|
||||||
|
|
|
@ -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>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue