package Ġdev . ent ao . page . bootstrap Ċ Ċ import Ġdev . ent ao . base .* Ċ import Ġdev . ent ao . core .* Ċ import Ġdev . ent ao . page .* Ċ import Ġdev . ent ao . page . tag .* Ċ import Ġdev . ent ao . page . widget . upload Div Ċ import Ġjava . text . Decimal Format Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . reflect . K Function Ċ import Ġkotlin . reflect . full . find Annotation Ċ Ċ private Ġval ĠInput Tags Ġ= Ġset Of (" input ", Ġ" select ", Ġ" textarea ") Ċ Ċ fun ĠTag . form Query ( form Action : ĠK Function <* >, Ġvar arg Ġkv : ĠTag Attr , Ġblock : ĠTag Block ): ĠTag Ġ{ Ċ ĉ return Ġform (" method " Ġto Ġ" GET ", ĠDATA _ FORM _ QUERY _ Ġto Ġ" 1 ", Ġ* kv ) Ġ{ Ċĉ ĉ this Ġ+= Ġform Action Ċĉ ĉ this . block () Ċĉ ĉ submit Primary (" æŁ¥è¯¢ ") Ċ ĉ } Ċ } Ċ Ċ fun ĠTag . form Row ( block : ĠTag Block ) Ġ{ Ċ ĉ div (" class " Ġto Ġ" form - row ", Ġblock Ġ= Ġblock ) Ċ } Ċ Ċ fun ĠTag . form Group Text ( label Value : ĠString , Ġtext Value : ĠString ): ĠTag Ġ{ Ċ ĉ return Ġform Group Ġ{ Ċĉ ĉ this . label Ġ{ Ġ+ label Value Ġ} Ċĉ ĉ this . div Ġ{ Ċĉĉ ĉ this . span (" class " Ġto Ġ" form - control - plaintext ") Ġ{ Ċĉĉĉ ĉ + text Value Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ fun ĠTag . form Group Text ( text Value : ĠString ): ĠTag Ġ{ Ċ ĉ return Ġform Group Ġ{ Ċĉ ĉ this . div Ġ{ Ċĉĉ ĉ this . span (" class " Ġto Ġ" form - control - plaintext ") Ġ{ Ċĉĉĉ ĉ + text Value Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ fun ĠTag . form Group Upload ( p : ĠProp ): ĠTag Ġ{ Ċ ĉ return Ġform Group Ġ{ Ċĉ ĉ label ( p . user Label ) Ċĉ ĉ this . div Ġ{ Ċĉĉ ĉ upload Div ( p ) Ċĉĉ ĉ this . process Help Text ( p ) Ċĉ ĉ } Ċ ĉ } Ċ } ĊĊ Ċ fun ĠTag . form Group Edit ( label Text : ĠString , Ġedit Name : ĠString , Ġedit Block : ĠTag . () Ġ-> ĠUnit Ġ= Ġ{} ): ĠTag Ġ{ Ċ ĉ return Ġform Group Ġ{ Ċĉ ĉ val Ġlb Ġ= Ġthis . label Ġ{ Ġ+ label Text Ġ} Ċĉ ĉ val Ġed Ġ= Ġthis . edit Ġ{ Ċĉĉ ĉ this [" name "] Ġ= Ġedit Name Ċĉ ĉ } Ċĉ ĉ this . process Group Edit Error ( ed ) Ċĉ ĉ ed . edit Block () Ċĉ ĉ process Label Require ( lb , Ġed ) Ċ ĉ } Ċ } Ċ Ċ fun ĠTag . form Group Edit ( p : ĠProp , Ġblock : ĠTag Block Ġ= Ġ{} ): ĠTag Ġ{ Ċ ĉ return Ġform Group Ġ{ Ċĉ ĉ val Ġlb Ġ= Ġlabel ( p ) Ċĉ ĉ val Ġed Ġ= Ġedit ( p ) Ċĉ ĉ this . process Group Edit Error ( ed ) Ċĉ ĉ this . process Help Text ( p ) Ċĉ ĉ process Label Require ( lb , Ġed ) Ċĉ ĉ ed . block () Ċ ĉ } Ċ } Ċ Ċ fun ĠTag . form Group TextArea ( p : ĠProp , Ġblock : ĠTag Block Ġ= Ġ{} ): ĠTag Ġ{ Ċ ĉ return Ġform Group Ġ{ Ċĉ ĉ val Ġlb Ġ= Ġlabel ( p ) Ċĉ ĉ val Ġed Ġ= Ġtextarea ( p ) Ċĉ ĉ this . process Group Edit Error ( ed ) Ċĉ ĉ this . process Help Text ( p ) Ċĉ ĉ process Label Require ( lb , Ġed ) Ċĉ ĉ ed . block () Ċ ĉ } Ċ } Ċ Ċ fun ĠTag . form Group ( block : ĠTag Block ): ĠTag Ġ{ Ċ ĉ return Ġdiv (" class " Ġto Ġ" form - group ") Ġ{ Ċĉ ĉ this . block () Ċĉ ĉ process Control CSS () Ċ ĉ } Ċ } Ċ Ċ fun ĠTag . edit ( p : ĠProp ): ĠTag Ġ{ Ċ ĉ val Ġv Ġ= Ġvalue By Prop ( p ) Ċ ĉ val Ġp Name Ġ= Ġp . userName Ċ ĉ val Ġed Ġ= Ġedit (" name " Ġto Ġp Name , Ġ" id " Ġto Ġp Name , Ġ" value " Ġto Ġv ) Ċ ĉ ed . process Properties Of Edit ( p ) Ċ ĉ return Ġed Ċ } Ċ Ċ fun ĠTag . textarea ( p : ĠProp ): ĠTag Ġ{ Ċ ĉ val Ġv Ġ= Ġvalue By Prop ( p ) Ċ ĉ val Ġp Name Ġ= Ġp . userName Ċ ĉ return Ġtextarea (" name " Ġto Ġp Name , Ġ" id " Ġto Ġp Name ) Ġ{ Ċĉ ĉ + v Ċĉ ĉ this Ġ+= Ġ" rows " Ġto Ġ( p . find Annotation < Edit Rows >() ?. value Ġ?: Ġ 3 ). toString () Ċ ĉ } Ċ } Ċ Ċ private Ġfun ĠTag . value By Prop ( p : ĠProp ): ĠString Ġ{ Ċ ĉ if Ġ( p Ġ! is ĠProp 0 ) Ġ{ Ċĉ ĉ return Ġhttp Context . params . str ( p . userName ) Ġ?: Ġ"" Ċ ĉ } ĊĊ ĉ val Ġvv Ġ= Ġp . getValue () Ġ?: Ġreturn Ġhttp Context . params . str ( p . userName ) Ġ?: Ġ"" ĊĊ ĉ if Ġ( vv Ġis ĠDouble ) Ġ{ Ċĉ ĉ val Ġk d Ġ= Ġp . find Annotation < NumberFormat >() Ċĉ ĉ return Ġif Ġ( kd Ġ!= Ġnull ) Ġ{ Ċĉĉ ĉ val Ġfmt Ġ= ĠDecimal Format ( kd . pattern ) Ċĉĉ ĉ val Ġn Ġ= Ġfmt . maximum Fraction Digits Ċĉĉ ĉ vv . max Fraction ( n ) Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ vv . toString () Ċĉ ĉ } Ċ ĉ } Ċ ĉ return Ġvv . toString () Ċ Ċ } Ċ Ċ fun ĠTag . process Help Text ( p : ĠProp ) Ġ{ Ċ ĉ val Ġhb Ġ= Ġp . find Annotation < Form Help Block >() ?. value Ċ ĉ if Ġ( hb Ġ!= Ġnull Ġ&& Ġhb . isNotEmpty ()) Ġ{ Ċĉ ĉ form Text Mut ed ( hb ) Ċ ĉ } Ċ } Ċ Ċ private Ġfun ĠTag . process Group Edit Error ( ed : ĠTag ) Ġ{ Ċ ĉ val Ġer Ġ= Ġhttp Context . params . str ( K eb . err Field ( ed [" name "])) Ġ?: Ġ"" Ċ ĉ if Ġ( er . isNotEmpty ()) Ġ{ Ċĉ ĉ ed Ġclass Add Ġ" is - invalid " Ċĉ ĉ feedback Invalid ( er ) Ċ ĉ } Ċ } Ċ Ċ private Ġfun Ġprocess Label Require ( lb : ĠTag , Ġed : ĠTag ) Ġ{ Ċ ĉ lb [" for "] Ġ= Ġed . need Id () Ċ ĉ if Ġ( ed [" required "] Ġ== Ġ" true ") Ġ{ Ċĉ ĉ val Ġquery Form Ġ= Ġlb . parent ( DATA _ FORM _ QUERY _ Ġto Ġ" 1 ") Ċĉ ĉ if Ġ( query Form Ġ== Ġnull ) Ġ{ Ċĉĉ ĉ lb . text Esc aped ("* ") Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ ed . attr Map . remove (" required ") Ċĉ ĉ } Ċ ĉ } Ċ Ċ } ĊĊ Ċ private Ġfun ĠTag . process Control CSS () Ġ{ Ċ ĉ val Ġt Ġ= Ġthis . first Deep Ġ{ Ġit . tagName Ġin ĠInput Tags Ġ} Ġ?: Ġreturn Ċ ĉ if Ġ( t . tagName Ġ== Ġ" input ") Ġ{ Ċĉ ĉ if Ġ( t [" type "] Ġ== Ġ" file ") Ġ{ Ċĉĉ ĉ if Ġ(! t . class Has (" form - control - file ")) Ġ{ Ċĉĉĉ ĉ t [" class "] Ġ= Ġ" form - control - file " .. t [" class "] Ċĉĉ ĉ } Ċĉĉ ĉ return Ċĉ ĉ } Ċĉ ĉ if Ġ( t [" readonly "] Ġ== Ġ" true ") Ġ{ Ċĉĉ ĉ if Ġ(! t . class Has (" form - control - plaintext ")) Ġ{ Ċĉĉĉ ĉ t [" class "] Ġ= Ġ" form - control - plaintext " .. t [" class "] Ċĉĉ ĉ } Ċĉĉ ĉ return Ċĉ ĉ } Ċ ĉ } Ċ ĉ val Ġtp Ġ= Ġt [" type "] Ċ ĉ if Ġ( tp Ġ!= Ġ" radio " Ġ&& Ġtp Ġ!= Ġ" checkbox ") Ġ{ Ċĉ ĉ if Ġ(! t . class Has (" form - control ")) Ġ{ Ċĉĉ ĉ t [" class "] Ġ= Ġ" form - control " .. t [" class "] Ċĉ ĉ } Ċ ĉ } Ċ } ĊĊ Ċ private Ġfun ĠTag . process Properties Of Edit ( p : ĠProp ) Ġ{ Ċ ĉ if Ġ( p . is Type Int Ġ|| Ġp . is Type Long Ġ|| Ġp . is Type Float Ġ|| Ġp . is Type Double ) Ġ{ Ċĉ ĉ this Ġ+= Ġ" type " Ġto Ġ" number " Ċ ĉ } Ġelse Ġif Ġ( p . is Type Class ( java . sql . Date :: class )) Ġ{ Ċĉ ĉ this Ġ+= Ġ" type " Ġto Ġ" date " Ċ ĉ } Ċ ĉ val Ġstep An Ġ= Ġp . find Annotation < Step Value >() Ċ ĉ if Ġ( step An Ġ== Ġnull ) Ġ{ Ċĉ ĉ if Ġ( p . is Type Float Ġ|| Ġp . is Type Double ) Ġ{ Ċĉĉ ĉ val Ġkeep Dot Ġ= Ġp . find Annotation < NumberFormat >() Ċĉĉ ĉ if Ġ( keep Dot Ġ!= Ġnull Ġ&& Ġkeep Dot . pattern . isNotEmpty ()) Ġ{ Ċĉĉĉ ĉ val Ġfmt Ġ= ĠDecimal Format ( keep Dot . pattern ) Ċĉĉĉ ĉ val Ġn Ġ= Ġfmt . maximum Fraction Digits Ċĉĉĉ ĉ if Ġ( n Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ this Ġ+= Ġ" step " Ġto Ġ 1 0 . toDouble (). pow (- n ). toString () Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ this Ġ+= Ġ" step " Ġto Ġ" 1 " Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ this Ġ+= Ġ" step " Ġto Ġ" 1 " Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ ĉ val Ġan List Ġ= Ġp . annotations Ċ ĉ for Ġ( an Ġin Ġan List ) Ġ{ Ċĉ ĉ when Ġ( an ) Ġ{ Ċĉĉ ĉ is ĠForm Required Ġ-> Ġthis Ġ+= Ġ" required " Ġto Ġ" true " Ċĉĉ ĉ is ĠForm Hint Ġ-> Ġthis Ġ+= Ġ" placeholder " Ġto Ġan . value Ċĉĉ ĉ is ĠForm Date Ġ-> Ġthis Ġ+= Ġ" type " Ġto Ġ" date " Ċĉĉ ĉ is ĠForm Password Ġ-> Ġthis Ġ+= Ġ" type " Ġto Ġ" password " Ċĉĉ ĉ is ĠForm Email Ġ-> Ġthis Ġ+= Ġ" type " Ġto Ġ" email " Ċĉĉ ĉ is ĠForm Pattern Ġ-> Ġthis Ġ+= Ġ" pattern " Ġto Ġan . value Ċĉĉ ĉ is ĠForm Phone Ġ-> Ġ{ Ċĉĉĉ ĉ this Ġ+= Ġ" type " Ġto Ġ" text " Ċĉĉĉ ĉ this Ġ+= Ġ" pattern " Ġto Ġ""" ^ 1 [ 3 , 4 , 5 , 6 , 7 , 8 , 9 ]\ d { 9 }$ """ Ċĉĉ ĉ } Ċĉĉ ĉ is ĠForm Tel Ġ-> Ġ{ Ċĉĉĉ ĉ this Ġ+= Ġ" type " Ġto Ġ" text " Ċĉĉĉ ĉ this Ġ+= Ġ" pattern " Ġto Ġ""" ^ (\ d { 3 , 4 }\ - ? )? \ d { 6 , 8 }$ """ Ċĉĉ ĉ } Ċĉĉ ĉ is ĠLength Range Ġ-> Ġ{ Ċĉĉĉ ĉ this Ġ+= Ġ" maxlength " Ġto Ġan . max Value . toString () Ċĉĉĉ ĉ this Ġ+= Ġ" pattern " Ġto Ġ". { ${ an . min Value }, }" Ċĉĉ ĉ } Ċĉĉ ĉ is ĠMin Length Ġ-> Ġ{ Ċĉĉĉ ĉ if Ġ( an . value Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ this Ġ+= Ġ" pattern " Ġto Ġ". { ${ an . value }, }" Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ is ĠLength Ġ-> Ġ{ Ċĉĉĉ ĉ val Ġhas Range Ġ= Ġnull Ġ!= Ġan List . find Ġ{ Ġit Ġis ĠLength Range Ġ} Ċĉĉĉ ĉ if Ġ(! has Range ) Ġ{ Ċĉĉĉĉ ĉ if Ġ( an . value Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉĉ ĉ this Ġ+= Ġ" maxlength " Ġto Ġan . value . toString () Ċĉĉĉĉ ĉ } Ġelse Ġif Ġ( p . is TypeString ) Ġ{ Ċĉĉĉĉĉ ĉ this Ġ+= Ġ" maxlength " Ġto Ġ" 2 5 6 " Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ is ĠMin Value Ġ-> Ġthis Ġ+= Ġ" min " Ġto Ġan . value Ċĉĉ ĉ is ĠMax Value Ġ-> Ġthis Ġ+= Ġ" max " Ġto Ġan . value Ċĉĉ ĉ is ĠValue Range Ġ-> Ġ{ Ċĉĉĉ ĉ this Ġ+= Ġ" min " Ġto Ġan . min Val Ċĉĉĉ ĉ this Ġ+= Ġ" max " Ġto Ġan . max Val Ċĉĉ ĉ } Ċĉĉ ĉ is ĠStep Value Ġ-> Ġthis Ġ+= Ġ" step " Ġto Ġan . value Ċĉ ĉ } Ċ ĉ } Ċ Ċ } ĊĊ Ċ fun ĠTag . form Check ( var arg Ġvs : ĠTag Attr , Ġblock : ĠTag Block ): ĠTag Ġ{ Ċ ĉ return Ġdiv (" class " Ġto Ġ" form - check ", Ġ* vs ) Ġ{ Ċĉ ĉ this . block () Ċĉ ĉ val Ġlb Ġ= Ġthis . first Ġ{ Ġit . tagName Ġ== Ġ" label " Ġ} Ċĉ ĉ val Ġcb Ġ= Ġthis . children . find Ġ{ Ġit . tagName Ġ== Ġ" input " Ġ&& Ġ( it [" type "] Ġ== Ġ" checkbox " Ġ|| Ġit [" type "] Ġ== Ġ" radio ") Ġ} Ċĉ ĉ if Ġ( cb Ġ!= Ġnull ) Ġ{ Ċĉĉ ĉ if Ġ(! cb . class Has (" form - check - input ")) Ġ{ Ċĉĉĉ ĉ cb [" class "] Ġ= Ġ" form - check - input " .. cb [" class "] Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ if Ġ( lb Ġ!= Ġnull ) Ġ{ Ċĉĉ ĉ if Ġ(! lb . class Has (" form - check - label ")) Ġ{ Ċĉĉĉ ĉ lb [" class "] Ġ= Ġ" form - check - label " .. lb [" class "] Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ lb ?. need For ( cb ) Ċ ĉ } Ċ } Ċ Ċ fun ĠTag . feedback Invalid ( text : ĠString ) Ġ{ Ċ ĉ if Ġ( text . isNotEmpty ()) Ġ{ Ċĉ ĉ div (" class " Ġto Ġ" invalid - feedback ") Ġ{ Ċĉĉ ĉ + text Ċĉ ĉ } Ċ ĉ } Ċ } ĊĊ Ċ fun ĠTag . form Text Mut ed ( block : ĠTag Block ): ĠTag Ġ{ Ċ ĉ return Ġtag (" small ", Ġ" class " Ġto Ġ" form - text " .." text - muted ", Ġblock Ġ= Ġblock ) Ċ } ĊĊ Ċ fun ĠTag . form Text Mut ed ( text : ĠString ) Ġ{ Ċ ĉ form Text Mut ed Ġ{ Ċĉ ĉ + text Ċ ĉ } Ċ } ĊĊ