@operato/app 10.8.0 → 10.9.0
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 +31 -0
- package/dist/src/grist-editor/ox-grist-editor-code.d.ts +1 -0
- package/dist/src/grist-editor/ox-grist-editor-code.js +2 -0
- package/dist/src/grist-editor/ox-grist-editor-code.js.map +1 -1
- package/dist/src/grist-editor/ox-grist-editor-json.d.ts +1 -0
- package/dist/src/grist-editor/ox-grist-editor-json.js +2 -0
- package/dist/src/grist-editor/ox-grist-editor-json.js.map +1 -1
- package/dist/src/grist-editor/ox-grist-editor-privilege.d.ts +1 -0
- package/dist/src/grist-editor/ox-grist-editor-privilege.js +2 -0
- package/dist/src/grist-editor/ox-grist-editor-privilege.js.map +1 -1
- package/dist/src/grist-editor/ox-grist-editor-resource-code.d.ts +1 -0
- package/dist/src/grist-editor/ox-grist-editor-resource-code.js +2 -0
- package/dist/src/grist-editor/ox-grist-editor-resource-code.js.map +1 -1
- package/dist/src/grist-editor/ox-grist-editor-resource-id.d.ts +1 -0
- package/dist/src/grist-editor/ox-grist-editor-resource-id.js +2 -0
- package/dist/src/grist-editor/ox-grist-editor-resource-id.js.map +1 -1
- package/dist/src/grist-editor/ox-grist-editor-resource-object-legacy.d.ts +1 -0
- package/dist/src/grist-editor/ox-grist-editor-resource-object-legacy.js +2 -0
- package/dist/src/grist-editor/ox-grist-editor-resource-object-legacy.js.map +1 -1
- package/dist/src/grist-editor/ox-grist-editor-resource-object.d.ts +1 -0
- package/dist/src/grist-editor/ox-grist-editor-resource-object.js +2 -0
- package/dist/src/grist-editor/ox-grist-editor-resource-object.js.map +1 -1
- package/dist/src/relation/ox-relation-view.d.ts +88 -0
- package/dist/src/relation/ox-relation-view.js +262 -0
- package/dist/src/relation/ox-relation-view.js.map +1 -0
- package/dist/src/relation/relation-groups.d.ts +33 -0
- package/dist/src/relation/relation-groups.js +87 -0
- package/dist/src/relation/relation-groups.js.map +1 -0
- package/dist/src/selector/ox-selector-resource-object-legacy.js +13 -1
- package/dist/src/selector/ox-selector-resource-object-legacy.js.map +1 -1
- package/dist/src/selector/ox-selector-resource-object.d.ts +40 -2
- package/dist/src/selector/ox-selector-resource-object.js +180 -16
- package/dist/src/selector/ox-selector-resource-object.js.map +1 -1
- package/dist/test/selector-confirm-keeps-value.test.d.ts +1 -0
- package/dist/test/selector-confirm-keeps-value.test.js +108 -0
- package/dist/test/selector-confirm-keeps-value.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +61 -53
- package/test/selector-confirm-keeps-value.test.ts +127 -0
- package/translations/en.json +18 -0
- package/translations/es.json +20 -0
- package/translations/ja.json +20 -0
- package/translations/ko.json +18 -0
- package/translations/zh.json +18 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,37 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [10.9.0](https://github.com/hatiolab/operato/compare/v10.8.1...v10.9.0) (2026-09-05)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### :memo: Documentation
|
|
10
|
+
|
|
11
|
+
* **app:** 타입 관계를 그림에서 빼는 근거를 그 자리에 적는다 ([d9da892](https://github.com/hatiolab/operato/commit/d9da89277f151e34ba403ace7c993e01ebc8e585))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### :rocket: New Features
|
|
15
|
+
|
|
16
|
+
* **app:** 관계 그림과 그 변환기를 공용으로 올린다 ([ad8ad58](https://github.com/hatiolab/operato/commit/ad8ad5822f569004fb70aa1bfac9fb885a655682))
|
|
17
|
+
* **app:** 참조 선택기가 여럿 고르기를 받는다 ([1ac49ab](https://github.com/hatiolab/operato/commit/1ac49ab5ad4ffa2ea31bf7eecd718691eebedfe5))
|
|
18
|
+
* **data-grist, popup:** 표식은 값의 빈자리에, 팝업은 닫히면 제자리로 ([cdcd84c](https://github.com/hatiolab/operato/commit/cdcd84c53cdb12ba0664cc9d2bb4c8238e4ea9f4))
|
|
19
|
+
* **data-grist:** 팝업으로 고치는 칸에 표식을 둔다 ([69fae8f](https://github.com/hatiolab/operato/commit/69fae8f92024bd59ac21e90b9b2837be95f222cf))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### :bug: Bug Fix
|
|
23
|
+
|
|
24
|
+
* **app:** 관계 낱말의 접두를 ops.rel.* 로 옮긴다 ([4d942f9](https://github.com/hatiolab/operato/commit/4d942f97b305904db76079d65ed35f534aaa3de9))
|
|
25
|
+
* **app:** 참조 선택기의 확인이 값을 지우던 것을 막고, 왜 못 누르는지 말한다 ([40c6f3b](https://github.com/hatiolab/operato/commit/40c6f3bb2a4008d839e5b1efd12509c1513c0fec)), closes [#262e38](https://github.com/hatiolab/operato/issues/262e38) [#0c7a4](https://github.com/hatiolab/operato/issues/0c7a4) [#f0f2f4](https://github.com/hatiolab/operato/issues/f0f2f4)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### [10.8.1](https://github.com/hatiolab/operato/compare/v10.8.0...v10.8.1) (2026-09-04)
|
|
30
|
+
|
|
31
|
+
**Note:** Version bump only for package @operato/app
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
6
37
|
## [10.8.0](https://github.com/hatiolab/operato/compare/v10.7.0...v10.8.0) (2026-09-04)
|
|
7
38
|
|
|
8
39
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import '@operato/data-grist/ox-popup-code-input.js';
|
|
2
2
|
import { OxGristEditor } from '@operato/data-grist';
|
|
3
3
|
export declare class OxGristEditorCode extends OxGristEditor {
|
|
4
|
+
static opensPopup: boolean;
|
|
4
5
|
get editorTemplate(): import("lit-html").TemplateResult<1>;
|
|
5
6
|
_onclick(e: Event): void;
|
|
6
7
|
_onkeydown(e: KeyboardEvent): void;
|
|
@@ -50,6 +50,8 @@ let OxGristEditorCode = class OxGristEditorCode extends OxGristEditor {
|
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
52
|
};
|
|
53
|
+
/* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */
|
|
54
|
+
OxGristEditorCode.opensPopup = true;
|
|
53
55
|
OxGristEditorCode = __decorate([
|
|
54
56
|
customElement('ox-grist-editor-code')
|
|
55
57
|
], OxGristEditorCode);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-grist-editor-code.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-code.ts"],"names":[],"mappings":";AAAA,OAAO,4CAA4C,CAAA;AAEnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGpC,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,aAAa;
|
|
1
|
+
{"version":3,"file":"ox-grist-editor-code.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-code.ts"],"names":[],"mappings":";AAAA,OAAO,4CAA4C,CAAA;AAEnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGpC,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,aAAa;IAIlD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAA,sBAAsB,IAAI,CAAC,KAAK,IAAI,EAAE,SAAS,CAAA;IAC5D,CAAC;IAED,QAAQ,CAAC,CAAQ;QACf,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,IAAI,CAAC,eAAe,EAAE,CAAA;IACxB,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QACjB,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAA;YACnB,IAAI,CAAC,eAAe,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;IAED,eAAe;;QACb,IAAI,EAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,EAAE,GAAG,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,MAAM,0CAAE,OAAO,KAAI,EAAE,CAAA;QAEzE,IAAI,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC7B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,MAAM,EAAE,IAAI,CAAC,KAAK;oBAClB,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;iBACd;aACF,CAAC,CACH,CAAA;QACH,CAAC,CAAA;QAED,IAAI,KAAK,GAAG,SAAS,CACnB,IAAI,CAAA;;mBAES,IAAI,CAAC,KAAK;iBACZ,IAAI;6BACQ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;qBACzB,QAAQ;;OAEtB,EACD;YACE,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC;YACnC,IAAI,EAAE,8BAA8B;SACrC,CACF,CAAA;IACH,CAAC;;AAtDD,sDAAsD;AAC/C,4BAAU,GAAG,IAAI,AAAP,CAAO;AAFb,iBAAiB;IAD7B,aAAa,CAAC,sBAAsB,CAAC;GACzB,iBAAiB,CAwD7B","sourcesContent":["import '@operato/data-grist/ox-popup-code-input.js'\n\nimport { html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { OxGristEditor } from '@operato/data-grist'\nimport { i18next } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\n\n@customElement('ox-grist-editor-code')\nexport class OxGristEditorCode extends OxGristEditor {\n /* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */\n static opensPopup = true\n\n get editorTemplate() {\n return html` <div tabindex=\"0\">${this.value || ''}</div> `\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n this.showEditorPopup()\n }\n\n _onkeydown(e: KeyboardEvent): void {\n const key = e.key\n if (key == 'Enter') {\n e.stopPropagation()\n this.showEditorPopup()\n }\n }\n\n showEditorPopup() {\n var { mode, language = 'javascript' } = this.column.record?.options || {}\n\n var change = (value: string) => {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: this.value,\n after: value,\n column: this.column,\n record: this.record,\n row: this.row\n }\n })\n )\n }\n\n var popup = openPopup(\n html`\n <ox-popup-code-input\n .value=${this.value}\n mode=${mode}\n .confirmCallback=${change.bind(this)}\n language=${language}\n ></ox-popup-code-input>\n `,\n {\n backdrop: true,\n title: i18next.t('title.edit code'),\n help: 'data-grist/grist-editor/code'\n }\n )\n }\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import '@operato/data-grist/ox-popup-code-input.js';
|
|
2
2
|
import { OxGristEditor } from '@operato/data-grist';
|
|
3
3
|
export declare class OxGristEditorJson extends OxGristEditor {
|
|
4
|
+
static opensPopup: boolean;
|
|
4
5
|
get editorTemplate(): import("lit-html").TemplateResult<1>;
|
|
5
6
|
_onclick(e: Event): void;
|
|
6
7
|
_onkeydown(e: KeyboardEvent): void;
|
|
@@ -51,6 +51,8 @@ let OxGristEditorJson = class OxGristEditorJson extends OxGristEditor {
|
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
};
|
|
54
|
+
/* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */
|
|
55
|
+
OxGristEditorJson.opensPopup = true;
|
|
54
56
|
OxGristEditorJson = __decorate([
|
|
55
57
|
customElement('ox-grist-editor-json')
|
|
56
58
|
], OxGristEditorJson);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-grist-editor-json.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-json.ts"],"names":[],"mappings":";AAAA,OAAO,4CAA4C,CAAA;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGpC,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,aAAa;
|
|
1
|
+
{"version":3,"file":"ox-grist-editor-json.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-json.ts"],"names":[],"mappings":";AAAA,OAAO,4CAA4C,CAAA;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGpC,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,aAAa;IAIlD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAA,sBAAsB,IAAI,CAAC,KAAK,IAAI,EAAE,SAAS,CAAA;IAC5D,CAAC;IAED,QAAQ,CAAC,CAAQ;QACf,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,IAAI,CAAC,eAAe,EAAE,CAAA;IACxB,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QACjB,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAA;YACnB,IAAI,CAAC,eAAe,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;IAED,eAAe;QACb,IAAI,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC7B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,QAAQ,EAAE;gBACxB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,MAAM,EAAE,IAAI,CAAC,KAAK;oBAClB,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;iBACd;aACF,CAAC,CACH,CAAA;QACH,CAAC,CAAA;QAED,IAAI,KAAK,GAAG,SAAS,CACnB,IAAI,CAAA;;mBAES,IAAI,CAAC,KAAK;;oBAET,CAAC,CAAc,EAAE,EAAE;YAC3B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtB,KAAK,CAAC,KAAK,EAAE,CAAA;QACf,CAAC;;;OAGJ,EACD;YACE,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC;YACnC,IAAI,EAAE,8BAA8B;SACrC,CACF,CAAA;IACH,CAAC;;AAvDD,sDAAsD;AAC/C,4BAAU,GAAG,IAAI,AAAP,CAAO;AAFb,iBAAiB;IAD7B,aAAa,CAAC,sBAAsB,CAAC;GACzB,iBAAiB,CAyD7B","sourcesContent":["import '@operato/data-grist/ox-popup-code-input.js'\n\nimport { OxGristEditor } from '@operato/data-grist'\nimport { customElement } from 'lit/decorators.js'\nimport { html } from 'lit'\nimport { i18next } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\n\n@customElement('ox-grist-editor-json')\nexport class OxGristEditorJson extends OxGristEditor {\n /* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */\n static opensPopup = true\n\n get editorTemplate() {\n return html` <div tabindex=\"0\">${this.value || ''}</div> `\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n this.showEditorPopup()\n }\n\n _onkeydown(e: KeyboardEvent): void {\n const key = e.key\n if (key == 'Enter') {\n e.stopPropagation()\n this.showEditorPopup()\n }\n }\n\n showEditorPopup() {\n var change = (value: string) => {\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: {\n before: this.value,\n after: value,\n column: this.column,\n record: this.record,\n row: this.row\n }\n })\n )\n }\n\n var popup = openPopup(\n html`\n <ox-popup-code-input\n .value=${this.value}\n mode=\"javascript\"\n @change=${(e: CustomEvent) => {\n change(e.detail.value)\n popup.close()\n }}\n lanugage=\"json\"\n ></ox-popup-code-input>\n `,\n {\n backdrop: true,\n title: i18next.t('title.edit json'),\n help: 'data-grist/grist-editor/json'\n }\n )\n }\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import './ox-popup-privilege-input.js';
|
|
2
2
|
import { OxGristEditor } from '@operato/data-grist';
|
|
3
3
|
export declare class OxGristEditorPrivilege extends OxGristEditor {
|
|
4
|
+
static opensPopup: boolean;
|
|
4
5
|
get editorTemplate(): import("lit-html").TemplateResult<1>;
|
|
5
6
|
_onclick(e: Event): void;
|
|
6
7
|
_onkeydown(e: KeyboardEvent): void;
|
|
@@ -44,6 +44,8 @@ let OxGristEditorPrivilege = class OxGristEditorPrivilege extends OxGristEditor
|
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
};
|
|
47
|
+
/* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */
|
|
48
|
+
OxGristEditorPrivilege.opensPopup = true;
|
|
47
49
|
OxGristEditorPrivilege = __decorate([
|
|
48
50
|
customElement('ox-grist-editor-privilege')
|
|
49
51
|
], OxGristEditorPrivilege);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-grist-editor-privilege.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-privilege.ts"],"names":[],"mappings":";AAAA,OAAO,+BAA+B,CAAA;AAEtC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGpC,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,aAAa;
|
|
1
|
+
{"version":3,"file":"ox-grist-editor-privilege.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-privilege.ts"],"names":[],"mappings":";AAAA,OAAO,+BAA+B,CAAA;AAEtC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGpC,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,aAAa;IAIvD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAA,+BAA+B,CAAA;IAC5C,CAAC;IAED,QAAQ,CAAC,CAAQ;QACf,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,IAAI,CAAC,eAAe,EAAE,CAAA;IACxB,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QACjB,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAA;YACnB,IAAI,CAAC,eAAe,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;IAED,eAAe;QACb,IAAI,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC7B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,MAAM,EAAE,IAAI,CAAC,KAAK;oBAClB,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;iBACd;aACF,CAAC,CACH,CAAA;QACH,CAAC,CAAA;QAED,IAAI,KAAK,GAAG,SAAS,CACnB,IAAI,CAAA;2CACiC,IAAI,CAAC,KAAK,qBAAqB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;OACpF,EACD;YACE,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC;YACxC,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,mCAAmC;SAC1C,CACF,CAAA;IACH,CAAC;;AAhDD,sDAAsD;AAC/C,iCAAU,GAAG,IAAI,AAAP,CAAO;AAFb,sBAAsB;IADlC,aAAa,CAAC,2BAA2B,CAAC;GAC9B,sBAAsB,CAkDlC","sourcesContent":["import './ox-popup-privilege-input.js'\n\nimport { html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { OxGristEditor } from '@operato/data-grist'\nimport { i18next } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\n\n@customElement('ox-grist-editor-privilege')\nexport class OxGristEditorPrivilege extends OxGristEditor {\n /* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */\n static opensPopup = true\n\n get editorTemplate() {\n return html` <div tabindex=\"0\">...</div> `\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n this.showEditorPopup()\n }\n\n _onkeydown(e: KeyboardEvent): void {\n const key = e.key\n if (key == 'Enter') {\n e.stopPropagation()\n this.showEditorPopup()\n }\n }\n\n showEditorPopup() {\n var change = (value: string) => {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: this.value,\n after: value,\n column: this.column,\n record: this.record,\n row: this.row\n }\n })\n )\n }\n\n var popup = openPopup(\n html`\n <ox-popup-privilege-input .value=${this.value} .confirmCallback=${change.bind(this)}></ox-popup-privilege-input>\n `,\n {\n backdrop: true,\n title: i18next.t('title.edit privilege'),\n size: 'medium',\n help: 'data-grist/grist-editor/privilege'\n }\n )\n }\n}\n"]}
|
|
@@ -17,6 +17,8 @@ let OxGristEditorResourceCode = class OxGristEditorResourceCode extends OxGristE
|
|
|
17
17
|
`;
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
|
+
/* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */
|
|
21
|
+
OxGristEditorResourceCode.opensPopup = true;
|
|
20
22
|
OxGristEditorResourceCode = __decorate([
|
|
21
23
|
customElement('ox-grist-editor-resource-code')
|
|
22
24
|
], OxGristEditorResourceCode);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-grist-editor-resource-code.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-resource-code.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,EAAE,aAAa,EAAgB,MAAM,qBAAqB,CAAA;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AASnB,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,aAAa;
|
|
1
|
+
{"version":3,"file":"ox-grist-editor-resource-code.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-resource-code.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,EAAE,aAAa,EAAgB,MAAM,qBAAqB,CAAA;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AASnB,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,aAAa;IAI1D,IAAI,cAAc;QAChB,IAAI,EAAE,KAAK,EAAE,aAAa,GAAG,WAAW,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAA;QAErE,OAAO,IAAI,CAAA;;UAEL,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CACjB,CAAC,IAAsB,EAAE,EAAE,CAAC,IAAI,CAAA;gCACV,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI;gBAC1D,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;;WAEtG,CACF;;KAEJ,CAAA;IACH,CAAC;;AAjBD,sDAAsD;AAC/C,oCAAU,GAAG,IAAI,AAAP,CAAO;AAFb,yBAAyB;IADrC,aAAa,CAAC,+BAA+B,CAAC;GAClC,yBAAyB,CAmBrC","sourcesContent":["import '@material/web/icon/icon.js'\nimport { OxGristEditor, RecordConfig } from '@operato/data-grist'\n\nimport { customElement } from 'lit/decorators.js'\nimport { html } from 'lit'\n\ntype CommonCodeDetail = {\n name: string\n description: string\n rank: number\n}\n\n@customElement('ox-grist-editor-resource-code')\nexport class OxGristEditorResourceCode extends OxGristEditor {\n /* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */\n static opensPopup = true\n\n get editorTemplate() {\n var { codes, selectDispOpt = 'code-name' } = this.column.record || {}\n\n return html`\n <select>\n ${(codes || []).map(\n (code: CommonCodeDetail) => html`\n <option ?selected=${code.name == this.value} value=${code.name}>\n ${code.name == '' ? '' : selectDispOpt.replace('name', code.description).replace('code', code.name)}\n </option>\n `\n )}\n </select>\n `\n }\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import '@material/web/icon/icon.js';
|
|
|
2
2
|
import '../selector/ox-selector-resource-id.js';
|
|
3
3
|
import { OxGristEditor } from '@operato/data-grist';
|
|
4
4
|
export declare class OxGristEditorResourceId extends OxGristEditor {
|
|
5
|
+
static opensPopup: boolean;
|
|
5
6
|
private popup?;
|
|
6
7
|
render(): import("lit-html").TemplateResult<1>;
|
|
7
8
|
_onclick(e: Event): void;
|
|
@@ -70,6 +70,8 @@ let OxGristEditorResourceId = class OxGristEditorResourceId extends OxGristEdito
|
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
};
|
|
73
|
+
/* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */
|
|
74
|
+
OxGristEditorResourceId.opensPopup = true;
|
|
73
75
|
OxGristEditorResourceId = __decorate([
|
|
74
76
|
customElement('ox-grist-editor-resource-id')
|
|
75
77
|
], OxGristEditorResourceId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-grist-editor-resource-id.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-resource-id.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,wCAAwC,CAAA;AAE/C,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAe,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAA;AAGjD,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,aAAa;
|
|
1
|
+
{"version":3,"file":"ox-grist-editor-resource-id.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-resource-id.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '../selector/ox-selector-resource-id.js'\n\nimport { html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { GristRecord, OxGristEditor } from '@operato/data-grist'\nimport { openPopup, PopupHandle } from '@operato/layout'\n\n@customElement('ox-grist-editor-resource-id')\nexport class OxGristEditorResourceId extends OxGristEditor {\n /* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */\n static opensPopup = true\n\n private popup?: PopupHandle\n\n render() {\n var { nameField = 'name', descriptionField = 'description' } = this.column.record.options || {}\n var value = this.value\n\n return html`\n ${!value\n ? html`<span tabindex=\"0\"></span>`\n : html` <span tabindex=\"0\">${value[nameField]} (${value[descriptionField]})</span> `}\n <md-icon>arrow_drop_down</md-icon>\n `\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n this.openSelector()\n }\n\n _onkeydown(e: KeyboardEvent): void {\n const key = e.key\n if (key == 'Enter') {\n e.stopPropagation()\n this.openSelector()\n }\n }\n\n openSelector() {\n if (this.popup) {\n delete this.popup\n }\n\n const confirmCallback: (record?: GristRecord) => void = selected => {\n if (!selected) {\n return\n }\n\n var { idField = 'id', nameField = 'name', descriptionField = 'description' } = this.column.record.options || {}\n\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: this.value,\n after: selected\n ? {\n [idField]: selected[idField],\n [nameField]: selected[nameField],\n [descriptionField]: selected[descriptionField]\n }\n : null,\n record: this.record,\n column: this.column,\n row: this.row\n }\n })\n )\n }\n\n var value = this.value || {}\n var template = html`\n <ox-selector-resource-id\n .value=${value.id}\n .confirmCallback=${confirmCallback.bind(this)}\n .queryName=${this.column.record.options.queryName}\n .basicArgs=${this.column.record.options.basicArgs}\n ></ox-selector-resource-id>\n `\n\n this.popup = openPopup(template, {\n backdrop: true,\n size: 'large',\n title: 'select item'\n })\n }\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import '../selector/ox-selector-resource-object-legacy.js';
|
|
|
2
2
|
import { TemplateResult } from 'lit';
|
|
3
3
|
import { OxGristEditor } from '@operato/data-grist';
|
|
4
4
|
export declare class OxGristEditorResourceObjectLegacy extends OxGristEditor {
|
|
5
|
+
static opensPopup: boolean;
|
|
5
6
|
private popup?;
|
|
6
7
|
private template?;
|
|
7
8
|
get editorTemplate(): TemplateResult<1>;
|
|
@@ -105,6 +105,8 @@ let OxGristEditorResourceObjectLegacy = class OxGristEditorResourceObjectLegacy
|
|
|
105
105
|
});
|
|
106
106
|
}
|
|
107
107
|
};
|
|
108
|
+
/* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */
|
|
109
|
+
OxGristEditorResourceObjectLegacy.opensPopup = true;
|
|
108
110
|
OxGristEditorResourceObjectLegacy = __decorate([
|
|
109
111
|
customElement('ox-grist-editor-resource-object-legacy')
|
|
110
112
|
], OxGristEditorResourceObjectLegacy);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-grist-editor-resource-object-legacy.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-resource-object-legacy.ts"],"names":[],"mappings":";AAAA,OAAO,mDAAmD,CAAA;AAE1D,OAAO,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAA;AAGjD,IAAM,iCAAiC,GAAvC,MAAM,iCAAkC,SAAQ,aAAa;
|
|
1
|
+
{"version":3,"file":"ox-grist-editor-resource-object-legacy.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-resource-object-legacy.ts"],"names":[],"mappings":"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","sourcesContent":["import '../selector/ox-selector-resource-object-legacy.js'\n\nimport { html, TemplateResult } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { OxGristEditor } from '@operato/data-grist'\nimport { i18next } from '@operato/i18n'\nimport { openPopup, PopupHandle } from '@operato/layout'\n\n@customElement('ox-grist-editor-resource-object-legacy')\nexport class OxGristEditorResourceObjectLegacy extends OxGristEditor {\n /* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */\n static opensPopup = true\n\n private popup?: PopupHandle\n private template?: TemplateResult\n\n get editorTemplate() {\n var value = this.value || {}\n\n var { nameField = 'name', descriptionField = 'description' } = this.column.record.options || {}\n var name, description\n if (typeof nameField === 'function') {\n name = nameField(value)\n } else {\n name = value[nameField]\n }\n\n if (typeof descriptionField === 'function') {\n description = descriptionField(value)\n } else {\n description = value[descriptionField] && `(${value[descriptionField]})`\n }\n\n return html`\n ${!value\n ? html`<span tabindex=\"0\"></span>`\n : html` <span tabindex=\"0\" style=\"flex:1\">${name || ''}${description || ''}</span> `}\n `\n }\n\n async firstUpdated() {\n super.firstUpdated()\n this.template = ((this.column.record || {}).options || {}).template\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n }\n\n _onkeydown(e: KeyboardEvent): void {\n const key = e.key\n if (key == 'Enter') {\n e.stopPropagation()\n this.openSelector()\n }\n }\n\n _ondblclick(e: MouseEvent): void {\n e.stopPropagation()\n this.openSelector()\n }\n\n openSelector() {\n if (this.popup) {\n delete this.popup\n }\n\n var {\n idField = 'id',\n nameField = 'name',\n descriptionField = 'description',\n valueField = 'id',\n queryName,\n basicArgs,\n select,\n list\n } = this.column.record.options || {}\n\n const confirmCallback = (selected?: { [field: string]: any }) => {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: this.value,\n after: selected\n ? {\n ...(this.column.record.options.select || [])\n .map((field: any) => field.name)\n .reduce(\n (obj: { [field: string]: any }, fieldName: string) => {\n return (obj = {\n ...obj,\n [fieldName]: selected[fieldName]\n })\n },\n {} as { [field: string]: any }\n ),\n [idField]: selected[idField],\n [nameField]: selected[nameField],\n [descriptionField]: selected[descriptionField]\n }\n : null,\n record: this.record,\n column: this.column,\n row: this.row\n }\n })\n )\n }\n\n var value = this.value || {}\n var actualValue\n if (typeof valueField === 'function') {\n actualValue = valueField(value)\n } else {\n actualValue = value[valueField]\n }\n\n var template =\n this.template ||\n html`\n <ox-selector-resource-object-legacy\n .value=${actualValue}\n .confirmCallback=${confirmCallback.bind(this)}\n .queryName=${queryName}\n .select=${select}\n .list=${list}\n .basicArgs=${basicArgs}\n .valueField=${valueField}\n ></ox-selector-resource-object-legacy>\n `\n\n this.popup = openPopup(template, {\n backdrop: true,\n size: 'large',\n title: i18next.t('title.select_item')\n })\n }\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import '../selector/ox-selector-resource-object.js';
|
|
|
2
2
|
import { TemplateResult } from 'lit';
|
|
3
3
|
import { OxGristEditor } from '@operato/data-grist';
|
|
4
4
|
export declare class OxGristEditorResourceObject extends OxGristEditor {
|
|
5
|
+
static opensPopup: boolean;
|
|
5
6
|
private popup?;
|
|
6
7
|
private template?;
|
|
7
8
|
get editorTemplate(): TemplateResult<1>;
|
|
@@ -125,6 +125,8 @@ let OxGristEditorResourceObject = class OxGristEditorResourceObject extends OxGr
|
|
|
125
125
|
});
|
|
126
126
|
}
|
|
127
127
|
};
|
|
128
|
+
/* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */
|
|
129
|
+
OxGristEditorResourceObject.opensPopup = true;
|
|
128
130
|
OxGristEditorResourceObject = __decorate([
|
|
129
131
|
customElement('ox-grist-editor-resource-object')
|
|
130
132
|
], OxGristEditorResourceObject);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-grist-editor-resource-object.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-resource-object.ts"],"names":[],"mappings":";AAAA,OAAO,4CAA4C,CAAA;AAEnD,OAAO,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAA;AAGjD,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,aAAa;
|
|
1
|
+
{"version":3,"file":"ox-grist-editor-resource-object.js","sourceRoot":"","sources":["../../../src/grist-editor/ox-grist-editor-resource-object.ts"],"names":[],"mappings":"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","sourcesContent":["import '../selector/ox-selector-resource-object.js'\n\nimport { html, TemplateResult } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { OxGristEditor } from '@operato/data-grist'\nimport { i18next } from '@operato/i18n'\nimport { openPopup, PopupHandle } from '@operato/layout'\n\n@customElement('ox-grist-editor-resource-object')\nexport class OxGristEditorResourceObject extends OxGristEditor {\n /* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */\n static opensPopup = true\n\n private popup?: PopupHandle\n private template?: TemplateResult\n\n get editorTemplate() {\n var value = this.value || {}\n\n var { nameField = 'name', descriptionField = 'description' } = this.column.record.options || {}\n var name, description\n if (typeof nameField === 'function') {\n name = nameField(value)\n } else {\n name = value[nameField]\n }\n\n if (typeof descriptionField === 'function') {\n description = descriptionField(value)\n } else {\n description = value[descriptionField] && `(${value[descriptionField]})`\n }\n\n return html`\n ${!value\n ? html`<span tabindex=\"0\"></span>`\n : html` <span tabindex=\"0\" style=\"flex:1\">${name || ''}${description || ''}</span> `}\n `\n }\n\n async firstUpdated() {\n super.firstUpdated()\n this.template = ((this.column.record || {}).options || {}).template\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n }\n\n _onkeydown(e: KeyboardEvent): void {\n const key = e.key\n if (key == 'Enter') {\n e.stopPropagation()\n this.openSelector()\n }\n }\n\n _ondblclick(e: MouseEvent): void {\n e.stopPropagation()\n this.openSelector()\n }\n\n openSelector() {\n if (this.popup) {\n delete this.popup\n }\n\n var {\n title = '',\n idField = 'id',\n nameField = 'name',\n descriptionField = 'description',\n valueField = 'id',\n queryName,\n basicArgs,\n select,\n columns,\n pagination,\n list\n } = this.column.record.options || {}\n\n if (!queryName) {\n console.warn('queryName is empty')\n return\n }\n\n /* select options is only for compatability, it might be able to be deprecated. */\n columns = columns || select\n\n const confirmCallback = (selected?: { [field: string]: any }) => {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: this.value,\n after: selected\n ? {\n ...(columns || [])\n .map((field: any) => field.name)\n .reduce(\n (obj: { [field: string]: any }, fieldName: string) => {\n return (obj = {\n ...obj,\n [fieldName]: selected[fieldName]\n })\n },\n {} as { [field: string]: any }\n ),\n [idField]: selected[idField],\n [nameField]: selected[nameField],\n [descriptionField]: selected[descriptionField]\n }\n : null,\n record: this.record,\n column: this.column,\n row: this.row\n }\n })\n )\n }\n\n var value = this.value || {}\n var actualValue\n if (typeof valueField === 'function') {\n actualValue = valueField(value)\n } else {\n actualValue = value[valueField]\n }\n\n var template =\n this.template ||\n html`\n <ox-selector-resource-object\n .value=${actualValue}\n .confirmCallback=${confirmCallback.bind(this)}\n .queryName=${queryName}\n .columns=${columns}\n .pagination=${pagination}\n .list=${list}\n .basicArgs=${basicArgs}\n .valueField=${valueField}\n ></ox-selector-resource-object>\n `\n\n this.popup = openPopup(template, {\n backdrop: true,\n size: 'large',\n search: {\n autofocus: true,\n placeholder: title || i18next.t('title.select_item'),\n handler: (instance: any, value: any) => {\n /* instance: template instance */\n instance.searchText(value)\n }\n },\n filter: {\n handler: (instance: any) => {\n /* instance: template instance */\n instance.toggleFilter()\n }\n }\n })\n }\n}\n"]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { LitElement, type TemplateResult } from 'lit';
|
|
2
|
+
/** 그릴 수 있는 노드 하나. `reachable=false` 면 갈 곳이 없다 — 문처럼 보이지 않게 그린다. */
|
|
3
|
+
export interface RelationNode {
|
|
4
|
+
id: string;
|
|
5
|
+
label?: string;
|
|
6
|
+
/**
|
|
7
|
+
* 식별자 자리에 **대신 보일 말** — 없으면 `id` 를 보인다.
|
|
8
|
+
*
|
|
9
|
+
* 정체성은 긴 URI 일 수 있지만(`https://…/class/product-B0000080-lot-L26…`) 사람이 대조하는 것은
|
|
10
|
+
* 원본의 코드다. 부르는 쪽이 그 말을 알고 있으므로 여기서 만들지 않고 받는다 — 이 부품은 뜻을
|
|
11
|
+
* 모른 채 자리만 내준다. 전체 식별자는 도구설명에 그대로 남는다(복사·추적의 키다).
|
|
12
|
+
*/
|
|
13
|
+
sub?: string;
|
|
14
|
+
/** 이 노드가 속한 갈래(축·종류). 부르는 쪽의 어휘 그대로 — 이 부품은 뜻을 알지 않는다. */
|
|
15
|
+
kind?: string;
|
|
16
|
+
/**
|
|
17
|
+
* 걸어갈 수 있나. **막다른 링크는 없는 링크보다 나쁘다** — 눌렀는데 아무 일도 안 일어나면
|
|
18
|
+
* 사용자는 그것을 고장으로 받아들인다. 갈 수 없으면 처음부터 문처럼 보이지 않아야 한다.
|
|
19
|
+
*/
|
|
20
|
+
reachable?: boolean;
|
|
21
|
+
/** 이 이웃이 실제로는 없는 것을 가리킨다(끊어진 참조). 눈에 띄어야 한다. */
|
|
22
|
+
broken?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** 한 관계 묶음 — "무슨 관계로" + "어느 방향으로" 이어진 이웃들. */
|
|
25
|
+
export interface RelationGroup {
|
|
26
|
+
/** 관계 이름(이미 번역된 표시명). 선 위에 적힌다. */
|
|
27
|
+
via: string;
|
|
28
|
+
/** `out` = 내가 가리킨다 · `in` = 나를 가리킨다. */
|
|
29
|
+
direction: 'out' | 'in';
|
|
30
|
+
nodes: RelationNode[];
|
|
31
|
+
/** 전체 건수(상한에 걸려 일부만 왔을 수 있다). 없으면 `nodes.length`. */
|
|
32
|
+
total?: number;
|
|
33
|
+
/** 선언은 되어 있는데 이웃이 없다 — 그루터기로 그린다. */
|
|
34
|
+
empty?: boolean;
|
|
35
|
+
/** 이 관계가 선택인가 — 비어 있음이 결손인지 정상인지 구분한다. */
|
|
36
|
+
optional?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* 이 이어짐을 **어디서 알았나.**
|
|
39
|
+
*
|
|
40
|
+
* `declared` — 원본이 선언한 관계다(모델이 그렇게 생겼다).
|
|
41
|
+
* `observed` — 이벤트에서 함께 나타났다(실제로 그렇게 움직였다).
|
|
42
|
+
*
|
|
43
|
+
* 둘은 다른 사실이고 섞으면 안 된다. 선언에 없는 이어짐을 선언인 것처럼 그리면 사용자는
|
|
44
|
+
* 모델이 그렇게 되어 있다고 믿게 되고, 반대로 관측된 동반을 안 그리면 실제로 함께 움직이는
|
|
45
|
+
* 것을 놓친다. 그래서 **둘 다 그리되 구별해서** 그린다.
|
|
46
|
+
*/
|
|
47
|
+
source?: 'declared' | 'observed';
|
|
48
|
+
/** 관측에서 온 것이면 **어느 범위를 보고 말하는가**(예: 최근 이력 50건). 오류보고없이 자르지 않는다. */
|
|
49
|
+
basis?: string;
|
|
50
|
+
}
|
|
51
|
+
export declare class OxRelationView extends LitElement {
|
|
52
|
+
/** 가운데 — 지금 보고 있는 것. */
|
|
53
|
+
center: RelationNode;
|
|
54
|
+
groups: RelationGroup[];
|
|
55
|
+
/** 이웃이 없는 관계도 그루터기로 남길까. 기본은 **남긴다**(부재가 정보다). */
|
|
56
|
+
hideEmpty: boolean;
|
|
57
|
+
/** 선을 그리려면 위치를 재야 한다 — 재고 나서 한 번 더 그린다. */
|
|
58
|
+
private edges;
|
|
59
|
+
private ro?;
|
|
60
|
+
static styles: import("lit").CSSResult;
|
|
61
|
+
connectedCallback(): void;
|
|
62
|
+
disconnectedCallback(): void;
|
|
63
|
+
protected updated(): void;
|
|
64
|
+
/**
|
|
65
|
+
* 선을 잇는다 — **그린 뒤에 재고, 잰 값이 달라졌을 때만 다시 그린다.**
|
|
66
|
+
* 조건 없이 상태를 쓰면 `updated` → `measure` → `updated` 로 무한히 반복된다.
|
|
67
|
+
*/
|
|
68
|
+
private measure;
|
|
69
|
+
private pick;
|
|
70
|
+
private expand;
|
|
71
|
+
render(): TemplateResult;
|
|
72
|
+
/** 한 묶음 — 관계 이름과 그 관계로 이어진 노드들. */
|
|
73
|
+
private renderGroup;
|
|
74
|
+
/**
|
|
75
|
+
* 노드 하나.
|
|
76
|
+
*
|
|
77
|
+
* **제자리에서 더 펼치지 않는다.** 한때 노드마다 자기 이웃을 오른쪽에 이어 그리게 했는데,
|
|
78
|
+
* 양방향 그래프에서는 자식이 거의 언제나 부모를 도로 보여 준다 — 같은 id 가 사방에 되풀이되고
|
|
79
|
+
* 그림이 아니라 털뭉치가 된다. 깊이는 **걸어서** 간다(노드를 누르면 그것이 가운데가 된다).
|
|
80
|
+
* 한 방향으로 여러 단을 봐야 하는 것(BOM 전개)은 되돌아오는 선이 없는 **다른 읽기**다.
|
|
81
|
+
*/
|
|
82
|
+
private renderNode;
|
|
83
|
+
}
|
|
84
|
+
declare global {
|
|
85
|
+
interface HTMLElementTagNameMap {
|
|
86
|
+
'ox-relation-view': OxRelationView;
|
|
87
|
+
}
|
|
88
|
+
}
|