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 { List } from "../../../new_fields/List"; import { listSpec } from "../../../new_fields/Schema"; import { LinkManager, LinkUtils } from "../../util/LinkManager"; import { Docs } from "../../documents/Documents"; import { Utils } from "../../../Utils"; import { faArrowLeft, faEllipsisV } from '@fortawesome/free-solid-svg-icons'; import { library } from "@fortawesome/fontawesome-svg-core"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { string } from "prop-types"; library.add(faArrowLeft); library.add(faEllipsisV); interface LinkEditorProps { sourceDoc: Doc; linkDoc: Doc; groups: Map; metadata: Map>; showLinks: () => void; } @observer export class LinkEditor extends React.Component { // @observable private _groups: Map = new Map(); // @observable private _metadata: Map> = new Map(); // // componentDidMount() { // // } // constructor(props: LinkEditorProps) { // super(props); // let groups = new Map(); // let metadata: Map> = new Map(); // let groupList = (Doc.AreProtosEqual(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(groupDoc => { // if (groupDoc instanceof Doc) { // let id = Utils.GenerateGuid(); // groups.set(id, groupDoc); // let metadataMap = new Map(); // let metadataDocs = Cast(groupDoc.proto!.metadata, listSpec(Doc), []); // metadataDocs.forEach(mdDoc => { // if (mdDoc && mdDoc instanceof Doc) { // TODO: handle promise doc // metadataMap.set(Utils.GenerateGuid(), mdDoc); // } // }) // metadata.set(id, metadataMap); // } // }) // } // @observable private _title: string = StrCast(this.props.linkDoc.title); // @observable private _description: string = StrCast(this.props.linkDoc.linkDescription); // @observable private _tags: Array = Cast(this.props.linkDoc.linkTags, List); // @action // onTitleChanged = (e: React.ChangeEvent) => { // this._title = e.target.value; // } // @action // onDescriptionChanged = (e: React.ChangeEvent) => { // this._description = e.target.value; // } // renderTags() { // return this._tags.map(tag => { // if (tag === "") { // return ; // } else { // return ; // } // }) // } // addTag = (): void => { // this._tags.push(""); // } @action editGroup(groupId: string, value: string) { let linkDoc = this.props.linkDoc.proto ? this.props.linkDoc.proto : this.props.linkDoc; let groupDoc = this.props.groups.get(groupId); if (groupDoc) { groupDoc.proto!.type = value; LinkUtils.setAnchorGroups(linkDoc, this.props.sourceDoc, [groupDoc]); } } @action addGroup = (e: React.MouseEvent): void => { // create new document for group let groupDoc = Docs.TextDocument(); groupDoc.proto!.title = ""; groupDoc.proto!.metadata = new List([]); this.props.groups.set(Utils.GenerateGuid(), groupDoc); let linkDoc = this.props.linkDoc.proto ? this.props.linkDoc.proto : this.props.linkDoc; LinkUtils.setAnchorGroups(linkDoc, this.props.sourceDoc, Array.from(this.props.groups.values())); } renderGroup(groupId: string, groupDoc: Doc) { // let metadata = this.props.metadata.get(groupId); // if (!metadata) { // metadata = new Map(); // } return ( //

type:

this.editGroup(groupId, e.target.value)}>
// {/* {this.renderMetadata(groupId)} */ } // {/* */ } // //
) } @action addMetadata = (groupId: string): void => { // create new metadata doc let mdDoc = Docs.TextDocument(); mdDoc.proto!.title = ""; mdDoc.proto!.value = ""; // append to map let mdMap = this.props.metadata.get(groupId); if (mdMap) { mdMap.set(Utils.GenerateGuid(), mdDoc); } else { mdMap = new Map(); mdMap.set(Utils.GenerateGuid(), mdDoc); } // add to internal representation of metadata this.props.metadata.set(groupId, mdMap); // add to internatal representation of group let groupDoc = this.props.groups.get(groupId); if (groupDoc) { groupDoc.proto!.metadata = new List(Array.from(mdMap.values())); this.props.groups.set(groupId, groupDoc); } // add to link doc let linkDoc = this.props.linkDoc.proto ? this.props.linkDoc.proto : this.props.linkDoc; LinkUtils.setAnchorGroups(linkDoc, this.props.sourceDoc, Array.from(this.props.groups.values())); } // @action // addMetadata = (groupId: string): void => { // let groupDoc = this.props.groups.get(groupId); // if (groupDoc) { // // create new document for metadata row // let metadata = Cast(groupDoc.metadata, listSpec(Doc), []); // let metadataDoc = Docs.TextDocument(); // metadataDoc.proto!.title = ""; // metadataDoc.proto!.value = ""; // let metadataMap = new Map([metadataDoc]); // TODO: append to metadata // } // } // @action // editMetadataTitle = (groupId: string, mdId: string, value: string) => { // let group = this.props.metadata.get(groupId); // if (group) { // let mdDoc = group.get(mdId); // if (mdDoc) { // mdDoc.proto!.title = value; // } // } // } // @action // editMetadataValue = (groupId: string, mdId: string, value: string) => { // let group = this.props.metadata.get(groupId); // if (group) { // let mdDoc = group.get(mdId); // if (mdDoc) { // mdDoc.proto!.value = value; // } // } // } @action editMetadataTitle(groupId: string, mdId: string, value: string) { } @action editMetadataValue(groupId: string, mdId: string, value: string) { } renderMetadata(groupId: string) { let metadata: Array = []; let metadataMap = this.props.metadata.get(groupId); if (metadataMap) { metadataMap.forEach((mdDoc, mdId) => { metadata.push(
this.editMetadataTitle(groupId, mdId, e.target.value)}> : this.editMetadataValue(groupId, mdId, e.target.value)}>
) }) } return metadata; // let metadataList: Array = []; // metadata.forEach((mdDoc, mdId) => { // metadataList.push( //
// this.editMetadataTitle(groupId, mdId, e.target.value)}>: // this.editMetadataValue(groupId, mdId, e.target.value)}> //
// ) // }) } renderGroups() { let groups: Array = []; this.props.groups.forEach((groupDoc, groupId) => { groups.push(this.renderGroup(groupId, groupDoc)) }); return groups; } render() { let destination = LinkUtils.findOppositeAnchor(this.props.linkDoc, this.props.sourceDoc); return (

editing link to: {destination.proto!.title}

Groups:
{this.renderGroups()}
); } }