aboutsummaryrefslogtreecommitdiff
path: root/src/client/views
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views')
-rw-r--r--src/client/views/DocumentDecorations.tsx2
-rw-r--r--src/client/views/nodes/DocumentView.tsx2
-rw-r--r--src/client/views/nodes/LinkEditor.tsx103
-rw-r--r--src/client/views/nodes/LinkManager.tsx51
-rw-r--r--src/client/views/nodes/LinkMenu.tsx33
5 files changed, 107 insertions, 84 deletions
diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx
index 2aae9bce6..eb45c770e 100644
--- a/src/client/views/DocumentDecorations.tsx
+++ b/src/client/views/DocumentDecorations.tsx
@@ -28,7 +28,7 @@ import { CollectionView } from "./collections/CollectionView";
import { DocumentManager } from "../util/DocumentManager";
import { FormattedTextBox } from "./nodes/FormattedTextBox";
import { FieldView } from "./nodes/FieldView";
-import { LinkManager } from "./nodes/LinkManager";
+import { LinkManager } from "../util/LinkManager";
library.add(faLink);
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index 0baa061ab..fc6974e6c 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -52,7 +52,7 @@ library.add(faDesktop);
const linkSchema = createSchema({
title: "string",
linkDescription: "string",
- linkTags: listSpec("string"),
+ linkTags: "string",
linkedTo: Doc,
linkedFrom: Doc
});
diff --git a/src/client/views/nodes/LinkEditor.tsx b/src/client/views/nodes/LinkEditor.tsx
index 71a423338..2ab8c3460 100644
--- a/src/client/views/nodes/LinkEditor.tsx
+++ b/src/client/views/nodes/LinkEditor.tsx
@@ -6,52 +6,115 @@ import './LinkEditor.scss';
import { props } from "bluebird";
import { DocumentView } from "./DocumentView";
import { link } from "fs";
-import { StrCast } from "../../../new_fields/Types";
+import { StrCast, Cast } from "../../../new_fields/Types";
import { Doc } from "../../../new_fields/Doc";
+import { List } from "../../../new_fields/List";
+import { listSpec } from "../../../new_fields/Schema";
+import { LinkManager } from "../../util/LinkManager";
interface Props {
+ sourceDoc: Doc;
linkDoc: Doc;
+ groups: Map<number, Doc>;
showLinks: () => void;
}
@observer
export class LinkEditor extends React.Component<Props> {
- @observable private _nameInput: string = StrCast(this.props.linkDoc.title);
- @observable private _descriptionInput: string = StrCast(this.props.linkDoc.linkDescription);
+ // @observable private _title: string = StrCast(this.props.linkDoc.title);
+ // @observable private _description: string = StrCast(this.props.linkDoc.linkDescription);
+ // @observable private _tags: Array<string> = Cast(this.props.linkDoc.linkTags, List);
+ // @action
+ // onTitleChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
+ // this._title = e.target.value;
+ // }
- onSaveButtonPressed = (e: React.PointerEvent): void => {
- e.stopPropagation();
+ // @action
+ // onDescriptionChanged = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
+ // this._description = e.target.value;
+ // }
+
+ // renderTags() {
+ // return this._tags.map(tag => {
+ // if (tag === "") {
+ // return <input type="text" placeholder="Tag"></input>;
+ // } else {
+ // return <input type="text" value={tag}></input>;
+ // }
+ // })
+ // }
+
+ // addTag = (): void => {
+ // this._tags.push("");
+ // }
+ @action
+ editGroup(groupId: number, value: string) {
let linkDoc = this.props.linkDoc.proto ? this.props.linkDoc.proto : this.props.linkDoc;
- linkDoc.title = this._nameInput;
- linkDoc.linkDescription = this._descriptionInput;
+ let groupDoc = this.props.groups.get(groupId);
+ if (groupDoc) {
+ groupDoc.proto!.type = value;
+ if (Doc.AreProtosEqual(this.props.sourceDoc, Cast(linkDoc.anchor1, Doc, new Doc))) {
+ // let groups = Cast(linkDoc.anchor1Groups, listSpec(Doc), []);
+ // groups.push(groupDoc);
+ linkDoc.anchor1Groups = new List<Doc>([groupDoc]);
+
+ } else {
+ linkDoc.anchor2Groups = new List<Doc>([groupDoc]);
+ }
+ }
- this.props.showLinks();
}
+ renderGroup(groupId: number, groupDoc: Doc) {
+ return (
+ <div>
+ <p>type:</p>
+ <input type="text" value={StrCast(groupDoc.proto!.type)} onChange={e => this.editGroup(groupId, e.target.value)}></input>
+ </div>
+ )
+ }
+ renderGroups() {
+ let groups: Array<JSX.Element> = [];
+ this.props.groups.forEach((groupDoc, groupId) => {
+ groups.push(
+ <div>
+ {this.renderGroup(groupId, groupDoc)}
+ </div>
+ )
+ });
+ return groups;
+ }
+
+ onSaveButtonPressed = (e: React.PointerEvent): void => {
+ e.stopPropagation();
+
+ // let linkDoc = this.props.linkDoc.proto ? this.props.linkDoc.proto : this.props.linkDoc;
+ // // linkDoc.title = this._title;
+ // // linkDoc.linkDescription = this._description;
+
+ this.props.showLinks();
+ }
render() {
+ let destination = LinkManager.Instance.findOppositeAnchor(this.props.linkDoc, this.props.sourceDoc);
return (
<div className="edit-container">
- <input onChange={this.onNameChanged} className="name-input" type="text" value={this._nameInput} placeholder="Name . . ."></input>
- <textarea onChange={this.onDescriptionChanged} className="description-input" value={this._descriptionInput} placeholder="Description . . ."></textarea>
+ <p>linked to: {destination.proto!.title}</p>
+ <b>Groups:</b>
+ {this.renderGroups()}
+
+ {/* <input onChange={this.onTitleChanged} className="name-input" type="text" value={this._title} placeholder="Name . . ."></input>
+ <textarea onChange={this.onDescriptionChanged} className="description-input" value={this._description} placeholder="Description . . ."></textarea> */}
+ {/* {this.renderTags()}
+ <button onClick={this.addTag}>+</button> */}
<div className="save-button" onPointerDown={this.onSaveButtonPressed}>SAVE</div>
</div>
);
}
-
- @action
- onNameChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
- this._nameInput = e.target.value;
- }
-
- @action
- onDescriptionChanged = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
- this._descriptionInput = e.target.value;
- }
} \ No newline at end of file
diff --git a/src/client/views/nodes/LinkManager.tsx b/src/client/views/nodes/LinkManager.tsx
deleted file mode 100644
index 1064eaa22..000000000
--- a/src/client/views/nodes/LinkManager.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { observable, computed, action } from "mobx";
-import React = require("react");
-import { SelectionManager } from "../../util/SelectionManager";
-import { observer } from "mobx-react";
-import './LinkEditor.scss';
-import { props } from "bluebird";
-import { DocumentView } from "./DocumentView";
-import { link } from "fs";
-import { StrCast, Cast } from "../../../new_fields/Types";
-import { Doc } from "../../../new_fields/Doc";
-import { listSpec } from "../../../new_fields/Schema";
-
-
-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.linkedFrom, Doc, new Doc)) || Doc.AreProtosEqual(source, Cast(link.linkedTo, 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 => {
- 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.linkedFrom, Doc, new Doc))) {
- return Cast(link.linkedTo, Doc, new Doc);
- } else {
- return Cast(link.linkedFrom, Doc, new Doc);
- }
- }
-
-} \ No newline at end of file
diff --git a/src/client/views/nodes/LinkMenu.tsx b/src/client/views/nodes/LinkMenu.tsx
index 6dc5623d1..affe35e2a 100644
--- a/src/client/views/nodes/LinkMenu.tsx
+++ b/src/client/views/nodes/LinkMenu.tsx
@@ -8,7 +8,9 @@ import React = require("react");
import { Doc, DocListCast } from "../../../new_fields/Doc";
import { Cast, FieldValue, StrCast } from "../../../new_fields/Types";
import { Id } from "../../../new_fields/FieldSymbols";
-import { LinkManager } from "./LinkManager";
+import { LinkManager } from "../../util/LinkManager";
+import { number } from "prop-types";
+import { listSpec } from "../../../new_fields/Schema";
interface Props {
docView: DocumentView;
@@ -29,23 +31,20 @@ export class LinkMenu extends React.Component<Props> {
// });
// }
- renderLinkGroup(links: Doc[]) {
- console.log("render link group");
+ renderLinkGroupItems(links: Doc[]) {
let source = this.props.docView.Document;
- console.log("num links", links.length, typeof links);
return links.map(link => {
- let destination = (link["linkedTo"] === source) ? link["linkedFrom"] : link["linkedTo"];
+ // let destination = (link["linkedTo"] === source) ? link["linkedFrom"] : link["linkedTo"];
+ let destination = LinkManager.Instance.findOppositeAnchor(link, source);
let doc = FieldValue(Cast(destination, Doc));
if (doc) {
console.log(doc[Id] + source[Id], "source is", source[Id]);
- return <LinkBox key={doc[Id] + source[Id]} linkDoc={link} linkName={StrCast(link.title)} pairedDoc={doc} showEditor={action(() => this._editingLink = link)} type={""} />;
+ return <LinkBox key={doc[Id] + source[Id]} linkDoc={link} linkName={"link"} pairedDoc={doc} showEditor={action(() => this._editingLink = link)} type={""} />;
}
});
}
- renderLinkItems(links: Map<string, Array<Doc>>) {
- console.log("render link items");
-
+ renderLinkItems = (links: Map<string, Array<Doc>>): Array<JSX.Element> => {
let linkItems: Array<JSX.Element> = [];
links.forEach((links, group) => {
@@ -54,7 +53,7 @@ export class LinkMenu extends React.Component<Props> {
<div key={group} className="link-menu-group">
<p className="link-menu-group-name">{group}:</p>
<div className="link-menu-group-wrapper">
- {this.renderLinkGroup(links)}
+ {this.renderLinkGroupItems(links)}
</div>
</div>
)
@@ -80,8 +79,20 @@ export class LinkMenu extends React.Component<Props> {
</div>
);
} else {
+ let counter = 0;
+ let groups = new Map<number, Doc>();
+ let groupList = (Doc.AreProtosEqual(this.props.docView.props.Document, Cast(this._editingLink.anchor1, Doc, new Doc))) ?
+ Cast(this._editingLink.anchor1Groups, listSpec(Doc), []) : Cast(this._editingLink.anchor2Groups, listSpec(Doc), []);
+ groupList.forEach(group => {
+ if (group instanceof Doc) {
+ console.log(counter);
+ groups.set(counter, group);
+ counter++;
+ }
+ })
+
return (
- <LinkEditor linkDoc={this._editingLink} showLinks={action(() => this._editingLink = undefined)}></LinkEditor>
+ <LinkEditor groups={groups} sourceDoc={this.props.docView.props.Document} linkDoc={this._editingLink} showLinks={action(() => this._editingLink = undefined)}></LinkEditor>
);
}