import * as React from 'react'; import { Component } from 'react'; import { isEncodedBlank } from '../../data/sparql/blankNodes'; import { TemplateProps, PropArray } from '../props'; import { getProperty, getPropertyValues } from './utils'; import { TemplateProperties } from '../../data/schema'; import { AuthoredEntity, AuthoredEntityContext } from '../../editor/authoredEntity'; import { AuthoringState } from '../../editor/authoringState'; import { HtmlSpinner } from '../../viewUtils/spinner'; const FOAF_NAME = 'http://xmlns.com/foaf/0.1/name'; const CLASS_NAME = 'ontodia-standard-template'; export class StandardTemplate extends Component { render() { return ( {context => this.renderTemplate(context)} ); } private renderTemplate(context: AuthoredEntityContext) { const {color, types, isExpanded, iri, propsAsList} = this.props; const label = this.getLabel(); const {editor} = context; const isNewElement = AuthoringState.isNewElement(editor.authoringState, iri); const leftStripeColor = isNewElement ? 'white' : color; const pinnedProperties = this.findPinnedProperties(context); return (
{this.renderThumbnail()}
{this.getTypesLabel()}
{label}
{pinnedProperties ? (
{this.renderProperties(pinnedProperties)}
) : null}
{isExpanded ? (
{this.renderPhoto()}
{this.renderIri(context)} {this.renderProperties(propsAsList)} {editor.inAuthoringMode ?
: null} {editor.inAuthoringMode ? this.renderActions(context) : null}
) : null}
); } private findPinnedProperties(context: AuthoredEntityContext): PropArray | undefined { const {isExpanded, propsAsList, elementId} = this.props; if (isExpanded) { return undefined; } const templateState = context.view.model.getElement(elementId).elementState; if (!templateState) { return undefined; } const pinned = templateState[TemplateProperties.PinnedProperties] as PinnedProperties; if (!pinned) { return undefined; } const filtered = propsAsList.filter(prop => Boolean(pinned[prop.id])); return filtered.length === 0 ? undefined : filtered; } private renderProperties(propsAsList: PropArray) { if (!propsAsList.length) { return
no properties
; } return (
{propsAsList.map(({name, id, property}) => { const propertyValues = getPropertyValues(property); return
{name}
{propertyValues.map((text, index) => (
{text}
))}
; })}
); } private renderPhoto() { const {color, imgUrl} = this.props; if (!imgUrl) { return null; } return (
); } private renderIri(context: AuthoredEntityContext) { const {iri} = this.props; const finalIri = context.editedIri === undefined ? iri : context.editedIri; return (
IRI{context.editedIri ? '\u00A0(edited)' : ''}:
{isEncodedBlank(finalIri) ? (blank node) : {finalIri} }

); } private renderThumbnail() { const {color, imgUrl, iconUrl} = this.props; if (imgUrl) { return ( ); } else if (iconUrl) { return ( ); } const typeLabel = this.getTypesLabel(); return ( ); } protected getTypesLabel(): string { return this.props.types; } private getLabel() { const {label, props} = this.props; return getProperty(props, FOAF_NAME) || label; } private renderActions(context: AuthoredEntityContext) { const {canEdit, canDelete, onEdit, onDelete} = context; const SPINNER_WIDTH = 15; const SPINNER_HEIGHT = 12; return (
); } } interface PinnedProperties { [propertyId: string]: boolean; }