aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/views/collections/CollectionPivotView.scss36
-rw-r--r--src/client/views/collections/CollectionPivotView.tsx22
-rw-r--r--src/client/views/collections/CollectionSubView.tsx29
-rw-r--r--src/client/views/collections/collectionFreeForm/CollectionFreeFormLayoutEngines.tsx2
-rw-r--r--src/new_fields/Doc.ts4
5 files changed, 75 insertions, 18 deletions
diff --git a/src/client/views/collections/CollectionPivotView.scss b/src/client/views/collections/CollectionPivotView.scss
index 2ddcc97ea..505091e98 100644
--- a/src/client/views/collections/CollectionPivotView.scss
+++ b/src/client/views/collections/CollectionPivotView.scss
@@ -2,12 +2,14 @@
display: flex;
flex-direction: row;
position: absolute;
- height:100%;
- width:100%;
+ height: 100%;
+ width: 100%;
+
.collectionPivotView-flyout {
width: 400px;
height: 300px;
display: inline-block;
+
.collectionPivotView-flyout-item {
background-color: lightgray;
text-align: left;
@@ -17,43 +19,61 @@
}
}
+ .pivotKeyEntry {
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ z-index: 10;
+ pointer-events: all;
+ padding: 5px;
+ border: 1px solid black;
+ }
+
.collectionPivotView-treeView {
- display:flex;
+ display: flex;
flex-direction: column;
width: 200px;
height: 100%;
+
.collectionPivotView-addfacet {
- display:inline-block;
+ display: inline-block;
width: 200px;
height: 30px;
background: darkGray;
text-align: center;
+
.collectionPivotView-button {
align-items: center;
display: flex;
width: 100%;
height: 100%;
+
.collectionPivotView-span {
margin: auto;
}
}
- > div, > div > div {
+
+ >div,
+ >div>div {
width: 100%;
height: 100%;
text-align: center;
}
}
+
.collectionPivotView-tree {
- display:inline-block;
+ display: inline-block;
width: 100%;
height: calc(100% - 30px);
}
}
+
.collectionPivotView-pivot {
- display:inline-block;
+ display: inline-block;
width: calc(100% - 200px);
height: 100%;
}
+
.collectionPivotView-dragger {
background-color: lightgray;
height: 40px;
@@ -63,6 +83,6 @@
top: 55%;
border: 1px black solid;
z-index: 2;
- left:-10px;
+ left: -10px;
}
} \ No newline at end of file
diff --git a/src/client/views/collections/CollectionPivotView.tsx b/src/client/views/collections/CollectionPivotView.tsx
index a44f990e1..98fc54b3b 100644
--- a/src/client/views/collections/CollectionPivotView.tsx
+++ b/src/client/views/collections/CollectionPivotView.tsx
@@ -16,6 +16,8 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { List } from "../../../new_fields/List";
import { Set } from "typescript-collections";
import { PrefetchProxy } from "../../../new_fields/Proxy";
+import { EditableView } from "../EditableView";
+import { listSpec } from "../../../new_fields/Schema";
@observer
export class CollectionPivotView extends CollectionSubView(doc => doc) {
@@ -76,6 +78,13 @@ export class CollectionPivotView extends CollectionSubView(doc => doc) {
const found = DocListCast(facetCollection.data).findIndex(doc => doc.title === facetHeader);
if (found !== -1) {
(facetCollection.data as List<Doc>).splice(found, 1);
+ const docFilter = Cast(this.props.Document._docFilter, listSpec("string"));
+ if (docFilter) {
+ let index: number;
+ while ((index = docFilter.findIndex(item => item === facetHeader)) !== -1) {
+ docFilter.splice(index, 3);
+ }
+ }
} else {
const newFacet = Docs.Create.TreeDocument([], { title: facetHeader, treeViewOpen: true, isFacetFilter: true });
const capturedVariables = { layoutDoc: this.props.Document, dataDoc: this.dataDoc };
@@ -129,6 +138,19 @@ export class CollectionPivotView extends CollectionSubView(doc => doc) {
);
return !facetCollection ? (null) :
<div className="collectionPivotView">
+ <div className={"pivotKeyEntry"}>
+ <EditableView
+ contents={this.props.Document.pivotField}
+ GetValue={() => StrCast(this.props.Document.pivotField)}
+ SetValue={value => {
+ if (value && value.length) {
+ this.props.Document.pivotField = value;
+ return true;
+ }
+ return false;
+ }}
+ />
+ </div>
<div className="collectionPivotView-dragger" key="dragger" onPointerDown={this.onPointerDown} style={{ transform: `translate(${this._facetWidth}px, 0px)` }} >
<span title="library View Dragger" style={{ width: "5px", position: "absolute", top: "0" }} />
</div>
diff --git a/src/client/views/collections/CollectionSubView.tsx b/src/client/views/collections/CollectionSubView.tsx
index db3fde797..b96b86929 100644
--- a/src/client/views/collections/CollectionSubView.tsx
+++ b/src/client/views/collections/CollectionSubView.tsx
@@ -109,15 +109,30 @@ export function CollectionSubView<T>(schemaCtor: (doc: Doc) => T) {
const viewSpecScript = Cast(this.props.Document.viewSpecScript, ScriptField);
const viewedDocs = viewSpecScript ? docs.filter(d => viewSpecScript.script.run({ doc: d }, console.log).result) : docs;
const docFilters = Cast(this.props.Document._docFilter, listSpec("string"), []);
+ const clusters: { [key: string]: { [value: string]: string } } = {};
+ for (let i = 0; i < docFilters.length; i += 3) {
+ const [key, value, modifiers] = docFilters.slice(i, i + 3);
+ const cluster = clusters[key];
+ if (!cluster) {
+ const child: { [value: string]: string } = {};
+ child[value] = modifiers;
+ clusters[key] = child;
+ } else {
+ cluster[value] = modifiers;
+ }
+ }
const filteredDocs = docFilters.length ? viewedDocs.filter(d => {
- let result = false;
- for (let i = 0; i < docFilters.length; i += 3) {
- const key = docFilters[i];
- const value = docFilters[i + 1];
- const modifiers = docFilters[i + 2];
- result = result || ((modifiers === "x") !== Doc.matchFieldValue(d, key, value));
+ for (const key of Object.keys(clusters)) {
+ const cluster = clusters[key];
+ const satisfiesFacet = Object.keys(cluster).some(inner => {
+ const modifier = cluster[inner];
+ return (modifier === "x") !== Doc.matchFieldValue(d, key, inner);
+ });
+ if (!satisfiesFacet) {
+ return false;
+ }
}
- return result;
+ return true;
}) : viewedDocs;
return filteredDocs;
}
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormLayoutEngines.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormLayoutEngines.tsx
index 09ee3255d..be1317b25 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormLayoutEngines.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormLayoutEngines.tsx
@@ -59,7 +59,7 @@ export function computePivotLayout(poolData: ObservableMap<string, any>, pivotDo
let numCols = NumCast(pivotDoc.pivotNumColumns, Math.ceil(Math.sqrt(minSize)));
const docMap = new Map<Doc, ViewDefBounds>();
const groupNames: PivotData[] = [];
- numCols = Math.min(panelDim[0] / pivotAxisWidth, numCols)
+ numCols = Math.min(panelDim[0] / pivotAxisWidth, numCols);
const expander = 1.05;
const gap = .15;
diff --git a/src/new_fields/Doc.ts b/src/new_fields/Doc.ts
index cc146a121..41a9dddf2 100644
--- a/src/new_fields/Doc.ts
+++ b/src/new_fields/Doc.ts
@@ -761,7 +761,7 @@ export namespace Doc {
return vals.some(v => v === value);
}
const fieldStr = Field.toString(fieldVal as Field);
- return fieldStr == value;
+ return fieldStr === value;
}
}
@@ -791,7 +791,7 @@ Scripting.addGlobal(function setDocFilter(container: Doc, key: string, value: an
}
if (modifiers !== undefined) {
docFilters.push(key);
- docFilters.push(value)
+ docFilters.push(value);
docFilters.push(modifiers);
container._docFilter = new List<string>(docFilters);
}