@things-factory/ops-master 10.0.19 → 10.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +5 -5
  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
@@ -1,189 +1,39 @@
1
1
  /**
2
- * 마스터 열두 축의 **화면 쪽 선언** — 축마다 다른 것만 적는다.
2
+ * 마스터 축의 **이름 목록** — 옛 주소를 새 주소로 보내는 데만 쓴다.
3
3
  *
4
- * ── 왜 화면이 하나인가 ─────────────────────────────────────────────────────
5
- * 열두 축의 화면이 하는 일이 같다: 목록을 보이고, 그리드에서 고치고, 저장한다. 화면을 열둘 만들면
6
- * 규칙 하나를 고칠 때 열두 곳을 고쳐야 하고, 한 곳을 빠뜨리면 그 축만 다르게 동작한다.
4
+ * ── 왜 이만큼만 남았나 ─────────────────────────────────────────────────────
5
+ * 이 파일에는 열두 축의 컬럼 선언이 250줄 들어 있었다. 화면이 하나였을 때의 것이다. 화면이 축마다
6
+ * 갈린 뒤로는 **각 화면 파일이 자기 컬럼을 갖고**, 여기 있던 선언은 아무도 읽지 않게 되었다.
7
+ * 읽히는 것은 `key` 하나뿐이다(`route.ts` 가 옛 주소를 새 주소로 보낼 때).
7
8
  *
8
- * ── 왜 서버의 축 표와 따로 두나 ────────────────────────────────────────────
9
- * 서버가 아는 것은 「어느 표에서 읽나 · 무엇으로 찾나」이고, 화면이 아는 것은 「어느 칸을 어떤 모양으로
10
- * 보이나」다. 서로 다른 물음이라 한 표에 담으면 양쪽 다 지저분해진다. 축의 이름(`key`)만 같게 둔다.
9
+ * 안 읽히는데 그럴듯하게 서 있는 선언은 위험하다. 실제로 그랬다 — 자재 화면에 컬럼을 더하러 와서
10
+ * 이 파일을 먼저 고쳤고, 화면은 하나도 안 변했다. 그 사이 이 파일의 선언은 진짜 화면과 어긋나 있었다
11
+ * (자재의 유형·계보·제조법 칸이 없고, 주석에 「이 칸은 API 가 안 준다」고 적힌 낡은 사연이 남아 있었다).
12
+ *
13
+ * **컬럼을 고치려면 그 축의 화면 파일을 고친다** — `pages/master/<축>.ts`.
11
14
  */
12
- /** 열두 축이 공통으로 갖는 끝 칸들 — ISA-95 유효 기간. */
13
- const EFFECTIVE = [
14
- { name: 'effectiveStart', label: 'effective-start', type: 'date', width: 150 },
15
- { name: 'effectiveEnd', label: 'effective-end', type: 'date', width: 150 }
16
- ];
17
- /** 이름과 설명은 열두 축이 모두 갖는다. */
18
- const IDENTITY = [
19
- { name: 'name', label: 'name', type: 'string', width: 160 },
20
- { name: 'description', label: 'description', type: 'string', width: 200 }
21
- ];
22
- export const MASTER_AXIS_VIEWS = [
23
- {
24
- key: 'personnelClass',
25
- query: 'personnelClasses',
26
- mutation: 'updateMultiplePersonnelClass',
27
- title: 'personnel-class',
28
- columns: [
29
- ...IDENTITY,
30
- { name: 'baseIds', label: 'base-classes', type: 'list', width: 180 },
31
- /* 이 등급이 요구하는 검사. 자격 인터록이 이 칸을 읽는다 — 비어 있으면 아무 검사도 요구하지 않는다. */
32
- { name: 'testSpecificationIds', label: 'required-tests', type: 'list', width: 200 },
33
- ...EFFECTIVE
34
- ]
35
- },
36
- {
37
- key: 'person',
38
- query: 'persons',
39
- mutation: 'updateMultiplePerson',
40
- title: 'person',
41
- columns: [
42
- ...IDENTITY,
43
- { name: 'personnelClassIds', label: 'personnel-classes', type: 'list', width: 200 },
44
- { name: 'homeLocation', label: 'home-location', type: 'string', width: 140 },
45
- { name: 'workCalendar', label: 'work-calendar', type: 'json', width: 200 },
46
- { name: 'testResults', label: 'test-results', type: 'json', width: 200 },
47
- ...EFFECTIVE
48
- ]
49
- },
50
- {
51
- key: 'equipmentClass',
52
- query: 'equipmentClasses',
53
- mutation: 'updateMultipleEquipmentClass',
54
- title: 'equipment-class',
55
- columns: [...IDENTITY, { name: 'baseIds', label: 'base-classes', type: 'list', width: 180 }, ...EFFECTIVE]
56
- },
57
- {
58
- key: 'equipment',
59
- query: 'equipmentList',
60
- mutation: 'updateMultipleEquipment',
61
- title: 'equipment',
62
- columns: [
63
- ...IDENTITY,
64
- /*
65
- * 설비의 등급은 **하나**이고 이름이 `kind` 다(표준 EquipmentClassID · 계약의 kind 자리).
66
- * 전에는 `equipmentClassIds` 라는 배열 칸을 물었는데 그런 칸이 없다. GraphQL 은 칸 하나가
67
- * 틀리면 질의를 통째로 오류로 내므로, 설비 마스터 화면이 전부 400 이었다.
68
- */
69
- { name: 'kind', label: 'equipment-class', type: 'string', width: 200 },
70
- { name: 'identity', label: 'identity', type: 'string', width: 200 },
71
- { name: 'homeLocation', label: 'home-location', type: 'string', width: 140 },
72
- /* 계획 조업 시간의 바탕. 비어 있으면 OEE 의 가동률이 「모름」이 된다. */
73
- { name: 'workCalendar', label: 'work-calendar', type: 'json', width: 200 },
74
- ...EFFECTIVE
75
- ]
76
- },
77
- {
78
- key: 'stopReason',
79
- query: 'stopReasonList',
80
- mutation: 'updateMultipleStopReason',
81
- title: 'stop-reason',
82
- columns: [
83
- ...IDENTITY,
84
- /* 어느 상태의 사유인가. 이 칸이 가동률을 깎느냐 마느냐를 가른다. */
85
- { name: 'status', label: 'state', type: 'string', width: 130 },
86
- { name: 'parentName', label: 'parent-reason', type: 'string', width: 150 },
87
- { name: 'detailRequired', label: 'detail-required', type: 'boolean', width: 110 },
88
- ...EFFECTIVE
89
- ]
90
- },
91
- {
92
- key: 'physicalAssetClass',
93
- query: 'physicalAssetClasses',
94
- mutation: 'updateMultiplePhysicalAssetClass',
95
- title: 'asset-class',
96
- columns: [
97
- ...IDENTITY,
98
- { name: 'baseIds', label: 'base-classes', type: 'list', width: 180 },
99
- { name: 'testSpecificationIds', label: 'required-tests', type: 'list', width: 200 },
100
- ...EFFECTIVE
101
- ]
102
- },
103
- {
104
- key: 'physicalAsset',
105
- query: 'physicalAssets',
106
- mutation: 'updateMultiplePhysicalAsset',
107
- title: 'asset',
108
- columns: [
109
- ...IDENTITY,
110
- { name: 'assetClassIds', label: 'asset-classes', type: 'list', width: 180 },
111
- { name: 'identity', label: 'grai', type: 'string', width: 200 },
112
- /* 정격 사용 횟수. 비어 있으면 횟수로 막지 않는다. */
113
- { name: 'cycleLimit', label: 'cycle-limit', type: 'number', width: 110 },
114
- { name: 'testResults', label: 'calibrations', type: 'json', width: 200 },
115
- ...EFFECTIVE
116
- ]
117
- },
118
- {
119
- key: 'materialClass',
120
- query: 'materialClasses',
121
- mutation: 'updateMultipleMaterialClass',
122
- title: 'material-class',
123
- columns: [...IDENTITY, { name: 'baseIds', label: 'base-classes', type: 'list', width: 180 }, ...EFFECTIVE]
124
- },
125
- {
126
- key: 'materialDefinition',
127
- query: 'materialDefinitions',
128
- mutation: 'updateMultipleMaterialDefinition',
129
- title: 'material',
130
- columns: [
131
- ...IDENTITY,
132
- { name: 'materialClassIds', label: 'material-classes', type: 'list', width: 180 },
133
- /*
134
- * GTIN · 단위 · 보관처는 **API 가 내주지 않는다.** 전에는 `identity`·`uom`·`locationType` 을
135
- * 물었는데 `MaterialDefinition` 에 그런 칸이 없다. GraphQL 은 칸 하나가 틀리면 질의를 통째로
136
- * 오류로 내므로, 자재 마스터 화면이 전부 400 이었다.
137
- *
138
- * 그 값들이 어디에 사는지 모르는 채로 다른 칸을 대신 물지 않는다. 지금은 `properties` 로
139
- * 있는 그대로 보이고, 제 칸이 생기면 그때 나눈다.
140
- */
141
- { name: 'properties', label: 'properties', type: 'json', width: 240 },
142
- ...EFFECTIVE
143
- ]
144
- },
145
- {
146
- key: 'operationalLocation',
147
- query: 'operationalLocations',
148
- mutation: 'updateMultipleOperationalLocation',
149
- title: 'location',
150
- columns: [
151
- ...IDENTITY,
152
- /* 스키마의 이름은 `level`·`parentId` 다. 전에는 `equipmentLevel`·`parentName` 을 물어 화면이 400 이었다. */
153
- { name: 'level', label: 'equipment-level', type: 'string', width: 140 },
154
- { name: 'parentId', label: 'parent-location', type: 'string', width: 150 },
155
- { name: 'type', label: 'location-type', type: 'string', width: 140 },
156
- { name: 'capacity', label: 'capacity', type: 'number', width: 90 },
157
- ...EFFECTIVE
158
- ]
159
- },
160
- {
161
- key: 'operationDefinition',
162
- query: 'operationDefinitions',
163
- mutation: 'updateMultipleOperationDefinition',
164
- title: 'operation',
165
- columns: [
166
- ...IDENTITY,
167
- { name: 'intent', label: 'intent', type: 'string', width: 110 },
168
- { name: 'locationType', label: 'location-type', type: 'string', width: 140 },
169
- { name: 'resourceType', label: 'resource-type', type: 'string', width: 140 },
170
- /* 품목당 표준 시간. 없으면 OEE 의 성능률이 「모름」이 된다. ISO 8601 기간 표기다. */
171
- { name: 'duration', label: 'duration', type: 'string', width: 110 },
172
- /* 요구 인원. 자격 인터록이 이 칸을 읽는다. */
173
- { name: 'personnelSpecification', label: 'personnel-spec', type: 'json', width: 200 },
174
- { name: 'bizStep', label: 'biz-step', type: 'string', width: 200 },
175
- ...EFFECTIVE
176
- ]
177
- },
178
- {
179
- key: 'testSpecification',
180
- query: 'testSpecifications',
181
- mutation: 'updateMultipleTestSpecification',
182
- title: 'test-specification',
183
- columns: [...IDENTITY, ...EFFECTIVE]
184
- }
15
+ /**
16
+ * 축의 이름들.
17
+ *
18
+ * 순서는 뜻이 없다. 새 축이 생기면 여기에 더하고 `pages/master/` 에 화면을 만든다. 여기에만 더하면
19
+ * 옛 주소가 없는 화면으로 간다.
20
+ */
21
+ export const MASTER_AXIS_KEYS = [
22
+ 'personnelClass',
23
+ 'person',
24
+ 'equipmentClass',
25
+ 'equipment',
26
+ 'stopReason',
27
+ 'physicalAssetClass',
28
+ 'physicalAsset',
29
+ 'materialClass',
30
+ 'materialDefinition',
31
+ 'operationalLocation',
32
+ 'operationDefinition',
33
+ 'testSpecification'
185
34
  ];
186
- export function masterAxisViewOf(key) {
187
- return MASTER_AXIS_VIEWS.find(axis => axis.key === key);
35
+ /** 아는 축인가. 모르는 이름이면 옛 주소를 새 주소로 보내지 않는다. */
36
+ export function isMasterAxisKey(key) {
37
+ return MASTER_AXIS_KEYS.includes(key);
188
38
  }
189
39
  //# sourceMappingURL=master-axes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"master-axes.js","sourceRoot":"","sources":["../../client/pages/master-axes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 마스터 열두 축의 **화면 쪽 선언** — 축마다 다른 것만 적는다.\n *\n * ── 왜 화면이 하나인가 ─────────────────────────────────────────────────────\n * 열두 축의 화면이 하는 일이 같다: 목록을 보이고, 그리드에서 고치고, 저장한다. 화면을 열둘 만들면\n * 규칙 하나를 고칠 때 열두 곳을 고쳐야 하고, 한 곳을 빠뜨리면 그 축만 다르게 동작한다.\n *\n * ── 왜 서버의 축 표와 따로 두나 ────────────────────────────────────────────\n * 서버가 아는 것은 「어느 표에서 읽나 · 무엇으로 찾나」이고, 화면이 아는 것은 「어느 칸을 어떤 모양으로\n * 보이나」다. 서로 다른 물음이라 한 표에 담으면 양쪽 다 지저분해진다. 축의 이름(`key`)만 같게 둔다.\n */\n\nexport type ColumnType = 'string' | 'number' | 'boolean' | 'date' | 'json' | 'list'\n\nexport interface AxisColumn {\n name: string\n /** 화면 문구 키. `field.<이것>`. */\n label: string\n type: ColumnType\n width?: number\n /** 고칠 수 없는 칸. 자동으로 붙는 값이 여기 온다. */\n readonly?: boolean\n}\n\nexport interface MasterAxisView {\n key: string\n /** GraphQL 조회 이름 — 서버가 낸 그대로. */\n query: string\n /** GraphQL 저장 이름. */\n mutation: string\n /** 제목 문구 키. `title.<이것>`. */\n title: string\n columns: AxisColumn[]\n}\n\n/** 열두 축이 공통으로 갖는 끝 칸들 — ISA-95 유효 기간. */\nconst EFFECTIVE: AxisColumn[] = [\n { name: 'effectiveStart', label: 'effective-start', type: 'date', width: 150 },\n { name: 'effectiveEnd', label: 'effective-end', type: 'date', width: 150 }\n]\n\n/** 이름과 설명은 열두 축이 모두 갖는다. */\nconst IDENTITY: AxisColumn[] = [\n { name: 'name', label: 'name', type: 'string', width: 160 },\n { name: 'description', label: 'description', type: 'string', width: 200 }\n]\n\nexport const MASTER_AXIS_VIEWS: readonly MasterAxisView[] = [\n {\n key: 'personnelClass',\n query: 'personnelClasses',\n mutation: 'updateMultiplePersonnelClass',\n title: 'personnel-class',\n columns: [\n ...IDENTITY,\n { name: 'baseIds', label: 'base-classes', type: 'list', width: 180 },\n /* 이 등급이 요구하는 검사. 자격 인터록이 이 칸을 읽는다 — 비어 있으면 아무 검사도 요구하지 않는다. */\n { name: 'testSpecificationIds', label: 'required-tests', type: 'list', width: 200 },\n ...EFFECTIVE\n ]\n },\n {\n key: 'person',\n query: 'persons',\n mutation: 'updateMultiplePerson',\n title: 'person',\n columns: [\n ...IDENTITY,\n { name: 'personnelClassIds', label: 'personnel-classes', type: 'list', width: 200 },\n { name: 'homeLocation', label: 'home-location', type: 'string', width: 140 },\n { name: 'workCalendar', label: 'work-calendar', type: 'json', width: 200 },\n { name: 'testResults', label: 'test-results', type: 'json', width: 200 },\n ...EFFECTIVE\n ]\n },\n {\n key: 'equipmentClass',\n query: 'equipmentClasses',\n mutation: 'updateMultipleEquipmentClass',\n title: 'equipment-class',\n columns: [...IDENTITY, { name: 'baseIds', label: 'base-classes', type: 'list', width: 180 }, ...EFFECTIVE]\n },\n {\n key: 'equipment',\n query: 'equipmentList',\n mutation: 'updateMultipleEquipment',\n title: 'equipment',\n columns: [\n ...IDENTITY,\n /*\n * 설비의 등급은 **하나**이고 이름이 `kind` 다(표준 EquipmentClassID · 계약의 kind 자리).\n * 전에는 `equipmentClassIds` 라는 배열 칸을 물었는데 그런 칸이 없다. GraphQL 은 칸 하나가\n * 틀리면 질의를 통째로 오류로 내므로, 설비 마스터 화면이 전부 400 이었다.\n */\n { name: 'kind', label: 'equipment-class', type: 'string', width: 200 },\n { name: 'identity', label: 'identity', type: 'string', width: 200 },\n { name: 'homeLocation', label: 'home-location', type: 'string', width: 140 },\n /* 계획 조업 시간의 바탕. 비어 있으면 OEE 의 가동률이 「모름」이 된다. */\n { name: 'workCalendar', label: 'work-calendar', type: 'json', width: 200 },\n ...EFFECTIVE\n ]\n },\n {\n key: 'stopReason',\n query: 'stopReasonList',\n mutation: 'updateMultipleStopReason',\n title: 'stop-reason',\n columns: [\n ...IDENTITY,\n /* 어느 상태의 사유인가. 이 칸이 가동률을 깎느냐 마느냐를 가른다. */\n { name: 'status', label: 'state', type: 'string', width: 130 },\n { name: 'parentName', label: 'parent-reason', type: 'string', width: 150 },\n { name: 'detailRequired', label: 'detail-required', type: 'boolean', width: 110 },\n ...EFFECTIVE\n ]\n },\n {\n key: 'physicalAssetClass',\n query: 'physicalAssetClasses',\n mutation: 'updateMultiplePhysicalAssetClass',\n title: 'asset-class',\n columns: [\n ...IDENTITY,\n { name: 'baseIds', label: 'base-classes', type: 'list', width: 180 },\n { name: 'testSpecificationIds', label: 'required-tests', type: 'list', width: 200 },\n ...EFFECTIVE\n ]\n },\n {\n key: 'physicalAsset',\n query: 'physicalAssets',\n mutation: 'updateMultiplePhysicalAsset',\n title: 'asset',\n columns: [\n ...IDENTITY,\n { name: 'assetClassIds', label: 'asset-classes', type: 'list', width: 180 },\n { name: 'identity', label: 'grai', type: 'string', width: 200 },\n /* 정격 사용 횟수. 비어 있으면 횟수로 막지 않는다. */\n { name: 'cycleLimit', label: 'cycle-limit', type: 'number', width: 110 },\n { name: 'testResults', label: 'calibrations', type: 'json', width: 200 },\n ...EFFECTIVE\n ]\n },\n {\n key: 'materialClass',\n query: 'materialClasses',\n mutation: 'updateMultipleMaterialClass',\n title: 'material-class',\n columns: [...IDENTITY, { name: 'baseIds', label: 'base-classes', type: 'list', width: 180 }, ...EFFECTIVE]\n },\n {\n key: 'materialDefinition',\n query: 'materialDefinitions',\n mutation: 'updateMultipleMaterialDefinition',\n title: 'material',\n columns: [\n ...IDENTITY,\n { name: 'materialClassIds', label: 'material-classes', type: 'list', width: 180 },\n /*\n * GTIN · 단위 · 보관처는 **API 가 내주지 않는다.** 전에는 `identity`·`uom`·`locationType` 을\n * 물었는데 `MaterialDefinition` 에 그런 칸이 없다. GraphQL 은 칸 하나가 틀리면 질의를 통째로\n * 오류로 내므로, 자재 마스터 화면이 전부 400 이었다.\n *\n * 그 값들이 어디에 사는지 모르는 채로 다른 칸을 대신 물지 않는다. 지금은 `properties` 로\n * 있는 그대로 보이고, 제 칸이 생기면 그때 나눈다.\n */\n { name: 'properties', label: 'properties', type: 'json', width: 240 },\n ...EFFECTIVE\n ]\n },\n {\n key: 'operationalLocation',\n query: 'operationalLocations',\n mutation: 'updateMultipleOperationalLocation',\n title: 'location',\n columns: [\n ...IDENTITY,\n /* 스키마의 이름은 `level`·`parentId` 다. 전에는 `equipmentLevel`·`parentName` 을 물어 화면이 400 이었다. */\n { name: 'level', label: 'equipment-level', type: 'string', width: 140 },\n { name: 'parentId', label: 'parent-location', type: 'string', width: 150 },\n { name: 'type', label: 'location-type', type: 'string', width: 140 },\n { name: 'capacity', label: 'capacity', type: 'number', width: 90 },\n ...EFFECTIVE\n ]\n },\n {\n key: 'operationDefinition',\n query: 'operationDefinitions',\n mutation: 'updateMultipleOperationDefinition',\n title: 'operation',\n columns: [\n ...IDENTITY,\n { name: 'intent', label: 'intent', type: 'string', width: 110 },\n { name: 'locationType', label: 'location-type', type: 'string', width: 140 },\n { name: 'resourceType', label: 'resource-type', type: 'string', width: 140 },\n /* 품목당 표준 시간. 없으면 OEE 의 성능률이 「모름」이 된다. ISO 8601 기간 표기다. */\n { name: 'duration', label: 'duration', type: 'string', width: 110 },\n /* 요구 인원. 자격 인터록이 이 칸을 읽는다. */\n { name: 'personnelSpecification', label: 'personnel-spec', type: 'json', width: 200 },\n { name: 'bizStep', label: 'biz-step', type: 'string', width: 200 },\n ...EFFECTIVE\n ]\n },\n {\n key: 'testSpecification',\n query: 'testSpecifications',\n mutation: 'updateMultipleTestSpecification',\n title: 'test-specification',\n columns: [...IDENTITY, ...EFFECTIVE]\n }\n]\n\nexport function masterAxisViewOf(key: string): MasterAxisView | undefined {\n return MASTER_AXIS_VIEWS.find(axis => axis.key === key)\n}\n"]}
1
+ {"version":3,"file":"master-axes.js","sourceRoot":"","sources":["../../client/pages/master-axes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,gBAAgB;IAChB,QAAQ;IACR,gBAAgB;IAChB,WAAW;IACX,YAAY;IACZ,oBAAoB;IACpB,eAAe;IACf,eAAe;IACf,oBAAoB;IACpB,qBAAqB;IACrB,qBAAqB;IACrB,mBAAmB;CACX,CAAA;AAIV,4CAA4C;AAC5C,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAQ,gBAAsC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC9D,CAAC","sourcesContent":["/**\n * 마스터 축의 **이름 목록** — 옛 주소를 새 주소로 보내는 데만 쓴다.\n *\n * ── 왜 이만큼만 남았나 ─────────────────────────────────────────────────────\n * 이 파일에는 열두 축의 컬럼 선언이 250줄 들어 있었다. 화면이 하나였을 때의 것이다. 화면이 축마다\n * 갈린 뒤로는 **각 화면 파일이 자기 컬럼을 갖고**, 여기 있던 선언은 아무도 읽지 않게 되었다.\n * 읽히는 것은 `key` 하나뿐이다(`route.ts` 가 옛 주소를 새 주소로 보낼 때).\n *\n * 안 읽히는데 그럴듯하게 서 있는 선언은 위험하다. 실제로 그랬다 — 자재 화면에 컬럼을 더하러 와서\n * 이 파일을 먼저 고쳤고, 화면은 하나도 안 변했다. 그 사이 이 파일의 선언은 진짜 화면과 어긋나 있었다\n * (자재의 유형·계보·제조법 칸이 없고, 주석에 「이 칸은 API 가 안 준다」고 적힌 낡은 사연이 남아 있었다).\n *\n * **컬럼을 고치려면 그 축의 화면 파일을 고친다** — `pages/master/<축>.ts`.\n */\n\n/**\n * 축의 이름들.\n *\n * 순서는 뜻이 없다. 새 축이 생기면 여기에 더하고 `pages/master/` 에 화면을 만든다. 여기에만 더하면\n * 옛 주소가 없는 화면으로 간다.\n */\nexport const MASTER_AXIS_KEYS = [\n 'personnelClass',\n 'person',\n 'equipmentClass',\n 'equipment',\n 'stopReason',\n 'physicalAssetClass',\n 'physicalAsset',\n 'materialClass',\n 'materialDefinition',\n 'operationalLocation',\n 'operationDefinition',\n 'testSpecification'\n] as const\n\nexport type MasterAxisKey = (typeof MASTER_AXIS_KEYS)[number]\n\n/** 아는 축인가. 모르는 이름이면 옛 주소를 새 주소로 보내지 않는다. */\nexport function isMasterAxisKey(key: string): key is MasterAxisKey {\n return (MASTER_AXIS_KEYS as readonly string[]).includes(key)\n}\n"]}
@@ -1 +1 @@
1
- export default function route(page: string): "ops-master-list" | undefined;
1
+ export default function route(page: string): string | undefined;
@@ -1,8 +1,81 @@
1
+ import { isMasterAxisKey } from './pages/master-axes.js';
2
+ /*
3
+ * 마스터 화면은 축마다 하나다 — 이유는 `pages/master/master-page-base.ts` 에 적었다.
4
+ *
5
+ * 손으로 열두 벌 적는다. 축 목록에서 만들면 요소가 자기 코드를 가질 수 없고, 그러면 축이 자기
6
+ * 인터페이스를 요구할 때 공용 화면에 분기를 넣게 된다 — 갈라 놓은 이유와 어긋난다.
7
+ */
1
8
  export default function route(page) {
2
9
  switch (page) {
3
- case 'ops-master-list':
4
- import('./pages/master-list');
5
- return 'ops-master-list';
10
+ case 'ops-master-personnel-class':
11
+ import('./pages/master/personnel-class');
12
+ return 'ops-master-personnel-class';
13
+ case 'ops-master-person':
14
+ import('./pages/master/person');
15
+ return 'ops-master-person';
16
+ case 'ops-master-equipment-class':
17
+ import('./pages/master/equipment-class');
18
+ return 'ops-master-equipment-class';
19
+ case 'ops-master-equipment':
20
+ import('./pages/master/equipment');
21
+ return 'ops-master-equipment';
22
+ case 'ops-master-stop-reason':
23
+ import('./pages/master/stop-reason');
24
+ return 'ops-master-stop-reason';
25
+ case 'ops-master-physical-asset-class':
26
+ import('./pages/master/physical-asset-class');
27
+ return 'ops-master-physical-asset-class';
28
+ case 'ops-master-physical-asset':
29
+ import('./pages/master/physical-asset');
30
+ return 'ops-master-physical-asset';
31
+ case 'ops-master-material-class':
32
+ import('./pages/master/material-class');
33
+ return 'ops-master-material-class';
34
+ case 'ops-master-material-definition':
35
+ import('./pages/master/material-definition');
36
+ return 'ops-master-material-definition';
37
+ case 'ops-master-operational-location':
38
+ import('./pages/master/operational-location');
39
+ return 'ops-master-operational-location';
40
+ case 'ops-master-operation-definition':
41
+ import('./pages/master/operation-definition');
42
+ return 'ops-master-operation-definition';
43
+ case 'ops-master-test-specification':
44
+ import('./pages/master/test-specification');
45
+ return 'ops-master-test-specification';
46
+ case 'ops-master-route-definition':
47
+ import('./pages/master/route-definition');
48
+ return 'ops-master-route-definition';
49
+ case 'ops-master-recipe-definition':
50
+ import('./pages/master/recipe-definition');
51
+ return 'ops-master-recipe-definition';
52
+ /*
53
+ * 옛 주소 — `ops-master-list?axis=person`.
54
+ *
55
+ * 이 화면을 축마다 갈랐지만 **옛 주소가 남아 있다.** 북마크 · helps 문서 · MDI 에 열려 있던 탭이
56
+ * 그것을 가리킨다. 지우면 그 사람들에게 「페이지를 찾을 수 없습니다」가 나온다.
57
+ *
58
+ * ── 넘김은 라우팅 단계에서 한다 ─────────────────────────────────────────
59
+ * 처음에는 넘기는 화면을 하나 만들어 그 안에서 navigate 했다. 그러면 **그 화면이 MDI 탭을 하나
60
+ * 만들고 그 자리에 남는다** — 사용자는 이름 없는 빈 탭을 얻는다. navigate 는 주소만 바꾸고 이미
61
+ * 만들어진 탭을 지우지 않는다.
62
+ *
63
+ * 셸은 route() 가 `/` 로 시작하는 값을 돌려주면 페이지를 만들지 않고 그 주소로 넘긴다
64
+ * (`@operato/shell` 의 loadPage). 그래서 탭이 생기지 않는다.
65
+ *
66
+ * 축을 못 알아보면 넘기지 않는다 — 첫 축으로 대신 보내면 사용자는 자기가 다른 곳에 온 것을 모른다.
67
+ *
68
+ * 임시 호환이므로 **릴리즈 점검에서 비운다.**
69
+ */
70
+ case 'ops-master-list': {
71
+ const key = new URLSearchParams(location.search).get('axis');
72
+ if (!key || !isMasterAxisKey(key)) {
73
+ return;
74
+ }
75
+ const { pathname } = location;
76
+ const base = pathname.slice(0, pathname.lastIndexOf('/'));
77
+ return `${base}/ops-master-${key.replace(/[A-Z]/g, c => '-' + c.toLowerCase())}`;
78
+ }
6
79
  }
7
80
  }
8
81
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAY;IACxC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,iBAAiB;YACpB,MAAM,CAAC,qBAAqB,CAAC,CAAA;YAC7B,OAAO,iBAAiB,CAAA;IAC5B,CAAC;AACH,CAAC","sourcesContent":["export default function route(page: string) {\n switch (page) {\n case 'ops-master-list':\n import('./pages/master-list')\n return 'ops-master-list'\n }\n}\n"]}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAY;IACxC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,4BAA4B;YAC/B,MAAM,CAAC,gCAAgC,CAAC,CAAA;YACxC,OAAO,4BAA4B,CAAA;QACrC,KAAK,mBAAmB;YACtB,MAAM,CAAC,uBAAuB,CAAC,CAAA;YAC/B,OAAO,mBAAmB,CAAA;QAC5B,KAAK,4BAA4B;YAC/B,MAAM,CAAC,gCAAgC,CAAC,CAAA;YACxC,OAAO,4BAA4B,CAAA;QACrC,KAAK,sBAAsB;YACzB,MAAM,CAAC,0BAA0B,CAAC,CAAA;YAClC,OAAO,sBAAsB,CAAA;QAC/B,KAAK,wBAAwB;YAC3B,MAAM,CAAC,4BAA4B,CAAC,CAAA;YACpC,OAAO,wBAAwB,CAAA;QACjC,KAAK,iCAAiC;YACpC,MAAM,CAAC,qCAAqC,CAAC,CAAA;YAC7C,OAAO,iCAAiC,CAAA;QAC1C,KAAK,2BAA2B;YAC9B,MAAM,CAAC,+BAA+B,CAAC,CAAA;YACvC,OAAO,2BAA2B,CAAA;QACpC,KAAK,2BAA2B;YAC9B,MAAM,CAAC,+BAA+B,CAAC,CAAA;YACvC,OAAO,2BAA2B,CAAA;QACpC,KAAK,gCAAgC;YACnC,MAAM,CAAC,oCAAoC,CAAC,CAAA;YAC5C,OAAO,gCAAgC,CAAA;QACzC,KAAK,iCAAiC;YACpC,MAAM,CAAC,qCAAqC,CAAC,CAAA;YAC7C,OAAO,iCAAiC,CAAA;QAC1C,KAAK,iCAAiC;YACpC,MAAM,CAAC,qCAAqC,CAAC,CAAA;YAC7C,OAAO,iCAAiC,CAAA;QAC1C,KAAK,+BAA+B;YAClC,MAAM,CAAC,mCAAmC,CAAC,CAAA;YAC3C,OAAO,+BAA+B,CAAA;QACxC,KAAK,6BAA6B;YAChC,MAAM,CAAC,iCAAiC,CAAC,CAAA;YACzC,OAAO,6BAA6B,CAAA;QACtC,KAAK,8BAA8B;YACjC,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,8BAA8B,CAAA;QAEvC;;;;;;;;;;;;;;;;;WAiBG;QACH,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAE5D,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,OAAM;YACR,CAAC;YAED,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAA;YAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;YAEzD,OAAO,GAAG,IAAI,eAAe,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAA;QAClF,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { isMasterAxisKey } from './pages/master-axes.js'\n\n/*\n * 마스터 화면은 축마다 하나다 — 이유는 `pages/master/master-page-base.ts` 에 적었다.\n *\n * 손으로 열두 벌 적는다. 축 목록에서 만들면 요소가 자기 코드를 가질 수 없고, 그러면 축이 자기\n * 인터페이스를 요구할 때 공용 화면에 분기를 넣게 된다 — 갈라 놓은 이유와 어긋난다.\n */\nexport default function route(page: string) {\n switch (page) {\n case 'ops-master-personnel-class':\n import('./pages/master/personnel-class')\n return 'ops-master-personnel-class'\n case 'ops-master-person':\n import('./pages/master/person')\n return 'ops-master-person'\n case 'ops-master-equipment-class':\n import('./pages/master/equipment-class')\n return 'ops-master-equipment-class'\n case 'ops-master-equipment':\n import('./pages/master/equipment')\n return 'ops-master-equipment'\n case 'ops-master-stop-reason':\n import('./pages/master/stop-reason')\n return 'ops-master-stop-reason'\n case 'ops-master-physical-asset-class':\n import('./pages/master/physical-asset-class')\n return 'ops-master-physical-asset-class'\n case 'ops-master-physical-asset':\n import('./pages/master/physical-asset')\n return 'ops-master-physical-asset'\n case 'ops-master-material-class':\n import('./pages/master/material-class')\n return 'ops-master-material-class'\n case 'ops-master-material-definition':\n import('./pages/master/material-definition')\n return 'ops-master-material-definition'\n case 'ops-master-operational-location':\n import('./pages/master/operational-location')\n return 'ops-master-operational-location'\n case 'ops-master-operation-definition':\n import('./pages/master/operation-definition')\n return 'ops-master-operation-definition'\n case 'ops-master-test-specification':\n import('./pages/master/test-specification')\n return 'ops-master-test-specification'\n case 'ops-master-route-definition':\n import('./pages/master/route-definition')\n return 'ops-master-route-definition'\n case 'ops-master-recipe-definition':\n import('./pages/master/recipe-definition')\n return 'ops-master-recipe-definition'\n\n /*\n * 옛 주소 — `ops-master-list?axis=person`.\n *\n * 이 화면을 축마다 갈랐지만 **옛 주소가 남아 있다.** 북마크 · helps 문서 · MDI 에 열려 있던 탭이\n * 그것을 가리킨다. 지우면 그 사람들에게 「페이지를 찾을 수 없습니다」가 나온다.\n *\n * ── 넘김은 라우팅 단계에서 한다 ─────────────────────────────────────────\n * 처음에는 넘기는 화면을 하나 만들어 그 안에서 navigate 했다. 그러면 **그 화면이 MDI 탭을 하나\n * 만들고 그 자리에 남는다** — 사용자는 이름 없는 빈 탭을 얻는다. navigate 는 주소만 바꾸고 이미\n * 만들어진 탭을 지우지 않는다.\n *\n * 셸은 route() 가 `/` 로 시작하는 값을 돌려주면 페이지를 만들지 않고 그 주소로 넘긴다\n * (`@operato/shell` 의 loadPage). 그래서 탭이 생기지 않는다.\n *\n * 축을 못 알아보면 넘기지 않는다 — 첫 축으로 대신 보내면 사용자는 자기가 다른 곳에 온 것을 모른다.\n *\n * 임시 호환이므로 **릴리즈 점검에서 비운다.**\n */\n case 'ops-master-list': {\n const key = new URLSearchParams(location.search).get('axis')\n\n if (!key || !isMasterAxisKey(key)) {\n return\n }\n\n const { pathname } = location\n const base = pathname.slice(0, pathname.lastIndexOf('/'))\n\n return `${base}/ops-master-${key.replace(/[A-Z]/g, c => '-' + c.toLowerCase())}`\n }\n }\n}\n"]}