gentics-ui-core
Version:
This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.
112 lines • 15.2 kB
JavaScript
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { getDataTransfer, getEventTarget, getTransferMimeTypes, transferHasFiles } from './drag-drop-utils';
import * as i0 from "@angular/core";
/**
* A factory that creates a tracker instance that listens for dragenter/dragleave/drop events
* on a DOM element and tracks the event state.
* When the target element contains child elements, DOM events are fired in a confusing order.
*
* For example, when the user drags into the div, the into the <a>, then out:
* <div><a><span></span></a></div>
* These events are triggered:
* type=dragenter target=<div>
* type=dragenter target=<a>
* type=dragleave target=<div>
* type=dragleave target=<div>
*
* This service wraps the browser-specific oddities into an rxjs Observable that emits on changes.
*/
export class DragStateTrackerFactory {
trackElement(target) {
let tracker = new DragStateTracker(target);
return tracker.state$;
}
}
/** @nocollapse */ DragStateTrackerFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DragStateTrackerFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ DragStateTrackerFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DragStateTrackerFactory });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DragStateTrackerFactory, decorators: [{
type: Injectable
}] });
/**
* Helper class that exposes dragenter/dragleave/drop events
* as an observable stream of the resulting state.
*/
class DragStateTracker {
constructor(target) {
this.target = target;
this.enterLeaveCounter = 0;
this.enteredElements = new Set();
this.subscribers = [];
this.onDragEnter = (event) => {
let element = getEventTarget(event);
if (this.enteredElements.has(element)) {
return;
}
let transfer = getDataTransfer(event);
if (!transferHasFiles(transfer)) {
return;
}
this.enteredElements.add(element);
if ((++this.enterLeaveCounter) === 1) {
let types = getTransferMimeTypes(transfer).map(type => ({ type }));
this.emit(types);
}
};
this.onDragLeave = (event) => {
let element = getEventTarget(event);
if (!transferHasFiles(getDataTransfer(event)) || !this.enteredElements.delete(element)) {
return;
}
if ((--this.enterLeaveCounter) === 0) {
this.emit([]);
}
};
this.onDrop = (event) => {
let element = getEventTarget(event);
if (!transferHasFiles(getDataTransfer(event)) || !this.enteredElements.delete(element)) {
return;
}
if (this.enterLeaveCounter > 0) {
this.enterLeaveCounter = 0;
this.enteredElements = new Set();
this.emit([]);
}
};
this.detectUntrackedDrop = (event) => {
if (this.enterLeaveCounter > 0 && event.buttons === 0) {
this.enterLeaveCounter = 0;
this.enteredElements = new Set();
this.emit([]);
}
};
this.state$ = new Observable((subscriber) => {
if (this.subscribers.push(subscriber) === 1) {
this.bindEvents();
}
return subscriber.add(() => {
let index = this.subscribers.indexOf(subscriber);
this.subscribers.splice(index, 1);
if (!this.subscribers.length) {
this.unbindEvents();
}
});
});
}
bindEvents() {
this.target.addEventListener('dragenter', this.onDragEnter, true);
this.target.addEventListener('dragleave', this.onDragLeave, true);
this.target.addEventListener('drop', this.onDrop, true);
this.target.addEventListener('mouseenter', this.detectUntrackedDrop, true);
}
unbindEvents() {
this.target.removeEventListener('dragenter', this.onDragEnter, true);
this.target.removeEventListener('dragleave', this.onDragLeave, true);
this.target.removeEventListener('drop', this.onDrop, true);
this.target.removeEventListener('mouseenter', this.detectUntrackedDrop, true);
}
emit(state) {
this.subscribers.forEach(s => s.next(state));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1zdGF0ZS10cmFja2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9maWxlLWRyb3AtYXJlYS9kcmFnLXN0YXRlLXRyYWNrZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxVQUFVLEVBQWEsTUFBTSxNQUFNLENBQUM7QUFFNUMsT0FBTyxFQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFMUc7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxNQUFNLE9BQU8sdUJBQXVCO0lBQ3pCLFlBQVksQ0FBQyxNQUFtQjtRQUNuQyxJQUFJLE9BQU8sR0FBRyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUMxQixDQUFDOzt1SUFKUSx1QkFBdUI7MklBQXZCLHVCQUF1QjsyRkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVOztBQVVYOzs7R0FHRztBQUNILE1BQU0sZ0JBQWdCO0lBTWxCLFlBQW9CLE1BQW1CO1FBQW5CLFdBQU0sR0FBTixNQUFNLENBQWE7UUFKdkMsc0JBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQVcsQ0FBQztRQUNyQyxnQkFBVyxHQUFnQyxFQUFFLENBQUM7UUFvQzlDLGdCQUFXLEdBQUcsQ0FBQyxLQUFnQixFQUFFLEVBQUU7WUFDL0IsSUFBSSxPQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQUUsT0FBTzthQUFFO1lBRWxELElBQUksUUFBUSxHQUFH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bmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaWJlcn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7Z2V0RGF0YVRyYW5zZmVyLCBnZXRFdmVudFRhcmdldCwgZ2V0VHJhbnNmZXJNaW1lVHlwZXMsIHRyYW5zZmVySGFzRmlsZXN9IGZyb20gJy4vZHJhZy1kcm9wLXV0aWxzJztcblxuLyoqXG4gKiBBIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgdHJhY2tlciBpbnN0YW5jZSB0aGF0IGxpc3RlbnMgZm9yIGRyYWdlbnRlci9kcmFnbGVhdmUvZHJvcCBldmVudHNcbiAqIG9uIGEgRE9NIGVsZW1lbnQgYW5kIHRyYWNrcyB0aGUgZXZlbnQgc3RhdGUuXG4gKiBXaGVuIHRoZSB0YXJnZXQgZWxlbWVudCBjb250YWlucyBjaGlsZCBlbGVtZW50cywgRE9NIGV2ZW50cyBhcmUgZmlyZWQgaW4gYSBjb25mdXNpbmcgb3JkZXIuXG4gKlxuICogRm9yIGV4YW1wbGUsIHdoZW4gdGhlIHVzZXIgZHJhZ3MgaW50byB0aGUgZGl2LCB0aGUgaW50byB0aGUgPGE+LCB0aGVuIG91dDpcbiAqICAgPGRpdj48YT48c3Bhbj48L3NwYW4+PC9hPjwvZGl2PlxuICogVGhlc2UgZXZlbnRzIGFyZSB0cmlnZ2VyZWQ6XG4gKiAgIHR5cGU9ZHJhZ2VudGVyIHRhcmdldD08ZGl2PlxuICogICB0eXBlPWRyYWdlbnRlciB0YXJnZXQ9PGE+XG4gKiAgIHR5cGU9ZHJhZ2xlYXZlIHRhcmdldD08ZGl2PlxuICogICB0eXBlPWRyYWdsZWF2ZSB0YXJnZXQ9PGRpdj5cbiAqXG4gKiBUaGlzIHNlcnZpY2Ugd3JhcHMgdGhlIGJyb3dzZXItc3BlY2lmaWMgb2RkaXRpZXMgaW50byBhbiByeGpzIE9ic2VydmFibGUgdGhhdCBlbWl0cyBvbiBjaGFuZ2VzLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRHJhZ1N0YXRlVHJhY2tlckZhY3Rvcnkge1xuICAgIHB1YmxpYyB0cmFja0VsZW1lbnQodGFyZ2V0OiBFdmVudFRhcmdldCk6IE9ic2VydmFibGU8RmlsZURyYWdTdGF0ZT4ge1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBEcmFnU3RhdGVUcmFja2VyKHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0cmFja2VyLnN0YXRlJDtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZpbGVEcmFnU3RhdGUgPSB7IHR5cGU6IHN0cmluZyB9W107XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIHRoYXQgZXhwb3NlcyBkcmFnZW50ZXIvZHJhZ2xlYXZlL2Ryb3AgZXZlbnRzXG4gKiBhcyBhbiBvYnNlcnZhYmxlIHN0cmVhbSBvZiB0aGUgcmVzdWx0aW5nIHN0YXRlLlxuICovXG5jbGFzcyBEcmFnU3RhdGVUcmFja2VyIHtcbiAgICBzdGF0ZSQ6IE9ic2VydmFibGU8RmlsZURyYWdTdGF0ZT47XG4gICAgZW50ZXJMZWF2ZUNvdW50ZXIgPSAwO1xuICAgIGVudGVyZWRFbGVtZW50cyA9IG5ldyBTZXQ8RWxlbWVudD4oKTtcbiAgICBzdWJzY3JpYmVyczogU3Vic2NyaWJlcjxGaWxlRHJhZ1N0YXRlPltdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhcmdldDogRXZlbnRUYXJnZXQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSQgPSBuZXcgT2JzZXJ2YWJsZTxGaWxlRHJhZ1N0YXRlPigoc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxGaWxlRHJhZ1N0YXRlPikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bmJpbmRFdmVudHMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICBiaW5kRXZlbnRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLm9uRHJhZ0VudGVyLCB0cnVlKTtcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5vbkRyYWdMZWF2ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLm9uRHJvcCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLmRldGVjdFVudHJhY2tlZERyb3AsIHRydWUpO1xuICAgIH1cblxuICAgIHVuYmluZEV2ZW50cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5vbkRyYWdFbnRlciwgdHJ1ZSk7XG4gICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMub25EcmFnTGVhdmUsIHRydWUpO1xuICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRyb3AsIHRydWUpO1xuICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5kZXRlY3RVbnRyYWNrZWREcm9wLCB0cnVlKTtcbiAgICB9XG5cbiAgICBlbWl0KHN0YXRlOiBGaWxlRHJhZ1N0YXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaChzID0+IHMubmV4dChzdGF0ZSkpO1xuICAgIH1cblxuICAgIG9uRHJhZ0VudGVyID0gKGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgbGV0IGVsZW1lbnQgPSBnZXRFdmVudFRhcmdldChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLmVudGVyZWRFbGVtZW50cy5oYXMoZWxlbWVudCkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgbGV0IHRyYW5zZmVyID0gZ2V0RGF0YVRyYW5zZmVyKGV2ZW50KTtcbiAgICAgICAgaWYgKCF0cmFuc2Zlckhhc0ZpbGVzKHRyYW5zZmVyKSkgeyByZXR1cm47IH1cblxuICAgICAgICB0aGlzLmVudGVyZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKCgrK3RoaXMuZW50ZXJMZWF2ZUNvdW50ZXIpID09PSAxKSB7XG4gICAgICAgICAgICBsZXQgdHlwZXMgPSBnZXRUcmFuc2Zlck1pbWVUeXBlcyh0cmFuc2ZlcikubWFwKHR5cGUgPT4gKHsgdHlwZSB9KSk7XG4gICAgICAgICAgICB0aGlzLmVtaXQodHlwZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25EcmFnTGVhdmUgPSAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICBsZXQgZWxlbWVudCA9IGdldEV2ZW50VGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgaWYgKCF0cmFuc2Zlckhhc0ZpbGVzKGdldERhdGFUcmFuc2ZlcihldmVudCkpIHx8ICF0aGlzLmVudGVyZWRFbGVtZW50cy5kZWxldGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoLS10aGlzLmVudGVyTGVhdmVDb3VudGVyKSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFtdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRHJvcCA9IChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGxldCBlbGVtZW50ID0gZ2V0RXZlbnRUYXJnZXQoZXZlbnQpO1xuICAgICAgICBpZiAoIXRyYW5zZmVySGFzRmlsZXMoZ2V0RGF0YVRyYW5zZmVyKGV2ZW50KSkgfHwgIXRoaXMuZW50ZXJlZEVsZW1lbnRzLmRlbGV0ZShlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZW50ZXJMZWF2ZUNvdW50ZXIgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmVudGVyTGVhdmVDb3VudGVyID0gMDtcbiAgICAgICAgICAgIHRoaXMuZW50ZXJlZEVsZW1lbnRzID0gbmV3IFNldDxFbGVtZW50PigpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KFtdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRldGVjdFVudHJhY2tlZERyb3AgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZW50ZXJMZWF2ZUNvdW50ZXIgPiAwICYmIGV2ZW50LmJ1dHRvbnMgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXJMZWF2ZUNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgdGhpcy5lbnRlcmVkRWxlbWVudHMgPSBuZXcgU2V0PEVsZW1lbnQ+KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoW10pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4iXX0=