import React from "react"; import { observer } from "mobx-react"; import { IPropertyGridGroupDefinition, TYPE_NAMES } from "project-editor/core/object"; import { ComponentInfo, IComponentInfoProperty } from "../component-info"; import { BodySection } from "./BodySection"; import classNames from "classnames"; import { getModel } from "../model"; export const ComponentProperties = observer( class ComponentProperties extends React.Component<{ componentInfo: ComponentInfo; generateHTML: boolean; }> { render() { const { componentInfo } = this.props; const groupPropertiesArray = getPropertyGroups( componentInfo, componentInfo.allProperties.filter( property => !componentInfo.isEmptyProperty(property.name) ) ); return (
{groupPropertiesArray.map((groupProperties, i) => { return (
0 } )} key={groupProperties.group.id} >

{groupProperties.group.title || "Other"}

{groupProperties.properties.map( property => ( ) )}
); })}
); } } ); const ComponentProperty = observer( class ComponentProperty extends React.Component<{ componentInfo: ComponentInfo; property: IComponentInfoProperty; generateHTML: boolean; }> { render() { const { property } = this.props; let propertyName = getPropertyName(property); let propertyDescription = getPropertyDescription(property); return ( <>

{propertyName}

{propertyDescription}
{this.props.componentInfo.renderPropertyDescription( property.name, this.props.generateHTML )}
); } } ); interface IGroupProperties { group: IPropertyGridGroupDefinition; properties: IComponentInfoProperty[]; } export function getPropertyGroups( componentInfo: ComponentInfo, properties: IComponentInfoProperty[] ) { let groupPropertiesArray: IGroupProperties[] = []; let groupForPropertiesWithoutGroupSpecified: IGroupProperties | undefined; for (let property of properties) { const propertyInfo = property.metaInfo; const propertyGroup = propertyInfo.propertyGridGroup; let propertiesInGroup: IComponentInfoProperty[]; if (propertyGroup) { let groupProperties = groupPropertiesArray.find( groupProperties => groupProperties.group.id === propertyGroup.id ); if (!groupProperties) { groupProperties = { group: propertyGroup, properties: [] }; groupPropertiesArray.push(groupProperties); } propertiesInGroup = groupProperties.properties; } else { if (!groupForPropertiesWithoutGroupSpecified) { groupForPropertiesWithoutGroupSpecified = { group: { id: "", title: "" }, properties: [] }; groupPropertiesArray.push( groupForPropertiesWithoutGroupSpecified ); } propertiesInGroup = groupForPropertiesWithoutGroupSpecified.properties; } propertiesInGroup.push(property); } const componentObject = ComponentInfo.createComponentObject( getModel().dashboardProjectStore, componentInfo.componentClass ); groupPropertiesArray.sort((a: IGroupProperties, b: IGroupProperties) => { function pos(groupProperties: IGroupProperties) { if (groupProperties.group.title == "Specific") return -1000; if (groupProperties.group.position !== undefined) { if (typeof groupProperties.group.position == "number") return groupProperties.group.position; return groupProperties.group.position(componentObject); } return 1000; } return pos(a) - pos(b); }); // move and remove some properties if (componentInfo.type == "widget") { groupPropertiesArray.forEach(groupProperties => { function move(name1: string, name2: string) { let i1 = groupProperties.properties.findIndex( property => property.name == name1 ); const i2 = groupProperties.properties.findIndex( property => property.name == name2 ); if (i1 != -1 && i2 != -1) { groupProperties.properties.splice( i2 + 1, 0, groupProperties.properties[i1] ); if (i2 < i1) i1++; groupProperties.properties.splice(i1, 1); } } function remove(name: string) { const i = groupProperties.properties.findIndex( property => property.name == name ); if (i != -1) { groupProperties.properties.splice(i, 1); } } if (componentInfo.isLVGLComponent) { move("Left unit", "Left"); move("Top unit", "Top"); move("Width unit", "Width"); move("Height unit", "Height"); remove("Absolute position"); remove("Resizing"); remove("Visible"); remove("Output widget handle"); } if (componentInfo.isEezGuiComponent) { remove("Output widget handle"); } if ( componentInfo.isLVGLComponent || (componentInfo.isDashboardComponent && !componentInfo.isEezGuiComponent) ) { remove(`Hide "Widget is outside of its parent" warning`); } move("Center widget", "Align and distribute"); }); groupPropertiesArray = groupPropertiesArray.filter( groupProperties => groupProperties.properties.length > 0 ); } return groupPropertiesArray; } export function getPropertyName(property: IComponentInfoProperty) { let propertyName = property.name; if (propertyName.endsWith(" style") && propertyName != "Use style") { propertyName = propertyName.substr( 0, propertyName.length - " style".length ); } return propertyName; } export function getPropertyDescription(property: IComponentInfoProperty) { let propertyDescription; if (property.metaInfo.expressionType || property.metaInfo.flowProperty) { if (property.metaInfo.flowProperty == "assignable") { propertyDescription = `ASSIGNABLE EXPRESSION (${property.metaInfo.expressionType})`; } else if ( property.metaInfo.flowProperty == "template-literal" || property.metaInfo.flowProperty == "scpi-template-literal" ) { if (property.metaInfo.expressionType) { propertyDescription = `TEMPLATE LITERAL (${property.metaInfo.expressionType})`; } else { propertyDescription = `TEMPLATE LITERAL`; } } else { propertyDescription = `EXPRESSION (${property.metaInfo.expressionType})`; } } else { propertyDescription = TYPE_NAMES[property.metaInfo.type]; } return propertyDescription; }