@operato/data-grist 10.29.17 → 10.29.20

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.
@@ -4,4 +4,4 @@ import { RecordViewBody } from '../record-view-body.js';
4
4
  *
5
5
  * - handler의 this 는 ox-record-view-body임.
6
6
  */
7
- export declare function recordViewBodyClickHandler(this: RecordViewBody, e: Event): void;
7
+ export declare function recordViewBodyClickHandler(this: RecordViewBody, e: Event): Promise<void>;
@@ -1,9 +1,10 @@
1
+ import { OxGristEditor } from '../../editors/ox-grist-editor.js';
1
2
  /**
2
3
  * ox-record-view-body 의 click handler
3
4
  *
4
5
  * - handler의 this 는 ox-record-view-body임.
5
6
  */
6
- export function recordViewBodyClickHandler(e) {
7
+ export async function recordViewBodyClickHandler(e) {
7
8
  var _a;
8
9
  e.stopPropagation();
9
10
  /* target should be 'ox-grid-field' */
@@ -23,5 +24,26 @@ export function recordViewBodyClickHandler(e) {
23
24
  }
24
25
  this.currentTarget = target;
25
26
  target.setAttribute('editing', 'true');
27
+ /*
28
+ * ── 양식에서는 칸을 누르는 것이 곧 고치는 것이다 ─────────────────────────
29
+ *
30
+ * 표에서 팝업 편집기 칸은 한 번 누르면 고르기이고, 표식이나 더블클릭으로 연다. 양식(이 몸통)은
31
+ * 고르기가 없다 — 칸을 누른 사람은 고치려는 것이다. 그런데 팝업 편집기는 편집 상태가 돼도
32
+ * 자기 자신이 한 번 더 눌려야 열려서, 첫 클릭 뒤 친 글자가 아무 데도 들어가지 않았다.
33
+ *
34
+ * [확인함] 2026-10-10 · pdf 템플릿 「만들기」 · 본문(HTML) 칸을 눌러 친 글이 저장되지 않음
35
+ * (편집기 ox-grist-editor-code 가 그려졌지만 팝업은 표식을 눌러야 열림)
36
+ *
37
+ * 편집 상태로 그려진 편집기에 클릭 하나를 넘긴다. 버블링하지 않게 보낸다 — 올라오면 이 처리기가
38
+ * 다시 불려 편집 상태를 껐다 켜며 같은 클릭을 또 보낸다.
39
+ */
40
+ if (!target.opensPopup) {
41
+ return;
42
+ }
43
+ await target.updateComplete;
44
+ const editor = Array.from(target.renderRoot.children).find(child => child instanceof OxGristEditor);
45
+ /* The editor hears clicks from its own first update on (OxGristEditor.firstUpdated). */
46
+ await (editor === null || editor === void 0 ? void 0 : editor.updateComplete);
47
+ editor === null || editor === void 0 ? void 0 : editor.dispatchEvent(new MouseEvent('click', { bubbles: false, composed: false }));
26
48
  }
27
49
  //# sourceMappingURL=record-view-body-click-handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"record-view-body-click-handler.js","sourceRoot":"","sources":["../../../../src/record-view/event-handlers/record-view-body-click-handler.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAuB,CAAQ;;IACvE,CAAC,CAAC,eAAe,EAAE,CAAA;IAEnB,sCAAsC;IACtC,IAAI,MAAM,GAAG,CAAC,CAAC,MAAuB,CAAA;IAEtC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,QAAQ,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,0CAAE,MAAM,CAAC,QAAQ,CAAA;IAC9C,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACnG,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QACzB,OAAM;IACR,CAAC;IAED,IAAI,CAAC,aAAa,GAAG,MAAM,CAAA;IAC3B,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;AACxC,CAAC","sourcesContent":["import { DataGridField } from '../../data-grid/data-grid-field.js'\nimport { RecordViewBody } from '../record-view-body.js'\n\n/**\n * ox-record-view-body 의 click handler\n *\n * - handler의 this 는 ox-record-view-body임.\n */\nexport function recordViewBodyClickHandler(this: RecordViewBody, e: Event): void {\n e.stopPropagation()\n\n /* target should be 'ox-grid-field' */\n var target = e.target as DataGridField\n\n if (this.currentTarget) {\n this.focus()\n this.currentTarget.removeAttribute('editing')\n }\n\n let editable = target?.column?.record.editable\n if (typeof editable === 'function') {\n editable = editable.call(this, target.value, target.column, target.record, target.rowIndex, this)\n }\n\n if (target.tagName !== 'OX-GRID-FIELD' || !editable) {\n this.focus()\n this.currentTarget = null\n return\n }\n\n this.currentTarget = target\n target.setAttribute('editing', 'true')\n}\n"]}
1
+ {"version":3,"file":"record-view-body-click-handler.js","sourceRoot":"","sources":["../../../../src/record-view/event-handlers/record-view-body-click-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAGhE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAuB,CAAQ;;IAC7E,CAAC,CAAC,eAAe,EAAE,CAAA;IAEnB,sCAAsC;IACtC,IAAI,MAAM,GAAG,CAAC,CAAC,MAAuB,CAAA;IAEtC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,QAAQ,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,0CAAE,MAAM,CAAC,QAAQ,CAAA;IAC9C,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACnG,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QACzB,OAAM;IACR,CAAC;IAED,IAAI,CAAC,aAAa,GAAG,MAAM,CAAA;IAC3B,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAEtC;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,OAAM;IACR,CAAC;IACD,MAAM,MAAM,CAAC,cAAc,CAAA;IAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,YAAY,aAAa,CAA8B,CAAA;IAChI,wFAAwF;IACxF,MAAM,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,CAAA,CAAA;IAC5B,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;AACrF,CAAC","sourcesContent":["import { DataGridField } from '../../data-grid/data-grid-field.js'\nimport { OxGristEditor } from '../../editors/ox-grist-editor.js'\nimport { RecordViewBody } from '../record-view-body.js'\n\n/**\n * ox-record-view-body 의 click handler\n *\n * - handler의 this 는 ox-record-view-body임.\n */\nexport async function recordViewBodyClickHandler(this: RecordViewBody, e: Event): Promise<void> {\n e.stopPropagation()\n\n /* target should be 'ox-grid-field' */\n var target = e.target as DataGridField\n\n if (this.currentTarget) {\n this.focus()\n this.currentTarget.removeAttribute('editing')\n }\n\n let editable = target?.column?.record.editable\n if (typeof editable === 'function') {\n editable = editable.call(this, target.value, target.column, target.record, target.rowIndex, this)\n }\n\n if (target.tagName !== 'OX-GRID-FIELD' || !editable) {\n this.focus()\n this.currentTarget = null\n return\n }\n\n this.currentTarget = target\n target.setAttribute('editing', 'true')\n\n /*\n * ── 양식에서는 칸을 누르는 것이 곧 고치는 것이다 ─────────────────────────\n *\n * 표에서 팝업 편집기 칸은 한 번 누르면 고르기이고, 표식이나 더블클릭으로 연다. 양식(이 몸통)은\n * 고르기가 없다 — 칸을 누른 사람은 고치려는 것이다. 그런데 팝업 편집기는 편집 상태가 돼도\n * 자기 자신이 한 번 더 눌려야 열려서, 첫 클릭 뒤 친 글자가 아무 데도 들어가지 않았다.\n *\n * [확인함] 2026-10-10 · pdf 템플릿 「만들기」 · 본문(HTML) 칸을 눌러 친 글이 저장되지 않음\n * (편집기 ox-grist-editor-code 가 그려졌지만 팝업은 표식을 눌러야 열림)\n *\n * 편집 상태로 그려진 편집기에 클릭 하나를 넘긴다. 버블링하지 않게 보낸다 — 올라오면 이 처리기가\n * 다시 불려 편집 상태를 껐다 켜며 같은 클릭을 또 보낸다.\n */\n if (!target.opensPopup) {\n return\n }\n await target.updateComplete\n const editor = Array.from(target.renderRoot.children).find(child => child instanceof OxGristEditor) as OxGristEditor | undefined\n /* The editor hears clicks from its own first update on (OxGristEditor.firstUpdated). */\n await editor?.updateComplete\n editor?.dispatchEvent(new MouseEvent('click', { bubbles: false, composed: false }))\n}\n"]}
@@ -0,0 +1 @@
1
+ import '../src/record-view/record-view.js';
@@ -0,0 +1,58 @@
1
+ /* Elements are compared by presence, not by value: a failing element comparison makes chai render the DOM and hang the runner. */
2
+ import { expect, fixture } from '@open-wc/testing';
3
+ import { html } from 'lit';
4
+ import '../src/record-view/record-view.js';
5
+ import { buildColumn } from '../src/configure/column-builder.js';
6
+ import { OxGristEditor } from '../src/editors/ox-grist-editor.js';
7
+ import { registerEditor } from '../src/editors/registry.js';
8
+ /*
9
+ * In a form (ox-record-view - the 「만들기」 dialog of a grid) a field is pressed to be edited. A field whose editor
10
+ * opens a popup used to become 「editing」 on the first press but open nothing until its editor was pressed again,
11
+ * so what was typed after the first press went nowhere (pdf template 「만들기」, body HTML, 2026-10-10).
12
+ */
13
+ let opened = 0;
14
+ class ProbePopupEditor extends OxGristEditor {
15
+ _onclick(e) {
16
+ e.stopPropagation();
17
+ opened++;
18
+ }
19
+ }
20
+ ProbePopupEditor.opensPopup = true;
21
+ customElements.define('probe-popup-editor', ProbePopupEditor);
22
+ registerEditor('probe-popup', ProbePopupEditor);
23
+ const settle = (ms = 100) => new Promise(resolve => setTimeout(resolve, ms));
24
+ describe('a popup field in a form', () => {
25
+ it('opens its popup on the first press', async () => {
26
+ opened = 0;
27
+ const columns = [
28
+ buildColumn({ type: 'string', name: 'name', header: 'name', record: { editable: true } }),
29
+ buildColumn({ type: 'probe-popup', name: 'body', header: 'body', record: { editable: true } })
30
+ ];
31
+ const view = (await fixture(html `<ox-record-view .columns=${columns} .record=${{}}></ox-record-view>`));
32
+ await view.updateComplete;
33
+ await settle();
34
+ const body = view.renderRoot.querySelector('ox-record-view-body');
35
+ await body.updateComplete;
36
+ const field = Array.from(body.renderRoot.querySelectorAll('ox-grid-field')).find(one => { var _a; return ((_a = one.column) === null || _a === void 0 ? void 0 : _a.name) === 'body'; });
37
+ expect(!!field, 'the body field is drawn').to.equal(true);
38
+ field.click();
39
+ await settle(200);
40
+ expect(field.getAttribute('editing'), 'the field is being edited').to.equal('true');
41
+ expect(opened, 'the popup editor was opened once').to.equal(1);
42
+ });
43
+ it('leaves a field edited in place as it was - nothing extra is pressed', async () => {
44
+ opened = 0;
45
+ const columns = [buildColumn({ type: 'string', name: 'name', header: 'name', record: { editable: true } })];
46
+ const view = (await fixture(html `<ox-record-view .columns=${columns} .record=${{}}></ox-record-view>`));
47
+ await view.updateComplete;
48
+ await settle();
49
+ const body = view.renderRoot.querySelector('ox-record-view-body');
50
+ await body.updateComplete;
51
+ const field = body.renderRoot.querySelector('ox-grid-field');
52
+ field.click();
53
+ await settle(200);
54
+ expect(field.getAttribute('editing')).to.equal('true');
55
+ expect(opened).to.equal(0);
56
+ });
57
+ });
58
+ //# sourceMappingURL=record-view-popup-editor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-view-popup-editor.test.js","sourceRoot":"","sources":["../../test/record-view-popup-editor.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* Elements are compared by presence, not by value: a failing element comparison makes chai render the DOM and hang the runner. */\nimport { expect, fixture } from '@open-wc/testing'\nimport { html } from 'lit'\n\nimport '../src/record-view/record-view.js'\nimport { buildColumn } from '../src/configure/column-builder.js'\nimport { OxGristEditor } from '../src/editors/ox-grist-editor.js'\nimport { registerEditor } from '../src/editors/registry.js'\n\n/*\n * In a form (ox-record-view - the 「만들기」 dialog of a grid) a field is pressed to be edited. A field whose editor\n * opens a popup used to become 「editing」 on the first press but open nothing until its editor was pressed again,\n * so what was typed after the first press went nowhere (pdf template 「만들기」, body HTML, 2026-10-10).\n */\n\nlet opened = 0\n\nclass ProbePopupEditor extends OxGristEditor {\n static opensPopup = true\n\n _onclick(e: Event): void {\n e.stopPropagation()\n opened++\n }\n}\ncustomElements.define('probe-popup-editor', ProbePopupEditor)\nregisterEditor('probe-popup', ProbePopupEditor)\n\nconst settle = (ms = 100) => new Promise(resolve => setTimeout(resolve, ms))\n\ndescribe('a popup field in a form', () => {\n it('opens its popup on the first press', async () => {\n opened = 0\n const columns = [\n buildColumn({ type: 'string', name: 'name', header: 'name', record: { editable: true } } as any),\n buildColumn({ type: 'probe-popup', name: 'body', header: 'body', record: { editable: true } } as any)\n ]\n const view = (await fixture(html`<ox-record-view .columns=${columns} .record=${{}}></ox-record-view>`)) as any\n await view.updateComplete\n await settle()\n\n const body = view.renderRoot.querySelector('ox-record-view-body') as any\n await body.updateComplete\n const field = Array.from(body.renderRoot.querySelectorAll('ox-grid-field') as NodeListOf<any>).find(one => one.column?.name === 'body')\n expect(!!field, 'the body field is drawn').to.equal(true)\n\n field.click()\n await settle(200)\n\n expect(field.getAttribute('editing'), 'the field is being edited').to.equal('true')\n expect(opened, 'the popup editor was opened once').to.equal(1)\n })\n\n it('leaves a field edited in place as it was - nothing extra is pressed', async () => {\n opened = 0\n const columns = [buildColumn({ type: 'string', name: 'name', header: 'name', record: { editable: true } } as any)]\n const view = (await fixture(html`<ox-record-view .columns=${columns} .record=${{}}></ox-record-view>`)) as any\n await view.updateComplete\n await settle()\n const body = view.renderRoot.querySelector('ox-record-view-body') as any\n await body.updateComplete\n const field = body.renderRoot.querySelector('ox-grid-field') as any\n field.click()\n await settle(200)\n expect(field.getAttribute('editing')).to.equal('true')\n expect(opened).to.equal(0)\n })\n})\n"]}