aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/views/FilterPanel.tsx349
-rw-r--r--src/fields/Doc.ts4
2 files changed, 233 insertions, 120 deletions
diff --git a/src/client/views/FilterPanel.tsx b/src/client/views/FilterPanel.tsx
index ce6e2b1f3..b7718c6a3 100644
--- a/src/client/views/FilterPanel.tsx
+++ b/src/client/views/FilterPanel.tsx
@@ -13,6 +13,8 @@ import { SearchBox } from './search/SearchBox';
import { undoable } from '../util/UndoManager';
import { AiOutlineMinusSquare, AiOutlinePlusSquare } from 'react-icons/ai';
import { CiCircleRemove } from 'react-icons/ci';
+import { Slider, Rail, Handles, Tracks, Ticks } from 'react-compound-slider';
+import { TooltipRail, Handle, Tick, Track } from './nodes/SliderBox-components';
//slight bug when you don't click on background canvas before creating filter and the you click on the canvas
@@ -77,6 +79,14 @@ export class FilterPanel extends React.Component<filterProps> {
return StrListCast(this.targetDoc?._childFilters).concat(this.rangeFilters);
}
+ @computed get mapActiveFiltersToFacets() {
+ const filters = new Map<string, string>();
+ //this.targetDoc.docFilters
+ this.activeFilters.map(filter => filters.set(filter.split(Doc.FilterSep)[1] ,filter.split(Doc.FilterSep)[0] ))
+ console.log("what is wrong with filters " +filters )
+ return filters
+ }
+
//
// activeFacetHeaders() - just the facet names, not the rest of the filter
//
@@ -86,20 +96,31 @@ export class FilterPanel extends React.Component<filterProps> {
// ["#tags", "width", "height"]
//
- @computed get currentActiveFilterz(){ // this.existingFilters
- const filters = new Map<string, string>();
- //this.targetDoc.docFilters
- this.activeFilters.map(filter => filters.set(filter.split(Doc.FilterSep)[1] ,filter.split(Doc.FilterSep)[0] ))
- console.log("what is wrong with filters " +filters )
- return filters
+
+ @computed get activeFacetHeaders() {
+ const activeHeaders = new Array()
+
+ this.activeFilters.map(filter => activeHeaders.push(filter.split(Doc.FilterSep)[0]) )
+
+
+ return activeHeaders;
}
+
+
+ // @computed get currentActiveFilterz(){ // this.existingFilters
+ // const filters = new Map<string, string>();
+ // //this.targetDoc.docFilters
+ // this.activeFilters.map(filter => filters.set(filter.split(Doc.FilterSep)[1] ,filter.split(Doc.FilterSep)[0] ))
+ // console.log("what is wrong with filters " +filters )
+ // return filters
+ // }
/**
* @returns a string array of the current attributes
*/
- @computed get currentFacets() {
- return this.activeFilters.map(filter => filter.split(Doc.FilterSep)[0]);
- }
+ // @computed get currentFacets() {
+ // return this.activeFilters.map(filter => filter.split(Doc.FilterSep)[0]);
+ // }
gatherFieldValues(childDocs: Doc[], facetKey: string) {
const valueSet = new Set<string>();
@@ -149,28 +170,68 @@ export class FilterPanel extends React.Component<filterProps> {
// Map("tags" => {"checkbox"},
// "width" => {"rangs", domain:[1978,1992]})
//
- @computed get activeFacets() { // selectedFacetRenderInfo => []:{facetName, renderInfo}[] renderInfo: { renderType: text|range|... , minVal?: , maxVal?; }
-
- // return new Set(
- // Array.from(new Set(Array.from(this.selectedFacetHeaders).concat(this.existingFacetHeaders)))
- // .map(facetHeader => { --> getting exisitng filters and new filters that havent been selected but need to remove duplicates
- // most of what facetClick did before ...
- // minVal, maxvval...
- // if (...)
- // return {key: facet, renderType: "text"}
- // else if (... numbers) return {key:facet, renderrType: range, extendedMinVal, maxval
- // return
- // return ..
- // }))
-
- // console.log("chosen collpase " + this._chosenFacetsCollapse)
- const facets = new Map<string, 'text' | 'checkbox' | 'slider' | 'range'>();
- this.activeFilters.map(filter => facets.set(filter.split(Doc.FilterSep)[0], filter.split(Doc.FilterSep)[2] === 'match' ? 'text' : 'checkbox'));
- // setTimeout(() => StrListCast(this.targetDoc?._childFilters).map(action(filter => this._chosenFacets.set(filter.split(Doc.FilterSep)[0], filter.split(Doc.FilterSep)[2] === 'match' ? 'text' : 'checkbox'))));
- return facets;
+
+ @computed get activeRenderedFacetInfos(){
+
+ return new Set(
+ Array.from(new Set(Array.from(this._selectedFacetHeaders).concat(this.activeFacetHeaders))).map(
+ facetHeader => {
+
+ const facetValues = this.gatherFieldValues(this.targetDocChildren, facetHeader);
+
+ let nonNumbers = 0;
+ let minVal = Number.MAX_VALUE,
+ maxVal = -Number.MAX_VALUE;
+ facetValues.strings.map(val => {
+ const num = val ? Number(val) : Number.NaN;
+ if (Number.isNaN(num)) {
+ val && nonNumbers++;
+ } else {
+ minVal = Math.min(num, minVal);
+ maxVal = Math.max(num, maxVal);
+ }
+ });
+
+
+ if (facetHeader === 'text' ){
+ return {facetHeader: facetHeader, renderType: 'text'}
+
+ } else if (facetHeader !== 'tags' && nonNumbers / facetValues.strings.length < 0.1){
+
+ const extendedMinVal = minVal - Math.min(1, Math.floor(Math.abs(maxVal - minVal) * 0.1));
+ const extendedMaxVal = Math.max(minVal + 1, maxVal + Math.min(1, Math.ceil(Math.abs(maxVal - minVal) * 0.05)));
+ const ranged = Doc.readDocRangeFilter(this.targetDoc, facetHeader); // not the filter range, but the zooomed in range on the filter
+ return {facetHeader: facetHeader, renderType: 'range', domain: [extendedMinVal, extendedMaxVal], range: ranged ? ranged: [extendedMinVal, extendedMaxVal]}
+
+ } else{
+ return {facetHeader: facetHeader, renderType: 'checkbox'}
+ }
+ }
+ ))
}
- @observable selectedFacetHeaders = new Set<string>();
+ // @computed get activeFacets() { // selectedFacetRenderInfo => []:{facetName, renderInfo}[] renderInfo: { renderType: text|range|... , minVal?: , maxVal?; }
+
+ // // return new Set(
+ // // Array.from(new Set(Array.from(this.selectedFacetHeaders).concat(this.existingFacetHeaders)))
+ // // .map(facetHeader => { --> getting exisitng filters and new filters that havent been selected but need to remove duplicates
+ // // most of what facetClick did before ...
+ // // minVal, maxvval...
+ // // if (...)
+ // // return {key: facet, renderType: "text"}
+ // // else if (... numbers) return {key:facet, renderrType: range, extendedMinVal, maxval
+ // // return
+ // // return ..
+ // // }))
+
+ // // console.log("chosen collpase " + this._chosenFacetsCollapse)
+ // const facets = new Map<string, 'text' | 'checkbox' | 'slider' | 'range'>();
+ // this.activeFilters.map(filter => facets.set(filter.split(Doc.FilterSep)[0], filter.split(Doc.FilterSep)[2] === 'match' ? 'text' : 'checkbox'));
+ // // setTimeout(() => StrListCast(this.targetDoc?._childFilters).map(action(filter => this._chosenFacets.set(filter.split(Doc.FilterSep)[0], filter.split(Doc.FilterSep)[2] === 'match' ? 'text' : 'checkbox'))));
+ // return facets;
+ // }
+
+ @observable _selectedFacetHeaders = new Set<string>();
/**
* user clicks on a filter facet because they want to see it.
@@ -182,72 +243,74 @@ export class FilterPanel extends React.Component<filterProps> {
@action
facetClick = (facetHeader: string) => { // just when someone chooses a facet
- // return;
+ this._selectedFacetHeaders.add(facetHeader);
+ return
- if (!this.targetDoc) return;
- const allCollectionDocs = this.targetDocChildren;
- const facetValues = this.gatherFieldValues(this.targetDocChildren, facetHeader);
- let nonNumbers = 0;
- let minVal = Number.MAX_VALUE,
- maxVal = -Number.MAX_VALUE;
- facetValues.strings.map(val => {
- const num = val ? Number(val) : Number.NaN;
- if (Number.isNaN(num)) {
- val && nonNumbers++;
- } else {
- minVal = Math.min(num, minVal);
- maxVal = Math.max(num, maxVal);
- }
- });
- if (facetHeader === 'text' || (facetValues.rtFields / allCollectionDocs.length > 0.1 && facetValues.strings.length > 20)) {
- // this._chosenFacets.set(facetHeader, 'text');
- } else if (facetHeader !== 'tags' && nonNumbers / facetValues.strings.length < 0.1) {
-
- console.log("in this IF STATEMENE ")
-
- const ranged = Doc.readDocRangeFilter(this.targetDoc, facetHeader); // not the filter range, but the zooomed in range on the filter
- const extendedMinVal = minVal - Math.min(1, Math.floor(Math.abs(maxVal - minVal) * 0.1));
- const extendedMaxVal = Math.max(minVal + 1, maxVal + Math.min(1, Math.ceil(Math.abs(maxVal - minVal) * 0.05)));
- // this.targetDoc["year-min"] = 1978
- // // facetHeader == year
- // this.targetDoc[newFacetField + '-min'] = ranged === undefined ? extendedMinVal : ranged[0];
- // newFacet[newFacetField + '-max'] = ranged === undefined ? extendedMaxVal : ranged[1];
- // const scriptText = `setDocRangeFilter(this?.target, "${facetHeader}", range)`;
- Doc.setDocRangeFilter(this.targetDoc, facetHeader, [extendedMinVal, extendedMaxVal] )
-
-
- // newFacet = Docs.Create.SliderDocument({
- // title: facetHeader,
- // system: true,
- // target: targetDoc,
- // _fitWidth: true,
- // _height: 40,
- // _stayInCollection: true,
- // treeViewExpandedView: 'layout',
- // _treeViewOpen: true,
- // _forceActive: true,
- // _overflow: 'visible',
- // });
- // const newFacetField = Doc.LayoutFieldKey(newFacet);
- // const ranged = Doc.readDocRangeFilter(targetDoc, facetHeader);
- // Doc.GetProto(newFacet).type = DocumentType.COL; // forces item to show an open/close button instead ofa checkbox
- // const extendedMinVal = minVal - Math.min(1, Math.floor(Math.abs(maxVal - minVal) * 0.1));
- // const extendedMaxVal = Math.max(minVal + 1, maxVal + Math.min(1, Math.ceil(Math.abs(maxVal - minVal) * 0.05)));
- // newFacet[newFacetField + '-min'] = ranged === undefined ? extendedMinVal : ranged[0];
- // newFacet[newFacetField + '-max'] = ranged === undefined ? extendedMaxVal : ranged[1];
- // Doc.GetProto(newFacet)[newFacetField + '-minThumb'] = extendedMinVal;
- // Doc.GetProto(newFacet)[newFacetField + '-maxThumb'] = extendedMaxVal;
- // const scriptText = `setDocRangeFilter(this?.target, "${facetHeader}", range)`;
- // newFacet.onThumbChanged = ScriptField.MakeScript(scriptText, { this: Doc.name, range: 'number' });
- // newFacet.data = ComputedField.MakeFunction(`readNumFacetData(self.target, self, "${FilterBox.targetDocChildKey}", "${facetHeader}")`);
+ // if (!this.targetDoc) return;
+ // const allCollectionDocs = this.targetDocChildren;
+ // const facetValues = this.gatherFieldValues(this.targetDocChildren, facetHeader);
+
+ // let nonNumbers = 0;
+ // let minVal = Number.MAX_VALUE,
+ // maxVal = -Number.MAX_VALUE;
+ // facetValues.strings.map(val => {
+ // const num = val ? Number(val) : Number.NaN;
+ // if (Number.isNaN(num)) {
+ // val && nonNumbers++;
+ // } else {
+ // minVal = Math.min(num, minVal);
+ // maxVal = Math.max(num, maxVal);
+ // }
+ // });
+ // if (facetHeader === 'text' || (facetValues.rtFields / allCollectionDocs.length > 0.1 && facetValues.strings.length > 20)) {
+ // // this._chosenFacets.set(facetHeader, 'text');
+ // } else if (facetHeader !== 'tags' && nonNumbers / facetValues.strings.length < 0.1) {
+
+ // console.log("in this IF STATEMENE ")
+
+ // const ranged = Doc.readDocRangeFilter(this.targetDoc, facetHeader); // not the filter range, but the zooomed in range on the filter
+ // const extendedMinVal = minVal - Math.min(1, Math.floor(Math.abs(maxVal - minVal) * 0.1));
+ // const extendedMaxVal = Math.max(minVal + 1, maxVal + Math.min(1, Math.ceil(Math.abs(maxVal - minVal) * 0.05)));
+ // // this.targetDoc["year-min"] = 1978
+ // // // facetHeader == year
+ // // this.targetDoc[newFacetField + '-min'] = ranged === undefined ? extendedMinVal : ranged[0];
+ // // newFacet[newFacetField + '-max'] = ranged === undefined ? extendedMaxVal : ranged[1];
+ // // const scriptText = `setDocRangeFilter(this?.target, "${facetHeader}", range)`;
+ // Doc.setDocRangeFilter(this.targetDoc, facetHeader, [extendedMinVal, extendedMaxVal] )
+
+
+ // // newFacet = Docs.Create.SliderDocument({
+ // // title: facetHeader,
+ // // system: true,
+ // // target: targetDoc,
+ // // _fitWidth: true,
+ // // _height: 40,
+ // // _stayInCollection: true,
+ // // treeViewExpandedView: 'layout',
+ // // _treeViewOpen: true,
+ // // _forceActive: true,
+ // // _overflow: 'visible',
+ // // });
+ // // const newFacetField = Doc.LayoutFieldKey(newFacet);
+ // // const ranged = Doc.readDocRangeFilter(targetDoc, facetHeader);
+ // // Doc.GetProto(newFacet).type = DocumentType.COL; // forces item to show an open/close button instead ofa checkbox
+ // // const extendedMinVal = minVal - Math.min(1, Math.floor(Math.abs(maxVal - minVal) * 0.1));
+ // // const extendedMaxVal = Math.max(minVal + 1, maxVal + Math.min(1, Math.ceil(Math.abs(maxVal - minVal) * 0.05)));
+ // // newFacet[newFacetField + '-min'] = ranged === undefined ? extendedMinVal : ranged[0];
+ // // newFacet[newFacetField + '-max'] = ranged === undefined ? extendedMaxVal : ranged[1];
+ // // Doc.GetProto(newFacet)[newFacetField + '-minThumb'] = extendedMinVal;
+ // // Doc.GetProto(newFacet)[newFacetField + '-maxThumb'] = extendedMaxVal;
+ // // const scriptText = `setDocRangeFilter(this?.target, "${facetHeader}", range)`;
+ // // newFacet.onThumbChanged = ScriptField.MakeScript(scriptText, { this: Doc.name, range: 'number' });
+ // // newFacet.data = ComputedField.MakeFunction(`readNumFacetData(self.target, self, "${FilterBox.targetDocChildKey}", "${facetHeader}")`);
- } else {
- // this._chosenFacets.set(facetHeader, 'checkbox');
- }
- this._chosenFacetsCollapse.set(facetHeader, false)
+ // } else {
+ // // this._chosenFacets.set(facetHeader, 'checkbox');
+ // }
+ // this._chosenFacetsCollapse.set(facetHeader, false)
};
@@ -256,12 +319,13 @@ export class FilterPanel extends React.Component<filterProps> {
this._collapseReturnKeys.splice(0)
- for (var key of this.facetValues(facetHeader)){
+ for (var key of this.facetValues(facetHeader)){ // all filters currently set
// console.log("key : " + key )
- if (this.currentActiveFilterz.get(key)){
+ if (this.mapActiveFiltersToFacets.get(key)){ // work with the current filter selected
// console.log("WEREEE HERHEHHHHEHHHHEEE")
this._collapseReturnKeys.push(key)
- }}
+ }
+ }
return (<div className = " filterbox-collpasedAndActive">
@@ -301,7 +365,8 @@ export class FilterPanel extends React.Component<filterProps> {
render() {
- const options = this._allFacets.filter(facet => this.currentFacets.indexOf(facet) === -1).map(facet => ({ value: facet, label: facet }));
+ // const options = this._allFacets.filter(facet => this.currentFacets.indexOf(facet) === -1).map(facet => ({ value: facet, label: facet }));
+ const options = this._allFacets.filter(facet => this.activeFacetHeaders.indexOf(facet) === -1).map(facet => ({ value: facet, label: facet }));
return (
<div className="filterBox-treeView">
@@ -322,41 +387,42 @@ export class FilterPanel extends React.Component<filterProps> {
</div>
<div className="filterBox-tree" key="tree">
- {Array.from(this.activeFacets.keys()).map(facetHeader => ( // iterato over activeFacetRenderInfos ==> renderInfo which you can renderInfo.facetHeader
+ {Array.from(this.activeRenderedFacetInfos.keys()).map(renderInfo => ( // iterato over activeFacetRenderInfos ==> renderInfo which you can renderInfo.facetHeader
<div>
<div className = "filterBox-facetHeader">
<div className = "filterBox-facetHeader-Header"> </div>
- {facetHeader.charAt(0).toUpperCase() + facetHeader.slice(1)}
+ {renderInfo.facetHeader.charAt(0).toUpperCase() + renderInfo.facetHeader.slice(1)}
<div className = "filterBox-facetHeader-collapse"
onClick = {action((e) => {
- for (const [key, value] of this.currentActiveFilterz) {
-
- console.log("NEW KEY " + key + "NEW VAL " + value);
-
- }
- console.log("this is gather field values : " + this.gatherFieldValues(this.targetDocChildren, facetHeader))
- console.log("this is current facets: " + this.currentFacets)
-
- console.log("this is facet Header " + facetHeader + ". this is the get " + this.activeFacets.get(facetHeader))
- const collapseBoolValue = this._chosenFacetsCollapse.get(facetHeader)
- this._chosenFacetsCollapse.set(facetHeader, !collapseBoolValue )})}>
+
+ const collapseBoolValue = this._chosenFacetsCollapse.get(renderInfo.facetHeader)
+ this._chosenFacetsCollapse.set(renderInfo.facetHeader, !collapseBoolValue )})}>
- {this._chosenFacetsCollapse.get(facetHeader) ? <AiOutlinePlusSquare/> : <AiOutlineMinusSquare/> }
+ {this._chosenFacetsCollapse.get(renderInfo.facetHeader) ? <AiOutlinePlusSquare/> : <AiOutlineMinusSquare/> }
</div>
<div className='filterBox-facetHeader-remove'
onClick = {action((e) => {
- for (var key of this.facetValues(facetHeader)){
- if (this.currentActiveFilterz.get(key)){
- Doc.setDocFilter(this.targetDoc, facetHeader, key, 'remove')
+ for (var key of this.facetValues(renderInfo.facetHeader)){
+ if (this.mapActiveFiltersToFacets.get(key)){
+ Doc.setDocFilter(this.targetDoc, renderInfo.facetHeader, key, 'remove')
}}
- this.activeFacets.delete(facetHeader)
+ if (renderInfo.facetHeader)
+
+ this._selectedFacetHeaders.delete(renderInfo.facetHeader)
+
+ // this.activeFacets.delete(renderInfo.facetHeader)
// this._chosenFacets.delete(facetHeader)
- this._chosenFacetsCollapse.delete(facetHeader)
+ this._chosenFacetsCollapse.delete(renderInfo.facetHeader)
+
+ console.log("this is activeFilters " + this.activeFilters)
+ console.log("this is activeFacetHeaders " + this.activeFacetHeaders)
+ console.log("thsi is activeRenderedFacetInfos " + this.activeRenderedFacetInfos)
+ console.log("thsi is selected facet Headers " + this._selectedFacetHeaders )
})} >
@@ -365,11 +431,11 @@ export class FilterPanel extends React.Component<filterProps> {
</div>
- { this._chosenFacetsCollapse.get(facetHeader) ?
+ { this._chosenFacetsCollapse.get(renderInfo.facetHeader) ?
// <div className = 'filterbox-collpasedAndActive' style={{backgroundColor: 'yellow', fontSize: 50}} > {this.sortingCurrentFacetValues(facetHeader)} </div> && this._collapseReturnKeys.splice(0)
- this.sortingCurrentFacetValues(facetHeader)
+ this.sortingCurrentFacetValues(renderInfo.facetHeader)
// && this._collapseReturnKeys.splice(0)
- : this.displayFacetValueFilterUIs(this.activeFacets.get(facetHeader), facetHeader) } // pass renderInfo from iterator
+ : this.displayFacetValueFilterUIs(renderInfo.renderType, renderInfo.facetHeader, renderInfo.domain, renderInfo.range ) }
{/* */}
</div>
))}
@@ -378,7 +444,7 @@ export class FilterPanel extends React.Component<filterProps> {
);
}
- private displayFacetValueFilterUIs(type: string | undefined, facetHeader: string): React.ReactNode {
+ private displayFacetValueFilterUIs(type: string | undefined, facetHeader: string, renderInfoDomain?: number[] | undefined, renderInfoRange?: number[] ): React.ReactNode {
// displayFacetValueFilterUIs(renderIinfo)
switch (type /* renderInfo.type */ ) {
case 'text': // if (this.chosenFacets.get(facetHeader) === 'text')
@@ -417,6 +483,55 @@ export class FilterPanel extends React.Component<filterProps> {
</div>
);
})
+
+ case 'range':
+ console.log("in range")
+
+ const domain = renderInfoDomain;
+
+ if (domain){
+ return(
+ <Slider mode={2} step={Math.min(1, 0.1 * (domain[1] - domain[0]))} domain={[-1000, 1000]} rootStyle={{ position: 'relative', width: '100%' }}
+ onChange={ values => Doc.setDocRangeFilter(this.targetDoc, facetHeader, values)} values={renderInfoRange!} >
+ <Rail>{railProps => <TooltipRail {...railProps} />}</Rail>
+ <Handles>
+ {({ handles, activeHandleID, getHandleProps }) => (
+ <div className="slider-handles">
+ {handles.map((handle, i) => {
+ // const value = i === 0 ? defaultValues[0] : defaultValues[1];
+ return (
+ <div >
+ <Handle key={handle.id} handle={handle} domain={domain} isActive={handle.id === activeHandleID} getHandleProps={getHandleProps} />
+ </div>
+ );
+ })}
+ </div>
+ )}
+ </Handles>
+ <Tracks left={false} right={false}>
+ {({ tracks, getTrackProps }) => (
+ <div className="slider-tracks">
+ {tracks.map(({ id, source, target }) => (
+ <Track key={id} source={source} target={target} disabled={false} getTrackProps={getTrackProps} />
+ ))}
+ </div>
+ )}
+ </Tracks>
+ <Ticks count={5}>
+ {({ ticks }) => (
+ <div className="slider-ticks">
+ {ticks.map(tick => (
+ <Tick key={tick.id} tick={tick} count={ticks.length} format={(val: number) => val.toString()} />
+ ))}
+ </div>
+ )}
+ </Ticks>
+ </Slider>
+ )
+ }
+
+
+
// case 'range'
// return <Slider ...
// return <slider domain={renderInfo.domain}> domain is number[] for min and max
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index 578ee1caa..d07028ec2 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -1414,11 +1414,10 @@ export namespace Doc {
prevLayout === 'icon' && (doc.deiconifyLayout = undefined);
doc.layout_fieldKey = deiconify || 'layout';
}
- export function setDocRangeFilter(container: Opt<Doc>, key: string, range?: number[]) {
+ export function setDocRangeFilter(container: Opt<Doc>, key: string, range?: readonly number[]) {
if (!container) return;
const childFiltersByRanges = Cast(container._childFiltersByRanges, listSpec('string'), []);
- console.log("hellllloooooooooooooooooooooooooo " + childFiltersByRanges.length)
for (let i = 0; i < childFiltersByRanges.length; i += 3) {
console.log("inside if statement")
if (childFiltersByRanges[i] === key) {
@@ -1441,7 +1440,6 @@ export namespace Doc {
// all documents with the specified value for the specified key are included/excluded
// based on the modifiers :"check", "x", undefined
export function setDocFilter(container: Opt<Doc>, key: string, value: any, modifiers: 'remove' | 'match' | 'check' | 'x' | 'exists' | 'unset', toggle?: boolean, fieldPrefix?: string, append: boolean = true) {
- console.log("in setDocFilter: key "+ key + "value " + value)
if (!container) return;
const filterField = '_' + (fieldPrefix ? fieldPrefix + '_' : '') + 'childFilters';
const childFilters = StrListCast(container[filterField]);