import { action, configure, observable, ObservableMap, Lambda } from 'mobx'; import "normalize.css"; import * as React from 'react'; import * as ReactDOM from 'react-dom'; import { observer } from 'mobx-react'; import { Document } from '../fields/Document'; import { BasicField } from '../fields/BasicField'; import { ListField } from '../fields/ListField'; import { Key } from '../fields/Key'; import { Opt, Field } from '../fields/Field'; import { Server } from '../client/Server'; configure({ enforceActions: "observed" }); @observer class FieldViewer extends React.Component<{ field: BasicField }> { render() { return {JSON.stringify(this.props.field.Data)} ({this.props.field.Id}); } } @observer class KeyViewer extends React.Component<{ field: Key }> { render() { return this.props.field.Name; } } @observer class ListViewer extends React.Component<{ field: ListField }>{ @observable expanded = false; render() { let content; if (this.expanded) { content = (
{this.props.field.Data.map(field => )}
) } else { content = <>[...] ({this.props.field.Id}) } return (
{content}
) } } @observer class DocumentViewer extends React.Component<{ field: Document }> { private keyMap: ObservableMap = new ObservableMap private disposer?: Lambda; componentDidMount() { let f = () => { Array.from(this.props.field._proxies.keys()).forEach(id => { if (!this.keyMap.has(id)) { Server.GetField(id, (field) => { if (field && field instanceof Key) { this.keyMap.set(id, field); } }) } }); } this.disposer = this.props.field._proxies.observe(f) f() } componentWillUnmount() { if (this.disposer) { this.disposer(); } } render() { let fields = Array.from(this.props.field._proxies.entries()).map(kv => { let key = this.keyMap.get(kv[0]); return (
({key ? key.Name : kv[0]}):
) }) return (
Document ({this.props.field.Id})
{fields}
) } } @observer class DebugViewer extends React.Component<{ fieldId: string }> { @observable private field?: Field; @observable private error?: string; constructor(props: { fieldId: string }) { super(props) this.update() } update() { Server.GetField(this.props.fieldId, action((field: Opt) => { this.field = field; if (!field) { this.error = `Field with id ${this.props.fieldId} not found` } })); } render() { let content; if (this.field) { // content = this.field.ToJson(); if (this.field instanceof ListField) { content = () } else if (this.field instanceof Document) { content = () } else if (this.field instanceof BasicField) { content = () } else if (this.field instanceof Key) { content = () } else { content = (Unrecognized field type) } } else if (this.error) { content = Field {this.props.fieldId} not found } else { content = Field loading: {this.props.fieldId} } return content; } } @observer class Viewer extends React.Component { @observable private idToAdd: string = ''; @observable private ids: string[] = []; @action inputOnChange = (e: React.ChangeEvent) => { this.idToAdd = e.target.value; } @action onKeyPress = (e: React.KeyboardEvent) => { if (e.key === "Enter") { this.ids.push(this.idToAdd) this.idToAdd = "" } } render() { return ( <>
{this.ids.map(id => { return })}
) } } ReactDOM.render((
), document.getElementById('root') );