aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/apis/hypothesis/HypothesisApiUtils.ts51
-rw-r--r--src/client/views/linking/LinkMenuItem.tsx6
-rw-r--r--src/client/views/nodes/DocumentLinksButton.tsx10
3 files changed, 44 insertions, 23 deletions
diff --git a/src/client/apis/hypothesis/HypothesisApiUtils.ts b/src/client/apis/hypothesis/HypothesisApiUtils.ts
index 83881cd89..2bffdb530 100644
--- a/src/client/apis/hypothesis/HypothesisApiUtils.ts
+++ b/src/client/apis/hypothesis/HypothesisApiUtils.ts
@@ -43,27 +43,44 @@ export namespace Hypothesis {
}
};
- // Find the most recent placeholder annotation created, and return its ID
- export const getPlaceholderId = async (searchKeyWord: string) => {
- const getResponse = await Hypothesis.searchAnnotation(searchKeyWord);
- const id = getResponse.rows.length > 0 ? getResponse.rows[0].id : undefined;
- const uri = getResponse.rows.length > 0 ? getResponse.rows[0].uri : undefined;
- return id ? { id, uri } : undefined;
+ export const editAnnotation = async (annotationId: string, newText: string) => {
+ console.log("DASH dispatching editRequest");
+ const credentials = await getCredentials();
+ document.dispatchEvent(new CustomEvent<{ newText: string, id: string, apiKey: string }>("editRequest", {
+ detail: { newText: newText, id: annotationId, apiKey: credentials.apiKey },
+ bubbles: true
+ }));
};
- // Send request to Hypothes.is client to modify a placeholder annotation into a hyperlink to Dash
- export const dispatchLinkRequest = async (title: string, url: string, annotationId: string) => {
- const credentials = await getCredentials();
+ /**
+ * Edit an annotation with ID @param annotationId to add a hyperlink to a Dash document, which needs to be
+ * written in the format [@param title](@param url)
+ */
+ export const makeLink = async (title: string, url: string, annotationId: string) => {
const oldAnnotation = await fetchAnnotation(annotationId);
const oldText = StrCast(oldAnnotation.text);
const newHyperlink = `[${title}\n](${url})`;
- const newText = oldText === "placeholder" ? newHyperlink : oldText + '\n\n' + newHyperlink;
+ const newText = oldText === "placeholder" ? newHyperlink : oldText + '\n\n' + newHyperlink; // if this is not the first link in the annotation, add link on new line
+ await editAnnotation(annotationId, newText);
+ };
- console.log("DASH dispatching linkRequest");
- document.dispatchEvent(new CustomEvent<{ newText: string, id: string, apiKey: string }>("linkRequest", {
- detail: { newText: newText, id: annotationId, apiKey: credentials.apiKey },
- bubbles: true
- }));
+ /**
+ * Edit an annotation with ID @param annotationId to delete a hyperlink to the Dash document with URL @param linkUrl
+ */
+ export const deleteLink = async (annotationId: string, linkUrl: string) => {
+ const annotation = await fetchAnnotation(annotationId);
+ const regex = new RegExp(`(\[[^[]*)\(${linkUrl.replace('/', '\/')}\)`);
+ const target = regex.exec(annotation.text); // use regex to extract the link to be deleted, which is written in [title](hyperlink) format
+ target && console.log(target);
+ // target && editAnnotation(annotationId, annotation.text.replace(target[0], ''));
+ };
+
+ // Finds the most recent placeholder annotation created and returns its ID
+ export const getPlaceholderId = async (searchKeyWord: string) => {
+ const getResponse = await Hypothesis.searchAnnotation(searchKeyWord);
+ const id = getResponse.rows.length > 0 ? getResponse.rows[0].id : undefined;
+ const uri = getResponse.rows.length > 0 ? getResponse.rows[0].uri : undefined;
+ return id ? { id, uri } : undefined;
};
// Construct an URL which will scroll the web page to a specific annotation's position
@@ -74,7 +91,7 @@ export namespace Hypothesis {
// Extract username from Hypothe.is's userId format
export const extractUsername = (userid: string) => {
- const exp: RegExp = /(?<=\:)(.*?)(?=\@)/;
- return exp.exec(userid)![0];
+ const regex = new RegExp('(?<=\:)(.*?)(?=\@)/');
+ return regex.exec(userid)![0];
};
} \ No newline at end of file
diff --git a/src/client/views/linking/LinkMenuItem.tsx b/src/client/views/linking/LinkMenuItem.tsx
index ad3c12122..509de2745 100644
--- a/src/client/views/linking/LinkMenuItem.tsx
+++ b/src/client/views/linking/LinkMenuItem.tsx
@@ -11,11 +11,13 @@ import { ContextMenu } from '../ContextMenu';
import './LinkMenuItem.scss';
import React = require("react");
import { DocumentManager } from '../../util/DocumentManager';
-import { setupMoveUpEvents, emptyFunction } from '../../../Utils';
+import { setupMoveUpEvents, emptyFunction, Utils } from '../../../Utils';
import { DocumentView } from '../nodes/DocumentView';
import { DocumentLinksButton } from '../nodes/DocumentLinksButton';
import { LinkDocPreview } from '../nodes/LinkDocPreview';
import { WebField } from '../../../fields/URLField';
+import { Hypothesis } from '../../apis/hypothesis/HypothesisApiUtils';
+import { Id } from '../../../fields/FieldSymbols';
library.add(faEye, faEdit, faTimes, faArrowRight, faChevronDown, faChevronUp, faPencilAlt);
@@ -169,6 +171,8 @@ export class LinkMenuItem extends React.Component<LinkMenuItemProps> {
@action
deleteLink = (): void => {
+ this.props.linkDoc.linksToAnnotation && Hypothesis.deleteLink(StrCast(this.props.linkDoc.annotationId), Utils.prepend("/doc/" + this.props.sourceDoc[Id])); // delete hyperlink in annotation
+ this.props.linkDoc.linksToAnnotation && console.log("annotationId", this.props.linkDoc.annotationId);
LinkManager.Instance.deleteLink(this.props.linkDoc);
//this.props.showLinks();
LinkDocPreview.LinkInfo = undefined;
diff --git a/src/client/views/nodes/DocumentLinksButton.tsx b/src/client/views/nodes/DocumentLinksButton.tsx
index ab97e8531..6d439e379 100644
--- a/src/client/views/nodes/DocumentLinksButton.tsx
+++ b/src/client/views/nodes/DocumentLinksButton.tsx
@@ -40,7 +40,7 @@ export class DocumentLinksButton extends React.Component<DocumentLinksButtonProp
componentDidMount() {
window.addEventListener("message", async (e: any) => {
if (e.origin === "http://localhost:1050" && e.data.message === "annotation created") {
- console.log("DASH RECEIVED MESSAGE:", e.data.message);
+ console.log("DASH received message: annotation created");
const response = await Hypothesis.getPlaceholderId("placeholder"); // delete once eventListening between client & Dash works
const source = SelectionManager.SelectedDocuments()[0];
response && runInAction(() => {
@@ -110,7 +110,6 @@ export class DocumentLinksButton extends React.Component<DocumentLinksButtonProp
if (DocumentLinksButton.StartLink === this.props.View) {
DocumentLinksButton.StartLink = undefined;
DocumentLinksButton.AnnotationId = undefined;
- console.log("reset to undefined (completeLink)");
// action((e: React.PointerEvent<HTMLDivElement>) => {
// Doc.UnBrushDoc(this.props.View.Document);
// });
@@ -124,8 +123,9 @@ export class DocumentLinksButton extends React.Component<DocumentLinksButtonProp
if (DocumentLinksButton.AnnotationId && DocumentLinksButton.AnnotationUri) {
const sourceUrl = DocumentLinksButton.AnnotationUri;
Doc.GetProto(linkDoc as Doc).linksToAnnotation = true;
+ Doc.GetProto(linkDoc as Doc).annotationId = DocumentLinksButton.AnnotationId;
Doc.GetProto(linkDoc as Doc).annotationUrl = Hypothesis.makeAnnotationUrl(DocumentLinksButton.AnnotationId, sourceUrl); // redirect web doc to this URL when following link
- Hypothesis.dispatchLinkRequest(StrCast(targetDoc.title), Utils.prepend("/doc/" + targetDoc[Id]), DocumentLinksButton.AnnotationId); // update and link placeholder annotation
+ Hypothesis.makeLink(StrCast(targetDoc.title), Utils.prepend("/doc/" + targetDoc[Id]), DocumentLinksButton.AnnotationId); // update and link placeholder annotation
}
LinkManager.currentLink = linkDoc;
@@ -151,7 +151,6 @@ export class DocumentLinksButton extends React.Component<DocumentLinksButtonProp
if (DocumentLinksButton.StartLink === this.props.View) {
DocumentLinksButton.StartLink = undefined;
DocumentLinksButton.AnnotationId = undefined;
- console.log("reset to undefined (finisheLinkClick)");
// action((e: React.PointerEvent<HTMLDivElement>) => {
// Doc.UnBrushDoc(this.props.View.Document);
// });
@@ -165,8 +164,9 @@ export class DocumentLinksButton extends React.Component<DocumentLinksButtonProp
if (DocumentLinksButton.AnnotationId && DocumentLinksButton.AnnotationUri) {
const sourceUrl = DocumentLinksButton.AnnotationUri; // the URL of the annotation's source web page
Doc.GetProto(linkDoc as Doc).linksToAnnotation = true;
+ Doc.GetProto(linkDoc as Doc).annotationId = DocumentLinksButton.AnnotationId;
Doc.GetProto(linkDoc as Doc).annotationUrl = Hypothesis.makeAnnotationUrl(DocumentLinksButton.AnnotationId, sourceUrl); // redirect web doc to this URL when following link
- Hypothesis.dispatchLinkRequest(StrCast(targetDoc.title), Utils.prepend("/doc/" + targetDoc[Id]), DocumentLinksButton.AnnotationId); // update and link placeholder annotation
+ Hypothesis.makeLink(StrCast(targetDoc.title), Utils.prepend("/doc/" + targetDoc[Id]), DocumentLinksButton.AnnotationId); // update and link placeholder annotation
}
LinkManager.currentLink = linkDoc;