package Ġformula ide . ui . fields . editor s Ċ Ċ import Ġformula ide . api . fields .* Ċ import Ġformula ide . api . types . Ar ity Ċ import Ġformula ide . ui . components . Styled Button Ċ import Ġformula ide . ui . components . inputs . FormField Ċ import Ġformula ide . ui . utils . remove Ċ import Ġformula ide . ui . utils . replace Ċ import Ġformula ide . ui . utils . switch Order Ċ import Ġreact . FC Ċ import Ġreact . key Ċ import Ġreact . use Memo Ċ Ċ val ĠRe cur sion Editor : ĠFC < Editable Field Props > Ġ= ĠFC (" Recursion Editor ") Ġ{ Ġprops Ġ-> Ċ ĉ val Ġparent Ġ= Ġprops . field Ċ ĉ val Ġfields Ġ= Ġ( parent Ġas ? ĠField . Union <* >) ?. options ?. sorted By Ġ{ Ġit . order Ġ} Ċĉ ĉ ?: Ġ( parent Ġas ? ĠField . Container <* >) ?. fields ?. sorted By Ġ{ Ġit . order Ġ} ĊĊ ĉ val Ġmax Id Ġ= Ċĉ ĉ use Memo ( fields ) Ġ{ Ġ( fields Ġ?: Ġempty List ()). max Of OrNull Ġ{ Ġit . id . toInt () Ġ} ?. plus ( 1 ) Ġ?: Ġ 0 Ġ} ĊĊ ĉ if Ġ( fields Ġ!= Ġnull ) Ġ{ Ċĉ ĉ FormField Ġ{ Ċĉĉ ĉ when Ġ( parent ) Ġ{ Ċĉĉĉ ĉ is ĠField . Union < *> Ġ-> Ġ+" L ' utilisateur Ġdoit Ġcho is ir Ġentre Ġ:" Ċĉĉĉ ĉ is ĠField . Container < *> Ġ-> Ġ+" L ' utilisateur Ġdoit Ġre mp lir Ġ:" Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ for Ġ(( i , Ġfield ) Ġin Ġfields . with Index ()) Ġ{ Ċĉĉ ĉ Field Editor Ġ{ Ċĉĉĉ ĉ this . field Ġ= Ġfield Ċĉĉĉ ĉ key Ġ= Ġfield . id Ċĉĉĉ ĉ unique Id Ġ= Ġ"${ props . unique Id }:${ field . id }" ĊĊĉĉĉ ĉ depth Ġ= Ġprops . depth Ġ+ Ġ 1 Ċĉĉĉ ĉ field Number Ġ= Ġi ĊĊĉĉĉ ĉ replace Ġ= Ġ{ Ġnew Field Ġ-> Ċĉĉĉĉ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċĉĉĉĉ ĉ val Ġnew Parent Ġ= Ġwhen Ġ( parent ) Ġ{ Ċĉĉĉĉĉ ĉ is ĠData Field . Union Ġ-> Ġparent . copy ( options Ġ= Ġ( fields Ġas ĠList < Data Field >) Ċĉĉĉĉĉĉ ĉ . replace ( i , Ġnew Field Ġas ĠData Field )) Ċĉĉĉĉĉ ĉ is ĠSh allow FormField . Union Ġ-> Ġparent . copy ( options Ġ= Ġ( fields Ġas ĠList < Sh allow FormField >) Ċĉĉĉĉĉĉ ĉ . replace ( i , Ġnew Field Ġas ĠSh allow FormField )) Ċĉĉĉĉĉ ĉ is ĠDeep FormField . Union Ġ-> Ġparent . copy ( options Ġ= Ġ( fields Ġas ĠList < Deep FormField >) Ċĉĉĉĉĉĉ ĉ . replace ( i , Ġnew Field Ġas ĠDeep FormField )) Ċĉĉĉĉĉ ĉ is ĠSh allow FormField . Composite Ġ-> Ġparent . copy ( fields Ġ= Ġ( fields Ġas ĠList < Deep FormField >) Ċĉĉĉĉĉĉ ĉ . replace ( i , Ġnew Field Ġas ĠDeep FormField )) Ċĉĉĉĉĉ ĉ is ĠDeep FormField . Composite Ġ-> Ġparent . copy ( fields Ġ= Ġ( fields Ġas ĠList < Deep FormField >) Ċĉĉĉĉĉĉ ĉ . replace ( i , Ġnew Field Ġas ĠDeep FormField )) Ċĉĉĉĉĉ ĉ else Ġ-> Ġerror (" Imp ossible Ġde Ġmodifier Ġles Ġsous - champ s Ġde Ġ$ parent ") Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ props . replace ( new Parent ) Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ remove Ġ= Ġ{ Ċĉĉĉĉ ĉ val Ġnew Parent Ġ= Ġwhen Ġ( parent ) Ġ{ Ċĉĉĉĉĉ ĉ is ĠData Field . Union Ġ-> Ċĉĉĉĉĉĉ ĉ parent . copy ( options Ġ= Ġparent . options . remove ( i )) Ċĉĉĉĉĉ ĉ is ĠSh allow FormField . Union Ġ-> Ċĉĉĉĉĉĉ ĉ parent . copy ( options Ġ= Ġparent . options . remove ( i )) Ċĉĉĉĉĉ ĉ is ĠDeep FormField . Union Ġ-> Ċĉĉĉĉĉĉ ĉ parent . copy ( options Ġ= Ġparent . options . remove ( i )) Ċĉĉĉĉĉ ĉ is ĠSh allow FormField . Composite Ġ-> Ċĉĉĉĉĉĉ ĉ parent . copy ( fields Ġ= Ġparent . fields . remove ( i )) Ċĉĉĉĉĉ ĉ is ĠDeep FormField . Composite Ġ-> Ċĉĉĉĉĉĉ ĉ parent . copy ( fields Ġ= Ġparent . fields . remove ( i )) Ċĉĉĉĉĉ ĉ else Ġ-> Ġerror (" Imp ossible Ġde Ġmodifier Ġles Ġsous - champ s Ġde Ġ$ parent ") Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ props . replace ( new Parent ) Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ if Ġ( parent Ġis ĠData Field . Union Ġ|| Ġparent Ġis ĠSh allow FormField . Union ) Ġ{ Ċĉĉĉĉ ĉ switch Ġ= Ġ{ Ġdirection Ġ-> Ċĉĉĉĉĉ ĉ val Ġnew Parent Ġ= Ġwhen Ġ( parent ) Ġ{ Ċĉĉĉĉĉĉ ĉ is ĠData Field . Union Ġ-> Ċĉĉĉĉĉĉĉ ĉ parent . copy ( options Ġ= Ġparent . options . switch Order ( i , Ġdirection )) Ċĉĉĉĉĉĉ ĉ is ĠSh allow FormField . Union Ġ-> Ċĉĉĉĉĉĉĉ ĉ parent . copy ( options Ġ= Ġparent . options . switch Order ( i , Ġdirection )) Ċĉĉĉĉĉĉ ĉ is ĠDeep FormField . Union Ġ-> Ċĉĉĉĉĉĉĉ ĉ parent . copy ( options Ġ= Ġparent . options . switch Order ( i , Ġdirection )) Ċĉĉĉĉĉĉ ĉ is ĠSh allow FormField . Composite Ġ-> Ċĉĉĉĉĉĉĉ ĉ parent . copy ( fields Ġ= Ġparent . fields . switch Order ( i , Ġdirection )) Ċĉĉĉĉĉĉ ĉ is ĠDeep FormField . Composite Ġ-> Ċĉĉĉĉĉĉĉ ĉ parent . copy ( fields Ġ= Ġparent . fields . switch Order ( i , Ġdirection )) Ċĉĉĉĉĉĉ ĉ else Ġ-> Ġerror (" Imp ossible Ġde Ġmodifier Ġles Ġsous - champ s Ġde Ġ$ parent ") Ċĉĉĉĉĉ ĉ } ĊĊĉĉĉĉĉ ĉ props . replace ( new Parent ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ if Ġ( parent Ġis ĠData Field . Union Ġ|| Ġparent Ġis ĠSh allow FormField . Union ) Ġ{ Ċĉĉ ĉ Styled Button Ġ{ Ċĉĉĉ ĉ text Ġ= Ġ" Aj outer Ġune Ġoption " Ċĉĉĉ ĉ action Ġ= Ġ{ Ċĉĉĉĉ ĉ val Ġid Ġ= Ġmax Id . toString () Ċĉĉĉĉ ĉ val Ġorder Ġ= Ġfields . size Ċĉĉĉĉ ĉ val Ġname Ġ= Ġ"" Ċĉĉĉĉ ĉ val Ġsimple Ġ= ĠSimple Field . Text ( Ar ity . optional ()) ĊĊĉĉĉĉ ĉ val Ġnew Parent Ġ= Ġwhen Ġ( parent ) Ġ{ Ċĉĉĉĉĉ ĉ is ĠData Field . Union Ġ-> Ġparent . copy ( options Ġ= Ġparent . options Ġ+ Ċĉĉĉĉĉĉĉ ĉ Data Field . Simple ( id , Ġorder , Ġname , Ġsimple )) Ċĉĉĉĉĉ ĉ is ĠSh allow FormField . Union Ġ-> Ġparent . copy ( options Ġ= Ġparent . options Ġ+ Ċĉĉĉĉĉĉĉ ĉ Sh allow FormField . Simple ( id , Ġorder , Ġname , Ġsimple )) Ċĉĉĉĉĉ ĉ else Ġ-> Ġerror (" Imp ossible Ġd ' aj outer Ġun Ġsous - champ ĠÃł Ġ$ parent ") Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ props . replace ( new Parent ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ } Ċ