feat: properly destroy objects on disconnect from dom
This commit is contained in:
@@ -46,7 +46,7 @@ export default class extends Controller {
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
new Autocomplete(this.element, {
|
this.autocomplete = new Autocomplete(this.element, {
|
||||||
search: searchHandler,
|
search: searchHandler,
|
||||||
getResultValue: result => result.text,
|
getResultValue: result => result.text,
|
||||||
submitOnEnter: true,
|
submitOnEnter: true,
|
||||||
@@ -58,6 +58,7 @@ export default class extends Controller {
|
|||||||
this.selectedValue = true
|
this.selectedValue = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// prevent form submission when selecting entry in autocomplete list with enter key
|
||||||
this.element.addEventListener('keypress', e => {
|
this.element.addEventListener('keypress', e => {
|
||||||
if (e.key === 'Enter') {
|
if (e.key === 'Enter') {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
@@ -76,4 +77,8 @@ export default class extends Controller {
|
|||||||
this.resetButtonTarget.classList.toggle('hidden', false === this.selectedValue)
|
this.resetButtonTarget.classList.toggle('hidden', false === this.selectedValue)
|
||||||
this.searchIconTarget.classList.toggle('hidden', this.selectedValue)
|
this.searchIconTarget.classList.toggle('hidden', this.selectedValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
disconnect() {
|
||||||
|
this.autocomplete.destroy()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ export default class extends Controller {
|
|||||||
static targets = ['item', 'handle']
|
static targets = ['item', 'handle']
|
||||||
|
|
||||||
connect() {
|
connect() {
|
||||||
new Sortable(this.element, {
|
this.sortable = new Sortable(this.element, {
|
||||||
item: '[data-sortable-target="item"]',
|
item: '[data-sortable-target="item"]',
|
||||||
handle: '[data-sortable-target="handle"]',
|
handle: '[data-sortable-target="handle"]',
|
||||||
onEnd: e => {
|
onEnd: e => {
|
||||||
@@ -31,4 +31,8 @@ export default class extends Controller {
|
|||||||
body: JSON.stringify({ ordering: ordering })
|
body: JSON.stringify({ ordering: ordering })
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
disconnect() {
|
||||||
|
this.sortable.destroy()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ export default class extends Controller {
|
|||||||
} else {
|
} else {
|
||||||
element = this.element
|
element = this.element
|
||||||
}
|
}
|
||||||
tippy(element, options)
|
this.tooltip = tippy(element, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
disconnect() {
|
||||||
|
this.tooltip.destroy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ export default class extends Controller {
|
|||||||
connect () {
|
connect () {
|
||||||
useFetch(this)
|
useFetch(this)
|
||||||
|
|
||||||
const dropzone = new Dropzone(this.dropzoneTarget, {
|
this.dropzone = new Dropzone(this.dropzoneTarget, {
|
||||||
url: this.endpointUploadValue,
|
url: this.endpointUploadValue,
|
||||||
withCredentials: true,
|
withCredentials: true,
|
||||||
maxFiles: this.maxFilesValue,
|
maxFiles: this.maxFilesValue,
|
||||||
@@ -42,15 +42,15 @@ export default class extends Controller {
|
|||||||
dictMaxFilesExceeded: this.languageValue.maxFilesExceeded,
|
dictMaxFilesExceeded: this.languageValue.maxFilesExceeded,
|
||||||
})
|
})
|
||||||
|
|
||||||
dropzone.on('addedfile', file => {
|
this.dropzone.on('addedfile', file => {
|
||||||
this.errorsTarget.classList.add('hidden')
|
this.errorsTarget.classList.add('hidden')
|
||||||
})
|
})
|
||||||
|
|
||||||
dropzone.on('removedfile', (file) => {
|
this.dropzone.on('removedfile', (file) => {
|
||||||
fetch(`${this.endpointDeleteValue}?uuid=${file.upload.uuid}`, { method: 'delete', credentials: 'include' })
|
fetch(`${this.endpointDeleteValue}?uuid=${file.upload.uuid}`, { method: 'delete', credentials: 'include' })
|
||||||
})
|
})
|
||||||
|
|
||||||
dropzone.on('sending', (file, xhr, formData) => {
|
this.dropzone.on('sending', (file, xhr, formData) => {
|
||||||
if (this.hasParamsValue) {
|
if (this.hasParamsValue) {
|
||||||
let keys = Object.keys(this.paramsValue)
|
let keys = Object.keys(this.paramsValue)
|
||||||
keys.forEach(key => {
|
keys.forEach(key => {
|
||||||
@@ -62,14 +62,18 @@ export default class extends Controller {
|
|||||||
window.dispatchEvent(new CustomEvent('dropzone:uploading'))
|
window.dispatchEvent(new CustomEvent('dropzone:uploading'))
|
||||||
})
|
})
|
||||||
|
|
||||||
dropzone.on('queuecomplete', () => {
|
this.dropzone.on('queuecomplete', () => {
|
||||||
window.dispatchEvent(new CustomEvent('dropzone:complete'))
|
window.dispatchEvent(new CustomEvent('dropzone:complete'))
|
||||||
})
|
})
|
||||||
|
|
||||||
dropzone.on('error', (file, errorMessage) => {
|
this.dropzone.on('error', (file, errorMessage) => {
|
||||||
this.errorsTarget.innerText = errorMessage
|
this.errorsTarget.innerText = errorMessage
|
||||||
this.errorsTarget.classList.remove('hidden')
|
this.errorsTarget.classList.remove('hidden')
|
||||||
dropzone.removeFile(file)
|
dropzone.removeFile(file)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
disconnect() {
|
||||||
|
this.dropzone.destroy()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user