@@ -109,18 +109,26 @@ function onHidePanelClick(el: HTMLElement, e: MouseEvent) {
109109 throw new Error ( 'no panel to hide' ) ; // should never happen, otherwise there is a bug in code
110110}
111111
112- export function assignElementProperty ( el : any , name : string , val : string ) {
113- name = camelize ( name ) ;
114- const old = el [ name ] ;
112+ export type ElementWithAssignableProperties = {
113+ getAttribute : ( name : string ) => string | null ;
114+ setAttribute : ( name : string , value : string ) => void ;
115+ } & Record < string , any >
116+
117+ export function assignElementProperty ( el : ElementWithAssignableProperties , kebabName : string , val : string ) {
118+ const camelizedName = camelize ( kebabName ) ;
119+ const old = el [ camelizedName ] ;
115120 if ( typeof old === 'boolean' ) {
116- el [ name ] = val === 'true' ;
121+ el [ camelizedName ] = val === 'true' ;
117122 } else if ( typeof old === 'number' ) {
118- el [ name ] = parseFloat ( val ) ;
123+ el [ camelizedName ] = parseFloat ( val ) ;
119124 } else if ( typeof old === 'string' ) {
120- el [ name ] = val ;
125+ el [ camelizedName ] = val ;
126+ } else if ( el [ camelizedName ] ?. nodeName ) {
127+ // "form" has an edge case: its "<input name=action>" element overwrites the "action" property, we can only set attribute
128+ el . setAttribute ( kebabName , val ) ;
121129 } else {
122130 // in the future, we could introduce a better typing system like `data-modal-form.action:string="..."`
123- throw new Error ( `cannot assign element property ${ name } by value ${ val } ` ) ;
131+ throw new Error ( `cannot assign element property " ${ camelizedName } " by value " ${ val } " ` ) ;
124132 }
125133}
126134
0 commit comments