aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/views/PropertiesView.scss62
-rw-r--r--src/client/views/PropertiesView.tsx107
-rw-r--r--src/client/views/nodes/FilterBox.scss34
-rw-r--r--src/client/views/nodes/FilterBox.tsx182
-rw-r--r--src/fields/Doc.ts6
5 files changed, 240 insertions, 151 deletions
diff --git a/src/client/views/PropertiesView.scss b/src/client/views/PropertiesView.scss
index 1365725cb..134c50972 100644
--- a/src/client/views/PropertiesView.scss
+++ b/src/client/views/PropertiesView.scss
@@ -157,6 +157,67 @@
}
}
+ .propertiesView-filters {
+ //border-bottom: 1px solid black;
+ //padding: 8.5px;
+
+ .propertiesView-filters-title {
+ font-weight: bold;
+ font-size: 12.5px;
+ padding: 4px;
+ display: flex;
+ color: white;
+ padding-left: 8px;
+ background-color: rgb(51, 51, 51);
+
+ &:hover {
+ cursor: pointer;
+ }
+
+ .propertiesView-filters-title-icon {
+ float: right;
+ justify-items: right;
+ align-items: flex-end;
+ margin-left: auto;
+ margin-right: 9px;
+
+ &:hover {
+ cursor: pointer;
+ }
+ }
+ }
+
+ .propertiesView-filters-content {
+ font-size: 10px;
+ padding: 10px;
+ margin-left: 5px;
+ max-height: 40%;
+ overflow-y: auto;
+
+ .propertiesView-buttonContainer {
+ float: right;
+ display: flex;
+
+ button {
+ width: 15;
+ height: 15;
+ padding: 0;
+ margin-top: -5;
+ }
+ }
+
+ button {
+ width: 5;
+ height: 5;
+ }
+
+ input {
+ width: 100%;
+ }
+ }
+ }
+
+
.propertiesView-appearance {
//border-bottom: 1px solid black;
//padding: 8.5px;
@@ -332,6 +393,7 @@
}
}
}
+
.propertiesView-fields {
//border-bottom: 1px solid black;
//padding: 8.5px;
diff --git a/src/client/views/PropertiesView.tsx b/src/client/views/PropertiesView.tsx
index ae6c7c50c..388b688cd 100644
--- a/src/client/views/PropertiesView.tsx
+++ b/src/client/views/PropertiesView.tsx
@@ -2,10 +2,10 @@ import React = require("react");
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { Checkbox, Tooltip } from "@material-ui/core";
import { intersection } from "lodash";
-import { action, computed, observable } from "mobx";
+import { action, autorun, computed, Lambda, observable, reaction, runInAction } from "mobx";
import { observer } from "mobx-react";
import { ColorState, SketchPicker } from "react-color";
-import { AclAddonly, AclAdmin, AclEdit, AclPrivate, AclReadonly, AclSym, AclUnset, DataSym, Doc, Field, HeightSym, WidthSym } from "../../fields/Doc";
+import { AclAddonly, AclAdmin, AclEdit, AclPrivate, AclReadonly, AclSym, AclUnset, DataSym, Doc, Field, HeightSym, Opt, WidthSym } from "../../fields/Doc";
import { Id } from "../../fields/FieldSymbols";
import { InkField } from "../../fields/InkField";
import { ComputedField } from "../../fields/ScriptField";
@@ -29,6 +29,7 @@ import { PropertiesButtons } from "./PropertiesButtons";
import { PropertiesDocContextSelector } from "./PropertiesDocContextSelector";
import "./PropertiesView.scss";
import { DefaultStyleProvider, FilteringStyleProvider } from "./StyleProvider";
+import { CurrentUserUtils } from "../util/CurrentUserUtils";
import { FilterBox } from "./nodes/FilterBox";
const higflyout = require("@hig/flyout");
export const { anchorPoints } = higflyout;
@@ -48,6 +49,9 @@ export class PropertiesView extends React.Component<PropertiesViewProps> {
@computed get MAX_EMBED_HEIGHT() { return 200; }
@computed get selectedDoc() { return SelectionManager.SelectedSchemaDoc() || this.selectedDocumentView?.rootDoc; }
+ @computed get filterDoc() {
+ return FilterBox._filterScope === "Current Collection" ? this.selectedDoc || CollectionDockingView.Instance.props.Document : CollectionDockingView.Instance.props.Document;
+ }
@computed get selectedDocumentView() {
if (SelectionManager.Views().length) return SelectionManager.Views()[0];
if (PresBox.Instance?._selectedArray.size) return DocumentManager.Instance.getDocumentView(PresBox.Instance.rootDoc);
@@ -68,7 +72,9 @@ export class PropertiesView extends React.Component<PropertiesViewProps> {
@observable openContexts: boolean = true;
@observable openAppearance: boolean = true;
@observable openTransform: boolean = true;
- @observable openFilters: boolean = true;
+ @observable openFilters: boolean = true; // should be false
+
+ private selectedDocListenerDisposer: Opt<Lambda>;
// @observable selectedUser: string = "";
// @observable addButtonPressed: boolean = false;
@@ -84,6 +90,15 @@ export class PropertiesView extends React.Component<PropertiesViewProps> {
@observable _controlBtn: boolean = false;
@observable _lock: boolean = false;
+ componentDidMount() {
+ this.selectedDocListenerDisposer?.();
+ this.selectedDocListenerDisposer = autorun(() => this.openFilters && this.selectedDoc && this.checkFilterDoc());
+ }
+
+ componentWillUnmount() {
+ this.selectedDocListenerDisposer?.();
+ }
+
@computed get isInk() { return this.selectedDoc?.type === DocumentType.INK; }
rtfWidth = () => {
@@ -885,44 +900,63 @@ export class PropertiesView extends React.Component<PropertiesViewProps> {
</div>;
}
+ checkFilterDoc() {
+ if (this.filterDoc.type === DocumentType.COL && !this.filterDoc.currentFilter) CurrentUserUtils.setupFilterDocs(this.filterDoc!);
+ }
+
+ saveFilter = () => {
+ this.filterDoc.currentFilter = undefined;
+ CurrentUserUtils.setupFilterDocs(this.filterDoc);
+ }
+
+ myFiltersSelect = (doc: Doc) => {
+ this.filterDoc.currentFilter = doc;
+ }
+
@computed get filtersSubMenu() {
- return <div className="propertiesView-sharing">
- <div className="propertiesView-sharing-title"
+ return <div className="propertiesView-filters">
+ <div className="propertiesView-filters-title"
onPointerDown={action(() => this.openFilters = !this.openFilters)}
style={{ backgroundColor: this.openFilters ? "black" : "" }}>
Filters
- <div className="propertiesView-sharing-title-icon">
+ <div className="propertiesView-filters-title-icon">
<FontAwesomeIcon icon={this.openFilters ? "caret-down" : "caret-right"} size="lg" color="white" />
</div>
</div>
- {!this.openFilters ? (null) :
- <div className="propertiesView-sharing-content">
- <DocumentView
- Document={Doc.UserDoc().currentFilter as any as Doc}
- DataDoc={undefined}
- addDocument={undefined}
- addDocTab={returnFalse}
- pinToPres={emptyFunction}
- rootSelected={returnTrue}
- removeDocument={returnFalse}
- ScreenToLocalTransform={this.getTransform}
- PanelWidth={this.docWidth}
- PanelHeight={this.docHeight}
- renderDepth={0}
- scriptContext={CollectionDockingView.Instance.props.Document}
- focus={emptyFunction}
- styleProvider={DefaultStyleProvider}
- parentActive={returnTrue}
- whenActiveChanged={emptyFunction}
- bringToFront={emptyFunction}
- docFilters={returnEmptyFilter}
- docRangeFilters={returnEmptyFilter}
- searchFilterDocs={returnEmptyDoclist}
- ContainingCollectionView={undefined}
- ContainingCollectionDoc={undefined}
- />
- </div>}
- </div>;
+ {
+ !this.openFilters || !this.filterDoc.currentFilter ? (null) :
+ <div className="propertiesView-filters-content">
+ <DocumentView
+ Document={this.filterDoc.currentFilter as Doc}
+ DataDoc={undefined}
+ addDocument={undefined}
+ addDocTab={returnFalse}
+ pinToPres={emptyFunction}
+ rootSelected={returnTrue}
+ removeDocument={returnFalse}
+ ScreenToLocalTransform={this.getTransform}
+ PanelWidth={this.docWidth}
+ PanelHeight={this.docHeight}
+ renderDepth={0}
+ scriptContext={this.filterDoc.currentFilter as Doc}
+ focus={emptyFunction}
+ styleProvider={DefaultStyleProvider}
+ parentActive={returnTrue}
+ whenActiveChanged={emptyFunction}
+ bringToFront={emptyFunction}
+ docFilters={returnEmptyFilter}
+ docRangeFilters={returnEmptyFilter}
+ searchFilterDocs={returnEmptyDoclist}
+ ContainingCollectionView={undefined}
+ ContainingCollectionDoc={undefined}
+ filterSaveCallback={this.saveFilter}
+ myFiltersCallback={this.myFiltersSelect}
+ docViewPath={returnEmptyDoclist}
+ layerProvider={undefined}
+ />
+ </div>
+ }
+ </div >;
}
@computed get inkSubMenu() {
@@ -1022,7 +1056,6 @@ export class PropertiesView extends React.Component<PropertiesViewProps> {
// }
render() {
- // console.log(this.props.width);
if (!this.selectedDoc && !this.isPres) {
return <div className="propertiesView" style={{ width: this.props.width }}>
<div className="propertiesView-title" style={{ width: this.props.width }}>
@@ -1047,6 +1080,8 @@ export class PropertiesView extends React.Component<PropertiesViewProps> {
{this.sharingSubMenu}
+ {this.selectedDoc.type === DocumentType.COL && this.filtersSubMenu}
+
{this.inkSubMenu}
{this.fieldsSubMenu}
@@ -1054,8 +1089,6 @@ export class PropertiesView extends React.Component<PropertiesViewProps> {
{this.contextsSubMenu}
{this.layoutSubMenu}
-
- {this.filtersSubMenu}
</div>;
}
if (this.isPres) {
diff --git a/src/client/views/nodes/FilterBox.scss b/src/client/views/nodes/FilterBox.scss
index b1b3c0f25..4fe1fa2eb 100644
--- a/src/client/views/nodes/FilterBox.scss
+++ b/src/client/views/nodes/FilterBox.scss
@@ -28,15 +28,15 @@
}
// .filterBox-bottom {
- // // position: fixed;
- // // bottom: 0;
- // // width: 100%;
- // }
+// // position: fixed;
+// // bottom: 0;
+// // width: 100%;
+// }
.filterBox-select {
- width: 90%;
+ // width: 90%;
margin-top: 5px;
- margin-bottom: 15px;
+ // margin-bottom: 15px;
}
@@ -64,20 +64,6 @@
}
-.filterBox-title {
-
- justify-content: center;
- text-align: center;
- padding-bottom: 13px;
- font-size: 20px;
- font-weight: bold;
-
- .filterBox-span {
- margin-right: 15px;
- }
-
-}
-
.filterBox-select-scope,
.filterBox-select-bool,
.filterBox-addWrapper,
@@ -112,6 +98,14 @@
border-bottom: 2px solid black;
}
+.filterBox-title {
+ font-size: 15;
+ // border: 2px solid black;
+ width: 100%;
+ align-self: center;
+ text-align: center;
+ background-color: #d3d3d3;
+}
.filterBox-select-bool {
margin-top: 6px;
diff --git a/src/client/views/nodes/FilterBox.tsx b/src/client/views/nodes/FilterBox.tsx
index ec77775be..987939d65 100644
--- a/src/client/views/nodes/FilterBox.tsx
+++ b/src/client/views/nodes/FilterBox.tsx
@@ -1,8 +1,8 @@
import React = require("react");
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { action, computed } from "mobx";
+import { action, computed, observable, runInAction } from "mobx";
import { observer } from "mobx-react";
-import { DataSym, Doc, DocListCast, Field, Opt } from "../../../fields/Doc";
+import { DataSym, Doc, DocListCast, DocListCastAsync, Field, Opt } from "../../../fields/Doc";
import { documentSchema } from "../../../fields/documentSchemas";
import { List } from "../../../fields/List";
import { RichTextField } from "../../../fields/RichTextField";
@@ -30,22 +30,30 @@ import { UserOptions } from "../../util/GroupManager";
import { DocumentViewProps } from "./DocumentView";
import { DefaultStyleProvider, StyleProp } from "../StyleProvider";
import { CollectionViewType } from "../collections/CollectionView";
+import { CurrentUserUtils } from "../../util/CurrentUserUtils";
type FilterBoxDocument = makeInterface<[typeof documentSchema]>;
const FilterBoxDocument = makeInterface(documentSchema);
@observer
export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDocument>(FilterBoxDocument) {
+
+ static Instance: FilterBox;
+
constructor(props: Readonly<FieldViewProps>) {
super(props);
+ FilterBox.Instance = this;
+ if (!CollectionDockingView.Instance.props.Document.currentFilter) CurrentUserUtils.setupFilterDocs(CollectionDockingView.Instance.props.Document);
}
public static LayoutString(fieldKey: string) { return FieldView.LayoutString(FilterBox, fieldKey); }
public _filterBoolean = "AND";
- public _filterScope = "Current Dashboard";
+ public static _filterScope = "Current Dashboard";
public _filterSelected = false;
public _filterMatch = "matched";
- private myFiltersRef = React.createRef<HTMLDivElement>();
+ // private myFiltersRef = React.createRef<HTMLDivElement>();
+
+ @observable private showFilterDialog = false;
@computed get allDocs() {
const allDocs = new Set<Doc>();
@@ -112,10 +120,12 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
return { strings: Array.from(valueSet.keys()), rtFields };
}
- public static removeFilter = (filterName: string) => {
+ public removeFilter = (filterName: string) => {
console.log("remove filter");
- const targetDoc = SelectionManager.Views()[0].Document; // CollectionDockingView.Instance.props.Document;
- const filterDoc = Doc.UserDoc().currentFilter as any as Doc;
+ const targetDoc = FilterBox._filterScope === "Current Collection" ? SelectionManager.Views()[0].Document || CollectionDockingView.Instance.props.Document : CollectionDockingView.Instance.props.Document;
+ // const targetDoc = SelectionManager.Views()[0].props.Document;
+ // const targetDoc = SelectionManager.Views()[0].Document; // CollectionDockingView.Instance.props.Document;
+ const filterDoc = targetDoc.currentFilter as Doc;
const attributes = DocListCast(filterDoc["data"]);
const found = attributes.findIndex(doc => doc.title === filterName);
if (found !== -1) {
@@ -145,7 +155,8 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
console.log("facetClick: " + facetHeader);
console.log(this.props.fieldKey);
- const targetDoc = SelectionManager.Views()[0].Document; // CollectionDockingView.Instance.props.Document;
+ const targetDoc = FilterBox._filterScope === "Current Collection" ? SelectionManager.Views()[0].Document || CollectionDockingView.Instance.props.Document : CollectionDockingView.Instance.props.Document;
+ // const targetDoc = SelectionManager.Views()[0].props.Document;
const found = this.activeAttributes.findIndex(doc => doc.title === facetHeader);
if (found !== -1) {
// (this.dataDoc[this.props.fieldKey] as List<Doc>).splice(found, 1);
@@ -164,7 +175,7 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
// }
// }
} else {
- const allCollectionDocs = DocListCast((targetDoc.data as any)[0].data);
+ // const allCollectionDocs = DocListCast((targetDoc.data as any)[0].data);
const facetValues = this.gatherFieldValues(targetDoc, facetHeader);
let nonNumbers = 0;
@@ -179,7 +190,7 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
}
});
let newFacet: Opt<Doc>;
- if (facetHeader === "text" || facetValues.rtFields / allCollectionDocs.length > 0.1) {
+ if (facetHeader === "text") {//} || facetValues.rtFields / allCollectionDocs.length > 0.1) {
newFacet = Docs.Create.TextDocument("", { _width: 100, _height: 25, system: true, _stayInCollection: true, _hideContextMenu: true, treeViewExpandedView: "layout", title: facetHeader, treeViewOpen: true, forceActive: true, ignoreClick: true });
Doc.GetProto(newFacet).type = DocumentType.COL; // forces item to show an open/close button instead ofa checkbox
newFacet._textBoxPadding = 4;
@@ -225,8 +236,8 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
@action
changeScope = (e: any) => {
- this._filterScope = e.currentTarget.value;
- console.log(this._filterScope);
+ FilterBox._filterScope = e.currentTarget.value;
+ console.log(FilterBox._filterScope);
}
@action
@@ -234,14 +245,9 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
this._filterMatch = e.currentTarget.value;
console.log(this._filterMatch);
}
-
- @computed get yPos() {
- return this.myFiltersRef.current?.getBoundingClientRect();
- }
-
-
+ // CHANGE SO DOCKINGVIEW HAS ITS OWN FILTERDOC
@action
- changeSelected = (e: any) => {
+ changeSelected = () => {
if (this._filterSelected) {
this._filterSelected = false;
SelectionManager.DeselectAll();
@@ -252,12 +258,6 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
console.log(this._filterSelected);
}
- saveFilter = () => {
- Doc.AddDocToList(Doc.UserDoc(), "savedFilters", this.props.Document);
- console.log("saved filter");
- console.log(Doc.UserDoc().savedFilters);
- }
-
FilteringStyleProvider(doc: Opt<Doc>, props: Opt<FieldViewProps | DocumentViewProps>, property: string) {
switch (property.split(":")[0]) {
case StyleProp.Decorations:
@@ -270,7 +270,7 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
<option value="Is Not" key="Is Not">Is Not</option>
</select>
</div>
- <div className="filterBox-treeView-close" onClick={e => FilterBox.removeFilter(StrCast(doc.title))}>
+ <div className="filterBox-treeView-close" onClick={e => this.removeFilter(StrCast(doc.title))}>
<FontAwesomeIcon icon={"times"} size="sm" />
</div>
</>;
@@ -280,45 +280,47 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
}
}
-
suppressChildClick = () => ScriptField.MakeScript("")!;
+
+ saveFilter = () => {
+ // const doc: Doc = new Doc;
+ // for (const key of Object.keys(this.props.Document)) {
+ // doc[key] = SerializationHelper.Serialize(this.props.Document[key] as Field);
+ // }
+ // console.log(doc);
+ runInAction(() => this.showFilterDialog = true);
+ console.log("saved filter");
+ }
+
+ onTitleValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+ this.props.Document.title = e.currentTarget.value || `FilterDoc for ${SelectionManager.Views()[0].Document.title}`;
+ }
+
+ onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
+ if (e.key === "Enter") {
+ runInAction(() => this.showFilterDialog = false);
+ Doc.AddDocToList(Doc.UserDoc(), "savedFilters", this.props.Document);
+ }
+ }
+
render() {
const facetCollection = this.props.Document;
- // const flyout = <div className="filterBox-flyout" style={{ width: `100%` }} onWheel={e => e.stopPropagation()}>
- // {this._allFacets.map(facet => <label className="filterBox-flyout-facet" key={`${facet}`} onClick={e => this.facetClick(facet)}>
- // <input className="filterBox-flyout-facet-check" type="checkbox" onChange={e => { }} checked={DocListCast(this.props.Document[this.props.fieldKey]).some(d => d.title === facet)} />
- // <span className="checkmark" />
- // {facet}
- // </label>)}
- // </div>;
-
- // const attributes = this.activeAttributes;
-
- // const options = this._allFacets.filter(facet => !attributes.some(attribute => attribute.title === facet)).map(facet => ({ value: facet, label: facet }));
- // const options = this._allFacets.map(facet => ({ value: facet, label: facet }));
- // console.log(this.props.Document);
- // console.log(Doc.UserDoc().currentFilter);
- console.log(this.yPos);
- console.log(this.myFiltersRef.current?.getBoundingClientRect());
-
- const flyout = <>
- <div className="nothing for now" onWheel={e => e.stopPropagation()}>
- testing flyout
- </div>
- </>;
- const options = this._allFacets.filter(facet => this.currentFacets.indexOf(facet) === -1).map(facet => ({ value: facet, label: facet }));
- return this.props.dontRegisterView ? (null) : <div className="filterBox-treeView" style={{ width: "100%" }}>
+ const flyout = DocListCast(Doc.UserDoc().savedFilters).map(doc => {
+ // console.log("mapping");
+ return <>
+ <div className="???" onWheel={e => e.stopPropagation()} style={{ height: 50, border: "2px" }} onPointerDown={() => this.props.myFiltersCallback?.(doc)}>
+ {StrCast(doc.title)}
+ </div>
+ </>;
+ }
+ );
- {/* <div className="filterBox-top"> */}
- {/* <div className="filter-bookmark">
- <FontAwesomeIcon className="filter-bookmark-icon" icon={"bookmark"} size={"lg"} />
- </div>
+ const options = this._allFacets.filter(facet => this.currentFacets.indexOf(facet) === -1).map(facet => ({ value: facet, label: facet }));
- <div className="filterBox-title">
- <span className="filterBox-span">Choose Filters</span>
- </div> */}
+ return this.props.dontRegisterView ? (null) : <div className="filterBox-treeView" style={{ width: "100%" }}>
+ <div className="filterBox-title">Current FilterDoc: {this.props.Document.title}</div>
<div className="filterBox-select-bool">
<select className="filterBox-selection" onChange={e => this.changeBool(e)}>
<option value="AND" key="AND">AND</option>
@@ -326,21 +328,22 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
</select>
<div className="filterBox-select-text">filters in </div>
<select className="filterBox-selection" onChange={e => this.changeScope(e)}>
- <option value="Current Dashboard" key="Current Dashboard">Current Dashboard</option>
- <option value="Current Tab" key="Current Tab">Current Tab</option>
- <option value="Current Collection" key="Current Collection">Current Collection</option>
+ <option value="Current Dashboard" key="Current Dashboard" selected={"Current Dashboard" === FilterBox._filterScope}>Current Dashboard</option>
+ {/* <option value="Current Tab" key="Current Tab">Current Tab</option> */}
+ <option value="Current Collection" key="Current Collection" selected={"Current Collection" === FilterBox._filterScope}>Current Collection</option>
</select>
</div>
- {/* <div className="filterBox-select-scope">
- <div className="filterBox-select-text">Scope: </div>
- <select className="filterBox-selection" onChange={e => this.changeScope(e)}>
- <option value="Current Dashboard" key="Current Dashboard">Current Dashboard</option>
- <option value="Current Tab" key="Current Tab">Current Tab</option>
- <option value="Current Collection" key="Current Collection">Current Collection</option>
- </select>
- </div> */}
- {/* </div> */}
+ <div className="filterBox-select">
+ <Select
+ placeholder="Add a filter..."
+ options={options}
+ isMulti={false}
+ onChange={val => this.facetClick((val as UserOptions).value)}
+ value={null}
+ closeMenuOnSelect={false}
+ />
+ </div>
<div className="filterBox-tree" key="tree">
<CollectionTreeView
@@ -387,21 +390,10 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
<div className="filterBox-addFilter"> + add a filter</div>
</div>
</Flyout> */}
- <div className="filterBox-select">
- <Select
- placeholder="Add a filter..."
- options={options}
- isMulti={false}
- onChange={val => this.facetClick((val as UserOptions).value)}
- value={null}
- closeMenuOnSelect={false}
- />
- </div>
-
<div className="filterBox-bottom">
<div className="filterBox-select-matched">
<input className="filterBox-select-box" type="checkbox"
- onChange={e => this.changeSelected(e)} />
+ onChange={this.changeSelected} />
<div className="filterBox-select-text">select</div>
<select className="filterBox-selection" onChange={e => this.changeMatch(e)}>
<option value="matched" key="matched">matched</option>
@@ -415,24 +407,32 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
<div className="filterBox-saveBookmark"
onPointerDown={this.saveFilter}
>
- <FontAwesomeIcon className="filterBox-saveBookmark-icon" icon={"save"} size={"sm"} />
<div>SAVE</div>
</div>
</div>
<div className="filterBox-saveWrapper">
- <div className="filterBox-saveBookmark" ref={this.myFiltersRef}>
- <FontAwesomeIcon className="filterBox-saveBookmark-icon" icon={"bookmark"} size={"sm"} />
+ <div className="filterBox-saveBookmark">
<Flyout className="myFilters-flyout" anchorPoint={anchorPoints.TOP} content={flyout}>
- <div>MY FILTERS</div>
+ <div>FILTERS</div>
</Flyout>
</div>
</div>
+ <div className="filterBox-saveWrapper">
+ <div className="filterBox-saveBookmark"
+ onPointerDown={this.props.filterSaveCallback}
+ >
+ <div>NEW</div>
+ </div>
+ </div>
</div>
- <div
- style={{ width: 200, height: 200, backgroundColor: "black", color: "white" }}
- >
- floot floot
- </div>
+ {!this.showFilterDialog ? (null) :
+ <input
+ className="filterBox-dialog-input"
+ placeholder="Enter name of filterDoc"
+ onChange={this.onTitleValueChange}
+ onKeyDown={this.onKeyDown}
+ />
+ }
</div>
</div>;
}
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index 5e9ab4baa..9b539d1b7 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -25,6 +25,7 @@ import { Cast, FieldValue, NumCast, StrCast, ToConstructor } from "./Types";
import { AudioField, ImageField, PdfField, VideoField, WebField } from "./URLField";
import { deleteProperty, GetEffectiveAcl, getField, getter, makeEditable, makeReadOnly, normalizeEmail, setter, SharingPermissions, updateFunction } from "./util";
import JSZip = require("jszip");
+import { FilterBox } from "../client/views/nodes/FilterBox";
export namespace Field {
export function toKeyValueString(doc: Doc, key: string): string {
@@ -1063,9 +1064,8 @@ 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(target: Opt<Doc>, key: string, value: any, modifiers?: "remove" | "match" | "check" | "x" | undefined) {
- // console.log(key, value, modifiers);
- const container = target ?? CollectionDockingView.Instance.props.Document;
- const docFilters = Cast(container._docFilters, listSpec("string"), []);
+ const container = target ?? FilterBox._filterScope === "Current Collection" ? SelectionManager.Views()[0].Document || CollectionDockingView.Instance.props.Document : CollectionDockingView.Instance.props.Document;
+ const docFilters = Cast(SelectionManager.Views()[0].Document._docFilters, listSpec("string"), []);
runInAction(() => {
for (let i = 0; i < docFilters.length; i++) {
const fields = docFilters[i].split(":"); // split key:value:modifier