aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/search
diff options
context:
space:
mode:
authorAndy Rickert <andrew_rickert@brown.edu>2020-08-04 22:05:30 -0400
committerAndy Rickert <andrew_rickert@brown.edu>2020-08-04 22:05:30 -0400
commite83fd812ed3798a7e7c22ad132a2f9e8dccaa76c (patch)
tree00bf6d6be5c6c40845c320dfbf3771bb823abfb5 /src/client/views/search
parenta59bcec29efb9b5ea0ba8ddfb4b9977b904c10b8 (diff)
changes
Diffstat (limited to 'src/client/views/search')
-rw-r--r--src/client/views/search/SearchBox.tsx419
-rw-r--r--src/client/views/search/SearchItem.scss186
-rw-r--r--src/client/views/search/SearchItem.tsx556
3 files changed, 121 insertions, 1040 deletions
diff --git a/src/client/views/search/SearchBox.tsx b/src/client/views/search/SearchBox.tsx
index b76955815..acdd8d047 100644
--- a/src/client/views/search/SearchBox.tsx
+++ b/src/client/views/search/SearchBox.tsx
@@ -39,14 +39,6 @@ export enum Keys {
TEXT = "text"
}
-export interface filterData {
- deletedDocsStatus: boolean;
- authorFieldStatus: boolean;
- titleFieldStatus: boolean;
- basicWordStatus: boolean;
- icons: string[];
-}
-
type SearchBoxDocument = makeInterface<[typeof documentSchema, typeof searchSchema]>;
const SearchBoxDocument = makeInterface(documentSchema, searchSchema);
@@ -89,55 +81,16 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
@observable private newAssign: boolean = true;
constructor(props: any) {
-
super(props);
SearchBox.Instance = this;
- if (!_scriptingGlobals.hasOwnProperty("handleNodeChange")) {
- Scripting.addGlobal(this.handleNodeChange);
- }
- if (!_scriptingGlobals.hasOwnProperty("handleKeyChange")) {
- Scripting.addGlobal(this.handleKeyChange);
- }
- if (!_scriptingGlobals.hasOwnProperty("handleWordQueryChange")) {
- Scripting.addGlobal(this.handleWordQueryChange);
- }
- if (!_scriptingGlobals.hasOwnProperty("updateIcon")) {
- Scripting.addGlobal(this.updateIcon);
- }
- if (!_scriptingGlobals.hasOwnProperty("updateTitleStatus")) {
- Scripting.addGlobal(this.updateTitleStatus);
- }
- if (!_scriptingGlobals.hasOwnProperty("updateAuthorStatus")) {
- Scripting.addGlobal(this.updateAuthorStatus);
- }
- if (!_scriptingGlobals.hasOwnProperty("updateDeletedStatus")) {
- Scripting.addGlobal(this.updateDeletedStatus);
- }
-
-
this.resultsScrolled = this.resultsScrolled.bind(this);
- // new PrefetchProxy(Docs.Create.SearchItemBoxDocument({
- // title: "search item template",
- // backgroundColor: "transparent", _xMargin: 5, _height: 46, isTemplateDoc: true, isTemplateForField: "data"
- // }));
-
-
- // if (!this.searchItemTemplate) { // create exactly one presElmentBox template to use by any and all presentations.
- // Doc.UserDoc().searchItemTemplate = new PrefetchProxy(Docs.Create.SearchItemBoxDocument({ title: "search item template", backgroundColor: "transparent", _xMargin: 5, _height: 46, isTemplateDoc: true, isTemplateForField: "data" }));
- // // this script will be called by each presElement to get rendering-specific info that the PresBox knows about but which isn't written to the PresElement
- // // this is a design choice -- we could write this data to the presElements which would require a reaction to keep it up to date, and it would prevent
- // // the preselement docs from being part of multiple presentations since they would all have the same field, or we'd have to keep per-presentation data
- // // stored on each pres element.
- // (this.searchItemTemplate as Doc).lookupField = ScriptField.MakeFunction("lookupSearchBoxField(container, field, data)",
- // { field: "string", data: Doc.name, container: Doc.name });
- // }
}
@observable setupButtons = false;
componentDidMount = () => {
- if (this.setupButtons == false) {
+ if (this.setupButtons === false) {
- runInAction(() => this.setupButtons == true);
+ runInAction(() => this.setupButtons = true);
}
if (this.inputRef.current) {
this.inputRef.current.focus();
@@ -163,7 +116,7 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
@action
- getViews = (doc: Doc) => SearchUtil.GetViewsOfDocument(doc)
+ getViews = (doc: Doc) => SearchUtil.GetViewsOfDocument(doc);
@observable newsearchstring: string = "";
@@ -203,9 +156,7 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
enter = (e: React.KeyboardEvent) => {
if (e.key === "Enter") {
this.layoutDoc._searchString = this.newsearchstring;
- // if (this._icons !== this._allIcons) {
- // runInAction(() => { this.expandedBucket = false });
- // }
+
if (StrCast(this.layoutDoc._searchString) !== "") {
console.log("OPEN");
runInAction(() => { this.open = true });
@@ -213,11 +164,8 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
else {
console.log("CLOSE");
runInAction(() => { this.open = false });
-
}
this.submitSearch();
-
-
}
}
@@ -365,46 +313,58 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
this.props.Document.selectedDoc = selectedCollection.props.Document;
}
let docs = DocListCast(selectedCollection.dataDoc[Doc.LayoutFieldKey(selectedCollection.dataDoc)]);
- let found: [Doc, string[], string[]][] = [];
- let docsforFilter: Doc[] = []
+ const found: [Doc, string[], string[]][] = [];
+ const docsforFilter: Doc[] = []
let newarray: Doc[] = [];
while (docs.length > 0) {
newarray = [];
docs.forEach((d) => {
- if (d.data != undefined) {
+ if (d.data !== undefined) {
let newdocs = DocListCast(d.data);
newdocs.forEach((newdoc) => {
newarray.push(newdoc);
});
}
-
-
- let hlights: string[] = [];
-
+ const hlights: string[] = [];
const protos = Doc.GetAllPrototypes(d);
- let proto = protos[protos.length - 1];
protos.forEach(proto => {
Object.keys(proto).forEach(key => {
- // console.log(key, d[key]);
if (StrCast(d[key]).includes(query) && !hlights.includes(key)) {
hlights.push(key);
}
- })
+ });
});
if (hlights.length > 0) {
found.push([d, hlights, []]);
docsforFilter.push(d);
- };
+ }
});
docs = newarray;
}
this._results = found;
this.docsforfilter = docsforFilter;
if (this.filter === true) {
- console.log(docsforFilter);
selectedCollection.props.Document._searchDocs = new List<Doc>(docsforFilter);
+ docs = DocListCast(selectedCollection.dataDoc[Doc.LayoutFieldKey(selectedCollection.dataDoc)]);
+ while (docs.length > 0) {
+ console.log("HIT");
+ newarray = [];
+ docs.forEach((d) => {
+ if (d.data !== undefined) {
+ console.log(d._searchDocs);
+ d._searchDocs = new List<Doc>(docsforFilter);
+ console.log(d);
+ console.log(d._searchDocs);
+ let newdocs = DocListCast(d.data);
+ newdocs.forEach((newdoc) => {
+ newarray.push(newdoc);
+ });
+ }
+ });
+ docs = newarray;
+ }
}
this._numTotalResults = found.length;
}
@@ -468,7 +428,6 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
@action
submitSearch = async (reset?: boolean) => {
- this.checkIcons();
if (reset) {
this.layoutDoc._searchString = "";
}
@@ -644,13 +603,6 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
y += 300;
}
}
- const filter: filterData = {
- deletedDocsStatus: this._deletedDocsStatus,
- authorFieldStatus: this._authorFieldStatus,
- titleFieldStatus: this._titleFieldStatus,
- basicWordStatus: this._basicWordStatus,
- icons: this._icons,
- }
return Docs.Create.SearchDocument({ _autoHeight: true, _viewType: CollectionViewType.Schema, title: StrCast(this.layoutDoc._searchString), searchQuery: StrCast(this.layoutDoc._searchString) });
}
@@ -693,7 +645,7 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
const endIndex = 30;
//this._endIndex = endIndex === -1 ? 12 : endIndex;
this._endIndex = 30;
- let headers = new Set<string>(["title", "author", "text", "lastModified"]);
+ const headers = new Set<string>(["title", "author", "lastModified", "text"]);
if ((this._numTotalResults === 0 || this._results.length === 0) && this._openNoResults) {
if (this.noresults === "") {
this.noresults = "No search results :(";
@@ -734,7 +686,7 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
if (i < this._results.length) result = this._results[i];
if (result) {
const highlights = Array.from([...Array.from(new Set(result[1]).values())]);
- let lines = new List<string>(result[2]);
+ const lines = new List<string>(result[2]);
console.log(lines);
result[0].lines = lines;
result[0].highlighting = highlights.join(", ");
@@ -751,7 +703,7 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
result = this._results[i];
if (result) {
const highlights = Array.from([...Array.from(new Set(result[1]).values())]);
- let lines = new List<string>(result[2]);
+ const lines = new List<string>(result[2]);
highlights.forEach((item) => headers.add(item));
console.log(lines);
result[0].lines = lines;
@@ -769,9 +721,9 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
}
}
}
- let schemaheaders: SchemaHeaderField[] = [];
+ const schemaheaders: SchemaHeaderField[] = [];
this.headerscale = headers.size;
- headers.forEach((item) => schemaheaders.push(new SchemaHeaderField(item, "#f1efeb")))
+ headers.forEach((item) => schemaheaders.push(new SchemaHeaderField(item, "#f1efeb")));
this.headercount = schemaheaders.length;
this.props.Document._schemaHeaders = new List<SchemaHeaderField>(schemaheaders);
if (this._maxSearchIndex >= this._numTotalResults) {
@@ -784,8 +736,8 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
@observable headerscale: number = 0;
findCommonElements(arr2: string[]) {
- let arr1 = ["layout", "data"];
- return arr1.some(item => arr2.includes(item))
+ const arr1 = ["layout", "data"];
+ return arr1.some(item => arr2.includes(item));
}
@computed
@@ -794,210 +746,10 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
@computed
get resultHeight() { return this._numTotalResults * 70; }
- //if true, any keywords can be used. if false, all keywords are required.
- @action.bound
- handleWordQueryChange = async () => {
- this._collectionStatus = !this._collectionStatus;
- if (this._collectionStatus) {
- let doc = await Cast(this.props.Document.keywords, Doc)
- doc!.backgroundColor = "grey";
-
- }
- else {
- let doc = await Cast(this.props.Document.keywords, Doc)
- doc!.backgroundColor = "black";
- }
- }
-
- @action.bound
- handleNodeChange = async () => {
- this._nodeStatus = !this._nodeStatus;
-
- if (this._nodeStatus) {
- this.expandSection(`node${this.props.Document[Id]}`);
- let doc = await Cast(this.props.Document.nodes, Doc)
- doc!.backgroundColor = "grey";
-
- }
- else {
- this.collapseSection(`node${this.props.Document[Id]}`);
- let doc = await Cast(this.props.Document.nodes, Doc)
- doc!.backgroundColor = "black";
- }
- }
-
- @action.bound
- handleKeyChange = async () => {
- this._keyStatus = !this._keyStatus;
- if (this._keyStatus) {
- this.expandSection(`key${this.props.Document[Id]}`);
- let doc = await Cast(this.props.Document.keys, Doc)
- doc!.backgroundColor = "grey";
- }
- else {
- this.collapseSection(`key${this.props.Document[Id]}`);
- let doc = await Cast(this.props.Document.keys, Doc)
- doc!.backgroundColor = "black";
- }
- }
-
- @action.bound
- handleFilterChange = () => {
- this._filterOpen = !this._filterOpen;
- if (this._filterOpen) {
- this.expandSection(`filterhead${this.props.Document[Id]}`);
- document.getElementById(`filterhead${this.props.Document[Id]}`)!.style.padding = "5";
- console.log(this.props.Document[Id])
- }
- else {
- this.collapseSection(`filterhead${this.props.Document[Id]}`);
-
-
- }
- }
-
- @computed
- get menuHeight() {
- return document.getElementById("hi")?.clientHeight;
- }
-
-
- collapseSection(thing: string) {
- const id = this.props.Document[Id];
- const element = document.getElementById(thing)!;
- // get the height of the element's inner content, regardless of its actual size
- const sectionHeight = element.scrollHeight;
-
- // temporarily disable all css transitions
- const elementTransition = element.style.transition;
- element.style.transition = '';
-
- // on the next frame (as soon as the previous style change has taken effect),
- // explicitly set the element's height to its current pixel height, so we
- // aren't transitioning out of 'auto'
- requestAnimationFrame(function () {
- element.style.height = sectionHeight + 'px';
- element.style.transition = elementTransition;
-
- // on the next frame (as soon as the previous style change has taken effect),
- // have the element transition to height: 0
- requestAnimationFrame(function () {
- element.style.height = 0 + 'px';
- thing === `filterhead${id}` ? document.getElementById(`filterhead${id}`)!.style.padding = "0" : null;
- });
- });
-
- // mark the section as "currently collapsed"
- element.setAttribute('data-collapsed', 'true');
- }
-
- expandSection(thing: string) {
- const element = document.getElementById(thing)!;
- // get the height of the element's inner content, regardless of its actual size
- const sectionHeight = element.scrollHeight;
-
- // have the element transition to the height of its inner content
- element.style.height = sectionHeight + 'px';
-
- // when the next css transition finishes (which should be the one we just triggered)
- element.addEventListener('transitionend', function handler(e) {
- // remove this event listener so it only gets triggered once
- element.removeEventListener('transitionend', handler);
-
- // remove "height" from the element's inline styles, so it can return to its initial value
- element.style.height = "auto";
- //element.style.height = undefined;
- });
-
- // mark the section as "currently not collapsed"
- element.setAttribute('data-collapsed', 'false');
-
- }
-
- autoset(thing: string) {
- const element = document.getElementById(thing)!;
- element.removeEventListener('transitionend', function (e) { });
-
- // remove "height" from the element's inline styles, so it can return to its initial value
- element.style.height = "auto";
- //element.style.height = undefined;
- }
-
- @action.bound
- updateTitleStatus = async () => {
- this._titleFieldStatus = !this._titleFieldStatus;
- if (this._titleFieldStatus) {
- let doc = await Cast(this.props.Document.title, Doc)
- doc!.backgroundColor = "grey";
- }
- else {
- let doc = await Cast(this.props.Document.title, Doc)
- doc!.backgroundColor = "black";
- }
- }
-
- @action.bound
- updateAuthorStatus = async () => {
- this._authorFieldStatus = !this._authorFieldStatus;
- if (this._authorFieldStatus) {
- let doc = await Cast(this.props.Document.author, Doc)
- doc!.backgroundColor = "grey";
- }
- else {
- let doc = await Cast(this.props.Document.author, Doc)
- doc!.backgroundColor = "black";
- }
- }
-
- @action.bound
- updateDeletedStatus = async () => {
- this._deletedDocsStatus = !this._deletedDocsStatus;
- if (this._deletedDocsStatus) {
- let doc = await Cast(this.props.Document.deleted, Doc)
- doc!.backgroundColor = "grey";
- }
- else {
- let doc = await Cast(this.props.Document.deleted, Doc)
- doc!.backgroundColor = "black";
- }
- }
-
addButtonDoc = (doc: Doc) => Doc.AddDocToList(CurrentUserUtils.UserDocument.expandingButtons as Doc, "data", doc);
remButtonDoc = (doc: Doc) => Doc.RemoveDocFromList(CurrentUserUtils.UserDocument.expandingButtons as Doc, "data", doc);
moveButtonDoc = (doc: Doc, targetCollection: Doc | undefined, addDocument: (document: Doc) => boolean) => this.remButtonDoc(doc) && addDocument(doc);
- @action.bound
- updateIcon = async (icon: string) => {
- if (this._icons.includes(icon)) {
- _.pull(this._icons, icon);
- let cap = icon.charAt(0).toUpperCase() + icon.slice(1)
- console.log(cap);
- let doc = await Cast(this.props.Document[cap], Doc)
- doc!.backgroundColor = "black";
- }
- else {
- this._icons.push(icon);
- let cap = icon.charAt(0).toUpperCase() + icon.slice(1)
- let doc = await Cast(this.props.Document[cap], Doc)
- doc!.backgroundColor = "grey";
- }
- }
-
- @action.bound
- checkIcons = async () => {
- for (let i = 0; i < this._allIcons.length; i++) {
-
- let cap = this._allIcons[i].charAt(0).toUpperCase() + this._allIcons[i].slice(1)
- let doc = await Cast(this.props.Document[cap], Doc)
- if (this._icons.includes(this._allIcons[i])) {
- doc!.backgroundColor = "grey";
- }
- else {
- doc!.backgroundColor = "black";
- }
- }
- }
-
@computed get searchItemTemplate() { return Cast(Doc.UserDoc().searchItemTemplate, Doc, null); }
getTransform = () => {
@@ -1016,16 +768,15 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
@observable filter = false;
-
//Make id layour document
render() {
this.props.Document._chromeStatus === "disabled";
this.props.Document._searchDoc = true;
- let cols = Cast(this.props.Document._schemaHeaders, listSpec(SchemaHeaderField), []).length;
+ const cols = Cast(this.props.Document._schemaHeaders, listSpec(SchemaHeaderField), []).length;
let length = 0;
cols > 5 ? length = 1076 : length = cols * 205 + 51;
let height = 0;
- let rows = this.children;
+ const rows = this.children;
rows > 8 ? height = 31 + 31 * 8 : height = 31 * rows + 31;
return (
<div style={{ pointerEvents: "all" }} className="searchBox-container">
@@ -1045,10 +796,52 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
this.filter = !this.filter && !this.scale;
if (this.filter === true && this.currentSelectedCollection !== undefined) {
this.currentSelectedCollection.props.Document._searchDocs = new List<Doc>(this.docsforfilter);
+ let newarray: Doc[] = [];
+ let docs: Doc[] = [];
+ docs = DocListCast(this.currentSelectedCollection.dataDoc[Doc.LayoutFieldKey(this.currentSelectedCollection.dataDoc)]);
+ while (docs.length > 0) {
+ console.log("HIT");
+ newarray = [];
+ docs.forEach((d) => {
+ if (d.data !== undefined) {
+ console.log(d._searchDocs);
+ d._searchDocs = new List<Doc>(this.docsforfilter);
+ console.log(d);
+ console.log(d._searchDocs);
+ let newdocs = DocListCast(d.data);
+ newdocs.forEach((newdoc) => {
+ newarray.push(newdoc);
+ });
+ }
+ });
+ docs = newarray;
+ }
+
this.currentSelectedCollection.props.Document._docFilters = new List<string>(Cast(this.props.Document._docFilters, listSpec("string"), []));
this.props.Document.selectedDoc = this.currentSelectedCollection.props.Document;
}
else if (this.filter === false && this.currentSelectedCollection !== undefined) {
+ let newarray: Doc[] = [];
+ let docs: Doc[] = [];
+ docs = DocListCast(this.currentSelectedCollection.dataDoc[Doc.LayoutFieldKey(this.currentSelectedCollection.dataDoc)]);
+ while (docs.length > 0) {
+ console.log("HIT");
+ newarray = [];
+ docs.forEach((d) => {
+ if (d.data !== undefined) {
+ console.log(d._searchDocs);
+ d._searchDocs = new List<Doc>();
+ console.log(d);
+ console.log(d._searchDocs);
+ let newdocs = DocListCast(d.data);
+ newdocs.forEach((newdoc) => {
+ newarray.push(newdoc);
+ });
+ }
+ });
+ docs = newarray;
+ }
+
this.currentSelectedCollection.props.Document._searchDocs = new List<Doc>([]);
this.currentSelectedCollection.props.Document._docFilters = undefined;
this.props.Document.selectedDoc = undefined;
@@ -1075,12 +868,32 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
this.scale = !this.scale;
this.dataDoc[this.fieldKey] = new List<Doc>([]);
if (this.currentSelectedCollection !== undefined) {
+ let newarray: Doc[] = [];
+ let docs: Doc[] = [];
+ docs = DocListCast(this.currentSelectedCollection.dataDoc[Doc.LayoutFieldKey(this.currentSelectedCollection.dataDoc)]);
+ while (docs.length > 0) {
+ console.log("HIT");
+ newarray = [];
+ docs.forEach((d) => {
+ if (d.data !== undefined) {
+ console.log(d._searchDocs);
+ d._searchDocs = new List<Doc>();
+ console.log(d);
+ console.log(d._searchDocs);
+ let newdocs = DocListCast(d.data);
+ newdocs.forEach((newdoc) => {
+ newarray.push(newdoc);
+ });
+ }
+ });
+ docs = newarray;
+ }
this.currentSelectedCollection.props.Document._docFilters = undefined;
this.currentSelectedCollection.props.Document._searchDocs = undefined;
this.currentSelectedCollection = undefined;
}
this.submitSearch();
- })
+ });
}} />
Collection
</label>
@@ -1093,12 +906,32 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
this.dataDoc[this.fieldKey] = new List<Doc>([]);
this.filter = false;
if (this.currentSelectedCollection !== undefined) {
+ let newarray: Doc[] = [];
+ let docs: Doc[] = [];
+ docs = DocListCast(this.currentSelectedCollection.dataDoc[Doc.LayoutFieldKey(this.currentSelectedCollection.dataDoc)]);
+ while (docs.length > 0) {
+ console.log("HIT");
+ newarray = [];
+ docs.forEach((d) => {
+ if (d.data !== undefined) {
+ console.log(d._searchDocs);
+ d._searchDocs = new List<Doc>();
+ console.log(d);
+ console.log(d._searchDocs);
+ let newdocs = DocListCast(d.data);
+ newdocs.forEach((newdoc) => {
+ newarray.push(newdoc);
+ });
+ }
+ });
+ docs = newarray;
+ }
this.currentSelectedCollection.props.Document._docFilters = undefined;
this.currentSelectedCollection.props.Document._searchDocs = undefined;
this.currentSelectedCollection = undefined;
}
this.submitSearch();
- })
+ });
}} />
DB
</label>
@@ -1140,13 +973,3 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
);
}
}
-
-Scripting.addGlobal(function lookupSearchBoxField(container: Doc, field: string, data: Doc) {
- // if (field === 'indexInPres') return DocListCast(container[StrCast(container.presentationFieldKey)]).indexOf(data);
- // if (field === 'presCollapsedHeight') return container._viewType === CollectionViewType.Schema ? 50 : 46;
- // if (field === 'presStatus') return container.presStatus;
- // if (field === '_itemIndex') return container._itemIndex;
- if (field == "query") return container._searchString;
- return undefined;
-});
-
diff --git a/src/client/views/search/SearchItem.scss b/src/client/views/search/SearchItem.scss
deleted file mode 100644
index 5ce022d41..000000000
--- a/src/client/views/search/SearchItem.scss
+++ /dev/null
@@ -1,186 +0,0 @@
-@import "../globalCssVariables";
-
-.searchItem-overview {
- display: flex;
- flex-direction: reverse;
- justify-content: flex-end;
- z-index: 0;
-}
-
-.searchBox-placeholder,
-.searchItem-overview .searchItem {
- width: 100%;
- background: $light-color-secondary;
- padding: 8px;
- min-height: 46px;
- height:46px;
- max-height: 150px;
- height: auto;
- z-index: 0;
- display: flex;
- overflow: visible;
- box-shadow: rgb(156, 147, 150) 0.2vw 0.2vw 0.8vw;
-
- .searchItem-body {
- display: flex;
- flex-direction: row;
- width: 100%;
-
- .searchItem-title-container {
- width: 100%;
- overflow: hidden;
-
- .searchItem-title {
- text-transform: uppercase;
- text-align: left;
- width: 100%;
- font-weight: bold;
- }
- }
-
- .searchItem-info {
- display: flex;
- justify-content: flex-end;
-
- .icon-icons {
- width: 50px
- }
-
- .icon-live {
- width: 175px;
- height: 0px;
- }
-
- .icon-icons {
- height:auto;
- }
- .icon-icons,
- .icon-live {
- margin: auto;
- overflow: visible;
-
- .searchItem-type {
- display: inline-block;
- width: 100%;
- position: absolute;
- justify-content: center;
- align-items: center;
- position: relative;
- margin-right: 5px;
- }
-
- .pdfBox-cont {
- overflow: hidden;
-
- img {
- width: 100% !important;
- height: auto !important;
- }
- }
-
- .searchItem-type:hover+.searchItem-label {
- opacity: 1;
- }
-
- .searchItem-label {
- font-size: 10;
- position: relative;
- right: 0px;
- text-transform: capitalize;
- opacity: 0;
- -webkit-transition: opacity 0.2s ease-in-out;
- -moz-transition: opacity 0.2s ease-in-out;
- -o-transition: opacity 0.2s ease-in-out;
- transition: opacity 0.2s ease-in-out;
- }
- }
-
- .icon-live:hover {
- .pdfBox-cont {
- img {
- width: 100% !important;
- }
- }
- }
- }
-
- .searchItem-info:hover {
- width: 60%;
- }
- }
-}
-
-.searchItem:hover~.searchBox-instances,
-.searchBox-instances:hover,
-.searchBox-instances:active {
- opacity: 1;
- background: $lighter-alt-accent;
-}
-
-.searchItem:hover {
- transition: all 0.2s;
- background: $lighter-alt-accent;
-}
-
-.searchItem-highlighting {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: pre;
-}
-
-.searchBox-instances {
- opacity: 1;
- width:40px;
- height:40px;
- background: gray;
- transition: all 0.2s ease;
- color: black;
- overflow: hidden;
- right:-100;
- display:inline-block;
-}
-
-
-.searchItem-overview:hover {
- z-index: 1;
-}
-
-.searchBox-placeholder {
- min-height: 46px;
- margin-left: 150px;
- width: calc(100% - 150px);
- text-transform: uppercase;
- text-align: left;
- font-weight: bold;
-}
-
-.collection {
- display: flex;
-}
-
-.collection-item {
- width: 35px;
-}
-
-.bucket-title{
- width:auto;
- padding: 5px;
- height: auto;
- top: -18;
- z-index: 55;
- position: absolute;
-}
-
-.bucket-expand{
- bottom: 0;
- position: absolute;
- width: 100%;
- height: 15;
- transform:none;
- .bucket-expand:hover{
- transform:none;
- }
- button:hover{
- transform:none;
- }
-} \ No newline at end of file
diff --git a/src/client/views/search/SearchItem.tsx b/src/client/views/search/SearchItem.tsx
deleted file mode 100644
index b61ed450f..000000000
--- a/src/client/views/search/SearchItem.tsx
+++ /dev/null
@@ -1,556 +0,0 @@
-import React = require("react");
-import { library } from '@fortawesome/fontawesome-svg-core';
-import { faCaretUp, faChartBar, faFile, faFilePdf, faFilm, faFingerprint, faGlobeAsia, faImage, faLink, faMusic, faObjectGroup, faStickyNote } from '@fortawesome/free-solid-svg-icons';
-import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { action, computed, observable, runInAction, IReactionDisposer, reaction } from "mobx";
-import { observer } from "mobx-react";
-import { Doc, DocCastAsync } from "../../../fields/Doc";
-import { Id } from "../../../fields/FieldSymbols";
-import { Cast, NumCast, StrCast } from "../../../fields/Types";
-import { emptyFunction, emptyPath, returnFalse, Utils, returnTrue, returnOne, returnZero, returnEmptyString, returnEmptyFilter } from "../../../Utils";
-import { DocumentType } from "../../documents/DocumentTypes";
-import { DocumentManager } from "../../util/DocumentManager";
-import { DragManager, SetupDrag } from "../../util/DragManager";
-import { SearchUtil } from "../../util/SearchUtil";
-import { Transform } from "../../util/Transform";
-import { SEARCH_THUMBNAIL_SIZE } from "../../views/globalCssVariables.scss";
-import { CollectionDockingView } from "../collections/CollectionDockingView";
-import { CollectionViewType, CollectionView } from "../collections/CollectionView";
-import { ParentDocSelector } from "../collections/ParentDocumentSelector";
-import { ContextMenu } from "../ContextMenu";
-import { ContentFittingDocumentView } from "../nodes/ContentFittingDocumentView";
-import { SearchBox } from "./SearchBox";
-import "./SearchItem.scss";
-import "./SelectorContextMenu.scss";
-import { FieldViewProps, FieldView } from "../nodes/FieldView";
-import { ViewBoxBaseComponent } from "../DocComponent";
-import { makeInterface, createSchema, listSpec } from "../../../fields/Schema";
-import { documentSchema } from "../../../fields/documentSchemas";
-import { PrefetchProxy } from "../../../fields/Proxy";
-import { Docs } from "../../documents/Documents";
-import { ScriptField } from "../../../fields/ScriptField";
-import { CollectionStackingView } from "../collections/CollectionStackingView";
-
-export interface SearchItemProps {
- doc: Doc;
- query: string;
- highlighting: string[];
- lines: string[];
-}
-
-library.add(faCaretUp);
-library.add(faObjectGroup);
-library.add(faStickyNote);
-library.add(faFile);
-library.add(faFilePdf);
-library.add(faFilm);
-library.add(faMusic);
-library.add(faLink);
-library.add(faChartBar);
-library.add(faGlobeAsia, faFingerprint);
-
-@observer
-export class SelectorContextMenu extends React.Component<SearchItemProps> {
- @observable private _docs: { col: Doc, target: Doc }[] = [];
- @observable private _otherDocs: { col: Doc, target: Doc }[] = [];
-
- constructor(props: SearchItemProps) {
- super(props);
- this.fetchDocuments();
- }
-
- async fetchDocuments() {
- const aliases = (await SearchUtil.GetViewsOfDocument(this.props.doc)).filter(doc => doc !== this.props.doc);
- const { docs } = await SearchUtil.Search("", true, { fq: `data_l:"${this.props.doc[Id]}"` });
- const map: Map<Doc, Doc> = new Map;
- const allDocs = await Promise.all(aliases.map(doc => SearchUtil.Search("", true, { fq: `data_l:"${doc[Id]}"` }).then(result => result.docs)));
- allDocs.forEach((docs, index) => docs.forEach(doc => map.set(doc, aliases[index])));
- docs.forEach(doc => map.delete(doc));
- runInAction(() => {
- this._docs = docs.filter(doc => !Doc.AreProtosEqual(doc, CollectionDockingView.Instance.props.Document)).map(doc => ({ col: doc, target: this.props.doc }));
- this._otherDocs = Array.from(map.entries()).filter(entry => !Doc.AreProtosEqual(entry[0], CollectionDockingView.Instance.props.Document)).map(([col, target]) => ({ col, target }));
-
- });
- }
-
- getOnClick({ col, target }: { col: Doc, target: Doc }) {
- return () => {
- col = Doc.IsPrototype(col) ? Doc.MakeDelegate(col) : col;
- if (col._viewType === CollectionViewType.Freeform) {
- const newPanX = NumCast(target.x) + NumCast(target._width) / 2;
- const newPanY = NumCast(target.y) + NumCast(target._height) / 2;
- col._panX = newPanX;
- col._panY = newPanY;
- }
- CollectionDockingView.AddRightSplit(col);
- };
- }
- render() {
- return (
- <div className="parents">
- <p className="contexts">Contexts:</p>
- {[...this._docs, ...this._otherDocs].map(doc => {
- const item = React.createRef<HTMLDivElement>();
- return <div className="collection" key={doc.col[Id] + doc.target[Id]} ref={item}>
- <div className="collection-item" onPointerDown={
- SetupDrag(item, () => doc.col, undefined, undefined, () => SearchBox.Instance.closeSearch())}>
- <FontAwesomeIcon icon={faStickyNote} />
- </div>
- <a onClick={this.getOnClick(doc)}>{doc.col.title}</a>
- </div>;
- })}
- </div>
- );
- }
-}
-
-export interface LinkMenuProps {
- doc1: Doc;
- doc2: Doc;
-}
-
-@observer
-export class LinkContextMenu extends React.Component<LinkMenuProps> {
-
- highlightDoc = (doc: Doc) => () => Doc.BrushDoc(doc);
-
- unHighlightDoc = (doc: Doc) => () => Doc.UnBrushDoc(doc);
-
- getOnClick = (col: Doc) => () => CollectionDockingView.AddRightSplit(col);
-
- render() {
- return (
- <div className="parents">
- <p className="contexts">Anchors:</p>
- <div className="collection"><a onMouseEnter={this.highlightDoc(this.props.doc1)} onMouseLeave={this.unHighlightDoc(this.props.doc1)} onClick={this.getOnClick(this.props.doc1)}>Doc 1: {this.props.doc2.title}</a></div>
- <div><a onMouseEnter={this.highlightDoc(this.props.doc2)} onMouseLeave={this.unHighlightDoc(this.props.doc2)} onClick={this.getOnClick(this.props.doc2)}>Doc 2: {this.props.doc1.title}</a></div>
- </div>
- );
- }
-
-}
-
-
-type SearchSchema = makeInterface<[typeof documentSchema]>;
-
-export const SearchSchema = createSchema({
- targetDoc: Doc,
-});
-
-const SearchDocument = makeInterface(documentSchema);
-
-
-
-@observer
-export class SearchItem extends ViewBoxBaseComponent<FieldViewProps, SearchSchema>(SearchDocument) {
-
- public static LayoutString(fieldKey: string) { return FieldView.LayoutString(SearchItem, fieldKey); }
-
- constructor(props: any) {
- super(props);
- //this.rootDoc._viewType= CollectionViewType.Stacking;
- this.props.Document._height = 46;
- if (!this.searchItemTemplate) { // create exactly one presElmentBox template to use by any and all presentations.
- Doc.UserDoc().searchItemTemplate = new PrefetchProxy(Docs.Create.SearchItemBoxDocument({ title: "search item template", backgroundColor: "transparent", _xMargin: 5, _height: 46, isTemplateDoc: true, isTemplateForField: "data" }));
- // this script will be called by each presElement to get rendering-specific info that the PresBox knows about but which isn't written to the PresElement
- // this is a design choice -- we could write this data to the presElements which would require a reaction to keep it up to date, and it would prevent
- // the preselement docs from being part of multiple presentations since they would all have the same field, or we'd have to keep per-presentation data
- // stored on each pres element.
- (this.searchItemTemplate as Doc).lookupField = ScriptField.MakeFunction("lookupSearchBoxField(container, field, data)",
- { field: "string", data: Doc.name, container: Doc.name });
- }
-
- }
-
- @observable _selected: boolean = false;
-
- onClick = () => {
- DocumentManager.Instance.jumpToDocument(this.rootDoc, false);
- }
- @observable _useIcons = true;
- @observable _displayDim = 50;
-
- @computed get query() { return StrCast(this.lookupField("query")); }
-
- private _oldHeight: number = 46;
-
- componentDidMount() {
- let parent: Doc | undefined = undefined;
- let height = 0;
- if (this.rootDoc.parent) {
- parent = Cast(this.rootDoc.parent, Doc, null);
- if (parent !== undefined) {
- height = (NumCast(parent._height));
- }
- }
-
- this._reactionDisposer2 = reaction(
- () => this._useIcons,
- el => {
- if (this.rootDoc.parent) {
- parent = Cast(this.rootDoc.parent, Doc, null) as Doc;
- height = (NumCast(parent._height));
- };
- console.log(height);
- console.log(this._oldHeight);
- setTimeout(() => {
- this._mainRef.current?.getBoundingClientRect() ? this.props.Document._height = this._mainRef.current?.getBoundingClientRect().height : null;
- parent !== undefined ? this._mainRef.current?.getBoundingClientRect() ? parent._height = -this._oldHeight + height + this._mainRef.current?.getBoundingClientRect().height : null : null;
- this._mainRef.current?.getBoundingClientRect() ? this._oldHeight = this._mainRef.current?.getBoundingClientRect().height : null;
- // this._oldHeight 55? this._oldHeight =55:null;
- }, 1);
- }
- );
-
- this._reactionDisposer3 = reaction(
- () => this._displayLines,
- el => {
- if (this.rootDoc.parent) {
- parent = Cast(this.rootDoc.parent, Doc, null) as Doc;
- height = (NumCast(parent._height));
- };
- setTimeout(() => {
- this._mainRef.current?.getBoundingClientRect() ? this.props.Document._height = this._mainRef.current?.getBoundingClientRect().height : null;
- parent !== undefined ? this._mainRef.current?.getBoundingClientRect() ? parent._height = -this._oldHeight + height + this._mainRef.current?.getBoundingClientRect().height : null : null;
- this._mainRef.current?.getBoundingClientRect() ? this._oldHeight = this._mainRef.current?.getBoundingClientRect().height : null;
- }, 1);
- }
- );
-
- Doc.SetSearchQuery(this.query);
- this.rootDoc.searchMatch = true;
- }
- componentWillUnmount() {
- this.rootDoc.searchMatch = undefined;
- this._reactionDisposer2 && this._reactionDisposer2();
- this._reactionDisposer3 && this._reactionDisposer3();
-
- }
-
-
-
- private _reactionDisposer2?: IReactionDisposer;
- private _reactionDisposer3?: IReactionDisposer;
-
-
-
- @computed get highlightPos() { return NumCast(this.rootDoc.searchIndex) }
-
- @action
- public DocumentIcon() {
- const layoutresult = StrCast(this.rootDoc.type);
- if (!this._useIcons) {
- const returnXDimension = () => this._useIcons ? 50 : Number(SEARCH_THUMBNAIL_SIZE);
- const returnYDimension = () => this._displayDim;
- const docview = <div
- onPointerDown={action(() => {
- this._useIcons = !this._useIcons;
- this._displayDim = this._useIcons ? 50 : Number(SEARCH_THUMBNAIL_SIZE);
- })}
- onPointerEnter={action(() => this._displayDim = this._useIcons ? 50 : Number(SEARCH_THUMBNAIL_SIZE))} >
- <ContentFittingDocumentView
- Document={this.rootDoc}
- LibraryPath={emptyPath}
- rootSelected={returnFalse}
- fitToBox={StrCast(this.rootDoc.type).indexOf(DocumentType.COL) !== -1}
- addDocument={returnFalse}
- removeDocument={returnFalse}
- addDocTab={returnFalse}
- pinToPres={returnFalse}
- docFilters={returnEmptyFilter}
- ContainingCollectionDoc={undefined}
- ContainingCollectionView={undefined}
- ScreenToLocalTransform={Transform.Identity}
- renderDepth={1}
- PanelWidth={returnXDimension}
- PanelHeight={returnYDimension}
- NativeWidth={returnZero}
- NativeHeight={returnZero}
- focus={emptyFunction}
- moveDocument={returnFalse}
- parentActive={returnFalse}
- whenActiveChanged={returnFalse}
- bringToFront={returnFalse}
- ContentScaling={returnOne}
- />
- </div>;
- return docview;
- }
- const button = layoutresult.indexOf(DocumentType.PDF) !== -1 ? faFilePdf :
- layoutresult.indexOf(DocumentType.IMG) !== -1 ? faImage :
- layoutresult.indexOf(DocumentType.RTF) !== -1 ? faStickyNote :
- layoutresult.indexOf(DocumentType.VID) !== -1 ? faFilm :
- layoutresult.indexOf(DocumentType.COL) !== -1 ? faObjectGroup :
- layoutresult.indexOf(DocumentType.AUDIO) !== -1 ? faMusic :
- layoutresult.indexOf(DocumentType.LINK) !== -1 ? faLink :
- layoutresult.indexOf(DocumentType.WEB) !== -1 ? faGlobeAsia :
- faCaretUp;
- return <div><div onClick={action(() => { this._useIcons = false; this._displayDim = Number(SEARCH_THUMBNAIL_SIZE); })} >
- <FontAwesomeIcon icon={button} size="2x" />
- </div>
- <div className="searchItem-label">{this.rootDoc.type ? this.rootDoc.type : "Other"}</div>
- </div>
- ;
- }
-
- collectionRef = React.createRef<HTMLDivElement>();
-
- @action
- pointerDown = (e: React.PointerEvent) => { e.preventDefault(); e.button === 0 && SearchBox.Instance.openSearch(e); }
-
- @action
- nextHighlight = (e: React.MouseEvent) => {
- e.preventDefault();
- e.stopPropagation();
- //e.button === 0 && SearchBox.Instance.openSearch(e);
-
- this.rootDoc!.searchMatch = false;
- setTimeout(() => this.rootDoc!.searchMatch = true, 0);
- this.rootDoc.searchIndex = NumCast(this.rootDoc.searchIndex);
- this.length = NumCast(this.rootDoc!.length);
- }
-
- @action
- nextHighlight2 = (e: React.MouseEvent) => {
- e.preventDefault();
- e.stopPropagation();
-
- //e.button === 0 && SearchBox.Instance.openSearch(e);
-
- this.rootDoc!.searchMatch2 = false;
- setTimeout(() => this.rootDoc!.searchMatch2 = true, 0);
- this.rootDoc.searchIndex = NumCast(this.rootDoc.searchIndex);
-
- this.length = NumCast(this.rootDoc!.length);
- }
-
- @observable length: number | undefined = 0;
-
- highlightDoc = (e: React.PointerEvent) => {
- if (this.rootDoc!.type === DocumentType.LINK) {
- if (this.rootDoc!.anchor1 && this.rootDoc!.anchor2) {
-
- const doc1 = Cast(this.rootDoc!.anchor1, Doc, null);
- const doc2 = Cast(this.rootDoc!.anchor2, Doc, null);
- Doc.BrushDoc(doc1);
- Doc.BrushDoc(doc2);
- }
- } else {
- Doc.BrushDoc(this.rootDoc!);
- }
- e.stopPropagation();
- }
-
- unHighlightDoc = (e: React.PointerEvent) => {
- if (this.rootDoc!.type === DocumentType.LINK) {
- if (this.rootDoc!.anchor1 && this.rootDoc!.anchor2) {
-
- const doc1 = Cast(this.rootDoc!.anchor1, Doc, null);
- const doc2 = Cast(this.rootDoc!.anchor2, Doc, null);
- Doc.UnBrushDoc(doc1);
- Doc.UnBrushDoc(doc2);
- }
- } else {
- Doc.UnBrushDoc(this.rootDoc!);
- }
- }
-
- onContextMenu = (e: React.MouseEvent) => {
- e.preventDefault();
- e.stopPropagation();
- ContextMenu.Instance.clearItems();
- ContextMenu.Instance.addItem({
- description: "Copy ID", event: () => {
- Utils.CopyText(StrCast(this.rootDoc[Id]));
- },
- icon: "fingerprint"
- });
- ContextMenu.Instance.displayMenu(e.clientX, e.clientY);
- }
-
- _downX = 0;
- _downY = 0;
- _target: any;
- onPointerDown = (e: React.PointerEvent<HTMLDivElement>) => {
- this._downX = e.clientX;
- this._downY = e.clientY;
- e.stopPropagation();
- this._target = e.currentTarget;
- document.removeEventListener("pointermove", this.onPointerMoved);
- document.removeEventListener("pointerup", this.onPointerUp);
- document.addEventListener("pointermove", this.onPointerMoved);
- document.addEventListener("pointerup", this.onPointerUp);
- }
- onPointerMoved = (e: PointerEvent) => {
- if (Math.abs(e.clientX - this._downX) > Utils.DRAG_THRESHOLD ||
- Math.abs(e.clientY - this._downY) > Utils.DRAG_THRESHOLD) {
- document.removeEventListener("pointermove", this.onPointerMoved);
- document.removeEventListener("pointerup", this.onPointerUp);
- const doc = Doc.IsPrototype(this.rootDoc) ? Doc.MakeDelegate(this.rootDoc) : this.rootDoc;
- DragManager.StartDocumentDrag([this._target], new DragManager.DocumentDragData([doc]), e.clientX, e.clientY);
- }
- }
- onPointerUp = (e: PointerEvent) => {
- document.removeEventListener("pointermove", this.onPointerMoved);
- document.removeEventListener("pointerup", this.onPointerUp);
- }
-
- @computed
- get contextButton() {
- return <ParentDocSelector Document={this.rootDoc} addDocTab={(doc, where) => CollectionDockingView.AddRightSplit(doc)} />;
- }
-
- @computed get searchElementDoc() { return this.rootDoc; }
- // @computed get targetDoc() { return this.searchElementDoc?.targetDoc as Doc; }
-
- @computed get searchItemTemplate() { return Cast(Doc.UserDoc().searchItemTemplate, Doc, null); }
- childLayoutTemplate = () => this.layoutDoc._viewType === CollectionViewType.Stacking ? this.searchItemTemplate : undefined;
- getTransform = () => {
- return this.props.ScreenToLocalTransform().translate(-5, -65);// listBox padding-left and pres-box-cont minHeight
- }
- panelHeight = () => {
- return this.props.PanelHeight();
- }
- selectElement = (doc: Doc) => {
- //this.gotoDocument(this.childDocs.indexOf(doc), NumCast(this.layoutDoc._itemIndex));
- }
-
- newsearch() {
- runInAction(() => {
- if (StrCast(this.rootDoc.bucketfield) !== "results") {
- SearchBox.Instance._icons = [StrCast(this.rootDoc.bucketfield)];
- SearchBox.Instance._icons = SearchBox.Instance._icons;
- }
- else {
- SearchBox.Instance._icons = SearchBox.Instance._allIcons;
- }
- SearchBox.Instance.submitSearch();
- })
- }
-
- @action
- returnLines() {
- if ((Cast(this.rootDoc.lines, listSpec("string")))!.length > 1) {
- if (!this._displayLines) {
- console.log(Cast(this.rootDoc.lines, listSpec("string")));
- return <div style={{ width: 10 }}
- onPointerDown={action(() => {
- this._displayLines = !this._displayLines;
- //this._displayDim = this._useIcons ? 50 : Number(SEARCH_THUMBNAIL_SIZE);
- })}
- //onPointerEnter={action(() => this._displayDim = this._useIcons ? 50 : Number(SEARCH_THUMBNAIL_SIZE))}
- >
- {Cast(this.rootDoc.lines, listSpec("string"))!.filter((m, i) => i).map((l, i) => <div style={{ overflow: "visible" }} id={i.toString()} className="searchItem-highlighting">{l}</div>)}
- </div>;;
- }
- }
- }
-
- //this._displayDim = Number(SEARCH_THUMBNAIL_SIZE);
-
- @observable _displayLines: boolean = true;
-
- returnButtons() {
- return <div>
- <div onClick={action(() => {
- this.rootDoc!.type === DocumentType.PDF ? this._displayLines = !this._displayLines : null;
- })}>
- {this.rootDoc!.type === DocumentType.PDF ? "Expand Lines" : null}
- {NumCast(this.rootDoc!.length) > 1 ? `Instance ${NumCast(this.rootDoc.searchIndex) === 0 ? NumCast(this.rootDoc.length) : NumCast(this.rootDoc.searchIndex)} of ${NumCast(this.rootDoc.length)}` : null}
- <button onClick={this.nextHighlight} style={{ padding: 2, position: "absolute", left: 77 }}>
- <FontAwesomeIcon icon="arrow-up" size="sm" />
- </button>
- <button onClick={this.nextHighlight2} style={{ padding: 2, position: "absolute", left: 87 }}>
- <FontAwesomeIcon icon="arrow-down" size="sm" />
- </button>
- </div>
- <div>
- <div style={{ background: "lightgrey" }}>
- {this.returnLines()}
- </div>
- </div>
- </div>
- }
-
- private _mainRef: React.RefObject<HTMLDivElement> = React.createRef();
-
-
- render() {
- const doc1 = Cast(this.rootDoc!.anchor1, Doc);
- const doc2 = Cast(this.rootDoc!.anchor2, Doc);
- if (StrCast(this.rootDoc.bucketfield) === "webs") {
- this.props.Document._viewType = CollectionViewType.Stacking;
- this.props.Document._chromeStatus = 'disabled';
- this.props.Document._height = this.rootDoc._height;
- return <div>
- <CollectionView {...this.props}
- Document={this.props.Document}
- PanelHeight={this.panelHeight}
- whenActiveChanged={emptyFunction}
- onClick={undefined}
- moveDocument={returnFalse}
- childLayoutTemplate={undefined}
- addDocument={undefined}
- removeDocument={returnFalse}
- focus={this.selectElement}
- ScreenToLocalTransform={this.getTransform} />
- </div>
- }
- if (this.rootDoc.isBucket === true) {
- this.props.Document._viewType = CollectionViewType.Stacking;
- this.props.Document._chromeStatus = 'disabled';
- this.props.Document._height = this.rootDoc._height;
-
- return <div>
- <CollectionView {...this.props}
- Document={this.props.Document}
- PanelHeight={this.panelHeight}
- whenActiveChanged={emptyFunction}
- onClick={undefined}
- moveDocument={returnFalse}
- childLayoutTemplate={this.childLayoutTemplate}
- addDocument={undefined}
- removeDocument={returnFalse}
- focus={this.selectElement}
- ScreenToLocalTransform={this.getTransform} />
- <button onClick={() => this.newsearch()} className="bucket-expand" style={{ transform: "none", fontSize: "100%", textTransform: "none", background: "lightgray", color: "black", bottom: 8, marginBottom: -2, paddingTop: 2, fontFamily: "Arial, sans-serif" }}>See all {StrCast(this.rootDoc.bucketfield)}...
- </button>
- </div>
- }
- else if (this.rootDoc.isBucket === false) {
- this.props.Document._chromeStatus = 'disabled';
- return <div className="searchItem">
- <div className="searchItem-body" >
- <div className="searchItem-title-container">
- <div className="searchItem-title" style={{ height: "10px", overflow: "hidden", textOverflow: "ellipsis" }}>No Search Results</div>
- </div>
- </div>
- </div>
- }
- else {
- return <div className="searchItem-overview" onPointerDown={this.pointerDown} onContextMenu={this.onContextMenu}>
- <div ref={this._mainRef} className="searchItem" onPointerEnter={this.highlightDoc} onPointerLeave={this.unHighlightDoc}>
- <div className="searchItem-body" onClick={this.onClick}>
- <div className="searchItem-title-container">
- <div className="searchItem-title" style={{ height: "10px", overflow: "hidden", textOverflow: "ellipsis" }}>{StrCast(this.rootDoc.title)}</div>
- <div className="searchItem-highlighting">
- {this.rootDoc.highlighting ? StrCast(this.rootDoc.highlighting).length ? "Matched fields:" + StrCast(this.rootDoc.highlighting) : Cast(this.rootDoc.lines, listSpec("string"))!.length ? Cast(this.rootDoc.lines, listSpec("string"))![0] : "" : null}</div>
- <div className={`icon-${this._displayLines ? "q" : "a"}`}>
- {NumCast(this.rootDoc.length) > 1 || this.rootDoc!.type === DocumentType.PDF ? this.returnButtons() : null}
- </div>
- </div>
- </div>
- <div className="searchItem-info" style={{ width: this._useIcons ? "30px" : "100%" }}>
- <div className={`icon-${this._useIcons ? "icons" : "live"}`}>
- <div className="searchItem-type" title="Click to Preview" onPointerDown={this.onPointerDown}>{this.DocumentIcon()}</div>
- </div>
- </div>
- {/* <div className="searchItem-context" title="Drag as document">
- {(doc1 instanceof Doc && doc2 instanceof Doc) && this.rootDoc!.type === DocumentType.LINK ? <LinkContextMenu doc1={doc1} doc2={doc2} /> :
- this.contextButton}
- </div> */}
- </div>
- </div>;
- }
- }
-} \ No newline at end of file