@asadi/angular-date-components
Version:
`Angular Date Components` is a comprehensive angular library of date-related components designed to meet the needs of applications that require localization based on various calendar systems. While the package currently includes two powerful components (S
113 lines • 17.9 kB
JavaScript
import { Directive, EventEmitter, HostListener, Output } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { ADCTableCell } from '../utils/table-cell.tools';
import { ADCTableRowTools } from '../utils/table-view-row.tools';
import * as i0 from "@angular/core";
export class TableViewControllerDirective {
onZoomChange(event) {
if (event.key == 'Shift' && !this.isZoomed) {
this.isZoomed = true;
this.focusIn();
}
else if (event.key == 'Shift' && this.isZoomed) {
this.isZoomed = false;
this.focusOut();
}
}
ngOnInit() {
this.childrenChangesObserver = new MutationObserver((changes) => {
if (this.scrollListener)
this.scrollListener();
const tableCells = [];
changes.filter(c => c.addedNodes[0] instanceof HTMLElement && c.addedNodes[0].classList.contains('row')).forEach(row => {
const children = Array().slice.call(row.addedNodes[0].children);
const cells = Array().slice.call(children[0].children);
cells.filter(item => item.getAttribute('selectable') == 'true').forEach(item => tableCells.push(new ADCTableCell(item)));
});
this.applyScrollingBehavior();
this.childrenChangesSubject.next(tableCells);
if (this.isZoomed) {
this.isZoomed = false;
this.focusOut();
}
this.viewReadyEvent.emit();
});
this.childrenChangesObserver.observe(this.container, { childList: true });
}
get container() {
return this.elRef.nativeElement;
}
get scrollableContainer() {
return this.container.parentElement;
}
constructor(renderer, elRef) {
this.renderer = renderer;
this.elRef = elRef;
this.isZoomed = false;
this.childrenChangesSubject = new BehaviorSubject([]);
this.viewReadyEvent = new EventEmitter();
this.scrollListener = null;
}
applyScrollingBehavior() {
this.scrollListener = this.renderer.listen(this.scrollableContainer, 'scroll', () => {
if (this.isZoomed) {
this.scrollableContainer.scrollLeft = 0;
this.scrollableContainer.scrollTop = 0;
return;
}
const stickyItems = this.container.querySelectorAll('.row');
Array().slice.call(stickyItems).forEach(item => {
Array().slice.call(item.children).filter(child => child.getAttribute('sticky') == 'true').forEach(stickyChild => {
stickyChild.style.transform = `translateX(-${this.scrollableContainer.scrollLeft}px)`;
});
});
});
}
focusIn() {
const childWidth = this.container.scrollWidth;
const parentWidth = this.scrollableContainer.clientWidth;
const childHeight = this.container.scrollHeight;
const parentHeight = this.scrollableContainer.clientHeight;
const scaleX = parentWidth / childWidth * 100;
const scaleY = parentHeight / childHeight * 100;
this.renderer.setStyle(this.container, 'transform', `scaleX(${scaleX}%) scaleY(${scaleY}%)`);
requestAnimationFrame(() => {
this.scrollableContainer.scrollLeft = 0;
this.scrollableContainer.scrollTop = 0;
});
}
focusOut() {
this.renderer.setStyle(this.container, 'transform', `scaleX(${100}%) scaleY(${100}%)`);
}
row(rowIndex) {
const allRows = [].slice.call(this.container.getElementsByClassName("row"));
const row = allRows.filter((r) => r.getAttribute('row-index') == rowIndex.toString())[0];
return new ADCTableRowTools(this.renderer, row);
}
cellChanges() {
return this.childrenChangesSubject.asObservable();
}
rowsCount() {
return [].slice.call(this.elRef.nativeElement.getElementsByClassName("row")).length;
}
ngOnDestroy() {
if (this.scrollListener)
this.scrollListener();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: TableViewControllerDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.7", type: TableViewControllerDirective, isStandalone: true, selector: "[tableViewController]", outputs: { viewReadyEvent: "viewReady" }, host: { listeners: { "window:keydown": "onZoomChange($event)" } }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: TableViewControllerDirective, decorators: [{
type: Directive,
args: [{
selector: '[tableViewController]',
standalone: true,
}]
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { viewReadyEvent: [{
type: Output,
args: ['viewReady']
}], onZoomChange: [{
type: HostListener,
args: ['window:keydown', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdmlldy1jb250cm9sbGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FzYWRpL2FuZ3VsYXItZGF0ZS1jb21wb25lbnRzL2NvcmUvc3JjL2RpcmVjdGl2ZXMvdGFibGUtdmlldy1jb250cm9sbGVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQXFCLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7QUFNakUsTUFBTSxPQUFPLDRCQUE0QjtJQVl2QyxZQUFZLENBQUMsS0FBb0I7UUFFL0IsSUFBRyxLQUFLLENBQUMsR0FBRyxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQ3pDO1lBQ0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO2FBQ0ksSUFBRyxLQUFLLENBQUMsR0FBRyxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUM3QztZQUNFLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtJQUNILENBQUM7SUFFRCxRQUFRO1FBRU4sSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUU5RCxJQUFHLElBQUksQ0FBQyxjQUFjO2dCQUNwQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFeEIsTUFBTSxVQUFV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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQURDSVRhYmxlVmlld0NUUkwgfSBmcm9tICcuLi9pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBBRENUYWJsZUNlbGwgfSBmcm9tICcuLi91dGlscy90YWJsZS1jZWxsLnRvb2xzJztcclxuaW1wb3J0IHsgQURDVGFibGVSb3dUb29scyB9IGZyb20gJy4uL3V0aWxzL3RhYmxlLXZpZXctcm93LnRvb2xzJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW3RhYmxlVmlld0NvbnRyb2xsZXJdJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFibGVWaWV3Q29udHJvbGxlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQURDSVRhYmxlVmlld0NUUkwsIE9uRGVzdHJveXtcclxuXHJcbiAgcHJpdmF0ZSBpc1pvb21lZCA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGNoaWxkcmVuQ2hhbmdlc09ic2VydmVyITogTXV0YXRpb25PYnNlcnZlcjtcclxuICBwcml2YXRlIGNoaWxkcmVuQ2hhbmdlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFEQ1RhYmxlQ2VsbFtdPihbXSk7XHJcblxyXG4gIEBPdXRwdXQoJ3ZpZXdSZWFkeScpXHJcbiAgdmlld1JlYWR5RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25ab29tQ2hhbmdlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZFxyXG4gIHtcclxuICAgIGlmKGV2ZW50LmtleSA9PSAnU2hpZnQnICYmICF0aGlzLmlzWm9vbWVkKVxyXG4gICAge1xyXG4gICAgICB0aGlzLmlzWm9vbWVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5mb2N1c0luKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGV2ZW50LmtleSA9PSAnU2hpZnQnICYmIHRoaXMuaXNab29tZWQpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuaXNab29tZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5mb2N1c091dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCBcclxuICB7XHJcbiAgICB0aGlzLmNoaWxkcmVuQ2hhbmdlc09ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKGNoYW5nZXMpID0+IHtcclxuXHJcbiAgICAgIGlmKHRoaXMuc2Nyb2xsTGlzdGVuZXIpXHJcbiAgICAgICAgdGhpcy5zY3JvbGxMaXN0ZW5lcigpO1xyXG5cclxuICAgICAgY29uc3QgdGFibGVDZWxsczogQURDVGFibGVDZWxsW10gPSBbXTtcclxuXHJcbiAgICAgIGNoYW5nZXMuZmlsdGVyKGMgPT4gYy5hZGRlZE5vZGVzWzBdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgYy5hZGRlZE5vZGVzWzBdLmNsYXNzTGlzdC5jb250YWlucygncm93JykpLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5KCkuc2xpY2UuY2FsbCgocm93LmFkZGVkTm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQpLmNoaWxkcmVuKSBhcyBIVE1MRWxlbWVudFtdO1xyXG5cclxuICAgICAgICBjb25zdCBjZWxscyA9IEFycmF5KCkuc2xpY2UuY2FsbChjaGlsZHJlblswXS5jaGlsZHJlbikgYXMgSFRNTEVsZW1lbnRbXTtcclxuXHJcbiAgICAgICAgY2VsbHMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5nZXRBdHRyaWJ1dGUoJ3NlbGVjdGFibGUnKSA9PSAndHJ1ZScpLmZvckVhY2goaXRlbSA9PiB0YWJsZUNlbGxzLnB1c2gobmV3IEFEQ1RhYmxlQ2VsbChpdGVtKSkpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuYXBwbHlTY3JvbGxpbmdCZWhhdmlvcigpO1xyXG5cclxuICAgICAgdGhpcy5jaGlsZHJlbkNoYW5nZXNTdWJqZWN0Lm5leHQodGFibGVDZWxscyk7XHJcblxyXG4gICAgICBpZih0aGlzLmlzWm9vbWVkKVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy5pc1pvb21lZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZm9jdXNPdXQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy52aWV3UmVhZHlFdmVudC5lbWl0KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNoaWxkcmVuQ2hhbmdlc09ic2VydmVyLm9ic2VydmUodGhpcy5jb250YWluZXIsIHtjaGlsZExpc3Q6IHRydWV9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGNvbnRhaW5lcigpOiBIVE1MRWxlbWVudFxyXG4gIHtcclxuICAgIHJldHVybiB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBnZXQgc2Nyb2xsYWJsZUNvbnRhaW5lcigpOiBIVE1MRWxlbWVudFxyXG4gIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5wYXJlbnRFbGVtZW50ITtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2Nyb2xsTGlzdGVuZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWZcclxuICApIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlTY3JvbGxpbmdCZWhhdmlvcigpOiB2b2lkXHJcbiAge1xyXG4gICAgdGhpcy5zY3JvbGxMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuc2Nyb2xsYWJsZUNvbnRhaW5lciwgJ3Njcm9sbCcsICgpID0+IHtcclxuXHJcbiAgICAgIGlmKHRoaXMuaXNab29tZWQpXHJcbiAgICAgIHtcclxuICAgICAgICB0aGlzLnNjcm9sbGFibGVDb250YWluZXIuc2Nyb2xsTGVmdCA9IDA7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxhYmxlQ29udGFpbmVyLnNjcm9sbFRvcCA9IDA7XHJcblxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc3RpY2t5SXRlbXMgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcucm93Jyk7XHJcblxyXG4gICAgICAoQXJyYXkoKS5zbGljZS5jYWxsKHN0aWNreUl0ZW1zKSBhcyBIVE1MRWxlbWVudFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG5cclxuICAgICAgICAoQXJyYXkoKS5zbGljZS5jYWxsKGl0ZW0uY2hpbGRyZW4pIGFzIEhUTUxFbGVtZW50W10pLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5nZXRBdHRyaWJ1dGUoJ3N0aWNreScpID09ICd0cnVlJykuZm9yRWFjaChzdGlja3lDaGlsZCA9PiB7XHJcbiAgICAgICAgICBzdGlja3lDaGlsZC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgtJHt0aGlzLnNjcm9sbGFibGVDb250YWluZXIuc2Nyb2xsTGVmdH1weClgXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuXHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvY3VzSW4oKTogdm9pZFxyXG4gIHtcclxuICAgIGNvbnN0IGNoaWxkV2lkdGggPSB0aGlzLmNvbnRhaW5lci5zY3JvbGxXaWR0aDtcclxuICAgIGNvbnN0IHBhcmVudFdpZHRoID0gdGhpcy5zY3JvbGxhYmxlQ29udGFpbmVyLmNsaWVudFdpZHRoO1xyXG5cclxuICAgIGNvbnN0IGNoaWxkSGVpZ2h0ID0gdGhpcy5jb250YWluZXIuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgY29uc3QgcGFyZW50SGVpZ2h0ID0gdGhpcy5zY3JvbGxhYmxlQ29udGFpbmVyLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICBjb25zdCBzY2FsZVggPSBwYXJlbnRXaWR0aCAvIGNoaWxkV2lkdGggKiAxMDA7XHJcbiAgICBjb25zdCBzY2FsZVkgPSBwYXJlbnRIZWlnaHQgLyBjaGlsZEhlaWdodCAqIDEwMDtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY29udGFpbmVyLCAndHJhbnNmb3JtJywgYHNjYWxlWCgke3NjYWxlWH0lKSBzY2FsZVkoJHtzY2FsZVl9JSlgKTtcclxuXHJcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNjcm9sbGFibGVDb250YWluZXIuc2Nyb2xsTGVmdCA9IDA7XHJcbiAgICAgIHRoaXMuc2Nyb2xsYWJsZUNvbnRhaW5lci5zY3JvbGxUb3AgPSAwO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9jdXNPdXQoKTogdm9pZFxyXG4gIHtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jb250YWluZXIsICd0cmFuc2Zvcm0nLCBgc2NhbGVYKCR7MTAwfSUpIHNjYWxlWSgkezEwMH0lKWApO1xyXG4gIH1cclxuXHJcblxyXG4gIHJvdyhyb3dJbmRleDogbnVtYmVyKTogQURDVGFibGVSb3dUb29scyBcclxuICB7XHJcbiAgICBjb25zdCBhbGxSb3dzID0gW10uc2xpY2UuY2FsbCh0aGlzLmNvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwicm93XCIpKSBhcyBIVE1MRWxlbWVudFtdO1xyXG4gICAgY29uc3Qgcm93ID0gYWxsUm93cy5maWx0ZXIoKHIpID0+IHIuZ2V0QXR0cmlidXRlKCdyb3ctaW5kZXgnKSA9PSByb3dJbmRleC50b1N0cmluZygpKVswXTtcclxuXHJcbiAgICByZXR1cm4gbmV3IEFEQ1RhYmxlUm93VG9vbHModGhpcy5yZW5kZXJlciwgcm93KTtcclxuICB9XHJcblxyXG4gIGNlbGxDaGFuZ2VzKCk6IE9ic2VydmFibGU8QURDVGFibGVDZWxsW10+XHJcbiAge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5DaGFuZ2VzU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIHJvd3NDb3VudCgpOiBudW1iZXIgXHJcbiAge1xyXG4gICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJyb3dcIikpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYodGhpcy5zY3JvbGxMaXN0ZW5lcikgdGhpcy5zY3JvbGxMaXN0ZW5lcigpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19