right-angled
Version:
Lightweight and easy to use angular data grids. Integrates with your markup and styles rather than generating its own.
103 lines • 14 kB
JavaScript
import { Directive, EventEmitter, HostListener, Input, Optional, Output, SkipSelf } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./selection-area.directive";
import * as i2 from "./providers/selection-events-helper";
export class SelectableDirective {
static { this.settings = {
selectedClassName: 'rt-selected'
}; }
constructor(selectionArea, selectionEventsHelper, renderer, el) {
this.selectionArea = selectionArea;
this.selectionEventsHelper = selectionEventsHelper;
this.renderer = renderer;
this.el = el;
this.index = null;
this.item = null;
this.selectedChange = new EventEmitter();
this.itemSelected = new EventEmitter();
this.itemDeselected = new EventEmitter();
this.selectionChanged = new EventEmitter();
this.selectedInternal = false;
}
get selected() {
return this.selectedInternal;
}
set selected(selected) {
if (selected) {
this.selectionEventsHelper.selectionService.selectIndex(this.index, this.selectionEventsHelper.multiple);
}
else {
this.selectionEventsHelper.selectionService.deselectIndex(this.index);
}
}
ngAfterViewInit() {
this.selectionArea?.registerSelectable(this, this.el);
}
ngOnDestroy() {
this.selectionArea?.unregisterSelectable(this);
}
mouseUpHandler(ctrlKeyPressed, shiftKeyPressed, mouseButton, preventDefaultFn, stopPropagationFn, executionContext) {
if (this.selectionEventsHelper.mouseHandler(ctrlKeyPressed, shiftKeyPressed, mouseButton, this.index)) {
this.clearWindowSelection();
if (this.selectionEventsHelper.preventEventsDefaults && preventDefaultFn) {
preventDefaultFn.call(executionContext);
}
if (this.selectionEventsHelper.stopEventsPropagation && stopPropagationFn) {
stopPropagationFn.call(executionContext);
}
}
}
postProcessSelection(selected) {
if (selected === this.selected) {
return;
}
this.selectedInternal = selected;
this.selectedChange.emit(this.selectedInternal);
if (SelectableDirective.settings.selectedClassName) {
if (this.selected) {
this.renderer.addClass(this.el.nativeElement, SelectableDirective.settings.selectedClassName);
}
else {
this.renderer.removeClass(this.el.nativeElement, SelectableDirective.settings.selectedClassName);
}
}
}
clearWindowSelection() {
try {
window.getSelection().removeAllRanges();
}
catch (e) {
// do nothing
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SelectableDirective, deps: [{ token: i1.SelectionAreaDirective, optional: true }, { token: i2.RTSelectionEventsHelper, skipSelf: true }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: SelectableDirective, selector: "[rtSelectable]", inputs: { item: ["rtSelectable", "item"], selected: "selected" }, outputs: { selectedChange: "selectedChange", itemSelected: "itemSelected", itemDeselected: "itemDeselected", selectionChanged: "selectionChanged" }, host: { listeners: { "mouseup": "mouseUpHandler($event.ctrlKey,$event.shiftKey,$event.which,$event.preventDefault,$event.stopPropagation,$event)" } }, exportAs: ["rtSelectable"], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SelectableDirective, decorators: [{
type: Directive,
args: [{
exportAs: 'rtSelectable',
selector: '[rtSelectable]'
}]
}], ctorParameters: function () { return [{ type: i1.SelectionAreaDirective, decorators: [{
type: Optional
}] }, { type: i2.RTSelectionEventsHelper, decorators: [{
type: SkipSelf
}] }, { type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { item: [{
type: Input,
args: ['rtSelectable']
}], selectedChange: [{
type: Output
}], itemSelected: [{
type: Output
}], itemDeselected: [{
type: Output
}], selectionChanged: [{
type: Output
}], selected: [{
type: Input
}], mouseUpHandler: [{
type: HostListener,
args: ['mouseup', ['$event.ctrlKey', '$event.shiftKey', '$event.which', '$event.preventDefault', '$event.stopPropagation', '$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0YWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaWdodC1hbmdsZWQvc3JjL2xpYi9zZWxlY3Rpb24vc2VsZWN0YWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsUUFBUSxFQUFFLE1BQU0sRUFBYSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFTMUosTUFBTSxPQUFPLG1CQUFtQjthQUNkLGFBQVEsR0FBa0M7UUFDcEQsaUJBQWlCLEVBQUUsYUFBYTtLQUNuQyxBQUZxQixDQUVwQjtJQVFGLFlBQ3dCLGFBQXFDLEVBRWxELHFCQUE4QyxFQUM3QyxRQUFtQixFQUNuQixFQUFjO1FBSkYsa0JBQWEsR0FBYixhQUFhLENBQXdCO1FBRWxELDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBeUI7UUFDN0MsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBWm5CLFVBQUssR0FBVyxJQUFJLENBQUM7UUFDRSxTQUFJLEdBQVEsSUFBSSxDQUFDO1FBQ3JCLG1CQUFjLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFDcEUsaUJBQVksR0FBbUMsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFDcEYsbUJBQWMsR0FBbUMsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFDdEYscUJBQWdCLEdBQW1DLElBQUksWUFBWSxFQUFvQixDQUFDO1FBQzFHLHFCQUFnQixHQUFHLEtBQUssQ0FBQztJQU85QixDQUFDO0lBRUosSUFDVyxRQUFRO1FBQ2YsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDakMsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLFFBQWlCO1FBQ2pDLElBQUksUUFBUSxFQUFFO1lBQ1YsSUFBSSxDQUFDLHFCQUFxQixD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d0JBQXdCLEVBQUUsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgT3B0aW9uYWwsIE91dHB1dCwgUmVuZGVyZXIyLCBTa2lwU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSVFNlbGVjdGlvbkV2ZW50c0hlbHBlciB9IGZyb20gJy4vcHJvdmlkZXJzL3NlbGVjdGlvbi1ldmVudHMtaGVscGVyJztcclxuaW1wb3J0IHsgUlRTZWxlY3Rpb25FdmVudCwgU2VsZWN0aW9uRWxlbWVudEV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuL3Byb3ZpZGVycy9zZWxlY3Rpb24tZXZlbnRzLWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25BcmVhRGlyZWN0aXZlIH0gZnJvbSAnLi9zZWxlY3Rpb24tYXJlYS5kaXJlY3RpdmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBleHBvcnRBczogJ3J0U2VsZWN0YWJsZScsXHJcbiAgICBzZWxlY3RvcjogJ1tydFNlbGVjdGFibGVdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VsZWN0YWJsZURpcmVjdGl2ZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkVsZW1lbnRFdmVudHNFbWl0dGVyLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXR0aW5nczogeyBzZWxlY3RlZENsYXNzTmFtZTogc3RyaW5nIH0gPSB7XHJcbiAgICAgICAgc2VsZWN0ZWRDbGFzc05hbWU6ICdydC1zZWxlY3RlZCdcclxuICAgIH07XHJcbiAgICBwdWJsaWMgaW5kZXg6IG51bWJlciA9IG51bGw7XHJcbiAgICBASW5wdXQoJ3J0U2VsZWN0YWJsZScpIHB1YmxpYyBpdGVtOiBhbnkgPSBudWxsO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZENoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBpdGVtU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxSVFNlbGVjdGlvbkV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8UlRTZWxlY3Rpb25FdmVudD4oKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgaXRlbURlc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxSVFNlbGVjdGlvbkV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8UlRTZWxlY3Rpb25FdmVudD4oKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPFJUU2VsZWN0aW9uRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSVFNlbGVjdGlvbkV2ZW50PigpO1xyXG4gICAgcHJpdmF0ZSBzZWxlY3RlZEludGVybmFsID0gZmFsc2U7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHNlbGVjdGlvbkFyZWE6IFNlbGVjdGlvbkFyZWFEaXJlY3RpdmUsXHJcbiAgICAgICAgQFNraXBTZWxmKClcclxuICAgICAgICBwdWJsaWMgc2VsZWN0aW9uRXZlbnRzSGVscGVyOiBSVFNlbGVjdGlvbkV2ZW50c0hlbHBlcixcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZlxyXG4gICAgKSB7fVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSW50ZXJuYWw7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkKHNlbGVjdGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRXZlbnRzSGVscGVyLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0SW5kZXgodGhpcy5pbmRleCwgdGhpcy5zZWxlY3Rpb25FdmVudHNIZWxwZXIubXVsdGlwbGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRXZlbnRzSGVscGVyLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RJbmRleCh0aGlzLmluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQXJlYT8ucmVnaXN0ZXJTZWxlY3RhYmxlKHRoaXMsIHRoaXMuZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQXJlYT8udW5yZWdpc3RlclNlbGVjdGFibGUodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcsIFsnJGV2ZW50LmN0cmxLZXknLCAnJGV2ZW50LnNoaWZ0S2V5JywgJyRldmVudC53aGljaCcsICckZXZlbnQucHJldmVudERlZmF1bHQnLCAnJGV2ZW50LnN0b3BQcm9wYWdhdGlvbicsICckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBtb3VzZVVwSGFuZGxlcihcclxuICAgICAgICBjdHJsS2V5UHJlc3NlZDogYm9vbGVhbixcclxuICAgICAgICBzaGlmdEtleVByZXNzZWQ6IGJvb2xlYW4sXHJcbiAgICAgICAgbW91c2VCdXR0b246IG51bWJlcixcclxuICAgICAgICBwcmV2ZW50RGVmYXVsdEZuOiAoKSA9PiB2b2lkLFxyXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbkZuOiAoKSA9PiB2b2lkLFxyXG4gICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGFueVxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRXZlbnRzSGVscGVyLm1vdXNlSGFuZGxlcihjdHJsS2V5UHJlc3NlZCwgc2hpZnRLZXlQcmVzc2VkLCBtb3VzZUJ1dHRvbiwgdGhpcy5pbmRleCkpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhcldpbmRvd1NlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25FdmVudHNIZWxwZXIucHJldmVudEV2ZW50c0RlZmF1bHRzICYmIHByZXZlbnREZWZhdWx0Rm4pIHtcclxuICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0Rm4uY2FsbChleGVjdXRpb25Db250ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25FdmVudHNIZWxwZXIuc3RvcEV2ZW50c1Byb3BhZ2F0aW9uICYmIHN0b3BQcm9wYWdhdGlvbkZuKSB7XHJcbiAgICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb25Gbi5jYWxsKGV4ZWN1dGlvbkNvbnRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIHBvc3RQcm9jZXNzU2VsZWN0aW9uKHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkID09PSB0aGlzLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEludGVybmFsID0gc2VsZWN0ZWQ7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRJbnRlcm5hbCk7XHJcbiAgICAgICAgaWYgKFNlbGVjdGFibGVEaXJlY3RpdmUuc2V0dGluZ3Muc2VsZWN0ZWRDbGFzc05hbWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCBTZWxlY3RhYmxlRGlyZWN0aXZlLnNldHRpbmdzLnNlbGVjdGVkQ2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCBTZWxlY3RhYmxlRGlyZWN0aXZlLnNldHRpbmdzLnNlbGVjdGVkQ2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBjbGVhcldpbmRvd1NlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==