aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgeireann <geireann.lindfield@gmail.com>2021-08-05 17:18:54 -0400
committergeireann <geireann.lindfield@gmail.com>2021-08-05 17:18:54 -0400
commit334a0d582ab71bbfb347809e584a3ed76ad3621a (patch)
treeae8bb511b946fa31b3f136268948d8a3d8ac8576 /src
parent04ae1c712422036b3986675486ea9a1eddb25e36 (diff)
parentf4c61d4c92182dc6598a8b6c7460baa52c65ebdc (diff)
Merge branch 'search-david' of https://github.com/brown-dash/Dash-Web into search-david
Diffstat (limited to 'src')
-rw-r--r--src/client/views/MainView.tsx6
-rw-r--r--src/client/views/collections/collectionSchema/CollectionSchemaHeaders.tsx2
-rw-r--r--src/client/views/search/SearchBox.scss22
-rw-r--r--src/client/views/search/SearchBox.tsx384
4 files changed, 179 insertions, 235 deletions
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 6ff8825ed..a07f4037a 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -179,12 +179,6 @@ export class MainView extends React.Component {
const targets = document.elementsFromPoint(e.x, e.y);
if (targets.length) {
const targClass = targets[0].className.toString();
- /*if (SearchBox.Instance._resultsOpen) {
- const check = targets.some((thing) =>
- (thing.className === "collectionSchemaView-searchContainer" || (thing as any)?.dataset.icon === "filter" ||
- thing.className === "collectionSchema-header-menuOptions"));
- !check && SearchBox.Instance.resetSearch(true);
- }*/
!targClass.includes("contextMenu") && ContextMenu.Instance.closeMenu();
!["timeline-menu-desc", "timeline-menu-item", "timeline-menu-input"].includes(targClass) && TimelineMenu.Instance.closeMenu();
}
diff --git a/src/client/views/collections/collectionSchema/CollectionSchemaHeaders.tsx b/src/client/views/collections/collectionSchema/CollectionSchemaHeaders.tsx
index b2115b22e..aaa50ba67 100644
--- a/src/client/views/collections/collectionSchema/CollectionSchemaHeaders.tsx
+++ b/src/client/views/collections/collectionSchema/CollectionSchemaHeaders.tsx
@@ -424,7 +424,7 @@ export class KeysDropdown extends React.Component<KeysDropdownProps> {
e.target.checked === true ? Doc.setDocFilter(this.props.Document, this._key, key, "check") : Doc.setDocFilter(this.props.Document, this._key, key, "remove");
e.target.checked === true ? this.closeResultsVisibility = "contents" : console.log("");
e.target.checked === true ? this.props.col.setColor("green") : this.updateFilter();
- e.target.checked === true && SearchBox.Instance.filter === true ? Doc.setDocFilter(docs[0], this._key, key, "check") : Doc.setDocFilter(docs[0], this._key, key, "remove");
+ e.target.checked === true ? Doc.setDocFilter(docs[0], this._key, key, "check") : Doc.setDocFilter(docs[0], this._key, key, "remove");
}}
checked={bool}
/>
diff --git a/src/client/views/search/SearchBox.scss b/src/client/views/search/SearchBox.scss
index 3d173f115..2586ef2ee 100644
--- a/src/client/views/search/SearchBox.scss
+++ b/src/client/views/search/SearchBox.scss
@@ -66,13 +66,13 @@
display: inline-block;
vertical-align: middle;
width: 100%;
- height: 40px;
+ height: 50px;
cursor: pointer;
font-size: 15px;
- padding: 10px;
+ padding: 11px;
&.searchBox-results-scroll-view-result-selected {
- background: gray;
+ background: #999;
}
.searchBox-result-title {
@@ -84,11 +84,25 @@
.searchBox-result-type {
font-size: 12px;
+ margin-top: 6px;
display: relative;
float: right;
width: 60px;
text-align: right;
- color: #333;
+ color: #222;
+ }
+
+ .searchBox-result-keys {
+ font-size: 10px;
+ margin-top: 1px;
+ display: relative;
+ float: left;
+ width: 100%;
+ text-align: left;
+ color: #555;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
}
}
diff --git a/src/client/views/search/SearchBox.tsx b/src/client/views/search/SearchBox.tsx
index 51b1319d4..66012e3f4 100644
--- a/src/client/views/search/SearchBox.tsx
+++ b/src/client/views/search/SearchBox.tsx
@@ -1,7 +1,7 @@
-import { action, observable } from 'mobx';
+import { action, computed, observable } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
-import { Doc, DocListCast, Field } from '../../../fields/Doc';
+import { Doc, DocListCast, DocListCastAsync, Field } from '../../../fields/Doc';
import { documentSchema } from "../../../fields/documentSchemas";
import { Id } from '../../../fields/FieldSymbols';
import { createSchema, makeInterface } from '../../../fields/Schema';
@@ -18,58 +18,99 @@ export const searchSchema = createSchema({ Document: Doc });
type SearchBoxDocument = makeInterface<[typeof documentSchema, typeof searchSchema]>;
const SearchBoxDocument = makeInterface(documentSchema, searchSchema);
-const selectValues = ["all", "rtf", "image", "pdf", "web", "video", "audio", "collection"]
-
+/**
+ * This is the SearchBox component. It represents the search box input and results in
+ * the search panel on the left side of the screen.
+ */
@observer
export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDocument>(SearchBoxDocument) {
public static LayoutString(fieldKey: string) { return FieldView.LayoutString(SearchBox, fieldKey); }
public static Instance: SearchBox;
- private _resultsSet = new Map<Doc, number>();
private _inputRef = React.createRef<HTMLInputElement>();
+ private _selectedCollection = CollectionDockingView.Instance;
@observable _searchString = "";
@observable _docTypeString = "all";
- @observable _results: [Doc, string[], string[]][] = [];
+ @observable _results: [Doc, string[]][] = [];
@observable _selectedResult: Doc | undefined = undefined;
@observable _deletedDocsStatus: boolean = false;
@observable _onlyAliases: boolean = true;
+ /**
+ * This is the constructor for the SearchBox class.
+ */
constructor(props: any) {
super(props);
SearchBox.Instance = this;
- this._searchString = "reset_search";
- this.submitSearch();
- this._searchString = "";
- this.submitSearch();
}
+ /**
+ * 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.
+ */
componentDidMount = action(() => {
if (this._inputRef.current) {
this._inputRef.current.focus();
}
});
+ /**
+ * This method is called when the SearchBox component is about to be unmounted. When the user
+ * closes the search panel, the search and its results are reset.
+ */
componentWillUnmount() {
- this.resetSearch;
+ this.resetSearch();
}
+ /**
+ * 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.)
+ */
onInputChange = action((e: React.ChangeEvent<HTMLInputElement>) => {
this._searchString = e.target.value;
this.submitSearch();
});
+ /**
+ * 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.)
+ */
onSelectChange = action((e: React.ChangeEvent<HTMLSelectElement>) => {
this._docTypeString = e.target.value;
});
+ /**
+ * @param {Doc} doc - doc of the search result that has been clicked on
+ *
+ * This method is called when the user clicks on a search result. The _selectedResult is
+ * updated accordingly and the doc is highlighted with the selectElement method.
+ */
onResultClick = action((doc: Doc) => {
this.selectElement(doc);
this._selectedResult = doc;
});
- static foreachRecursiveDoc(docs: Doc[], func: (doc: Doc) => void) {
+ /**
+ * @param {Doc[]} docs - docs to be searched through recursively
+ * @param {number, Doc => void} func - function to be called on each doc
+ *
+ * This method iterates through an array of docs and all docs within those docs, calling
+ * the function func on each doc.
+ */
+ static foreachRecursiveDoc(docs: Doc[], func: (depth: number, doc: Doc) => void) {
let newarray: Doc[] = [];
+ var depth = 0;
while (docs.length > 0) {
newarray = [];
docs.filter(d => d).forEach(d => {
@@ -77,12 +118,45 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
const annos = !Field.toString(Doc.LayoutField(d) as Field).includes("CollectionView");
const data = d[annos ? fieldKey + "-annotations" : fieldKey];
data && newarray.push(...DocListCast(data));
- func(d);
+ func(depth, d);
});
docs = newarray;
+ depth++;
}
}
+ /**
+ * @param {Doc[]} docs - docs to be searched through recursively
+ * @param {number, Doc => void} func - function to be called on each doc
+ *
+ * This method iterates asynchronously through an array of docs and all docs within those
+ * docs, calling the function func on each doc.
+ */
+ static async foreachRecursiveDocAsync(docs: Doc[], func: (depth: number, doc: Doc) => void) {
+ let newarray: Doc[] = [];
+ 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);
+ }));
+ docs = newarray;
+ depth++;
+ }
+ }
+
+ /**
+ * @param {String} type - string representing the type of a doc
+ *
+ * This method converts a doc type string of any length to a 3-letter doc type string in
+ * which the first letter is capitalized. This is used when displaying the type on the
+ * right side of each search result.
+ */
static formatType(type: String): String {
if (type == "pdf") {
return "PDF";
@@ -94,57 +168,75 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
return type.charAt(0).toUpperCase() + type.substring(1, 3);
}
+ /**
+ * @param {String} query - search query string
+ *
+ * This method searches the CollectionDockingView instance for a certain query and puts
+ * the matching results in the results array. Docs are considered to be matching results
+ * when the query is a substring of many different pieces of its metadata (title, text,
+ * author, etc).
+ */
@action
searchCollection(query: string) {
- const selectedCollection = CollectionDockingView.Instance;
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"]
query = query.toLowerCase();
this._results = []
+ this._selectedResult = undefined
- if (selectedCollection !== undefined) {
- const docs = DocListCast(selectedCollection.dataDoc[Doc.LayoutFieldKey(selectedCollection.dataDoc)]);
- SearchBox.foreachRecursiveDoc(docs, (doc: Doc) => {
+ if (this._selectedCollection !== undefined) {
+ const docs = DocListCast(this._selectedCollection.dataDoc[Doc.LayoutFieldKey(this._selectedCollection.dataDoc)]);
+ const docIDs: String[] = []
+ SearchBox.foreachRecursiveDoc(docs, (depth: number, doc: Doc) => {
const dtype = StrCast(doc.type, "string") as DocumentType;
- if (dtype && !blockedTypes.includes(dtype)) {
+ 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));
- Array.from(hlights.keys()).length > 0 && this._results.push([doc, Array.from(hlights.keys()), []]);
+ blockedKeys.forEach(key => {
+ hlights.delete(key);
+ })
+ Array.from(hlights.keys()).length > 0 && this._results.push([doc, Array.from(hlights.keys())]);
}
+ docIDs.push(doc[Id])
});
}
-
- this._results = Array.from(new Set(this._results))
- this._selectedResult = undefined
}
+ /**
+ * @param {Doc} doc - doc for which keys are returned
+ *
+ * This method returns a list of a document doc's keys.
+ */
static documentKeys(doc: Doc) {
const keys: { [key: string]: boolean } = {};
- // bcz: ugh. this is untracked since otherwise a large collection of documents will blast the server for all their fields.
- // then as each document's fields come back, we update the documents _proxies. Each time we do this, the whole schema will be
- // invalidated and re-rendered. This workaround will inquire all of the document fields before the options button is clicked.
- // then by the time the options button is clicked, all of the fields should be in place. If a new field is added while this menu
- // is displayed (unlikely) it won't show up until something else changes.
- //TODO Types
Doc.GetAllPrototypes(doc).map(proto => Object.keys(proto).forEach(key => keys[key] = false));
return Array.from(Object.keys(keys));
}
+ /**
+ * This method submits a search with the _searchString as its query and updates
+ * the results array accordingly.
+ */
@action
submitSearch = async () => {
this.resetSearch();
- //this.dataDoc[this.fieldKey] = new List<Doc>([]);
let query = StrCast(this._searchString);
Doc.SetSearchQuery(query);
this._results = [];
- this._resultsSet.clear();
if (query) {
this.searchCollection(query);
}
}
+ /**
+ * This method resets the search by iterating through each result and removing all
+ * brushes and highlights. All search matches are cleared as well.
+ */
resetSearch = action(() => {
this._results.forEach(result => {
Doc.UnBrushDoc(result[0]);
@@ -153,10 +245,32 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
});
});
+ /**
+ * @param {Doc} doc - doc to be selected
+ *
+ * This method selects a doc by either jumping to it (centering/zooming in on it)
+ * or opening it in a new tab.
+ */
selectElement = async (doc: Doc) => {
- await DocumentManager.Instance.jumpToDocument(doc, true); // documents open in new tab instead of on right
+ await DocumentManager.Instance.jumpToDocument(doc, true);
}
+ /**
+ * This method returns a JSX list of the options in the select drop-down menu, which
+ * is used to filter the types of documents that appear in the search results.
+ */
+ @computed
+ public get selectOptions() {
+ const selectValues = ["all", "rtf", "image", "pdf", "web", "video", "audio", "collection"]
+
+ return selectValues.map(value => {
+ return <option key={value} value={value}>{SearchBox.formatType(value)}</option>
+ })
+ }
+
+ /**
+ * This method renders the search input box, select drop-down menu, and search results.
+ */
render() {
var validResults = 0;
@@ -169,7 +283,19 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
if (this._docTypeString == "all" || this._docTypeString == result[0].type) {
validResults++;
- return (<div key={result[0][Id]} onClick={() => this.onResultClick(result[0])} className={className}><div className="searchBox-result-title">{result[0].title}</div><div className="searchBox-result-type">{SearchBox.formatType(StrCast(result[0].type))}</div></div>)
+ return (
+ <div key={result[0][Id]} onClick={() => this.onResultClick(result[0])} className={className}>
+ <div className="searchBox-result-title">
+ {result[0].title}
+ </div>
+ <div className="searchBox-result-type">
+ {SearchBox.formatType(StrCast(result[0].type))}
+ </div>
+ <div className="searchBox-result-keys">
+ {result[1].join(", ")}
+ </div>
+ </div>
+ )
}
return null;
@@ -177,15 +303,11 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
results.filter(result => result);
- const selectOptions = selectValues.map(value => {
- return <option key={value} value={value}>{SearchBox.formatType(value)}</option>
- })
-
return (
<div style={{ pointerEvents: "all" }} className="searchBox-container">
<div className="searchBox-bar">
<select name="type" id="searchBox-type" className="searchBox-type" onChange={this.onSelectChange}>
- {selectOptions}
+ {this.selectOptions}
</select>
<input defaultValue={""} autoComplete="off" onChange={this.onInputChange} type="text" placeholder="Search..." id="search-input" className="searchBox-input" ref={this._inputRef} />
</div >
@@ -200,190 +322,4 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
</div >
);
}
-}
-
-
-
-/*
-import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { Tooltip } from '@material-ui/core';
-import { action, computed, IReactionDisposer, observable, reaction, runInAction } from 'mobx';
-import { observer } from 'mobx-react';
-import * as React from 'react';
-import { Doc, DocListCast, Field, Opt, DocListCastAsync, DataSym, HeightSym, FieldsSym } from '../../../fields/Doc';
-import { documentSchema } from "../../../fields/documentSchemas";
-import { Copy, Id, ToString } from '../../../fields/FieldSymbols';
-import { List } from '../../../fields/List';
-import { createSchema, listSpec, makeInterface } from '../../../fields/Schema';
-import { SchemaHeaderField } from '../../../fields/SchemaHeaderField';
-import { Cast, NumCast, StrCast } from '../../../fields/Types';
-import { emptyFunction, returnFalse, returnZero, setupMoveUpEvents, Utils } from '../../../Utils';
-import { Docs } from '../../documents/Documents';
-import { DocumentType } from "../../documents/DocumentTypes";
-import { CurrentUserUtils } from "../../util/CurrentUserUtils";
-import { SetupDrag } from '../../util/DragManager';
-import { SearchUtil } from '../../util/SearchUtil';
-import { Transform } from '../../util/Transform';
-import { CollectionDockingView } from "../collections/CollectionDockingView";
-import { CollectionSchemaView, ColumnType } from "../collections/CollectionSchemaView";
-import { CollectionViewType } from '../collections/CollectionView';
-import { ViewBoxBaseComponent } from "../DocComponent";
-import { FieldView, FieldViewProps } from '../nodes/FieldView';
-import "./SearchBox.scss";
-import { undoBatch } from "../../util/UndoManager";
-import { DocServer } from "../../DocServer";
-import { MainView } from "../MainView";
-import { SelectionManager } from "../../util/SelectionManager";
-import { CollectionSchemaBooleanCell } from "../collections/CollectionSchemaCells";
-import { transpileModule } from "typescript";
-import { DocumentManager } from "../../util/DocumentManager";
-
-export const searchSchema = createSchema({ Document: Doc });
-
-type SearchBoxDocument = makeInterface<[typeof documentSchema, typeof searchSchema]>;
-const SearchBoxDocument = makeInterface(documentSchema, searchSchema);
-
-@observer
-export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDocument>(SearchBoxDocument) {
- public static LayoutString(fieldKey: string) { return FieldView.LayoutString(SearchBox, fieldKey); }
- public static Instance: SearchBox;
-
- @observable _searchString = "";
- @observable _docTypeString = "all";
- @observable _results: [Doc, string[], string[]][] = [];
- @observable _selectedResult: Doc | undefined = undefined;
- @observable _deletedDocsStatus: boolean = false;
- @observable _onlyAliases: boolean = true;
-
- constructor(props: any) {
- super(props);
- SearchBox.Instance = this;
- }
-
- onInputChange = action((e: React.ChangeEvent<HTMLInputElement>) => {
- this._searchString = e.target.value;
- this.submitSearch();
- });
-
- onSelectChange = action((e: React.ChangeEvent<HTMLSelectElement>) => {
- this._docTypeString = e.target.value;
- this.submitSearch();
- });
-
- onResultClick = action((doc: Doc) => {
- this.selectElement(doc);
- this._selectedResult = doc;
- });
-
- static foreachRecursiveDoc(docs: Doc[], func: (doc: Doc) => void) {
- const blockedTypes = [DocumentType.PRESELEMENT, DocumentType.KVP, DocumentType.FILTER, DocumentType.SEARCH, DocumentType.SEARCHITEM, DocumentType.FONTICON, DocumentType.BUTTON, DocumentType.SCRIPTING];
- let newarray: Doc[] = [];
- while (docs.length > 0) {
- newarray = [];
- docs.filter(d => d).forEach(d => {
- const dtype = StrCast(d.type, "string") as DocumentType;
- if (dtype && !blockedTypes.includes(dtype)) {
- const fieldKey = Doc.LayoutFieldKey(d);
- const annos = !Field.toString(Doc.LayoutField(d) as Field).includes("CollectionView");
- const data = d[annos ? fieldKey + "-annotations" : fieldKey];
- data && newarray.push(...DocListCast(data));
- func(d);
- }
- });
- docs = newarray;
- }
- }
-
- @action
- searchCollection(query: string) {
- const selectedCollection = CollectionDockingView.Instance;
- query = query.toLowerCase();
-
- if (selectedCollection !== undefined) {
- console.log("hello111")
- // this._currentSelectedCollection = selectedCollection;
- const docs = DocListCast(selectedCollection.dataDoc[Doc.LayoutFieldKey(selectedCollection.dataDoc)]);
- const found: [Doc, string[], string[]][] = [];
- SearchBox.foreachRecursiveDoc(docs, (doc: Doc) => {
- console.log("HELLO")
- if (this._docTypeString == "all" || this._docTypeString == doc.type) {
- const hlights = new Set<string>();
- SearchBox.documentKeys(doc).forEach(key => Field.toString(doc[key] as Field).toLowerCase().includes(query) && hlights.add(key));
- Array.from(hlights.keys()).length > 0 && found.push([doc, Array.from(hlights.keys()), []]);
- }
- });
-
- this._results = found;
- //this.setSearchFilter(selectedCollection, this.filter && found.length ? this._docsforfilter : undefined);
- }
- }
-
- static documentKeys(doc: Doc) {
- const keys: { [key: string]: boolean } = {};
- // bcz: ugh. this is untracked since otherwise a large collection of documents will blast the server for all their fields.
- // then as each document's fields come back, we update the documents _proxies. Each time we do this, the whole schema will be
- // invalidated and re-rendered. This workaround will inquire all of the document fields before the options button is clicked.
- // then by the time the options button is clicked, all of the fields should be in place. If a new field is added while this menu
- // is displayed (unlikely) it won't show up until something else changes.
- //TODO Types
- Doc.GetAllPrototypes(doc).map(proto => Object.keys(proto).forEach(key => keys[key] = false));
- return Array.from(Object.keys(keys));
- }
-
- @action
- submitSearch = async () => {
- Doc.ClearSearchMatches();
- this._results = [];
-
- this.dataDoc[this.fieldKey] = new List<Doc>([]);
- let query = StrCast(this._searchString);
- Doc.SetSearchQuery(query);
- this._results = [];
-
- if (query) {
- this.searchCollection(query);
- }
- }
-
- selectElement = async (doc: Doc) => {
- await DocumentManager.Instance.jumpToDocument(doc, true); // documents open in new tab instead of on right
- }
-
- render() {
- const results = this._results.map(result => {
- var className = "searchBox-results-scroll-view-result";
-
- if (this._selectedResult == result[0]) {
- className += " searchBox-results-scroll-view-result-selected"
- }
-
- return (<div key={result[0][Id]} onClick={() => this.onResultClick(result[0])} className={className}><div className="titletitle">{result[0].title}</div></div>)
- })
-
- return (
- <div style={{ pointerEvents: "all" }} className="searchBox-container">
- <div className="searchBox-bar">
- <select name="type" id="searchBox-type" className="searchBox-type" onChange={this.onSelectChange}>
- <option value="all">All</option>
- <option value="rtf">Text</option>
- <option value="img">Img</option>
- <option value="pdf">PDF</option>
- <option value="video">Vid</option>
- <option value="audio">Aud</option>
- <option value="inks">Ink</option>
- <option value="col">Col</option>
- </select>
- <input defaultValue={""} autoComplete="off" onChange={this.onInputChange} type="text" placeholder="Search..." id="search-input" className="searchBox-input" />
- </div >
- <div className="searchBox-results-container">
- <div className="searchBox-results-count">
- {`${this._results.length}` + " result" + (this._results.length == 1 ? "" : "s")}
- </div>
- <div className="searchBox-results-scroll-view">
- {results}
- </div>
- </div>
- </div >
- );
- }
-}*/ \ No newline at end of file
+} \ No newline at end of file