const PENDING_CLASS = 'direct-upload--pending'; const ERROR_CLASS = 'direct-upload--error'; const COMPLETE_CLASS = 'direct-upload--complete'; /** ProgressBar is and utility class responsible for rendering upload progress bar. It is used to handle direct-upload form ujs events but also in the Uploader delegate used with uploads on json api. */ export default class ProgressBar { static init(input, id, file) { clearErrors(input); const html = this.render(id, file.name); input.insertAdjacentHTML('beforebegin', html); } static start(id) { const element = getDirectUploadElement(id); element.classList.remove(PENDING_CLASS); } static progress(id, progress) { const element = getDirectUploadProgressElement(id); element.style.width = `${progress}%`; } static error(id, error) { const element = getDirectUploadElement(id); element.classList.add(ERROR_CLASS); element.setAttribute('title', error); } static end(id) { const element = getDirectUploadElement(id); element.classList.add(COMPLETE_CLASS); } static render(id, filename) { return `
${filename}
`; } constructor(input, id, file) { this.constructor.init(input, id, file); this.id = id; } start() { this.constructor.start(this.id); } progress(progress) { this.constructor.progress(this.id, progress); } error(error) { this.constructor.error(this.id, error); } end() { this.constructor.end(this.id); } destroy() { const element = getDirectUploadElement(this.id); element.remove(); } } function clearErrors(input) { const errorElements = input.parentElement.querySelectorAll(`.${ERROR_CLASS}`); for (let element of errorElements) { element.remove(); } } function getDirectUploadElement(id) { return document.getElementById(`direct-upload-${id}`); } function getDirectUploadProgressElement(id) { return document.querySelector( `#direct-upload-${id} .direct-upload__progress` ); }