@@ -13,14 +13,21 @@ type SelectInputReceiveMessageData = {
1313  value ?: string ; 
1414} ; 
1515
16- type  SelectizeOptions  =  Selectize . IOptions < string ,  unknown > ; 
1716type  SelectizeInfo  =  Selectize . IApi < string ,  unknown >  &  { 
18-   settings : SelectizeOptions ; 
17+   settings : Selectize . IOptions < string ,   unknown > ; 
1918} ; 
2019
21- // Extend SelectizeOptions to include shinyRemoveButton option 
22- // Currently, py-shiny leverages this option to power the 
23- // remove_button parameter. 
20+ type  SelectizeOptions  =  Selectize . IOptions < string ,  unknown >  &  { 
21+   // Provide some stronger typing for the Selectize options 
22+   labelField : "label" ; 
23+   valueField : "value" ; 
24+   searchField : [ "label" ] ; 
25+   onItemRemove ?: ( value : string )  =>  void ; 
26+   onDropdownClose ?: ( )  =>  void ; 
27+ } ; 
28+ 
29+ // Adds a py-shiny specific "option" that makes the 
30+ // input_selectize(remove_button) parameter possible 
2431type  SelectizeShinyOptions  =  SelectizeOptions  &  { 
2532  shinyRemoveButton ?: "none"  |  "true"  |  "false"  |  "both" ; 
2633} ; 
@@ -251,13 +258,7 @@ class SelectInputBinding extends InputBinding {
251258
252259    if  ( config . length  ===  0 )  return  undefined ; 
253260
254-     let  options : SelectizeOptions  &  { 
255-       labelField : "label" ; 
256-       valueField : "value" ; 
257-       searchField : [ "label" ] ; 
258-       onItemRemove ?: ( value : string )  =>  void ; 
259-       onDropdownClose ?: ( )  =>  void ; 
260-     }  =  $ . extend ( 
261+     let  options : SelectizeShinyOptions  =  $ . extend ( 
261262      { 
262263        labelField : "label" , 
263264        valueField : "value" , 
@@ -266,7 +267,7 @@ class SelectInputBinding extends InputBinding {
266267      JSON . parse ( config . html ( ) ) , 
267268    ) ; 
268269
269-     this . _addShinyRemoveButton ( options ,  el . hasAttribute ( "multiple" ) ) ; 
270+     options   =   this . _addShinyRemoveButton ( options ,  el . hasAttribute ( "multiple" ) ) ; 
270271
271272    // selectize created from selectInput() 
272273    if  ( typeof  config . data ( "nonempty" )  !==  "undefined" )  { 
@@ -319,10 +320,10 @@ class SelectInputBinding extends InputBinding {
319320  private  _addShinyRemoveButton ( 
320321    options : SelectizeShinyOptions , 
321322    multiple : boolean , 
322-   ) : void   { 
323+   ) : SelectizeOptions  { 
323324    let  removeButton  =  options . shinyRemoveButton ; 
324325    if  ( removeButton  ===  undefined )  { 
325-       return ; 
326+       return   options ; 
326327    } 
327328
328329    // None really means 'smart default' 
@@ -331,7 +332,7 @@ class SelectInputBinding extends InputBinding {
331332    } 
332333
333334    if  ( removeButton  ===  "false" )  { 
334-       return ; 
335+       return   options ; 
335336    } 
336337
337338    const  plugins  =  [ ] ; 
@@ -341,16 +342,16 @@ class SelectInputBinding extends InputBinding {
341342      plugins . push ( multiple  ? "remove_button"  : "clear_button" ) ; 
342343    } 
343344
344-     const   optionPlugins   =   options . plugins  ||   [ ] ; 
345- 
346-     plugins . forEach ( ( plugin )   =>   { 
347-       if   ( ! optionPlugins . includes ( plugin ) )   { 
348-         optionPlugins . push ( plugin ) ; 
349-       } 
350-     } ) ; 
351- 
352-     options . plugins   =   optionPlugins ; 
353-     delete   options . shinyRemoveButton ; 
345+     // Add plugins to existing  plugins if not already present 
346+      return   { 
347+       ... options , 
348+       plugins :  Array . from ( 
349+         new   Set ( [ 
350+           ... ( Array . isArray ( options . plugins )  ?  options . plugins  :  [ ] ) , 
351+           ... plugins , 
352+          ] ) , 
353+        ) , 
354+     } ; 
354355  } 
355356} 
356357
0 commit comments