148 lines
4.4 KiB
Plaintext
148 lines
4.4 KiB
Plaintext
(function() {
|
|
'use strict';
|
|
|
|
window.utils = window.utils || {};
|
|
|
|
// allows for multiple file uploads with separate inputs
|
|
window.utils.initializeFileUpload = function(input) {
|
|
var isMulti = input.hasAttribute('multiple');
|
|
var fileList = isMulti ? addFileList() : null;
|
|
var label = addFileLabel();
|
|
|
|
function renderFileList(files) {
|
|
fileList.innerHTML = '';
|
|
Array.from(files).forEach(function(file, index) {
|
|
var fileDisplayEl = document.createElement('li');
|
|
fileDisplayEl.innerHTML = file.name;
|
|
fileList.appendChild(fileDisplayEl);
|
|
});
|
|
}
|
|
|
|
function updateLabel(files) {
|
|
if (files.length) {
|
|
if (isMulti) {
|
|
label.innerText = files.length + ' Dateien ausgwählt';
|
|
} else {
|
|
label.innerHTML = files[0].name;
|
|
}
|
|
} else {
|
|
resetFileLabel();
|
|
}
|
|
}
|
|
|
|
function addFileList() {
|
|
var list = document.createElement('ol');
|
|
list.classList.add('file-input__list');
|
|
var unpackEl = input.parentElement.querySelector('.file-input__unpack');
|
|
if (unpackEl) {
|
|
input.parentElement.insertBefore(list, unpackEl);
|
|
} else {
|
|
input.parentElement.appendChild(list);
|
|
}
|
|
return list;
|
|
}
|
|
|
|
function addFileLabel() {
|
|
var label = document.createElement('label');
|
|
label.classList.add('file-input__label');
|
|
label.setAttribute('for', input.id);
|
|
input.parentElement.insertBefore(label, input);
|
|
return label;
|
|
}
|
|
|
|
function resetFileLabel() {
|
|
// interpolate translated String here
|
|
label.innerText = 'Datei' + (isMulti ? 'en' : '') + ' auswählen';
|
|
}
|
|
|
|
// initial setup
|
|
resetFileLabel();
|
|
input.classList.add('file-input__input--hidden');
|
|
input.addEventListener('change', function() {
|
|
input.dispatchEvent(new Event('input'));
|
|
if (isMulti) {
|
|
renderFileList(input.files);
|
|
}
|
|
|
|
updateLabel(input.files);
|
|
});
|
|
}
|
|
|
|
// to remove previously uploaded files
|
|
window.utils.reactiveFileCheckbox = function(input) {
|
|
// adds eventlistener(s)
|
|
function addListener(container) {
|
|
input.addEventListener('change', function(event) {
|
|
container.classList.toggle('file-container--checked', this.checked);
|
|
});
|
|
}
|
|
|
|
// initial setup
|
|
function setup() {
|
|
var cont = input.parentNode;
|
|
while (cont !== document.body) {
|
|
if (cont.matches('.file-container')) {
|
|
break;
|
|
}
|
|
cont = cont.parentNode;
|
|
}
|
|
addListener(cont);
|
|
}
|
|
setup();
|
|
}
|
|
|
|
window.utils.initializeCheckboxRadio = function(input, type) {
|
|
|
|
if (!input.parentElement.classList.contains(type)) {
|
|
var parentEl = input.parentElement;
|
|
var siblingEl = input.nextElementSibling;
|
|
var wrapperEl = document.createElement('div');
|
|
var labelEl = document.createElement('label');
|
|
wrapperEl.classList.add(type);
|
|
labelEl.setAttribute('for', input.id);
|
|
wrapperEl.appendChild(input);
|
|
wrapperEl.appendChild(labelEl);
|
|
|
|
if (siblingEl) {
|
|
parentEl.insertBefore(wrapperEl, siblingEl);
|
|
} else {
|
|
parentEl.appendChild(wrapperEl);
|
|
}
|
|
}
|
|
}
|
|
|
|
})();
|
|
|
|
document.addEventListener('setup', function(e) {
|
|
if (e.detail.module && e.detail.module !== 'inputs')
|
|
return;
|
|
|
|
// initialize checkboxes
|
|
Array.from(e.detail.scope.querySelectorAll('input[type="checkbox"]:not(.js-initialized)')).forEach(function(inp) {
|
|
window.utils.initializeCheckboxRadio(inp, 'checkbox');
|
|
inp.classList.add("js-initialized");
|
|
});
|
|
|
|
// initialize radios
|
|
Array.from(e.detail.scope.querySelectorAll('input[type="radio"]:not(.js-initialized)')).forEach(function(inp) {
|
|
window.utils.initializeCheckboxRadio(inp, 'radio');
|
|
inp.classList.add("js-initialized");
|
|
});
|
|
|
|
// initialize file-upload-fields
|
|
Array.from(e.detail.scope.querySelectorAll('input[type="file"]:not(.js-initialized)')).forEach(function(inp) {
|
|
window.utils.initializeFileUpload(inp);
|
|
inp.classList.add("js-initialized");
|
|
});
|
|
|
|
// initialize file-checkbox-fields
|
|
Array.from(e.detail.scope.querySelectorAll('.js-file-checkbox:not(.js-initialized)')).forEach(function(inp) {
|
|
window.utils.reactiveFileCheckbox(inp);
|
|
inp.classList.add("js-initialized");
|
|
});
|
|
});
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
document.dispatchEvent(new CustomEvent('setup', { detail: { scope: document.body, module: 'inputs' }, bubbles: true, cancelable: true }));
|
|
});
|