@@ -115,25 +115,52 @@ export function Playground() {
115
115
116
116
const handleImportSchema = ( jsonSchema : JsonSchema , uiSchema : Record < string , any > ) => {
117
117
// Convert imported schema back to form elements
118
- const newFormElements : FormElement [ ] = Object . entries ( jsonSchema . properties ) . map ( ( [ name , prop ] ) => ( {
119
- type : prop . type === 'number' ? 'number' : 'string' ,
120
- label : prop . title || name ,
121
- name,
122
- placeholder : prop . description ,
123
- options : prop . enum ?. map ( value => ( { label : value , value } ) ) ,
124
- validation : {
125
- required : jsonSchema . required ?. includes ( name ) ,
126
- minLength : prop . minLength ,
127
- maxLength : prop . maxLength ,
128
- min : prop . minimum ,
129
- max : prop . maximum ,
130
- pattern : prop . pattern ,
131
- } ,
132
- } ) )
133
-
134
- setFormElements ( newFormElements )
135
- setState ( newFormElements )
136
- }
118
+ const newFormElements : FormElement [ ] = Object . entries ( jsonSchema . properties ) . map ( ( [ name , prop ] : [ string , any ] ) => {
119
+ // Map the type correctly
120
+ let formElementType : FormElement [ "type" ] ;
121
+ switch ( prop . type ) {
122
+ case "string" :
123
+ formElementType = uiSchema [ name ] ?. [ "ui:widget" ] === "textarea" ? "textarea" : "text" ;
124
+ break ;
125
+ case "number" :
126
+ formElementType = "number" ;
127
+ break ;
128
+ case "boolean" :
129
+ formElementType = "checkbox" ;
130
+ break ;
131
+ case "array" :
132
+ formElementType = "select" ;
133
+ break ;
134
+ case "object" :
135
+ formElementType = "file" ; // Default to file for complex types (adjust as needed)
136
+ break ;
137
+ default :
138
+ throw new Error ( `Unsupported type: ${ prop . type } ` ) ;
139
+ }
140
+
141
+ return {
142
+ type : formElementType ,
143
+ label : prop . title || name ,
144
+ name,
145
+ placeholder : uiSchema [ name ] ?. [ "ui:placeholder" ] || undefined ,
146
+ options : prop . enum
147
+ ? prop . enum . map ( ( value : string ) => ( { label : value , value } ) )
148
+ : undefined ,
149
+ validation : {
150
+ required : jsonSchema . required ?. includes ( name ) || false ,
151
+ minLength : prop . minLength || undefined ,
152
+ maxLength : prop . maxLength || undefined ,
153
+ min : prop . minimum || undefined ,
154
+ max : prop . maximum || undefined ,
155
+ pattern : prop . pattern || undefined ,
156
+ } ,
157
+ } ;
158
+ } ) ;
159
+
160
+ // Update state with new form elements
161
+ setFormElements ( newFormElements ) ;
162
+ setState ( newFormElements ) ;
163
+ } ;
137
164
138
165
const handleFileUpload = ( event : React . ChangeEvent < HTMLInputElement > , elementName : string ) => {
139
166
const file = event . target . files ?. [ 0 ] ;
@@ -175,6 +202,7 @@ export function Playground() {
175
202
className = "flex-1 p-4 bg-gray-50 overflow-y-auto"
176
203
>
177
204
< Canvas
205
+ onDragEnd = { handleDragEnd }
178
206
elements = { formElements }
179
207
onElementUpdate = { handleElementUpdate }
180
208
onElementDelete = { handleElementDelete }
0 commit comments