/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 2 0 - 2 0 2 1 , ĠSimp lex ion , ĠH ung ary Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġz ak ad ab ar . core . browser . field . select Ċ Ċ import Ġorg . w 3 c . dom . HTMLElement Ċ import Ġorg . w 3 c . dom . events . Keyboard Event Ċ import Ġorg . w 3 c . dom . events . MouseEvent Ċ import Ġorg . w 3 c . dom . get Ċ import Ġz ak ad ab ar . core . browser . Zk Element Ċ import Ġz ak ad ab ar . core . browser . field . Zk Select Base Ċ import Ġz ak ad ab ar . core . browser . icon . Zk Icon Ċ import Ġz ak ad ab ar . core . browser . popup . Zk Pop Up Ċ import Ġz ak ad ab ar . core . browser . util . escape Ċ import Ġz ak ad ab ar . core . browser . util . minus Assign Ċ import Ġz ak ad ab ar . core . browser . util . plus Assign Ċ import Ġz ak ad ab ar . core . resource . Zk Icons Ċ import Ġz ak ad ab ar . core . resource . localized Strings Ċ Ċ open Ġclass ĠDropdown Renderer < VT , ĠFT Ġ: ĠZ k Select Base < VT , ĠFT >> Ġ: ĠSelect Renderer < VT , FT > Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATA SET _ KEY Ġ= Ġ" value " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġlateinit Ġvar Ġfield : ĠZ k Select Base < VT , ĠFT > ĊĊĠĠĠ Ġopen Ġlateinit Ġvar Ġcontainer : ĠHTMLElement ĊĊĠĠĠ Ġopen Ġlateinit Ġvar Ġarrow : ĠZ k Element ĊĊĠĠĠ Ġopen Ġlateinit Ġvar Ġitem List Ġ: ĠZ k Pop Up ĊĊĠĠĠ Ġopen Ġval Ġselected Option Ġ= ĠZ k Element () ĊĊĠĠĠ Ġoverride Ġfun ĠreadOnly ( value : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcl Ġ= Ġcontainer . first Element Child ?. classList ĊĊĠĠĠĠĠĠĠ Ġif Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcl ?. plus Assign ( context . styles . disabled Select ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarrow . hide () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcl ?. minus Assign ( context . styles . disabled Select ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarrow . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġitem List Ġ= ĠZ k Pop Up Ġ{ Ġ+ Ġcontext . styles . select Option List Ġ} ĊĊĠĠĠĠĠĠĠ Ġitem List . element . tab Index Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġitem List . on (" click ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠMouseEvent ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġit . target ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Ġ! is ĠHTMLElement ) Ġreturn @ on ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Id String Ġ= Ġtarget . dataset [ DATASET _ KEY ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Id Ġ= Ġif Ġ( entry Id String . isNull OrEmpty ()) Ġnull Ġelse Ġfield . fromString ( entry Id String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġentry Id ?. let Ġ{ Ġitems . first OrNull Ġ{ Ġitem Ġ-> Ġitem . first Ġ== Ġentry Id Ġ} Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . update ( items , Ġvalue , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġitem List . on (" blur ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem List . hide () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġitem List . hide () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild FieldValue () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Ġ= Ġdiv ( context . styles . select Container ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġrow ( context . styles . selected Option ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġselected Option ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠZ k Icon ( Zk Icons . arrow DropDown , Ġsize Ġ= Ġ 2 4 ). also Ġ{ Ġarrow Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" click ") Ġ{ Ġtoggle Items () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . tab Index Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon ( container , Ġ" keydown ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠKeyboard Event ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME Ġadd Ġkeyboard Ġnavigation Ġto Ġthe Ġlist Ġitself ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Enter ", Ġ" Arrow Down " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . preventDefault () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item List . is Hidden ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Items () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Escape " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . preventDefault () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem List . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠreadOnly Ġ= Ġcontext . readOnly Ġ// Ġinitialization Ġdoes Ġnot Ġexecute Ġsetter ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġcontainer ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( value : ĠVT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġitem List . hide () ĊĊĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ""" < div Ġclass ="${ context . styles . select Entry } Ġ${ context . styles . selected }" Ġdata -$ DATASET _ KEY =""> ${ localized Strings . not Selected }</ div > """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Option . innerText Ġ= Ġlocalized Strings . not Selected ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . selected Item Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ""" < div Ġclass ="${ context . styles . select Entry }" Ġdata -$ DATASET _ KEY =""> ${ localized Strings . not Selected }</ div > """ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġitems . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . first Ġ== Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ""" < div Ġclass =" Ġ${ context . styles . select Entry } Ġ${ context . styles . selected }" Ġdata -$ DATASET _ KEY ="${ it . first }"> ${ escape ( it . second )}</ div > """ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Option . innerText Ġ= Ġit . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . selected Item Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ""" < div Ġclass ="${ context . styles . select Entry }" Ġdata -$ DATASET _ KEY ="${ it . first }"> ${ escape ( it . second )}</ div > """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġitem List . innerHTML Ġ= Ġs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfocus Value () Ġ= Ġtoggle Items () ĊĊĠĠĠ Ġopen Ġfun Ġtoggle Items () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( field . readOnly ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġitem List . element . style . height Ġ= Ġ" auto " ĊĠĠĠĠĠĠĠ Ġitem List . element . style . max Height Ġ= Ġ" auto " ĊĊĠĠĠĠĠĠĠ Ġitem List . toggle ( selected Option . element , Ġcontext . styles . field Height Ġ* Ġ 5 ) ĊĠĠĠ Ġ} Ċ Ċ }