@operato/layout 10.29.68 → 10.29.70
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.
- package/CHANGELOG.md +29 -0
- package/dist/src/actions/entity360-door.d.ts +9 -18
- package/dist/src/actions/entity360-door.js +17 -24
- package/dist/src/actions/entity360-door.js.map +1 -1
- package/dist/src/actions/entity360-registry.js +6 -3
- package/dist/src/actions/entity360-registry.js.map +1 -1
- package/dist/src/actions/entity360.d.ts +2 -0
- package/dist/src/actions/entity360.js +6 -0
- package/dist/src/actions/entity360.js.map +1 -1
- package/dist/src/components/ox-entity360-dock.d.ts +0 -1
- package/dist/src/components/ox-entity360-dock.js +3 -3
- package/dist/src/components/ox-entity360-dock.js.map +1 -1
- package/dist/src/layouts/ox-nav-bar.js +6 -1
- package/dist/src/layouts/ox-nav-bar.js.map +1 -1
- package/dist/test/entity360-answer.test.d.ts +1 -0
- package/dist/test/entity360-answer.test.js +21 -0
- package/dist/test/entity360-answer.test.js.map +1 -0
- package/dist/test/entity360-kind.test.js +3 -2
- package/dist/test/entity360-kind.test.js.map +1 -1
- package/dist/test/entity360-section.test.js +1 -19
- package/dist/test/entity360-section.test.js.map +1 -1
- package/dist/test/entity360.test.js +3 -2
- package/dist/test/entity360.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -7
- package/test/entity360-answer.test.ts +25 -0
- package/test/entity360-kind.test.ts +2 -2
- package/test/entity360-section.test.ts +1 -19
- package/test/entity360.test.ts +3 -2
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { expect } from '@open-wc/testing';
|
|
2
|
+
import { entity360Answer } from '../src/actions/entity360-door.js';
|
|
3
|
+
/** A section that declared its query (ADR-0190) comes to rest in one of the four states, as a door's answer does. */
|
|
4
|
+
describe('entity360Answer', () => {
|
|
5
|
+
const pick = (data) => data === null || data === void 0 ? void 0 : data.invoice;
|
|
6
|
+
it('is undefined while the query first reads, and keeps what it holds while it reads again', () => {
|
|
7
|
+
expect(entity360Answer({ loading: true }, pick)).to.equal(undefined);
|
|
8
|
+
expect(entity360Answer({ loading: false }, pick)).to.equal(undefined);
|
|
9
|
+
expect(entity360Answer({ loading: true, data: { invoice: { id: 'a' } } }, pick)).to.deep.equal({ state: 'ready', data: { id: 'a' } });
|
|
10
|
+
});
|
|
11
|
+
it('is ready, or none when the door holds nothing', () => {
|
|
12
|
+
expect(entity360Answer({ loading: false, data: { invoice: { id: 'a' } } }, pick)).to.deep.equal({ state: 'ready', data: { id: 'a' } });
|
|
13
|
+
expect(entity360Answer({ loading: false, data: { invoice: null } }, pick)).to.deep.equal({ state: 'none', data: null });
|
|
14
|
+
});
|
|
15
|
+
it('keeps a refusal forbidden, and a request that threw failed with its message', () => {
|
|
16
|
+
const refused = { graphQLErrors: [{ message: 'no', extensions: { code: 'FORBIDDEN' } }] };
|
|
17
|
+
expect(entity360Answer({ loading: false, error: refused }, pick)).to.deep.equal({ state: 'forbidden' });
|
|
18
|
+
expect(entity360Answer({ loading: false, error: new TypeError('Failed to fetch') }, pick)).to.deep.equal({ state: 'failed', message: 'Failed to fetch' });
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=entity360-answer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity360-answer.test.js","sourceRoot":"","sources":["../../test/entity360-answer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAElE,qHAAqH;AACrH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,IAAI,GAAG,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAA;IAEzC,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAChG,MAAM,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACpE,MAAM,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACrE,MAAM,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IACvI,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QACtI,MAAM,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACzH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,CAAA;QACzF,MAAM,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;QACvG,MAAM,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAA;IAC3J,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import { expect } from '@open-wc/testing'\n\nimport { entity360Answer } from '../src/actions/entity360-door.js'\n\n/** A section that declared its query (ADR-0190) comes to rest in one of the four states, as a door's answer does. */\ndescribe('entity360Answer', () => {\n const pick = (data: any) => data?.invoice\n\n it('is undefined while the query first reads, and keeps what it holds while it reads again', () => {\n expect(entity360Answer({ loading: true }, pick)).to.equal(undefined)\n expect(entity360Answer({ loading: false }, pick)).to.equal(undefined)\n expect(entity360Answer({ loading: true, data: { invoice: { id: 'a' } } }, pick)).to.deep.equal({ state: 'ready', data: { id: 'a' } })\n })\n\n it('is ready, or none when the door holds nothing', () => {\n expect(entity360Answer({ loading: false, data: { invoice: { id: 'a' } } }, pick)).to.deep.equal({ state: 'ready', data: { id: 'a' } })\n expect(entity360Answer({ loading: false, data: { invoice: null } }, pick)).to.deep.equal({ state: 'none', data: null })\n })\n\n it('keeps a refusal forbidden, and a request that threw failed with its message', () => {\n const refused = { graphQLErrors: [{ message: 'no', extensions: { code: 'FORBIDDEN' } }] }\n expect(entity360Answer({ loading: false, error: refused }, pick)).to.deep.equal({ state: 'forbidden' })\n expect(entity360Answer({ loading: false, error: new TypeError('Failed to fetch') }, pick)).to.deep.equal({ state: 'failed', message: 'Failed to fetch' })\n })\n})\n"]}
|
|
@@ -3,7 +3,8 @@ import { html, render, LitElement } from 'lit';
|
|
|
3
3
|
import { OxPrompt } from '@operato/popup/ox-prompt.js';
|
|
4
4
|
import { store, UPDATE_CONTEXT } from '@operato/shell';
|
|
5
5
|
import '../src/index.js';
|
|
6
|
-
import { closeEntity360, entity360Link, onEntity360Change, openEntity360Kind, registerEntity360Kind, registerEntity360Section, setEntity360Value
|
|
6
|
+
import { closeEntity360, entity360Link, onEntity360Change, openEntity360Kind, registerEntity360Kind, registerEntity360Section, setEntity360Value } from '../src/index.js';
|
|
7
|
+
import { DRAFT_UNKEPT } from '@operato/shell';
|
|
7
8
|
/**
|
|
8
9
|
* A 360 opened by kind and id, the dock's own back trail, and the assistant subject it stands in for.
|
|
9
10
|
*
|
|
@@ -207,7 +208,7 @@ describe('entity 360 by kind', () => {
|
|
|
207
208
|
openEntity360Kind('kx-lot', { id: 'L-3', name: 'L-3' });
|
|
208
209
|
await settle();
|
|
209
210
|
const input = section().querySelector('input');
|
|
210
|
-
input.dispatchEvent(new CustomEvent(
|
|
211
|
+
input.dispatchEvent(new CustomEvent(DRAFT_UNKEPT, { bubbles: true, composed: true, detail: { unkept: true } }));
|
|
211
212
|
openEntity360Kind('kx-lot', { id: 'L-4', name: 'L-4' });
|
|
212
213
|
await settle();
|
|
213
214
|
expect(asked).to.equal(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity360-kind.test.js","sourceRoot":"","sources":["../../test/entity360-kind.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing'\nimport { html, render, LitElement } from 'lit'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { store, UPDATE_CONTEXT } from '@operato/shell'\nimport '../src/index.js'\nimport {\n closeEntity360,\n entity360Link,\n onEntity360Change,\n openEntity360Kind,\n registerEntity360Kind,\n registerEntity360Section,\n setEntity360Value,\n ENTITY360_UNKEPT,\n type Entity360Subject,\n type OxEntity360Dock\n} from '../src/index.js'\n\n/**\n * A 360 opened by kind and id, the dock's own back trail, and the assistant subject it stands in for.\n *\n * A screen often holds an identifier, not a typed value: a location inside a stock line, an order\n * inside a task's 360. It still opens the 360 of that kind, with the same link as entity360Name.\n * Opening is a step in the address (f=kind:id), so back - the dock's or the browser's - returns to the one before.\n */\n\nconst settle = () => new Promise(resolve => setTimeout(resolve, 50))\n/** Go back and wait for the address to arrive - a late popstate would land in the next test. */\nconst back = (go: () => void = () => history.back()) =>\n new Promise<void>(resolve => {\n window.addEventListener('popstate', () => setTimeout(resolve, 0), { once: true })\n go()\n })\nlet bar: HTMLElement\n/**\n * Links drawn straight into the page. `fixture` waits for an animation frame, and a page the runner keeps in the\n * background (files run side by side) may not get one before the test times out.\n */\nconst drawn = (template: unknown) => {\n const host = document.body.appendChild(document.createElement('div'))\n render(template, host)\n return host\n}\nconst dock = () => bar.shadowRoot!.querySelector('ox-entity360-dock') as OxEntity360Dock\nconst subject = () => (store.getState() as any).route?.context?.subject\nconst address = () => new URLSearchParams(location.search).get('f')\n\nregisterEntity360Kind({ kind: 'kx-order', typenames: [], title: s => `order ${s.id}`, assistantSubject: true })\nregisterEntity360Kind({ kind: 'kx-place', typenames: [], title: s => `place ${s.id}`, assistantSubject: true })\nregisterEntity360Kind({ kind: 'kx-quiet', typenames: [], title: s => `quiet ${s.id}` })\nregisterEntity360Kind({ kind: 'kx-late', typenames: [], title: s => s.value.name || s.id })\n\n/* A kind whose one identifier is its name, the way a lot is (ADR-0067 decision 6). */\nregisterEntity360Kind({ kind: 'kx-lot', typenames: ['KxLot'], id: value => value.name, title: s => s.value.name || s.id })\n\n/** A section the way modules write one: it takes the subject and reads whenever the subject changes. */\nconst reads: { section: Element; subject: Entity360Subject }[] = []\nclass KxSection extends LitElement {\n static properties = { subject: { attribute: false } }\n subject?: Entity360Subject\n createRenderRoot() {\n return this\n }\n updated(changed: Map<string, unknown>) {\n if (changed.has('subject') && this.subject) reads.push({ section: this, subject: this.subject })\n }\n render() {\n return html`<input />`\n }\n}\ncustomElements.define('kx-section', KxSection)\nregisterEntity360Section('kx-lot', { name: 'facts', render: subject => html`<kx-section .subject=${subject}></kx-section>` })\nconst section = () => dock().shadowRoot!.querySelector('ox-entity360-content')!.shadowRoot!.querySelector('kx-section') as KxSection\n\ndescribe('entity 360 by kind', () => {\n beforeEach(async () => {\n history.replaceState(null, '', location.pathname)\n bar = await fixture(html`<ox-aside-bar></ox-aside-bar>`)\n store.dispatch({ type: UPDATE_CONTEXT, context: { title: 'page', subject: { type: 'page', id: 'P' } } })\n })\n afterEach(() => dock()?.view?.onClose())\n\n it('★ an identifier of a registered kind is the same link as a name; an unregistered one stays text', async () => {\n const host = document.createElement('div')\n render(html`${entity360Link('kx-order', 'SO-1')}|${entity360Link('nobody', 'X-1')}|${entity360Link('kx-order', '')}`, host)\n\n const anchors = host.querySelectorAll('a[data-entity360]')\n expect(anchors.length).to.equal(1)\n expect(anchors[0].textContent).to.equal('SO-1')\n expect(host.textContent).to.include('X-1')\n })\n\n it('★ a click on the link opens that kind with that id', async () => {\n const host = drawn(html`${entity360Link('kx-order', 'SO-2')}`)\n ;(host.querySelector('a') as HTMLElement).click()\n await settle()\n\n expect(dock().view!.title).to.equal('order SO-2')\n })\n\n it('★ opening is a step in the address; back returns to the 360 before', async () => {\n openEntity360Kind('kx-order', { id: 'SO-3' })\n await settle()\n expect(address()).to.equal('kx-order:SO-3')\n expect(dock().view!.onBack).to.equal(undefined)\n\n openEntity360Kind('kx-place', { id: 'L-1' })\n await settle()\n expect(address()).to.equal('kx-place:L-1')\n\n await back(() => dock().view!.onBack!())\n expect(dock().view!.title).to.equal('order SO-3')\n expect(address()).to.equal('kx-order:SO-3')\n })\n\n it('★ an id with colons (an EPC) survives the address', async () => {\n openEntity360Kind('kx-order', { id: 'SO-6' })\n await settle()\n openEntity360Kind('kx-place', { id: 'urn:epc:id:sgln:0614141.00001.0' })\n await settle()\n openEntity360Kind('kx-order', { id: 'SO-7' })\n await settle()\n /* Back only from a step this test took - otherwise it would leave the test page. */\n expect(address()).to.equal('kx-order:SO-7')\n expect(dock().view!.onBack).to.be.a('function')\n\n await back()\n expect(dock().view!.title).to.equal('place urn:epc:id:sgln:0614141.00001.0')\n })\n\n it('★ closing leaves the address without a 360', async () => {\n openEntity360Kind('kx-order', { id: 'SO-4' })\n await settle()\n dock().view!.onClose()\n await settle()\n\n expect(address()).to.equal(null)\n expect(dock()).to.equal(null)\n })\n\n it('★ while open, the 360 is the page subject; closing gives the page its own back', async () => {\n openEntity360Kind('kx-order', { id: 'SO-5' })\n await settle()\n expect(subject()).to.deep.equal({ type: 'kx-order', id: 'SO-5' })\n\n openEntity360Kind('kx-place', { id: 'L-3' })\n await settle()\n expect(subject()).to.deep.equal({ type: 'kx-place', id: 'L-3' })\n\n dock().view!.onClose()\n await settle()\n expect(subject()).to.deep.equal({ type: 'page', id: 'P' })\n })\n\n it('a kind that does not stand in for the page leaves the page subject alone', async () => {\n openEntity360Kind('kx-quiet', { id: 'Q-1' })\n await settle()\n expect(subject()).to.deep.equal({ type: 'page', id: 'P' })\n })\n\n it('★ an app hears what the dock shows - open, back, and close', async () => {\n const heard: (Entity360Subject | undefined)[] = []\n const stop = onEntity360Change(subject => heard.push(subject))\n\n openEntity360Kind('kx-order', { id: 'SO-8' })\n await settle()\n openEntity360Kind('kx-place', { id: 'L-8' })\n await settle()\n await back(() => dock().view!.onBack!())\n dock().view!.onClose()\n await settle()\n stop()\n\n expect(heard.map(one => (one ? `${one.kind}:${one.id}` : 'closed'))).to.deep.equal(['kx-order:SO-8', 'kx-place:L-8', 'kx-order:SO-8', 'closed'])\n })\n\n it('an app that let go of its selection closes the 360 and its step', async () => {\n openEntity360Kind('kx-order', { id: 'SO-9' })\n await settle()\n closeEntity360()\n await settle()\n\n expect(dock()).to.equal(null)\n expect(address()).to.equal(null)\n })\n\n it('★ what a section reads names the subject: the heading is drawn from it, the sections stay', async () => {\n openEntity360Kind('kx-lot', { id: 'L-9', name: 'L-9' })\n await settle()\n expect(dock().view!.title).to.equal('L-9')\n const first = section()\n\n setEntity360Value({ kind: 'kx-lot', id: 'L-9' }, { name: 'L-9', definitionId: 'M-1' })\n openEntity360Kind('kx-late', { id: 'X-9' })\n await settle()\n expect(dock().view!.title).to.equal('X-9')\n setEntity360Value({ kind: 'kx-late', id: 'X-9' }, { name: 'named later' })\n await settle()\n expect(dock().view!.title).to.equal('named later')\n expect(first.isConnected).to.equal(false)\n })\n\n it('★ a kind that declares its identifier: a typed value, a link and the address all open the same subject', async () => {\n reads.length = 0\n const host = drawn(html`${entity360Link('kx-lot', 'L-1')}`)\n ;(host.querySelector('a') as HTMLElement).click()\n await settle()\n expect(address()).to.equal('kx-lot:L-1')\n dock().view!.onClose()\n await settle()\n\n openEntity360Kind('kx-lot', { __typename: 'KxLot', id: '0c9e-uuid', name: 'L-1' })\n await settle()\n expect(address()).to.equal('kx-lot:L-1')\n expect(reads.map(read => read.subject.id)).to.deep.equal(['L-1', 'L-1'])\n })\n\n it('★ a shared link brings only the id - the sections still read by it', async () => {\n reads.length = 0\n const url = new URL(location.href)\n url.searchParams.set('f', 'kx-lot:L-shared')\n history.pushState(null, '', url)\n window.dispatchEvent(new PopStateEvent('popstate', { state: null }))\n await settle()\n expect(dock().view!.title).to.equal('L-shared')\n expect(reads[reads.length - 1]?.subject).to.deep.include({ kind: 'kx-lot', id: 'L-shared' })\n expect(reads[reads.length - 1]?.subject.value).to.deep.equal({ id: 'L-shared' })\n })\n\n it('★ refresh gives the sections a new subject of the same id; they read again and are not made anew', async () => {\n openEntity360Kind('kx-lot', { id: 'L-2', name: 'L-2' })\n await settle()\n const before = section()\n const input = before.querySelector('input')!\n input.value = 'typed'\n reads.length = 0\n dock().view!.onRefresh!()\n await settle()\n expect(section()).to.equal(before)\n expect(input.value).to.equal('typed')\n expect(reads.length).to.equal(1)\n expect(reads[0].subject.id).to.equal('L-2')\n })\n\n it('★ leaving a subject whose entry no draft keeps is asked about; keeping it stays put', async () => {\n const open = OxPrompt.open\n let asked = 0\n let answer = false\n ;(OxPrompt as any).open = async () => (asked++, answer)\n try {\n openEntity360Kind('kx-lot', { id: 'L-3', name: 'L-3' })\n await settle()\n const input = section().querySelector('input')!\n input.dispatchEvent(new CustomEvent(ENTITY360_UNKEPT, { bubbles: true, composed: true, detail: { unkept: true } }))\n\n openEntity360Kind('kx-lot', { id: 'L-4', name: 'L-4' })\n await settle()\n expect(asked).to.equal(1)\n expect(address()).to.equal('kx-lot:L-3')\n expect(input.isConnected).to.equal(true)\n\n answer = true\n openEntity360Kind('kx-lot', { id: 'L-4', name: 'L-4' })\n await settle()\n expect(asked).to.equal(2)\n expect(address()).to.equal('kx-lot:L-4')\n } finally {\n ;(OxPrompt as any).open = open\n }\n })\n\n it('★ opening the subject already shown does not hand the sections a new subject', async () => {\n const url = new URL(location.href)\n url.searchParams.set('f', 'kx-lot:L-7')\n history.pushState(null, '', url)\n window.dispatchEvent(new PopStateEvent('popstate', { state: null }))\n await settle()\n reads.length = 0\n openEntity360Kind('kx-lot', { id: 'L-7', name: 'L-7' })\n await settle()\n expect(reads.length).to.equal(0)\n })\n\n it('a kept entry - or none - is left without a question', async () => {\n const open = OxPrompt.open\n let asked = 0\n ;(OxPrompt as any).open = async () => (asked++, false)\n try {\n openEntity360Kind('kx-lot', { id: 'L-5', name: 'L-5' })\n await settle()\n openEntity360Kind('kx-lot', { id: 'L-6', name: 'L-6' })\n await settle()\n expect(asked).to.equal(0)\n expect(address()).to.equal('kx-lot:L-6')\n } finally {\n ;(OxPrompt as any).open = open\n }\n })\n\n it('a link carries more for the sections, beside the id', async () => {\n const heard: (Entity360Subject | undefined)[] = []\n const stop = onEntity360Change(subject => heard.push(subject))\n const host = drawn(html`${entity360Link('kx-order', 'SO-10', undefined, { instanceId: 'twin-2' })}`)\n ;(host.querySelector('a') as HTMLElement).click()\n await settle()\n stop()\n\n expect(heard[0]?.value).to.include({ id: 'SO-10', instanceId: 'twin-2' })\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"entity360-kind.test.js","sourceRoot":"","sources":["../../test/entity360-kind.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing'\nimport { html, render, LitElement } from 'lit'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { store, UPDATE_CONTEXT } from '@operato/shell'\nimport '../src/index.js'\nimport {\n closeEntity360,\n entity360Link,\n onEntity360Change,\n openEntity360Kind,\n registerEntity360Kind,\n registerEntity360Section,\n setEntity360Value,\n type Entity360Subject,\n type OxEntity360Dock\n} from '../src/index.js'\nimport { DRAFT_UNKEPT } from '@operato/shell'\n\n/**\n * A 360 opened by kind and id, the dock's own back trail, and the assistant subject it stands in for.\n *\n * A screen often holds an identifier, not a typed value: a location inside a stock line, an order\n * inside a task's 360. It still opens the 360 of that kind, with the same link as entity360Name.\n * Opening is a step in the address (f=kind:id), so back - the dock's or the browser's - returns to the one before.\n */\n\nconst settle = () => new Promise(resolve => setTimeout(resolve, 50))\n/** Go back and wait for the address to arrive - a late popstate would land in the next test. */\nconst back = (go: () => void = () => history.back()) =>\n new Promise<void>(resolve => {\n window.addEventListener('popstate', () => setTimeout(resolve, 0), { once: true })\n go()\n })\nlet bar: HTMLElement\n/**\n * Links drawn straight into the page. `fixture` waits for an animation frame, and a page the runner keeps in the\n * background (files run side by side) may not get one before the test times out.\n */\nconst drawn = (template: unknown) => {\n const host = document.body.appendChild(document.createElement('div'))\n render(template, host)\n return host\n}\nconst dock = () => bar.shadowRoot!.querySelector('ox-entity360-dock') as OxEntity360Dock\nconst subject = () => (store.getState() as any).route?.context?.subject\nconst address = () => new URLSearchParams(location.search).get('f')\n\nregisterEntity360Kind({ kind: 'kx-order', typenames: [], title: s => `order ${s.id}`, assistantSubject: true })\nregisterEntity360Kind({ kind: 'kx-place', typenames: [], title: s => `place ${s.id}`, assistantSubject: true })\nregisterEntity360Kind({ kind: 'kx-quiet', typenames: [], title: s => `quiet ${s.id}` })\nregisterEntity360Kind({ kind: 'kx-late', typenames: [], title: s => s.value.name || s.id })\n\n/* A kind whose one identifier is its name, the way a lot is (ADR-0067 decision 6). */\nregisterEntity360Kind({ kind: 'kx-lot', typenames: ['KxLot'], id: value => value.name, title: s => s.value.name || s.id })\n\n/** A section the way modules write one: it takes the subject and reads whenever the subject changes. */\nconst reads: { section: Element; subject: Entity360Subject }[] = []\nclass KxSection extends LitElement {\n static properties = { subject: { attribute: false } }\n subject?: Entity360Subject\n createRenderRoot() {\n return this\n }\n updated(changed: Map<string, unknown>) {\n if (changed.has('subject') && this.subject) reads.push({ section: this, subject: this.subject })\n }\n render() {\n return html`<input />`\n }\n}\ncustomElements.define('kx-section', KxSection)\nregisterEntity360Section('kx-lot', { name: 'facts', render: subject => html`<kx-section .subject=${subject}></kx-section>` })\nconst section = () => dock().shadowRoot!.querySelector('ox-entity360-content')!.shadowRoot!.querySelector('kx-section') as KxSection\n\ndescribe('entity 360 by kind', () => {\n beforeEach(async () => {\n history.replaceState(null, '', location.pathname)\n bar = await fixture(html`<ox-aside-bar></ox-aside-bar>`)\n store.dispatch({ type: UPDATE_CONTEXT, context: { title: 'page', subject: { type: 'page', id: 'P' } } })\n })\n afterEach(() => dock()?.view?.onClose())\n\n it('★ an identifier of a registered kind is the same link as a name; an unregistered one stays text', async () => {\n const host = document.createElement('div')\n render(html`${entity360Link('kx-order', 'SO-1')}|${entity360Link('nobody', 'X-1')}|${entity360Link('kx-order', '')}`, host)\n\n const anchors = host.querySelectorAll('a[data-entity360]')\n expect(anchors.length).to.equal(1)\n expect(anchors[0].textContent).to.equal('SO-1')\n expect(host.textContent).to.include('X-1')\n })\n\n it('★ a click on the link opens that kind with that id', async () => {\n const host = drawn(html`${entity360Link('kx-order', 'SO-2')}`)\n ;(host.querySelector('a') as HTMLElement).click()\n await settle()\n\n expect(dock().view!.title).to.equal('order SO-2')\n })\n\n it('★ opening is a step in the address; back returns to the 360 before', async () => {\n openEntity360Kind('kx-order', { id: 'SO-3' })\n await settle()\n expect(address()).to.equal('kx-order:SO-3')\n expect(dock().view!.onBack).to.equal(undefined)\n\n openEntity360Kind('kx-place', { id: 'L-1' })\n await settle()\n expect(address()).to.equal('kx-place:L-1')\n\n await back(() => dock().view!.onBack!())\n expect(dock().view!.title).to.equal('order SO-3')\n expect(address()).to.equal('kx-order:SO-3')\n })\n\n it('★ an id with colons (an EPC) survives the address', async () => {\n openEntity360Kind('kx-order', { id: 'SO-6' })\n await settle()\n openEntity360Kind('kx-place', { id: 'urn:epc:id:sgln:0614141.00001.0' })\n await settle()\n openEntity360Kind('kx-order', { id: 'SO-7' })\n await settle()\n /* Back only from a step this test took - otherwise it would leave the test page. */\n expect(address()).to.equal('kx-order:SO-7')\n expect(dock().view!.onBack).to.be.a('function')\n\n await back()\n expect(dock().view!.title).to.equal('place urn:epc:id:sgln:0614141.00001.0')\n })\n\n it('★ closing leaves the address without a 360', async () => {\n openEntity360Kind('kx-order', { id: 'SO-4' })\n await settle()\n dock().view!.onClose()\n await settle()\n\n expect(address()).to.equal(null)\n expect(dock()).to.equal(null)\n })\n\n it('★ while open, the 360 is the page subject; closing gives the page its own back', async () => {\n openEntity360Kind('kx-order', { id: 'SO-5' })\n await settle()\n expect(subject()).to.deep.equal({ type: 'kx-order', id: 'SO-5' })\n\n openEntity360Kind('kx-place', { id: 'L-3' })\n await settle()\n expect(subject()).to.deep.equal({ type: 'kx-place', id: 'L-3' })\n\n dock().view!.onClose()\n await settle()\n expect(subject()).to.deep.equal({ type: 'page', id: 'P' })\n })\n\n it('a kind that does not stand in for the page leaves the page subject alone', async () => {\n openEntity360Kind('kx-quiet', { id: 'Q-1' })\n await settle()\n expect(subject()).to.deep.equal({ type: 'page', id: 'P' })\n })\n\n it('★ an app hears what the dock shows - open, back, and close', async () => {\n const heard: (Entity360Subject | undefined)[] = []\n const stop = onEntity360Change(subject => heard.push(subject))\n\n openEntity360Kind('kx-order', { id: 'SO-8' })\n await settle()\n openEntity360Kind('kx-place', { id: 'L-8' })\n await settle()\n await back(() => dock().view!.onBack!())\n dock().view!.onClose()\n await settle()\n stop()\n\n expect(heard.map(one => (one ? `${one.kind}:${one.id}` : 'closed'))).to.deep.equal(['kx-order:SO-8', 'kx-place:L-8', 'kx-order:SO-8', 'closed'])\n })\n\n it('an app that let go of its selection closes the 360 and its step', async () => {\n openEntity360Kind('kx-order', { id: 'SO-9' })\n await settle()\n closeEntity360()\n await settle()\n\n expect(dock()).to.equal(null)\n expect(address()).to.equal(null)\n })\n\n it('★ what a section reads names the subject: the heading is drawn from it, the sections stay', async () => {\n openEntity360Kind('kx-lot', { id: 'L-9', name: 'L-9' })\n await settle()\n expect(dock().view!.title).to.equal('L-9')\n const first = section()\n\n setEntity360Value({ kind: 'kx-lot', id: 'L-9' }, { name: 'L-9', definitionId: 'M-1' })\n openEntity360Kind('kx-late', { id: 'X-9' })\n await settle()\n expect(dock().view!.title).to.equal('X-9')\n setEntity360Value({ kind: 'kx-late', id: 'X-9' }, { name: 'named later' })\n await settle()\n expect(dock().view!.title).to.equal('named later')\n expect(first.isConnected).to.equal(false)\n })\n\n it('★ a kind that declares its identifier: a typed value, a link and the address all open the same subject', async () => {\n reads.length = 0\n const host = drawn(html`${entity360Link('kx-lot', 'L-1')}`)\n ;(host.querySelector('a') as HTMLElement).click()\n await settle()\n expect(address()).to.equal('kx-lot:L-1')\n dock().view!.onClose()\n await settle()\n\n openEntity360Kind('kx-lot', { __typename: 'KxLot', id: '0c9e-uuid', name: 'L-1' })\n await settle()\n expect(address()).to.equal('kx-lot:L-1')\n expect(reads.map(read => read.subject.id)).to.deep.equal(['L-1', 'L-1'])\n })\n\n it('★ a shared link brings only the id - the sections still read by it', async () => {\n reads.length = 0\n const url = new URL(location.href)\n url.searchParams.set('f', 'kx-lot:L-shared')\n history.pushState(null, '', url)\n window.dispatchEvent(new PopStateEvent('popstate', { state: null }))\n await settle()\n expect(dock().view!.title).to.equal('L-shared')\n expect(reads[reads.length - 1]?.subject).to.deep.include({ kind: 'kx-lot', id: 'L-shared' })\n expect(reads[reads.length - 1]?.subject.value).to.deep.equal({ id: 'L-shared' })\n })\n\n it('★ refresh gives the sections a new subject of the same id; they read again and are not made anew', async () => {\n openEntity360Kind('kx-lot', { id: 'L-2', name: 'L-2' })\n await settle()\n const before = section()\n const input = before.querySelector('input')!\n input.value = 'typed'\n reads.length = 0\n dock().view!.onRefresh!()\n await settle()\n expect(section()).to.equal(before)\n expect(input.value).to.equal('typed')\n expect(reads.length).to.equal(1)\n expect(reads[0].subject.id).to.equal('L-2')\n })\n\n it('★ leaving a subject whose entry no draft keeps is asked about; keeping it stays put', async () => {\n const open = OxPrompt.open\n let asked = 0\n let answer = false\n ;(OxPrompt as any).open = async () => (asked++, answer)\n try {\n openEntity360Kind('kx-lot', { id: 'L-3', name: 'L-3' })\n await settle()\n const input = section().querySelector('input')!\n input.dispatchEvent(new CustomEvent(DRAFT_UNKEPT, { bubbles: true, composed: true, detail: { unkept: true } }))\n\n openEntity360Kind('kx-lot', { id: 'L-4', name: 'L-4' })\n await settle()\n expect(asked).to.equal(1)\n expect(address()).to.equal('kx-lot:L-3')\n expect(input.isConnected).to.equal(true)\n\n answer = true\n openEntity360Kind('kx-lot', { id: 'L-4', name: 'L-4' })\n await settle()\n expect(asked).to.equal(2)\n expect(address()).to.equal('kx-lot:L-4')\n } finally {\n ;(OxPrompt as any).open = open\n }\n })\n\n it('★ opening the subject already shown does not hand the sections a new subject', async () => {\n const url = new URL(location.href)\n url.searchParams.set('f', 'kx-lot:L-7')\n history.pushState(null, '', url)\n window.dispatchEvent(new PopStateEvent('popstate', { state: null }))\n await settle()\n reads.length = 0\n openEntity360Kind('kx-lot', { id: 'L-7', name: 'L-7' })\n await settle()\n expect(reads.length).to.equal(0)\n })\n\n it('a kept entry - or none - is left without a question', async () => {\n const open = OxPrompt.open\n let asked = 0\n ;(OxPrompt as any).open = async () => (asked++, false)\n try {\n openEntity360Kind('kx-lot', { id: 'L-5', name: 'L-5' })\n await settle()\n openEntity360Kind('kx-lot', { id: 'L-6', name: 'L-6' })\n await settle()\n expect(asked).to.equal(0)\n expect(address()).to.equal('kx-lot:L-6')\n } finally {\n ;(OxPrompt as any).open = open\n }\n })\n\n it('a link carries more for the sections, beside the id', async () => {\n const heard: (Entity360Subject | undefined)[] = []\n const stop = onEntity360Change(subject => heard.push(subject))\n const host = drawn(html`${entity360Link('kx-order', 'SO-10', undefined, { instanceId: 'twin-2' })}`)\n ;(host.querySelector('a') as HTMLElement).click()\n await settle()\n stop()\n\n expect(heard[0]?.value).to.include({ id: 'SO-10', instanceId: 'twin-2' })\n })\n})\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { expect, fixture } from '@open-wc/testing';
|
|
2
2
|
import { html } from 'lit';
|
|
3
3
|
import '../src/index.js';
|
|
4
|
-
import { askEntity360Door,
|
|
4
|
+
import { askEntity360Door, readEntity360Door } from '../src/index.js';
|
|
5
5
|
/**
|
|
6
6
|
* A 360 section says what its door answered (ADR-0067): something, nothing, may-not-see, or failed.
|
|
7
7
|
* The axis that matters is the second against the third - a refused viewer must not be told "none".
|
|
@@ -16,24 +16,6 @@ describe('entity 360 door', () => {
|
|
|
16
16
|
const thrown = Object.assign(new Error('not allowed'), { graphQLErrors: refused.errors });
|
|
17
17
|
expect((await askEntity360Door(Promise.reject(thrown), d => d === null || d === void 0 ? void 0 : d.items)).state).to.equal('forbidden');
|
|
18
18
|
});
|
|
19
|
-
it('★ only the newest read answers - a second read of the same id drops the first', async () => {
|
|
20
|
-
var _a;
|
|
21
|
-
const reads = new Entity360Reads();
|
|
22
|
-
let release;
|
|
23
|
-
const first = reads.ask(() => new Promise(resolve => (release = resolve)), d => d.items);
|
|
24
|
-
const second = reads.ask(() => Promise.resolve({ data: { items: [2] } }), d => d.items);
|
|
25
|
-
release({ data: { items: [1] } });
|
|
26
|
-
expect(await first).to.equal(undefined);
|
|
27
|
-
expect((_a = (await second)) === null || _a === void 0 ? void 0 : _a.data).to.deep.equal([2]);
|
|
28
|
-
});
|
|
29
|
-
it('a read that throws synchronously still ends failed; forget drops one on its way', async () => {
|
|
30
|
-
var _a;
|
|
31
|
-
const reads = new Entity360Reads();
|
|
32
|
-
expect((_a = (await reads.ask(() => { throw new Error('no client'); }, d => d))) === null || _a === void 0 ? void 0 : _a.state).to.equal('failed');
|
|
33
|
-
const pending = reads.ask(() => Promise.resolve({ data: { items: [1] } }), d => d.items);
|
|
34
|
-
reads.forget();
|
|
35
|
-
expect(await pending).to.equal(undefined);
|
|
36
|
-
});
|
|
37
19
|
it('a request that answers is read as readEntity360Door reads it', async () => {
|
|
38
20
|
expect((await askEntity360Door(Promise.resolve({ data: { items: [] } }), d => d.items)).state).to.equal('none');
|
|
39
21
|
expect((await askEntity360Door(Promise.resolve({ data: { items: [1] } }), d => d.items)).data).to.deep.equal([1]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity360-section.test.js","sourceRoot":"","sources":["../../test/entity360-section.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing'\nimport { html } from 'lit'\nimport '../src/index.js'\nimport { askEntity360Door, Entity360Reads, readEntity360Door, type OxEntity360Section } from '../src/index.js'\n\n/**\n * A 360 section says what its door answered (ADR-0067): something, nothing, may-not-see, or failed.\n * The axis that matters is the second against the third - a refused viewer must not be told \"none\".\n */\n\nconst refused = { data: null, errors: [{ message: 'not allowed', extensions: { code: 'FORBIDDEN' } }] }\n\ndescribe('entity 360 door', () => {\n it('★ a request that throws is failed, with its own message - never left loading (ADR-0067 decision 7)', async () => {\n const answer = await askEntity360Door(Promise.reject(new Error('Failed to fetch')), d => d?.items)\n expect(answer).to.deep.equal({ state: 'failed', message: 'Failed to fetch' })\n })\n\n it('★ a client that throws on a refusal still says forbidden', async () => {\n const thrown = Object.assign(new Error('not allowed'), { graphQLErrors: refused.errors })\n expect((await askEntity360Door(Promise.reject(thrown), d => d?.items)).state).to.equal('forbidden')\n })\n\n it('★ only the newest read answers - a second read of the same id drops the first', async () => {\n const reads = new Entity360Reads()\n let release!: (value: any) => void\n const first = reads.ask(() => new Promise(resolve => (release = resolve)), d => d.items)\n const second = reads.ask(() => Promise.resolve({ data: { items: [2] } }), d => d.items)\n release({ data: { items: [1] } })\n expect(await first).to.equal(undefined)\n expect((await second)?.data).to.deep.equal([2])\n })\n\n it('a read that throws synchronously still ends failed; forget drops one on its way', async () => {\n const reads = new Entity360Reads()\n expect((await reads.ask(() => { throw new Error('no client') }, d => d))?.state).to.equal('failed')\n const pending = reads.ask(() => Promise.resolve({ data: { items: [1] } }), d => d.items)\n reads.forget()\n expect(await pending).to.equal(undefined)\n })\n\n it('a request that answers is read as readEntity360Door reads it', async () => {\n expect((await askEntity360Door(Promise.resolve({ data: { items: [] } }), d => d.items)).state).to.equal('none')\n expect((await askEntity360Door(Promise.resolve({ data: { items: [1] } }), d => d.items)).data).to.deep.equal([1])\n })\n\n it('★ a refusal is forbidden, not none - even when data came back empty beside it', () => {\n expect(readEntity360Door(refused, d => d?.items).state).to.equal('forbidden')\n expect(readEntity360Door({ ...refused, data: { items: [] } }, d => d.items).state).to.equal('forbidden')\n })\n\n it('★ an answer with nothing in it is none', () => {\n expect(readEntity360Door({ data: { items: [] } }, d => d.items).state).to.equal('none')\n expect(readEntity360Door({ data: { one: null } }, d => d.one).state).to.equal('none')\n })\n\n it('an answer with something is ready and carries it', () => {\n const answer = readEntity360Door({ data: { items: [1] } }, d => d.items)\n expect(answer).to.deep.equal({ state: 'ready', data: [1] })\n })\n\n it('any other error is failed and keeps the server sentence', () => {\n const answer = readEntity360Door({ data: null, errors: [{ message: 'db down' }] }, d => d)\n expect(answer).to.deep.equal({ state: 'failed', message: 'db down' })\n expect(readEntity360Door(undefined, d => d).state).to.equal('failed')\n })\n\n it('a section decides for itself what empty means', () => {\n const zero = readEntity360Door({ data: { n: { a: 0 } } }, d => d.n, n => n.a === 0)\n expect(zero.state).to.equal('none')\n })\n})\n\ndescribe('ox-entity360-section', () => {\n const said = (el: OxEntity360Section) => el.shadowRoot!.querySelector('p')?.dataset.state\n\n it('★ draws the slot only when ready', async () => {\n const el = await fixture<OxEntity360Section>(\n html`<ox-entity360-section heading=\"h\" state=\"forbidden\"><span>secret</span></ox-entity360-section>`\n )\n expect(said(el)).to.equal('forbidden')\n expect(el.shadowRoot!.querySelector('slot')).to.equal(null)\n\n el.state = 'ready'\n await el.updateComplete\n expect(el.shadowRoot!.querySelector('slot')).to.not.equal(null)\n })\n\n it('says none, loading and failed apart', async () => {\n const el = await fixture<OxEntity360Section>(html`<ox-entity360-section heading=\"h\"></ox-entity360-section>`)\n expect(said(el)).to.equal('loading')\n el.state = 'none'\n await el.updateComplete\n expect(said(el)).to.equal('none')\n el.state = 'failed'\n el.message = 'db down'\n await el.updateComplete\n expect(el.shadowRoot!.querySelector('p')!.textContent!.trim()).to.equal('db down')\n el.message = ''\n await el.updateComplete\n expect(el.shadowRoot!.querySelector('p')!.textContent!.trim()).to.not.equal('')\n })\n})\n\ndescribe('entity 360 section as a drop area', () => {\n it('shows where a dragged file would land, and only then', async () => {\n const section = (await fixture(html`<ox-entity360-section heading=\"papers\" state=\"ready\"></ox-entity360-section>`)) as OxEntity360Section\n section.style.setProperty('--md-sys-color-primary', 'rgb(0, 0, 255)')\n\n expect(getComputedStyle(section).outlineStyle).to.equal('none')\n\n section.classList.add('candrop')\n expect(getComputedStyle(section).outlineStyle, 'no mark while a file is over it').to.equal('dashed')\n\n section.classList.remove('candrop')\n expect(getComputedStyle(section).outlineStyle).to.equal('none')\n })\n})\n\ndescribe('entity 360 section heading', () => {\n it('keeps the heading level with an action that grows a second line', async () => {\n const section = (await fixture(html`<ox-entity360-section heading=\"papers\" state=\"ready\">\n <span slot=\"actions\" style=\"display: inline-flex; flex-wrap: wrap; width: 120px\">\n <button style=\"height: 26px\">attach</button>\n </span>\n </ox-entity360-section>`)) as OxEntity360Section\n\n const heading = section.shadowRoot!.querySelector('h3')!\n const actions = section.querySelector('[slot=\"actions\"]') as HTMLElement\n const before = heading.getBoundingClientRect().top\n\n const refusal = document.createElement('div')\n refusal.style.flexBasis = '100%'\n refusal.textContent = 'memo.txt: not a type taken here'\n actions.append(refusal)\n\n expect(heading.getBoundingClientRect().top, 'the heading moved down with the second line').to.equal(before)\n })\n})\n\ndescribe('entity 360 section actions', () => {\n it('tells what sits in the actions slot to line up at the end', async () => {\n const section = (await fixture(html`<ox-entity360-section heading=\"papers\" state=\"ready\">\n <span slot=\"actions\">attach</span>\n </ox-entity360-section>`)) as OxEntity360Section\n\n const actions = section.querySelector('[slot=\"actions\"]') as HTMLElement\n expect(getComputedStyle(actions).getPropertyValue('--ox-actions-align').trim()).to.equal('end')\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"entity360-section.test.js","sourceRoot":"","sources":["../../test/entity360-section.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,iBAAiB,CAAA;AACxB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAA2B,MAAM,iBAAiB,CAAA;AAE9F;;;GAGG;AAEH,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,CAAA;AAEvG,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,oGAAoG,EAAE,KAAK,IAAI,EAAE;QAClH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,KAAK,CAAC,CAAA;QAClG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QACzF,MAAM,CAAC,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IACrG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,CAAC,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC/G,MAAM,CAAC,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QAC7E,MAAM,CAAC,iBAAiB,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAC1G,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACvF,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACvF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QACxE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC1F,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;QACrE,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QACnF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,MAAM,IAAI,GAAG,CAAC,EAAsB,EAAE,EAAE,WAAC,OAAA,MAAA,EAAE,CAAC,UAAW,CAAC,aAAa,CAAC,GAAG,CAAC,0CAAE,OAAO,CAAC,KAAK,CAAA,EAAA,CAAA;IAEzF,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA,gGAAgG,CACrG,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QACtC,MAAM,CAAC,EAAE,CAAC,UAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAE3D,EAAE,CAAC,KAAK,GAAG,OAAO,CAAA;QAClB,MAAM,EAAE,CAAC,cAAc,CAAA;QACvB,MAAM,CAAC,EAAE,CAAC,UAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAqB,IAAI,CAAA,2DAA2D,CAAC,CAAA;QAC7G,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACpC,EAAE,CAAC,KAAK,GAAG,MAAM,CAAA;QACjB,MAAM,EAAE,CAAC,cAAc,CAAA;QACvB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACjC,EAAE,CAAC,KAAK,GAAG,QAAQ,CAAA;QACnB,EAAE,CAAC,OAAO,GAAG,SAAS,CAAA;QACtB,MAAM,EAAE,CAAC,cAAc,CAAA;QACvB,MAAM,CAAC,EAAE,CAAC,UAAW,CAAC,aAAa,CAAC,GAAG,CAAE,CAAC,WAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAClF,EAAE,CAAC,OAAO,GAAG,EAAE,CAAA;QACf,MAAM,EAAE,CAAC,cAAc,CAAA;QACvB,MAAM,CAAC,EAAE,CAAC,UAAW,CAAC,aAAa,CAAC,GAAG,CAAE,CAAC,WAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACjF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA,8EAA8E,CAAC,CAAuB,CAAA;QACzI,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CAAA;QAErE,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAE/D,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAChC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,iCAAiC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAEpG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACnC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;;;;4BAIX,CAAC,CAAuB,CAAA;QAEhD,MAAM,OAAO,GAAG,OAAO,CAAC,UAAW,CAAC,aAAa,CAAC,IAAI,CAAE,CAAA;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAgB,CAAA;QACxE,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAA;QAElD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC7C,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAA;QAChC,OAAO,CAAC,WAAW,GAAG,iCAAiC,CAAA;QACvD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAEvB,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,6CAA6C,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC7G,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAA;;4BAEX,CAAC,CAAuB,CAAA;QAEhD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAgB,CAAA;QACxE,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACjG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import { expect, fixture } from '@open-wc/testing'\nimport { html } from 'lit'\nimport '../src/index.js'\nimport { askEntity360Door, readEntity360Door, type OxEntity360Section } from '../src/index.js'\n\n/**\n * A 360 section says what its door answered (ADR-0067): something, nothing, may-not-see, or failed.\n * The axis that matters is the second against the third - a refused viewer must not be told \"none\".\n */\n\nconst refused = { data: null, errors: [{ message: 'not allowed', extensions: { code: 'FORBIDDEN' } }] }\n\ndescribe('entity 360 door', () => {\n it('★ a request that throws is failed, with its own message - never left loading (ADR-0067 decision 7)', async () => {\n const answer = await askEntity360Door(Promise.reject(new Error('Failed to fetch')), d => d?.items)\n expect(answer).to.deep.equal({ state: 'failed', message: 'Failed to fetch' })\n })\n\n it('★ a client that throws on a refusal still says forbidden', async () => {\n const thrown = Object.assign(new Error('not allowed'), { graphQLErrors: refused.errors })\n expect((await askEntity360Door(Promise.reject(thrown), d => d?.items)).state).to.equal('forbidden')\n })\n\n it('a request that answers is read as readEntity360Door reads it', async () => {\n expect((await askEntity360Door(Promise.resolve({ data: { items: [] } }), d => d.items)).state).to.equal('none')\n expect((await askEntity360Door(Promise.resolve({ data: { items: [1] } }), d => d.items)).data).to.deep.equal([1])\n })\n\n it('★ a refusal is forbidden, not none - even when data came back empty beside it', () => {\n expect(readEntity360Door(refused, d => d?.items).state).to.equal('forbidden')\n expect(readEntity360Door({ ...refused, data: { items: [] } }, d => d.items).state).to.equal('forbidden')\n })\n\n it('★ an answer with nothing in it is none', () => {\n expect(readEntity360Door({ data: { items: [] } }, d => d.items).state).to.equal('none')\n expect(readEntity360Door({ data: { one: null } }, d => d.one).state).to.equal('none')\n })\n\n it('an answer with something is ready and carries it', () => {\n const answer = readEntity360Door({ data: { items: [1] } }, d => d.items)\n expect(answer).to.deep.equal({ state: 'ready', data: [1] })\n })\n\n it('any other error is failed and keeps the server sentence', () => {\n const answer = readEntity360Door({ data: null, errors: [{ message: 'db down' }] }, d => d)\n expect(answer).to.deep.equal({ state: 'failed', message: 'db down' })\n expect(readEntity360Door(undefined, d => d).state).to.equal('failed')\n })\n\n it('a section decides for itself what empty means', () => {\n const zero = readEntity360Door({ data: { n: { a: 0 } } }, d => d.n, n => n.a === 0)\n expect(zero.state).to.equal('none')\n })\n})\n\ndescribe('ox-entity360-section', () => {\n const said = (el: OxEntity360Section) => el.shadowRoot!.querySelector('p')?.dataset.state\n\n it('★ draws the slot only when ready', async () => {\n const el = await fixture<OxEntity360Section>(\n html`<ox-entity360-section heading=\"h\" state=\"forbidden\"><span>secret</span></ox-entity360-section>`\n )\n expect(said(el)).to.equal('forbidden')\n expect(el.shadowRoot!.querySelector('slot')).to.equal(null)\n\n el.state = 'ready'\n await el.updateComplete\n expect(el.shadowRoot!.querySelector('slot')).to.not.equal(null)\n })\n\n it('says none, loading and failed apart', async () => {\n const el = await fixture<OxEntity360Section>(html`<ox-entity360-section heading=\"h\"></ox-entity360-section>`)\n expect(said(el)).to.equal('loading')\n el.state = 'none'\n await el.updateComplete\n expect(said(el)).to.equal('none')\n el.state = 'failed'\n el.message = 'db down'\n await el.updateComplete\n expect(el.shadowRoot!.querySelector('p')!.textContent!.trim()).to.equal('db down')\n el.message = ''\n await el.updateComplete\n expect(el.shadowRoot!.querySelector('p')!.textContent!.trim()).to.not.equal('')\n })\n})\n\ndescribe('entity 360 section as a drop area', () => {\n it('shows where a dragged file would land, and only then', async () => {\n const section = (await fixture(html`<ox-entity360-section heading=\"papers\" state=\"ready\"></ox-entity360-section>`)) as OxEntity360Section\n section.style.setProperty('--md-sys-color-primary', 'rgb(0, 0, 255)')\n\n expect(getComputedStyle(section).outlineStyle).to.equal('none')\n\n section.classList.add('candrop')\n expect(getComputedStyle(section).outlineStyle, 'no mark while a file is over it').to.equal('dashed')\n\n section.classList.remove('candrop')\n expect(getComputedStyle(section).outlineStyle).to.equal('none')\n })\n})\n\ndescribe('entity 360 section heading', () => {\n it('keeps the heading level with an action that grows a second line', async () => {\n const section = (await fixture(html`<ox-entity360-section heading=\"papers\" state=\"ready\">\n <span slot=\"actions\" style=\"display: inline-flex; flex-wrap: wrap; width: 120px\">\n <button style=\"height: 26px\">attach</button>\n </span>\n </ox-entity360-section>`)) as OxEntity360Section\n\n const heading = section.shadowRoot!.querySelector('h3')!\n const actions = section.querySelector('[slot=\"actions\"]') as HTMLElement\n const before = heading.getBoundingClientRect().top\n\n const refusal = document.createElement('div')\n refusal.style.flexBasis = '100%'\n refusal.textContent = 'memo.txt: not a type taken here'\n actions.append(refusal)\n\n expect(heading.getBoundingClientRect().top, 'the heading moved down with the second line').to.equal(before)\n })\n})\n\ndescribe('entity 360 section actions', () => {\n it('tells what sits in the actions slot to line up at the end', async () => {\n const section = (await fixture(html`<ox-entity360-section heading=\"papers\" state=\"ready\">\n <span slot=\"actions\">attach</span>\n </ox-entity360-section>`)) as OxEntity360Section\n\n const actions = section.querySelector('[slot=\"actions\"]') as HTMLElement\n expect(getComputedStyle(actions).getPropertyValue('--ox-actions-align').trim()).to.equal('end')\n })\n})\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { expect, fixture, elementUpdated } from '@open-wc/testing';
|
|
2
2
|
import { html } from 'lit';
|
|
3
3
|
import '../src/index.js';
|
|
4
|
-
import { showEntity360, hideEntity360, isEntity360Unkept, navigateEntity360, canGoBackEntity360
|
|
4
|
+
import { showEntity360, hideEntity360, isEntity360Unkept, navigateEntity360, canGoBackEntity360 } from '../src/index.js';
|
|
5
|
+
import { DRAFT_UNKEPT } from '@operato/shell';
|
|
5
6
|
const owner = {};
|
|
6
7
|
const labels = { close: 'Close', expand: 'Expand', collapse: 'Collapse', resize: 'Resize', back: 'Back' };
|
|
7
8
|
const settle = () => new Promise(resolve => setTimeout(resolve, 50));
|
|
@@ -60,7 +61,7 @@ describe('shared nonmodal entity 360 dock', () => {
|
|
|
60
61
|
await settle();
|
|
61
62
|
const content = dock().shadowRoot.querySelector('ox-entity360-content');
|
|
62
63
|
const input = content.shadowRoot.querySelector('input');
|
|
63
|
-
const tell = (unkept) => input.dispatchEvent(new CustomEvent(
|
|
64
|
+
const tell = (unkept) => input.dispatchEvent(new CustomEvent(DRAFT_UNKEPT, { bubbles: true, composed: true, detail: { unkept } }));
|
|
64
65
|
expect(isEntity360Unkept(owner)).to.equal(false);
|
|
65
66
|
tell(true);
|
|
66
67
|
expect(isEntity360Unkept(owner)).to.equal(true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity360.test.js","sourceRoot":"","sources":["../../test/entity360.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, elementUpdated } from '@open-wc/testing'\nimport { html } from 'lit'\nimport '../src/index.js'\nimport { showEntity360, hideEntity360, isEntity360Unkept, navigateEntity360, canGoBackEntity360, ENTITY360_UNKEPT, type OxEntity360Dock, type Entity360View } from '../src/index.js'\n\nconst owner = {}\nconst labels = { close: 'Close', expand: 'Expand', collapse: 'Collapse', resize: 'Resize', back: 'Back' }\nconst settle = () => new Promise(resolve => setTimeout(resolve, 50))\nlet bar: HTMLElement\nconst dock = () => bar.shadowRoot!.querySelector('ox-entity360-dock') as OxEntity360Dock\nfunction view(name = 'Revision 1'): Entity360View {\n return { key: name, title: 'Test specification', context: name, labels, content: html`<input value=${name}>`, onClose: () => hideEntity360(owner) }\n}\n\ndescribe('shared nonmodal entity 360 dock', () => {\n beforeEach(async () => { bar = await fixture(html`<ox-aside-bar></ox-aside-bar>`) })\n afterEach(() => hideEntity360(owner))\n\n it('uses the aside layout without a modal backdrop or duplicate close action', async () => {\n showEntity360(owner, view())\n await settle()\n expect(dock()).to.exist\n expect(bar.shadowRoot!.querySelector('ox-floating-overlay')).to.equal(null)\n expect(!!dock().shadowRoot!.querySelector('[aria-modal]')).to.equal(matchMedia('(max-width: 900px)').matches)\n expect(dock().shadowRoot!.querySelectorAll('[data-action=\"close\"]').length).to.equal(1)\n })\n\n it('switches the contents in one dock and retains expanded state', async () => {\n showEntity360(owner, view())\n await settle()\n const original = dock()\n original.expanded = true\n showEntity360(owner, view('Approval after · Revision 2'))\n await elementUpdated(original)\n expect(dock()).to.equal(original)\n expect(original.expanded).to.equal(true)\n expect(original.view!.context).to.equal('Approval after · Revision 2')\n expect(original.shadowRoot!.textContent).to.contain('Approval after · Revision 2')\n })\n\n it('★ refresh reads again and keeps the contents - what is being written stays (ADR-0067 decision 8)', async () => {\n let refreshed = 0\n showEntity360(owner, { ...view(), onRefresh: () => refreshed++ })\n await settle()\n const original = dock()\n original.expanded = true\n const content = original.shadowRoot!.querySelector('ox-entity360-content') as HTMLElement\n const input = content.shadowRoot!.querySelector('input')!\n input.value = 'typed, not saved'\n ;(original.shadowRoot!.querySelector('[data-action=\"refresh\"]') as HTMLElement).click()\n await settle()\n expect(refreshed).to.equal(1)\n expect(dock()).to.equal(original)\n expect(original.expanded).to.equal(true)\n expect(content.shadowRoot!.querySelector('input')).to.equal(input)\n expect(input.value).to.equal('typed, not saved')\n })\n\n it('a dock that cannot read again draws no refresh button', async () => {\n showEntity360(owner, view())\n await settle()\n expect(dock().shadowRoot!.querySelector('[data-action=\"refresh\"]')).to.equal(null)\n })\n\n it('★ a section holding an entry no draft keeps makes the dock unkept, until it says otherwise', async () => {\n showEntity360(owner, view())\n await settle()\n const content = dock().shadowRoot!.querySelector('ox-entity360-content') as HTMLElement\n const input = content.shadowRoot!.querySelector('input')!\n const tell = (unkept: boolean) => input.dispatchEvent(new CustomEvent(ENTITY360_UNKEPT, { bubbles: true, composed: true, detail: { unkept } }))\n expect(isEntity360Unkept(owner)).to.equal(false)\n tell(true)\n expect(isEntity360Unkept(owner)).to.equal(true)\n tell(false)\n expect(isEntity360Unkept(owner)).to.equal(false)\n tell(true)\n showEntity360(owner, view('Revision 2'))\n await settle()\n expect(isEntity360Unkept(owner)).to.equal(false)\n })\n\n it('uses compact header controls and the shared scrollbar theme without local overrides', async () => {\n bar.style.setProperty('--scrollbar-thumb-color', 'rgb(57, 78, 100)')\n showEntity360(owner, { ...view(), content: html`<div style=\"height:3000px\">Long detail</div>` })\n await settle()\n const el = dock()\n const close = el.shadowRoot!.querySelector('[data-action=\"close\"]') as HTMLElement\n expect(close.getBoundingClientRect().width).to.equal(matchMedia('(pointer: coarse)').matches ? 40 : 28)\n const body = el.shadowRoot!.querySelector('.body') as HTMLElement\n expect(getComputedStyle(body).scrollbarGutter).to.equal('stable')\n expect(getComputedStyle(body, '::-webkit-scrollbar').width).to.equal('5px')\n expect(getComputedStyle(body, '::-webkit-scrollbar-track').backgroundColor).to.equal('rgba(0, 0, 0, 0)')\n expect(getComputedStyle(body, '::-webkit-scrollbar-thumb').backgroundColor).to.equal('rgb(57, 78, 100)')\n bar.style.setProperty('--scrollbar-width', '7px')\n bar.style.setProperty('--scrollbar-thumb-border-radius', '2px')\n expect(getComputedStyle(body, '::-webkit-scrollbar').width).to.equal('7px')\n expect(getComputedStyle(body, '::-webkit-scrollbar-thumb').borderRadius).to.equal('2px')\n })\n\n it('closes through the common button and restores the invoking control', async () => {\n let restored = false\n showEntity360(owner, view(), () => { restored = true })\n await settle()\n ;(dock().shadowRoot!.querySelector('[data-action=\"close\"]') as HTMLElement).click()\n await settle()\n expect(dock()).to.equal(null)\n expect(restored).to.equal(true)\n })\n\n it('Escape does not close the dock underneath a modal', async () => {\n showEntity360(owner, view())\n await settle()\n const state = history.state\n history.replaceState({ ...state, overlay: { name: 'confirmation' } }, '')\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }))\n expect(dock()).to.exist\n history.replaceState(state, '')\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }))\n await settle()\n expect(dock()).to.equal(null)\n })\n\n it('resizes using the keyboard without changing the read context', async () => {\n showEntity360(owner, view())\n await settle()\n const el = dock()\n el.shadowRoot!.querySelector('[role=\"separator\"]')!.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight' }))\n await elementUpdated(el)\n expect(el.style.getPropertyValue('--entity360-width')).to.equal('448px')\n expect(el.view!.context).to.equal('Revision 1')\n })\n\n it('also mounts in fullbleed layouts', async () => {\n bar.setAttribute('fullbleed', '')\n showEntity360(owner, view())\n await settle()\n expect(dock()).to.exist\n })\n\n it('records distinct targets and preserves unrelated address state', async () => {\n const initial = location.href\n history.replaceState({ userState: 42 }, '', initial)\n const first = new URL(initial)\n first.searchParams.set('f', 'testSpecifications:one')\n first.searchParams.set('revision', 'r1')\n expect(await navigateEntity360(first.href)).to.equal(true)\n expect(canGoBackEntity360()).to.equal(false)\n const second = new URL(first)\n second.searchParams.set('revision', 'r2')\n expect(await navigateEntity360(second.href)).to.equal(true)\n expect(canGoBackEntity360()).to.equal(true)\n expect(history.state.userState).to.equal(42)\n expect(history.state.entity360Previous).to.equal(first.href)\n history.replaceState({}, '', initial)\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"entity360.test.js","sourceRoot":"","sources":["../../test/entity360.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, elementUpdated } from '@open-wc/testing'\nimport { html } from 'lit'\nimport '../src/index.js'\nimport { showEntity360, hideEntity360, isEntity360Unkept, navigateEntity360, canGoBackEntity360, type OxEntity360Dock, type Entity360View } from '../src/index.js'\nimport { DRAFT_UNKEPT } from '@operato/shell'\n\nconst owner = {}\nconst labels = { close: 'Close', expand: 'Expand', collapse: 'Collapse', resize: 'Resize', back: 'Back' }\nconst settle = () => new Promise(resolve => setTimeout(resolve, 50))\nlet bar: HTMLElement\nconst dock = () => bar.shadowRoot!.querySelector('ox-entity360-dock') as OxEntity360Dock\nfunction view(name = 'Revision 1'): Entity360View {\n return { key: name, title: 'Test specification', context: name, labels, content: html`<input value=${name}>`, onClose: () => hideEntity360(owner) }\n}\n\ndescribe('shared nonmodal entity 360 dock', () => {\n beforeEach(async () => { bar = await fixture(html`<ox-aside-bar></ox-aside-bar>`) })\n afterEach(() => hideEntity360(owner))\n\n it('uses the aside layout without a modal backdrop or duplicate close action', async () => {\n showEntity360(owner, view())\n await settle()\n expect(dock()).to.exist\n expect(bar.shadowRoot!.querySelector('ox-floating-overlay')).to.equal(null)\n expect(!!dock().shadowRoot!.querySelector('[aria-modal]')).to.equal(matchMedia('(max-width: 900px)').matches)\n expect(dock().shadowRoot!.querySelectorAll('[data-action=\"close\"]').length).to.equal(1)\n })\n\n it('switches the contents in one dock and retains expanded state', async () => {\n showEntity360(owner, view())\n await settle()\n const original = dock()\n original.expanded = true\n showEntity360(owner, view('Approval after · Revision 2'))\n await elementUpdated(original)\n expect(dock()).to.equal(original)\n expect(original.expanded).to.equal(true)\n expect(original.view!.context).to.equal('Approval after · Revision 2')\n expect(original.shadowRoot!.textContent).to.contain('Approval after · Revision 2')\n })\n\n it('★ refresh reads again and keeps the contents - what is being written stays (ADR-0067 decision 8)', async () => {\n let refreshed = 0\n showEntity360(owner, { ...view(), onRefresh: () => refreshed++ })\n await settle()\n const original = dock()\n original.expanded = true\n const content = original.shadowRoot!.querySelector('ox-entity360-content') as HTMLElement\n const input = content.shadowRoot!.querySelector('input')!\n input.value = 'typed, not saved'\n ;(original.shadowRoot!.querySelector('[data-action=\"refresh\"]') as HTMLElement).click()\n await settle()\n expect(refreshed).to.equal(1)\n expect(dock()).to.equal(original)\n expect(original.expanded).to.equal(true)\n expect(content.shadowRoot!.querySelector('input')).to.equal(input)\n expect(input.value).to.equal('typed, not saved')\n })\n\n it('a dock that cannot read again draws no refresh button', async () => {\n showEntity360(owner, view())\n await settle()\n expect(dock().shadowRoot!.querySelector('[data-action=\"refresh\"]')).to.equal(null)\n })\n\n it('★ a section holding an entry no draft keeps makes the dock unkept, until it says otherwise', async () => {\n showEntity360(owner, view())\n await settle()\n const content = dock().shadowRoot!.querySelector('ox-entity360-content') as HTMLElement\n const input = content.shadowRoot!.querySelector('input')!\n const tell = (unkept: boolean) => input.dispatchEvent(new CustomEvent(DRAFT_UNKEPT, { bubbles: true, composed: true, detail: { unkept } }))\n expect(isEntity360Unkept(owner)).to.equal(false)\n tell(true)\n expect(isEntity360Unkept(owner)).to.equal(true)\n tell(false)\n expect(isEntity360Unkept(owner)).to.equal(false)\n tell(true)\n showEntity360(owner, view('Revision 2'))\n await settle()\n expect(isEntity360Unkept(owner)).to.equal(false)\n })\n\n it('uses compact header controls and the shared scrollbar theme without local overrides', async () => {\n bar.style.setProperty('--scrollbar-thumb-color', 'rgb(57, 78, 100)')\n showEntity360(owner, { ...view(), content: html`<div style=\"height:3000px\">Long detail</div>` })\n await settle()\n const el = dock()\n const close = el.shadowRoot!.querySelector('[data-action=\"close\"]') as HTMLElement\n expect(close.getBoundingClientRect().width).to.equal(matchMedia('(pointer: coarse)').matches ? 40 : 28)\n const body = el.shadowRoot!.querySelector('.body') as HTMLElement\n expect(getComputedStyle(body).scrollbarGutter).to.equal('stable')\n expect(getComputedStyle(body, '::-webkit-scrollbar').width).to.equal('5px')\n expect(getComputedStyle(body, '::-webkit-scrollbar-track').backgroundColor).to.equal('rgba(0, 0, 0, 0)')\n expect(getComputedStyle(body, '::-webkit-scrollbar-thumb').backgroundColor).to.equal('rgb(57, 78, 100)')\n bar.style.setProperty('--scrollbar-width', '7px')\n bar.style.setProperty('--scrollbar-thumb-border-radius', '2px')\n expect(getComputedStyle(body, '::-webkit-scrollbar').width).to.equal('7px')\n expect(getComputedStyle(body, '::-webkit-scrollbar-thumb').borderRadius).to.equal('2px')\n })\n\n it('closes through the common button and restores the invoking control', async () => {\n let restored = false\n showEntity360(owner, view(), () => { restored = true })\n await settle()\n ;(dock().shadowRoot!.querySelector('[data-action=\"close\"]') as HTMLElement).click()\n await settle()\n expect(dock()).to.equal(null)\n expect(restored).to.equal(true)\n })\n\n it('Escape does not close the dock underneath a modal', async () => {\n showEntity360(owner, view())\n await settle()\n const state = history.state\n history.replaceState({ ...state, overlay: { name: 'confirmation' } }, '')\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }))\n expect(dock()).to.exist\n history.replaceState(state, '')\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }))\n await settle()\n expect(dock()).to.equal(null)\n })\n\n it('resizes using the keyboard without changing the read context', async () => {\n showEntity360(owner, view())\n await settle()\n const el = dock()\n el.shadowRoot!.querySelector('[role=\"separator\"]')!.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight' }))\n await elementUpdated(el)\n expect(el.style.getPropertyValue('--entity360-width')).to.equal('448px')\n expect(el.view!.context).to.equal('Revision 1')\n })\n\n it('also mounts in fullbleed layouts', async () => {\n bar.setAttribute('fullbleed', '')\n showEntity360(owner, view())\n await settle()\n expect(dock()).to.exist\n })\n\n it('records distinct targets and preserves unrelated address state', async () => {\n const initial = location.href\n history.replaceState({ userState: 42 }, '', initial)\n const first = new URL(initial)\n first.searchParams.set('f', 'testSpecifications:one')\n first.searchParams.set('revision', 'r1')\n expect(await navigateEntity360(first.href)).to.equal(true)\n expect(canGoBackEntity360()).to.equal(false)\n const second = new URL(first)\n second.searchParams.set('revision', 'r2')\n expect(await navigateEntity360(second.href)).to.equal(true)\n expect(canGoBackEntity360()).to.equal(true)\n expect(history.state.userState).to.equal(42)\n expect(history.state.entity360Previous).to.equal(first.href)\n history.replaceState({}, '', initial)\n })\n})\n"]}
|