@@ -15,8 +15,15 @@ export function dispatchPageDirtyEvent(data) {
1515}
1616
1717export class ElementEditor extends HTMLElement {
18- constructor ( ) {
19- super ( )
18+ #form = null
19+ #header = null
20+ #toggleButton = null
21+
22+ connectedCallback ( ) {
23+ // The placeholder while be being dragged is empty.
24+ if ( this . classList . contains ( "ui-sortable-placeholder" ) ) {
25+ return
26+ }
2027
2128 // Add event listeners
2229 this . addEventListener ( "click" , this )
@@ -27,24 +34,16 @@ export class ElementEditor extends HTMLElement {
2734
2835 // Dirty observer still needs to be jQuery
2936 // in order to support select2.
30- $ ( this . form ) . on ( "change" , this . onChange )
37+ this . #form = this . form
38+ if ( this . #form) {
39+ $ ( this . #form) . on ( "change" , this . onChange )
40+ }
3141
32- this . header ?. addEventListener ( "dblclick" , ( ) => {
33- this . toggle ( )
34- } )
35- this . toggleButton ?. addEventListener ( "click" , ( evt ) => {
36- const elementEditor = evt . target . closest ( "alchemy-element-editor" )
37- if ( elementEditor === this ) {
38- this . toggle ( )
39- }
40- } )
41- }
42+ this . #header = this . header
43+ this . #header?. addEventListener ( "dblclick" , this . #onHeaderDblclick)
4244
43- connectedCallback ( ) {
44- // The placeholder while be being dragged is empty.
45- if ( this . classList . contains ( "ui-sortable-placeholder" ) ) {
46- return
47- }
45+ this . #toggleButton = this . toggleButton
46+ this . #toggleButton?. addEventListener ( "click" , this . #onToggleClick)
4847
4948 // When newly created, focus the element and refresh the preview
5049 if ( this . hasAttribute ( "created" ) ) {
@@ -56,6 +55,20 @@ export class ElementEditor extends HTMLElement {
5655 }
5756 }
5857
58+ disconnectedCallback ( ) {
59+ this . removeEventListener ( "click" , this )
60+ this . removeEventListener ( "alchemy:element-update-title" , this )
61+ this . removeEventListener ( "ajax:complete" , this )
62+ if ( this . #form) {
63+ $ ( this . #form) . off ( "change" , this . onChange )
64+ this . #form = null
65+ }
66+ this . #header?. removeEventListener ( "dblclick" , this . #onHeaderDblclick)
67+ this . #header = null
68+ this . #toggleButton?. removeEventListener ( "click" , this . #onToggleClick)
69+ this . #toggleButton = null
70+ }
71+
5972 handleEvent ( event ) {
6073 switch ( event . type ) {
6174 case "click" :
@@ -79,15 +92,15 @@ export class ElementEditor extends HTMLElement {
7992 }
8093 }
8194
82- onChange ( event ) {
95+ onChange = ( event ) => {
8396 const target = event . target
8497 // SortableJS fires a native change event :/
8598 // and we do not want to set the element editor dirty
8699 // when this happens
87100 if ( target . classList . contains ( "nested-elements" ) ) {
88101 return
89102 }
90- this . closest ( "alchemy-element-editor" ) . setDirty ( target )
103+ this . setDirty ( target )
91104 event . stopPropagation ( )
92105 return false
93106 }
@@ -576,6 +589,17 @@ export class ElementEditor extends HTMLElement {
576589 get previewWindow ( ) {
577590 return document . getElementById ( "alchemy_preview_window" )
578591 }
592+
593+ #onHeaderDblclick = ( ) => {
594+ this . toggle ( )
595+ }
596+
597+ #onToggleClick = ( evt ) => {
598+ const elementEditor = evt . target . closest ( "alchemy-element-editor" )
599+ if ( elementEditor === this ) {
600+ this . toggle ( )
601+ }
602+ }
579603}
580604
581605customElements . define ( "alchemy-element-editor" , ElementEditor )
0 commit comments