diff --git a/client/packages/lowcoder/src/comps/generators/uiCompBuilder.tsx b/client/packages/lowcoder/src/comps/generators/uiCompBuilder.tsx index a631f1d6d..4ddf32d11 100644 --- a/client/packages/lowcoder/src/comps/generators/uiCompBuilder.tsx +++ b/client/packages/lowcoder/src/comps/generators/uiCompBuilder.tsx @@ -1,4 +1,4 @@ -import { BoolCodeControl } from "comps/controls/codeControl"; +import { BoolCodeControl, StringControl } from "comps/controls/codeControl"; import React, { ReactNode, useContext, useRef } from "react"; import { ExternalEditorContext } from "util/context/ExternalEditorContext"; import { Comp, CompParams, MultiBaseComp } from "lowcoder-core"; @@ -22,10 +22,14 @@ import { MethodConfigsType, withMethodExposing, } from "./withMethodExposing"; +import { Section } from "lowcoder-design"; +import { trans } from "i18n"; export type NewChildren>> = ChildrenCompMap & { hidden: InstanceType; + className: InstanceType; + dataTestId: InstanceType; }; export function HidableView(props: { @@ -50,12 +54,51 @@ export function HidableView(props: { } } +export function ExtendedComponentView(props: { + children: JSX.Element | React.ReactNode; + className: string; + dataTestId: string; +}) { + if (!props.className && !props.dataTestId) { + return <>{props.children}; + } + + return ( +
+ {props.children} +
+ ); +} + +export function ExtendedPropertyView< + ChildrenCompMap extends Record>, +>(props: { + children: JSX.Element | React.ReactNode, + childrenMap: NewChildren +} +) { + return ( + <> + {props.children} +
+ {props.childrenMap.className?.propertyView({ label: trans("prop.className") })} + {props.childrenMap.dataTestId?.propertyView({ label: trans("prop.dataTestId") })} +
+ + ); +} + export function uiChildren< ChildrenCompMap extends Record>, >( childrenMap: ToConstructor ): ToConstructor> { - return { ...childrenMap, hidden: BoolCodeControl } as any; + return { + ...childrenMap, + hidden: BoolCodeControl, + className: StringControl, + dataTestId: StringControl + } as any; } type ViewReturn = ReactNode; @@ -89,10 +132,22 @@ export class UICompBuilder< setPropertyViewFn( propertyViewFn: PropertyViewFnTypeForComp> ) { - this.propertyViewFn = propertyViewFn; + this.propertyViewFn = this.decoratePropertyViewFn(propertyViewFn); return this; } + decoratePropertyViewFn( + propertyViewFn: PropertyViewFnTypeForComp> + ): PropertyViewFnTypeForComp> { + return (childrenMap, dispatch) => { + return ( + + {propertyViewFn(childrenMap, dispatch)} + + ); + }; + } + setExposeStateConfigs( configs: ExposingConfig>[] ) { @@ -110,8 +165,11 @@ export class UICompBuilder< } build() { - if (this.childrenMap.hasOwnProperty("hidden")) { - throw new Error("already has hidden"); + const reservedProps = ["hidden", "className", "dataTestId"]; + for (const reservedProp of reservedProps) { + if (this.childrenMap.hasOwnProperty(reservedProp)) { + throw new Error(`Property »${reservedProp}« is reserved and must not be implemented in components!`); + } } const newChildrenMap = uiChildren(this.childrenMap); const builder = this; @@ -122,7 +180,7 @@ export class UICompBuilder< ToNodeType> > { ref: React.RefObject = React.createRef(); - + override parseChildrenFromValue( params: CompParams>> ): NewChildren { @@ -185,8 +243,13 @@ function UIView(props: { comp: any; viewFn: any }) { //END ADD BY FRED return ( - + + + ); } diff --git a/client/packages/lowcoder/src/i18n/locales/de.ts b/client/packages/lowcoder/src/i18n/locales/de.ts index 240173dd2..514b0f2be 100644 --- a/client/packages/lowcoder/src/i18n/locales/de.ts +++ b/client/packages/lowcoder/src/i18n/locales/de.ts @@ -182,7 +182,10 @@ export const de = { "showBody": "Körper zeigen", "showFooter": "Fußzeile anzeigen", "maskClosable": "Zum Schließen auf \"Draußen\" klicken", - "showMask": "Maske zeigen" + "showMask": "Maske zeigen", + "component": "Komponente", + "className": "Klasse", + "dataTestId": "Test ID", }, "autoHeightProp": { "auto": "Auto", diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index 6319fdd1f..6b4510dd1 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -211,6 +211,9 @@ export const en = { "baseURL": "Lowcoder API Base URL", "horizontal": "Horizontal", "minHorizontalWidth": "Minimum Horizontal Width", + "component": "Component", + "className": "Class", + "dataTestId": "Test ID", }, "autoHeightProp": { "auto": "Auto",