aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorab <abdullah_ahmed@brown.edu>2019-09-16 15:26:36 -0400
committerab <abdullah_ahmed@brown.edu>2019-09-16 15:26:36 -0400
commit19375927c677ad6c99c77d0c7dac17fe7a2712a9 (patch)
tree147dd5d3263f8f050d6cda4bd4986f779a391621
parentd3b4f8991aefcc939768cfa82617e42862693bc6 (diff)
beginning to handle external interactions
-rw-r--r--src/client/ClientRecommender.tsx26
-rw-r--r--src/client/cognitive_services/CognitiveServices.ts12
-rw-r--r--src/client/views/Recommendations.tsx6
-rw-r--r--src/client/views/collections/CollectionSchemaCells.tsx16
-rw-r--r--src/client/views/nodes/DocumentView.tsx7
5 files changed, 49 insertions, 18 deletions
diff --git a/src/client/ClientRecommender.tsx b/src/client/ClientRecommender.tsx
index 217c89297..551047df0 100644
--- a/src/client/ClientRecommender.tsx
+++ b/src/client/ClientRecommender.tsx
@@ -139,7 +139,7 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
let fielddata = Cast(dataDoc.data, RichTextField);
let data: string;
fielddata ? data = fielddata[ToPlainText]() : data = "";
- let converter = (results: any, data: string) => {
+ let converter = async (results: any, data: string) => {
let keyterms = new List<string>(); // raw keywords
let keyterms_counted = new List<string>(); // keywords, where each keyword is repeated as
let highKP: string[] = [""]; // most frequent
@@ -167,10 +167,10 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
});
this.highKP = highKP;
console.log(highKP);
- this.sendRequest(highKP);
- return { keyterms: keyterms, keyterms_counted: keyterms_counted };
+ const values = await this.sendRequest(highKP);
+ return { keyterms: keyterms, keyterms_counted: keyterms_counted, values };
};
- await CognitiveServices.Text.Appliers.analyzer(dataDoc, extDoc, ["key words"], data, converter, mainDoc, internal);
+ return CognitiveServices.Text.Appliers.analyzer(dataDoc, extDoc, ["key words"], data, converter, mainDoc, internal);
}
private countFrequencies(keyphrase: string, paragraph: string) {
@@ -198,7 +198,9 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
private async sendRequest(keywords: string[]) {
let query = "";
keywords.forEach((kp: string) => query += " " + kp);
- await this.arxivrequest(query);
+ return new Promise<any>(resolve => {
+ this.arxivrequest(query).then(resolve);
+ });
}
/**
@@ -207,7 +209,7 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
arxivrequest = async (query: string) => {
let xhttp = new XMLHttpRequest();
- let serveraddress = "http://export.arxiv.org/api"
+ let serveraddress = "http://export.arxiv.org/api";
let endpoint = serveraddress + "/query?search_query=all:" + query + "&start=0&max_results=1";
let promisified = (resolve: any, reject: any) => {
xhttp.onreadystatechange = function () {
@@ -217,20 +219,22 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
console.log(xml);
switch (this.status) {
case 200:
+ let title: string = "Title";
+ let url: string = "Url";
//console.log(result);
if (xml) {
let titles = xml.getElementsByTagName("title");
if (titles && titles.length > 1) {
- let text = titles[1].childNodes[0].nodeValue;
- console.log(text);
+ title = titles[1].childNodes[0].nodeValue!;
+ console.log(title);
}
let ids = xml.getElementsByTagName("id");
if (ids && ids.length > 1) {
- let text = ids[1].childNodes[0].nodeValue;
- console.log(text);
+ url = ids[1].childNodes[0].nodeValue!;
+ console.log(url);
}
}
- return resolve(result);
+ return resolve({ title, url });
case 400:
default:
return reject(result);
diff --git a/src/client/cognitive_services/CognitiveServices.ts b/src/client/cognitive_services/CognitiveServices.ts
index 8a58355a8..baafb63a1 100644
--- a/src/client/cognitive_services/CognitiveServices.ts
+++ b/src/client/cognitive_services/CognitiveServices.ts
@@ -15,7 +15,7 @@ type RequestExecutor = (apiKey: string, body: string, service: Service) => Promi
type AnalysisApplier<D> = (target: Doc, relevantKeys: string[], data: D, ...args: any) => any;
type BodyConverter<D> = (data: D) => string;
type Converter = (results: any) => Field;
-type TextConverter = (results: any, data: string) => { keyterms: Field, keyterms_counted: Field };
+type TextConverter = (results: any, data: string) => Promise<{ keyterms: Field, keyterms_counted: Field, values: any }>;
export type Tag = { name: string, confidence: number };
export type Rectangle = { top: number, left: number, width: number, height: number };
@@ -288,11 +288,15 @@ export namespace CognitiveServices {
export const analyzer = async (dataDoc: Doc, target: Doc, keys: string[], data: string, converter: TextConverter, mainDoc: boolean = false, internal: boolean = true) => {
let results = await ExecuteQuery(Service.Text, Manager, data);
console.log(results);
- let keyterms = converter(results, data);
+ let { keyterms, values, keyterms_counted } = await converter(results, data);
//target[keys[0]] = Docs.Get.DocumentHierarchyFromJson(results, "Key Word Analysis");
- target[keys[0]] = keyterms.keyterms;
+ target[keys[0]] = keyterms;
console.log("analyzed!");
- if (internal) await vectorize(keyterms.keyterms_counted, dataDoc, mainDoc, data);
+ if (internal) {
+ await vectorize(keyterms_counted, dataDoc, mainDoc, data);
+ } else {
+ return values;
+ }
};
// export async function countFrequencies()
diff --git a/src/client/views/Recommendations.tsx b/src/client/views/Recommendations.tsx
index ff6e66492..b7b1d84d0 100644
--- a/src/client/views/Recommendations.tsx
+++ b/src/client/views/Recommendations.tsx
@@ -158,11 +158,15 @@ export class RecommendationsBox extends React.Component<FieldViewProps> {
// }
// let style = { left: this.pageX, top: this.pageY };
//const transform = "translate(" + (NumCast(this.props.node.x) + 350) + "px, " + NumCast(this.props.node.y) + "px"
+ let title = StrCast((this.props.Document.sourceDoc as Doc).title);
+ if (title.length > 15) {
+ title = title.substring(0, 15) + "...";
+ }
return (
// <Measure offset onResize={action((r: any) => { this._width = r.offset.width; this._height = r.offset.height; })}>
// {({ measureRef }) => (
<div className="rec-scroll">
- <p>Recommendations</p>
+ <p>Recommendations for "{title}"</p>
{DocListCast(this.props.Document.data).map(doc => {
return (
<div className="content">
diff --git a/src/client/views/collections/CollectionSchemaCells.tsx b/src/client/views/collections/CollectionSchemaCells.tsx
index 9c26a08f0..bf8c4b6f7 100644
--- a/src/client/views/collections/CollectionSchemaCells.tsx
+++ b/src/client/views/collections/CollectionSchemaCells.tsx
@@ -27,6 +27,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { SchemaHeaderField } from "../../../new_fields/SchemaHeaderField";
import { KeyCodes } from "../../northstar/utils/KeyCodes";
import { undoBatch } from "../../util/UndoManager";
+import { List } from "lodash";
library.add(faExpand);
@@ -86,10 +87,23 @@ export class CollectionSchemaCell extends React.Component<CellProps> {
}
@action
- onPointerDown = (e: React.PointerEvent): void => {
+ onPointerDown = async (e: React.PointerEvent): Promise<void> => {
this.props.changeFocusedCellByIndex(this.props.row, this.props.col);
this.props.setPreviewDoc(this.props.rowProps.original);
+ const data = await DocListCastAsync(this.props.Document.data);
+ if (data) {
+ let url: string;
+ if (url = StrCast(data[0].href)) {
+ try {
+ new URL(url);
+ const temp = window.open(url)!;
+ temp.blur();
+ window.focus();
+ } catch { }
+ }
+ }
+
// this._isEditing = true;
// this.props.setIsEditing(true);
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index 2ae71f1da..a034bc1f4 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -45,6 +45,7 @@ import { RecommendationsBox } from '../Recommendations';
import { SearchUtil } from '../../util/SearchUtil';
import { ClientRecommender } from '../../ClientRecommender';
import { DocumentType } from '../../documents/DocumentTypes';
+import { SchemaHeaderField } from '../../../new_fields/SchemaHeaderField';
const JsxParser = require('react-jsx-parser').default; //TODO Why does this need to be imported like this?
library.add(fa.faBrain);
@@ -774,7 +775,11 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
ClientRecommender.Instance.reset_docs();
const doc = Doc.GetDataDoc(this.props.Document);
const extdoc = doc.data_ext as Doc;
- return ClientRecommender.Instance.extractText(doc, extdoc ? extdoc : doc, false);
+ const values = await ClientRecommender.Instance.extractText(doc, extdoc ? extdoc : doc, false);
+ const headers = [new SchemaHeaderField("title"), new SchemaHeaderField("href")];
+ const body = Docs.Create.FreeformDocument([], { title: values.title });
+ body.href = values.url;
+ CollectionDockingView.Instance.AddRightSplit(Docs.Create.SchemaDocument(headers, [body], { title: `Showing External Recommendations for "${StrCast(doc.title)}"` }), undefined);
}
onPointerEnter = (e: React.PointerEvent): void => { Doc.BrushDoc(this.props.Document); };