@progress/kendo-angular-dialog
Version:
Dialog Package for Angular
184 lines (183 loc) • 5.28 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 { of } from 'rxjs';
import { delay, takeUntil } from 'rxjs/operators';
/**
* @hidden
*/
export const isPresent = (value) => value !== null && value !== undefined;
/**
* @hidden
*/
export const isTruthy = (value) => !!value;
const toClassList = (classNames) => String(classNames).trim().split(' ');
const focusableRegex = /^(?:a|input|select|textarea|button|object)$/i;
/**
* @hidden
*/
export var Keys;
(function (Keys) {
Keys[Keys["esc"] = 27] = "esc";
Keys[Keys["tab"] = 9] = "tab";
Keys[Keys["enter"] = 13] = "enter";
Keys[Keys["space"] = 32] = "space";
Keys[Keys["ctrl"] = 17] = "ctrl";
Keys[Keys["shift"] = 16] = "shift";
Keys[Keys["left"] = 37] = "left";
Keys[Keys["up"] = 38] = "up";
Keys[Keys["right"] = 39] = "right";
Keys[Keys["down"] = 40] = "down";
})(Keys || (Keys = {}));
/**
* @hidden
*/
export const DIALOG_ELEMENTS_HANDLING_ESC_KEY = 'k-dialog-wrapper k-actions k-dialog-titlebar-action';
/**
* @hidden
*/
export const DIALOG_ELEMENTS_HANDLING_ARROWS = 'k-actions';
/**
* @hidden
*/
export const WINDOW_CLASSES = 'k-window';
/**
* @hidden
*/
export const WINDOW_ELEMENTS_HANDLING_ESC_KEY = 'k-window k-window-titlebar-action';
/**
* @hidden
*/
export const hasClasses = (element, classNames) => {
const namesList = toClassList(classNames);
return Boolean(toClassList(element.className).find((className) => namesList.indexOf(className) >= 0));
};
/**
* @hidden
*/
export const isVisible = (element) => {
const rect = element.getBoundingClientRect();
return !!(rect.width && rect.height) && window.getComputedStyle(element).visibility !== 'hidden';
};
/**
* @hidden
*/
export const isFocusable = (element, checkVisibility = true) => {
if (element.tagName) {
const tagName = element.tagName.toLowerCase();
const tabIndex = element.getAttribute('tabIndex');
const validTabIndex = tabIndex !== null && !isNaN(tabIndex) && tabIndex > -1;
let focusable = false;
if (focusableRegex.test(tagName)) {
focusable = !element.disabled;
}
else {
focusable = validTabIndex;
}
return focusable && (!checkVisibility || isVisible(element));
}
return false;
};
/**
* Receives CSS class declarations either as an object, string or array and returns an array of the class names.
*
* @hidden
*/
export const parseCSSClassNames = (value) => {
if (isObject(value)) {
return parseObjectClassNames(value);
}
if (isString(value)) {
return parseStringClassNames(value);
}
if (Array.isArray(value)) {
return parseArrayClassNames(value);
}
};
const parseObjectClassNames = (value) => {
const classes = [];
Object.keys(value).forEach(className => {
const currentClassName = splitStringToArray(className);
if (value[className] && currentClassName[0]) {
classes.push(...currentClassName);
}
});
return classes;
};
const parseStringClassNames = (value) => {
const classes = [];
const classesArray = splitStringToArray(value);
classesArray.forEach(className => {
classes.push(className);
});
return classes;
};
const parseArrayClassNames = (value) => {
const classes = [];
value.forEach((className) => {
const current = splitStringToArray(className);
if (current[0]) {
classes.push(...current);
}
});
return classes;
};
/**
* @hidden
*/
export const preventDefault = ({ originalEvent: event }) => {
event.stopPropagation();
event.preventDefault();
};
/**
* @hidden
*/
export const isWindowAvailable = () => {
return typeof window !== 'undefined';
};
/**
* @hidden
*/
export const preventOnDblClick = release => (mouseDown) => of(mouseDown).pipe(delay(150), takeUntil(release));
/**
* @hidden
*/
export const RESIZE_DIRECTIONS = ['n', 'e', 's', 'w', 'se', 'sw', 'ne', 'nw'];
/**
* @hidden
*/
export const OFFSET_STYLES = ['top', 'left', 'width', 'height'];
/**
* @hidden
*/
export const isString = (value) => value instanceof String || typeof value === 'string';
/**
* @hidden
*/
export const isObject = (value) => isPresent(value) && !Array.isArray(value) && typeof value === 'object';
/**
* @hidden
*/
export const isNumber = (value) => typeof value === 'number' && isFinite(value);
/**
* @hidden
*/
export const createValueWithUnit = (value) => value + (isNumber(value) ? 'px' : '');
/**
* @hidden
*/
export const splitStringToArray = (value) => value.trim().replace(/\s+/g, " ").split(' ');
/**
* @hidden
*/
export const findPrimaryButton = (buttons) => {
for (let i = buttons.length - 1; i >= 0; i--) {
const classList = buttons[i].classList;
for (let j = 0; j < classList.length; j++) {
if (classList[j].endsWith('-primary')) {
return buttons[i];
}
}
}
};