aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/util/LinkManager.ts44
-rw-r--r--src/client/views/collections/collectionFreeForm/CollectionFreeFormLinksView.tsx21
-rw-r--r--src/client/views/nodes/DocumentView.tsx2
-rw-r--r--src/client/views/nodes/LinkEditor.tsx1
-rw-r--r--src/client/views/nodes/LinkMenu.scss25
-rw-r--r--src/client/views/nodes/LinkMenuGroup.tsx21
-rw-r--r--src/client/views/nodes/LinkMenuItem.scss2
7 files changed, 44 insertions, 72 deletions
diff --git a/src/client/util/LinkManager.ts b/src/client/util/LinkManager.ts
index db814082f..97c816001 100644
--- a/src/client/util/LinkManager.ts
+++ b/src/client/util/LinkManager.ts
@@ -24,10 +24,6 @@ import { CurrentUserUtils } from "../../server/authentication/models/current_use
* - user defined kvps
*/
export class LinkManager {
- // static Instance: LinkManager;
- // private constructor() {
- // LinkManager.Instance = this;
- // }
private static _instance: LinkManager;
public static get Instance(): LinkManager {
@@ -36,12 +32,11 @@ export class LinkManager {
private constructor() {
}
+ // the linkmanagerdoc stores a list of docs representing all linkdocs in 'allLinks' and a list of strings representing all group types in 'allGroupTypes'
+ // lists of strings representing the metadata keys for each group type is stored under a key that is the same as the group type
public get LinkManagerDoc(): Doc | undefined {
return FieldValue(Cast(CurrentUserUtils.UserDocument.linkManagerDoc, Doc));
}
- // @observable public allLinks: Array<Doc> = []; //List<Doc> = new List<Doc>([]); // list of link docs
- // @observable public groupMetadataKeys: Map<string, Array<string>> = new Map();
- // map of group type to list of its metadata keys; serves as a dictionary of groups to what kind of metadata it holds
public getAllLinks(): Doc[] {
return LinkManager.Instance.LinkManagerDoc ? LinkManager.Instance.LinkManagerDoc.allLinks ? DocListCast(LinkManager.Instance.LinkManagerDoc.allLinks) : [] : [];
@@ -160,14 +155,6 @@ export class LinkManager {
LinkManager.Instance.setAnchorGroups(linkDoc, anchor, newGroups);
}
- // public doesAnchorHaveGroup(linkDoc: Doc, anchor: Doc, groupDoc: Doc): boolean {
- // let groups = LinkManager.Instance.getAnchorGroups(linkDoc, anchor);
- // let index = groups.findIndex(gDoc => {
- // return StrCast(groupDoc.type).toUpperCase() === StrCast(gDoc.type).toUpperCase();
- // });
- // return index > -1;
- // }
-
// returns map of group type to anchor's links in that group type
public getRelatedGroupedLinks(anchor: Doc): Map<string, Array<Doc>> {
let related = this.getAllRelatedLinks(anchor);
@@ -195,19 +182,6 @@ export class LinkManager {
return anchorGroups;
}
- // public addMetadataKeyToGroup(groupType: string, key: string): boolean {
- // if (LinkManager.Instance.LinkManagerDoc) {
- // if (LinkManager.Instance.LinkManagerDoc[groupType]) {
- // let keyList = LinkManager.Instance.findMetadataKeysInGroup(groupType);
- // keyList.push(key);
- // LinkManager.Instance.LinkManagerDoc[groupType] = new List<string>(keyList);
- // return true;
- // }
- // return false;
- // }
- // return false;
- // }
-
public getMetadataKeysInGroup(groupType: string): string[] {
if (LinkManager.Instance.LinkManagerDoc) {
return LinkManager.Instance.LinkManagerDoc[groupType] ? Cast(LinkManager.Instance.LinkManagerDoc[groupType], listSpec("string"), []) : [];
@@ -254,18 +228,4 @@ export class LinkManager {
return Cast(linkDoc.anchor1, Doc, new Doc);
}
}
-
-
- // @action
- // public addLinkProxy(proxy: Doc) {
- // LinkManager.Instance.linkProxies.push(proxy);
- // }
-
- // public findLinkProxy(sourceViewId: string, targetViewId: string): Doc | undefined {
- // let index = LinkManager.Instance.linkProxies.findIndex(p => {
- // return StrCast(p.sourceViewId) === sourceViewId && StrCast(p.targetViewId) === targetViewId;
- // });
- // return index > -1 ? LinkManager.Instance.linkProxies[index] : undefined;
- // }
-
} \ No newline at end of file
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinksView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinksView.tsx
index bb8e8a5c2..ebeb1fcee 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinksView.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinksView.tsx
@@ -94,24 +94,12 @@ export class CollectionFreeFormLinksView extends React.Component<CollectionViewP
@computed
get uniqueConnections() {
- // DocumentManager.Instance.LinkedDocumentViews.forEach(d => {
- // console.log("CONNECTION", StrCast(d.a.props.Document.title), StrCast(d.b.props.Document.title));
- // });
-
- // console.log("CONNECTIONS");
-
let connections = DocumentManager.Instance.LinkedDocumentViews.reduce((drawnPairs, connection) => {
let srcViews = this.documentAnchors(connection.a);
let targetViews = this.documentAnchors(connection.b);
- // console.log(srcViews.length, targetViews.length);
let possiblePairs: { a: Doc, b: Doc, }[] = [];
- srcViews.map(sv => {
- targetViews.map(tv => {
- // console.log("PUSH", StrCast(sv.props.Document.title), StrCast(sv.props.Document.id), StrCast(tv.props.Document.title), StrCast(tv.props.Document.id));
- possiblePairs.push({ a: sv.props.Document, b: tv.props.Document });
- });
- });
+ srcViews.map(sv => targetViews.map(tv => possiblePairs.push({ a: sv.props.Document, b: tv.props.Document })));
possiblePairs.map(possiblePair => {
if (!drawnPairs.reduce((found, drawnPair) => {
let match1 = (Doc.AreProtosEqual(possiblePair.a, drawnPair.a) && Doc.AreProtosEqual(possiblePair.b, drawnPair.b));
@@ -132,13 +120,6 @@ export class CollectionFreeFormLinksView extends React.Component<CollectionViewP
return <CollectionFreeFormLinkView key={x} A={c.a} B={c.b} LinkDocs={c.l}
removeDocument={this.props.removeDocument} addDocument={this.props.addDocument} />;
});
-
- // return DocumentManager.Instance.LinkedDocumentViews.map(c => {
- // // let x = c.l.reduce((p, l) => p + l[Id], "");
- // let x = c.a.Document[Id] + c.b.Document[Id];
- // return <CollectionFreeFormLinkView key={x} A={c.a.props.Document} B={c.b.props.Document} LinkDoc={c.l}
- // removeDocument={this.props.removeDocument} addDocument={this.props.addDocument} />;
- // });
}
render() {
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index c71d7ed68..d77e08089 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -162,9 +162,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
this._animateToIconDisposer = reaction(() => this.props.Document.isIconAnimating, (values) =>
(values instanceof List) && this.animateBetweenIcon(values, values[2], values[3] ? true : false)
, { fireImmediately: true });
- // console.log("CREATED NEW DOC VIEW", StrCast(this.props.Document.title), DocumentManager.Instance.DocumentViews.length);
DocumentManager.Instance.DocumentViews.push(this);
- // console.log("ADDED TO DOC MAN", StrCast(this.props.Document.title), DocumentManager.Instance.DocumentViews.length);
}
animateBetweenIcon = (iconPos: number[], startTime: number, maximizing: boolean) => {
diff --git a/src/client/views/nodes/LinkEditor.tsx b/src/client/views/nodes/LinkEditor.tsx
index 80eadf668..87ebeefdb 100644
--- a/src/client/views/nodes/LinkEditor.tsx
+++ b/src/client/views/nodes/LinkEditor.tsx
@@ -224,7 +224,6 @@ export class LinkGroupEditor extends React.Component<LinkGroupEditorProps> {
groupMdKeys.forEach((key) => {
let val = StrCast(mdDoc[key]);
- console.log(key, val);
metadata.push(
<LinkMetadataEditor key={"mded-" + this._metadataIds.get(key)} id={this._metadataIds.get(key)!} groupType={groupType} mdDoc={mdDoc} mdKey={key} mdValue={val} changeMdIdKey={this.changeMdIdKey} />
);
diff --git a/src/client/views/nodes/LinkMenu.scss b/src/client/views/nodes/LinkMenu.scss
index ae3446e25..1dd933c32 100644
--- a/src/client/views/nodes/LinkMenu.scss
+++ b/src/client/views/nodes/LinkMenu.scss
@@ -20,13 +20,28 @@
}
.linkMenu-group-name {
- padding: 4px 6px;
- line-height: 12px;
- border-radius: 5px;
- font-weight: bold;
+ display: flex;
&:hover {
- background-color: lightgray;
+ p {
+ background-color: lightgray;
+ width: calc(100% - 26px);
+ }
+ .linkEditor-tableButton {
+ display: block;
+ }
+ }
+
+ p {
+ width: 100%;
+ padding: 4px 6px;
+ line-height: 12px;
+ border-radius: 5px;
+ font-weight: bold;
+ }
+
+ .linkEditor-tableButton {
+ display: none;
}
}
}
diff --git a/src/client/views/nodes/LinkMenuGroup.tsx b/src/client/views/nodes/LinkMenuGroup.tsx
index 71326f703..732e76997 100644
--- a/src/client/views/nodes/LinkMenuGroup.tsx
+++ b/src/client/views/nodes/LinkMenuGroup.tsx
@@ -8,8 +8,10 @@ import React = require("react");
import { Doc, DocListCast } from "../../../new_fields/Doc";
import { Id } from "../../../new_fields/FieldSymbols";
import { LinkManager } from "../../util/LinkManager";
-import { DragLinksAsDocuments, DragManager } from "../../util/DragManager";
+import { DragLinksAsDocuments, DragManager, SetupDrag } from "../../util/DragManager";
import { emptyFunction } from "../../../Utils";
+import { Docs } from "../../documents/Documents";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
interface LinkMenuGroupProps {
sourceDoc: Doc;
@@ -22,6 +24,7 @@ interface LinkMenuGroupProps {
export class LinkMenuGroup extends React.Component<LinkMenuGroupProps> {
private _drag = React.createRef<HTMLDivElement>();
+ private _table = React.createRef<HTMLDivElement>();
onLinkButtonDown = (e: React.PointerEvent): void => {
e.stopPropagation();
@@ -55,6 +58,17 @@ export class LinkMenuGroup extends React.Component<LinkMenuGroupProps> {
e.stopPropagation();
}
+ viewGroupAsTable = (groupType: string): JSX.Element => {
+ let keys = LinkManager.Instance.getMetadataKeysInGroup(groupType);
+ let index = keys.indexOf("");
+ if (index > -1) keys.splice(index, 1);
+ let cols = ["anchor1", "anchor2", ...[...keys]];
+ let docs: Doc[] = LinkManager.Instance.getAllMetadataDocsInGroup(groupType);
+ let createTable = action(() => Docs.SchemaDocument(cols, docs, { width: 500, height: 300, title: groupType + " table" }));
+ let ref = React.createRef<HTMLDivElement>();
+ return <div ref={ref}><button className="linkEditor-button linkEditor-tableButton" onPointerDown={SetupDrag(ref, createTable)} title="Drag to view relationship table"><FontAwesomeIcon icon="table" size="sm" /></button></div>;
+ }
+
render() {
let groupItems = this.props.group.map(linkDoc => {
let destination = LinkManager.Instance.getOppositeAnchor(linkDoc, this.props.sourceDoc);
@@ -64,7 +78,10 @@ export class LinkMenuGroup extends React.Component<LinkMenuGroupProps> {
return (
<div className="linkMenu-group">
- <p className="linkMenu-group-name" ref={this._drag} onPointerDown={this.onLinkButtonDown} >{this.props.groupType}:</p>
+ <div className="linkMenu-group-name">
+ <p ref={this._drag} onPointerDown={this.onLinkButtonDown}>{this.props.groupType}:</p>
+ {this.viewGroupAsTable(this.props.groupType)}
+ </div>
<div className="linkMenu-group-wrapper">
{groupItems}
</div>
diff --git a/src/client/views/nodes/LinkMenuItem.scss b/src/client/views/nodes/LinkMenuItem.scss
index 25d167231..175a93cb2 100644
--- a/src/client/views/nodes/LinkMenuItem.scss
+++ b/src/client/views/nodes/LinkMenuItem.scss
@@ -1,4 +1,5 @@
@import "../globalCssVariables";
+
.linkMenu-item {
// border-top: 0.5px solid $main-accent;
position: relative;
@@ -13,6 +14,7 @@
padding: 4px 6px;
line-height: 12px;
border-radius: 5px;
+ overflow-wrap: break-word;
}
}