aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/search
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2022-07-07 13:02:33 -0400
committerbobzel <zzzman@gmail.com>2022-07-07 13:02:33 -0400
commitdd16695b0c5fe8c54bc276a230381ae36e19e5ac (patch)
tree0544131ca2fb0d6f3cfae81aa5bbbb8b603b61ac /src/client/views/search
parenta9f704fbd5676bb9a8adf4c4f7ea61bf9b3f7603 (diff)
trying to fix errors in compiles
Diffstat (limited to 'src/client/views/search')
-rw-r--r--src/client/views/search/SearchBox.tsx213
1 files changed, 130 insertions, 83 deletions
diff --git a/src/client/views/search/SearchBox.tsx b/src/client/views/search/SearchBox.tsx
index 574193614..c5177de90 100644
--- a/src/client/views/search/SearchBox.tsx
+++ b/src/client/views/search/SearchBox.tsx
@@ -1,4 +1,4 @@
-import { Tooltip } from "@material-ui/core";
+import { Tooltip } from '@material-ui/core';
import { action, computed, observable } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
@@ -6,13 +6,12 @@ import { DirectLinksSym, Doc, DocListCast, DocListCastAsync, Field } from '../..
import { Id } from '../../../fields/FieldSymbols';
import { StrCast } from '../../../fields/Types';
import { DocUtils } from '../../documents/Documents';
-import { DocumentType } from "../../documents/DocumentTypes";
+import { DocumentType } from '../../documents/DocumentTypes';
import { DocumentManager } from '../../util/DocumentManager';
-import { CollectionDockingView } from "../collections/CollectionDockingView";
-import { ViewBoxBaseComponent } from "../DocComponent";
+import { CollectionDockingView } from '../collections/CollectionDockingView';
+import { ViewBoxBaseComponent } from '../DocComponent';
import { FieldView, FieldViewProps } from '../nodes/FieldView';
-import "./SearchBox.scss";
-
+import './SearchBox.scss';
const DAMPENING_FACTOR = 0.9;
const MAX_ITERATIONS = 25;
@@ -29,13 +28,15 @@ export interface SearchBoxProps extends FieldViewProps {
*/
@observer
export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
- public static LayoutString(fieldKey: string) { return FieldView.LayoutString(SearchBox, fieldKey); }
+ public static LayoutString(fieldKey: string) {
+ return FieldView.LayoutString(SearchBox, fieldKey);
+ }
public static Instance: SearchBox;
private _inputRef = React.createRef<HTMLInputElement>();
- @observable _searchString = "";
- @observable _docTypeString = "all";
+ @observable _searchString = '';
+ @observable _docTypeString = 'all';
@observable _results: Map<Doc, string[]> = new Map<Doc, string[]>();
@observable _pageRanks: Map<Doc, number> = new Map<Doc, number>();
@observable _linkedDocsOut: Map<Doc, Set<Doc>> = new Map<Doc, Set<Doc>>();
@@ -52,7 +53,7 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
SearchBox.Instance = this;
}
- /**
+ /**
* This method is called when the SearchBox component is first mounted. When the user opens
* the search panel, the search input box is automatically selected. This allows the user to
* type in the search input box immediately, without needing clicking on it first.
@@ -75,7 +76,7 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
* This method is called when the text in the search input box is modified by the user. The
* _searchString is updated to the new value of the text in the input box and submitSearch
* is called to update the search results accordingly.
- *
+ *
* (Note: There is no longer a need to press enter to submit a search. Any update to the input
* causes a search to be submitted automatically.)
*/
@@ -88,7 +89,7 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
* This method is called when the option in the select drop-down menu is changed. The
* _docTypeString is updated to the new value of the option in the drop-down menu. This
* is used to filter the results of the search to documents of a specific type.
- *
+ *
* (Note: This doesn't affect the results array, so there is no need to submit a new
* search here. The results of the search on the _searchString query are simply filtered
* by type directly before rendering them.)
@@ -134,8 +135,8 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
docs.filter(d => d && !visited.includes(d)).forEach(d => {
visited.push(d);
const fieldKey = Doc.LayoutFieldKey(d);
- const annos = !Field.toString(Doc.LayoutField(d) as Field).includes("CollectionView");
- const data = d[annos ? fieldKey + "-annotations" : fieldKey];
+ const annos = !Field.toString(Doc.LayoutField(d) as Field).includes('CollectionView');
+ const data = d[annos ? fieldKey + '-annotations' : fieldKey];
data && newarray.push(...DocListCast(data));
func(depth, d);
});
@@ -156,14 +157,18 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
var depth = 0;
while (docs.length > 0) {
newarray = [];
- await Promise.all(docs.filter(d => d).map(async d => {
- const fieldKey = Doc.LayoutFieldKey(d);
- const annos = !Field.toString(Doc.LayoutField(d) as Field).includes("CollectionView");
- const data = d[annos ? fieldKey + "-annotations" : fieldKey];
- const docs = await DocListCastAsync(data);
- docs && newarray.push(...docs);
- func(depth, d);
- }));
+ await Promise.all(
+ docs
+ .filter(d => d)
+ .map(async d => {
+ const fieldKey = Doc.LayoutFieldKey(d);
+ const annos = !Field.toString(Doc.LayoutField(d) as Field).includes('CollectionView');
+ const data = d[annos ? fieldKey + '-annotations' : fieldKey];
+ const docs = await DocListCastAsync(data);
+ docs && newarray.push(...docs);
+ func(depth, d);
+ })
+ );
docs = newarray;
depth++;
}
@@ -177,11 +182,10 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
* right side of each search result.
*/
static formatType(type: String): String {
- if (type === "pdf") {
- return "PDF";
- }
- else if (type === "image") {
- return "Img";
+ if (type === 'pdf') {
+ return 'PDF';
+ } else if (type === 'image') {
+ return 'Img';
}
return type.charAt(0).toUpperCase() + type.substring(1, 3);
@@ -198,9 +202,40 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
@action
searchCollection(query: string) {
const blockedTypes = [DocumentType.PRESELEMENT, DocumentType.KVP, DocumentType.FILTER, DocumentType.SEARCH, DocumentType.SEARCHITEM, DocumentType.FONTICON, DocumentType.BUTTON, DocumentType.SCRIPTING];
- const blockedKeys = ["x", "y", "proto", "width", "autoHeight", "acl-Override", "acl-Public", "context", "zIndex", "height", "text-scrollHeight", "text-height", "cloneFieldFilter", "isPrototype", "text-annotations",
- "dragFactory-count", "text-noTemplate", "aliases", "system", "layoutKey", "baseProto", "xMargin", "yMargin", "links", "layout", "layout_keyValue", "fitWidth", "viewType", "title-custom",
- "panX", "panY", "viewScale"];
+ const blockedKeys = [
+ 'x',
+ 'y',
+ 'proto',
+ 'width',
+ 'autoHeight',
+ 'acl-Override',
+ 'acl-Public',
+ 'context',
+ 'zIndex',
+ 'height',
+ 'text-scrollHeight',
+ 'text-height',
+ 'cloneFieldFilter',
+ 'isPrototype',
+ 'text-annotations',
+ 'dragFactory-count',
+ 'text-noTemplate',
+ 'aliases',
+ 'system',
+ 'layoutKey',
+ 'baseProto',
+ 'xMargin',
+ 'yMargin',
+ 'links',
+ 'layout',
+ 'layout_keyValue',
+ 'fitWidth',
+ 'viewType',
+ 'title-custom',
+ 'panX',
+ 'panY',
+ 'viewScale',
+ ];
const collection = CollectionDockingView.Instance;
query = query.toLowerCase();
@@ -211,10 +246,15 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
const docs = DocListCast(collection.rootDoc[Doc.LayoutFieldKey(collection.rootDoc)]);
const docIDs: String[] = [];
SearchBox.foreachRecursiveDoc(docs, (depth: number, doc: Doc) => {
- const dtype = StrCast(doc.type, "string") as DocumentType;
+ const dtype = StrCast(doc.type, 'string') as DocumentType;
if (dtype && !blockedTypes.includes(dtype) && !docIDs.includes(doc[Id]) && depth > 0) {
const hlights = new Set<string>();
- SearchBox.documentKeys(doc).forEach(key => Field.toString(doc[key] as Field).toLowerCase().includes(query) && hlights.add(key));
+ SearchBox.documentKeys(doc).forEach(
+ key =>
+ Field.toString(doc[key] as Field)
+ .toLowerCase()
+ .includes(query) && hlights.add(key)
+ );
blockedKeys.forEach(key => hlights.delete(key));
if (Array.from(hlights.keys()).length > 0) {
@@ -250,18 +290,16 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
this._results.forEach((_, linkedDoc) => {
this._linkedDocsIn.get(linkedDoc)?.add(doc);
});
- }
- else {
+ } else {
const linkedDocSet = new Set<Doc>();
- Doc.GetProto(doc)[DirectLinksSym].forEach((link) => {
+ Doc.GetProto(doc)[DirectLinksSym].forEach(link => {
const d1 = link?.anchor1 as Doc;
const d2 = link?.anchor2 as Doc;
if (doc === d1 && this._results.has(d2)) {
linkedDocSet.add(d2);
this._linkedDocsIn.get(d2)?.add(doc);
- }
- else if (doc === d2 && this._results.has(d1)) {
+ } else if (doc === d2 && this._results.has(d1)) {
linkedDocSet.add(d1);
this._linkedDocsIn.get(d1)?.add(doc);
}
@@ -289,8 +327,8 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
this._results.forEach((_, doc) => {
let nextPageRank = pageRankFromAll;
- this._linkedDocsIn.get(doc)?.forEach((linkedDoc) => {
- nextPageRank += DAMPENING_FACTOR * (this._pageRanks.get(linkedDoc) ?? 0) / (this._linkedDocsOut.get(linkedDoc)?.size ?? 1);
+ this._linkedDocsIn.get(doc)?.forEach(linkedDoc => {
+ nextPageRank += (DAMPENING_FACTOR * (this._pageRanks.get(linkedDoc) ?? 0)) / (this._linkedDocsOut.get(linkedDoc)?.size ?? 1);
});
nextPageRanks.set(doc, nextPageRank);
@@ -328,7 +366,7 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
*/
static documentKeys(doc: Doc) {
const keys: { [key: string]: boolean } = {};
- Doc.GetAllPrototypes(doc).map(proto => Object.keys(proto).forEach(key => keys[key] = false));
+ Doc.GetAllPrototypes(doc).map(proto => Object.keys(proto).forEach(key => (keys[key] = false)));
return Array.from(Object.keys(keys));
}
@@ -342,15 +380,13 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
const query = StrCast(this._searchString);
Doc.SetSearchQuery(query);
- Array.from(this._results.keys()).forEach(doc =>
- DocumentManager.Instance.getFirstDocumentView(doc)?.ComponentView?.search?.(this._searchString, undefined, true)
- );
+ Array.from(this._results.keys()).forEach(doc => DocumentManager.Instance.getFirstDocumentView(doc)?.ComponentView?.search?.(this._searchString, undefined, true));
this._results.clear();
if (query) {
this.searchCollection(query);
}
- }
+ };
/**
* This method resets the search by iterating through each result and removing all
@@ -372,7 +408,7 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
*/
selectElement = async (doc: Doc, finishFunc: () => void) => {
await DocumentManager.Instance.jumpToDocument(doc, true, undefined, [], undefined, undefined, undefined, finishFunc);
- }
+ };
/**
* This method returns a JSX list of the options in the select drop-down menu, which
@@ -380,9 +416,13 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
*/
@computed
public get selectOptions() {
- const selectValues = ["all", "rtf", "image", "pdf", "web", "video", "audio", "collection"];
+ const selectValues = ['all', 'rtf', 'image', 'pdf', 'web', 'video', 'audio', 'collection'];
- return selectValues.map(value => <option key={value} value={value}>{SearchBox.formatType(value)}</option>);
+ return selectValues.map(value => (
+ <option key={value} value={value}>
+ {SearchBox.formatType(value)}
+ </option>
+ ));
}
/**
@@ -393,39 +433,37 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
const isLinkSearch: boolean = this.props.linkSearch;
- const sortedResults = Array.from(this._results.entries()).sort((a, b) => (this._pageRanks.get(b[0]) ?? 0) - (this._pageRanks.get(a[0]) ?? 0)); // sorted by page rank
+ const sortedResults = Array.from(this._results.entries()).sort((a, b) => (this._pageRanks.get(b[0]) ?? 0) - (this._pageRanks.get(a[0]) ?? 0)); // sorted by page rank
const resultsJSX = Array();
- sortedResults.forEach((result) => {
- var className = "searchBox-results-scroll-view-result";
+ sortedResults.forEach(result => {
+ var className = 'searchBox-results-scroll-view-result';
if (this._selectedResult === result[0]) {
- className += " searchBox-results-scroll-view-result-selected";
+ className += ' searchBox-results-scroll-view-result-selected';
}
const formattedType = SearchBox.formatType(StrCast(result[0].type));
const title = result[0].title;
- if (this._docTypeString === "all" || this._docTypeString === result[0].type) {
+ if (this._docTypeString === 'all' || this._docTypeString === result[0].type) {
validResults++;
resultsJSX.push(
- <Tooltip key={result[0][Id]} placement={"right"} title={<><div className="dash-tooltip">{title}</div></>}>
- <div onClick={isLinkSearch ?
- () => this.makeLink(result[0]) :
- e => {
- this.onResultClick(result[0]);
- e.stopPropagation();
- }} className={className}>
- <div className="searchBox-result-title">
- {title}
- </div>
- <div className="searchBox-result-type">
- {formattedType}
- </div>
- <div className="searchBox-result-keys">
- {result[1].join(", ")}
- </div>
+ <Tooltip key={result[0][Id]} placement={'right'} title={<div className="dash-tooltip">{title as string}</div>}>
+ <div
+ onClick={
+ isLinkSearch
+ ? () => this.makeLink(result[0])
+ : e => {
+ this.onResultClick(result[0]);
+ e.stopPropagation();
+ }
+ }
+ className={className}>
+ <div className="searchBox-result-title">{title as string}</div>
+ <div className="searchBox-result-type">{formattedType}</div>
+ <div className="searchBox-result-keys">{result[1].join(', ')}</div>
</div>
</Tooltip>
);
@@ -433,22 +471,31 @@ export class SearchBox extends ViewBoxBaseComponent<SearchBoxProps>() {
});
return (
- <div style={{ pointerEvents: "all" }} className="searchBox-container">
- <div className="searchBox-bar" >
- {isLinkSearch ? (null) : <select name="type" id="searchBox-type" className="searchBox-type" onChange={this.onSelectChange}>
- {this.selectOptions}
- </select>}
- <input defaultValue={""} autoComplete="off" onChange={this.onInputChange} onKeyPress={e => e.key === "Enter" ? this.submitSearch() : null} type="text" placeholder="Search..." id="search-input" className="searchBox-input" style={{ width: isLinkSearch ? "100%" : undefined, borderRadius: isLinkSearch ? "5px" : undefined }} ref={this._inputRef} />
- </div >
+ <div style={{ pointerEvents: 'all' }} className="searchBox-container">
+ <div className="searchBox-bar">
+ {isLinkSearch ? null : (
+ <select name="type" id="searchBox-type" className="searchBox-type" onChange={this.onSelectChange}>
+ {this.selectOptions}
+ </select>
+ )}
+ <input
+ defaultValue={''}
+ autoComplete="off"
+ onChange={this.onInputChange}
+ onKeyPress={e => (e.key === 'Enter' ? this.submitSearch() : null)}
+ type="text"
+ placeholder="Search..."
+ id="search-input"
+ className="searchBox-input"
+ style={{ width: isLinkSearch ? '100%' : undefined, borderRadius: isLinkSearch ? '5px' : undefined }}
+ ref={this._inputRef}
+ />
+ </div>
<div className="searchBox-results-container">
- <div className="searchBox-results-count">
- {`${validResults}` + " result" + (validResults === 1 ? "" : "s")}
- </div>
- <div className="searchBox-results-scroll-view">
- {resultsJSX}
- </div>
+ <div className="searchBox-results-count">{`${validResults}` + ' result' + (validResults === 1 ? '' : 's')}</div>
+ <div className="searchBox-results-scroll-view">{resultsJSX}</div>
</div>
- </div >
+ </div>
);
}
-} \ No newline at end of file
+}