diff options
Diffstat (limited to 'src/client/views/collections/CollectionSubView.tsx')
| -rw-r--r-- | src/client/views/collections/CollectionSubView.tsx | 43 | 
1 files changed, 4 insertions, 39 deletions
| diff --git a/src/client/views/collections/CollectionSubView.tsx b/src/client/views/collections/CollectionSubView.tsx index ed8535ecb..ce6872695 100644 --- a/src/client/views/collections/CollectionSubView.tsx +++ b/src/client/views/collections/CollectionSubView.tsx @@ -106,16 +106,6 @@ export function CollectionSubView<T, X>(schemaCtor: (doc: Doc) => T, moreProps?:                  [...this.props.docFilters(), ...Cast(this.props.Document._docFilters, listSpec("string"), [])];          }          @computed get childDocs() { -            const docFilters = this.docFilters(); -            const docRangeFilters = this.props.ignoreFields?.includes("_docRangeFilters") ? [] : Cast(this.props.Document._docRangeFilters, listSpec("string"), []); -            const filterFacets: { [key: string]: { [value: string]: string } } = {};  // maps each filter key to an object with value=>modifier fields -            for (let i = 0; i < docFilters.length; i += 3) { -                const [key, value, modifiers] = docFilters.slice(i, i + 3); -                if (!filterFacets[key]) { -                    filterFacets[key] = {}; -                } -                filterFacets[key][value] = modifiers; -            }              let rawdocs: (Doc | Promise<Doc>)[] = [];              if (this.dataField instanceof Doc) { // if collection data is just a document, then promote it to a singleton list; @@ -128,38 +118,13 @@ export function CollectionSubView<T, X>(schemaCtor: (doc: Doc) => T, moreProps?:                  const rootDoc = Cast(this.props.Document.rootDocument, Doc, null);                  rawdocs = rootDoc && !this.props.annotationsKey ? [Doc.GetProto(rootDoc)] : [];              } +              const docs = rawdocs.filter(d => !(d instanceof Promise)).map(d => d as Doc); +            const docFilters = this.docFilters();              const viewSpecScript = Cast(this.props.Document.viewSpecScript, ScriptField); -            const childDocs = viewSpecScript ? docs.filter(d => viewSpecScript.script.run({ doc: d }, console.log).result) : docs; +            const docRangeFilters = this.props.ignoreFields?.includes("_docRangeFilters") ? [] : Cast(this.props.Document._docRangeFilters, listSpec("string"), []); -            const filteredDocs = docFilters.length && !this.props.dontRegisterView ? childDocs.filter(d => { -                for (const facetKey of Object.keys(filterFacets)) { -                    const facet = filterFacets[facetKey]; -                    const satisfiesFacet = Object.keys(facet).some(value => { -                        if (facet[value] === "match") { -                            return d[facetKey] === undefined || Field.toString(d[facetKey] as Field).includes(value); -                        } -                        return (facet[value] === "x") !== Doc.matchFieldValue(d, facetKey, value); -                    }); -                    if (!satisfiesFacet) { -                        return false; -                    } -                } -                return true; -            }) : childDocs; -            const rangeFilteredDocs = filteredDocs.filter(d => { -                for (let i = 0; i < docRangeFilters.length; i += 3) { -                    const key = docRangeFilters[i]; -                    const min = Number(docRangeFilters[i + 1]); -                    const max = Number(docRangeFilters[i + 2]); -                    const val = Cast(d[key], "number", null); -                    if (val !== undefined && (val < min || val > max)) { -                        return false; -                    } -                } -                return true; -            }); -            return rangeFilteredDocs; +            return this.props.Document.dontRegisterView ? docs : DocUtils.FilterDocs(docs, docFilters, docRangeFilters, viewSpecScript);          }          @action | 
