@@ -8,7 +8,7 @@ import { normalizeAttributesForComparison } from './normalize_attributes_for_com
8
8
import { cloneHTMLElement } from './clone_html_element' ;
9
9
10
10
interface ElementLoadingDirectives {
11
- element : HTMLElement ,
11
+ element : HTMLElement | SVGElement ,
12
12
directives : Directive [ ]
13
13
}
14
14
@@ -190,11 +190,15 @@ export default class extends Controller {
190
190
this . _makeRequest ( null ) ;
191
191
}
192
192
193
- _getValueFromElement ( element : HTMLElement ) {
193
+ _getValueFromElement ( element : HTMLElement | SVGElement ) {
194
194
return element . dataset . value || ( element as any ) . value ;
195
195
}
196
196
197
- _updateModelFromElement ( element : HTMLElement , value : string , shouldRender : boolean ) {
197
+ _updateModelFromElement ( element : Element , value : string , shouldRender : boolean ) {
198
+ if ( ! ( element instanceof HTMLElement ) ) {
199
+ throw new Error ( 'Could not update model for non HTMLElement' ) ;
200
+ }
201
+
198
202
const model = element . dataset . model || element . getAttribute ( 'name' ) ;
199
203
200
204
if ( ! model ) {
@@ -419,7 +423,7 @@ export default class extends Controller {
419
423
/**
420
424
* @private
421
425
*/
422
- _handleLoadingDirective ( element : HTMLElement , isLoading : boolean , directive : Directive ) {
426
+ _handleLoadingDirective ( element : HTMLElement | SVGElement , isLoading : boolean , directive : Directive ) {
423
427
const finalAction = parseLoadingAction ( directive . action , isLoading ) ;
424
428
425
429
let loadingDirective : ( ( ) => void ) ;
@@ -490,7 +494,7 @@ export default class extends Controller {
490
494
const loadingDirectives : ElementLoadingDirectives [ ] = [ ] ;
491
495
492
496
this . element . querySelectorAll ( '[data-loading]' ) . forEach ( ( element => {
493
- if ( ! ( element instanceof HTMLElement ) ) {
497
+ if ( ! ( element instanceof HTMLElement ) && ! ( element instanceof SVGElement ) ) {
494
498
throw new Error ( 'Invalid Element Type' ) ;
495
499
}
496
500
@@ -506,19 +510,19 @@ export default class extends Controller {
506
510
return loadingDirectives ;
507
511
}
508
512
509
- _showElement ( element : HTMLElement ) {
513
+ _showElement ( element : HTMLElement | SVGElement ) {
510
514
element . style . display = 'inline-block' ;
511
515
}
512
516
513
- _hideElement ( element : HTMLElement ) {
517
+ _hideElement ( element : HTMLElement | SVGElement ) {
514
518
element . style . display = 'none' ;
515
519
}
516
520
517
- _addClass ( element : HTMLElement , classes : string [ ] ) {
521
+ _addClass ( element : HTMLElement | SVGElement , classes : string [ ] ) {
518
522
element . classList . add ( ...combineSpacedArray ( classes ) ) ;
519
523
}
520
524
521
- _removeClass ( element : HTMLElement , classes : string [ ] ) {
525
+ _removeClass ( element : HTMLElement | SVGElement , classes : string [ ] ) {
522
526
element . classList . remove ( ...combineSpacedArray ( classes ) ) ;
523
527
524
528
// remove empty class="" to avoid morphdom "diff" problem
@@ -564,6 +568,10 @@ export default class extends Controller {
564
568
const newElement = htmlToElement ( newHtml ) ;
565
569
morphdom ( this . element , newElement , {
566
570
onBeforeElUpdated : ( fromEl , toEl ) => {
571
+ if ( ! ( fromEl instanceof HTMLElement ) || ! ( toEl instanceof HTMLElement ) ) {
572
+ return false ;
573
+ }
574
+
567
575
// https://github.com/patrick-steele-idem/morphdom#can-i-make-morphdom-blaze-through-the-dom-tree-even-faster-yes
568
576
if ( fromEl . isEqualNode ( toEl ) ) {
569
577
// the nodes are equal, but the "value" on some might differ
0 commit comments