+
+ {hasChildren && (
+
+ {renderTreeNodes(component.children as UIComponent[], depth + 1, selectedId, onSelect)}
+
+ )}
+
+ )
+ })
+}
+
+export function ComponentTreeWrapper({
+ components = [],
+ selectedId = null,
+ emptyMessage = 'No components available.',
+ onSelect,
+ className,
+}: ComponentTreeWrapperProps) {
+ return (
+
+ {components.length === 0 ? (
+
{emptyMessage}
+ ) : (
+
{renderTreeNodes(components, 0, selectedId, onSelect)}
+ )}
+
+ )
+}
diff --git a/src/lib/json-ui/wrappers/DataSourceEditorDialogWrapper.tsx b/src/lib/json-ui/wrappers/DataSourceEditorDialogWrapper.tsx
new file mode 100644
index 0000000..72530c7
--- /dev/null
+++ b/src/lib/json-ui/wrappers/DataSourceEditorDialogWrapper.tsx
@@ -0,0 +1,43 @@
+import type { ChangeEvent } from 'react'
+import { ComponentRenderer } from '@/lib/json-ui/component-renderer'
+import { cn } from '@/lib/utils'
+import dataSourceEditorDialogDefinition from './definitions/data-source-editor-dialog.json'
+import type { DataSourceEditorDialogWrapperProps } from './interfaces'
+
+export function DataSourceEditorDialogWrapper({
+ open = false,
+ title = 'Data Source',
+ description = 'Update data source details and fields.',
+ fields = [],
+ onFieldChange,
+ onSave,
+ onCancel,
+ onOpenChange,
+ className,
+}: DataSourceEditorDialogWrapperProps) {
+ const handleFieldChange = (event: ChangeEvent