aboutsummaryrefslogtreecommitdiff
path: root/src/client/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/util')
-rw-r--r--src/client/util/DocumentManager.ts5
-rw-r--r--src/client/util/DragManager.ts2
-rw-r--r--src/client/util/LinkManager.ts84
3 files changed, 88 insertions, 3 deletions
diff --git a/src/client/util/DocumentManager.ts b/src/client/util/DocumentManager.ts
index 712529745..52f0fe3f6 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 '../views/nodes/LinkManager';
+import { LinkManager } from './LinkManager';
export class DocumentManager {
@@ -91,7 +91,8 @@ export class DocumentManager {
if (linksList && linksList.length) {
pairs.push(...linksList.reduce((pairs, link) => {
if (link) {
- let destination = (link["linkedTo"] === dv.props.Document) ? link["linkedFrom"] : link["linkedTo"];
+ // let destination = (link["linkedTo"] === dv.props.Document) ? link["linkedFrom"] : link["linkedTo"];
+ let destination = LinkManager.Instance.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 7854cc080..809368aff 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 "../views/nodes/LinkManager";
+import { LinkManager } from "./LinkManager";
export type dropActionType = "alias" | "copy" | undefined;
export function SetupDrag(_reference: React.RefObject<HTMLElement>, docFunc: () => Doc | Promise<Doc>, moveFunc?: DragManager.MoveFunction, dropAction?: dropActionType) {
diff --git a/src/client/util/LinkManager.ts b/src/client/util/LinkManager.ts
new file mode 100644
index 000000000..a6d649395
--- /dev/null
+++ b/src/client/util/LinkManager.ts
@@ -0,0 +1,84 @@
+import { observable, computed, action } from "mobx";
+import React = require("react");
+import { SelectionManager } from "./SelectionManager";
+import { observer } from "mobx-react";
+import { props } from "bluebird";
+import { DocumentView } from "../views/nodes/DocumentView";
+import { link } from "fs";
+import { StrCast, Cast } from "../../new_fields/Types";
+import { Doc } from "../../new_fields/Doc";
+import { listSpec } from "../../new_fields/Schema";
+import { List } from "../../new_fields/List";
+
+
+export class LinkManager {
+ private static _instance: LinkManager;
+ public static get Instance(): LinkManager {
+ return this._instance || (this._instance = new this());
+ }
+ private constructor() {
+ }
+
+ @observable
+ public allLinks: Array<Doc> = [];
+
+ 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 findRelatedGroupedLinks(source: Doc): Map<string, Array<Doc>> {
+ let related = this.findAllRelatedLinks(source);
+
+ let categories = 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 => {
+ if (groupDoc instanceof Doc) {
+ let groupType = StrCast(groupDoc.proto!.type);
+ let group = categories.get(groupType); // TODO: clean this up lol
+ if (group) group.push(link);
+ else group = [link];
+ categories.set(groupType, group);
+ } else {
+ // promise doc
+ }
+
+ })
+ }
+ else {
+ // if link is in no groups then put it in default group
+ let group = categories.get("*");
+ if (group) group.push(link);
+ else group = [link];
+ categories.set("*", group);
+ }
+ }
+
+
+ // let anchor = this.findOppositeAnchor(link, source);
+ // let group = categories.get(link.linkTags);
+ // if (group) group.push(link);
+ // else group = [link];
+ // categories.set(link.linkTags, group);
+ })
+ return categories;
+ }
+
+ 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)
+ // }
+
+} \ No newline at end of file