@fmsim/board 2.0.0-beta.83 → 2.0.0-beta.85
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/custom-elements.json +2961 -2895
- package/dist/src/modeller/property-sidebar/effects/effects.js +8 -1
- package/dist/src/modeller/property-sidebar/effects/effects.js.map +1 -1
- package/dist/src/modeller/property-sidebar/effects/event-handler-adapter.d.ts +44 -0
- package/dist/src/modeller/property-sidebar/effects/event-handler-adapter.js +70 -0
- package/dist/src/modeller/property-sidebar/effects/event-handler-adapter.js.map +1 -0
- package/dist/src/modeller/property-sidebar/effects/property-event.d.ts +12 -2
- package/dist/src/modeller/property-sidebar/effects/property-event.js +20 -11
- package/dist/src/modeller/property-sidebar/effects/property-event.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -36,7 +36,14 @@ export class PropertyEffects extends ScopedElementsMixin(AbstractProperty) {
|
|
|
36
36
|
</fieldset>
|
|
37
37
|
|
|
38
38
|
${this.selected.length == 1
|
|
39
|
-
? html `
|
|
39
|
+
? html `
|
|
40
|
+
<property-event
|
|
41
|
+
value-key="eventHandlers"
|
|
42
|
+
.scene=${this.scene}
|
|
43
|
+
.value=${value.eventHandlers || []}
|
|
44
|
+
>
|
|
45
|
+
</property-event>
|
|
46
|
+
`
|
|
40
47
|
: nothing}
|
|
41
48
|
`;
|
|
42
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../../../../src/modeller/property-sidebar/effects/effects.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,OAAO,0BAA0B,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,OAAO,eAAgB,SAAQ,mBAAmB,CAAC,gBAAgB,CAAC;IAA1E;;QAK6B,aAAQ,GAAgB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../../../../src/modeller/property-sidebar/effects/effects.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,OAAO,0BAA0B,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,OAAO,eAAgB,SAAQ,mBAAmB,CAAC,gBAAgB,CAAC;IAA1E;;QAK6B,aAAQ,GAAgB,EAAE,CAAA;IAqCvD,CAAC;IAnCC,YAAY;QACV,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5E,CAAC;IAED,MAAM,KAAK,cAAc;QACvB,OAAO;YACL,iBAAiB,EAAE,cAAc;YACjC,gBAAgB,EAAE,aAAa;SAChC,CAAA;IACH,CAAC;IAED,MAAM;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QAE9B,OAAO,IAAI,CAAA;;;;;;qDAMsC,KAAK,CAAC,MAAM,IAAI,EAAE;;;QAG/D,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC;YACzB,CAAC,CAAC,IAAI,CAAA;;;uBAGS,IAAI,CAAC,KAAK;uBACV,KAAK,CAAC,aAAa,IAAI,EAAE;;;WAGrC;YACH,CAAC,CAAC,OAAO;KACZ,CAAA;IACH,CAAC;;AAxCM,sBAAM,GAAG,CAAC,mBAAmB,CAAC,AAAxB,CAAwB;AAET;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAmB;AAClB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAc;AACd;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;iDAA2B","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport '@operato/i18n/ox-i18n.js'\n\nimport { html, nothing } from 'lit'\nimport { property } from 'lit/decorators.js'\n\nimport { Component, Properties, Scene } from '@hatiolab/things-scene'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\n\nimport { AbstractProperty } from '../abstract-property.js'\nimport { PropertySharedStyle } from '../property-shared-style.js'\nimport { PropertyEvent } from './property-event.js'\nimport { PropertyShadow } from './property-shadow.js'\n\nexport class PropertyEffects extends ScopedElementsMixin(AbstractProperty) {\n static styles = [PropertySharedStyle]\n\n @property({ type: Object }) value?: Properties\n @property({ type: Object }) scene?: Scene\n @property({ type: Array }) selected: Component[] = []\n\n firstUpdated() {\n this.renderRoot.addEventListener('change', this._onValueChange.bind(this))\n }\n\n static get scopedElements() {\n return {\n 'property-shadow': PropertyShadow,\n 'property-event': PropertyEvent\n }\n }\n\n render() {\n const value = this.value || {}\n\n return html`\n <fieldset>\n <legend>\n <ox-i18n topic=\"board-modeller/effects/shadow\" msgid=\"label.shadow\">shadow</ox-i18n>\n </legend>\n\n <property-shadow value-key=\"shadow\" .value=${value.shadow || {}}> </property-shadow>\n </fieldset>\n\n ${this.selected.length == 1\n ? html`\n <property-event\n value-key=\"eventHandlers\"\n .scene=${this.scene}\n .value=${value.eventHandlers || []}\n >\n </property-event>\n `\n : nothing}\n `\n }\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* 기존 PropertyEvent UI 는 legacy `state.event = { tap: {...} }` 단일 객체
|
|
5
|
+
* 모델 위에 만들어졌으나, things-scene v10 의 신규 모델은
|
|
6
|
+
* `state.eventHandlers: EventHandler[]` 다중 핸들러 배열. dispatcher 가
|
|
7
|
+
* legacy fallback 도 지원하지만, UI 가 신규 모델로 직접 read/write 하도록
|
|
8
|
+
* 정합화한다.
|
|
9
|
+
*
|
|
10
|
+
* 정책 — 사용자 의도에 따른 *최소 호환*:
|
|
11
|
+
* - 신규 모델의 multi-trigger / multi-handler 는 미지원
|
|
12
|
+
* - 기존 UI 그대로 — tap (click) 단일 핸들러만
|
|
13
|
+
* - 다른 trigger 의 핸들러가 이미 배열에 있으면 *건드리지 않는다*
|
|
14
|
+
* (UI 가 모르는 항목은 보존)
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* EventHandler — things-scene v10 의 신규 모델 spec 미러.
|
|
18
|
+
* things-scene root export 에 아직 포함되지 않아 inline 정의.
|
|
19
|
+
* (참조: things-scene/src/interfaces/event-handler.ts:29)
|
|
20
|
+
*/
|
|
21
|
+
export interface EventHandler {
|
|
22
|
+
trigger: string;
|
|
23
|
+
action?: string;
|
|
24
|
+
code?: string;
|
|
25
|
+
target?: string;
|
|
26
|
+
value?: any;
|
|
27
|
+
options?: Record<string, any>;
|
|
28
|
+
disabled?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** legacy tap 객체 형태 — PropertyEventTap UI 가 다루는 모양. */
|
|
31
|
+
export interface LegacyTap {
|
|
32
|
+
action?: string;
|
|
33
|
+
target?: string;
|
|
34
|
+
value?: any;
|
|
35
|
+
pressed?: boolean;
|
|
36
|
+
options?: Record<string, any>;
|
|
37
|
+
}
|
|
38
|
+
/** trigger 가 click/tap 인 첫 핸들러를 legacy tap 객체로 변환. */
|
|
39
|
+
export declare function eventHandlersToLegacyTap(handlers: EventHandler[] | undefined): LegacyTap;
|
|
40
|
+
/**
|
|
41
|
+
* 기존 배열에서 click/tap 항목을 새 값으로 교체 (또는 push, 또는 제거).
|
|
42
|
+
* 다른 trigger 항목은 그대로 보존.
|
|
43
|
+
*/
|
|
44
|
+
export declare function applyLegacyTapToHandlers(handlers: EventHandler[] | undefined, newTap: LegacyTap | undefined): EventHandler[];
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** trigger 가 click/tap 인 첫 핸들러를 legacy tap 객체로 변환. */
|
|
2
|
+
export function eventHandlersToLegacyTap(handlers) {
|
|
3
|
+
var _a, _b;
|
|
4
|
+
if (!Array.isArray(handlers))
|
|
5
|
+
return {};
|
|
6
|
+
const h = handlers.find(h => h.trigger === 'click' || h.trigger === 'tap');
|
|
7
|
+
if (!h)
|
|
8
|
+
return {};
|
|
9
|
+
// action='script' 인 경우 code 를 value 자리로 노출 — legacy UI 가 value
|
|
10
|
+
// 텍스트 영역에 script 를 넣어 쓰던 관습 보존.
|
|
11
|
+
if (h.action === 'script') {
|
|
12
|
+
return { action: 'script', target: h.target, value: (_a = h.code) !== null && _a !== void 0 ? _a : '' };
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
action: h.action,
|
|
16
|
+
target: h.target,
|
|
17
|
+
value: h.value,
|
|
18
|
+
pressed: (_b = h.options) === null || _b === void 0 ? void 0 : _b.pressed,
|
|
19
|
+
options: h.options
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** legacy tap 객체 → EventHandler. action 없으면 null (= 삭제 의미). */
|
|
23
|
+
function legacyTapToEventHandler(tap) {
|
|
24
|
+
var _a;
|
|
25
|
+
if (!tap)
|
|
26
|
+
return null;
|
|
27
|
+
// action 이 비어있고 target/value 도 없으면 의미 있는 데이터 없음 → 제거
|
|
28
|
+
const hasContent = !!(tap.action || tap.target || tap.value);
|
|
29
|
+
if (!hasContent)
|
|
30
|
+
return null;
|
|
31
|
+
if (tap.action === 'script') {
|
|
32
|
+
return {
|
|
33
|
+
trigger: 'click',
|
|
34
|
+
action: 'script',
|
|
35
|
+
code: typeof tap.value === 'string' ? tap.value : '',
|
|
36
|
+
target: tap.target
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// pressed 는 legacy 의 *최상위 키* 였지만 신규 모델에선 options 의 일부.
|
|
40
|
+
const options = { ...((_a = tap.options) !== null && _a !== void 0 ? _a : {}) };
|
|
41
|
+
if (tap.pressed !== undefined)
|
|
42
|
+
options.pressed = tap.pressed;
|
|
43
|
+
return {
|
|
44
|
+
trigger: 'click',
|
|
45
|
+
action: tap.action,
|
|
46
|
+
target: tap.target,
|
|
47
|
+
value: tap.value,
|
|
48
|
+
...(Object.keys(options).length > 0 ? { options } : {})
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 기존 배열에서 click/tap 항목을 새 값으로 교체 (또는 push, 또는 제거).
|
|
53
|
+
* 다른 trigger 항목은 그대로 보존.
|
|
54
|
+
*/
|
|
55
|
+
export function applyLegacyTapToHandlers(handlers, newTap) {
|
|
56
|
+
const out = Array.isArray(handlers) ? [...handlers] : [];
|
|
57
|
+
const idx = out.findIndex(h => h.trigger === 'click' || h.trigger === 'tap');
|
|
58
|
+
const newHandler = legacyTapToEventHandler(newTap);
|
|
59
|
+
if (newHandler) {
|
|
60
|
+
if (idx >= 0)
|
|
61
|
+
out[idx] = newHandler;
|
|
62
|
+
else
|
|
63
|
+
out.push(newHandler);
|
|
64
|
+
}
|
|
65
|
+
else if (idx >= 0) {
|
|
66
|
+
out.splice(idx, 1);
|
|
67
|
+
}
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=event-handler-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-handler-adapter.js","sourceRoot":"","sources":["../../../../../src/modeller/property-sidebar/effects/event-handler-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n *\n * 기존 PropertyEvent UI 는 legacy `state.event = { tap: {...} }` 단일 객체\n * 모델 위에 만들어졌으나, things-scene v10 의 신규 모델은\n * `state.eventHandlers: EventHandler[]` 다중 핸들러 배열. dispatcher 가\n * legacy fallback 도 지원하지만, UI 가 신규 모델로 직접 read/write 하도록\n * 정합화한다.\n *\n * 정책 — 사용자 의도에 따른 *최소 호환*:\n * - 신규 모델의 multi-trigger / multi-handler 는 미지원\n * - 기존 UI 그대로 — tap (click) 단일 핸들러만\n * - 다른 trigger 의 핸들러가 이미 배열에 있으면 *건드리지 않는다*\n * (UI 가 모르는 항목은 보존)\n */\n/**\n * EventHandler — things-scene v10 의 신규 모델 spec 미러.\n * things-scene root export 에 아직 포함되지 않아 inline 정의.\n * (참조: things-scene/src/interfaces/event-handler.ts:29)\n */\nexport interface EventHandler {\n trigger: string\n action?: string\n code?: string\n target?: string\n value?: any\n options?: Record<string, any>\n disabled?: boolean\n}\n\n/** legacy tap 객체 형태 — PropertyEventTap UI 가 다루는 모양. */\nexport interface LegacyTap {\n action?: string\n target?: string\n value?: any\n pressed?: boolean\n options?: Record<string, any>\n}\n\n/** trigger 가 click/tap 인 첫 핸들러를 legacy tap 객체로 변환. */\nexport function eventHandlersToLegacyTap(handlers: EventHandler[] | undefined): LegacyTap {\n if (!Array.isArray(handlers)) return {}\n const h = handlers.find(h => h.trigger === 'click' || h.trigger === 'tap')\n if (!h) return {}\n\n // action='script' 인 경우 code 를 value 자리로 노출 — legacy UI 가 value\n // 텍스트 영역에 script 를 넣어 쓰던 관습 보존.\n if (h.action === 'script') {\n return { action: 'script', target: h.target, value: h.code ?? '' }\n }\n\n return {\n action: h.action,\n target: h.target,\n value: h.value,\n pressed: h.options?.pressed,\n options: h.options\n }\n}\n\n/** legacy tap 객체 → EventHandler. action 없으면 null (= 삭제 의미). */\nfunction legacyTapToEventHandler(tap: LegacyTap | undefined): EventHandler | null {\n if (!tap) return null\n // action 이 비어있고 target/value 도 없으면 의미 있는 데이터 없음 → 제거\n const hasContent = !!(tap.action || tap.target || tap.value)\n if (!hasContent) return null\n\n if (tap.action === 'script') {\n return {\n trigger: 'click',\n action: 'script',\n code: typeof tap.value === 'string' ? tap.value : '',\n target: tap.target\n }\n }\n\n // pressed 는 legacy 의 *최상위 키* 였지만 신규 모델에선 options 의 일부.\n const options: Record<string, any> = { ...(tap.options ?? {}) }\n if (tap.pressed !== undefined) options.pressed = tap.pressed\n\n return {\n trigger: 'click',\n action: tap.action,\n target: tap.target,\n value: tap.value,\n ...(Object.keys(options).length > 0 ? { options } : {})\n }\n}\n\n/**\n * 기존 배열에서 click/tap 항목을 새 값으로 교체 (또는 push, 또는 제거).\n * 다른 trigger 항목은 그대로 보존.\n */\nexport function applyLegacyTapToHandlers(\n handlers: EventHandler[] | undefined,\n newTap: LegacyTap | undefined\n): EventHandler[] {\n const out: EventHandler[] = Array.isArray(handlers) ? [...handlers] : []\n const idx = out.findIndex(h => h.trigger === 'click' || h.trigger === 'tap')\n const newHandler = legacyTapToEventHandler(newTap)\n\n if (newHandler) {\n if (idx >= 0) out[idx] = newHandler\n else out.push(newHandler)\n } else if (idx >= 0) {\n out.splice(idx, 1)\n }\n return out\n}\n"]}
|
|
@@ -2,12 +2,22 @@
|
|
|
2
2
|
* @license Copyright © HatioLab Inc. All rights reserved.
|
|
3
3
|
*/
|
|
4
4
|
import { LitElement } from 'lit';
|
|
5
|
-
import {
|
|
5
|
+
import { Scene } from '@hatiolab/things-scene';
|
|
6
6
|
import { PropertyEventTap } from './property-event-tap';
|
|
7
|
+
import { EventHandler } from './event-handler-adapter.js';
|
|
7
8
|
declare const PropertyEvent_base: typeof LitElement & import("@open-wc/dedupe-mixin").Constructor<import("@open-wc/scoped-elements/types.js").ScopedElementsHost>;
|
|
9
|
+
/**
|
|
10
|
+
* things-scene v10 의 신규 모델 (`state.eventHandlers: EventHandler[]`) 위에서
|
|
11
|
+
* 기존 단일-tap UI 를 그대로 동작시키는 어댑터.
|
|
12
|
+
*
|
|
13
|
+
* read : eventHandlers 배열에서 trigger='click'/'tap' 인 첫 항목 → legacy tap
|
|
14
|
+
* 객체로 변환 후 PropertyEventTap 에 전달.
|
|
15
|
+
* write: PropertyEventTap 이 emit 한 legacy tap 변경 → click 항목을 update/push
|
|
16
|
+
* 한 새 배열로 외부에 emit. 다른 trigger 의 핸들러는 보존.
|
|
17
|
+
*/
|
|
8
18
|
export declare class PropertyEvent extends PropertyEvent_base {
|
|
9
19
|
static styles: import("lit").CSSResult[];
|
|
10
|
-
value?:
|
|
20
|
+
value?: EventHandler[];
|
|
11
21
|
scene?: Scene;
|
|
12
22
|
firstUpdated(): void;
|
|
13
23
|
static get scopedElements(): {
|
|
@@ -8,6 +8,16 @@ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
|
|
|
8
8
|
import { PropertySharedStyle } from '../property-shared-style';
|
|
9
9
|
import { PropertyEventTap } from './property-event-tap';
|
|
10
10
|
import { convert } from './value-converter';
|
|
11
|
+
import { applyLegacyTapToHandlers, eventHandlersToLegacyTap } from './event-handler-adapter.js';
|
|
12
|
+
/**
|
|
13
|
+
* things-scene v10 의 신규 모델 (`state.eventHandlers: EventHandler[]`) 위에서
|
|
14
|
+
* 기존 단일-tap UI 를 그대로 동작시키는 어댑터.
|
|
15
|
+
*
|
|
16
|
+
* read : eventHandlers 배열에서 trigger='click'/'tap' 인 첫 항목 → legacy tap
|
|
17
|
+
* 객체로 변환 후 PropertyEventTap 에 전달.
|
|
18
|
+
* write: PropertyEventTap 이 emit 한 legacy tap 변경 → click 항목을 update/push
|
|
19
|
+
* 한 새 배열로 외부에 emit. 다른 trigger 의 핸들러는 보존.
|
|
20
|
+
*/
|
|
11
21
|
export class PropertyEvent extends ScopedElementsMixin(LitElement) {
|
|
12
22
|
firstUpdated() {
|
|
13
23
|
this.renderRoot.addEventListener('change', this._onValueChange.bind(this));
|
|
@@ -18,33 +28,32 @@ export class PropertyEvent extends ScopedElementsMixin(LitElement) {
|
|
|
18
28
|
};
|
|
19
29
|
}
|
|
20
30
|
render() {
|
|
21
|
-
const
|
|
31
|
+
const tap = eventHandlersToLegacyTap(this.value);
|
|
22
32
|
return html `
|
|
23
33
|
<fieldset>
|
|
24
34
|
<legend>
|
|
25
35
|
<ox-i18n msgid="label.tap-event" topic="board-modeller/effects/tap-event"></ox-i18n>
|
|
26
36
|
</legend>
|
|
27
37
|
|
|
28
|
-
<property-event-tap value-key="tap" .scene=${this.scene} .value=${
|
|
38
|
+
<property-event-tap value-key="tap" .scene=${this.scene} .value=${tap}> </property-event-tap>
|
|
29
39
|
</fieldset>
|
|
30
40
|
`;
|
|
31
41
|
}
|
|
32
42
|
_onValueChange(e) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
43
|
+
const element = e.target;
|
|
44
|
+
const key = element.getAttribute('value-key');
|
|
45
|
+
// 어댑터는 tap 트리거 하나만 처리. PropertyEventTap host 가 retarget 된
|
|
46
|
+
// change 의 value-key 만 받아들이고, 자식 input 의 raw change 는 무시.
|
|
47
|
+
if (key !== 'tap')
|
|
36
48
|
return;
|
|
37
|
-
|
|
38
|
-
this.value =
|
|
39
|
-
...this.value,
|
|
40
|
-
[key]: convert(element)
|
|
41
|
-
};
|
|
49
|
+
const newTap = convert(element);
|
|
50
|
+
this.value = applyLegacyTapToHandlers(this.value, newTap);
|
|
42
51
|
this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }));
|
|
43
52
|
}
|
|
44
53
|
}
|
|
45
54
|
PropertyEvent.styles = [PropertySharedStyle];
|
|
46
55
|
__decorate([
|
|
47
|
-
property({ type:
|
|
56
|
+
property({ type: Array })
|
|
48
57
|
], PropertyEvent.prototype, "value", void 0);
|
|
49
58
|
__decorate([
|
|
50
59
|
property({ type: Object })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"property-event.js","sourceRoot":"","sources":["../../../../../src/modeller/property-sidebar/effects/property-event.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"property-event.js","sourceRoot":"","sources":["../../../../../src/modeller/property-sidebar/effects/property-event.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EAGzB,MAAM,4BAA4B,CAAA;AAEnC;;;;;;;;GAQG;AACH,MAAM,OAAO,aAAc,SAAQ,mBAAmB,CAAC,UAAU,CAAC;IAMhE,YAAY;QACV,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5E,CAAC;IAED,MAAM,KAAK,cAAc;QACvB,OAAO;YACL,oBAAoB,EAAE,gBAAgB;SACvC,CAAA;IACH,CAAC;IAED,MAAM;QACJ,MAAM,GAAG,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAEhD,OAAO,IAAI,CAAA;;;;;;qDAMsC,IAAI,CAAC,KAAK,WAAW,GAAG;;KAExE,CAAA;IACH,CAAC;IAED,cAAc,CAAC,CAAQ;QACrB,MAAM,OAAO,GAAG,CAAC,CAAC,MAAqB,CAAA;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;QAE7C,0DAA0D;QAC1D,0DAA0D;QAC1D,IAAI,GAAG,KAAK,KAAK;YAAE,OAAM;QAEzB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAc,CAAA;QAC5C,IAAI,CAAC,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAEzD,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAClF,CAAC;;AAzCM,oBAAM,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAEV;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;4CAAuB;AACrB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAc","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { html, LitElement } from 'lit'\nimport { property } from 'lit/decorators.js'\n\nimport { Scene } from '@hatiolab/things-scene'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\n\nimport { PropertySharedStyle } from '../property-shared-style'\nimport { PropertyEventTap } from './property-event-tap'\nimport { convert } from './value-converter'\nimport {\n applyLegacyTapToHandlers,\n eventHandlersToLegacyTap,\n EventHandler,\n LegacyTap\n} from './event-handler-adapter.js'\n\n/**\n * things-scene v10 의 신규 모델 (`state.eventHandlers: EventHandler[]`) 위에서\n * 기존 단일-tap UI 를 그대로 동작시키는 어댑터.\n *\n * read : eventHandlers 배열에서 trigger='click'/'tap' 인 첫 항목 → legacy tap\n * 객체로 변환 후 PropertyEventTap 에 전달.\n * write: PropertyEventTap 이 emit 한 legacy tap 변경 → click 항목을 update/push\n * 한 새 배열로 외부에 emit. 다른 trigger 의 핸들러는 보존.\n */\nexport class PropertyEvent extends ScopedElementsMixin(LitElement) {\n static styles = [PropertySharedStyle]\n\n @property({ type: Array }) value?: EventHandler[]\n @property({ type: Object }) scene?: Scene\n\n firstUpdated() {\n this.renderRoot.addEventListener('change', this._onValueChange.bind(this))\n }\n\n static get scopedElements() {\n return {\n 'property-event-tap': PropertyEventTap\n }\n }\n\n render() {\n const tap = eventHandlersToLegacyTap(this.value)\n\n return html`\n <fieldset>\n <legend>\n <ox-i18n msgid=\"label.tap-event\" topic=\"board-modeller/effects/tap-event\"></ox-i18n>\n </legend>\n\n <property-event-tap value-key=\"tap\" .scene=${this.scene} .value=${tap}> </property-event-tap>\n </fieldset>\n `\n }\n\n _onValueChange(e: Event) {\n const element = e.target as HTMLElement\n const key = element.getAttribute('value-key')\n\n // 어댑터는 tap 트리거 하나만 처리. PropertyEventTap host 가 retarget 된\n // change 의 value-key 만 받아들이고, 자식 input 의 raw change 는 무시.\n if (key !== 'tap') return\n\n const newTap = convert(element) as LegacyTap\n this.value = applyLegacyTapToHandlers(this.value, newTap)\n\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))\n }\n}\n"]}
|