import * as React from 'react'; import { DiagramView } from '../diagram/view'; import { ElementModel, LocalizedString, PropertyTypeIri, Property, isIriProperty, isLiteralProperty, ElementIri, } from '../data/model'; const CLASS_NAME = 'ontodia-edit-form'; export interface Props { view: DiagramView; entity: ElementModel; onApply: (entity: ElementModel) => void; onCancel: () => void; } export interface State { elementModel?: ElementModel; } export class EditEntityForm extends React.Component { constructor(props: Props) { super(props); this.state = {elementModel: props.entity}; } componentWillReceiveProps(nextProps: Props) { if (this.props.entity !== nextProps.entity) { this.setState({elementModel: nextProps.entity}); } } private renderProperty = (key: PropertyTypeIri, property: Property) => { const {view} = this.props; const richProperty = view.model.getProperty(key); const label = view.formatLabel(richProperty.label, key); let values: string[] = []; if (isIriProperty(property)) { values = property.values.map(({value}) => value); } else if (isLiteralProperty(property)) { values = property.values.map(({value}) => value); } return (
); } private renderProperties() { const {properties} = this.props.entity; const propertyIris = Object.keys(properties) as PropertyTypeIri[]; return (
{propertyIris.map(iri => { return this.renderProperty(iri, properties[iri]); })}
); } private renderType() { const {view} = this.props; const {elementModel} = this.state; const label = view.getElementTypeString(elementModel); return ( ); } private onChangeIri = (e: React.FormEvent) => { const target = (e.target as HTMLInputElement); const iri = target.value as ElementIri; this.setState(prevState => { return { elementModel: { ...prevState.elementModel, id: iri, } }; }); } private renderIri() { const {elementModel} = this.state; return ( ); } private onChangeLabel = (e: React.FormEvent) => { const target = (e.target as HTMLInputElement); const labels: LocalizedString[] = target.value.length > 0 ? [{value: target.value, language: ''}] : []; this.setState({elementModel: { ...this.state.elementModel, label: {values: labels}, }}); } private renderLabel() { const {view} = this.props; const label = view.selectLabel(this.state.elementModel.label.values); const text = label ? label.value : ''; return ( ); } render() { return (
{this.renderIri()}
{this.renderType()}
{this.renderLabel()}
{this.renderProperties()}
); } }