UNPKG

@progress/kendo-angular-dialog

Version:
160 lines (159 loc) 5.57 kB
/**----------------------------------------------------------------------------------------- * Copyright © 2025 Progress Software Corporation. All rights reserved. * Licensed under commercial license. See LICENSE.md in the project root for more information *-------------------------------------------------------------------------------------------*/ import { Injectable, NgZone } from "@angular/core"; import { DragResizeService } from './drag-resize.service'; import { isPresent, OFFSET_STYLES, Keys, WINDOW_CLASSES, hasClasses, WINDOW_ELEMENTS_HANDLING_ESC_KEY } from '../common/util'; import * as i0 from "@angular/core"; import * as i1 from "./drag-resize.service"; /** * @hidden */ export class NavigationService { window; ngZone; constructor(window, ngZone) { this.window = window; this.ngZone = ngZone; } process(ev) { const key = ev.keyCode; const target = ev.target; switch (key) { case Keys.up: case Keys.down: case Keys.left: case Keys.right: { if (hasClasses(target, WINDOW_CLASSES)) { ev.preventDefault(); this.ngZone.run(() => { this.handleArrow(key, ev); }); } break; } case Keys.esc: if (hasClasses(target, WINDOW_ELEMENTS_HANDLING_ESC_KEY)) { this.ngZone.run(() => { this.handleEscape(); }); } break; default: break; } } handleArrow(key, ev) { const options = this.window.options; if (ev.altKey) { this.handleStateChange(key, options.state); return; } if ((ev.ctrlKey || ev.metaKey) && options.state === 'default') { this.handleResize(key); } else { this.handleDrag(key); } } handleEscape() { this.window.closeAction(); } handleDrag(key) { const options = this.window.options; if (!options.draggable) { return; } const offset = this.window.currentOffsetAndPosition(); const restoreOptions = this.window.restoreOptions; const ev = {}; let delta = 10; if (key === Keys.left || key === Keys.up) { delta *= -1; } switch (key) { case Keys.left: case Keys.right: { ev.left = offset.x + delta; options.left = ev.left; break; } case Keys.up: case Keys.down: { ev.top = offset.y + delta; options.top = ev.top; break; } default: break; } if (options.state === 'minimized' && isPresent(restoreOptions)) { restoreOptions.left = options.left; restoreOptions.top = options.top; } this.window.change.emit(ev); } handleResize(key) { const options = this.window.options; if (!options.resizable) { return; } const offset = this.window.currentOffsetAndPosition(); let newWidth; let newHeight; const ev = {}; let delta = 10; if (key === Keys.left || key === Keys.up) { delta *= -1; } switch (key) { case Keys.left: case Keys.right: { newWidth = offset.width + delta; if (newWidth !== options.width && newWidth >= options.minWidth) { ev.width = newWidth; } break; } case Keys.up: case Keys.down: { newHeight = offset.height + delta; if (newHeight !== options.height && newHeight >= options.minHeight) { ev.height = newHeight; } break; } default: break; } if (isPresent(ev.width) || isPresent(ev.height)) { OFFSET_STYLES.forEach((style) => { if (isPresent(ev[style])) { this.window.options[style] = ev[style]; } }); this.window.change.emit(ev); } } handleStateChange(key, state) { if ((state === 'minimized' && key === Keys.up) || (state === 'maximized' && key === Keys.down)) { this.window.restoreAction(); return; } if (state === 'default') { if (key === Keys.up) { this.window.maximizeAction(); } else if (key === Keys.down) { this.window.minimizeAction(); } } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NavigationService, deps: [{ token: i1.DragResizeService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NavigationService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NavigationService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.DragResizeService }, { type: i0.NgZone }]; } });