From 94018c0e3c2703497a1a9c2910d0db978609c0c8 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Sun, 18 Jan 2026 02:31:19 +0000 Subject: [PATCH] Align JSON UI binding transforms --- src/lib/json-ui/component-renderer.tsx | 5 ++++- src/lib/json-ui/renderer.tsx | 6 ++++++ src/lib/json-ui/schema.ts | 1 + src/types/json-ui.ts | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/lib/json-ui/component-renderer.tsx b/src/lib/json-ui/component-renderer.tsx index 51479dc..ebfbbc4 100644 --- a/src/lib/json-ui/component-renderer.tsx +++ b/src/lib/json-ui/component-renderer.tsx @@ -1,6 +1,7 @@ import { createElement, useMemo } from 'react' import { UIComponent, Binding, ComponentRendererProps } from '@/types/json-ui' import { getUIComponent } from './component-registry' +import { transformData } from './utils' function resolveBinding(binding: Binding, data: Record): unknown { let value: unknown = data[binding.source] @@ -18,7 +19,9 @@ function resolveBinding(binding: Binding, data: Record): unknow } if (binding.transform) { - value = binding.transform(value) + value = typeof binding.transform === 'string' + ? transformData(value, binding.transform) + : binding.transform(value) } return value diff --git a/src/lib/json-ui/renderer.tsx b/src/lib/json-ui/renderer.tsx index 53138e3..aefc299 100644 --- a/src/lib/json-ui/renderer.tsx +++ b/src/lib/json-ui/renderer.tsx @@ -86,6 +86,12 @@ export function JSONUIRenderer({ const props: Record = { ...component.props } + if (component.bindings) { + Object.entries(component.bindings).forEach(([propName, binding]) => { + props[propName] = resolveDataBinding(binding, dataMap, context) + }) + } + if (component.dataBinding) { const boundData = resolveDataBinding(component.dataBinding, dataMap, context) if (boundData !== undefined) { diff --git a/src/lib/json-ui/schema.ts b/src/lib/json-ui/schema.ts index f5b261c..862dd8f 100644 --- a/src/lib/json-ui/schema.ts +++ b/src/lib/json-ui/schema.ts @@ -33,6 +33,7 @@ export const UIComponentSchema: any = z.object({ props: z.record(z.string(), z.any()).optional(), className: z.string().optional(), style: z.record(z.string(), z.any()).optional(), + bindings: z.record(z.string(), DataBindingSchema).optional(), children: z.union([ z.string(), z.array(z.lazy(() => UIComponentSchema)), diff --git a/src/types/json-ui.ts b/src/types/json-ui.ts index 8b6889d..e2fbc3c 100644 --- a/src/types/json-ui.ts +++ b/src/types/json-ui.ts @@ -48,7 +48,7 @@ export interface Action { export interface Binding { source: string path?: string - transform?: (value: any) => any + transform?: string | ((value: any) => any) } export interface EventHandler {