import { action, observable } from 'mobx'; import { observer } from "mobx-react"; import 'react-image-lightbox/style.css'; // This only needs to be imported once in your app import { emptyFunction, returnFalse, returnZero, returnTrue, returnOne } from '../../../Utils'; import { CompileScript, CompiledScript, ScriptOptions } from "../../util/Scripting"; import { Transform } from '../../util/Transform'; import { EditableView } from "../EditableView"; import { FieldView, FieldViewProps } from './FieldView'; import "./KeyValueBox.scss"; import "./KeyValuePair.scss"; import React = require("react"); import { Doc, Opt, Field } from '../../../new_fields/Doc'; import { FieldValue } from '../../../new_fields/Types'; import { KeyValueBox } from './KeyValueBox'; import { DragManager, SetupDrag } from '../../util/DragManager'; import { ContextMenu } from '../ContextMenu'; import { Docs } from '../../documents/Documents'; import { CollectionDockingView } from '../collections/CollectionDockingView'; import { undoBatch } from '../../util/UndoManager'; // Represents one row in a key value plane export interface KeyValuePairProps { rowStyle: string; keyName: string; doc: Doc; keyWidth: number; } @observer export class KeyValuePair extends React.Component { @observable private isPointerOver = false; @observable public isChecked = false; private checkbox = React.createRef(); @action handleCheck = (e: React.ChangeEvent) => { this.isChecked = e.currentTarget.checked; } @action uncheck = () => { this.checkbox.current!.checked = false; this.isChecked = false; } onContextMenu = (e: React.MouseEvent) => { const value = this.props.doc[this.props.keyName]; if (value instanceof Doc) { e.stopPropagation(); e.preventDefault(); ContextMenu.Instance.addItem({ description: "Open Fields", event: () => { let kvp = Docs.Create.KVPDocument(value, { width: 300, height: 300 }); CollectionDockingView.Instance.AddRightSplit(kvp, undefined); }, icon: "layer-group" }); ContextMenu.Instance.displayMenu(e.clientX, e.clientY); } } render() { let props: FieldViewProps = { Document: this.props.doc, DataDoc: this.props.doc, ContainingCollectionView: undefined, fieldKey: this.props.keyName, fieldExt: "", isSelected: returnFalse, select: emptyFunction, renderDepth: 1, selectOnLoad: false, active: returnFalse, whenActiveChanged: emptyFunction, ScreenToLocalTransform: Transform.Identity, focus: emptyFunction, PanelWidth: returnZero, PanelHeight: returnZero, addDocTab: returnZero, ContentScaling: returnOne }; let contents = ; // let fieldKey = Object.keys(props.Document).indexOf(props.fieldKey) !== -1 ? props.fieldKey : "(" + props.fieldKey + ")"; let protoCount = 0; let doc: Doc | undefined = props.Document; while (doc) { if (Object.keys(doc).includes(props.fieldKey)) { break; } protoCount++; doc = doc.proto; } const parenCount = Math.max(0, protoCount - 1); let keyStyle = protoCount === 0 ? "black" : "blue"; let hover = { transition: "0.3s ease opacity", opacity: this.isPointerOver || this.isChecked ? 1 : 0 }; return ( this.isPointerOver = true)} onPointerLeave={action(() => this.isPointerOver = false)}>
{"(".repeat(parenCount)}{props.fieldKey}{")".repeat(parenCount)}
{ return Field.toKeyValueString(props.Document, props.fieldKey); }} SetValue={(value: string) => KeyValueBox.SetField(props.Document, props.fieldKey, value)}>
); } }