@progress/kendo-angular-dialog
Version:
Dialog Package for Angular
160 lines (159 loc) • 5.57 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* 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 }]; } });