@things-factory/ops-master 10.0.19 → 10.1.1

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.
Files changed (247) hide show
  1. package/dist-client/bootstrap.d.ts +18 -0
  2. package/dist-client/bootstrap.js +36 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/index.d.ts +15 -1
  5. package/dist-client/index.js +18 -1
  6. package/dist-client/index.js.map +1 -1
  7. package/dist-client/pages/master/equipment-class.d.ts +12 -0
  8. package/dist-client/pages/master/equipment-class.js +42 -0
  9. package/dist-client/pages/master/equipment-class.js.map +1 -0
  10. package/dist-client/pages/master/equipment.d.ts +12 -0
  11. package/dist-client/pages/master/equipment.js +57 -0
  12. package/dist-client/pages/master/equipment.js.map +1 -0
  13. package/dist-client/pages/master/grist-iso-duration.d.ts +20 -0
  14. package/dist-client/pages/master/grist-iso-duration.js +70 -0
  15. package/dist-client/pages/master/grist-iso-duration.js.map +1 -0
  16. package/dist-client/pages/master/grist-reference.d.ts +91 -0
  17. package/dist-client/pages/master/grist-reference.js +419 -0
  18. package/dist-client/pages/master/grist-reference.js.map +1 -0
  19. package/dist-client/pages/master/import-rows.d.ts +35 -0
  20. package/dist-client/pages/master/import-rows.js +66 -0
  21. package/dist-client/pages/master/import-rows.js.map +1 -0
  22. package/dist-client/pages/master/iso-duration.d.ts +34 -0
  23. package/dist-client/pages/master/iso-duration.js +76 -0
  24. package/dist-client/pages/master/iso-duration.js.map +1 -0
  25. package/dist-client/pages/master/master-options.d.ts +33 -0
  26. package/dist-client/pages/master/master-options.js +47 -0
  27. package/dist-client/pages/master/master-options.js.map +1 -0
  28. package/dist-client/pages/master/master-page-base.d.ts +357 -0
  29. package/dist-client/pages/master/master-page-base.js +626 -0
  30. package/dist-client/pages/master/master-page-base.js.map +1 -0
  31. package/dist-client/pages/master/material-class.d.ts +12 -0
  32. package/dist-client/pages/master/material-class.js +42 -0
  33. package/dist-client/pages/master/material-class.js.map +1 -0
  34. package/dist-client/pages/master/material-definition.d.ts +12 -0
  35. package/dist-client/pages/master/material-definition.js +62 -0
  36. package/dist-client/pages/master/material-definition.js.map +1 -0
  37. package/dist-client/pages/master/operation-definition.d.ts +12 -0
  38. package/dist-client/pages/master/operation-definition.js +49 -0
  39. package/dist-client/pages/master/operation-definition.js.map +1 -0
  40. package/dist-client/pages/master/operational-location.d.ts +84 -0
  41. package/dist-client/pages/master/operational-location.js +426 -0
  42. package/dist-client/pages/master/operational-location.js.map +1 -0
  43. package/dist-client/pages/master/person.d.ts +12 -0
  44. package/dist-client/pages/master/person.js +41 -0
  45. package/dist-client/pages/master/person.js.map +1 -0
  46. package/dist-client/pages/master/personnel-class.d.ts +12 -0
  47. package/dist-client/pages/master/personnel-class.js +43 -0
  48. package/dist-client/pages/master/personnel-class.js.map +1 -0
  49. package/dist-client/pages/master/physical-asset-class.d.ts +12 -0
  50. package/dist-client/pages/master/physical-asset-class.js +40 -0
  51. package/dist-client/pages/master/physical-asset-class.js.map +1 -0
  52. package/dist-client/pages/master/physical-asset.d.ts +12 -0
  53. package/dist-client/pages/master/physical-asset.js +41 -0
  54. package/dist-client/pages/master/physical-asset.js.map +1 -0
  55. package/dist-client/pages/master/recipe-definition.d.ts +136 -0
  56. package/dist-client/pages/master/recipe-definition.js +404 -0
  57. package/dist-client/pages/master/recipe-definition.js.map +1 -0
  58. package/dist-client/pages/master/reference-targets.d.ts +42 -0
  59. package/dist-client/pages/master/reference-targets.js +82 -0
  60. package/dist-client/pages/master/reference-targets.js.map +1 -0
  61. package/dist-client/pages/master/route-definition.d.ts +19 -0
  62. package/dist-client/pages/master/route-definition.js +40 -0
  63. package/dist-client/pages/master/route-definition.js.map +1 -0
  64. package/dist-client/pages/master/stop-reason.d.ts +12 -0
  65. package/dist-client/pages/master/stop-reason.js +48 -0
  66. package/dist-client/pages/master/stop-reason.js.map +1 -0
  67. package/dist-client/pages/master/test-specification.d.ts +93 -0
  68. package/dist-client/pages/master/test-specification.js +449 -0
  69. package/dist-client/pages/master/test-specification.js.map +1 -0
  70. package/dist-client/pages/master-axes.d.ts +20 -29
  71. package/dist-client/pages/master-axes.js +32 -182
  72. package/dist-client/pages/master-axes.js.map +1 -1
  73. package/dist-client/route.d.ts +1 -1
  74. package/dist-client/route.js +76 -3
  75. package/dist-client/route.js.map +1 -1
  76. package/dist-client/tsconfig.tsbuildinfo +1 -1
  77. package/dist-server/service/asset/asset-lifecycle.d.ts +30 -7
  78. package/dist-server/service/asset/asset-lifecycle.js +33 -6
  79. package/dist-server/service/asset/asset-lifecycle.js.map +1 -1
  80. package/dist-server/service/asset/asset-master-resolver.d.ts +9 -0
  81. package/dist-server/service/asset/asset-master-resolver.js +41 -0
  82. package/dist-server/service/asset/asset-master-resolver.js.map +1 -1
  83. package/dist-server/service/asset/asset-master.js +1 -1
  84. package/dist-server/service/asset/asset-master.js.map +1 -1
  85. package/dist-server/service/asset/asset-query.d.ts +9 -1
  86. package/dist-server/service/asset/asset-query.js +28 -6
  87. package/dist-server/service/asset/asset-query.js.map +1 -1
  88. package/dist-server/service/asset/physical-asset-class.js +1 -1
  89. package/dist-server/service/asset/physical-asset-class.js.map +1 -1
  90. package/dist-server/service/asset/physical-asset.d.ts +17 -4
  91. package/dist-server/service/asset/physical-asset.js +6 -6
  92. package/dist-server/service/asset/physical-asset.js.map +1 -1
  93. package/dist-server/service/equipment/equipment-class.js +1 -1
  94. package/dist-server/service/equipment/equipment-class.js.map +1 -1
  95. package/dist-server/service/equipment/equipment-master-resolver.d.ts +9 -0
  96. package/dist-server/service/equipment/equipment-master-resolver.js +58 -0
  97. package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -1
  98. package/dist-server/service/equipment/equipment-master.d.ts +3 -2
  99. package/dist-server/service/equipment/equipment-master.js +21 -4
  100. package/dist-server/service/equipment/equipment-master.js.map +1 -1
  101. package/dist-server/service/equipment/equipment-query.d.ts +9 -1
  102. package/dist-server/service/equipment/equipment-query.js +28 -6
  103. package/dist-server/service/equipment/equipment-query.js.map +1 -1
  104. package/dist-server/service/equipment/equipment.d.ts +27 -1
  105. package/dist-server/service/equipment/equipment.js +8 -3
  106. package/dist-server/service/equipment/equipment.js.map +1 -1
  107. package/dist-server/service/equipment/state-period-rules.d.ts +19 -0
  108. package/dist-server/service/equipment/state-period-rules.js +35 -1
  109. package/dist-server/service/equipment/state-period-rules.js.map +1 -1
  110. package/dist-server/service/index.d.ts +4 -1
  111. package/dist-server/service/index.js +11 -2
  112. package/dist-server/service/index.js.map +1 -1
  113. package/dist-server/service/location/location-master-resolver.d.ts +29 -0
  114. package/dist-server/service/location/location-master-resolver.js +228 -1
  115. package/dist-server/service/location/location-master-resolver.js.map +1 -1
  116. package/dist-server/service/location/location-query.d.ts +9 -1
  117. package/dist-server/service/location/location-query.js +24 -9
  118. package/dist-server/service/location/location-query.js.map +1 -1
  119. package/dist-server/service/location/operational-location.d.ts +37 -0
  120. package/dist-server/service/location/operational-location.js +22 -2
  121. package/dist-server/service/location/operational-location.js.map +1 -1
  122. package/dist-server/service/master-axis.js +2 -2
  123. package/dist-server/service/master-axis.js.map +1 -1
  124. package/dist-server/service/master-conformance-resolver.d.ts +34 -0
  125. package/dist-server/service/master-conformance-resolver.js +143 -0
  126. package/dist-server/service/master-conformance-resolver.js.map +1 -0
  127. package/dist-server/service/master-conformance.d.ts +80 -0
  128. package/dist-server/service/master-conformance.js +266 -0
  129. package/dist-server/service/master-conformance.js.map +1 -0
  130. package/dist-server/service/master-page-query.d.ts +33 -0
  131. package/dist-server/service/master-page-query.js +55 -0
  132. package/dist-server/service/master-page-query.js.map +1 -0
  133. package/dist-server/service/master-page.d.ts +85 -0
  134. package/dist-server/service/master-page.js +104 -0
  135. package/dist-server/service/master-page.js.map +1 -0
  136. package/dist-server/service/material/material-class.js +1 -1
  137. package/dist-server/service/material/material-class.js.map +1 -1
  138. package/dist-server/service/material/material-definition.js +2 -2
  139. package/dist-server/service/material/material-definition.js.map +1 -1
  140. package/dist-server/service/material/material-master-resolver.d.ts +62 -0
  141. package/dist-server/service/material/material-master-resolver.js +213 -0
  142. package/dist-server/service/material/material-master-resolver.js.map +1 -1
  143. package/dist-server/service/material/material-query.d.ts +9 -1
  144. package/dist-server/service/material/material-query.js +28 -6
  145. package/dist-server/service/material/material-query.js.map +1 -1
  146. package/dist-server/service/material/recipe-index.d.ts +23 -0
  147. package/dist-server/service/material/recipe-index.js +44 -0
  148. package/dist-server/service/material/recipe-index.js.map +1 -0
  149. package/dist-server/service/operation/operation-definition.d.ts +1 -1
  150. package/dist-server/service/operation/operation-definition.js +4 -4
  151. package/dist-server/service/operation/operation-definition.js.map +1 -1
  152. package/dist-server/service/operation/operation-master-resolver.d.ts +24 -0
  153. package/dist-server/service/operation/operation-master-resolver.js +107 -0
  154. package/dist-server/service/operation/operation-master-resolver.js.map +1 -1
  155. package/dist-server/service/operation/operation-query.d.ts +10 -2
  156. package/dist-server/service/operation/operation-query.js +25 -10
  157. package/dist-server/service/operation/operation-query.js.map +1 -1
  158. package/dist-server/service/personnel/person.js +3 -3
  159. package/dist-server/service/personnel/person.js.map +1 -1
  160. package/dist-server/service/personnel/personnel-class.d.ts +1 -1
  161. package/dist-server/service/personnel/personnel-class.js +2 -2
  162. package/dist-server/service/personnel/personnel-class.js.map +1 -1
  163. package/dist-server/service/personnel/personnel-master-resolver.d.ts +9 -0
  164. package/dist-server/service/personnel/personnel-master-resolver.js +43 -0
  165. package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -1
  166. package/dist-server/service/personnel/personnel-master.js +1 -1
  167. package/dist-server/service/personnel/personnel-master.js.map +1 -1
  168. package/dist-server/service/personnel/personnel-query.d.ts +9 -1
  169. package/dist-server/service/personnel/personnel-query.js +28 -6
  170. package/dist-server/service/personnel/personnel-query.js.map +1 -1
  171. package/dist-server/service/recipe/recipe-definition.d.ts +3 -3
  172. package/dist-server/service/recipe/recipe-definition.js +3 -3
  173. package/dist-server/service/recipe/recipe-definition.js.map +1 -1
  174. package/dist-server/service/recipe/recipe-master-resolver.d.ts +1 -1
  175. package/dist-server/service/recipe/recipe-master-resolver.js +1 -1
  176. package/dist-server/service/recipe/recipe-master-resolver.js.map +1 -1
  177. package/dist-server/service/recipe/recipe-master.d.ts +1 -1
  178. package/dist-server/service/recipe/recipe-master.js +2 -2
  179. package/dist-server/service/recipe/recipe-master.js.map +1 -1
  180. package/dist-server/service/recipe/recipe-query.d.ts +11 -3
  181. package/dist-server/service/recipe/recipe-query.js +30 -9
  182. package/dist-server/service/recipe/recipe-query.js.map +1 -1
  183. package/dist-server/service/recipe/route-definition.d.ts +6 -6
  184. package/dist-server/service/recipe/route-definition.js +6 -6
  185. package/dist-server/service/recipe/route-definition.js.map +1 -1
  186. package/dist-server/service/resource/class-lineage.d.ts +46 -0
  187. package/dist-server/service/resource/class-lineage.js +80 -0
  188. package/dist-server/service/resource/class-lineage.js.map +1 -0
  189. package/dist-server/service/resource/class-members.d.ts +36 -0
  190. package/dist-server/service/resource/class-members.js +50 -0
  191. package/dist-server/service/resource/class-members.js.map +1 -0
  192. package/dist-server/service/resource/referrers.d.ts +54 -0
  193. package/dist-server/service/resource/referrers.js +99 -0
  194. package/dist-server/service/resource/referrers.js.map +1 -0
  195. package/dist-server/service/test-spec/criteria-check.d.ts +53 -0
  196. package/dist-server/service/test-spec/criteria-check.js +142 -0
  197. package/dist-server/service/test-spec/criteria-check.js.map +1 -0
  198. package/dist-server/service/test-spec/criteria-rows.d.ts +89 -0
  199. package/dist-server/service/test-spec/criteria-rows.js +139 -0
  200. package/dist-server/service/test-spec/criteria-rows.js.map +1 -0
  201. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +33 -7
  202. package/dist-server/service/test-spec/test-spec-master-resolver.js +137 -2
  203. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -1
  204. package/dist-server/service/test-spec/test-spec-query.d.ts +9 -1
  205. package/dist-server/service/test-spec/test-spec-query.js +23 -9
  206. package/dist-server/service/test-spec/test-spec-query.js.map +1 -1
  207. package/dist-server/service/test-spec/test-specification.js +1 -1
  208. package/dist-server/service/test-spec/test-specification.js.map +1 -1
  209. package/dist-server/tsconfig.tsbuildinfo +1 -1
  210. package/helps/ops-master/equipment-class.ko.md +11 -0
  211. package/helps/ops-master/equipment-class.md +11 -0
  212. package/helps/ops-master/equipment.ko.md +11 -0
  213. package/helps/ops-master/equipment.md +11 -0
  214. package/helps/ops-master/material-class.ko.md +11 -0
  215. package/helps/ops-master/material-class.md +11 -0
  216. package/helps/ops-master/material-definition.ko.md +11 -0
  217. package/helps/ops-master/material-definition.md +11 -0
  218. package/helps/ops-master/operation-definition.ko.md +11 -0
  219. package/helps/ops-master/operation-definition.md +11 -0
  220. package/helps/ops-master/operational-location.ko.md +11 -0
  221. package/helps/ops-master/operational-location.md +11 -0
  222. package/helps/ops-master/person.ko.md +11 -0
  223. package/helps/ops-master/person.md +11 -0
  224. package/helps/ops-master/personnel-class.ko.md +11 -0
  225. package/helps/ops-master/personnel-class.md +11 -0
  226. package/helps/ops-master/physical-asset-class.ko.md +11 -0
  227. package/helps/ops-master/physical-asset-class.md +11 -0
  228. package/helps/ops-master/physical-asset.ko.md +11 -0
  229. package/helps/ops-master/physical-asset.md +11 -0
  230. package/helps/ops-master/recipe-definition.ko.md +11 -0
  231. package/helps/ops-master/recipe-definition.md +11 -0
  232. package/helps/ops-master/route-definition.ko.md +11 -0
  233. package/helps/ops-master/route-definition.md +11 -0
  234. package/helps/ops-master/stop-reason.ko.md +11 -0
  235. package/helps/ops-master/stop-reason.md +11 -0
  236. package/helps/ops-master/test-specification.ko.md +11 -0
  237. package/helps/ops-master/test-specification.md +11 -0
  238. package/package.json +6 -6
  239. package/things-factory.config.js +22 -2
  240. package/translations/en.json +86 -3
  241. package/translations/ja.json +92 -1
  242. package/translations/ko.json +93 -10
  243. package/translations/ms.json +92 -1
  244. package/translations/zh.json +92 -1
  245. package/dist-client/pages/master-list.d.ts +0 -68
  246. package/dist-client/pages/master-list.js +0 -239
  247. package/dist-client/pages/master-list.js.map +0 -1
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 그리드 편집기 등록.
3
+ *
4
+ * `select` · `json5` · `datetime` 같은 것은 data-grist 가 기본으로 등록한다.
5
+ *
6
+ * ── 왜 `duration` 이 아니라 `iso-duration` 인가 ────────────────────────────
7
+ * `@operato/grist-editor` 에 `duration` 이 있지만 그것은 **초 숫자**를 받는다. 우리 칸에는
8
+ * `PT209S` 가 들어 있어서 붙여 보니 화면이 빈 칸이었다.
9
+ *
10
+ * 그래서 같은 이름으로 우리 것을 덮어 등록해 봤더니 **그것도 안 됐다.** `worklist` 패키지가 같은
11
+ * 이름으로 초 숫자용을 등록하고 있었고, 나중에 부팅한 쪽이 이긴다. 둘 다 자기가 이겼는지 모른다.
12
+ *
13
+ * 이름을 뺏는 대신 뜻이 다른 이름을 쓴다. 초 숫자와 ISO 8601 은 실제로 다른 타입이고, 이름이 그것을
14
+ * 말해야 한다. `worklist` 의 화면은 초를 저장하는 것이 맞고 우리가 건드릴 일이 아니다.
15
+ *
16
+ * **이 등록소는 앱 전체가 한 벌을 나눠 쓴다** — 이름이 겹치면 조용히 진다. 아키텍트에게 올려 두었다.
17
+ */
18
+ export default function bootstrap(): void;
@@ -0,0 +1,36 @@
1
+ import { registerEditor as registerGristEditor, registerRenderer as registerGristRenderer } from '@operato/data-grist';
2
+ import { OpsMasterGristEditorIsoDuration, OxGristRendererIsoDuration } from './pages/master/grist-iso-duration.js';
3
+ import { OpsMasterGristEditorReference, OxGristRendererList, OxGristRendererReference } from './pages/master/grist-reference.js';
4
+ /**
5
+ * 그리드 편집기 등록.
6
+ *
7
+ * `select` · `json5` · `datetime` 같은 것은 data-grist 가 기본으로 등록한다.
8
+ *
9
+ * ── 왜 `duration` 이 아니라 `iso-duration` 인가 ────────────────────────────
10
+ * `@operato/grist-editor` 에 `duration` 이 있지만 그것은 **초 숫자**를 받는다. 우리 칸에는
11
+ * `PT209S` 가 들어 있어서 붙여 보니 화면이 빈 칸이었다.
12
+ *
13
+ * 그래서 같은 이름으로 우리 것을 덮어 등록해 봤더니 **그것도 안 됐다.** `worklist` 패키지가 같은
14
+ * 이름으로 초 숫자용을 등록하고 있었고, 나중에 부팅한 쪽이 이긴다. 둘 다 자기가 이겼는지 모른다.
15
+ *
16
+ * 이름을 뺏는 대신 뜻이 다른 이름을 쓴다. 초 숫자와 ISO 8601 은 실제로 다른 타입이고, 이름이 그것을
17
+ * 말해야 한다. `worklist` 의 화면은 초를 저장하는 것이 맞고 우리가 건드릴 일이 아니다.
18
+ *
19
+ * **이 등록소는 앱 전체가 한 벌을 나눠 쓴다** — 이름이 겹치면 조용히 진다. 아키텍트에게 올려 두었다.
20
+ */
21
+ export default function bootstrap() {
22
+ registerGristRenderer('iso-duration', OxGristRendererIsoDuration);
23
+ registerGristEditor('iso-duration', OpsMasterGristEditorIsoDuration);
24
+ /*
25
+ * 다른 표의 이름 하나를 골라 오는 칸. `resource-object` 와 팝업은 같고 저장하는 것이 다르다 —
26
+ * 저쪽은 객체, 이쪽은 이름. 이름이 그것을 말해야 해서 따로 등록한다.
27
+ */
28
+ registerGristRenderer('reference', OxGristRendererReference);
29
+ registerGristEditor('reference', OpsMasterGristEditorReference);
30
+ /*
31
+ * 목록 칸. 기본 글자 렌더러는 배열을 **구분 없이 이어 붙인다** — 두 사람이 선 자리가
32
+ * 「P-ECU-S-0001P-ECU-S-0002」로 보였다. 고칠 것은 그리기뿐이라 편집기는 그대로 둔다.
33
+ */
34
+ registerGristRenderer('ops-list', OxGristRendererList);
35
+ }
36
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../client/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,IAAI,mBAAmB,EAAE,gBAAgB,IAAI,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAEtH,OAAO,EAAE,+BAA+B,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAA;AAClH,OAAO,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAA;AAEhI;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,qBAAqB,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAA;IACjE,mBAAmB,CAAC,cAAc,EAAE,+BAA+B,CAAC,CAAA;IAEpE;;;OAGG;IACH,qBAAqB,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAA;IAC5D,mBAAmB,CAAC,WAAW,EAAE,6BAA6B,CAAC,CAAA;IAE/D;;;OAGG;IACH,qBAAqB,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAA;AACxD,CAAC","sourcesContent":["import { registerEditor as registerGristEditor, registerRenderer as registerGristRenderer } from '@operato/data-grist'\n\nimport { OpsMasterGristEditorIsoDuration, OxGristRendererIsoDuration } from './pages/master/grist-iso-duration.js'\nimport { OpsMasterGristEditorReference, OxGristRendererList, OxGristRendererReference } from './pages/master/grist-reference.js'\n\n/**\n * 그리드 편집기 등록.\n *\n * `select` · `json5` · `datetime` 같은 것은 data-grist 가 기본으로 등록한다.\n *\n * ── 왜 `duration` 이 아니라 `iso-duration` 인가 ────────────────────────────\n * `@operato/grist-editor` 에 `duration` 이 있지만 그것은 **초 숫자**를 받는다. 우리 칸에는\n * `PT209S` 가 들어 있어서 붙여 보니 화면이 빈 칸이었다.\n *\n * 그래서 같은 이름으로 우리 것을 덮어 등록해 봤더니 **그것도 안 됐다.** `worklist` 패키지가 같은\n * 이름으로 초 숫자용을 등록하고 있었고, 나중에 부팅한 쪽이 이긴다. 둘 다 자기가 이겼는지 모른다.\n *\n * 이름을 뺏는 대신 뜻이 다른 이름을 쓴다. 초 숫자와 ISO 8601 은 실제로 다른 타입이고, 이름이 그것을\n * 말해야 한다. `worklist` 의 화면은 초를 저장하는 것이 맞고 우리가 건드릴 일이 아니다.\n *\n * **이 등록소는 앱 전체가 한 벌을 나눠 쓴다** — 이름이 겹치면 조용히 진다. 아키텍트에게 올려 두었다.\n */\nexport default function bootstrap() {\n registerGristRenderer('iso-duration', OxGristRendererIsoDuration)\n registerGristEditor('iso-duration', OpsMasterGristEditorIsoDuration)\n\n /*\n * 다른 표의 이름 하나를 골라 오는 칸. `resource-object` 와 팝업은 같고 저장하는 것이 다르다 —\n * 저쪽은 객체, 이쪽은 이름. 이름이 그것을 말해야 해서 따로 등록한다.\n */\n registerGristRenderer('reference', OxGristRendererReference)\n registerGristEditor('reference', OpsMasterGristEditorReference)\n\n /*\n * 목록 칸. 기본 글자 렌더러는 배열을 **구분 없이 이어 붙인다** — 두 사람이 선 자리가\n * 「P-ECU-S-0001P-ECU-S-0002」로 보였다. 고칠 것은 그리기뿐이라 편집기는 그대로 둔다.\n */\n registerGristRenderer('ops-list', OxGristRendererList)\n}\n"]}
@@ -1 +1,15 @@
1
- export * from './pages/master-list';
1
+ export * from './pages/master/master-page-base';
2
+ export * from './pages/master/personnel-class';
3
+ export * from './pages/master/person';
4
+ export * from './pages/master/equipment-class';
5
+ export * from './pages/master/equipment';
6
+ export * from './pages/master/stop-reason';
7
+ export * from './pages/master/physical-asset-class';
8
+ export * from './pages/master/physical-asset';
9
+ export * from './pages/master/material-class';
10
+ export * from './pages/master/material-definition';
11
+ export * from './pages/master/operational-location';
12
+ export * from './pages/master/operation-definition';
13
+ export * from './pages/master/test-specification';
14
+ export * from './pages/master/route-definition';
15
+ export * from './pages/master/recipe-definition';
@@ -1,2 +1,19 @@
1
- export * from './pages/master-list';
1
+ /*
2
+ * 마스터 화면은 축마다 하나다 — 이유는 pages/master/master-page-base.ts 에 적었다.
3
+ */
4
+ export * from './pages/master/master-page-base';
5
+ export * from './pages/master/personnel-class';
6
+ export * from './pages/master/person';
7
+ export * from './pages/master/equipment-class';
8
+ export * from './pages/master/equipment';
9
+ export * from './pages/master/stop-reason';
10
+ export * from './pages/master/physical-asset-class';
11
+ export * from './pages/master/physical-asset';
12
+ export * from './pages/master/material-class';
13
+ export * from './pages/master/material-definition';
14
+ export * from './pages/master/operational-location';
15
+ export * from './pages/master/operation-definition';
16
+ export * from './pages/master/test-specification';
17
+ export * from './pages/master/route-definition';
18
+ export * from './pages/master/recipe-definition';
2
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA","sourcesContent":["export * from './pages/master-list'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,iCAAiC,CAAA;AAC/C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,uBAAuB,CAAA;AACrC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,qCAAqC,CAAA;AACnD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,oCAAoC,CAAA;AAClD,cAAc,qCAAqC,CAAA;AACnD,cAAc,qCAAqC,CAAA;AACnD,cAAc,mCAAmC,CAAA;AACjD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,kCAAkC,CAAA","sourcesContent":["/*\n * 마스터 화면은 축마다 하나다 — 이유는 pages/master/master-page-base.ts 에 적었다.\n */\nexport * from './pages/master/master-page-base'\nexport * from './pages/master/personnel-class'\nexport * from './pages/master/person'\nexport * from './pages/master/equipment-class'\nexport * from './pages/master/equipment'\nexport * from './pages/master/stop-reason'\nexport * from './pages/master/physical-asset-class'\nexport * from './pages/master/physical-asset'\nexport * from './pages/master/material-class'\nexport * from './pages/master/material-definition'\nexport * from './pages/master/operational-location'\nexport * from './pages/master/operation-definition'\nexport * from './pages/master/test-specification'\nexport * from './pages/master/route-definition'\nexport * from './pages/master/recipe-definition'\n"]}
@@ -0,0 +1,12 @@
1
+ import { MasterPageBase, MasterSpec } from './master-page-base.js';
2
+ /**
3
+ * 설비를 묶는 틀. 「1200톤 사출기」처럼 같은 종류의 설비가 공유하는 성질을 정한다.
4
+ *
5
+ * 설비 하나하나가 이 등급을 가리킨다. 등급을 고치면 그 등급의 설비 전체가 함께 바뀐다.
6
+ *
7
+ * 화면 골격과 저장은 MasterPageBase 가 갖는다. 이 파일은 **이 화면이 무엇을 보이나**만 말한다 —
8
+ * 자기 인터페이스가 필요해지면 여기서 render 를 덮어쓴다.
9
+ */
10
+ export declare class OpsMasterEquipmentClass extends MasterPageBase {
11
+ protected get spec(): MasterSpec;
12
+ }
@@ -0,0 +1,42 @@
1
+ import { __decorate } from "tslib";
2
+ import { customElement } from 'lit/decorators.js';
3
+ import { EFFECTIVE, IDENTITY, MasterPageBase } from './master-page-base.js';
4
+ /**
5
+ * 설비를 묶는 틀. 「1200톤 사출기」처럼 같은 종류의 설비가 공유하는 성질을 정한다.
6
+ *
7
+ * 설비 하나하나가 이 등급을 가리킨다. 등급을 고치면 그 등급의 설비 전체가 함께 바뀐다.
8
+ *
9
+ * 화면 골격과 저장은 MasterPageBase 가 갖는다. 이 파일은 **이 화면이 무엇을 보이나**만 말한다 —
10
+ * 자기 인터페이스가 필요해지면 여기서 render 를 덮어쓴다.
11
+ */
12
+ let OpsMasterEquipmentClass = class OpsMasterEquipmentClass extends MasterPageBase {
13
+ get spec() {
14
+ return {
15
+ key: 'equipmentClass',
16
+ title: 'equipment-class',
17
+ help: 'ops-master/equipment-class',
18
+ query: 'equipmentClasses',
19
+ mutation: 'updateMultipleEquipmentClass',
20
+ columns: [
21
+ ...IDENTITY,
22
+ { name: 'baseIds', label: 'base-classes', type: 'reference-list', reference: { queryName: 'equipmentClasses' }, width: 180 },
23
+ /*
24
+ * ── 나를 누가 쓰나 ────────────────────────────────────────────────
25
+ *
26
+ * 값의 주인이 이 표가 아니라 **저쪽 표**다. 그래서 여기서 못 고친다 — 바꾸려면 그쪽에서
27
+ * 이 이름을 가리키게 하거나 떼면 된다.
28
+ *
29
+ * 넘치면 **몇이 안 보이는지 함께 낸다.** 오류보고없이 자르면 「셋이 있다」와 「서른이 있는데
30
+ * 셋만 보인다」가 같아 보이고, 그 칸을 보고 사람이 판단을 내린다.
31
+ */
32
+ { name: 'members', label: 'members', type: 'list', width: 240, readonly: true },
33
+ ...EFFECTIVE
34
+ ]
35
+ };
36
+ }
37
+ };
38
+ OpsMasterEquipmentClass = __decorate([
39
+ customElement('ops-master-equipment-class')
40
+ ], OpsMasterEquipmentClass);
41
+ export { OpsMasterEquipmentClass };
42
+ //# sourceMappingURL=equipment-class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equipment-class.js","sourceRoot":"","sources":["../../../client/pages/master/equipment-class.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,uBAAuB,CAAA;AAEvF;;;;;;;GAOG;AAEI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,cAAc;IACzD,IAAc,IAAI;QAChB,OAAO;YACL,GAAG,EAAE,gBAAgB;YACrB,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,4BAA4B;YAClC,KAAK,EAAE,kBAAkB;YACzB,QAAQ,EAAE,8BAA8B;YACxC,OAAO,EAAE;gBACP,GAAG,QAAQ;gBACX,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC5H;;;;;;;;mBAQG;gBACH,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/E,GAAG,SAAS;aACb;SACF,CAAA;IACH,CAAC;CACF,CAAA;AAzBY,uBAAuB;IADnC,aAAa,CAAC,4BAA4B,CAAC;GAC/B,uBAAuB,CAyBnC","sourcesContent":["import { customElement } from 'lit/decorators.js'\n\nimport { EFFECTIVE, IDENTITY, MasterPageBase, MasterSpec } from './master-page-base.js'\n\n/**\n * 설비를 묶는 틀. 「1200톤 사출기」처럼 같은 종류의 설비가 공유하는 성질을 정한다.\n *\n * 설비 하나하나가 이 등급을 가리킨다. 등급을 고치면 그 등급의 설비 전체가 함께 바뀐다.\n *\n * 화면 골격과 저장은 MasterPageBase 가 갖는다. 이 파일은 **이 화면이 무엇을 보이나**만 말한다 —\n * 자기 인터페이스가 필요해지면 여기서 render 를 덮어쓴다.\n */\n@customElement('ops-master-equipment-class')\nexport class OpsMasterEquipmentClass extends MasterPageBase {\n protected get spec(): MasterSpec {\n return {\n key: 'equipmentClass',\n title: 'equipment-class',\n help: 'ops-master/equipment-class',\n query: 'equipmentClasses',\n mutation: 'updateMultipleEquipmentClass',\n columns: [\n ...IDENTITY,\n { name: 'baseIds', label: 'base-classes', type: 'reference-list', reference: { queryName: 'equipmentClasses' }, width: 180 },\n /*\n * ── 나를 누가 쓰나 ────────────────────────────────────────────────\n *\n * 값의 주인이 이 표가 아니라 **저쪽 표**다. 그래서 여기서 못 고친다 — 바꾸려면 그쪽에서\n * 이 이름을 가리키게 하거나 떼면 된다.\n *\n * 넘치면 **몇이 안 보이는지 함께 낸다.** 오류보고없이 자르면 「셋이 있다」와 「서른이 있는데\n * 셋만 보인다」가 같아 보이고, 그 칸을 보고 사람이 판단을 내린다.\n */\n { name: 'members', label: 'members', type: 'list', width: 240, readonly: true },\n ...EFFECTIVE\n ]\n }\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { MasterPageBase, MasterSpec } from './master-page-base.js';
2
+ /**
3
+ * 실제로 돌아가는 설비 하나하나. 실적과 정지 기록이 이것에 붙는다.
4
+ *
5
+ * 근무 캘린더를 정해야 계획 조업 시간이 생기고, 그것이 없으면 가동률이 「모름」이 된다.
6
+ *
7
+ * 화면 골격과 저장은 MasterPageBase 가 갖는다. 이 파일은 **이 화면이 무엇을 보이나**만 말한다 —
8
+ * 자기 인터페이스가 필요해지면 여기서 render 를 덮어쓴다.
9
+ */
10
+ export declare class OpsMasterEquipment extends MasterPageBase {
11
+ protected get spec(): MasterSpec;
12
+ }
@@ -0,0 +1,57 @@
1
+ import { __decorate } from "tslib";
2
+ import { customElement } from 'lit/decorators.js';
3
+ import { EFFECTIVE, IDENTITY, MasterPageBase } from './master-page-base.js';
4
+ /**
5
+ * 실제로 돌아가는 설비 하나하나. 실적과 정지 기록이 이것에 붙는다.
6
+ *
7
+ * 근무 캘린더를 정해야 계획 조업 시간이 생기고, 그것이 없으면 가동률이 「모름」이 된다.
8
+ *
9
+ * 화면 골격과 저장은 MasterPageBase 가 갖는다. 이 파일은 **이 화면이 무엇을 보이나**만 말한다 —
10
+ * 자기 인터페이스가 필요해지면 여기서 render 를 덮어쓴다.
11
+ */
12
+ let OpsMasterEquipment = class OpsMasterEquipment extends MasterPageBase {
13
+ get spec() {
14
+ return {
15
+ key: 'equipment',
16
+ title: 'equipment',
17
+ help: 'ops-master/equipment',
18
+ query: 'equipmentList',
19
+ mutation: 'updateMultipleEquipment',
20
+ columns: [
21
+ ...IDENTITY,
22
+ { name: 'kind', label: 'equipment-class', type: 'string', width: 200 },
23
+ { name: 'identity', label: 'identity', type: 'string', width: 200 },
24
+ {
25
+ name: 'homeLocation',
26
+ label: 'home-location',
27
+ type: 'reference',
28
+ reference: { queryName: 'operationalLocations' },
29
+ width: 140
30
+ },
31
+ /*
32
+ * ── 손으로 칠 수 있는 값이 아니다 ─────────────────────────────────
33
+ *
34
+ * `type: 'json'` 은 글자를 그대로 받아 `JSON.parse` 하고, 실패하면 **오류 없이 `null`**
35
+ * 로 둔다(`data-grid-body.js`). 그래서 이 칸을 고치려면 사람이 이런 것을 손으로 쳐야
36
+ * 했고, 오타 하나에 그 설비의 계획 가동 시간이 조용히 사라졌다.
37
+ *
38
+ * [{"id":"A조","fromDayOffset":0,"fromTime":"06:00","toDayOffset":0,"toTime":"14:00"}]
39
+ *
40
+ * 그리고 **정상은 이 칸이 비는 것**이다. 근무조는 자리가 선언하고 설비가 물려받는다
41
+ * (`OperationalLocation.workShiftNames`). 이 칸은 「이 설비만 따로 이렇게 가동한다」는
42
+ * 예외를 적는 자리다 — 예외가 없는 설비에 값이 있으면 화면이 거짓말을 한다.
43
+ *
44
+ * 읽기 전용으로 둔다. 값이 있으면 보이고, 고치는 길은 예외를 제대로 세울 때 만든다.
45
+ * 지금 상태로 열어 두는 것은 고칠 수 있는 척하면서 자료를 잃는 것이다.
46
+ */
47
+ { name: 'workCalendar', label: 'work-calendar', type: 'json', width: 200, readonly: true },
48
+ ...EFFECTIVE
49
+ ]
50
+ };
51
+ }
52
+ };
53
+ OpsMasterEquipment = __decorate([
54
+ customElement('ops-master-equipment')
55
+ ], OpsMasterEquipment);
56
+ export { OpsMasterEquipment };
57
+ //# sourceMappingURL=equipment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equipment.js","sourceRoot":"","sources":["../../../client/pages/master/equipment.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,uBAAuB,CAAA;AAEvF;;;;;;;GAOG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,cAAc;IACpD,IAAc,IAAI;QAChB,OAAO;YACL,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,eAAe;YACtB,QAAQ,EAAE,yBAAyB;YACnC,OAAO,EAAE;gBACP,GAAG,QAAQ;gBACX,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;gBACtE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnE;oBACE,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE;oBAChD,KAAK,EAAE,GAAG;iBACX;gBACD;;;;;;;;;;;;;;;mBAeG;gBACH,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC1F,GAAG,SAAS;aACb;SACF,CAAA;IACH,CAAC;CACF,CAAA;AAxCY,kBAAkB;IAD9B,aAAa,CAAC,sBAAsB,CAAC;GACzB,kBAAkB,CAwC9B","sourcesContent":["import { customElement } from 'lit/decorators.js'\n\nimport { EFFECTIVE, IDENTITY, MasterPageBase, MasterSpec } from './master-page-base.js'\n\n/**\n * 실제로 돌아가는 설비 하나하나. 실적과 정지 기록이 이것에 붙는다.\n *\n * 근무 캘린더를 정해야 계획 조업 시간이 생기고, 그것이 없으면 가동률이 「모름」이 된다.\n *\n * 화면 골격과 저장은 MasterPageBase 가 갖는다. 이 파일은 **이 화면이 무엇을 보이나**만 말한다 —\n * 자기 인터페이스가 필요해지면 여기서 render 를 덮어쓴다.\n */\n@customElement('ops-master-equipment')\nexport class OpsMasterEquipment extends MasterPageBase {\n protected get spec(): MasterSpec {\n return {\n key: 'equipment',\n title: 'equipment',\n help: 'ops-master/equipment',\n query: 'equipmentList',\n mutation: 'updateMultipleEquipment',\n columns: [\n ...IDENTITY,\n { name: 'kind', label: 'equipment-class', type: 'string', width: 200 },\n { name: 'identity', label: 'identity', type: 'string', width: 200 },\n {\n name: 'homeLocation',\n label: 'home-location',\n type: 'reference',\n reference: { queryName: 'operationalLocations' },\n width: 140\n },\n /*\n * ── 손으로 칠 수 있는 값이 아니다 ─────────────────────────────────\n *\n * `type: 'json'` 은 글자를 그대로 받아 `JSON.parse` 하고, 실패하면 **오류 없이 `null`**\n * 로 둔다(`data-grid-body.js`). 그래서 이 칸을 고치려면 사람이 이런 것을 손으로 쳐야\n * 했고, 오타 하나에 그 설비의 계획 가동 시간이 조용히 사라졌다.\n *\n * [{\"id\":\"A조\",\"fromDayOffset\":0,\"fromTime\":\"06:00\",\"toDayOffset\":0,\"toTime\":\"14:00\"}]\n *\n * 그리고 **정상은 이 칸이 비는 것**이다. 근무조는 자리가 선언하고 설비가 물려받는다\n * (`OperationalLocation.workShiftNames`). 이 칸은 「이 설비만 따로 이렇게 가동한다」는\n * 예외를 적는 자리다 — 예외가 없는 설비에 값이 있으면 화면이 거짓말을 한다.\n *\n * 읽기 전용으로 둔다. 값이 있으면 보이고, 고치는 길은 예외를 제대로 세울 때 만든다.\n * 지금 상태로 열어 두는 것은 고칠 수 있는 척하면서 자료를 잃는 것이다.\n */\n { name: 'workCalendar', label: 'work-calendar', type: 'json', width: 200, readonly: true },\n ...EFFECTIVE\n ]\n }\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { OxGristEditor } from '@operato/data-grist';
2
+ export declare const OxGristRendererIsoDuration: (value: string | undefined) => import("lit-html").TemplateResult<1>;
3
+ export declare class OpsMasterGristEditorIsoDuration extends OxGristEditor {
4
+ get inlineEditable(): boolean;
5
+ /**
6
+ * 저장된 표기 → 편집기.
7
+ *
8
+ * 초로 고치게 한다. 이 공정들의 소요시간은 6.5초에서 360초 사이라 초가 자연스럽고, 저장되는
9
+ * 표기와도 맞는다.
10
+ */
11
+ formatForEditor(value: any): number | "";
12
+ /**
13
+ * 편집기 → 저장할 표기.
14
+ *
15
+ * **빈 칸은 지운 것으로 본다.** 0 으로 떨어뜨리면 그냥 지나간 칸이 「즉시 끝나는 공정」이 되고,
16
+ * 그 공정은 택트 계산에서 없는 것처럼 통과한다.
17
+ */
18
+ formatFromEditor(value: any): any;
19
+ get editorTemplate(): import("lit-html").TemplateResult<1>;
20
+ }
@@ -0,0 +1,70 @@
1
+ import { __decorate } from "tslib";
2
+ import { html } from 'lit';
3
+ import { customElement } from 'lit/decorators.js';
4
+ import { OxGristEditor } from '@operato/data-grist';
5
+ import { i18next } from '@operato/i18n';
6
+ import { durationText, isoDurationOfSeconds, secondsOfIsoDuration } from './iso-duration.js';
7
+ /**
8
+ * ISO 8601 기간 칸의 그리기와 고치기.
9
+ *
10
+ * `@operato/grist-editor` 의 `duration` 은 **초 숫자**용이라 여기 못 쓴다 — 자세한 사연은
11
+ * `iso-duration.ts` 첫 주석에 있다. 값의 해석은 그 파일이 하고, 여기는 화면만 맡는다.
12
+ */
13
+ /** 시·분·초 용어. 공용 패키지가 이미 갖고 있어 새로 만들지 않는다. */
14
+ function units() {
15
+ return {
16
+ hour: i18next.t('label.hours'),
17
+ minute: i18next.t('label.minutes'),
18
+ second: i18next.t('label.seconds')
19
+ };
20
+ }
21
+ export const OxGristRendererIsoDuration = (value) => html `<span>${durationText(value, units())}</span>`;
22
+ let OpsMasterGristEditorIsoDuration = class OpsMasterGristEditorIsoDuration extends OxGristEditor {
23
+ get inlineEditable() {
24
+ return true;
25
+ }
26
+ /**
27
+ * 저장된 표기 → 편집기.
28
+ *
29
+ * 초로 고치게 한다. 이 공정들의 소요시간은 6.5초에서 360초 사이라 초가 자연스럽고, 저장되는
30
+ * 표기와도 맞는다.
31
+ */
32
+ formatForEditor(value) {
33
+ const seconds = secondsOfIsoDuration(value);
34
+ /*
35
+ * 해석할 수 없는 값이면 편집기를 비운다. 렌더러가 원문을 보여 주었으므로 사용자는 무엇이
36
+ * 이상했는지 이미 보았다.
37
+ */
38
+ return seconds === undefined ? '' : seconds;
39
+ }
40
+ /**
41
+ * 편집기 → 저장할 표기.
42
+ *
43
+ * **빈 칸은 지운 것으로 본다.** 0 으로 떨어뜨리면 그냥 지나간 칸이 「즉시 끝나는 공정」이 되고,
44
+ * 그 공정은 택트 계산에서 없는 것처럼 통과한다.
45
+ */
46
+ formatFromEditor(value) {
47
+ const text = String(value ?? '').trim();
48
+ if (!text) {
49
+ return null;
50
+ }
51
+ const seconds = Number(text);
52
+ /*
53
+ * 숫자가 아니면 **저장하지 않고 앞의 값을 둔다.** 여기서 null 을 내면 사용자가 잘못 친 순간
54
+ * 원래 있던 소요시간이 사라진다.
55
+ */
56
+ if (!Number.isFinite(seconds) || seconds < 0) {
57
+ return this.value;
58
+ }
59
+ return isoDurationOfSeconds(seconds);
60
+ }
61
+ get editorTemplate() {
62
+ /* 초 단위. 작업표준서에 6.5초 같은 값이 있어 소수를 받는다. */
63
+ return html `<input type="number" min="0" step="0.1" .value=${this.value ?? ''} />`;
64
+ }
65
+ };
66
+ OpsMasterGristEditorIsoDuration = __decorate([
67
+ customElement('ops-master-grist-editor-iso-duration')
68
+ ], OpsMasterGristEditorIsoDuration);
69
+ export { OpsMasterGristEditorIsoDuration };
70
+ //# sourceMappingURL=grist-iso-duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grist-iso-duration.js","sourceRoot":"","sources":["../../../client/pages/master/grist-iso-duration.ts"],"names":[],"mappings":";AAAA,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;AAEvC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAE5F;;;;;GAKG;AAEH,6CAA6C;AAC7C,SAAS,KAAK;IACZ,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;QAC9B,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAClC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;KACnC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,KAAyB,EAAE,EAAE,CACtE,IAAI,CAAA,SAAS,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,SAAS,CAAA;AAG7C,IAAM,+BAA+B,GAArC,MAAM,+BAAgC,SAAQ,aAAa;IAChE,IAAI,cAAc;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;OAKG;IACH,eAAe,CAAC,KAAU;QACxB,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;QAE3C;;;WAGG;QACH,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;IAC7C,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,KAAU;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAEvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAE5B;;;WAGG;QACH,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC,KAAK,CAAA;QACnB,CAAC;QAED,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAA;IACtC,CAAC;IAED,IAAI,cAAc;QAChB,yCAAyC;QACzC,OAAO,IAAI,CAAA,kDAAkD,IAAI,CAAC,KAAK,IAAI,EAAE,KAAK,CAAA;IACpF,CAAC;CACF,CAAA;AAnDY,+BAA+B;IAD3C,aAAa,CAAC,sCAAsC,CAAC;GACzC,+BAA+B,CAmD3C","sourcesContent":["import { html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { OxGristEditor } from '@operato/data-grist'\nimport { i18next } from '@operato/i18n'\n\nimport { durationText, isoDurationOfSeconds, secondsOfIsoDuration } from './iso-duration.js'\n\n/**\n * ISO 8601 기간 칸의 그리기와 고치기.\n *\n * `@operato/grist-editor` 의 `duration` 은 **초 숫자**용이라 여기 못 쓴다 — 자세한 사연은\n * `iso-duration.ts` 첫 주석에 있다. 값의 해석은 그 파일이 하고, 여기는 화면만 맡는다.\n */\n\n/** 시·분·초 용어. 공용 패키지가 이미 갖고 있어 새로 만들지 않는다. */\nfunction units() {\n return {\n hour: i18next.t('label.hours'),\n minute: i18next.t('label.minutes'),\n second: i18next.t('label.seconds')\n }\n}\n\nexport const OxGristRendererIsoDuration = (value: string | undefined) =>\n html`<span>${durationText(value, units())}</span>`\n\n@customElement('ops-master-grist-editor-iso-duration')\nexport class OpsMasterGristEditorIsoDuration extends OxGristEditor {\n get inlineEditable() {\n return true\n }\n\n /**\n * 저장된 표기 → 편집기.\n *\n * 초로 고치게 한다. 이 공정들의 소요시간은 6.5초에서 360초 사이라 초가 자연스럽고, 저장되는\n * 표기와도 맞는다.\n */\n formatForEditor(value: any) {\n const seconds = secondsOfIsoDuration(value)\n\n /*\n * 해석할 수 없는 값이면 편집기를 비운다. 렌더러가 원문을 보여 주었으므로 사용자는 무엇이\n * 이상했는지 이미 보았다.\n */\n return seconds === undefined ? '' : seconds\n }\n\n /**\n * 편집기 → 저장할 표기.\n *\n * **빈 칸은 지운 것으로 본다.** 0 으로 떨어뜨리면 그냥 지나간 칸이 「즉시 끝나는 공정」이 되고,\n * 그 공정은 택트 계산에서 없는 것처럼 통과한다.\n */\n formatFromEditor(value: any) {\n const text = String(value ?? '').trim()\n\n if (!text) {\n return null\n }\n\n const seconds = Number(text)\n\n /*\n * 숫자가 아니면 **저장하지 않고 앞의 값을 둔다.** 여기서 null 을 내면 사용자가 잘못 친 순간\n * 원래 있던 소요시간이 사라진다.\n */\n if (!Number.isFinite(seconds) || seconds < 0) {\n return this.value\n }\n\n return isoDurationOfSeconds(seconds)\n }\n\n get editorTemplate() {\n /* 초 단위. 작업표준서에 6.5초 같은 값이 있어 소수를 받는다. */\n return html`<input type=\"number\" min=\"0\" step=\"0.1\" .value=${this.value ?? ''} />`\n }\n}\n"]}
@@ -0,0 +1,91 @@
1
+ import '@material/web/icon/icon.js';
2
+ import '@operato/app/selector/ox-selector-resource-object.js';
3
+ import '@operato/input/ox-input-search.js';
4
+ import { OxGristEditor } from '@operato/data-grist';
5
+ /**
6
+ * 다른 표의 **이름 하나**를 골라 오는 칸.
7
+ *
8
+ * ── 왜 있는 것을 그대로 못 썼나 ────────────────────────────────────────────
9
+ * `@operato/app` 에 `resource-object` 편집기가 있고, 우리가 필요한 「다른 표에서 고르기」 팝업을
10
+ * 이미 갖고 있다. 그런데 그것은 **객체를 저장한다** — 확정할 때 `{ id, name, description, … }` 을
11
+ * 통째로 칸에 넣는다.
12
+ *
13
+ * 우리 칸은 이름 문자열이다. `homeLocation` 은 `'GUNSAN'` 이고 `route` 는 `'ROUTE-ECU-STD'` 다.
14
+ * **커널이 이름으로 주소를 잡기 때문**이다(마스터가 트윈에 낼 때 이름을 id 로 낸다). 저 편집기를
15
+ * 그대로 붙이면 문자열 칸에 객체가 들어가고, 그 뒤로 그 참조는 어디에서도 안 걸린다.
16
+ *
17
+ * 그래서 **고르는 팝업은 그대로 쓰고**(`ox-selector-resource-object`) 확정할 때 이름만 꺼낸다.
18
+ * 팝업을 새로 만들면 검색·페이징·필터를 다시 짜야 하고, 그것은 이미 잘 동작하는 것을 한 번 더 만드는 일이다.
19
+ */
20
+ /** 열 선언이 주는 것 — 어느 표에서, 무엇을 보이고, 무엇을 저장하나. */
21
+ export interface ReferenceOptions {
22
+ /** GraphQL 질의 이름. `operationalLocations` · `routeDefinitions` 처럼. */
23
+ queryName: string;
24
+ /**
25
+ * 여러 개를 고르나. 상위 등급 · 요구 검사 · 공정의 차례처럼 **여럿을 다는 칸**이 켠다.
26
+ *
27
+ * 켜면 고른 것들의 배열을 그대로 저장한다. 끄면 하나를 저장한다.
28
+ */
29
+ multiple?: boolean;
30
+ /**
31
+ * 팝업 제목. 없으면 **그 칸의 머리말**을 쓴다.
32
+ *
33
+ * 비워 두면 안 된다. 팝업 머리에 글자가 하나도 없으면 회색 띠에 검색창만 떠 있는 꼴이 되고,
34
+ * 무엇을 고르는 중인지 화면이 말하지 않는다. 실제로 그랬다 — 원본 편집기가 이 값을 검색창
35
+ * 안내문으로만 넘기고 팝업 제목으로는 안 넘긴다.
36
+ */
37
+ title?: string;
38
+ /** 팝업의 목록에 보일 칸들. 없으면 이름과 설명. */
39
+ columns?: {
40
+ name: string;
41
+ header?: string;
42
+ width?: number;
43
+ }[];
44
+ /**
45
+ * 칸에 저장할 값을 어느 칸에서 꺼내나. 기본은 `name`.
46
+ *
47
+ * **`id` 가 아니다.** 커널이 이름으로 주소를 잡는다.
48
+ */
49
+ valueField?: string;
50
+ }
51
+ /**
52
+ * 참조 칸을 그린다 — **걸어갈 수 있으면 문으로.**
53
+ *
54
+ * 참조가 「ECU-SUB-01」이라고 적어도 거기로 갈 길이 없었다. 그 자리가 무엇인지 보려면 자리 화면을
55
+ * 따로 열고 이름으로 찾아야 했다. 마스터는 그래프인데 화면은 표 열넷으로 흩어져 있어, 축에서 축으로
56
+ * 건너가는 일이 사람의 기억에 맡겨져 있었다.
57
+ *
58
+ * **갈 곳을 모르면 문으로 안 그린다.** 선택했는데 아무 일도 안 나면 사람은 그것을 고장으로 읽는다.
59
+ * 그때는 글자 그대로 둔다.
60
+ *
61
+ * 진짜 `a` 로 그린다. 가운데 버튼으로 새 탭에 열고, 오른쪽 버튼으로 주소를 복사하는 것이 그냥 된다.
62
+ * 셸이 앵커를 물어 화면 안에서 옮긴다.
63
+ */
64
+ /**
65
+ * 목록 칸 — **값 사이가 보여야 한다.**
66
+ *
67
+ * `list` 를 글자 칸으로 떨어뜨렸더니 Lit 이 배열을 이어 붙여 그렸다. 두 사람이 서 있는 자리가
68
+ * 「P-ECU-S-0001P-ECU-S-0002」로 보였다 — 한 사람 이름이 이상하게 긴 것처럼 읽힌다.
69
+ * [확인함] 2026-09-04
70
+ *
71
+ * 쉼표가 아니라 가운뎃점을 쓴다. 이름 안에 쉼표가 든 값이 있을 수 있고(품명·설명), 그때 어디가
72
+ * 경계인지 알 수 없다.
73
+ */
74
+ export declare const OxGristRendererList: (value: unknown) => import("lit-html").TemplateResult<1>;
75
+ export declare const OxGristRendererReference: (value: string | undefined, column?: any) => import("lit-html").TemplateResult<1>;
76
+ export declare class OpsMasterGristEditorReference extends OxGristEditor {
77
+ static opensPopup: boolean;
78
+ private popup?;
79
+ get editorTemplate(): import("lit-html").TemplateResult<1>;
80
+ _onclick(e: Event): void;
81
+ _ondblclick(e: Event): void;
82
+ _onkeydown(e: KeyboardEvent): void;
83
+ /**
84
+ * 고른 값을 그리드에 알린다.
85
+ *
86
+ * 부모가 듣는 이름이 `field-change` 다. 이 이름이 아니면 팝업에서 고른 것이 **오류 보고 없이**
87
+ * 사라진다 — 화면에는 잠깐 보였다가 다음 그리기에서 옛 값으로 돌아간다.
88
+ */
89
+ private commit;
90
+ private openSelector;
91
+ }