aboutsummaryrefslogtreecommitdiff
path: root/src/client/util
diff options
context:
space:
mode:
authorFawn <fangrui_tong@brown.edu>2019-06-10 20:02:32 -0400
committerFawn <fangrui_tong@brown.edu>2019-06-10 20:02:32 -0400
commitd429898b5337331450e46c223380e5d00967b2d6 (patch)
treea2ce1aacdb258a152c55a8800fa1e884e6ba8b94 /src/client/util
parent70996f3f19d408e819e081ed03bd7ccf0de44503 (diff)
added set up for metadata on links
Diffstat (limited to 'src/client/util')
-rw-r--r--src/client/util/DocumentManager.ts5
-rw-r--r--src/client/util/DragManager.ts4
-rw-r--r--src/client/util/LinkManager.ts81
3 files changed, 61 insertions, 29 deletions
diff --git a/src/client/util/DocumentManager.ts b/src/client/util/DocumentManager.ts
index 52f0fe3f6..2acbb3ad4 100644
--- a/src/client/util/DocumentManager.ts
+++ b/src/client/util/DocumentManager.ts
@@ -9,7 +9,7 @@ import { CollectionView } from '../views/collections/CollectionView';
import { CollectionPDFView } from '../views/collections/CollectionPDFView';
import { CollectionVideoView } from '../views/collections/CollectionVideoView';
import { Id } from '../../new_fields/FieldSymbols';
-import { LinkManager } from './LinkManager';
+import { LinkManager, LinkUtils } from './LinkManager';
export class DocumentManager {
@@ -92,7 +92,8 @@ export class DocumentManager {
pairs.push(...linksList.reduce((pairs, link) => {
if (link) {
// let destination = (link["linkedTo"] === dv.props.Document) ? link["linkedFrom"] : link["linkedTo"];
- let destination = LinkManager.Instance.findOppositeAnchor(link, dv.props.Document);
+
+ let destination = LinkUtils.findOppositeAnchor(link, dv.props.Document);
let linkToDoc = FieldValue(Cast(destination, Doc));
// let linkToDoc = FieldValue(Cast(link.linkedTo, Doc));
if (linkToDoc) {
diff --git a/src/client/util/DragManager.ts b/src/client/util/DragManager.ts
index 809368aff..9ac421fbf 100644
--- a/src/client/util/DragManager.ts
+++ b/src/client/util/DragManager.ts
@@ -4,7 +4,7 @@ import { Cast } from "../../new_fields/Types";
import { emptyFunction } from "../../Utils";
import { CollectionDockingView } from "../views/collections/CollectionDockingView";
import * as globalCssVariables from "../views/globalCssVariables.scss";
-import { LinkManager } from "./LinkManager";
+import { LinkManager, LinkUtils } from "./LinkManager";
export type dropActionType = "alias" | "copy" | undefined;
export function SetupDrag(_reference: React.RefObject<HTMLElement>, docFunc: () => Doc | Promise<Doc>, moveFunc?: DragManager.MoveFunction, dropAction?: dropActionType) {
@@ -48,7 +48,7 @@ export async function DragLinksAsDocuments(dragEle: HTMLElement, x: number, y: n
// let linkFromDocs = await DocListCastAsync(srcTarg.linkedFromDocs);
let linkDocs = LinkManager.Instance.findAllRelatedLinks(srcTarg);
if (linkDocs) draggedDocs = linkDocs.map(link => {
- return LinkManager.Instance.findOppositeAnchor(link, sourceDoc);
+ return LinkUtils.findOppositeAnchor(link, sourceDoc);
});
diff --git a/src/client/util/LinkManager.ts b/src/client/util/LinkManager.ts
index a6d649395..5e8e0475b 100644
--- a/src/client/util/LinkManager.ts
+++ b/src/client/util/LinkManager.ts
@@ -10,6 +10,43 @@ import { Doc } from "../../new_fields/Doc";
import { listSpec } from "../../new_fields/Schema";
import { List } from "../../new_fields/List";
+export namespace LinkUtils {
+ export function findOppositeAnchor(link: Doc, anchor: Doc): Doc {
+ if (Doc.AreProtosEqual(anchor, Cast(link.anchor1, Doc, new Doc))) {
+ return Cast(link.anchor2, Doc, new Doc);
+ } else {
+ return Cast(link.anchor1, Doc, new Doc);
+ }
+ }
+
+ // export function getAnchorGroups(link: Doc, anchor: Doc): Doc[] {
+ // let groups;
+ // if (Doc.AreProtosEqual(anchor, Cast(link.anchor1, Doc, new Doc))) {
+ // groups = Cast(link.anchor1Groups, listSpec(Doc), []);
+ // } else {
+ // groups = Cast(link.anchor2Groups, listSpec(Doc), []);
+ // }
+
+ // if (groups instanceof Doc[]) {
+ // return groups;
+ // } else {
+ // return [];
+ // }
+ // // if (Doc.AreProtosEqual(anchor, Cast(link.anchor1, Doc, new Doc))) {
+ // // returnCast(link.anchor1Groups, listSpec(Doc), []);
+ // // } else {
+ // // return Cast(link.anchor2Groups, listSpec(Doc), []);
+ // // }
+ // }
+
+ export function setAnchorGroups(link: Doc, anchor: Doc, groups: Doc[]) {
+ if (Doc.AreProtosEqual(anchor, Cast(link.anchor1, Doc, new Doc))) {
+ link.anchor1Groups = new List<Doc>(groups);
+ } else {
+ link.anchor2Groups = new List<Doc>(groups);
+ }
+ }
+}
export class LinkManager {
private static _instance: LinkManager;
@@ -19,31 +56,30 @@ export class LinkManager {
private constructor() {
}
- @observable
- public allLinks: Array<Doc> = [];
+ @observable public allLinks: Array<Doc> = [];
+ @observable public allGroups: Map<string, Doc> = new Map();
- public findAllRelatedLinks(source: Doc): Array<Doc> {
- let related = LinkManager.Instance.allLinks.filter(
- link => Doc.AreProtosEqual(source, Cast(link.anchor1, Doc, new Doc)) || Doc.AreProtosEqual(source, Cast(link.anchor2, Doc, new Doc)));
- return related;
+ public findAllRelatedLinks(anchor: Doc): Array<Doc> {
+ return LinkManager.Instance.allLinks.filter(
+ link => Doc.AreProtosEqual(anchor, Cast(link.anchor1, Doc, new Doc)) || Doc.AreProtosEqual(anchor, Cast(link.anchor2, Doc, new Doc)));
}
- public findRelatedGroupedLinks(source: Doc): Map<string, Array<Doc>> {
- let related = this.findAllRelatedLinks(source);
+ public findRelatedGroupedLinks(anchor: Doc): Map<string, Array<Doc>> {
+ let related = this.findAllRelatedLinks(anchor);
- let categories = new Map();
+ let anchorGroups = new Map();
related.forEach(link => {
// get groups of given doc
- let groups = (Doc.AreProtosEqual(source, Cast(link.anchor1, Doc, new Doc))) ? Cast(link.anchor1Groups, listSpec(Doc), []) : Cast(link.anchor2Groups, listSpec(Doc), []);
- if (groups) {
- if (groups.length > 0) {
- groups.forEach(groupDoc => {
+ let oppGroups = (Doc.AreProtosEqual(anchor, Cast(link.anchor1, Doc, new Doc))) ? Cast(link.anchor1Groups, listSpec(Doc), []) : Cast(link.anchor2Groups, listSpec(Doc), []);
+ if (oppGroups) {
+ if (oppGroups.length > 0) {
+ oppGroups.forEach(groupDoc => {
if (groupDoc instanceof Doc) {
let groupType = StrCast(groupDoc.proto!.type);
- let group = categories.get(groupType); // TODO: clean this up lol
+ let group = anchorGroups.get(groupType); // TODO: clean this up lol
if (group) group.push(link);
else group = [link];
- categories.set(groupType, group);
+ anchorGroups.set(groupType, group);
} else {
// promise doc
}
@@ -52,10 +88,10 @@ export class LinkManager {
}
else {
// if link is in no groups then put it in default group
- let group = categories.get("*");
+ let group = anchorGroups.get("*");
if (group) group.push(link);
else group = [link];
- categories.set("*", group);
+ anchorGroups.set("*", group);
}
}
@@ -66,16 +102,11 @@ export class LinkManager {
// else group = [link];
// categories.set(link.linkTags, group);
})
- return categories;
+ return anchorGroups;
}
- public findOppositeAnchor(link: Doc, source: Doc): Doc {
- if (Doc.AreProtosEqual(source, Cast(link.anchor1, Doc, new Doc))) {
- return Cast(link.anchor2, Doc, new Doc);
- } else {
- return Cast(link.anchor1, Doc, new Doc);
- }
- }
+
+
// public findAnchorTags(link: Doc, source: Doc): Doc[] {
// if (source)