@fmsim/board 2.0.0-beta.106 → 2.0.0-beta.107
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 +2177 -2109
- package/dist/src/config/flow-replay.d.ts +14 -0
- package/dist/src/config/flow-replay.js +20 -0
- package/dist/src/config/flow-replay.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/layers/mcs-mouse-event-handler.js +9 -3
- package/dist/src/layers/mcs-mouse-event-handler.js.map +1 -1
- package/dist/src/ox-board-viewer.js +9 -5
- package/dist/src/ox-board-viewer.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flow-Replay(플레이백 = 과거 흐름 재생) 기능 ON/OFF 전역 설정.
|
|
3
|
+
*
|
|
4
|
+
* 3D 기능(things-scene 의 setThreedEnabled/isThreedEnabled)과 같은 방식이지만,
|
|
5
|
+
* 플레이백은 전적으로 fmsim(board) 안의 기능이라 엔진 전역이 아니라 fmsim 전역으로 둔다.
|
|
6
|
+
* 부트스트랩이 <things-app flow-replay-enabled="false"> 를 딱 한 번 읽어 여기에 밀어넣고,
|
|
7
|
+
* 뷰어(ox-board-viewer)가 이 값을 참조해 재생 FAB·시작 경로를 게이팅한다.
|
|
8
|
+
*
|
|
9
|
+
* 판정 규칙은 3D 와 동일한 opt-out: 명시적으로 "false" 일 때만 비활성, 그 외 전부 활성(기본 ON).
|
|
10
|
+
*/
|
|
11
|
+
/** Flow-Replay(플레이백) 전역 활성 여부 설정. 부트스트랩에서 한 번 호출. */
|
|
12
|
+
export declare function setFlowReplayEnabled(enabled: boolean): void;
|
|
13
|
+
/** Flow-Replay(플레이백) 전역 활성 여부. 기본 true(활성). */
|
|
14
|
+
export declare function isFlowReplayEnabled(): boolean;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flow-Replay(플레이백 = 과거 흐름 재생) 기능 ON/OFF 전역 설정.
|
|
3
|
+
*
|
|
4
|
+
* 3D 기능(things-scene 의 setThreedEnabled/isThreedEnabled)과 같은 방식이지만,
|
|
5
|
+
* 플레이백은 전적으로 fmsim(board) 안의 기능이라 엔진 전역이 아니라 fmsim 전역으로 둔다.
|
|
6
|
+
* 부트스트랩이 <things-app flow-replay-enabled="false"> 를 딱 한 번 읽어 여기에 밀어넣고,
|
|
7
|
+
* 뷰어(ox-board-viewer)가 이 값을 참조해 재생 FAB·시작 경로를 게이팅한다.
|
|
8
|
+
*
|
|
9
|
+
* 판정 규칙은 3D 와 동일한 opt-out: 명시적으로 "false" 일 때만 비활성, 그 외 전부 활성(기본 ON).
|
|
10
|
+
*/
|
|
11
|
+
let _flowReplayEnabled = true;
|
|
12
|
+
/** Flow-Replay(플레이백) 전역 활성 여부 설정. 부트스트랩에서 한 번 호출. */
|
|
13
|
+
export function setFlowReplayEnabled(enabled) {
|
|
14
|
+
_flowReplayEnabled = enabled;
|
|
15
|
+
}
|
|
16
|
+
/** Flow-Replay(플레이백) 전역 활성 여부. 기본 true(활성). */
|
|
17
|
+
export function isFlowReplayEnabled() {
|
|
18
|
+
return _flowReplayEnabled;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=flow-replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-replay.js","sourceRoot":"","sources":["../../../src/config/flow-replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,IAAI,kBAAkB,GAAG,IAAI,CAAA;AAE7B,qDAAqD;AACrD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,kBAAkB,GAAG,OAAO,CAAA;AAC9B,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,mBAAmB;IACjC,OAAO,kBAAkB,CAAA;AAC3B,CAAC","sourcesContent":["/**\n * Flow-Replay(플레이백 = 과거 흐름 재생) 기능 ON/OFF 전역 설정.\n *\n * 3D 기능(things-scene 의 setThreedEnabled/isThreedEnabled)과 같은 방식이지만,\n * 플레이백은 전적으로 fmsim(board) 안의 기능이라 엔진 전역이 아니라 fmsim 전역으로 둔다.\n * 부트스트랩이 <things-app flow-replay-enabled=\"false\"> 를 딱 한 번 읽어 여기에 밀어넣고,\n * 뷰어(ox-board-viewer)가 이 값을 참조해 재생 FAB·시작 경로를 게이팅한다.\n *\n * 판정 규칙은 3D 와 동일한 opt-out: 명시적으로 \"false\" 일 때만 비활성, 그 외 전부 활성(기본 ON).\n */\n\nlet _flowReplayEnabled = true\n\n/** Flow-Replay(플레이백) 전역 활성 여부 설정. 부트스트랩에서 한 번 호출. */\nexport function setFlowReplayEnabled(enabled: boolean): void {\n _flowReplayEnabled = enabled\n}\n\n/** Flow-Replay(플레이백) 전역 활성 여부. 기본 true(활성). */\nexport function isFlowReplayEnabled(): boolean {\n return _flowReplayEnabled\n}\n"]}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './types.js';
|
|
2
|
+
export { setFlowReplayEnabled, isFlowReplayEnabled } from './config/flow-replay.js';
|
|
2
3
|
export { registerDefaultGroups } from './component/register-default-groups.js';
|
|
3
4
|
export { DataStorage } from './data-storage/data-storage.js';
|
|
4
5
|
export { PlaybackEngine } from './playback/playback-engine.js';
|
package/dist/src/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './types.js';
|
|
2
|
+
export { setFlowReplayEnabled, isFlowReplayEnabled } from './config/flow-replay.js';
|
|
2
3
|
export { registerDefaultGroups } from './component/register-default-groups.js';
|
|
3
4
|
export { DataStorage } from './data-storage/data-storage.js';
|
|
4
5
|
export { PlaybackEngine } from './playback/playback-engine.js';
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAE1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAGrE,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAElC,cAAc,sBAAsB,CAAA","sourcesContent":["export * from './types.js'\n\nexport { registerDefaultGroups } from './component/register-default-groups.js'\nexport { DataStorage } from './data-storage/data-storage.js'\nexport { PlaybackEngine } from './playback/playback-engine.js'\nexport { BoardModelCache } from './data-storage/board-model-cache.js'\nexport type { CachedBoard } from './data-storage/board-model-cache.js'\n\nexport * from './ox-board-viewer.js'\nexport * from './ox-board-modeller.js'\nexport * from './ox-board-list.js'\n\nexport * from './component/index.js'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAE1B,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAGrE,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAElC,cAAc,sBAAsB,CAAA","sourcesContent":["export * from './types.js'\n\nexport { setFlowReplayEnabled, isFlowReplayEnabled } from './config/flow-replay.js'\nexport { registerDefaultGroups } from './component/register-default-groups.js'\nexport { DataStorage } from './data-storage/data-storage.js'\nexport { PlaybackEngine } from './playback/playback-engine.js'\nexport { BoardModelCache } from './data-storage/board-model-cache.js'\nexport type { CachedBoard } from './data-storage/board-model-cache.js'\n\nexport * from './ox-board-viewer.js'\nexport * from './ox-board-modeller.js'\nexport * from './ox-board-list.js'\n\nexport * from './component/index.js'\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EventMap } from '@hatiolab/things-scene';
|
|
2
2
|
function dispatchFetchLvModelDataByMouseEvent(type, event, target) {
|
|
3
|
-
var _a;
|
|
3
|
+
var _a, _b, _c;
|
|
4
4
|
// 플레이백 모드 — 함수 자체를 실행하지 않음.
|
|
5
5
|
// 1) 외부 모니터링 fetchLvModelDataByMouseEvent window 이벤트 차단
|
|
6
6
|
// 2) realTarget 반환 차단 → onclick 의 후속 clickComponent dispatch 가
|
|
@@ -9,6 +9,10 @@ function dispatchFetchLvModelDataByMouseEvent(type, event, target) {
|
|
|
9
9
|
if ((_a = target === null || target === void 0 ? void 0 : target.root) === null || _a === void 0 ? void 0 : _a.playbackMode)
|
|
10
10
|
return undefined;
|
|
11
11
|
const parent = target.parentObject;
|
|
12
|
+
// CapacityBar(Stocker/Zone) 처럼 세그먼트 게이지를 그리는 컴포넌트는, carrier/abnormal
|
|
13
|
+
// 모드에서 클릭된 세그먼트(Full/Empty/EmptyEmpty/Normal/Abnormal)를 함께 실어 보낸다.
|
|
14
|
+
// capacity 모드·비세그먼트 컴포넌트는 undefined → 필드 미포함.
|
|
15
|
+
const segment = (_c = (_b = target).segmentAtEvent) === null || _c === void 0 ? void 0 : _c.call(_b, event);
|
|
12
16
|
if (target.getState('id')) {
|
|
13
17
|
window.dispatchEvent(new CustomEvent('fetchLvModelDataByMouseEvent', {
|
|
14
18
|
detail: {
|
|
@@ -24,7 +28,8 @@ function dispatchFetchLvModelDataByMouseEvent(type, event, target) {
|
|
|
24
28
|
}
|
|
25
29
|
: null
|
|
26
30
|
},
|
|
27
|
-
data: target.data
|
|
31
|
+
data: target.data,
|
|
32
|
+
...(segment ? { segment } : {})
|
|
28
33
|
}
|
|
29
34
|
}
|
|
30
35
|
}));
|
|
@@ -37,7 +42,8 @@ function dispatchFetchLvModelDataByMouseEvent(type, event, target) {
|
|
|
37
42
|
type,
|
|
38
43
|
event,
|
|
39
44
|
model: parent.state,
|
|
40
|
-
data: parent.data
|
|
45
|
+
data: parent.data,
|
|
46
|
+
...(segment ? { segment } : {})
|
|
41
47
|
}
|
|
42
48
|
}
|
|
43
49
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcs-mouse-event-handler.js","sourceRoot":"","sources":["../../../src/layers/mcs-mouse-event-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAE5D,SAAS,oCAAoC,CAC3C,IAAoC,EACpC,KAAiB,EACjB,MAAgD;;IAEhD,4BAA4B;IAC5B,0DAA0D;IAC1D,iEAAiE;IACjE,iEAAiE;IACjE,sDAAsD;IACtD,IAAI,MAAC,MAAc,aAAd,MAAM,uBAAN,MAAM,CAAU,IAAI,0CAAE,YAAY;QAAE,OAAO,SAAS,CAAA;IAEzD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAA;IAElC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,aAAa,CAClB,IAAI,WAAW,CAAC,8BAA8B,EAAE;YAC9C,MAAM,EAAE;gBACN,KAAK,EAAE;oBACL,IAAI;oBACJ,KAAK;oBACL,KAAK,EAAE;wBACL,GAAG,MAAM,CAAC,KAAK;wBACf,YAAY,EAAE,MAAM;4BAClB,CAAC,CAAC;gCACE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;gCACpB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;6BACzB;4BACH,CAAC,CAAC,IAAI;qBACT;oBACD,IAAI,EAAE,MAAM,CAAC,IAAI;
|
|
1
|
+
{"version":3,"file":"mcs-mouse-event-handler.js","sourceRoot":"","sources":["../../../src/layers/mcs-mouse-event-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventMap } from '@hatiolab/things-scene'\n\nfunction dispatchFetchLvModelDataByMouseEvent(\n type: 'hover' | 'click' | 'dblclick',\n event: MouseEvent,\n target: Component & { parentObject?: Component }\n): Component | undefined {\n // 플레이백 모드 — 함수 자체를 실행하지 않음.\n // 1) 외부 모니터링 fetchLvModelDataByMouseEvent window 이벤트 차단\n // 2) realTarget 반환 차단 → onclick 의 후속 clickComponent dispatch 가\n // realTarget = undefined 로 흘러 popup 등 후속 backend 호출 경로도 비활성\n // (popup 의 detailInfo() 가드와 더불어 백엔드 요청을 차단하는 1차 게이트.)\n if ((target as any)?.root?.playbackMode) return undefined\n\n const parent = target.parentObject\n\n // CapacityBar(Stocker/Zone) 처럼 세그먼트 게이지를 그리는 컴포넌트는, carrier/abnormal\n // 모드에서 클릭된 세그먼트(Full/Empty/EmptyEmpty/Normal/Abnormal)를 함께 실어 보낸다.\n // capacity 모드·비세그먼트 컴포넌트는 undefined → 필드 미포함.\n const segment = (target as any).segmentAtEvent?.(event)\n\n if (target.getState('id')) {\n window.dispatchEvent(\n new CustomEvent('fetchLvModelDataByMouseEvent', {\n detail: {\n value: {\n type,\n event,\n model: {\n ...target.state,\n parentObject: parent\n ? {\n id: parent.get('id'),\n type: parent.get('type')\n }\n : null\n },\n data: target.data,\n ...(segment ? { segment } : {})\n }\n }\n })\n )\n\n return parent || target\n } else if (parent && parent.getState('id')) {\n window.dispatchEvent(\n new CustomEvent('fetchLvModelDataByMouseEvent', {\n detail: {\n value: {\n type,\n event,\n model: parent.state,\n data: parent.data,\n ...(segment ? { segment } : {})\n }\n }\n })\n )\n\n return parent\n }\n}\n\n// function onmouseenter(event: MouseEvent, hint: any) {\n// const target = hint.origin\n\n// event.stopPropagation()\n\n// dispatchFetchLvModelDataByMouseEvent('hover', event, target)\n// }\n\nfunction onclick(event: MouseEvent, hint: any) {\n const target = hint.origin\n\n event.stopPropagation()\n\n setTimeout(() => {\n if (target.currentEvent !== 'dblclick') {\n const realTarget = dispatchFetchLvModelDataByMouseEvent('click', event, target)\n\n window.dispatchEvent(\n new CustomEvent('clickComponent', {\n detail: realTarget || target\n })\n )\n }\n }, 300)\n}\n\nfunction ondblclick(event: MouseEvent, hint: any) {\n const target = hint.origin\n\n setTimeout(() => {\n target.currentEvent = ''\n }, 500)\n\n event.stopPropagation()\n\n target.currentEvent = 'dblclick'\n\n dispatchFetchLvModelDataByMouseEvent('dblclick', event, target)\n}\n\nEventMap.register('mcs-event-handler', {\n 'model-layer': {\n '(all)': {\n // mouseenter: onmouseenter, /* 사용되지 않고 있음 */\n click: onclick,\n dblclick: ondblclick\n }\n }\n})\n"]}
|
|
@@ -9,8 +9,9 @@ import './ox-playback-controls.js';
|
|
|
9
9
|
import { css, html, LitElement, nothing } from 'lit';
|
|
10
10
|
import { customElement, property, query, state } from 'lit/decorators.js';
|
|
11
11
|
import { PlaybackEngine } from './playback/playback-engine.js';
|
|
12
|
+
import { isFlowReplayEnabled } from './config/flow-replay.js';
|
|
12
13
|
import { CarrierTrackingStore } from './playback/carrier-tracking-store.js';
|
|
13
|
-
import { create, LoadTracker, LoadingOverlay, SCENE_MODE, dataLagTracker } from '@hatiolab/things-scene';
|
|
14
|
+
import { create, LoadTracker, LoadingOverlay, SCENE_MODE, dataLagTracker, isThreedEnabled } from '@hatiolab/things-scene';
|
|
14
15
|
import { isIOS, fullscreen, exitfullscreen, togglefullscreen } from '@operato/utils';
|
|
15
16
|
import { ScrollbarStyles } from '@operato/styles';
|
|
16
17
|
import { DataStorage } from './data-storage/data-storage.js';
|
|
@@ -270,7 +271,7 @@ let BoardViewer = BoardViewer_1 = class BoardViewer extends LitElement {
|
|
|
270
271
|
title="fullscreen"
|
|
271
272
|
><md-icon slot="icon">${document.fullscreenElement ? 'fullscreen_exit' : 'fullscreen'}</md-icon></md-fab>`}
|
|
272
273
|
|
|
273
|
-
|
|
274
|
+
${isFlowReplayEnabled() ? html `<md-fab
|
|
274
275
|
class="sub-fab"
|
|
275
276
|
@click=${() => { this._fabExpanded = false; this.onTapPlayback(); }}
|
|
276
277
|
title=${this._playbackActive ? 'stop playback' : 'start playback'}
|
|
@@ -278,9 +279,9 @@ let BoardViewer = BoardViewer_1 = class BoardViewer extends LitElement {
|
|
|
278
279
|
class="fab-icon"
|
|
279
280
|
src=${this._playbackActive ? ICON_FAB_PLAYBACK_STOP : ICON_FAB_PLAYBACK_PLAY}
|
|
280
281
|
alt=${this._playbackActive ? 'stop playback' : 'start playback'}
|
|
281
|
-
/></span></md-fab
|
|
282
|
+
/></span></md-fab>` : nothing}
|
|
282
283
|
|
|
283
|
-
|
|
284
|
+
${isThreedEnabled() ? html `<md-fab
|
|
284
285
|
class="sub-fab"
|
|
285
286
|
@click=${() => { this._fabExpanded = false; this.onTapToggle3D(); }}
|
|
286
287
|
title=${this._is3dMode ? '2D mode' : '3D mode'}
|
|
@@ -288,7 +289,7 @@ let BoardViewer = BoardViewer_1 = class BoardViewer extends LitElement {
|
|
|
288
289
|
class="fab-icon"
|
|
289
290
|
src=${this._is3dMode ? ICON_FAB_MODE_2D : ICON_FAB_MODE_3D}
|
|
290
291
|
alt=${this._is3dMode ? '2D mode' : '3D mode'}
|
|
291
|
-
/></span></md-fab
|
|
292
|
+
/></span></md-fab>` : nothing}
|
|
292
293
|
</div>
|
|
293
294
|
`;
|
|
294
295
|
var prev = !this.hideNavigation
|
|
@@ -859,6 +860,9 @@ let BoardViewer = BoardViewer_1 = class BoardViewer extends LitElement {
|
|
|
859
860
|
}
|
|
860
861
|
onTapPlayback() {
|
|
861
862
|
var _a, _b;
|
|
863
|
+
// Flow-Replay 비활성 시 시작 경로 차단 (FAB 은 이미 숨겨지지만 방어적 가드).
|
|
864
|
+
if (!isFlowReplayEnabled() && !this._playbackActive)
|
|
865
|
+
return;
|
|
862
866
|
if (this._playbackActive) {
|
|
863
867
|
this._onPlaybackStop();
|
|
864
868
|
}
|