aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/documents/Documents.ts7
-rw-r--r--src/client/views/FilterPanel.scss34
-rw-r--r--src/client/views/FilterPanel.tsx143
-rw-r--r--src/client/views/PropertiesView.scss11
-rw-r--r--src/client/views/PropertiesView.tsx5
-rw-r--r--src/fields/Doc.ts1
6 files changed, 178 insertions, 23 deletions
diff --git a/src/client/documents/Documents.ts b/src/client/documents/Documents.ts
index 8eeceaa15..5d7ca6f6d 100644
--- a/src/client/documents/Documents.ts
+++ b/src/client/documents/Documents.ts
@@ -96,7 +96,7 @@ class NumInfo extends FInfo {
class StrInfo extends FInfo {
fieldType? = 'string';
values?: string[] = [];
- constructor(d: string, readOnly?: boolean, values?: string[]) {
+ constructor(d: string, readOnly?: boolean, values?: string[], filterable?:boolean) {
super(d, readOnly);
this.values = values;
}
@@ -138,9 +138,14 @@ class DateInfo extends FInfo {
fieldType? = 'date';
values?: DateField[] = [];
}
+class ListInfo extends FInfo {
+ fieldType? = 'list';
+ values?: List<any>[] = [];
+}
type BOOLt = BoolInfo | boolean;
type NUMt = NumInfo | number;
type STRt = StrInfo | string;
+type LISTt = ListInfo | List<any>;
type DOCt = DocInfo | Doc;
type DIMt = DimInfo | typeof DimUnit.Pixel | typeof DimUnit.Ratio;
type PEVt = PEInfo | 'none' | 'all';
diff --git a/src/client/views/FilterPanel.scss b/src/client/views/FilterPanel.scss
index 4f0460659..78e7904b8 100644
--- a/src/client/views/FilterPanel.scss
+++ b/src/client/views/FilterPanel.scss
@@ -135,7 +135,7 @@
.filterBox-addFilter {
width: 120px;
- background-color: #e9e9e9;
+ backgroundcolor: #e9e9e9;
border-radius: 12px;
padding: 5px;
margin: 5px;
@@ -188,6 +188,8 @@
margin-bottom: 10px;
margin-left: 5px;
overflow: auto;
+
+
}
}
@@ -199,14 +201,36 @@
// float:right;
.filterBox-facetHeader-collapse{
- float: right;
- justify-items: right;
- align-items: flex-end;
+ // float: right;
+ // justify-items: right;
+ // align-items: flex-end;
margin-left: auto;
- margin-right: 9px;
+ // margin-right: 9px;
+
+ float: right;
+ font-size: 16;
+ }
+
+ .filterBox-facetHeader-remove{
+ // margin-left: auto;
+ float: right;
+ font-size: 16;
+ font-weight:bold;
}
+
+
}
+.filterbox-collpasedAndActive{
+ // left:100px;
+ text-indent: 18px;
+ // background-color: pink;
+ font-size: 12px;
+ font-weight: bold;
+
+}
+
+
diff --git a/src/client/views/FilterPanel.tsx b/src/client/views/FilterPanel.tsx
index 68d29942b..ccd5253ff 100644
--- a/src/client/views/FilterPanel.tsx
+++ b/src/client/views/FilterPanel.tsx
@@ -11,12 +11,15 @@ import './FilterPanel.scss';
import { FieldView } from './nodes/FieldView';
import { SearchBox } from './search/SearchBox';
import { undoable } from '../util/UndoManager';
-import { AiOutlineMinusSquare } from 'react-icons/ai';
+import { AiOutlineMinusSquare, AiOutlinePlusSquare } from 'react-icons/ai';
import { CiCircleRemove } from 'react-icons/ci';
+//slight bug when you don't click on background canvas before creating filter and the you click on the canvas
+
interface filterProps {
rootDoc: Doc;
}
+
@observer
export class FilterPanel extends React.Component<filterProps> {
public static LayoutString(fieldKey: string) {
@@ -102,18 +105,32 @@ export class FilterPanel extends React.Component<filterProps> {
return { strings: Array.from(valueSet.keys()), rtFields };
}
+
+
public removeFilter = (filterName: string) => {
Doc.setDocFilter(this.targetDoc, filterName, undefined, 'remove');
Doc.setDocRangeFilter(this.targetDoc, filterName, undefined);
};
@observable _chosenFacets = new ObservableMap<string, 'text' | 'checkbox' | 'slider' | 'range'>();
+ @observable _chosenFacetsCollapse = new ObservableMap<string, boolean>();
+ @observable _currentActiveFilters = new ObservableMap<string, string>();
+ @observable _collapseReturnKeys = new Array();
+
+ // @computed get _currentActiveFilters(){
+ // return StrListCast(this.targetDoc.docFilters).map()
+ // }
+
+ // let returnKeys = [];
+
@computed get activeFacets() {
+ // console.log("chosen collpase " + this._chosenFacetsCollapse)
const facets = new Map<string, 'text' | 'checkbox' | 'slider' | 'range'>(this._chosenFacets);
StrListCast(this.targetDoc?._childFilters).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;
}
+
/**
* Responds to clicking the check box in the flyout menu
*/
@@ -138,11 +155,71 @@ export class FilterPanel extends React.Component<filterProps> {
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) {
+
+ // const ranged = Doc.readDocRangeFilter(targetDoc, facetHeader);
+ // 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];
+ // const scriptText = `setDocRangeFilter(this?.target, "${facetHeader}", range)`;
+
+ // 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)
};
+
+ @action
+ sortingCurrentFacetValues = (facetHeader:string) => {
+
+ this._collapseReturnKeys.splice(0)
+
+ for (var key of this.facetValues(facetHeader)){
+ console.log("key : " + key )
+ if (this._currentActiveFilters.get(key)){
+ this._collapseReturnKeys.push(key)
+ }}
+ // return "hello"
+
+ return (<div className = " filterbox-collpasedAndActive">
+
+ {this._collapseReturnKeys.join(', ') }
+ {/* .toString()} */}
+ </div>)
+
+
+ }
+
+
+
+
facetValues = (facetHeader: string) => {
const allCollectionDocs = new Set<Doc>();
SearchBox.foreachRecursiveDoc(this.targetDocChildren, (depth: number, doc: Doc) => allCollectionDocs.add(doc));
@@ -167,10 +244,10 @@ export class FilterPanel extends React.Component<filterProps> {
return nonNumbers / facetValues.length > 0.1 ? facetValues.sort() : facetValues.sort((n1: string, n2: string) => Number(n1) - Number(n2));
};
+
render() {
const options = this._allFacets.filter(facet => this.currentFacets.indexOf(facet) === -1).map(facet => ({ value: facet, label: facet }));
- console.log("this is option " + options)
- console.log("this is alll facets " + this._allFacets)
+
return (
<div className="filterBox-treeView">
<div className="filterBox-select">
@@ -196,15 +273,41 @@ export class FilterPanel extends React.Component<filterProps> {
<div className = "filterBox-facetHeader-Header"> </div>
{facetHeader.charAt(0).toUpperCase() + facetHeader.slice(1)}
- <div className = "filterBox-facetHeader-collapse">
- <AiOutlineMinusSquare/>
- {/* <CiCircleRemove/> */}
- </div>
-
+ {/* <div className = "filterBox-facetHeader-collapse"> */}
+ <div className = "filterBox-facetHeader-collapse"
+ onClick = {action((e) => {
+ const collapseBoolValue = this._chosenFacetsCollapse.get(facetHeader)
+ this._chosenFacetsCollapse.set(facetHeader, !collapseBoolValue )})}>
+
+ {this._chosenFacetsCollapse.get(facetHeader) ? <AiOutlinePlusSquare/> : <AiOutlineMinusSquare/> }
+
+ </div>
+
+ <div className='filterBox-facetHeader-remove'
+ onClick = {action((e) => {
+ for (var key of this.facetValues(facetHeader)){
+ if (this._currentActiveFilters.get(key)){
+ Doc.setDocFilter(this.targetDoc, facetHeader, key, 'remove')
+ this._currentActiveFilters.delete(key)
+ }}
+
+ this.activeFacets.delete(facetHeader)
+ this._chosenFacets.delete(facetHeader)
+ this._chosenFacetsCollapse.delete(facetHeader)
+
+ })} >
+
+ <CiCircleRemove/> </div>
+ {/* </div> */}
+
</div>
-
- {this.displayFacetValueFilterUIs(this.activeFacets.get(facetHeader), facetHeader)}
+ { this._chosenFacetsCollapse.get(facetHeader) ?
+ // <div className = 'filterbox-collpasedAndActive' style={{backgroundColor: 'yellow', fontSize: 50}} > {this.sortingCurrentFacetValues(facetHeader)} </div> && this._collapseReturnKeys.splice(0)
+ this.sortingCurrentFacetValues(facetHeader)
+ // && this._collapseReturnKeys.splice(0)
+ : this.displayFacetValueFilterUIs(this.activeFacets.get(facetHeader), facetHeader) }
+ {/* */}
</div>
))}
</div>
@@ -227,19 +330,26 @@ export class FilterPanel extends React.Component<filterProps> {
/>
);
case 'checkbox':
+
return this.facetValues(facetHeader).map(fval => {
const facetValue = fval;
return (
<div>
<input
style={{ width: 20, marginLeft: 20 }}
- checked={
- StrListCast(this.targetDoc._childFilters)
- .find(filter => filter.split(Doc.FilterSep)[0] === facetHeader && filter.split(Doc.FilterSep)[1] == facetValue)
- ?.split(Doc.FilterSep)[2] === 'check'
+ checked={
+ StrListCast(this.targetDoc._childFilters)
+ .find(filter => filter.split(Doc.FilterSep)[0] === facetHeader && filter.split(Doc.FilterSep)[1] == facetValue)
+ ?.split(Doc.FilterSep)[2] === 'check'
+
}
type={type}
- onChange={undoable(e => Doc.setDocFilter(this.targetDoc, facetHeader, fval, e.target.checked ? 'check' : 'remove'), 'set filter')}
+ onChange={undoable(e => Doc.setDocFilter(this.targetDoc, facetHeader, fval, e.target.checked ? 'check' : 'remove'), 'set filter')}
+ onClick={undoable (e =>
+ e.target.checked ? this._currentActiveFilters.set(fval, facetHeader) : this._currentActiveFilters.delete(fval) , 'set filter'
+ ) }
+
+
/>
{facetValue}
</div>
@@ -248,3 +358,6 @@ export class FilterPanel extends React.Component<filterProps> {
}
}
}
+
+
+// NEED TO LEARN HOW TO RESET FILTERS WHEN WEBPAGE IS RELOADED \ No newline at end of file
diff --git a/src/client/views/PropertiesView.scss b/src/client/views/PropertiesView.scss
index b79486167..f7dc1dc68 100644
--- a/src/client/views/PropertiesView.scss
+++ b/src/client/views/PropertiesView.scss
@@ -26,6 +26,17 @@
padding: 5px 10px;
}
+ .propertiesView-propAndInfoGrouping{
+ display: flex;
+ }
+
+ .propertiesView-info{
+ margin-top: 20;
+ margin-right: 10;
+ float: right;
+ font-size: 20;
+ }
+
.propertiesView-sharing {
//border-bottom: 1px solid black;
diff --git a/src/client/views/PropertiesView.tsx b/src/client/views/PropertiesView.tsx
index 27b9c3c7a..35ca5dea4 100644
--- a/src/client/views/PropertiesView.tsx
+++ b/src/client/views/PropertiesView.tsx
@@ -587,7 +587,8 @@ export class PropertiesView extends React.Component<PropertiesViewProps> {
return (
<div>
- <div className = "propertiesView-wordType">Type</div>
+ Type
+ {/* <div className = "propertiesView-wordType">Type</div> */}
<div className= "currentType">
<div className='currentType-icon'>
{this.currentComponent}
@@ -1727,7 +1728,7 @@ export class PropertiesView extends React.Component<PropertiesViewProps> {
<div className="propertiesView-title" style={{ width: this.props.width }}>
Properties
</div>
- <div className = "propertiesView-info" onClick={() => window.open('https://brown-dash.github.io/Dash-Documentation/')}>
+ <div className = "propertiesView-info" onClick={() => window.open('https://brown-dash.github.io/Dash-Documentation//properties/')}>
<GrCircleInformation/> </div>
</div>
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index ad557e079..203f455db 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -1437,6 +1437,7 @@ 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]);