UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

170 lines (168 loc) • 6.1 kB
/** * DevExtreme (esm/__internal/ui/m_notify.js) * Version: 24.2.6 * Build date: Mon Mar 17 2025 * * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ import $ from "../../core/renderer"; import { extend } from "../../core/utils/extend"; import { isPlainObject, isString } from "../../core/utils/type"; import { value as viewPort } from "../../core/utils/view_port"; import { getWindow } from "../../core/utils/window"; import Toast from "../../ui/toast"; const window = getWindow(); let $notify = null; const $containers = {}; function notify(message, typeOrStack, displayTime) { const options = isPlainObject(message) ? message : { message: message }; const stack = isPlainObject(typeOrStack) ? typeOrStack : void 0; const type = isPlainObject(typeOrStack) ? void 0 : typeOrStack; const { onHidden: userOnHidden } = options; if (null !== stack && void 0 !== stack && stack.position) { const { position: position } = stack; const direction = stack.direction || getDefaultDirection(position); const containerKey = isString(position) ? position : `${position.top}-${position.left}-${position.bottom}-${position.right}`; const { onShowing: userOnShowing } = options; const $container = getStackContainer(containerKey); setContainerClasses($container, direction); extend(options, { container: $container, _skipContentPositioning: true, onShowing(args) { setContainerStyles($container, direction, position); null === userOnShowing || void 0 === userOnShowing || userOnShowing(args) } }) } extend(options, { type: type, displayTime: displayTime, onHidden(args) { $(args.element).remove(); null === userOnHidden || void 0 === userOnHidden || userOnHidden(args) } }); $notify = $("<div>").appendTo(viewPort()); new Toast($notify, options).show() } const getDefaultDirection = position => isString(position) && position.includes("top") ? "down-push" : "up-push"; const createStackContainer = key => { const $container = $("<div>").appendTo(viewPort()); $containers[key] = $container; return $container }; const getStackContainer = key => { const $container = $containers[key]; return $container || createStackContainer(key) }; const setContainerClasses = (container, direction) => { const containerClasses = `dx-toast-stack dx-toast-stack-${direction}-direction`; container.removeAttr("class").addClass(containerClasses) }; const setContainerStyles = (container, direction, position) => { const { offsetWidth: toastWidth, offsetHeight: toastHeight } = container.children().first().get(0); const dimensions = { toastWidth: toastWidth, toastHeight: toastHeight, windowHeight: window.innerHeight, windowWidth: window.innerWidth }; const coordinates = isString(position) ? getCoordinatesByAlias(position, dimensions) : position; const styles = getPositionStylesByCoordinates(direction, coordinates, dimensions); container.css(styles) }; const getCoordinatesByAlias = (alias, _ref) => { let { toastWidth: toastWidth, toastHeight: toastHeight, windowHeight: windowHeight, windowWidth: windowWidth } = _ref; switch (alias) { case "top left": return { top: 10, left: 10 }; case "top right": return { top: 10, right: 10 }; case "bottom left": return { bottom: 10, left: 10 }; case "bottom right": return { bottom: 10, right: 10 }; case "top center": return { top: 10, left: Math.round(windowWidth / 2 - toastWidth / 2) }; case "left center": return { top: Math.round(windowHeight / 2 - toastHeight / 2), left: 10 }; case "right center": return { top: Math.round(windowHeight / 2 - toastHeight / 2), right: 10 }; case "center": return { top: Math.round(windowHeight / 2 - toastHeight / 2), left: Math.round(windowWidth / 2 - toastWidth / 2) }; default: return { bottom: 10, left: Math.round(windowWidth / 2 - toastWidth / 2) } } }; const getPositionStylesByCoordinates = (direction, coordinates, dimensions) => { const { toastWidth: toastWidth, toastHeight: toastHeight, windowHeight: windowHeight, windowWidth: windowWidth } = dimensions; switch (direction.replace(/-push|-stack/g, "")) { case "up": return { bottom: coordinates.bottom ?? windowHeight - toastHeight - coordinates.top, top: "", left: coordinates.left ?? "", right: coordinates.right ?? "" }; case "down": return { top: coordinates.top ?? windowHeight - toastHeight - coordinates.bottom, bottom: "", left: coordinates.left ?? "", right: coordinates.right ?? "" }; case "left": return { right: coordinates.right ?? windowWidth - toastWidth - coordinates.left, left: "", top: coordinates.top ?? "", bottom: coordinates.bottom ?? "" }; case "right": return { left: coordinates.left ?? windowWidth - toastWidth - coordinates.right, right: "", top: coordinates.top ?? "", bottom: coordinates.bottom ?? "" } } }; export default notify;