{"version":3,"file":"modal-manager.context-xpOoCF6L.js","sources":["../../../src/packages/core/modal/context/modal.context-token.ts","../../../src/packages/core/modal/component/modal.element.ts","../../../src/packages/core/modal/context/modal.context.ts","../../../src/packages/core/modal/context/modal-manager.context.ts"],"sourcesContent":["import type { UmbModalContext } from './modal.context.js';\r\nimport { UmbContextToken } from '@umbraco-cms/backoffice/context-api';\r\n\r\nexport const UMB_MODAL_CONTEXT = new UmbContextToken('UmbModalContext');\r\n","import type { UmbModalContext } from '../context/modal.context.js';\r\nimport { UMB_MODAL_CONTEXT } from '../context/modal.context-token.js';\r\nimport { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\r\nimport type { ManifestModal } from '@umbraco-cms/backoffice/modal';\r\nimport { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';\r\nimport { UmbTextStyles } from '@umbraco-cms/backoffice/style';\r\nimport type { CSSResultGroup } from '@umbraco-cms/backoffice/external/lit';\r\nimport { html, customElement } from '@umbraco-cms/backoffice/external/lit';\r\nimport { UmbBasicState, type UmbObserverController } from '@umbraco-cms/backoffice/observable-api';\r\nimport {\r\n\tUUIModalCloseEvent,\r\n\ttype UUIModalElement,\r\n\ttype UUIDialogElement,\r\n\ttype UUIModalDialogElement,\r\n\ttype UUIModalSidebarElement,\r\n\ttype UUIModalSidebarSize,\r\n} from '@umbraco-cms/backoffice/external/uui';\r\nimport { UMB_ROUTE_CONTEXT, type UmbRouterSlotElement } from '@umbraco-cms/backoffice/router';\r\nimport { createExtensionElement, loadManifestElement } from '@umbraco-cms/backoffice/extension-api';\r\nimport type { UmbContextRequestEvent } from '@umbraco-cms/backoffice/context-api';\r\nimport {\r\n\tUMB_CONTEXT_REQUEST_EVENT_TYPE,\r\n\tUmbContextBoundary,\r\n\tUmbContextProvider,\r\n} from '@umbraco-cms/backoffice/context-api';\r\n\r\n@customElement('umb-modal')\r\nexport class UmbModalElement extends UmbLitElement {\r\n\t#modalContext?: UmbModalContext;\r\n\r\n\tpublic element?: UUIModalDialogElement | UUIModalSidebarElement | UUIModalElement;\r\n\r\n\t#innerElement = new UmbBasicState(undefined);\r\n\r\n\t#modalExtensionObserver?: UmbObserverController;\r\n\t#modalRouterElement?: HTMLDivElement | UmbRouterSlotElement;\r\n\r\n\t#onClose = (e: Event) => {\r\n\t\tif (this.#modalContext?.isResolved() === false) {\r\n\t\t\t// If not resolved, and has a router, then we do not want to close, but instead let the router try to change the path for that to eventually trigger another round of close.\r\n\t\t\tif (this.#modalContext?.router) {\r\n\t\t\t\te.stopImmediatePropagation();\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tthis.#modalContext._internal_removeCurrentModal();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.element?.removeEventListener(UUIModalCloseEvent, this.#onClose);\r\n\t\tthis.#modalContext?.reject({ type: 'close' });\r\n\t};\r\n\r\n\tasync init(modalContext: UmbModalContext | undefined) {\r\n\t\tif (this.#modalContext === modalContext) return;\r\n\t\tthis.#modalContext = modalContext;\r\n\r\n\t\tif (!this.#modalContext) {\r\n\t\t\tthis.destroy();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.#modalContext.addEventListener('umb:destroy', this.#onContextDestroy);\r\n\t\tthis.element = await this.#createContainerElement();\r\n\r\n\t\t// Makes sure that the modal triggers the reject of the context promise when it is closed by pressing escape.\r\n\t\tthis.element.addEventListener(UUIModalCloseEvent, this.#onClose);\r\n\r\n\t\t// The following code is the context api proxy.\r\n\t\t// It re-dispatches the context api request event to the origin target of this modal, in other words the element that initiated the modal. [NL]\r\n\t\tthis.element.addEventListener(UMB_CONTEXT_REQUEST_EVENT_TYPE, ((event: UmbContextRequestEvent) => {\r\n\t\t\tif (!this.#modalContext) return;\r\n\t\t\t// Note for this hack (The if-sentence): [NL]\r\n\t\t\t// We do not currently have a good enough control to ensure that the proxy is last, meaning if another context is provided at this element, it might respond after the proxy event has been dispatched.\r\n\t\t\t// To avoid such this hack just prevents proxying the event if its a request for the Modal Context. [NL]\r\n\t\t\tif (event.contextAlias !== UMB_MODAL_CONTEXT.contextAlias) {\r\n\t\t\t\tevent.stopImmediatePropagation();\r\n\t\t\t\tthis.#modalContext.getHostElement().dispatchEvent(event.clone());\r\n\t\t\t}\r\n\t\t}) as EventListener);\r\n\r\n\t\tthis.#modalContext.onSubmit().then(\r\n\t\t\t() => {\r\n\t\t\t\tthis.element?.close();\r\n\t\t\t},\r\n\t\t\t() => {\r\n\t\t\t\tthis.element?.close();\r\n\t\t\t},\r\n\t\t);\r\n\r\n\t\t/**\r\n\t\t *\r\n\t\t * Maybe we could just get a Modal Router Slot. But it needs to have the ability to actually inject via slot. so the modal inner element can be within.\r\n\t\t *\r\n\t\t */\r\n\t\tif (this.#modalContext.router) {\r\n\t\t\tthis.#modalRouterElement = document.createElement('umb-router-slot');\r\n\t\t\tthis.#modalRouterElement.routes = [\r\n\t\t\t\t{\r\n\t\t\t\t\tpath: '',\r\n\t\t\t\t\tcomponent: document.createElement('slot'),\r\n\t\t\t\t},\r\n\t\t\t];\r\n\t\t\tthis.#modalRouterElement.parent = this.#modalContext.router;\r\n\t\t} else {\r\n\t\t\tthis.#modalRouterElement = document.createElement('div');\r\n\t\t\t// Notice inline styling here is used cause the element is not appended into this elements shadowDom but outside and there by gets into the element via a slot.\r\n\t\t\tthis.#modalRouterElement.style.position = 'relative';\r\n\t\t\tthis.#modalRouterElement.style.height = '100%';\r\n\t\t\tnew UmbContextBoundary(this.#modalRouterElement, UMB_ROUTE_CONTEXT).hostConnected();\r\n\t\t}\r\n\r\n\t\tthis.element.appendChild(this.#modalRouterElement);\r\n\r\n\t\tthis.#observeModal(this.#modalContext.alias.toString());\r\n\r\n\t\tconst provider = new UmbContextProvider(this.element, UMB_MODAL_CONTEXT, this.#modalContext);\r\n\t\tprovider.hostConnected();\r\n\t}\r\n\r\n\tasync #createContainerElement() {\r\n\t\tif (this.#modalContext!.type == 'custom' && this.#modalContext?.element) {\r\n\t\t\tconst customWrapperElementCtor = await loadManifestElement(this.#modalContext.element);\r\n\t\t\treturn new customWrapperElementCtor!();\r\n\t\t}\r\n\r\n\t\treturn this.#modalContext!.type === 'sidebar' ? this.#createSidebarElement() : this.#createDialogElement();\r\n\t}\r\n\r\n\t#createSidebarElement() {\r\n\t\tconst sidebarElement = document.createElement('uui-modal-sidebar');\r\n\t\tthis.observe(\r\n\t\t\tthis.#modalContext!.size,\r\n\t\t\t(size) => {\r\n\t\t\t\tsidebarElement.size = size as UUIModalSidebarSize;\r\n\t\t\t},\r\n\t\t\t'observeSize',\r\n\t\t);\r\n\t\treturn sidebarElement;\r\n\t}\r\n\r\n\t#createDialogElement() {\r\n\t\tconst modalDialogElement = document.createElement('uui-modal-dialog');\r\n\t\tconst dialogElement: UUIDialogElement = document.createElement('uui-dialog');\r\n\t\tmodalDialogElement.appendChild(dialogElement);\r\n\t\treturn modalDialogElement;\r\n\t}\r\n\r\n\t#observeModal(alias: string) {\r\n\t\tthis.#modalExtensionObserver?.destroy();\r\n\r\n\t\tthis.observe(umbExtensionsRegistry.byTypeAndAlias('modal', alias), async (manifest) => {\r\n\t\t\tthis.#removeInnerElement();\r\n\r\n\t\t\tif (manifest) {\r\n\t\t\t\tconst innerElement = await this.#createInnerElement(manifest);\r\n\t\t\t\tif (innerElement) {\r\n\t\t\t\t\tthis.#appendInnerElement(innerElement);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tasync #createInnerElement(manifest: ManifestModal) {\r\n\t\t// TODO: add inner fallback element if no extension element is found\r\n\t\tconst innerElement = await createExtensionElement(manifest);\r\n\r\n\t\tif (!this.#modalContext) {\r\n\t\t\t// If context does not exist any more, it means we have been destroyed. So we need to back out:\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tif (innerElement) {\r\n\t\t\tinnerElement.manifest = manifest;\r\n\t\t\tinnerElement.data = this.#modalContext.data;\r\n\t\t\tinnerElement.modalContext = this.#modalContext;\r\n\t\t}\r\n\r\n\t\treturn innerElement;\r\n\t}\r\n\r\n\t#appendInnerElement(element: HTMLElement) {\r\n\t\tthis.#modalRouterElement!.appendChild(element);\r\n\t\tthis.#innerElement.setValue(element);\r\n\t}\r\n\r\n\t#removeInnerElement() {\r\n\t\tconst innerElement = this.#innerElement.getValue();\r\n\t\tif (innerElement) {\r\n\t\t\tthis.#modalRouterElement!.removeChild(innerElement);\r\n\t\t\tthis.#innerElement.setValue(undefined);\r\n\t\t}\r\n\t}\r\n\r\n\toverride render() {\r\n\t\treturn html`${this.element}`;\r\n\t}\r\n\r\n\toverride disconnectedCallback(): void {\r\n\t\tsuper.disconnectedCallback();\r\n\t\tthis.destroy();\r\n\t}\r\n\r\n\t#onContextDestroy = () => {\r\n\t\tthis.destroy();\r\n\t};\r\n\r\n\toverride destroy() {\r\n\t\tthis.#innerElement.destroy();\r\n\t\tthis.#modalExtensionObserver?.destroy();\r\n\t\tthis.#modalExtensionObserver = undefined;\r\n\t\tif (this.#modalContext) {\r\n\t\t\tthis.#modalContext.removeEventListener('umb:destroy', this.#onContextDestroy);\r\n\t\t\tthis.#modalContext.destroy();\r\n\t\t\tthis.#modalContext = undefined;\r\n\t\t}\r\n\t\tsuper.destroy();\r\n\t}\r\n\r\n\tstatic override styles: CSSResultGroup = [UmbTextStyles];\r\n}\r\n\r\ndeclare global {\r\n\tinterface HTMLElementTagNameMap {\r\n\t\t'umb-modal': UmbModalElement;\r\n\t}\r\n}\r\n","import { UmbModalToken } from '../token/modal-token.js';\r\nimport type { UmbModalConfig, UmbModalType } from '../types.js';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport type { IRouterSlot } from '@umbraco-cms/backoffice/external/router-slot';\r\nimport type { UUIModalElement, UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui';\r\nimport { UmbId } from '@umbraco-cms/backoffice/id';\r\nimport { UmbObjectState, UmbStringState } from '@umbraco-cms/backoffice/observable-api';\r\nimport { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\r\nimport { type UmbDeepPartialObject, umbDeepMerge } from '@umbraco-cms/backoffice/utils';\r\nimport type { ElementLoaderProperty } from '@umbraco-cms/backoffice/extension-api';\r\nimport { UMB_ROUTE_CONTEXT } from '@umbraco-cms/backoffice/router';\r\n\r\nexport interface UmbModalRejectReason {\r\n\ttype: string;\r\n}\r\n\r\nexport type UmbModalContextClassArgs<\r\n\tModalAliasType extends string | UmbModalToken,\r\n\tModalAliasTypeAsToken extends UmbModalToken = ModalAliasType extends UmbModalToken\r\n\t\t? ModalAliasType\r\n\t\t: UmbModalToken,\r\n> = {\r\n\trouter?: IRouterSlot | null;\r\n\tdata?: ModalAliasTypeAsToken['DATA'];\r\n\tvalue?: ModalAliasTypeAsToken['VALUE'];\r\n\tmodal?: UmbModalConfig;\r\n};\r\n\r\n// TODO: consider splitting this into two separate handlers\r\nexport class UmbModalContext<\r\n\tModalData extends { [key: string]: any } = { [key: string]: any },\r\n\tModalValue = any,\r\n> extends UmbControllerBase {\r\n\t//\r\n\t// TODO: Come up with a better name:\r\n\t#submitIsGood?: boolean;\r\n\t#submitRejectReason?: UmbModalRejectReason;\r\n\t#submitIsResolved?: boolean;\r\n\r\n\t#submitPromise: Promise;\r\n\t#submitResolver?: (value: ModalValue) => void;\r\n\t#submitRejecter?: (reason?: UmbModalRejectReason) => void;\r\n\t#markAsResolved() {\r\n\t\tthis.#submitResolver = undefined;\r\n\t\tthis.#submitRejecter = undefined;\r\n\t\tthis.#submitIsResolved = true;\r\n\t}\r\n\r\n\tpublic readonly key: string;\r\n\tpublic readonly data: ModalData;\r\n\tpublic readonly type: UmbModalType = 'dialog';\r\n\tpublic readonly element?: ElementLoaderProperty;\r\n\tpublic readonly backdropBackground?: string;\r\n\tpublic readonly router: IRouterSlot | null = null;\r\n\tpublic readonly alias: string | UmbModalToken;\r\n\r\n\t#value;\r\n\tpublic readonly value;\r\n\r\n\t#size = new UmbStringState('small');\r\n\tpublic readonly size = this.#size.asObservable();\r\n\r\n\tconstructor(\r\n\t\thost: UmbControllerHost,\r\n\t\tmodalAlias: string | UmbModalToken,\r\n\t\targs: UmbModalContextClassArgs,\r\n\t) {\r\n\t\tsuper(host);\r\n\t\tthis.key = args.modal?.key || UmbId.new();\r\n\t\tthis.router = args.router ?? null;\r\n\t\tthis.alias = modalAlias;\r\n\r\n\t\tlet size = 'small';\r\n\r\n\t\tif (this.alias instanceof UmbModalToken) {\r\n\t\t\tthis.type = this.alias.getDefaultModal()?.type || this.type;\r\n\t\t\tsize = this.alias.getDefaultModal()?.size ?? size;\r\n\t\t\tthis.element = this.alias.getDefaultModal()?.element || this.element;\r\n\t\t\tthis.backdropBackground = this.alias.getDefaultModal()?.backdropBackground || this.backdropBackground;\r\n\t\t}\r\n\r\n\t\tthis.type = args.modal?.type || this.type;\r\n\t\tsize = args.modal?.size ?? size;\r\n\t\tthis.element = args.modal?.element || this.element;\r\n\t\tthis.backdropBackground = args.modal?.backdropBackground || this.backdropBackground;\r\n\r\n\t\tthis.#size.setValue(size);\r\n\r\n\t\tconst defaultData = this.alias instanceof UmbModalToken ? this.alias.getDefaultData() : undefined;\r\n\t\tthis.data = Object.freeze(\r\n\t\t\t// If we have both data and defaultData perform a deep merge\r\n\t\t\targs.data && defaultData\r\n\t\t\t\t? (umbDeepMerge(args.data as UmbDeepPartialObject, defaultData) as ModalData)\r\n\t\t\t\t: // otherwise pick one of them:\r\n\t\t\t\t\t((args.data as ModalData) ?? defaultData),\r\n\t\t);\r\n\r\n\t\tconst initValue =\r\n\t\t\targs.value ?? (this.alias instanceof UmbModalToken ? (this.alias as UmbModalToken).getDefaultValue() : undefined);\r\n\r\n\t\tthis.#value = new UmbObjectState(initValue) as UmbObjectState;\r\n\t\tthis.value = this.#value.asObservable();\r\n\r\n\t\t// TODO: Consider if its right to use Promises, or use another event based system? Would we need to be able to cancel an event, to then prevent the closing..?\r\n\t\tthis.#submitPromise = new Promise((resolve, reject) => {\r\n\t\t\tthis.#submitResolver = resolve;\r\n\t\t\tthis.#submitRejecter = reject;\r\n\t\t});\r\n\t}\r\n\r\n\t#activeModalPath?: string;\r\n\r\n\t_internal_setCurrentModalPath(path: string) {\r\n\t\tthis.#activeModalPath = path;\r\n\t}\r\n\r\n\tasync _internal_removeCurrentModal() {\r\n\t\tconst routeContext = await this.getContext(UMB_ROUTE_CONTEXT);\r\n\t\trouteContext._internal_removeModalPath(this.#activeModalPath);\r\n\t}\r\n\r\n\tforceResolve() {\r\n\t\t// THIS should close the element no matter what.\r\n\t\tif (this.#submitIsGood) {\r\n\t\t\tconst resolver = this.#submitResolver;\r\n\t\t\tthis.#markAsResolved();\r\n\t\t\tresolver?.(this.getValue());\r\n\t\t} else {\r\n\t\t\t// We might store the reason from reject and use it here?, but I'm not sure what the real need is for this reason. [NL]\r\n\t\t\tconst resolver = this.#submitRejecter;\r\n\t\t\tthis.#markAsResolved();\r\n\t\t\tresolver?.(this.#submitRejectReason ?? { type: 'close' });\r\n\t\t}\r\n\t}\r\n\r\n\tisResolved() {\r\n\t\treturn this.#submitIsResolved === true;\r\n\t}\r\n\r\n\t// note, this methods is private argument is not defined correctly here, but requires to be fix by appending the OptionalSubmitArgumentIfUndefined type when newing up this class.\r\n\t/**\r\n\t * Submits this modal, returning with a value to the initiator of the modal.\r\n\t * @public\r\n\t * @memberof UmbModalContext\r\n\t */\r\n\tpublic submit() {\r\n\t\tif (this.#submitIsResolved) return;\r\n\t\tif (this.router) {\r\n\t\t\t// Do not resolve jet, lets try to change the URL.\r\n\t\t\tthis.#submitIsGood = true;\r\n\t\t\tthis._internal_removeCurrentModal();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.#submitResolver?.(this.getValue());\r\n\t\tthis.#markAsResolved();\r\n\t\t// TODO: Could we clean up this class here? (Example destroy the value state, and other things?)\r\n\t}\r\n\r\n\t/**\r\n\t * Closes this modal\r\n\t * @param reason\r\n\t * @public\r\n\t * @memberof UmbModalContext\r\n\t */\r\n\tpublic reject(reason?: UmbModalRejectReason) {\r\n\t\tif (this.#submitIsResolved) return;\r\n\t\tif (this.router) {\r\n\t\t\t// Do not reject jet, lets try to change the URL.\r\n\t\t\tthis.#submitIsGood = false;\r\n\t\t\tthis.#submitRejectReason = reason;\r\n\t\t\tthis._internal_removeCurrentModal();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.#submitRejecter?.(reason);\r\n\t\tthis.#markAsResolved();\r\n\t\t// TODO: Could we clean up this class here? (Example destroy the value state, and other things?)\r\n\t}\r\n\r\n\t/**\r\n\t * Gives a Promise which will be resolved when this modal is submitted.\r\n\t * @returns {Promise}\r\n\t * @public\r\n\t * @memberof UmbModalContext\r\n\t */\r\n\tpublic onSubmit() {\r\n\t\treturn this.#submitPromise;\r\n\t}\r\n\r\n\t/**\r\n\t * Gives the current value of this modal.\r\n\t * @returns {ModalValue}\r\n\t * @public\r\n\t * @memberof UmbModalContext\r\n\t */\r\n\tpublic getValue() {\r\n\t\treturn this.#value.getValue();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the current value of this modal.\r\n\t * @param value\r\n\t * @public\r\n\t * @memberof UmbModalContext\r\n\t */\r\n\tpublic setValue(value: ModalValue) {\r\n\t\tthis.#value.setValue(value);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the current value of this modal.\r\n\t * @param partialValue\r\n\t * @public\r\n\t * @memberof UmbModalContext\r\n\t */\r\n\tpublic updateValue(partialValue: Partial) {\r\n\t\tthis.#value.update(partialValue);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size this modal.\r\n\t * @param size\r\n\t * @public\r\n\t * @memberof UmbModalContext\r\n\t */\r\n\tsetModalSize(size: UUIModalSidebarSize) {\r\n\t\tthis.#size.setValue(size);\r\n\t}\r\n\r\n\tpublic override destroy(): void {\r\n\t\tthis.dispatchEvent(new CustomEvent('umb:destroy'));\r\n\t\tthis.#value.destroy();\r\n\t\t(this as any).router = null;\r\n\t\t(this as any).data = undefined;\r\n\t\tsuper.destroy();\r\n\t}\r\n}\r\n","import type { UmbModalToken } from '../token/modal-token.js';\r\nimport { UmbModalContext, type UmbModalContextClassArgs } from './modal.context.js';\r\nimport { UmbBasicState, appendToFrozenArray } from '@umbraco-cms/backoffice/observable-api';\r\nimport { UmbContextToken } from '@umbraco-cms/backoffice/context-api';\r\nimport { UmbContextBase } from '@umbraco-cms/backoffice/class-api';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\n\r\nexport class UmbModalManagerContext extends UmbContextBase {\r\n\t// TODO: Investigate if we can get rid of HTML elements in our store, so we can use one of our states.\r\n\t#modals = new UmbBasicState(>[]);\r\n\tpublic readonly modals = this.#modals.asObservable();\r\n\r\n\tconstructor(host: UmbControllerHost) {\r\n\t\tsuper(host, UMB_MODAL_MANAGER_CONTEXT);\r\n\r\n\t\twindow.addEventListener('navigationsuccess', this.#onNavigationSuccess);\r\n\t}\r\n\r\n\t/**\r\n\t * Opens a modal or sidebar modal\r\n\t * @public\r\n\t * @param {UmbControllerHost} host - The host that the modal should be attached to, this is usually the controller/element that is opening the modal. This additionally acts as the modal origin for the context api.\r\n\t * @param {(string | UmbModalToken)} modalAlias - The alias or token of the modal to open\r\n\t * @param {UmbModalContextClassArgs} args - The arguments for this setup.\r\n\t * @returns {*} {UmbModalHandler}\r\n\t * @memberof UmbModalManagerContext\r\n\t */\r\n\tpublic open<\r\n\t\tModalData extends { [key: string]: any } = { [key: string]: any },\r\n\t\tModalValue = unknown,\r\n\t\tModalAliasTypeAsToken extends UmbModalToken = UmbModalToken,\r\n\t>(\r\n\t\thost: UmbControllerHost,\r\n\t\tmodalAlias: UmbModalToken | string,\r\n\t\targs: UmbModalContextClassArgs = {},\r\n\t) {\r\n\t\tconst modalContext = new UmbModalContext(host, modalAlias, args);\r\n\r\n\t\t// Append to store:\r\n\t\tthis.#modals.setValue(\r\n\t\t\tappendToFrozenArray(this.#modals.value, modalContext, (entry) => entry.key === modalContext.key),\r\n\t\t);\r\n\r\n\t\t// Return to implementor:\r\n\t\treturn modalContext;\r\n\t}\r\n\r\n\t/**\r\n\t * Closes a modal or sidebar modal\r\n\t * @private\r\n\t * @param {string} key - The key of the modal to close\r\n\t * @memberof UmbModalManagerContext\r\n\t */\r\n\tpublic close(key: string) {\r\n\t\tconst modal = this.#modals.getValue().find((modal) => modal.key === key);\r\n\t\tif (modal) {\r\n\t\t\tmodal.forceResolve();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic remove(key: string) {\r\n\t\tthis.#modals.setValue(this.#modals.getValue().filter((modal) => modal.key !== key));\r\n\t}\r\n\r\n\t/**\r\n\t * Closes all modals that is not routable\r\n\t * @private\r\n\t * @memberof UmbModalManagerContext\r\n\t */\r\n\t#closeNoneRoutableModals() {\r\n\t\tthis.#modals\r\n\t\t\t.getValue()\r\n\t\t\t.filter((modal) => modal.router === null)\r\n\t\t\t.forEach((modal) => {\r\n\t\t\t\tmodal.forceResolve();\r\n\t\t\t});\r\n\t}\r\n\r\n\t#onNavigationSuccess = () => {\r\n\t\tthis.#closeNoneRoutableModals();\r\n\t};\r\n\r\n\toverride destroy() {\r\n\t\tsuper.destroy();\r\n\t\tthis.#modals.destroy();\r\n\t\twindow.removeEventListener('navigationsuccess', this.#onNavigationSuccess);\r\n\t}\r\n}\r\n\r\nexport const UMB_MODAL_MANAGER_CONTEXT = new UmbContextToken(\r\n\t'UmbModalManagerContext',\r\n);\r\n"],"names":["UMB_MODAL_CONTEXT","UmbContextToken","_modalContext","_innerElement","_modalExtensionObserver","_modalRouterElement","_onClose","_UmbModalElement_instances","createContainerElement_fn","createSidebarElement_fn","createDialogElement_fn","observeModal_fn","createInnerElement_fn","appendInnerElement_fn","removeInnerElement_fn","_onContextDestroy","UmbModalElement","UmbLitElement","__privateAdd","UmbBasicState","e","__privateGet","UUIModalCloseEvent","modalContext","__privateSet","__privateMethod","UMB_CONTEXT_REQUEST_EVENT_TYPE","event","UmbContextBoundary","UMB_ROUTE_CONTEXT","UmbContextProvider","html","customWrapperElementCtor","loadManifestElement","sidebarElement","size","modalDialogElement","dialogElement","alias","umbExtensionsRegistry","manifest","innerElement","createExtensionElement","element","UmbTextStyles","__decorateClass","customElement","UmbModalContext","UmbControllerBase","host","modalAlias","args","#size","UmbStringState","UmbId","UmbModalToken","defaultData","umbDeepMerge","initValue","#value","UmbObjectState","#submitPromise","resolve","reject","#submitResolver","#submitRejecter","#submitIsGood","#submitRejectReason","#submitIsResolved","#markAsResolved","#activeModalPath","path","resolver","reason","value","partialValue","UmbModalManagerContext","UmbContextBase","UMB_MODAL_MANAGER_CONTEXT","#modals","#onNavigationSuccess","#closeNoneRoutableModals","appendToFrozenArray","entry","key","modal"],"mappings":"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"}