UNPKG

golden-layout

Version:
207 lines (183 loc) 6.15 kB
import { WidthAndHeight } from './types'; /** @internal */ export function numberToPixels(value: number): string { return value.toString(10) + 'px'; } /** @internal */ export function pixelsToNumber(value: string): number { const numberStr = value.replace("px", ""); return parseFloat(numberStr); } /** @internal */ export interface SplitStringAtFirstNonNumericCharResult { numericPart: string; firstNonNumericCharPart: string; } /** @internal */ export function splitStringAtFirstNonNumericChar(value: string): SplitStringAtFirstNonNumericCharResult { value = value.trimStart(); const length = value.length; if (length === 0) { return { numericPart: '', firstNonNumericCharPart: '' } } else { let firstNonDigitPartIndex = length; let gotDecimalPoint = false; for (let i = 0; i < length; i++) { const char = value[i]; if (!isDigit(char)) { if (char !== '.') { firstNonDigitPartIndex = i; break; } else { if (gotDecimalPoint) { firstNonDigitPartIndex = i; break; } else { gotDecimalPoint = true; } } } } const digitsPart = value.substring(0, firstNonDigitPartIndex); const firstNonDigitPart = value.substring(firstNonDigitPartIndex).trim(); return { numericPart: digitsPart, firstNonNumericCharPart: firstNonDigitPart }; } } /** @internal */ export function isDigit(char: string) { return char >= '0' && char <= '9'; } /** @internal */ export function getElementWidth(element: HTMLElement): number { return element.offsetWidth; } /** @internal */ export function setElementWidth(element: HTMLElement, width: number): void { const widthAsPixels = numberToPixels(width); element.style.width = widthAsPixels; } /** @internal */ export function getElementHeight(element: HTMLElement): number { return element.offsetHeight; } /** @internal */ export function setElementHeight(element: HTMLElement, height: number): void { const heightAsPixels = numberToPixels(height); element.style.height = heightAsPixels; } /** @internal */ export function getElementWidthAndHeight(element: HTMLElement): WidthAndHeight { return { width: element.offsetWidth, height: element.offsetHeight, }; } /** @internal */ export function setElementDisplayVisibility(element: HTMLElement, visible: boolean): void { if (visible) { element.style.display = ''; } else { element.style.display = 'none'; } } /** @internal */ export function ensureElementPositionAbsolute(element: HTMLElement): void { const absolutePosition = 'absolute'; if (element.style.position !== absolutePosition) { element.style.position = absolutePosition; } } /** * Replacement for JQuery $.extend(target, obj) * @internal */ export function extend(target: Record<string, unknown>, obj: Record<string, unknown>): Record<string, unknown> { for (const key in obj) { if (obj.hasOwnProperty(key)) { target[key] = obj[key]; } } return target; } /** * Replacement for JQuery $.extend(true, target, obj) * @internal */ export function deepExtend(target: Record<string, unknown>, obj: Record<string, unknown> | undefined): Record<string, unknown> { if (obj !== undefined) { for (const key in obj) { if (obj.hasOwnProperty(key)) { const value = obj[key]; const existingTarget = target[key]; target[key] = deepExtendValue(existingTarget, value); } } } return target; } /** @internal */ export function deepExtendValue(existingTarget: unknown, value: unknown): unknown { if (typeof value !== 'object') { return value; } else { if (Array.isArray(value)) { const length = value.length; const targetArray = new Array<unknown>(length); for (let i = 0; i < length; i++) { const element = value[i]; targetArray[i] = deepExtendValue({}, element); } return targetArray; } else { if (value === null) { return null; } else { const valueObj = value as Record<string, unknown>; if (existingTarget === undefined) { return deepExtend({}, valueObj); // overwrite } else { if (typeof existingTarget !== "object") { return deepExtend({}, valueObj); // overwrite } else { if (Array.isArray(existingTarget)) { return deepExtend({}, valueObj); // overwrite } else { if (existingTarget === null) { return deepExtend({}, valueObj); // overwrite } else { const existingTargetObj = existingTarget as Record<string, unknown>; return deepExtend(existingTargetObj, valueObj); // merge } } } } } } } } /** @internal */ export function removeFromArray<T>(item: T, array: T[]): void { const index = array.indexOf(item); if (index === -1) { throw new Error('Can\'t remove item from array. Item is not in the array'); } array.splice(index, 1); } /** @internal */ export function getUniqueId(): string { return (Math.random() * 1000000000000000) .toString(36) .replace('.', ''); } /** @internal */ export function getErrorMessage(e: unknown): string { if (e instanceof Error) { return e.message; } else { if (typeof e === 'string') { return e; } else { return 'Unknown Error'; } } }