bootstrap-italia
Version:
Bootstrap Italia è un tema Bootstrap 5 per la creazione di applicazioni web nel pieno rispetto delle linee guida di design per i siti internet e i servizi digitali della PA
155 lines (126 loc) • 4.58 kB
JavaScript
import BaseComponent from './base-component.js';
import EventHandler from './dom/event-handler.js';
import SelectorEngine from './dom/selector-engine.js';
import ProgressDonut from './progress-donut.js';
/**
* --------------------------------------------------------------------------
* Bootstrap Italia (https://italia.github.io/bootstrap-italia/)
* Authors: https://github.com/italia/bootstrap-italia/blob/main/AUTHORS
* Licensed under BSD-3-Clause license (https://github.com/italia/bootstrap-italia/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
const NAME = 'upload';
const DATA_KEY = 'bs.upload';
const EVENT_KEY = `.${DATA_KEY}`;
const DATA_API_KEY = '.data-api';
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
const EVENT_DRAG = `drag`;
const EVENT_DRAG_START = `dragstart`;
const EVENT_DRAG_END = `dragend`;
const EVENT_DRAG_OVER = `dragover`;
const EVENT_DRAG_ENTER = `dragenter`;
const EVENT_DRAG_LEAVE = `dragleave`;
const EVENT_DROP = `drop`;
const CLASS_NAME_SUCCESS = 'success';
const CLASS_NAME_DRAGOVER = 'dragover';
const CLASS_NAME_LOADING = 'loading';
const SELECTOR_FORM = '[data-bs-upload-dragdrop]';
const SELECTOR_DONUT = '[data-bs-progress-donut]';
class UploadDragDrop extends BaseComponent {
constructor(element) {
super(element);
const donutElement = SelectorEngine.findOne(SELECTOR_DONUT, this._element);
if (donutElement) {
this._donut = ProgressDonut.getOrCreateInstance(donutElement);
}
this._bindEvents();
}
// Getters
static get NAME() {
return NAME
}
// Public
progress(value) {
this._donut.set(value);
}
start() {
this.reset();
this._element.classList.add(CLASS_NAME_LOADING);
}
success() {
this._element.classList.remove(CLASS_NAME_LOADING);
this._element.classList.add(CLASS_NAME_SUCCESS);
}
reset() {
this._element.classList.remove(CLASS_NAME_LOADING);
this._element.classList.remove(CLASS_NAME_SUCCESS);
this._donut.set(0);
}
dispose() {
this._donut.dispose();
super.dispose();
}
// Private
_bindEvents() {
EventHandler.on(this._element, EVENT_DRAG, (evt) => this._preventEvent(evt));
EventHandler.on(this._element, EVENT_DRAG_START, (evt) => this._preventEvent(evt));
EventHandler.on(this._element, EVENT_DRAG_END, (evt) => this._preventEvent(evt));
EventHandler.on(this._element, EVENT_DRAG_OVER, (evt) => this._preventEvent(evt));
EventHandler.on(this._element, EVENT_DRAG_ENTER, (evt) => this._preventEvent(evt));
EventHandler.on(this._element, EVENT_DRAG_LEAVE, (evt) => this._preventEvent(evt));
EventHandler.on(this._element, EVENT_DROP, (evt) => this._preventEvent(evt));
EventHandler.on(this._element, EVENT_DRAG_OVER, () => this._dropIn());
EventHandler.on(this._element, EVENT_DRAG_ENTER, () => this._dropIn());
EventHandler.on(this._element, EVENT_DRAG_LEAVE, () => this._dropOut());
EventHandler.on(this._element, EVENT_DRAG_END, () => this._dropOut());
EventHandler.on(this._element, EVENT_DROP, () => this._dropOut());
EventHandler.on(this._element, EVENT_DROP, () => this._drop());
}
_preventEvent(evt) {
evt.preventDefault();
evt.stopPropagation();
}
_dropIn() {
if (!this._isSuccess()) {
this._element.classList.add(CLASS_NAME_DRAGOVER);
}
}
_dropOut() {
if (!this._isSuccess()) {
this._element.classList.remove(CLASS_NAME_DRAGOVER);
}
}
_drop() {
if (!this._isSuccess()) {
this.start();
}
}
_isSuccess() {
return this._element.classList.contains(CLASS_NAME_SUCCESS)
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
/*SelectorEngine.find(SELECTOR_FORM).forEach((form) => {
UploadDragDrop.getOrCreateInstance(form)
})*/
const createInput = (element) => {
let found = element.matches && element.matches(SELECTOR_FORM) ? element : element.closest ? element.closest(SELECTOR_FORM) : null;
if (found) {
UploadDragDrop.getOrCreateInstance(found);
}
return null
};
if (typeof window !== 'undefined' && typeof document !== 'undefined') {
document.addEventListener('dragenter', function (evt) {
createInput(evt.target);
});
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM + ' label', function () {
createInput(this);
});
}
export { UploadDragDrop as default };
//# sourceMappingURL=upload-dragdrop.js.map