@fmsim/board 2.0.0-beta.11 → 2.0.0-beta.111
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 +6502 -2308
- package/demo/index-modeller.html +1 -1
- package/demo/index-player.html +2 -2
- package/demo/index-viewer.html +2 -2
- package/demo/index.html +2 -2
- package/dist/src/board-i18n.d.ts +37 -0
- package/dist/src/board-i18n.js +121 -0
- package/dist/src/board-i18n.js.map +1 -0
- package/dist/src/component/etc.js +36 -0
- package/dist/src/component/etc.js.map +1 -1
- package/dist/src/component/index.d.ts +1 -0
- package/dist/src/component/index.js +1 -0
- package/dist/src/component/index.js.map +1 -1
- package/dist/src/component/restful-property-editor-backdrop-faces.d.ts +50 -0
- package/dist/src/component/restful-property-editor-backdrop-faces.js +524 -0
- package/dist/src/component/restful-property-editor-backdrop-faces.js.map +1 -0
- 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/data-storage/board-model-cache.d.ts +13 -0
- package/dist/src/data-storage/board-model-cache.js +66 -0
- package/dist/src/data-storage/board-model-cache.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/layers/mcs-mouse-event-handler.js +28 -3
- package/dist/src/layers/mcs-mouse-event-handler.js.map +1 -1
- package/dist/src/layers/movement-layer.d.ts +9 -6
- package/dist/src/layers/movement-layer.js +35 -10
- package/dist/src/layers/movement-layer.js.map +1 -1
- package/dist/src/modeller/bulk-create-dialog.d.ts +62 -0
- package/dist/src/modeller/bulk-create-dialog.js +595 -0
- package/dist/src/modeller/bulk-create-dialog.js.map +1 -0
- package/dist/src/modeller/bulk-create.d.ts +107 -0
- package/dist/src/modeller/bulk-create.js +201 -0
- package/dist/src/modeller/bulk-create.js.map +1 -0
- package/dist/src/modeller/component-toolbar/component-menu.d.ts +1 -1
- package/dist/src/modeller/component-toolbar/component-toolbar.d.ts +7 -1
- package/dist/src/modeller/component-toolbar/component-toolbar.js +18 -2
- package/dist/src/modeller/component-toolbar/component-toolbar.js.map +1 -1
- package/dist/src/modeller/edit-toolbar.d.ts +13 -0
- package/dist/src/modeller/edit-toolbar.js +177 -7
- package/dist/src/modeller/edit-toolbar.js.map +1 -1
- package/dist/src/modeller/property-sidebar/abstract-property.js +10 -2
- package/dist/src/modeller/property-sidebar/abstract-property.js.map +1 -1
- package/dist/src/modeller/property-sidebar/data-binding/data-binding.d.ts +1 -1
- package/dist/src/modeller/property-sidebar/effects/effects.d.ts +10 -1
- package/dist/src/modeller/property-sidebar/effects/effects.js +67 -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 +13 -3
- 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/src/modeller/property-sidebar/inspector/inspector-controller.d.ts +66 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-controller.js +288 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-controller.js.map +1 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-group-view.d.ts +15 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-group-view.js +67 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-group-view.js.map +1 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-highlight.d.ts +7 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-highlight.js +25 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-highlight.js.map +1 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-model.d.ts +44 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-model.js +72 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-model.js.map +1 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-tree-view.d.ts +18 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-tree-view.js +61 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector-tree-view.js.map +1 -0
- package/dist/src/modeller/property-sidebar/inspector/inspector.d.ts +17 -12
- package/dist/src/modeller/property-sidebar/inspector/inspector.js +287 -151
- package/dist/src/modeller/property-sidebar/inspector/inspector.js.map +1 -1
- package/dist/src/modeller/property-sidebar/property-sidebar.d.ts +1 -1
- package/dist/src/modeller/property-sidebar/shapes/ox-input-entity-id.d.ts +75 -0
- package/dist/src/modeller/property-sidebar/shapes/ox-input-entity-id.js +355 -0
- package/dist/src/modeller/property-sidebar/shapes/ox-input-entity-id.js.map +1 -0
- package/dist/src/modeller/property-sidebar/shapes/shapes.d.ts +22 -1
- package/dist/src/modeller/property-sidebar/shapes/shapes.js +110 -2
- package/dist/src/modeller/property-sidebar/shapes/shapes.js.map +1 -1
- package/dist/src/modeller/property-sidebar/specifics/parent-object.d.ts +29 -0
- package/dist/src/modeller/property-sidebar/specifics/parent-object.js +74 -0
- package/dist/src/modeller/property-sidebar/specifics/parent-object.js.map +1 -0
- package/dist/src/modeller/property-sidebar/specifics/specifics.d.ts +27 -1
- package/dist/src/modeller/property-sidebar/specifics/specifics.js +95 -3
- package/dist/src/modeller/property-sidebar/specifics/specifics.js.map +1 -1
- package/dist/src/modeller/property-sidebar/styles/styles.d.ts +1 -1
- package/dist/src/modeller/scene-viewer/ox-scene-layer.d.ts +4 -3
- package/dist/src/modeller/scene-viewer/ox-scene-layer.js +2 -1
- package/dist/src/modeller/scene-viewer/ox-scene-layer.js.map +1 -1
- package/dist/src/modeller/scene-viewer/ox-scene-viewer.d.ts +2 -1
- package/dist/src/modeller/scene-viewer/ox-scene-viewer.js +5 -1
- package/dist/src/modeller/scene-viewer/ox-scene-viewer.js.map +1 -1
- package/dist/src/ox-board-component-info.d.ts +1 -0
- package/dist/src/ox-board-component-info.js +42 -2
- package/dist/src/ox-board-component-info.js.map +1 -1
- package/dist/src/ox-board-modeller.d.ts +6 -3
- package/dist/src/ox-board-modeller.js +21 -1
- package/dist/src/ox-board-modeller.js.map +1 -1
- package/dist/src/ox-board-viewer.d.ts +117 -13
- package/dist/src/ox-board-viewer.js +688 -102
- package/dist/src/ox-board-viewer.js.map +1 -1
- package/dist/src/ox-editor-board-selector.d.ts +3 -0
- package/dist/src/ox-editor-board-selector.js +40 -9
- package/dist/src/ox-editor-board-selector.js.map +1 -1
- package/dist/src/ox-playback-controls.d.ts +115 -18
- package/dist/src/ox-playback-controls.js +744 -167
- package/dist/src/ox-playback-controls.js.map +1 -1
- package/dist/src/playback/carrier-tracking-store.d.ts +51 -0
- package/dist/src/playback/carrier-tracking-store.js +115 -0
- package/dist/src/playback/carrier-tracking-store.js.map +1 -0
- package/dist/src/playback/playback-engine.d.ts +106 -0
- package/dist/src/playback/playback-engine.js +395 -0
- package/dist/src/playback/playback-engine.js.map +1 -0
- package/dist/src/scene-monitor-renderer.d.ts +10 -0
- package/dist/src/scene-monitor-renderer.js +226 -0
- package/dist/src/scene-monitor-renderer.js.map +1 -0
- package/dist/src/selector/ox-board-selector.js +14 -2
- package/dist/src/selector/ox-board-selector.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/icons/components/text.png +0 -0
- package/icons/fab/mode-2d.svg +25 -0
- package/icons/fab/mode-3d.svg +25 -0
- package/icons/fab/playback-play.svg +49 -0
- package/icons/fab/playback-stop.svg +50 -0
- package/package.json +8 -4
package/demo/index-modeller.html
CHANGED
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
}
|
|
22
22
|
</style>
|
|
23
23
|
|
|
24
|
-
<link href="/node_modules/@material-design-icons/font/index.css" rel="stylesheet" />
|
|
25
24
|
<link href="/node_modules/@fontsource/roboto/index.css" rel="stylesheet" />
|
|
25
|
+
<link href="/node_modules/material-symbols/index.css" rel="stylesheet" />
|
|
26
26
|
</head>
|
|
27
27
|
<body>
|
|
28
28
|
<div id="demo"></div>
|
package/demo/index-player.html
CHANGED
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
height: 100dvh;
|
|
21
21
|
}
|
|
22
22
|
</style>
|
|
23
|
-
<link href="
|
|
24
|
-
<link href="/node_modules
|
|
23
|
+
<link href="/node_modules/@fontsource/roboto/index.css" rel="stylesheet" />
|
|
24
|
+
<link href="/node_modules/material-symbols/index.css" rel="stylesheet" />
|
|
25
25
|
</head>
|
|
26
26
|
<body>
|
|
27
27
|
<div id="demo"></div>
|
package/demo/index-viewer.html
CHANGED
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
height: 100dvh;
|
|
21
21
|
}
|
|
22
22
|
</style>
|
|
23
|
-
<link href="
|
|
24
|
-
<link href="/node_modules
|
|
23
|
+
<link href="/node_modules/@fontsource/roboto/index.css" rel="stylesheet" />
|
|
24
|
+
<link href="/node_modules/material-symbols/index.css" rel="stylesheet" />
|
|
25
25
|
</head>
|
|
26
26
|
<body>
|
|
27
27
|
<div id="demo"></div>
|
package/demo/index.html
CHANGED
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
height: 100dvh;
|
|
21
21
|
}
|
|
22
22
|
</style>
|
|
23
|
-
<link href="
|
|
24
|
-
<link href="/node_modules
|
|
23
|
+
<link href="/node_modules/@fontsource/roboto/index.css" rel="stylesheet" />
|
|
24
|
+
<link href="/node_modules/material-symbols/index.css" rel="stylesheet" />
|
|
25
25
|
</head>
|
|
26
26
|
<body>
|
|
27
27
|
<div id="demo"></div>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 보드명 다국어의 "현재 언어" 단일 출처.
|
|
3
|
+
*
|
|
4
|
+
* 임베디드(MCS/LV) 환경에서는 호스트가 세션 스토리지 `lv_server_lang` 으로 현재 사용자 언어를
|
|
5
|
+
* 알려주므로 그 값을 권위로 삼는다. `i18next.language` 는 이 앱 자체의 i18n 언어라 호스트 언어와
|
|
6
|
+
* 어긋날 수 있어(보드명만 다른 언어로 표시되는 문제) 쓰지 않는다. `lv_server_lang` 이 없는 단독
|
|
7
|
+
* 실행 등에서만 `i18next.language` 로 폴백한다.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getCurrentLang(): string;
|
|
10
|
+
/** MCS 세션 캐시 ifactI18nObj 의 키 = 지원 언어 목록. 없으면 현재 언어만. */
|
|
11
|
+
export declare function getSupportedLanguages(): string[];
|
|
12
|
+
/**
|
|
13
|
+
* 언어 코드를 사람이 읽기 쉬운 이름으로 변환한다(표시는 현재 UI 언어).
|
|
14
|
+
* Intl.DisplayNames 로 'en'→English, 'en-US'→American English, 'zh_CN'→Chinese(China) 처럼
|
|
15
|
+
* 같은 언어의 여러 로케일도 구분되게 표기한다. 비표준/해석 불가 코드(예: 'ua')는 코드 그대로.
|
|
16
|
+
*/
|
|
17
|
+
export declare function languageLabel(code: string): string;
|
|
18
|
+
/** nameI18n(JSON 문자열 또는 객체)을 언어→이름 맵으로 파싱. */
|
|
19
|
+
export declare function parseNameI18n(nameI18n: any): Record<string, string>;
|
|
20
|
+
/** 채워진 항목만 남긴 맵을 JSON 문자열로. 비어 있으면 undefined(저장 안 함). */
|
|
21
|
+
export declare function stringifyNameI18n(map: Record<string, string>): string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* 언어 맵에서 lang 에 해당하는 값을 관대하게 찾는다. 없으면 ''.
|
|
24
|
+
* 1) 정확 일치 2) 구분자 정규화(zh-CN↔zh_CN) 3) 베이스 언어(en-US→en) 4) 키 베이스 일치
|
|
25
|
+
*/
|
|
26
|
+
export declare function pickLangValue(map: Record<string, string>, lang: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* 보드명 표시/리스팅의 단일 진입점.
|
|
29
|
+
*
|
|
30
|
+
* 언어 해석은 이제 백엔드(fmb-service)가 담당한다 — 요청 언어(X-Lang=lv_server_lang)로 계산한
|
|
31
|
+
* `displayName` 을 응답에 실어 주므로, 표시 측은 그 값을 그대로 쓰고(없으면 대표명 name 폴백)
|
|
32
|
+
* 클라이언트에서 nameI18n 맵을 다시 해석하지 않는다. (nameI18n/pickLangValue 는 편집 폼 전용.)
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveBoardName(board: {
|
|
35
|
+
name?: string;
|
|
36
|
+
displayName?: string;
|
|
37
|
+
} | null | undefined): string;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 보드명 다국어 유틸 (공유).
|
|
3
|
+
*
|
|
4
|
+
* 서버는 보드의 대표명(name) + 전체 다국어 맵(nameI18n JSON)만 내려주고, "현재 언어로 무엇을
|
|
5
|
+
* 보여줄지"는 클라이언트가 정한다. 보드명을 화면에 표시/리스팅하는 모든 곳에서 resolveBoardName 을
|
|
6
|
+
* 사용해야 일관되게 현재 언어 이름(없으면 대표명)으로 표시된다.
|
|
7
|
+
*
|
|
8
|
+
* @fmsim/board 에 두어 board/fmsim-restful 등 모든 클라이언트 컴포넌트가 공유한다.
|
|
9
|
+
*/
|
|
10
|
+
import { i18next } from '@operato/i18n';
|
|
11
|
+
/**
|
|
12
|
+
* 보드명 다국어의 "현재 언어" 단일 출처.
|
|
13
|
+
*
|
|
14
|
+
* 임베디드(MCS/LV) 환경에서는 호스트가 세션 스토리지 `lv_server_lang` 으로 현재 사용자 언어를
|
|
15
|
+
* 알려주므로 그 값을 권위로 삼는다. `i18next.language` 는 이 앱 자체의 i18n 언어라 호스트 언어와
|
|
16
|
+
* 어긋날 수 있어(보드명만 다른 언어로 표시되는 문제) 쓰지 않는다. `lv_server_lang` 이 없는 단독
|
|
17
|
+
* 실행 등에서만 `i18next.language` 로 폴백한다.
|
|
18
|
+
*/
|
|
19
|
+
export function getCurrentLang() {
|
|
20
|
+
try {
|
|
21
|
+
const lv = sessionStorage.getItem('lv_server_lang');
|
|
22
|
+
if (lv && lv.trim())
|
|
23
|
+
return lv.trim();
|
|
24
|
+
}
|
|
25
|
+
catch (_a) {
|
|
26
|
+
/* sessionStorage 접근 불가 시 폴백 */
|
|
27
|
+
}
|
|
28
|
+
return i18next.language || '';
|
|
29
|
+
}
|
|
30
|
+
/** MCS 세션 캐시 ifactI18nObj 의 키 = 지원 언어 목록. 없으면 현재 언어만. */
|
|
31
|
+
export function getSupportedLanguages() {
|
|
32
|
+
try {
|
|
33
|
+
const raw = sessionStorage.getItem('ifactI18nObj');
|
|
34
|
+
if (raw) {
|
|
35
|
+
const keys = Object.keys(JSON.parse(raw) || {});
|
|
36
|
+
if (keys.length)
|
|
37
|
+
return keys;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (_a) {
|
|
41
|
+
/* 파싱 실패 시 폴백 */
|
|
42
|
+
}
|
|
43
|
+
const cur = getCurrentLang();
|
|
44
|
+
return cur ? [cur] : [];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 언어 코드를 사람이 읽기 쉬운 이름으로 변환한다(표시는 현재 UI 언어).
|
|
48
|
+
* Intl.DisplayNames 로 'en'→English, 'en-US'→American English, 'zh_CN'→Chinese(China) 처럼
|
|
49
|
+
* 같은 언어의 여러 로케일도 구분되게 표기한다. 비표준/해석 불가 코드(예: 'ua')는 코드 그대로.
|
|
50
|
+
*/
|
|
51
|
+
export function languageLabel(code) {
|
|
52
|
+
const c = (code || '').trim();
|
|
53
|
+
if (!c)
|
|
54
|
+
return '';
|
|
55
|
+
try {
|
|
56
|
+
const dn = new Intl.DisplayNames([getCurrentLang() || 'en'], { type: 'language' });
|
|
57
|
+
const name = dn.of(c.replace(/_/g, '-'));
|
|
58
|
+
if (name && name.toLowerCase() !== c.toLowerCase())
|
|
59
|
+
return name;
|
|
60
|
+
}
|
|
61
|
+
catch (_a) {
|
|
62
|
+
/* 비표준 코드 등 → 코드 그대로 */
|
|
63
|
+
}
|
|
64
|
+
return c;
|
|
65
|
+
}
|
|
66
|
+
/** nameI18n(JSON 문자열 또는 객체)을 언어→이름 맵으로 파싱. */
|
|
67
|
+
export function parseNameI18n(nameI18n) {
|
|
68
|
+
if (!nameI18n)
|
|
69
|
+
return {};
|
|
70
|
+
if (typeof nameI18n === 'object')
|
|
71
|
+
return { ...nameI18n };
|
|
72
|
+
try {
|
|
73
|
+
return JSON.parse(nameI18n) || {};
|
|
74
|
+
}
|
|
75
|
+
catch (_a) {
|
|
76
|
+
return {};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** 채워진 항목만 남긴 맵을 JSON 문자열로. 비어 있으면 undefined(저장 안 함). */
|
|
80
|
+
export function stringifyNameI18n(map) {
|
|
81
|
+
const cleaned = {};
|
|
82
|
+
for (const [k, v] of Object.entries(map || {})) {
|
|
83
|
+
if (v != null && String(v).trim() !== '')
|
|
84
|
+
cleaned[k] = String(v);
|
|
85
|
+
}
|
|
86
|
+
return Object.keys(cleaned).length ? JSON.stringify(cleaned) : undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 언어 맵에서 lang 에 해당하는 값을 관대하게 찾는다. 없으면 ''.
|
|
90
|
+
* 1) 정확 일치 2) 구분자 정규화(zh-CN↔zh_CN) 3) 베이스 언어(en-US→en) 4) 키 베이스 일치
|
|
91
|
+
*/
|
|
92
|
+
export function pickLangValue(map, lang) {
|
|
93
|
+
if (!lang || !map)
|
|
94
|
+
return '';
|
|
95
|
+
if (map[lang])
|
|
96
|
+
return map[lang];
|
|
97
|
+
const under = lang.replace(/-/g, '_');
|
|
98
|
+
if (map[under])
|
|
99
|
+
return map[under];
|
|
100
|
+
const dash = lang.replace(/_/g, '-');
|
|
101
|
+
if (map[dash])
|
|
102
|
+
return map[dash];
|
|
103
|
+
const base = lang.split(/[-_]/)[0];
|
|
104
|
+
if (map[base])
|
|
105
|
+
return map[base];
|
|
106
|
+
const hit = Object.keys(map).find(k => k.split(/[-_]/)[0] === base);
|
|
107
|
+
return (hit && map[hit]) || '';
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 보드명 표시/리스팅의 단일 진입점.
|
|
111
|
+
*
|
|
112
|
+
* 언어 해석은 이제 백엔드(fmb-service)가 담당한다 — 요청 언어(X-Lang=lv_server_lang)로 계산한
|
|
113
|
+
* `displayName` 을 응답에 실어 주므로, 표시 측은 그 값을 그대로 쓰고(없으면 대표명 name 폴백)
|
|
114
|
+
* 클라이언트에서 nameI18n 맵을 다시 해석하지 않는다. (nameI18n/pickLangValue 는 편집 폼 전용.)
|
|
115
|
+
*/
|
|
116
|
+
export function resolveBoardName(board) {
|
|
117
|
+
if (!board)
|
|
118
|
+
return '';
|
|
119
|
+
return board.displayName || board.name || '';
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=board-i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board-i18n.js","sourceRoot":"","sources":["../../src/board-i18n.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 보드명 다국어 유틸 (공유).\n *\n * 서버는 보드의 대표명(name) + 전체 다국어 맵(nameI18n JSON)만 내려주고, \"현재 언어로 무엇을\n * 보여줄지\"는 클라이언트가 정한다. 보드명을 화면에 표시/리스팅하는 모든 곳에서 resolveBoardName 을\n * 사용해야 일관되게 현재 언어 이름(없으면 대표명)으로 표시된다.\n *\n * @fmsim/board 에 두어 board/fmsim-restful 등 모든 클라이언트 컴포넌트가 공유한다.\n */\nimport { i18next } from '@operato/i18n'\n\n/**\n * 보드명 다국어의 \"현재 언어\" 단일 출처.\n *\n * 임베디드(MCS/LV) 환경에서는 호스트가 세션 스토리지 `lv_server_lang` 으로 현재 사용자 언어를\n * 알려주므로 그 값을 권위로 삼는다. `i18next.language` 는 이 앱 자체의 i18n 언어라 호스트 언어와\n * 어긋날 수 있어(보드명만 다른 언어로 표시되는 문제) 쓰지 않는다. `lv_server_lang` 이 없는 단독\n * 실행 등에서만 `i18next.language` 로 폴백한다.\n */\nexport function getCurrentLang(): string {\n try {\n const lv = sessionStorage.getItem('lv_server_lang')\n if (lv && lv.trim()) return lv.trim()\n } catch {\n /* sessionStorage 접근 불가 시 폴백 */\n }\n return i18next.language || ''\n}\n\n/** MCS 세션 캐시 ifactI18nObj 의 키 = 지원 언어 목록. 없으면 현재 언어만. */\nexport function getSupportedLanguages(): string[] {\n try {\n const raw = sessionStorage.getItem('ifactI18nObj')\n if (raw) {\n const keys = Object.keys(JSON.parse(raw) || {})\n if (keys.length) return keys\n }\n } catch {\n /* 파싱 실패 시 폴백 */\n }\n const cur = getCurrentLang()\n return cur ? [cur] : []\n}\n\n/**\n * 언어 코드를 사람이 읽기 쉬운 이름으로 변환한다(표시는 현재 UI 언어).\n * Intl.DisplayNames 로 'en'→English, 'en-US'→American English, 'zh_CN'→Chinese(China) 처럼\n * 같은 언어의 여러 로케일도 구분되게 표기한다. 비표준/해석 불가 코드(예: 'ua')는 코드 그대로.\n */\nexport function languageLabel(code: string): string {\n const c = (code || '').trim()\n if (!c) return ''\n try {\n const dn = new (Intl as any).DisplayNames([getCurrentLang() || 'en'], { type: 'language' })\n const name = dn.of(c.replace(/_/g, '-'))\n if (name && name.toLowerCase() !== c.toLowerCase()) return name\n } catch {\n /* 비표준 코드 등 → 코드 그대로 */\n }\n return c\n}\n\n/** nameI18n(JSON 문자열 또는 객체)을 언어→이름 맵으로 파싱. */\nexport function parseNameI18n(nameI18n: any): Record<string, string> {\n if (!nameI18n) return {}\n if (typeof nameI18n === 'object') return { ...nameI18n }\n try {\n return JSON.parse(nameI18n) || {}\n } catch {\n return {}\n }\n}\n\n/** 채워진 항목만 남긴 맵을 JSON 문자열로. 비어 있으면 undefined(저장 안 함). */\nexport function stringifyNameI18n(map: Record<string, string>): string | undefined {\n const cleaned: Record<string, string> = {}\n for (const [k, v] of Object.entries(map || {})) {\n if (v != null && String(v).trim() !== '') cleaned[k] = String(v)\n }\n return Object.keys(cleaned).length ? JSON.stringify(cleaned) : undefined\n}\n\n/**\n * 언어 맵에서 lang 에 해당하는 값을 관대하게 찾는다. 없으면 ''.\n * 1) 정확 일치 2) 구분자 정규화(zh-CN↔zh_CN) 3) 베이스 언어(en-US→en) 4) 키 베이스 일치\n */\nexport function pickLangValue(map: Record<string, string>, lang: string): string {\n if (!lang || !map) return ''\n if (map[lang]) return map[lang]\n const under = lang.replace(/-/g, '_')\n if (map[under]) return map[under]\n const dash = lang.replace(/_/g, '-')\n if (map[dash]) return map[dash]\n const base = lang.split(/[-_]/)[0]\n if (map[base]) return map[base]\n const hit = Object.keys(map).find(k => k.split(/[-_]/)[0] === base)\n return (hit && map[hit]) || ''\n}\n\n/**\n * 보드명 표시/리스팅의 단일 진입점.\n *\n * 언어 해석은 이제 백엔드(fmb-service)가 담당한다 — 요청 언어(X-Lang=lv_server_lang)로 계산한\n * `displayName` 을 응답에 실어 주므로, 표시 측은 그 값을 그대로 쓰고(없으면 대표명 name 폴백)\n * 클라이언트에서 nameI18n 맵을 다시 해석하지 않는다. (nameI18n/pickLangValue 는 편집 폼 전용.)\n */\nexport function resolveBoardName(\n board: { name?: string; displayName?: string } | null | undefined\n): string {\n if (!board) return ''\n return board.displayName || board.name || ''\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const text = new URL('../../../icons/components/text.png', import.meta.url).href;
|
|
1
2
|
const rect = new URL('../../../icons/components/rect.png', import.meta.url).href;
|
|
2
3
|
const ellipse = new URL('../../../icons/components/ellipse.png', import.meta.url).href;
|
|
3
4
|
const lineIcon = new URL('../../../icons/components/line.png', import.meta.url).href;
|
|
@@ -22,6 +23,23 @@ export const etc = {
|
|
|
22
23
|
description: 'a group of components that have not yet been defined.',
|
|
23
24
|
icon,
|
|
24
25
|
templates: [
|
|
26
|
+
{
|
|
27
|
+
type: 'text',
|
|
28
|
+
description: 'text',
|
|
29
|
+
icon: text,
|
|
30
|
+
group: 'shape',
|
|
31
|
+
model: {
|
|
32
|
+
type: 'text',
|
|
33
|
+
left: 100,
|
|
34
|
+
top: 100,
|
|
35
|
+
width: 200,
|
|
36
|
+
height: 50,
|
|
37
|
+
fillStyle: 'transparent',
|
|
38
|
+
fontColor: '#000',
|
|
39
|
+
fontSize: 16,
|
|
40
|
+
text: 'Text'
|
|
41
|
+
}
|
|
42
|
+
},
|
|
25
43
|
{
|
|
26
44
|
type: 'rect',
|
|
27
45
|
description: 'rectangle shape',
|
|
@@ -158,6 +176,24 @@ export const etc = {
|
|
|
158
176
|
fillStyle: '#fff',
|
|
159
177
|
strokeStyle: 'DarkGoldenRod'
|
|
160
178
|
}
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
type: 'floor-plate',
|
|
182
|
+
description: 'floor plate for multi-story layout',
|
|
183
|
+
icon: rect,
|
|
184
|
+
group: '3d',
|
|
185
|
+
model: {
|
|
186
|
+
type: 'floor-plate',
|
|
187
|
+
left: 100,
|
|
188
|
+
top: 100,
|
|
189
|
+
width: 500,
|
|
190
|
+
height: 500,
|
|
191
|
+
depth: 2,
|
|
192
|
+
fillStyle: 'rgba(232, 232, 232, 0.7)',
|
|
193
|
+
strokeStyle: '#999999',
|
|
194
|
+
// fmsim 기본 바닥 재질 = rubber 매트 (things-scene 글로벌 기본은 그대로).
|
|
195
|
+
material3d: { preset: 'rubber' }
|
|
196
|
+
}
|
|
161
197
|
}
|
|
162
198
|
]
|
|
163
199
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"etc.js","sourceRoot":"","sources":["../../../src/component/etc.ts"],"names":[],"mappings":"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","sourcesContent":["import { ComponentGroup } from '../types'\n\nconst rect = new URL('../../../icons/components/rect.png', import.meta.url).href\nconst ellipse = new URL('../../../icons/components/ellipse.png', import.meta.url).href\nconst lineIcon = new URL('../../../icons/components/line.png', import.meta.url).href\nconst dash = new URL('../../../icons/components/dash.png', import.meta.url).href\nconst triangle = new URL('../../../icons/components/triangle.png', import.meta.url).href\nconst container = new URL('../../../icons/components/container.png', import.meta.url).href\nconst popup = new URL('../../../icons/components/popup.png', import.meta.url).href\n\nconst icon = `\n<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 30 30\" style=\"enable-background:new 0 0 30 30;\" xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0{fill:{{strokeColor}};}\n </style>\n <g>\n <circle class=\"st0\" cx=\"7.1\" cy=\"15\" r=\"2\"/>\n <circle class=\"st0\" cx=\"15\" cy=\"15\" r=\"2\"/>\n <circle class=\"st0\" cx=\"22.9\" cy=\"15\" r=\"2\"/>\n </g>\n</svg>\n`\n\nexport const etc: ComponentGroup = {\n name: 'etc',\n description: 'a group of components that have not yet been defined.',\n icon,\n templates: [\n {\n type: 'rect',\n description: 'rectangle shape',\n icon: rect,\n group: 'shape',\n model: {\n type: 'rect',\n left: 100,\n top: 100,\n width: 100,\n height: 100,\n fillStyle: '#fff',\n strokeStyle: '#000',\n alpha: 1,\n hidden: false,\n lineWidth: 1,\n lineDash: 'solid',\n lineCap: 'butt'\n }\n },\n {\n type: 'ellipse',\n description: 'ellipse shape',\n icon: ellipse,\n group: 'shape',\n model: {\n type: 'ellipse',\n rx: 50,\n ry: 50,\n cx: 150,\n cy: 150,\n fillStyle: '#fff',\n strokeStyle: '#000',\n alpha: 1,\n hidden: false,\n lineWidth: 1,\n lineDash: 'solid',\n lineCap: 'butt'\n }\n },\n {\n type: 'triangle',\n description: 'triangle shape',\n icon: triangle,\n group: 'shape',\n model: {\n type: 'triangle',\n x1: 150,\n y1: 100,\n x2: 100,\n y2: 200,\n x3: 200,\n y3: 200,\n fillStyle: '#fff',\n strokeStyle: '#000',\n alpha: 1,\n hidden: false,\n lineWidth: 1,\n lineDash: 'solid',\n lineCap: 'butt'\n }\n },\n {\n type: 'line',\n description: 'simple line',\n icon: lineIcon,\n group: 'line',\n model: {\n type: 'line',\n x1: 100,\n y1: 100,\n x2: 200,\n y2: 200,\n fillStyle: '#fff',\n strokeStyle: '#000',\n alpha: 1,\n hidden: false,\n lineWidth: 3,\n lineDash: 'solid',\n lineCap: 'butt'\n }\n },\n {\n type: 'dash',\n description: 'dash line',\n icon: dash,\n group: 'line',\n model: {\n type: 'line',\n x1: 100,\n y1: 100,\n x2: 200,\n y2: 200,\n fillStyle: '#fff',\n strokeStyle: '#000',\n alpha: 1,\n hidden: false,\n lineWidth: 3,\n lineDash: 'round-dot',\n lineCap: 'butt'\n }\n },\n {\n type: 'container',\n description: 'container shape',\n icon: container,\n group: 'container',\n model: {\n type: 'container',\n left: 100,\n top: 100,\n width: 400,\n height: 300,\n fillStyle: '#fff',\n strokeStyle: '#999',\n alpha: 1,\n hidden: false,\n lineWidth: 1,\n lineDash: 'solid',\n lineCap: 'butt'\n }\n },\n {\n type: 'popup',\n description: 'popup window',\n icon: popup,\n group: 'container',\n model: {\n type: 'popup',\n left: 100,\n top: 100,\n width: 100,\n height: 100,\n fillStyle: '#fff',\n strokeStyle: 'DarkGoldenRod'\n }\n }\n ]\n}\n"]}
|
|
1
|
+
{"version":3,"file":"etc.js","sourceRoot":"","sources":["../../../src/component/etc.ts"],"names":[],"mappings":"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","sourcesContent":["import { ComponentGroup } from '../types'\n\nconst text = new URL('../../../icons/components/text.png', import.meta.url).href\nconst rect = new URL('../../../icons/components/rect.png', import.meta.url).href\nconst ellipse = new URL('../../../icons/components/ellipse.png', import.meta.url).href\nconst lineIcon = new URL('../../../icons/components/line.png', import.meta.url).href\nconst dash = new URL('../../../icons/components/dash.png', import.meta.url).href\nconst triangle = new URL('../../../icons/components/triangle.png', import.meta.url).href\nconst container = new URL('../../../icons/components/container.png', import.meta.url).href\nconst popup = new URL('../../../icons/components/popup.png', import.meta.url).href\n\nconst icon = `\n<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 30 30\" style=\"enable-background:new 0 0 30 30;\" xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0{fill:{{strokeColor}};}\n </style>\n <g>\n <circle class=\"st0\" cx=\"7.1\" cy=\"15\" r=\"2\"/>\n <circle class=\"st0\" cx=\"15\" cy=\"15\" r=\"2\"/>\n <circle class=\"st0\" cx=\"22.9\" cy=\"15\" r=\"2\"/>\n </g>\n</svg>\n`\n\nexport const etc: ComponentGroup = {\n name: 'etc',\n description: 'a group of components that have not yet been defined.',\n icon,\n templates: [\n {\n type: 'text',\n description: 'text',\n icon: text,\n group: 'shape',\n model: {\n type: 'text',\n left: 100,\n top: 100,\n width: 200,\n height: 50,\n fillStyle: 'transparent',\n fontColor: '#000',\n fontSize: 16,\n text: 'Text'\n }\n },\n {\n type: 'rect',\n description: 'rectangle shape',\n icon: rect,\n group: 'shape',\n model: {\n type: 'rect',\n left: 100,\n top: 100,\n width: 100,\n height: 100,\n fillStyle: '#fff',\n strokeStyle: '#000',\n alpha: 1,\n hidden: false,\n lineWidth: 1,\n lineDash: 'solid',\n lineCap: 'butt'\n }\n },\n {\n type: 'ellipse',\n description: 'ellipse shape',\n icon: ellipse,\n group: 'shape',\n model: {\n type: 'ellipse',\n rx: 50,\n ry: 50,\n cx: 150,\n cy: 150,\n fillStyle: '#fff',\n strokeStyle: '#000',\n alpha: 1,\n hidden: false,\n lineWidth: 1,\n lineDash: 'solid',\n lineCap: 'butt'\n }\n },\n {\n type: 'triangle',\n description: 'triangle shape',\n icon: triangle,\n group: 'shape',\n model: {\n type: 'triangle',\n x1: 150,\n y1: 100,\n x2: 100,\n y2: 200,\n x3: 200,\n y3: 200,\n fillStyle: '#fff',\n strokeStyle: '#000',\n alpha: 1,\n hidden: false,\n lineWidth: 1,\n lineDash: 'solid',\n lineCap: 'butt'\n }\n },\n {\n type: 'line',\n description: 'simple line',\n icon: lineIcon,\n group: 'line',\n model: {\n type: 'line',\n x1: 100,\n y1: 100,\n x2: 200,\n y2: 200,\n fillStyle: '#fff',\n strokeStyle: '#000',\n alpha: 1,\n hidden: false,\n lineWidth: 3,\n lineDash: 'solid',\n lineCap: 'butt'\n }\n },\n {\n type: 'dash',\n description: 'dash line',\n icon: dash,\n group: 'line',\n model: {\n type: 'line',\n x1: 100,\n y1: 100,\n x2: 200,\n y2: 200,\n fillStyle: '#fff',\n strokeStyle: '#000',\n alpha: 1,\n hidden: false,\n lineWidth: 3,\n lineDash: 'round-dot',\n lineCap: 'butt'\n }\n },\n {\n type: 'container',\n description: 'container shape',\n icon: container,\n group: 'container',\n model: {\n type: 'container',\n left: 100,\n top: 100,\n width: 400,\n height: 300,\n fillStyle: '#fff',\n strokeStyle: '#999',\n alpha: 1,\n hidden: false,\n lineWidth: 1,\n lineDash: 'solid',\n lineCap: 'butt'\n }\n },\n {\n type: 'popup',\n description: 'popup window',\n icon: popup,\n group: 'container',\n model: {\n type: 'popup',\n left: 100,\n top: 100,\n width: 100,\n height: 100,\n fillStyle: '#fff',\n strokeStyle: 'DarkGoldenRod'\n }\n },\n {\n type: 'floor-plate',\n description: 'floor plate for multi-story layout',\n icon: rect,\n group: '3d',\n model: {\n type: 'floor-plate',\n left: 100,\n top: 100,\n width: 500,\n height: 500,\n depth: 2,\n fillStyle: 'rgba(232, 232, 232, 0.7)',\n strokeStyle: '#999999',\n // fmsim 기본 바닥 재질 = rubber 매트 (things-scene 글로벌 기본은 그대로).\n material3d: { preset: 'rubber' }\n }\n }\n ]\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/component/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,UAAU,CAAA","sourcesContent":["export * from './restful-attachment-selector.js'\nexport * from './restful-input-fill-style.js'\nexport * from './etc.js'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/component/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,6CAA6C,CAAA;AAC3D,cAAc,UAAU,CAAA","sourcesContent":["export * from './restful-attachment-selector.js'\nexport * from './restful-input-fill-style.js'\nexport * from './restful-property-editor-backdrop-faces.js'\nexport * from './etc.js'\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* fmsim-restful 환경에서는 GraphQL/attachment 의존이 있는 ox-input-fill-style 대신
|
|
5
|
+
* restful-input-fill-style 을 사용해야 한다. ox-property-editor-backdrop-faces 와
|
|
6
|
+
* 동일한 cube-picker UI 를 유지하되 fillStyle 에디터만 restful 버전으로 교체.
|
|
7
|
+
*
|
|
8
|
+
* 양쪽 동기화 시 주의: ox-property-editor-backdrop-faces.ts (operato/property-editor)
|
|
9
|
+
* 변경 시 이 파일도 함께 업데이트.
|
|
10
|
+
*/
|
|
11
|
+
import './restful-input-fill-style.js';
|
|
12
|
+
import '@operato/i18n/ox-i18n.js';
|
|
13
|
+
import { LitElement, type TemplateResult } from 'lit';
|
|
14
|
+
import { OxPropertyEditor } from '@operato/property-editor';
|
|
15
|
+
import type { PropertySpec } from '@operato/property-editor';
|
|
16
|
+
type FaceName = 'east' | 'west' | 'north' | 'south' | 'ceiling' | 'floor';
|
|
17
|
+
interface FaceState {
|
|
18
|
+
fillStyle?: any;
|
|
19
|
+
visible?: boolean;
|
|
20
|
+
alpha?: number;
|
|
21
|
+
rotation?: 0 | 90 | 180 | 270;
|
|
22
|
+
mirror?: boolean;
|
|
23
|
+
}
|
|
24
|
+
type FacesValue = Partial<Record<FaceName, FaceState>>;
|
|
25
|
+
export declare class RestfulInputBackdropFaces extends LitElement {
|
|
26
|
+
value: FacesValue;
|
|
27
|
+
private _selected;
|
|
28
|
+
static styles: import("lit").CSSResult;
|
|
29
|
+
private _face;
|
|
30
|
+
private _swatchColor;
|
|
31
|
+
private _select;
|
|
32
|
+
private _commit;
|
|
33
|
+
private _patchFace;
|
|
34
|
+
private _onFillStyleChange;
|
|
35
|
+
private _onVisibleChange;
|
|
36
|
+
private _onAlphaChange;
|
|
37
|
+
private _onRotationChange;
|
|
38
|
+
private _onMirrorChange;
|
|
39
|
+
private _copyToOpposite;
|
|
40
|
+
private _copyToAllWalls;
|
|
41
|
+
private _renderLabel;
|
|
42
|
+
private _faceClass;
|
|
43
|
+
private _ghostClass;
|
|
44
|
+
render(): TemplateResult<1>;
|
|
45
|
+
}
|
|
46
|
+
export declare class RestfulPropertyEditorBackdropFaces extends OxPropertyEditor {
|
|
47
|
+
static styles: import("lit").CSSResult[];
|
|
48
|
+
editorTemplate(value: any, spec: PropertySpec): TemplateResult;
|
|
49
|
+
}
|
|
50
|
+
export {};
|