@@ -74,6 +74,7 @@ export type PropertyFormProps = {
74
74
property ?: Property ;
75
75
onPropertyChanged ?: ( params : OnPropertyChangedParams ) => void ;
76
76
onPropertyChangedImmediate ?: boolean ;
77
+ onDismiss ?: ( ) => void ;
77
78
onDelete ?: ( id ?: string , namespace ?: string ) => void ;
78
79
onError ?: ( id : string , namespace ?: string , error ?: Record < string , any > ) => void ;
79
80
initialErrors ?: Record < string , any > ;
@@ -101,6 +102,7 @@ export const PropertyForm = React.memo(
101
102
property,
102
103
onPropertyChanged,
103
104
onPropertyChangedImmediate = true ,
105
+ onDismiss,
104
106
onDelete,
105
107
onError,
106
108
initialErrors,
@@ -218,6 +220,7 @@ export const PropertyForm = React.memo(
218
220
includeIdAndTitle = { includeIdAndName }
219
221
propertyNamespace = { propertyNamespace }
220
222
onError = { onError }
223
+ onDismiss = { onDismiss }
221
224
showErrors = { forceShowErrors || formexController . submitCount > 0 }
222
225
existing = { existingProperty }
223
226
autoUpdateId = { autoUpdateId }
@@ -273,6 +276,7 @@ export function PropertyFormDialog({
273
276
} } >
274
277
< DialogContent >
275
278
< PropertyForm { ...formProps }
279
+ onDismiss = { onCancel }
276
280
onPropertyChanged = { ( params ) => {
277
281
onPropertyChanged ?.( params ) ;
278
282
onOkClicked ?.( ) ;
@@ -317,6 +321,7 @@ function PropertyEditFormFields({
317
321
onPropertyChanged,
318
322
onDelete,
319
323
propertyNamespace,
324
+ onDismiss,
320
325
onError,
321
326
showErrors,
322
327
disabled,
@@ -331,6 +336,7 @@ function PropertyEditFormFields({
331
336
autoUpdateId ?: boolean ;
332
337
autoOpenTypeSelect : boolean ;
333
338
propertyNamespace ?: string ;
339
+ onDismiss ?: ( ) => void ;
334
340
onPropertyChanged ?: ( params : OnPropertyChangedParams ) => void ;
335
341
onDelete ?: ( id ?: string , namespace ?: string ) => void ;
336
342
onError ?: ( id : string , namespace ?: string , error ?: Record < string , any > ) => void ;
@@ -493,7 +499,12 @@ function PropertyEditFormFields({
493
499
value = { selectedFieldConfigId as PropertyConfigId }
494
500
onValueChange = { ( value ) => onWidgetSelectChanged ( value as PropertyConfigId ) }
495
501
open = { selectOpen }
496
- onOpenChange = { setSelectOpen }
502
+ onOpenChange = { ( open , hasValue ) => {
503
+ if ( ! hasValue ) {
504
+ onDismiss ?.( ) ;
505
+ }
506
+ setSelectOpen ( open ) ;
507
+ } }
497
508
disabled = { disabled }
498
509
showError = { Boolean ( selectedWidgetError ) }
499
510
existing = { existing }
@@ -576,7 +587,7 @@ function validateName(value: string) {
576
587
return error ;
577
588
}
578
589
579
- const WIDGET_TYPE_MAP = {
590
+ const WIDGET_TYPE_MAP : Record < PropertyConfigId , string > = {
580
591
text_field : "Text" ,
581
592
multiline : "Text" ,
582
593
markdown : "Text" ,
@@ -594,10 +605,10 @@ const WIDGET_TYPE_MAP = {
594
605
multi_references : "Reference" ,
595
606
date_time : "Date" ,
596
607
group : "Group" ,
597
- key_value : "Key-Value " ,
598
- repeat : "Repeat " ,
608
+ key_value : "Group " ,
609
+ repeat : "Array " ,
599
610
custom_array : "Array" ,
600
- block : "Block "
611
+ block : "Group "
601
612
} ;
602
613
603
614
function WidgetSelectView ( {
@@ -616,8 +627,8 @@ function WidgetSelectView({
616
627
value ?: PropertyConfigId ,
617
628
onValueChange : ( value : string ) => void ,
618
629
showError : boolean ,
619
- open : any ,
620
- onOpenChange : any ,
630
+ open : boolean ,
631
+ onOpenChange : ( open : boolean , hasValue : boolean ) => void ,
621
632
disabled : boolean ,
622
633
existing : boolean ,
623
634
propertyConfigs : Record < string , PropertyConfig > ,
@@ -626,21 +637,38 @@ function WidgetSelectView({
626
637
627
638
const allSupportedFields = Object . entries ( supportedFields ) . concat ( Object . entries ( propertyConfigs ) ) ;
628
639
629
- const displayedWidgets = inArray
640
+ const displayedWidgets = ( inArray
630
641
? allSupportedFields . filter ( ( [ _ , propertyConfig ] ) => ! isPropertyBuilder ( propertyConfig . property ) && propertyConfig . property ?. dataType !== "array" )
631
- : allSupportedFields ;
642
+ : allSupportedFields )
643
+ . map ( ( [ key , propertyConfig ] ) => ( {
644
+ [ key ] : propertyConfig
645
+ } ) )
646
+ . reduce ( ( a , b ) => {
647
+ return {
648
+ ...a ,
649
+ ...b
650
+ }
651
+ } , { } ) ;
632
652
633
653
const key = value ;
634
654
const propertyConfig = key ? ( DEFAULT_FIELD_CONFIGS [ key ] ?? propertyConfigs [ key ] ) : undefined ;
635
655
const baseProperty = propertyConfig ?. property ;
636
656
const baseFieldConfig = baseProperty && ! isPropertyBuilder ( baseProperty ) ? getFieldConfig ( baseProperty , propertyConfigs ) : undefined ;
637
657
const computedFieldConfig = baseFieldConfig && propertyConfig ? mergeDeep ( baseFieldConfig , propertyConfig ) : propertyConfig ;
638
658
659
+ const groups : string [ ] = [ ...new Set ( Object . keys ( displayedWidgets ) . map ( key => {
660
+ const group = WIDGET_TYPE_MAP [ key as PropertyConfigId ] ;
661
+ if ( group ) {
662
+ return group ;
663
+ }
664
+ return "Custom/Other"
665
+ } ) ) ] ;
666
+
639
667
return < >
640
668
< div
641
669
onClick = { ( ) => {
642
670
if ( ! disabled ) {
643
- onOpenChange ( ! open ) ;
671
+ onOpenChange ( ! open , Boolean ( value ) ) ;
644
672
}
645
673
} }
646
674
className = { cls (
@@ -666,24 +694,46 @@ function WidgetSelectView({
666
694
</ div > }
667
695
</ div >
668
696
< Dialog open = { open }
669
- onOpenChange = { onOpenChange }
697
+ onOpenChange = { ( open ) => onOpenChange ( open , Boolean ( value ) ) }
670
698
maxWidth = { "4xl" } >
671
699
< DialogTitle >
672
700
Select a property widget
673
701
</ DialogTitle >
674
702
< DialogContent >
675
- < div className = { "grid grid-cols-1 md:grid-cols-2 gap-x-4 gap-y-2 mt-4" } >
676
- { displayedWidgets . map ( ( [ key , propertyConfig ] ) => {
677
- return < WidgetSelectViewItem
678
- key = { key }
679
- initialProperty = { initialProperty }
680
- onClick = { ( ) => {
681
- onValueChange ( key ) ;
682
- onOpenChange ( false ) ;
683
- } }
684
- propertyConfig = { propertyConfig }
685
- existing = { existing } /> ;
703
+ < div >
704
+ { groups . map ( group => {
705
+ return < div key = { group } className = { "mt-4" } >
706
+ < Typography variant = { "label" } > { group } </ Typography >
707
+ < div className = { "grid grid-cols-1 md:grid-cols-2 gap-x-4 gap-y-2 mt-4" } >
708
+ { Object . entries ( displayedWidgets ) . map ( ( [ key , propertyConfig ] ) => {
709
+ const groupKey = WIDGET_TYPE_MAP [ key as PropertyConfigId ] ;
710
+ if ( groupKey === group ) {
711
+ return < WidgetSelectViewItem
712
+ key = { key }
713
+ initialProperty = { initialProperty }
714
+ onClick = { ( ) => {
715
+ onValueChange ( key ) ;
716
+ onOpenChange ( false , true ) ;
717
+ } }
718
+ propertyConfig = { propertyConfig }
719
+ existing = { existing } /> ;
720
+ }
721
+ return null ;
722
+ } ) }
723
+ </ div >
724
+ </ div > ;
686
725
} ) }
726
+ { /*{displayedWidgets.map(([key, propertyConfig]) => {*/ }
727
+ { /* return <WidgetSelectViewItem*/ }
728
+ { /* key={key}*/ }
729
+ { /* initialProperty={initialProperty}*/ }
730
+ { /* onClick={() => {*/ }
731
+ { /* onValueChange(key);*/ }
732
+ { /* onOpenChange(false);*/ }
733
+ { /* }}*/ }
734
+ { /* propertyConfig={propertyConfig}*/ }
735
+ { /* existing={existing}/>;*/ }
736
+ { /*}) }*/ }
687
737
</ div >
688
738
</ DialogContent >
689
739
</ Dialog >
@@ -709,15 +759,13 @@ export function WidgetSelectViewItem({
709
759
710
760
return < Card
711
761
onClick = { onClick }
712
- // disabled={optionDisabled}
713
762
className = { "flex flex-row items-center px-4 py-2" } >
714
763
< div
715
764
className = { cls (
716
765
"flex flex-row items-center text-base min-h-[48px]" ,
717
- // optionDisabled ? "w-full" : ""
718
766
) } >
719
767
< div className = { "mr-8" } >
720
- < PropertyConfigBadge propertyConfig = { propertyConfig } disabled = { ! shouldWarnChangingDataType } />
768
+ < PropertyConfigBadge propertyConfig = { propertyConfig } disabled = { shouldWarnChangingDataType } />
721
769
</ div >
722
770
< div >
723
771
< div className = { "flex flex-row gap-2 items-center" } >
@@ -728,12 +776,11 @@ export function WidgetSelectViewItem({
728
776
< Typography
729
777
color = { shouldWarnChangingDataType ? "secondary" : undefined } > { propertyConfig . name } </ Typography >
730
778
</ div >
779
+
731
780
< Typography variant = { "caption" }
732
781
color = { "secondary" }
733
782
className = { "max-w-sm" } >
734
783
{ propertyConfig . description }
735
-
736
- { /*{existing && optionDisabled ? "You can only switch to widgets that use the same data type" : propertyConfig.description}*/ }
737
784
</ Typography >
738
785
739
786
</ div >
0 commit comments