@operato/layout 10.29.44 → 10.29.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -185,6 +185,7 @@ var popupSequence = 0;
185
185
  * @returns the implementation handle. Callers get the full handle (with `result`) from `openPopup`.
186
186
  */
187
187
  const openPopupInLayout = (template, options = {}) => {
188
+ var _a;
188
189
  var name = `$popup-${popupSequence++}`;
189
190
  appendViewpart({
190
191
  name,
@@ -193,7 +194,8 @@ const openPopupInLayout = (template, options = {}) => {
193
194
  closable: true,
194
195
  movable: true,
195
196
  ...options,
196
- backdrop: true,
197
+ /* A popup is modal unless the caller asks for none: a window that works with what is behind it (a figure's fastening, pressed on the canvas) lays no backdrop. */
198
+ backdrop: (_a = options.backdrop) !== null && _a !== void 0 ? _a : true,
197
199
  show: false,
198
200
  temporary: true /* auto remove */,
199
201
  template
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/actions/layout.ts"],"names":[],"mappings":"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","sourcesContent":["import { TemplateResult } from 'lit'\n\nimport { openPopup as openPopupWithResult, PopupOptions, setOpenPopupImplementation } from '@operato/popup'\nimport { PopupImplementationHandle } from '@operato/popup/implementation.js'\nimport { store } from '@operato/shell'\nimport { addressController } from '@operato/utils/address.js'\n\nexport type Viewpart = {\n hovering?: 'center' | 'edge' | 'next'\n show?: boolean\n size?: string\n title?: string\n help?: string\n level?: VIEWPART_LEVEL\n closable?: boolean\n search?: {\n value?: string\n handler?: (closure: any, value: string) => void\n placeholder?: string\n }\n filter?: {\n handler?: (closure: any) => void\n }\n backdrop?: boolean\n temporary?: boolean /* auto remove */\n persistent?: boolean /* application-wide dock remains available in fullbleed pages */\n resizable?: boolean\n movable?: boolean\n template?: TemplateResult\n position?: VIEWPART_POSITION\n templateProperties?: any\n zIndex?: number\n}\n\nexport type AppendViewpartAction = {\n name: string\n viewpart: Viewpart\n position: VIEWPART_POSITION\n}\n\nexport const appendViewpart = ({ name, viewpart, position }: AppendViewpartAction) => {\n store.dispatch({\n type: APPEND_VIEWPART,\n name,\n viewpart: {\n ...viewpart,\n show: viewpart.hovering && viewpart.show ? false : viewpart.show\n },\n position\n })\n\n if (viewpart.hovering && viewpart.show) {\n openOverlay(name)\n }\n}\n\nexport const removeViewpart = (name: string) => {\n store.dispatch({\n type: REMOVE_VIEWPART,\n name\n })\n}\n\nexport const updateViewpart = (name: string, override: any) => {\n store.dispatch({\n type: UPDATE_VIEWPART,\n name,\n override\n })\n}\n\nexport const APPEND_VIEWPART = 'APPEND_VIEWPART'\nexport const REMOVE_VIEWPART = 'REMOVE_VIEWPART'\nexport const UPDATE_VIEWPART = 'UPDATE_VIEWPART'\n\nexport enum VIEWPART_POSITION {\n HEADERBAR = 'headerbar',\n NAVBAR = 'navbar',\n ASIDEBAR = 'asidebar',\n FOOTERBAR = 'footerbar',\n PAGE_HEADERBAR = 'page-headerbar',\n PAGE_FOOTERBAR = 'page-footerbar'\n}\n\n/**\n * 각 뷰파트 스택의 순서를 정하는 속성이다.\n * 뷰파트의 level 속성에 정의되도록 한다.\n * 맨 위/아래/좌측/우측에 보여져야하는 뷰파트는 TOPMOST 속성을 갖도록 하고,\n * 쌓인 순서대로 보여지는 뷰파트는 NORMAL 속성을 갖도록 한다.\n * default 속성은 NORMAL이다.\n */\nexport enum VIEWPART_LEVEL {\n TOPMOST = 'TOPMOST',\n NORMAL = 'NORMAL'\n}\n\nexport enum TOOL_POSITION {\n FRONT_END = 'FRONT_END',\n FRONT = 'FRONT',\n CENTER = 'CENTER',\n REAR = 'REAR',\n REAR_END = 'REAR_END'\n}\n\nexport const UPDATE_VIEWPORT_WIDTH = 'UPDATE_VIEWPORT_WIDTH'\n\nexport const updateLayout = (wide?: boolean) => {\n store.dispatch({\n type: UPDATE_VIEWPORT_WIDTH,\n width: wide ? 'WIDE' : 'NARROW'\n })\n}\n\n/* overlay navigation */\nvar overlaySequence = 0\nconst pendingOverlays = new Map<string, AbortController>()\nconst overlays: { name: string; key: string; belowKey: string; escapable: boolean }[] = []\n\nfunction syncModal() {\n const modal = [...overlays]\n .reverse()\n .find(overlay => (store.getState() as any).layout?.viewparts?.[overlay.name]?.backdrop)\n addressController().setModal(modal ? { name: modal.name, close: () => dismissOverlays(0) } : undefined)\n}\n\nfunction dismissOverlays(from: number) {\n for (const overlay of overlays.splice(from)) {\n store.dispatch({ type: UPDATE_VIEWPART, name: overlay.name, override: { show: false } })\n }\n syncModal()\n}\n\naddressController().subscribe((entry, before) => {\n const firstGone = overlays.findIndex(overlay => {\n const index = addressController().indexOf(overlay.key)\n return index < 0 || index > entry.index\n })\n if (firstGone >= 0) dismissOverlays(firstGone)\n if (entry.url.pathname !== before.url.pathname || entry.intent === 'navigation') dismissOverlays(0)\n const overlay = (entry.state as any)?.overlay\n if (!overlay || !pendingOverlays.has(overlay.name)) return\n pendingOverlays.delete(overlay.name)\n overlays.push({ ...overlay, key: entry.key, belowKey: before.key })\n store.dispatch({ type: UPDATE_VIEWPART, name: overlay.name, override: { show: true } })\n syncModal()\n}, false)\n\n/* An overlay hidden by any other way (a viewpart update, its removal) is closed: the stack is what is on screen. */\nstore.subscribe(() => {\n const viewparts = (store.getState() as any).layout?.viewparts || {}\n const hidden = overlays.find(overlay => !viewparts[overlay.name]?.show)\n if (hidden) closeOverlay(hidden.name)\n})\n\ndocument.addEventListener('keydown', event => {\n const top = overlays[overlays.length - 1]\n if (top?.escapable && (event.key === 'Escape' || event.key === 'Esc')) {\n event.preventDefault()\n closeOverlay(top.name)\n }\n})\n\nexport const openOverlay = (name: string, options?: any, silent?: boolean) => {\n /* store의 layout의 내용을 변경한다. */\n if (!silent && options) {\n store.dispatch({\n type: UPDATE_VIEWPART,\n name,\n override: options\n })\n }\n\n const request = new AbortController()\n pendingOverlays.set(name, request)\n void addressController()\n .pushOverlay(\n {\n ...(history.state || {}),\n overlay: { name, sequence: ++overlaySequence, escapable: options?.escapable !== false }\n },\n request.signal\n )\n .then(accepted => {\n if (accepted) return\n pendingOverlays.delete(name)\n store.dispatch({ type: UPDATE_VIEWPART, name, override: { show: false } })\n document.dispatchEvent(new CustomEvent('overlay-closed', { detail: name }))\n })\n}\n\nexport const closeOverlay = (name: string) => {\n const index = overlays.findIndex(overlay => overlay.name === name)\n if (index < 0) {\n const pending = pendingOverlays.get(name)\n pending?.abort()\n return !!pending\n }\n const overlay = overlays[index]\n dismissOverlays(index)\n // Back to the entry under the overlay only when nothing with another address was written above it. If something\n // was (a filter while the AI dock was open), the overlay is only hidden: going back would undo that write.\n if (addressController().unchangedSince(overlay.key)) addressController().traverseTo(overlay.belowKey)\n return true\n}\n\n/** The overlay on top of the ones open now, if any - what a back control in the app's own bar closes. */\nexport const topOverlay = (): string | undefined => overlays[overlays.length - 1]?.name\n\nexport const toggleOverlay = (name: string, options: any) => {\n var beforeOverlayName = overlays[overlays.length - 1]?.name\n\n if (beforeOverlayName == name) {\n closeOverlay(name)\n } else {\n openOverlay(name, options)\n }\n}\n\n/*\n * popup handling\n *\n * popup은 overlay의 특별한 형태이다.\n * popup은 open될 때, viewpart를 append 하며, close 될 때 viewpart를 remove 한다.\n * - name: '$popup-${popupSequence}'\n * - position: VIEWPART_POSITION_HEADERBAR\n * - hovering: 'center' | 'next' | 'edge'\n */\nvar popupSequence = 0\n\n/**\n * open popup in operato application environment\n *\n * @param {*} template html template to be rendered inside the popup\n * @param {PopupOptions} options\n * @returns the implementation handle. Callers get the full handle (with `result`) from `openPopup`.\n */\nconst openPopupInLayout = (template: TemplateResult, options: PopupOptions = {}): PopupImplementationHandle => {\n var name = `$popup-${popupSequence++}`\n\n appendViewpart({\n name,\n viewpart: {\n hovering: 'center',\n closable: true,\n movable: true,\n ...options,\n backdrop: true,\n show: false,\n temporary: true /* auto remove */,\n template\n },\n position: VIEWPART_POSITION.HEADERBAR\n })\n\n openOverlay(name, options, true)\n\n /* Typed, not cast: a cast would let a close() that forgets to answer compile. */\n var popup: PopupImplementationHandle = {\n name,\n close: () => {\n if (overlays[overlays.length - 1]?.name !== name && !pendingOverlays.has(name)) return false\n return closeOverlay(name)\n },\n closed: false\n }\n\n document.addEventListener('overlay-closed', function listener(e) {\n if (name == (e as CustomEvent).detail) {\n popup.closed = true\n popup.onclosed && popup.onclosed()\n document.removeEventListener('overlay-closed', listener)\n }\n })\n\n return popup\n}\n\nsetOpenPopupImplementation(openPopupInLayout)\n\n/*\n * The popup package's openPopup adds `result` and `close(result)` on top of whichever implementation is\n * registered, so the handle is built in one place. Re-exported here because most callers import\n * openPopup from @operato/layout.\n */\nexport const openPopup = openPopupWithResult\n"]}
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/actions/layout.ts"],"names":[],"mappings":"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","sourcesContent":["import { TemplateResult } from 'lit'\n\nimport { openPopup as openPopupWithResult, PopupOptions, setOpenPopupImplementation } from '@operato/popup'\nimport { PopupImplementationHandle } from '@operato/popup/implementation.js'\nimport { store } from '@operato/shell'\nimport { addressController } from '@operato/utils/address.js'\n\nexport type Viewpart = {\n hovering?: 'center' | 'edge' | 'next'\n show?: boolean\n size?: string\n title?: string\n help?: string\n level?: VIEWPART_LEVEL\n closable?: boolean\n search?: {\n value?: string\n handler?: (closure: any, value: string) => void\n placeholder?: string\n }\n filter?: {\n handler?: (closure: any) => void\n }\n backdrop?: boolean\n temporary?: boolean /* auto remove */\n persistent?: boolean /* application-wide dock remains available in fullbleed pages */\n resizable?: boolean\n movable?: boolean\n template?: TemplateResult\n position?: VIEWPART_POSITION\n templateProperties?: any\n zIndex?: number\n}\n\nexport type AppendViewpartAction = {\n name: string\n viewpart: Viewpart\n position: VIEWPART_POSITION\n}\n\nexport const appendViewpart = ({ name, viewpart, position }: AppendViewpartAction) => {\n store.dispatch({\n type: APPEND_VIEWPART,\n name,\n viewpart: {\n ...viewpart,\n show: viewpart.hovering && viewpart.show ? false : viewpart.show\n },\n position\n })\n\n if (viewpart.hovering && viewpart.show) {\n openOverlay(name)\n }\n}\n\nexport const removeViewpart = (name: string) => {\n store.dispatch({\n type: REMOVE_VIEWPART,\n name\n })\n}\n\nexport const updateViewpart = (name: string, override: any) => {\n store.dispatch({\n type: UPDATE_VIEWPART,\n name,\n override\n })\n}\n\nexport const APPEND_VIEWPART = 'APPEND_VIEWPART'\nexport const REMOVE_VIEWPART = 'REMOVE_VIEWPART'\nexport const UPDATE_VIEWPART = 'UPDATE_VIEWPART'\n\nexport enum VIEWPART_POSITION {\n HEADERBAR = 'headerbar',\n NAVBAR = 'navbar',\n ASIDEBAR = 'asidebar',\n FOOTERBAR = 'footerbar',\n PAGE_HEADERBAR = 'page-headerbar',\n PAGE_FOOTERBAR = 'page-footerbar'\n}\n\n/**\n * 각 뷰파트 스택의 순서를 정하는 속성이다.\n * 뷰파트의 level 속성에 정의되도록 한다.\n * 맨 위/아래/좌측/우측에 보여져야하는 뷰파트는 TOPMOST 속성을 갖도록 하고,\n * 쌓인 순서대로 보여지는 뷰파트는 NORMAL 속성을 갖도록 한다.\n * default 속성은 NORMAL이다.\n */\nexport enum VIEWPART_LEVEL {\n TOPMOST = 'TOPMOST',\n NORMAL = 'NORMAL'\n}\n\nexport enum TOOL_POSITION {\n FRONT_END = 'FRONT_END',\n FRONT = 'FRONT',\n CENTER = 'CENTER',\n REAR = 'REAR',\n REAR_END = 'REAR_END'\n}\n\nexport const UPDATE_VIEWPORT_WIDTH = 'UPDATE_VIEWPORT_WIDTH'\n\nexport const updateLayout = (wide?: boolean) => {\n store.dispatch({\n type: UPDATE_VIEWPORT_WIDTH,\n width: wide ? 'WIDE' : 'NARROW'\n })\n}\n\n/* overlay navigation */\nvar overlaySequence = 0\nconst pendingOverlays = new Map<string, AbortController>()\nconst overlays: { name: string; key: string; belowKey: string; escapable: boolean }[] = []\n\nfunction syncModal() {\n const modal = [...overlays]\n .reverse()\n .find(overlay => (store.getState() as any).layout?.viewparts?.[overlay.name]?.backdrop)\n addressController().setModal(modal ? { name: modal.name, close: () => dismissOverlays(0) } : undefined)\n}\n\nfunction dismissOverlays(from: number) {\n for (const overlay of overlays.splice(from)) {\n store.dispatch({ type: UPDATE_VIEWPART, name: overlay.name, override: { show: false } })\n }\n syncModal()\n}\n\naddressController().subscribe((entry, before) => {\n const firstGone = overlays.findIndex(overlay => {\n const index = addressController().indexOf(overlay.key)\n return index < 0 || index > entry.index\n })\n if (firstGone >= 0) dismissOverlays(firstGone)\n if (entry.url.pathname !== before.url.pathname || entry.intent === 'navigation') dismissOverlays(0)\n const overlay = (entry.state as any)?.overlay\n if (!overlay || !pendingOverlays.has(overlay.name)) return\n pendingOverlays.delete(overlay.name)\n overlays.push({ ...overlay, key: entry.key, belowKey: before.key })\n store.dispatch({ type: UPDATE_VIEWPART, name: overlay.name, override: { show: true } })\n syncModal()\n}, false)\n\n/* An overlay hidden by any other way (a viewpart update, its removal) is closed: the stack is what is on screen. */\nstore.subscribe(() => {\n const viewparts = (store.getState() as any).layout?.viewparts || {}\n const hidden = overlays.find(overlay => !viewparts[overlay.name]?.show)\n if (hidden) closeOverlay(hidden.name)\n})\n\ndocument.addEventListener('keydown', event => {\n const top = overlays[overlays.length - 1]\n if (top?.escapable && (event.key === 'Escape' || event.key === 'Esc')) {\n event.preventDefault()\n closeOverlay(top.name)\n }\n})\n\nexport const openOverlay = (name: string, options?: any, silent?: boolean) => {\n /* store의 layout의 내용을 변경한다. */\n if (!silent && options) {\n store.dispatch({\n type: UPDATE_VIEWPART,\n name,\n override: options\n })\n }\n\n const request = new AbortController()\n pendingOverlays.set(name, request)\n void addressController()\n .pushOverlay(\n {\n ...(history.state || {}),\n overlay: { name, sequence: ++overlaySequence, escapable: options?.escapable !== false }\n },\n request.signal\n )\n .then(accepted => {\n if (accepted) return\n pendingOverlays.delete(name)\n store.dispatch({ type: UPDATE_VIEWPART, name, override: { show: false } })\n document.dispatchEvent(new CustomEvent('overlay-closed', { detail: name }))\n })\n}\n\nexport const closeOverlay = (name: string) => {\n const index = overlays.findIndex(overlay => overlay.name === name)\n if (index < 0) {\n const pending = pendingOverlays.get(name)\n pending?.abort()\n return !!pending\n }\n const overlay = overlays[index]\n dismissOverlays(index)\n // Back to the entry under the overlay only when nothing with another address was written above it. If something\n // was (a filter while the AI dock was open), the overlay is only hidden: going back would undo that write.\n if (addressController().unchangedSince(overlay.key)) addressController().traverseTo(overlay.belowKey)\n return true\n}\n\n/** The overlay on top of the ones open now, if any - what a back control in the app's own bar closes. */\nexport const topOverlay = (): string | undefined => overlays[overlays.length - 1]?.name\n\nexport const toggleOverlay = (name: string, options: any) => {\n var beforeOverlayName = overlays[overlays.length - 1]?.name\n\n if (beforeOverlayName == name) {\n closeOverlay(name)\n } else {\n openOverlay(name, options)\n }\n}\n\n/*\n * popup handling\n *\n * popup은 overlay의 특별한 형태이다.\n * popup은 open될 때, viewpart를 append 하며, close 될 때 viewpart를 remove 한다.\n * - name: '$popup-${popupSequence}'\n * - position: VIEWPART_POSITION_HEADERBAR\n * - hovering: 'center' | 'next' | 'edge'\n */\nvar popupSequence = 0\n\n/**\n * open popup in operato application environment\n *\n * @param {*} template html template to be rendered inside the popup\n * @param {PopupOptions} options\n * @returns the implementation handle. Callers get the full handle (with `result`) from `openPopup`.\n */\nconst openPopupInLayout = (template: TemplateResult, options: PopupOptions = {}): PopupImplementationHandle => {\n var name = `$popup-${popupSequence++}`\n\n appendViewpart({\n name,\n viewpart: {\n hovering: 'center',\n closable: true,\n movable: true,\n ...options,\n /* A popup is modal unless the caller asks for none: a window that works with what is behind it (a figure's fastening, pressed on the canvas) lays no backdrop. */\n backdrop: options.backdrop ?? true,\n show: false,\n temporary: true /* auto remove */,\n template\n },\n position: VIEWPART_POSITION.HEADERBAR\n })\n\n openOverlay(name, options, true)\n\n /* Typed, not cast: a cast would let a close() that forgets to answer compile. */\n var popup: PopupImplementationHandle = {\n name,\n close: () => {\n if (overlays[overlays.length - 1]?.name !== name && !pendingOverlays.has(name)) return false\n return closeOverlay(name)\n },\n closed: false\n }\n\n document.addEventListener('overlay-closed', function listener(e) {\n if (name == (e as CustomEvent).detail) {\n popup.closed = true\n popup.onclosed && popup.onclosed()\n document.removeEventListener('overlay-closed', listener)\n }\n })\n\n return popup\n}\n\nsetOpenPopupImplementation(openPopupInLayout)\n\n/*\n * The popup package's openPopup adds `result` and `close(result)` on top of whichever implementation is\n * registered, so the handle is built in one place. Re-exported here because most callers import\n * openPopup from @operato/layout.\n */\nexport const openPopup = openPopupWithResult\n"]}
@@ -115,6 +115,21 @@ describe('openPopup result - layout implementation', () => {
115
115
  expect(onclosedCalls()).to.equal(1);
116
116
  expect(backToMarker(), 'history went back exactly one step').to.equal(true);
117
117
  });
118
+ it('a popup asked for no backdrop lays none, and closes as any other; by default it lays one', async () => {
119
+ const plain = await open({ escapable: true });
120
+ expect(!!plain.overlay.backdrop, 'a backdrop by default').to.equal(true);
121
+ plain.handle.close('done');
122
+ await within(plain.handle.result);
123
+ await settleTurn();
124
+ const { handle, overlay, onclosedCalls, backToMarker } = await open({ escapable: true, backdrop: false });
125
+ expect(!!overlay.backdrop, 'no backdrop asked').to.equal(false);
126
+ expect(!!overlay.renderRoot.querySelector('#backdrop'), 'no backdrop element').to.equal(false);
127
+ handle.close('kept');
128
+ expect(await within(handle.result)).to.equal('kept');
129
+ await settleTurn();
130
+ expect(onclosedCalls()).to.equal(1);
131
+ expect(backToMarker(), 'history went back exactly one step').to.equal(true);
132
+ });
118
133
  it('the X button settles undefined', async () => {
119
134
  const { handle, overlay, onclosedCalls, backToMarker } = await open({ title: 'x' });
120
135
  const closer = overlay.renderRoot.querySelector('[closable][close]');
@@ -1 +1 @@
1
- {"version":3,"file":"popup-result.test.js","sourceRoot":"","sources":["../../test/popup-result.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing'\nimport { html } from 'lit'\n\nimport { store } from '@operato/shell'\nimport { closePopup } from '@operato/popup'\nimport type { OxFloatingOverlay } from '@operato/popup/ox-floating-overlay.js'\n\nimport { writeAddress } from '@operato/utils/address.js'\n\nimport '../src/index.js'\nimport { openPopup } from '../src/index.js'\n\n/**\n * The popup result settles exactly once, with the right value, whichever way the popup closes -\n * for the layout implementation, the one applications run.\n *\n * Here every close goes through history: the overlay pushes a state when it opens, and closing is\n * history.back(), which hides the temporary viewpart, which removes the overlay, which announces\n * `overlay-closed`. The same table runs for the default implementation in @operato/popup/test.\n */\n\nconst TIMEOUT = 'TIMEOUT'\n\nfunction within<T>(promise: Promise<T>, ms = 3000): Promise<T | typeof TIMEOUT> {\n return Promise.race([promise, new Promise<typeof TIMEOUT>(resolve => setTimeout(() => resolve(TIMEOUT), ms))])\n}\n\nconst settleTurn = (ms = 100) => new Promise(resolve => setTimeout(resolve, ms))\n\n/*\n * Stand in for the application shell's router: it calls the registered navigation callbacks on\n * popstate. The layout's overlay stack lives in one of those callbacks.\n */\nwindow.addEventListener('popstate', e => {\n const callbacks = ((store.getState() as any).route?.callbacks || []) as Array<(l: Location, e: Event) => void>\n callbacks.forEach(callback => callback(window.location, e))\n})\n\nasync function waitForOverlay(name: string): Promise<OxFloatingOverlay> {\n for (let i = 0; i < 50; i++) {\n const bar = document.querySelector('ox-header-bar') as (HTMLElement & { renderRoot: ParentNode }) | null\n const overlays = Array.from(bar?.renderRoot.querySelectorAll('ox-floating-overlay') ?? []) as OxFloatingOverlay[]\n const overlay = overlays.find(o => o.name === name)\n if (overlay) {\n await overlay.updateComplete\n return overlay\n }\n await settleTurn(20)\n }\n throw new Error(`overlay ${name} did not appear`)\n}\n\nlet markerSequence = 0\n\nasync function open(options = {}) {\n /* Closing must go back exactly one step - to this marker, not past it. */\n const marker = `before-popup-${markerSequence++}`\n /* Through the address layer, as every writer does: an entry written around it has no place it can trust. */\n await writeAddress(location.href, { state: { marker } })\n\n const handle = openPopup<string>(html`<div class=\"content\">content</div>`, options)\n let onclosedCalls = 0\n handle.onclosed = () => onclosedCalls++\n\n const overlay = await waitForOverlay(handle.name)\n\n return {\n handle,\n overlay,\n content: overlay.querySelector('.content') as HTMLElement,\n onclosedCalls: () => onclosedCalls,\n backToMarker: () => history.state?.marker === marker && !history.state?.overlay\n }\n}\n\ndescribe('openPopup result - layout implementation', () => {\n beforeEach(async () => {\n /*\n * A floor of history entries, so a close that goes back one step too far lands on this page\n * instead of leaving the test runner. Such an extra step still fails the test through\n * `history.length`-independent checks below: the next popup would not appear.\n */\n for (let i = 0; i < 5; i++) await writeAddress(location.href, { state: {} })\n await fixture(html`<ox-header-bar></ox-header-bar>`)\n })\n\n it('handle.close(value) settles with that value', async () => {\n const { handle, onclosedCalls, backToMarker } = await open()\n\n handle.close('saved')\n\n expect(await within(handle.result)).to.equal('saved')\n await settleTurn()\n expect(handle.closed).to.equal(true)\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('closePopup(element, value) from the content settles with that value', async () => {\n const { handle, content, onclosedCalls, backToMarker } = await open()\n\n closePopup(content, 'picked')\n\n expect(await within(handle.result)).to.equal('picked')\n await settleTurn()\n expect(handle.closed).to.equal(true)\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('history back settles undefined', async () => {\n const { handle, onclosedCalls, backToMarker } = await open()\n\n history.back()\n\n expect(await within(handle.result)).to.equal(undefined)\n await settleTurn()\n expect(handle.closed).to.equal(true)\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('ESC settles undefined', async () => {\n const { handle, onclosedCalls, backToMarker } = await open({ escapable: true })\n\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }))\n\n expect(await within(handle.result)).to.equal(undefined)\n await settleTurn()\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('backdrop click settles undefined', async () => {\n const { handle, overlay, onclosedCalls, backToMarker } = await open({ escapable: true })\n\n const backdrop = overlay.renderRoot.querySelector('#backdrop') as HTMLElement\n expect(backdrop, 'backdrop element').to.exist\n backdrop.click()\n\n expect(await within(handle.result)).to.equal(undefined)\n await settleTurn()\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('the X button settles undefined', async () => {\n const { handle, overlay, onclosedCalls, backToMarker } = await open({ title: 'x' })\n\n const closer = overlay.renderRoot.querySelector('[closable][close]') as HTMLElement\n expect(closer, 'close button').to.exist\n closer.click()\n\n expect(await within(handle.result)).to.equal(undefined)\n await settleTurn()\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('the first close request wins: closePopup then handle.close', async () => {\n const { handle, content, onclosedCalls, backToMarker } = await open()\n\n closePopup(content, 'first')\n handle.close('second')\n\n expect(await within(handle.result)).to.equal('first')\n await settleTurn()\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('a close request that closed nothing leaves no value behind', async () => {\n /*\n * A lower popup cannot close while another sits on top of it. Its close('ignored') does nothing -\n * and must not come back later as the result when the person dismisses that popup.\n */\n const lower = await open()\n const upper = await open()\n\n lower.handle.close('ignored')\n await settleTurn()\n expect(lower.handle.closed, 'the lower popup stays open').to.equal(false)\n\n upper.handle.close()\n expect(await within(upper.handle.result)).to.equal(undefined)\n await settleTurn()\n\n const closer = lower.overlay.renderRoot.querySelector('[closable][close]') as HTMLElement\n closer.click()\n\n expect(await within(lower.handle.result)).to.equal(undefined)\n })\n\n it('the first close request wins: handle.close then closePopup', async () => {\n const { handle, content, onclosedCalls, backToMarker } = await open()\n\n handle.close('first')\n closePopup(content, 'second')\n\n expect(await within(handle.result)).to.equal('first')\n await settleTurn()\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n})\n"]}
1
+ {"version":3,"file":"popup-result.test.js","sourceRoot":"","sources":["../../test/popup-result.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing'\nimport { html } from 'lit'\n\nimport { store } from '@operato/shell'\nimport { closePopup } from '@operato/popup'\nimport type { OxFloatingOverlay } from '@operato/popup/ox-floating-overlay.js'\n\nimport { writeAddress } from '@operato/utils/address.js'\n\nimport '../src/index.js'\nimport { openPopup } from '../src/index.js'\n\n/**\n * The popup result settles exactly once, with the right value, whichever way the popup closes -\n * for the layout implementation, the one applications run.\n *\n * Here every close goes through history: the overlay pushes a state when it opens, and closing is\n * history.back(), which hides the temporary viewpart, which removes the overlay, which announces\n * `overlay-closed`. The same table runs for the default implementation in @operato/popup/test.\n */\n\nconst TIMEOUT = 'TIMEOUT'\n\nfunction within<T>(promise: Promise<T>, ms = 3000): Promise<T | typeof TIMEOUT> {\n return Promise.race([promise, new Promise<typeof TIMEOUT>(resolve => setTimeout(() => resolve(TIMEOUT), ms))])\n}\n\nconst settleTurn = (ms = 100) => new Promise(resolve => setTimeout(resolve, ms))\n\n/*\n * Stand in for the application shell's router: it calls the registered navigation callbacks on\n * popstate. The layout's overlay stack lives in one of those callbacks.\n */\nwindow.addEventListener('popstate', e => {\n const callbacks = ((store.getState() as any).route?.callbacks || []) as Array<(l: Location, e: Event) => void>\n callbacks.forEach(callback => callback(window.location, e))\n})\n\nasync function waitForOverlay(name: string): Promise<OxFloatingOverlay> {\n for (let i = 0; i < 50; i++) {\n const bar = document.querySelector('ox-header-bar') as (HTMLElement & { renderRoot: ParentNode }) | null\n const overlays = Array.from(bar?.renderRoot.querySelectorAll('ox-floating-overlay') ?? []) as OxFloatingOverlay[]\n const overlay = overlays.find(o => o.name === name)\n if (overlay) {\n await overlay.updateComplete\n return overlay\n }\n await settleTurn(20)\n }\n throw new Error(`overlay ${name} did not appear`)\n}\n\nlet markerSequence = 0\n\nasync function open(options = {}) {\n /* Closing must go back exactly one step - to this marker, not past it. */\n const marker = `before-popup-${markerSequence++}`\n /* Through the address layer, as every writer does: an entry written around it has no place it can trust. */\n await writeAddress(location.href, { state: { marker } })\n\n const handle = openPopup<string>(html`<div class=\"content\">content</div>`, options)\n let onclosedCalls = 0\n handle.onclosed = () => onclosedCalls++\n\n const overlay = await waitForOverlay(handle.name)\n\n return {\n handle,\n overlay,\n content: overlay.querySelector('.content') as HTMLElement,\n onclosedCalls: () => onclosedCalls,\n backToMarker: () => history.state?.marker === marker && !history.state?.overlay\n }\n}\n\ndescribe('openPopup result - layout implementation', () => {\n beforeEach(async () => {\n /*\n * A floor of history entries, so a close that goes back one step too far lands on this page\n * instead of leaving the test runner. Such an extra step still fails the test through\n * `history.length`-independent checks below: the next popup would not appear.\n */\n for (let i = 0; i < 5; i++) await writeAddress(location.href, { state: {} })\n await fixture(html`<ox-header-bar></ox-header-bar>`)\n })\n\n it('handle.close(value) settles with that value', async () => {\n const { handle, onclosedCalls, backToMarker } = await open()\n\n handle.close('saved')\n\n expect(await within(handle.result)).to.equal('saved')\n await settleTurn()\n expect(handle.closed).to.equal(true)\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('closePopup(element, value) from the content settles with that value', async () => {\n const { handle, content, onclosedCalls, backToMarker } = await open()\n\n closePopup(content, 'picked')\n\n expect(await within(handle.result)).to.equal('picked')\n await settleTurn()\n expect(handle.closed).to.equal(true)\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('history back settles undefined', async () => {\n const { handle, onclosedCalls, backToMarker } = await open()\n\n history.back()\n\n expect(await within(handle.result)).to.equal(undefined)\n await settleTurn()\n expect(handle.closed).to.equal(true)\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('ESC settles undefined', async () => {\n const { handle, onclosedCalls, backToMarker } = await open({ escapable: true })\n\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }))\n\n expect(await within(handle.result)).to.equal(undefined)\n await settleTurn()\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('backdrop click settles undefined', async () => {\n const { handle, overlay, onclosedCalls, backToMarker } = await open({ escapable: true })\n\n const backdrop = overlay.renderRoot.querySelector('#backdrop') as HTMLElement\n expect(backdrop, 'backdrop element').to.exist\n backdrop.click()\n\n expect(await within(handle.result)).to.equal(undefined)\n await settleTurn()\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('a popup asked for no backdrop lays none, and closes as any other; by default it lays one', async () => {\n const plain = await open({ escapable: true })\n expect(!!plain.overlay.backdrop, 'a backdrop by default').to.equal(true)\n plain.handle.close('done')\n await within(plain.handle.result)\n await settleTurn()\n\n const { handle, overlay, onclosedCalls, backToMarker } = await open({ escapable: true, backdrop: false })\n expect(!!overlay.backdrop, 'no backdrop asked').to.equal(false)\n expect(!!overlay.renderRoot.querySelector('#backdrop'), 'no backdrop element').to.equal(false)\n handle.close('kept')\n expect(await within(handle.result)).to.equal('kept')\n await settleTurn()\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('the X button settles undefined', async () => {\n const { handle, overlay, onclosedCalls, backToMarker } = await open({ title: 'x' })\n\n const closer = overlay.renderRoot.querySelector('[closable][close]') as HTMLElement\n expect(closer, 'close button').to.exist\n closer.click()\n\n expect(await within(handle.result)).to.equal(undefined)\n await settleTurn()\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('the first close request wins: closePopup then handle.close', async () => {\n const { handle, content, onclosedCalls, backToMarker } = await open()\n\n closePopup(content, 'first')\n handle.close('second')\n\n expect(await within(handle.result)).to.equal('first')\n await settleTurn()\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n\n it('a close request that closed nothing leaves no value behind', async () => {\n /*\n * A lower popup cannot close while another sits on top of it. Its close('ignored') does nothing -\n * and must not come back later as the result when the person dismisses that popup.\n */\n const lower = await open()\n const upper = await open()\n\n lower.handle.close('ignored')\n await settleTurn()\n expect(lower.handle.closed, 'the lower popup stays open').to.equal(false)\n\n upper.handle.close()\n expect(await within(upper.handle.result)).to.equal(undefined)\n await settleTurn()\n\n const closer = lower.overlay.renderRoot.querySelector('[closable][close]') as HTMLElement\n closer.click()\n\n expect(await within(lower.handle.result)).to.equal(undefined)\n })\n\n it('the first close request wins: handle.close then closePopup', async () => {\n const { handle, content, onclosedCalls, backToMarker } = await open()\n\n handle.close('first')\n closePopup(content, 'second')\n\n expect(await within(handle.result)).to.equal('first')\n await settleTurn()\n expect(onclosedCalls()).to.equal(1)\n expect(backToMarker(), 'history went back exactly one step').to.equal(true)\n })\n})\n"]}