@things-factory/ops-master 10.1.248 → 10.1.249

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 (429) hide show
  1. package/dist-client/bootstrap.d.ts +19 -0
  2. package/dist-client/bootstrap.js +66 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/index.d.ts +17 -0
  5. package/dist-client/index.js +21 -0
  6. package/dist-client/index.js.map +1 -0
  7. package/dist-client/master-change-approval.d.ts +14 -0
  8. package/dist-client/master-change-approval.js +36 -0
  9. package/dist-client/master-change-approval.js.map +1 -0
  10. package/dist-client/master-change-policy-axes.d.ts +37 -0
  11. package/dist-client/master-change-policy-axes.js +29 -0
  12. package/dist-client/master-change-policy-axes.js.map +1 -0
  13. package/dist-client/master-change-policy-panel.d.ts +59 -0
  14. package/dist-client/master-change-policy-panel.js +454 -0
  15. package/dist-client/master-change-policy-panel.js.map +1 -0
  16. package/dist-client/master-change-providers.d.ts +4 -0
  17. package/dist-client/master-change-providers.js +91 -0
  18. package/dist-client/master-change-providers.js.map +1 -0
  19. package/dist-client/pages/master/applied-when-dialog.d.ts +48 -0
  20. package/dist-client/pages/master/applied-when-dialog.js +137 -0
  21. package/dist-client/pages/master/applied-when-dialog.js.map +1 -0
  22. package/dist-client/pages/master/assignment-fields.d.ts +27 -0
  23. package/dist-client/pages/master/assignment-fields.js +62 -0
  24. package/dist-client/pages/master/assignment-fields.js.map +1 -0
  25. package/dist-client/pages/master/equipment-class.d.ts +12 -0
  26. package/dist-client/pages/master/equipment-class.js +42 -0
  27. package/dist-client/pages/master/equipment-class.js.map +1 -0
  28. package/dist-client/pages/master/equipment.d.ts +12 -0
  29. package/dist-client/pages/master/equipment.js +58 -0
  30. package/dist-client/pages/master/equipment.js.map +1 -0
  31. package/dist-client/pages/master/grist-iso-duration.d.ts +20 -0
  32. package/dist-client/pages/master/grist-iso-duration.js +70 -0
  33. package/dist-client/pages/master/grist-iso-duration.js.map +1 -0
  34. package/dist-client/pages/master/grist-reference.d.ts +91 -0
  35. package/dist-client/pages/master/grist-reference.js +419 -0
  36. package/dist-client/pages/master/grist-reference.js.map +1 -0
  37. package/dist-client/pages/master/import-rows.d.ts +35 -0
  38. package/dist-client/pages/master/import-rows.js +66 -0
  39. package/dist-client/pages/master/import-rows.js.map +1 -0
  40. package/dist-client/pages/master/iso-duration.d.ts +34 -0
  41. package/dist-client/pages/master/iso-duration.js +76 -0
  42. package/dist-client/pages/master/iso-duration.js.map +1 -0
  43. package/dist-client/pages/master/master-options.d.ts +40 -0
  44. package/dist-client/pages/master/master-options.js +54 -0
  45. package/dist-client/pages/master/master-options.js.map +1 -0
  46. package/dist-client/pages/master/master-page-base.d.ts +369 -0
  47. package/dist-client/pages/master/master-page-base.js +657 -0
  48. package/dist-client/pages/master/master-page-base.js.map +1 -0
  49. package/dist-client/pages/master/material-class.d.ts +12 -0
  50. package/dist-client/pages/master/material-class.js +42 -0
  51. package/dist-client/pages/master/material-class.js.map +1 -0
  52. package/dist-client/pages/master/material-definition.d.ts +5 -0
  53. package/dist-client/pages/master/material-definition.js +14 -0
  54. package/dist-client/pages/master/material-definition.js.map +1 -0
  55. package/dist-client/pages/master/material-revision-fields.d.ts +2 -0
  56. package/dist-client/pages/master/material-revision-fields.js +43 -0
  57. package/dist-client/pages/master/material-revision-fields.js.map +1 -0
  58. package/dist-client/pages/master/operation-definition.d.ts +12 -0
  59. package/dist-client/pages/master/operation-definition.js +49 -0
  60. package/dist-client/pages/master/operation-definition.js.map +1 -0
  61. package/dist-client/pages/master/operational-location.d.ts +84 -0
  62. package/dist-client/pages/master/operational-location.js +432 -0
  63. package/dist-client/pages/master/operational-location.js.map +1 -0
  64. package/dist-client/pages/master/person.d.ts +12 -0
  65. package/dist-client/pages/master/person.js +41 -0
  66. package/dist-client/pages/master/person.js.map +1 -0
  67. package/dist-client/pages/master/personnel-class.d.ts +12 -0
  68. package/dist-client/pages/master/personnel-class.js +43 -0
  69. package/dist-client/pages/master/personnel-class.js.map +1 -0
  70. package/dist-client/pages/master/physical-asset-class.d.ts +12 -0
  71. package/dist-client/pages/master/physical-asset-class.js +40 -0
  72. package/dist-client/pages/master/physical-asset-class.js.map +1 -0
  73. package/dist-client/pages/master/physical-asset.d.ts +12 -0
  74. package/dist-client/pages/master/physical-asset.js +41 -0
  75. package/dist-client/pages/master/physical-asset.js.map +1 -0
  76. package/dist-client/pages/master/recipe-definition.d.ts +5 -0
  77. package/dist-client/pages/master/recipe-definition.js +14 -0
  78. package/dist-client/pages/master/recipe-definition.js.map +1 -0
  79. package/dist-client/pages/master/reference-targets.d.ts +42 -0
  80. package/dist-client/pages/master/reference-targets.js +82 -0
  81. package/dist-client/pages/master/reference-targets.js.map +1 -0
  82. package/dist-client/pages/master/revision-comparison.d.ts +49 -0
  83. package/dist-client/pages/master/revision-comparison.js +560 -0
  84. package/dist-client/pages/master/revision-comparison.js.map +1 -0
  85. package/dist-client/pages/master/revision-view.d.ts +34 -0
  86. package/dist-client/pages/master/revision-view.js +145 -0
  87. package/dist-client/pages/master/revision-view.js.map +1 -0
  88. package/dist-client/pages/master/revision-workspace.d.ts +50 -0
  89. package/dist-client/pages/master/revision-workspace.js +763 -0
  90. package/dist-client/pages/master/revision-workspace.js.map +1 -0
  91. package/dist-client/pages/master/route-definition.d.ts +19 -0
  92. package/dist-client/pages/master/route-definition.js +40 -0
  93. package/dist-client/pages/master/route-definition.js.map +1 -0
  94. package/dist-client/pages/master/stop-reason.d.ts +12 -0
  95. package/dist-client/pages/master/stop-reason.js +48 -0
  96. package/dist-client/pages/master/stop-reason.js.map +1 -0
  97. package/dist-client/pages/master/test-specification.d.ts +5 -0
  98. package/dist-client/pages/master/test-specification.js +14 -0
  99. package/dist-client/pages/master/test-specification.js.map +1 -0
  100. package/dist-client/pages/master-axes.d.ts +24 -0
  101. package/dist-client/pages/master-axes.js +39 -0
  102. package/dist-client/pages/master-axes.js.map +1 -0
  103. package/dist-client/route.d.ts +1 -0
  104. package/dist-client/route.js +81 -0
  105. package/dist-client/route.js.map +1 -0
  106. package/dist-client/tsconfig.tsbuildinfo +1 -0
  107. package/dist-server/index.d.ts +1 -0
  108. package/dist-server/index.js +19 -0
  109. package/dist-server/index.js.map +1 -0
  110. package/dist-server/service/ai-entry/master-entry-rules.d.ts +175 -0
  111. package/dist-server/service/ai-entry/master-entry-rules.js +302 -0
  112. package/dist-server/service/ai-entry/master-entry-rules.js.map +1 -0
  113. package/dist-server/service/ai-entry/master-entry-targets.d.ts +23 -0
  114. package/dist-server/service/ai-entry/master-entry-targets.js +293 -0
  115. package/dist-server/service/ai-entry/master-entry-targets.js.map +1 -0
  116. package/dist-server/service/approval-route.d.ts +37 -0
  117. package/dist-server/service/approval-route.js +34 -0
  118. package/dist-server/service/approval-route.js.map +1 -0
  119. package/dist-server/service/asset/asset-lifecycle.d.ts +106 -0
  120. package/dist-server/service/asset/asset-lifecycle.js +126 -0
  121. package/dist-server/service/asset/asset-lifecycle.js.map +1 -0
  122. package/dist-server/service/asset/asset-master-resolver.d.ts +53 -0
  123. package/dist-server/service/asset/asset-master-resolver.js +185 -0
  124. package/dist-server/service/asset/asset-master-resolver.js.map +1 -0
  125. package/dist-server/service/asset/asset-master.d.ts +21 -0
  126. package/dist-server/service/asset/asset-master.js +25 -0
  127. package/dist-server/service/asset/asset-master.js.map +1 -0
  128. package/dist-server/service/asset/asset-query.d.ts +16 -0
  129. package/dist-server/service/asset/asset-query.js +72 -0
  130. package/dist-server/service/asset/asset-query.js.map +1 -0
  131. package/dist-server/service/asset/index.d.ts +6 -0
  132. package/dist-server/service/asset/index.js +10 -0
  133. package/dist-server/service/asset/index.js.map +1 -0
  134. package/dist-server/service/asset/physical-asset-class.d.ts +34 -0
  135. package/dist-server/service/asset/physical-asset-class.js +104 -0
  136. package/dist-server/service/asset/physical-asset-class.js.map +1 -0
  137. package/dist-server/service/asset/physical-asset.d.ts +66 -0
  138. package/dist-server/service/asset/physical-asset.js +123 -0
  139. package/dist-server/service/asset/physical-asset.js.map +1 -0
  140. package/dist-server/service/assignment/applied-when.d.ts +24 -0
  141. package/dist-server/service/assignment/applied-when.js +16 -0
  142. package/dist-server/service/assignment/applied-when.js.map +1 -0
  143. package/dist-server/service/assignment/assignment-history.d.ts +92 -0
  144. package/dist-server/service/assignment/assignment-history.js +289 -0
  145. package/dist-server/service/assignment/assignment-history.js.map +1 -0
  146. package/dist-server/service/assignment/assignment-write.d.ts +42 -0
  147. package/dist-server/service/assignment/assignment-write.js +101 -0
  148. package/dist-server/service/assignment/assignment-write.js.map +1 -0
  149. package/dist-server/service/assignment/master-value-claim.d.ts +135 -0
  150. package/dist-server/service/assignment/master-value-claim.js +174 -0
  151. package/dist-server/service/assignment/master-value-claim.js.map +1 -0
  152. package/dist-server/service/equipment/equipment-class.d.ts +34 -0
  153. package/dist-server/service/equipment/equipment-class.js +104 -0
  154. package/dist-server/service/equipment/equipment-class.js.map +1 -0
  155. package/dist-server/service/equipment/equipment-master-resolver.d.ts +77 -0
  156. package/dist-server/service/equipment/equipment-master-resolver.js +266 -0
  157. package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -0
  158. package/dist-server/service/equipment/equipment-master.d.ts +30 -0
  159. package/dist-server/service/equipment/equipment-master.js +53 -0
  160. package/dist-server/service/equipment/equipment-master.js.map +1 -0
  161. package/dist-server/service/equipment/equipment-query.d.ts +16 -0
  162. package/dist-server/service/equipment/equipment-query.js +72 -0
  163. package/dist-server/service/equipment/equipment-query.js.map +1 -0
  164. package/dist-server/service/equipment/equipment.d.ts +71 -0
  165. package/dist-server/service/equipment/equipment.js +138 -0
  166. package/dist-server/service/equipment/equipment.js.map +1 -0
  167. package/dist-server/service/equipment/index.d.ts +8 -0
  168. package/dist-server/service/equipment/index.js +12 -0
  169. package/dist-server/service/equipment/index.js.map +1 -0
  170. package/dist-server/service/equipment/state-period-rules.d.ts +95 -0
  171. package/dist-server/service/equipment/state-period-rules.js +122 -0
  172. package/dist-server/service/equipment/state-period-rules.js.map +1 -0
  173. package/dist-server/service/equipment/stop-reason-query.d.ts +11 -0
  174. package/dist-server/service/equipment/stop-reason-query.js +39 -0
  175. package/dist-server/service/equipment/stop-reason-query.js.map +1 -0
  176. package/dist-server/service/equipment/stop-reason.d.ts +58 -0
  177. package/dist-server/service/equipment/stop-reason.js +114 -0
  178. package/dist-server/service/equipment/stop-reason.js.map +1 -0
  179. package/dist-server/service/index.d.ts +82 -0
  180. package/dist-server/service/index.js +145 -0
  181. package/dist-server/service/index.js.map +1 -0
  182. package/dist-server/service/location/index.d.ts +5 -0
  183. package/dist-server/service/location/index.js +9 -0
  184. package/dist-server/service/location/index.js.map +1 -0
  185. package/dist-server/service/location/location-master-resolver.d.ts +60 -0
  186. package/dist-server/service/location/location-master-resolver.js +313 -0
  187. package/dist-server/service/location/location-master-resolver.js.map +1 -0
  188. package/dist-server/service/location/location-master.d.ts +26 -0
  189. package/dist-server/service/location/location-master.js +28 -0
  190. package/dist-server/service/location/location-master.js.map +1 -0
  191. package/dist-server/service/location/location-query.d.ts +15 -0
  192. package/dist-server/service/location/location-query.js +56 -0
  193. package/dist-server/service/location/location-query.js.map +1 -0
  194. package/dist-server/service/location/operational-location.d.ts +116 -0
  195. package/dist-server/service/location/operational-location.js +157 -0
  196. package/dist-server/service/location/operational-location.js.map +1 -0
  197. package/dist-server/service/master-axis.d.ts +40 -0
  198. package/dist-server/service/master-axis.js +57 -0
  199. package/dist-server/service/master-axis.js.map +1 -0
  200. package/dist-server/service/master-change-approval/approval-input.d.ts +17 -0
  201. package/dist-server/service/master-change-approval/approval-input.js +35 -0
  202. package/dist-server/service/master-change-approval/approval-input.js.map +1 -0
  203. package/dist-server/service/master-change-approval/builtin-axes.d.ts +4 -0
  204. package/dist-server/service/master-change-approval/builtin-axes.js +96 -0
  205. package/dist-server/service/master-change-approval/builtin-axes.js.map +1 -0
  206. package/dist-server/service/master-change-approval/index.d.ts +14 -0
  207. package/dist-server/service/master-change-approval/index.js +37 -0
  208. package/dist-server/service/master-change-approval/index.js.map +1 -0
  209. package/dist-server/service/master-change-approval/master-change-axis.d.ts +54 -0
  210. package/dist-server/service/master-change-approval/master-change-axis.js +17 -0
  211. package/dist-server/service/master-change-approval/master-change-axis.js.map +1 -0
  212. package/dist-server/service/master-change-approval/master-change-flow.d.ts +65 -0
  213. package/dist-server/service/master-change-approval/master-change-flow.js +125 -0
  214. package/dist-server/service/master-change-approval/master-change-flow.js.map +1 -0
  215. package/dist-server/service/master-change-approval/master-change-resolver.d.ts +18 -0
  216. package/dist-server/service/master-change-approval/master-change-resolver.js +58 -0
  217. package/dist-server/service/master-change-approval/master-change-resolver.js.map +1 -0
  218. package/dist-server/service/master-change-policy.d.ts +122 -0
  219. package/dist-server/service/master-change-policy.js +304 -0
  220. package/dist-server/service/master-change-policy.js.map +1 -0
  221. package/dist-server/service/master-conformance-resolver.d.ts +34 -0
  222. package/dist-server/service/master-conformance-resolver.js +153 -0
  223. package/dist-server/service/master-conformance-resolver.js.map +1 -0
  224. package/dist-server/service/master-conformance.d.ts +80 -0
  225. package/dist-server/service/master-conformance.js +266 -0
  226. package/dist-server/service/master-conformance.js.map +1 -0
  227. package/dist-server/service/master-crud.d.ts +55 -0
  228. package/dist-server/service/master-crud.js +93 -0
  229. package/dist-server/service/master-crud.js.map +1 -0
  230. package/dist-server/service/master-list.d.ts +12 -0
  231. package/dist-server/service/master-list.js +30 -0
  232. package/dist-server/service/master-list.js.map +1 -0
  233. package/dist-server/service/master-page-query.d.ts +33 -0
  234. package/dist-server/service/master-page-query.js +55 -0
  235. package/dist-server/service/master-page-query.js.map +1 -0
  236. package/dist-server/service/master-page.d.ts +85 -0
  237. package/dist-server/service/master-page.js +104 -0
  238. package/dist-server/service/master-page.js.map +1 -0
  239. package/dist-server/service/material/index.d.ts +7 -0
  240. package/dist-server/service/material/index.js +12 -0
  241. package/dist-server/service/material/index.js.map +1 -0
  242. package/dist-server/service/material/material-axis-status.d.ts +8 -0
  243. package/dist-server/service/material/material-axis-status.js +19 -0
  244. package/dist-server/service/material/material-axis-status.js.map +1 -0
  245. package/dist-server/service/material/material-class.d.ts +34 -0
  246. package/dist-server/service/material/material-class.js +104 -0
  247. package/dist-server/service/material/material-class.js.map +1 -0
  248. package/dist-server/service/material/material-definition.d.ts +45 -0
  249. package/dist-server/service/material/material-definition.js +125 -0
  250. package/dist-server/service/material/material-definition.js.map +1 -0
  251. package/dist-server/service/material/material-effective-list.d.ts +39 -0
  252. package/dist-server/service/material/material-effective-list.js +54 -0
  253. package/dist-server/service/material/material-effective-list.js.map +1 -0
  254. package/dist-server/service/material/material-master-resolver.d.ts +106 -0
  255. package/dist-server/service/material/material-master-resolver.js +351 -0
  256. package/dist-server/service/material/material-master-resolver.js.map +1 -0
  257. package/dist-server/service/material/material-master.d.ts +9 -0
  258. package/dist-server/service/material/material-master.js +24 -0
  259. package/dist-server/service/material/material-master.js.map +1 -0
  260. package/dist-server/service/material/material-query.d.ts +16 -0
  261. package/dist-server/service/material/material-query.js +79 -0
  262. package/dist-server/service/material/material-query.js.map +1 -0
  263. package/dist-server/service/material/material-revision-content.d.ts +10 -0
  264. package/dist-server/service/material/material-revision-content.js +92 -0
  265. package/dist-server/service/material/material-revision-content.js.map +1 -0
  266. package/dist-server/service/material/material-revision-resolver.d.ts +60 -0
  267. package/dist-server/service/material/material-revision-resolver.js +96 -0
  268. package/dist-server/service/material/material-revision-resolver.js.map +1 -0
  269. package/dist-server/service/material/material-revision-service.d.ts +179 -0
  270. package/dist-server/service/material/material-revision-service.js +687 -0
  271. package/dist-server/service/material/material-revision-service.js.map +1 -0
  272. package/dist-server/service/material/material-revision.d.ts +86 -0
  273. package/dist-server/service/material/material-revision.js +339 -0
  274. package/dist-server/service/material/material-revision.js.map +1 -0
  275. package/dist-server/service/material/recipe-index.d.ts +23 -0
  276. package/dist-server/service/material/recipe-index.js +44 -0
  277. package/dist-server/service/material/recipe-index.js.map +1 -0
  278. package/dist-server/service/operation/index.d.ts +6 -0
  279. package/dist-server/service/operation/index.js +10 -0
  280. package/dist-server/service/operation/index.js.map +1 -0
  281. package/dist-server/service/operation/operation-definition.d.ts +52 -0
  282. package/dist-server/service/operation/operation-definition.js +143 -0
  283. package/dist-server/service/operation/operation-definition.js.map +1 -0
  284. package/dist-server/service/operation/operation-master-resolver.d.ts +52 -0
  285. package/dist-server/service/operation/operation-master-resolver.js +187 -0
  286. package/dist-server/service/operation/operation-master-resolver.js.map +1 -0
  287. package/dist-server/service/operation/operation-master.d.ts +21 -0
  288. package/dist-server/service/operation/operation-master.js +28 -0
  289. package/dist-server/service/operation/operation-master.js.map +1 -0
  290. package/dist-server/service/operation/operation-query.d.ts +15 -0
  291. package/dist-server/service/operation/operation-query.js +56 -0
  292. package/dist-server/service/operation/operation-query.js.map +1 -0
  293. package/dist-server/service/operation/operation-readiness-resolver.d.ts +39 -0
  294. package/dist-server/service/operation/operation-readiness-resolver.js +111 -0
  295. package/dist-server/service/operation/operation-readiness-resolver.js.map +1 -0
  296. package/dist-server/service/operation/operation-readiness.d.ts +34 -0
  297. package/dist-server/service/operation/operation-readiness.js +133 -0
  298. package/dist-server/service/operation/operation-readiness.js.map +1 -0
  299. package/dist-server/service/personnel/index.d.ts +6 -0
  300. package/dist-server/service/personnel/index.js +10 -0
  301. package/dist-server/service/personnel/index.js.map +1 -0
  302. package/dist-server/service/personnel/person.d.ts +51 -0
  303. package/dist-server/service/personnel/person.js +119 -0
  304. package/dist-server/service/personnel/person.js.map +1 -0
  305. package/dist-server/service/personnel/personnel-class-readiness.d.ts +22 -0
  306. package/dist-server/service/personnel/personnel-class-readiness.js +98 -0
  307. package/dist-server/service/personnel/personnel-class-readiness.js.map +1 -0
  308. package/dist-server/service/personnel/personnel-class.d.ts +54 -0
  309. package/dist-server/service/personnel/personnel-class.js +114 -0
  310. package/dist-server/service/personnel/personnel-class.js.map +1 -0
  311. package/dist-server/service/personnel/personnel-master-resolver.d.ts +53 -0
  312. package/dist-server/service/personnel/personnel-master-resolver.js +187 -0
  313. package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -0
  314. package/dist-server/service/personnel/personnel-master.d.ts +39 -0
  315. package/dist-server/service/personnel/personnel-master.js +34 -0
  316. package/dist-server/service/personnel/personnel-master.js.map +1 -0
  317. package/dist-server/service/personnel/personnel-query.d.ts +29 -0
  318. package/dist-server/service/personnel/personnel-query.js +79 -0
  319. package/dist-server/service/personnel/personnel-query.js.map +1 -0
  320. package/dist-server/service/personnel/qualification.d.ts +104 -0
  321. package/dist-server/service/personnel/qualification.js +147 -0
  322. package/dist-server/service/personnel/qualification.js.map +1 -0
  323. package/dist-server/service/quality/index.d.ts +4 -0
  324. package/dist-server/service/quality/index.js +8 -0
  325. package/dist-server/service/quality/index.js.map +1 -0
  326. package/dist-server/service/quality/nonconformance-cause-resolver.d.ts +12 -0
  327. package/dist-server/service/quality/nonconformance-cause-resolver.js +60 -0
  328. package/dist-server/service/quality/nonconformance-cause-resolver.js.map +1 -0
  329. package/dist-server/service/quality/nonconformance-cause.d.ts +20 -0
  330. package/dist-server/service/quality/nonconformance-cause.js +90 -0
  331. package/dist-server/service/quality/nonconformance-cause.js.map +1 -0
  332. package/dist-server/service/recipe/index.d.ts +10 -0
  333. package/dist-server/service/recipe/index.js +16 -0
  334. package/dist-server/service/recipe/index.js.map +1 -0
  335. package/dist-server/service/recipe/recipe-definition.d.ts +75 -0
  336. package/dist-server/service/recipe/recipe-definition.js +143 -0
  337. package/dist-server/service/recipe/recipe-definition.js.map +1 -0
  338. package/dist-server/service/recipe/recipe-effective-list.d.ts +49 -0
  339. package/dist-server/service/recipe/recipe-effective-list.js +96 -0
  340. package/dist-server/service/recipe/recipe-effective-list.js.map +1 -0
  341. package/dist-server/service/recipe/recipe-master-resolver.d.ts +28 -0
  342. package/dist-server/service/recipe/recipe-master-resolver.js +128 -0
  343. package/dist-server/service/recipe/recipe-master-resolver.js.map +1 -0
  344. package/dist-server/service/recipe/recipe-master.d.ts +37 -0
  345. package/dist-server/service/recipe/recipe-master.js +47 -0
  346. package/dist-server/service/recipe/recipe-master.js.map +1 -0
  347. package/dist-server/service/recipe/recipe-query.d.ts +21 -0
  348. package/dist-server/service/recipe/recipe-query.js +82 -0
  349. package/dist-server/service/recipe/recipe-query.js.map +1 -0
  350. package/dist-server/service/recipe/recipe-revision-content.d.ts +32 -0
  351. package/dist-server/service/recipe/recipe-revision-content.js +70 -0
  352. package/dist-server/service/recipe/recipe-revision-content.js.map +1 -0
  353. package/dist-server/service/recipe/recipe-revision-line.d.ts +30 -0
  354. package/dist-server/service/recipe/recipe-revision-line.js +95 -0
  355. package/dist-server/service/recipe/recipe-revision-line.js.map +1 -0
  356. package/dist-server/service/recipe/recipe-revision-resolver.d.ts +65 -0
  357. package/dist-server/service/recipe/recipe-revision-resolver.js +96 -0
  358. package/dist-server/service/recipe/recipe-revision-resolver.js.map +1 -0
  359. package/dist-server/service/recipe/recipe-revision-service.d.ts +183 -0
  360. package/dist-server/service/recipe/recipe-revision-service.js +754 -0
  361. package/dist-server/service/recipe/recipe-revision-service.js.map +1 -0
  362. package/dist-server/service/recipe/recipe-revision.d.ts +102 -0
  363. package/dist-server/service/recipe/recipe-revision.js +373 -0
  364. package/dist-server/service/recipe/recipe-revision.js.map +1 -0
  365. package/dist-server/service/recipe/route-definition.d.ts +51 -0
  366. package/dist-server/service/recipe/route-definition.js +114 -0
  367. package/dist-server/service/recipe/route-definition.js.map +1 -0
  368. package/dist-server/service/resource/class-lineage.d.ts +46 -0
  369. package/dist-server/service/resource/class-lineage.js +80 -0
  370. package/dist-server/service/resource/class-lineage.js.map +1 -0
  371. package/dist-server/service/resource/class-members.d.ts +36 -0
  372. package/dist-server/service/resource/class-members.js +59 -0
  373. package/dist-server/service/resource/class-members.js.map +1 -0
  374. package/dist-server/service/resource/referrers.d.ts +54 -0
  375. package/dist-server/service/resource/referrers.js +99 -0
  376. package/dist-server/service/resource/referrers.js.map +1 -0
  377. package/dist-server/service/resource/resource-class.d.ts +25 -0
  378. package/dist-server/service/resource/resource-class.js +29 -0
  379. package/dist-server/service/resource/resource-class.js.map +1 -0
  380. package/dist-server/service/revision-baseline.d.ts +71 -0
  381. package/dist-server/service/revision-baseline.js +87 -0
  382. package/dist-server/service/revision-baseline.js.map +1 -0
  383. package/dist-server/service/row-lock.d.ts +22 -0
  384. package/dist-server/service/row-lock.js +31 -0
  385. package/dist-server/service/row-lock.js.map +1 -0
  386. package/dist-server/service/status/axis-stamp.d.ts +16 -0
  387. package/dist-server/service/status/axis-stamp.js +22 -0
  388. package/dist-server/service/status/axis-stamp.js.map +1 -0
  389. package/dist-server/service/status/index.d.ts +3 -0
  390. package/dist-server/service/status/index.js +7 -0
  391. package/dist-server/service/status/index.js.map +1 -0
  392. package/dist-server/service/status/master-status.d.ts +38 -0
  393. package/dist-server/service/status/master-status.js +129 -0
  394. package/dist-server/service/status/master-status.js.map +1 -0
  395. package/dist-server/service/test-spec/criteria-check.d.ts +53 -0
  396. package/dist-server/service/test-spec/criteria-check.js +142 -0
  397. package/dist-server/service/test-spec/criteria-check.js.map +1 -0
  398. package/dist-server/service/test-spec/criteria-rows.d.ts +89 -0
  399. package/dist-server/service/test-spec/criteria-rows.js +139 -0
  400. package/dist-server/service/test-spec/criteria-rows.js.map +1 -0
  401. package/dist-server/service/test-spec/index.d.ts +6 -0
  402. package/dist-server/service/test-spec/index.js +11 -0
  403. package/dist-server/service/test-spec/index.js.map +1 -0
  404. package/dist-server/service/test-spec/test-spec-effective-list.d.ts +34 -0
  405. package/dist-server/service/test-spec/test-spec-effective-list.js +42 -0
  406. package/dist-server/service/test-spec/test-spec-effective-list.js.map +1 -0
  407. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +44 -0
  408. package/dist-server/service/test-spec/test-spec-master-resolver.js +144 -0
  409. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -0
  410. package/dist-server/service/test-spec/test-spec-master.d.ts +6 -0
  411. package/dist-server/service/test-spec/test-spec-master.js +18 -0
  412. package/dist-server/service/test-spec/test-spec-master.js.map +1 -0
  413. package/dist-server/service/test-spec/test-spec-query.d.ts +15 -0
  414. package/dist-server/service/test-spec/test-spec-query.js +61 -0
  415. package/dist-server/service/test-spec/test-spec-query.js.map +1 -0
  416. package/dist-server/service/test-spec/test-spec-revision-resolver.d.ts +59 -0
  417. package/dist-server/service/test-spec/test-spec-revision-resolver.js +96 -0
  418. package/dist-server/service/test-spec/test-spec-revision-resolver.js.map +1 -0
  419. package/dist-server/service/test-spec/test-spec-revision-service.d.ts +178 -0
  420. package/dist-server/service/test-spec/test-spec-revision-service.js +685 -0
  421. package/dist-server/service/test-spec/test-spec-revision-service.js.map +1 -0
  422. package/dist-server/service/test-spec/test-spec-revision.d.ts +86 -0
  423. package/dist-server/service/test-spec/test-spec-revision.js +334 -0
  424. package/dist-server/service/test-spec/test-spec-revision.js.map +1 -0
  425. package/dist-server/service/test-spec/test-specification.d.ts +47 -0
  426. package/dist-server/service/test-spec/test-specification.js +119 -0
  427. package/dist-server/service/test-spec/test-specification.js.map +1 -0
  428. package/dist-server/tsconfig.tsbuildinfo +1 -0
  429. package/package.json +3 -3
@@ -0,0 +1,657 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@material/web/icon/icon.js';
3
+ import '@operato/data-grist/ox-grist.js';
4
+ import gql from 'graphql-tag';
5
+ import { css, html } from 'lit';
6
+ import { property, query, state } from 'lit/decorators.js';
7
+ import { DataGrist, getEditor } from '@operato/data-grist';
8
+ import { client } from '@operato/graphql';
9
+ import { i18next, localize } from '@operato/i18n';
10
+ import { notify, openPopup } from '@operato/layout';
11
+ import { p13n } from '@operato/p13n';
12
+ import { PageView } from '@operato/shell';
13
+ import { CommonGristStyles, CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles';
14
+ import { isMobileDevice } from '@operato/utils';
15
+ import { patchesFor, readImportRows } from './import-rows.js';
16
+ import { assignmentChangesIn } from './assignment-fields.js';
17
+ import './applied-when-dialog.js';
18
+ /** 열두 축이 공통으로 갖는 유효 기간 — ISA-95. */
19
+ export const EFFECTIVE = [
20
+ { name: 'effectiveStart', label: 'effective-start', type: 'date', width: 150 },
21
+ { name: 'effectiveEnd', label: 'effective-end', type: 'date', width: 150 }
22
+ ];
23
+ /** 이름과 설명은 열두 축이 모두 갖는다. 이름은 스크롤해도 남는다. */
24
+ export const IDENTITY = [
25
+ { name: 'name', label: 'name', type: 'string', width: 160, fixed: true },
26
+ { name: 'description', label: 'description', type: 'string', width: 200 }
27
+ ];
28
+ export class MasterPageBase extends p13n(localize(i18next)(PageView)) {
29
+ constructor() {
30
+ super(...arguments);
31
+ this.active = false;
32
+ this.mode = isMobileDevice() ? 'CARD' : 'GRID';
33
+ this.ready = false;
34
+ }
35
+ static { this.styles = [
36
+ /* The work surface frame for a list screen (ADR-0060 decision 8). */
37
+ WorkSurfacePageStyles,
38
+ CommonGristStyles,
39
+ CommonHeaderStyles,
40
+ ScrollbarStyles,
41
+ css `
42
+
43
+ ox-grist {
44
+ overflow-y: auto;
45
+ flex: 1;
46
+ }
47
+
48
+ /*
49
+ * 헤드룸에는 「어디를 보고 있나」만 남는다. 검색은 타이틀 줄로 올라갔다(configOf 의 search).
50
+ *
51
+ * 범위가 없는 화면은 이 칸이 비고, 아래 규칙이 그 줄을 아예 감춘다. 빈 띠를 남기지 않는다.
52
+ */
53
+ .header {
54
+ grid-template-areas: 'scope';
55
+ grid-template-columns: 1fr;
56
+ }
57
+
58
+ .header:empty {
59
+ display: none;
60
+ }
61
+ `
62
+ ]; }
63
+ get context() {
64
+ return {
65
+ title: i18next.t(`title.${this.spec.title}`),
66
+ /*
67
+ * **파일로 한 번에 올린다.**
68
+ *
69
+ * 새 공장을 받으면 기준정보를 통째로 넣어야 한다. 자리 · 인원 · 설비가 각각 수백에서 수천
70
+ * 줄이고, 화면에서 한 줄씩 넣으면 인원 1000명에 다섯 시간을 타이핑만 한다. 그런데 고객은
71
+ * 그 자료를 이미 엑셀로 갖고 있다.
72
+ *
73
+ * 틀은 플랫폼이 갖고 있다(`@things-factory/import-ui`). 도구막대에 버튼을 달고 파일을
74
+ * 읽어 줄의 배열로 준다. 우리는 그 줄을 이 화면의 열에 맞추고 저장하기만 한다.
75
+ *
76
+ * **이 자리에 두면 마스터 화면 전부가 한꺼번에 된다.** 화면마다 따로 만들면 열넷이 조금씩
77
+ * 다르게 동작한다.
78
+ */
79
+ importable: { handler: this.importHandler.bind(this) },
80
+ /* 제목 옆의 도움말 아이콘 — 상세한 설명은 그 문서가 갖는다. */
81
+ help: this.spec.help,
82
+ /*
83
+ * 검색은 **페이지 타이틀 줄의 오른쪽 끝**에 둔다.
84
+ *
85
+ * 타이틀은 페이지 안의 제목 줄에 선다(ADR-0060 결정 9, 모든 앱이 같다). 그래서 그
86
+ * 줄은 상단 앱 바가 아니라 페이지의 첫 줄이고, 거기 검색을 두면 거르는 곳과 걸러진 결과가 붙어
87
+ * 있다 — 전에 상단 바를 마다한 이유가 여기서는 생기지 않는다.
88
+ *
89
+ * `ox-page-title-bar` 가 이 값을 받아 타이틀 오른쪽에 그린다. 그래서 헤드룸에는 검색을 두지
90
+ * 않는다 — 두 벌이 되고, 두 벌은 어긋난다.
91
+ */
92
+ search: {
93
+ handler: (search) => {
94
+ this.grist.searchText = search;
95
+ },
96
+ value: this.grist?.searchText || ''
97
+ },
98
+ actions: [
99
+ {
100
+ title: i18next.t('button.save'),
101
+ action: this.save.bind(this),
102
+ icon: 'save',
103
+ /* 이 화면의 주 동작 — 채운 버튼으로 그려진다. 한 화면에 하나만 둔다. */
104
+ emphasis: { raised: true }
105
+ }
106
+ ],
107
+ exportable: {
108
+ name: i18next.t(`title.${this.spec.title}`),
109
+ data: () => this.grist.exportRecords()
110
+ }
111
+ };
112
+ }
113
+ /**
114
+ * 지금 무엇을 보고 있는가 — 표 바로 위.
115
+ *
116
+ * 계층을 드릴다운으로 걷는 화면은 「어디를 보고 있나」를 말해야 한다. 대부분의 화면은 표 하나가 전부라
117
+ * 범위가 없다 — 그런 화면은 아무것도 그리지 않고, 그 줄이 접힌다.
118
+ */
119
+ renderScope() {
120
+ return html ``;
121
+ }
122
+ /**
123
+ * 화면 골격 — 표 하나와 컬럼 설정.
124
+ *
125
+ * 자기 인터페이스가 필요한 화면은 이것을 덮어쓴다. 위치와 정지 사유는 계층이라 표가 아니라 나무여야
126
+ * 하고, 그때 이 render 를 쓰지 않는다.
127
+ */
128
+ render() {
129
+ return html `
130
+ <ox-grist
131
+ .mode=${this.mode}
132
+ .config=${this.gristConfig}
133
+ .fetchHandler=${this.fetchHandler.bind(this)}
134
+ .personalConfigProvider=${this.getPagePreferenceProvider(`ox-grist-${this.spec.key}`)}
135
+ >
136
+ <!--
137
+ 자리를 뜻으로 구분한다.
138
+
139
+ 어디를 보고 있나 빵가루 헤드룸 — 표 바로 위
140
+ 좁히는 것 검색 타이틀 줄 오른쪽 끝
141
+ 저지르는 것 저장 · 삭제 화면 바닥 — 셸이 모든 화면에 같은 자리로 둔다
142
+ 고른 것에 하는 것 선택 후 동작 고른 것 옆
143
+
144
+ 바닥인 이유는 목록을 위에서 아래로 훑고 줄을 고르고 저지르기 때문이다. 손과 눈이 아래에서
145
+ 끝난다. 전에 동작 바를 헤드룸에도 두었다가 「저장」이 위아래에 하나씩 생겼다(실측: top 150 과
146
+ top 720).
147
+ -->
148
+ <div slot="headroom" class="header">${this.renderScope()}</div>
149
+
150
+ <!-- 컬럼 설정 버튼. provider 만 넘겨도 버튼은 안 생긴다. 이 요소를 화면이 놓아야 한다. -->
151
+ <ox-grist-personalizer slot="setting"></ox-grist-personalizer>
152
+ </ox-grist>
153
+ `;
154
+ }
155
+ /**
156
+ * 주소 끝의 이름 조각을 **목록 좁히기**에 쓰나.
157
+ *
158
+ * 다른 화면의 참조 칸에서 걸어 들어오면 주소가 `.../ops-master-material-definition/M0161-0003` 이
159
+ * 된다. 그 조각을 아무도 안 읽으면 106줄짜리 목록 첫 장이 뜨고, 사람은 방금 누른 이름을 다시
160
+ * 찾아야 한다 — 걸어온 보람이 없다.
161
+ *
162
+ * 자리 화면과 제조법 화면은 그 조각을 **파고들기**에 이미 쓰고 있다(그 이름 아래를 보여 준다).
163
+ * 그 둘은 여기서 빠진다 — 두 뜻이 한 조각에 겹치면 어느 쪽도 제대로 안 된다.
164
+ */
165
+ get pathSegmentNarrowsList() {
166
+ return true;
167
+ }
168
+ async pageInitialized() {
169
+ this.gristConfig = this.configOf();
170
+ this.ready = true;
171
+ }
172
+ /**
173
+ * 셸은 `(changes, after, before)` 를 넘긴다 — 인수 없는 모양으로 좁히면 주소를 읽어야 하는 화면이
174
+ * 이것을 덮어쓸 수 없다(`after.resourceId` 와 `before.resourceId` 를 비교하는 자리다).
175
+ */
176
+ async pageUpdated(_changes, _after, _before) {
177
+ if (this.active) {
178
+ this.grist?.fetch();
179
+ }
180
+ }
181
+ /*
182
+ * 반환 타입을 밝힌다. 적지 않으면 이 자리의 리터럴이 그대로 타입이 되고, 컬럼 구성을 바꾸는 화면이
183
+ * 이것을 재정의할 수 없다(로케이션이 실제로 막혔다).
184
+ */
185
+ configOf() {
186
+ return {
187
+ /*
188
+ * 빈 목록이 하는 말 — **축마다 다르다.**
189
+ *
190
+ * 「아직 아무것도 없습니다」 하나로는 이 화면들이 할 말을 못 한다. 기준정보는 처음 오는
191
+ * 사람이 가장 먼저 만나는 자리이고, 비어 있는 사람이 묻는 것은 「이게 뭔데 채워야 하나」다.
192
+ * 그 답은 축마다 다르다 — 인원이 없으면 작업 스테이션에서 사람을 고를 수 없고, 근무 캘린더가
193
+ * 없으면 가동률이 「모름」이 된다.
194
+ *
195
+ * 항목 파일을 고치지 않는다. spec.key 로 용어를 끌어오므로 용어만 더하면 새 축도 따라온다.
196
+ */
197
+ emptyNote: {
198
+ title: i18next.t(`text.master-empty-${this.spec.key}`),
199
+ description: i18next.t(`text.master-empty-${this.spec.key}-hint`, { defaultValue: '' }) || undefined
200
+ },
201
+ list: { fields: ['name', 'description'], details: [] },
202
+ columns: [
203
+ /* 이름을 고정하면 그 왼쪽의 거터도 함께 남아야 한다 — 아니면 체크박스가 이름 아래로 밀린다. */
204
+ { type: 'gutter', gutterName: 'sequence', fixed: true },
205
+ { type: 'gutter', gutterName: 'row-selector', multiple: true, fixed: true },
206
+ ...this.spec.columns.map(column => this.columnOf(column))
207
+ ],
208
+ /* 새 행을 만들 수 있다 — 마스터를 채우는 것이 이 화면의 일이다. */
209
+ rows: { appendable: true, selectable: { multiple: true } },
210
+ sorters: [{ name: 'name', desc: false }]
211
+ };
212
+ }
213
+ columnOf(column) {
214
+ const header = i18next.t(`field.${column.label}`);
215
+ const editable = !column.readonly;
216
+ const fixed = column.fixed;
217
+ const hidden = column.hidden;
218
+ switch (column.type) {
219
+ case 'number':
220
+ return { type: 'float', name: column.name, header, record: { editable }, sortable: true, width: column.width, fixed, hidden };
221
+ case 'boolean':
222
+ return { type: 'boolean', name: column.name, header, record: { editable }, width: column.width, fixed, hidden };
223
+ case 'date':
224
+ return { type: 'datetime', name: column.name, header, record: { editable }, sortable: true, width: column.width, fixed, hidden };
225
+ /*
226
+ * 목록과 JSON 은 **글자로 고친다.** 전용 편집기를 만들면 축마다 다른 편집기가 생기고, 그 편집기가
227
+ * 모르는 칸이 들어오면 값이 오류 보고 없이 사라진다. 지금은 있는 그대로 보이고 그대로 고친다.
228
+ *
229
+ * 이것은 **자리표시자다.** 화면이 갈라진 지금은 그 축의 화면이 자기 편집기를 가질 수 있다.
230
+ */
231
+ case 'select':
232
+ /*
233
+ * **빈 줄이 없으면 되돌릴 수 없다.** 한 번 고르면 「아직 안 정했다」로 못 돌아간다. 비워 둘
234
+ * 수 없는 칸이면 화면 쪽에서 `options` 에 빈 값을 안 넣으면 된다.
235
+ */
236
+ return {
237
+ type: 'select',
238
+ name: column.name,
239
+ header,
240
+ record: { editable, options: column.options ?? [] },
241
+ filter: 'select',
242
+ sortable: true,
243
+ width: column.width,
244
+ fixed,
245
+ hidden
246
+ };
247
+ case 'reference':
248
+ /*
249
+ * 다른 표에서 골라 온다. 자유 텍스트로 두면 `GUNSAN` 을 `GUNSAM` 이라고 쳐도 저장되고,
250
+ * 그 뒤로 그 참조는 어디에서도 안 걸린다 — 화면에는 값이 있는데.
251
+ *
252
+ * 고르기는 팝업이 하고, 검색은 그 팝업이 갖는다. 그래서 열 자체에는 검색 필터를 안 붙인다.
253
+ */
254
+ return {
255
+ type: 'reference',
256
+ name: column.name,
257
+ header,
258
+ /*
259
+ * **제목을 여기서 채운다.** 팝업 머리에 글자가 없으면 회색 띠에 검색창만 뜨고, 무엇을
260
+ * 고르는 중인지 화면이 말하지 않는다. 편집기 자리에서는 못 채운다 — 그리드가 머리말을
261
+ * `{ renderer }` 객체로 바꿔서 넘기기 때문에 거기서는 글자를 볼 수 없다.
262
+ *
263
+ * 열의 머리말을 그대로 쓴다. 「주 근무 로케이션」을 고르는 팝업의 제목이 「주 근무
264
+ * 로케이션」이면 둘이 어긋날 수가 없다.
265
+ */
266
+ record: { editable, reference: { title: header, ...column.reference } },
267
+ filter: 'search',
268
+ sortable: true,
269
+ width: column.width,
270
+ fixed,
271
+ hidden
272
+ };
273
+ case 'iso-duration':
274
+ /*
275
+ * ISO 8601 기간(`PT30S`)이다. 글자로 고치면 `30s` 나 `PT30` 처럼 커널이 못 읽는 것이
276
+ * 오류 보고 없이 저장된다. 전용 편집기가 초로 받아 표기를 만든다.
277
+ *
278
+ * 이 편집기는 기본 등록에 없다 — `bootstrap.ts` 가 등록한다.
279
+ */
280
+ return { type: 'iso-duration', name: column.name, header, record: { editable }, width: column.width, fixed, hidden };
281
+ /*
282
+ * JSON 은 **구조를 아는 편집기로 고친다.** 글자로 고치면 괄호 하나가 빠져도 저장 순간까지
283
+ * 모르고, 저장되면 그 칸을 읽는 쪽이 통째로 못 읽는다. `json5` 는 팝업에서 문법을 보아 준다.
284
+ */
285
+ case 'json':
286
+ return { type: 'json5', name: column.name, header, record: { editable }, width: column.width, fixed, hidden };
287
+ /*
288
+ * 목록은 아직 **글자로 고친다.** 이 칸들은 대개 다른 표의 이름을 담는데(등급 · 공정 · 상위
289
+ * 등급), 그 표에서 골라 오는 편집기가 아직 없다. 자리표시자다.
290
+ */
291
+ /*
292
+ * ── 여럿을 고르는 참조 ──────────────────────────────────────────────────
293
+ *
294
+ * 상위 등급 · 요구 검사 · 공정의 차례처럼 **관계를 여럿 다는 칸**이다. 그리는 것은 목록과
295
+ * 같고(ops-list), 고치는 것은 참조 팝업이 여럿 고르기로 연다.
296
+ *
297
+ * 전에는 이런 칸이 전부 `list` 였다 — 즉 자유 텍스트였다. 그래서 GUNSAN 을 GUNSAM 이라고
298
+ * 쳐도 저장되고, 그 뒤로 그 참조는 어디에서도 안 걸린다. 열 곳이 그 상태였다
299
+ * (2026-09-05 · 사용자 지시로 전부 바꿈).
300
+ */
301
+ case 'reference-list':
302
+ return {
303
+ type: 'ops-list',
304
+ name: column.name,
305
+ header,
306
+ record: {
307
+ editable,
308
+ /*
309
+ * 편집기는 참조 팝업이 맡는다 — 그리기만 목록 렌더러를 쓴다.
310
+ *
311
+ * 열 빌더는 `column.type` 으로 편집기를 고르므로(column-builder), 여기서 함수를
312
+ * 직접 준다. 문자열을 주면 무시되고 글자 편집기가 붙는다.
313
+ */
314
+ editor: getEditor('reference'),
315
+ /*
316
+ * 팝업으로 연다고 밝힌다. 표식(edit_square)의 판단이 열 타입을 보는데, 이 열은
317
+ * 그리기를 목록 렌더러로 하려고 타입이 `ops-list` 다 — 그대로 두면 칸 안에서
318
+ * 고치는 것으로 표시된다.
319
+ */
320
+ opensPopup: true,
321
+ reference: { title: header, multiple: true, ...column.reference }
322
+ },
323
+ sortable: true,
324
+ width: column.width,
325
+ fixed,
326
+ hidden
327
+ };
328
+ case 'list':
329
+ /*
330
+ * 그리기만 우리 것을 쓰고 고치기는 글자 그대로다(`ops-list` 는 렌더러만 등록한다).
331
+ * 기본 글자 렌더러는 배열을 구분 없이 이어 붙인다.
332
+ */
333
+ return { type: 'ops-list', name: column.name, header, record: { editable }, width: column.width, fixed, hidden };
334
+ default:
335
+ return {
336
+ type: 'string',
337
+ name: column.name,
338
+ header,
339
+ record: { editable },
340
+ filter: 'search',
341
+ sortable: true,
342
+ width: column.width,
343
+ fixed,
344
+ hidden
345
+ };
346
+ }
347
+ }
348
+ async fetchHandler({ page = 1, limit = 50, sortings = [], filters = [] }) {
349
+ const fields = this.spec.columns.map(column => column.name).join('\n');
350
+ /*
351
+ * ── 주소 끝의 이름 조각으로 좁힌다 ──────────────────────────────────────
352
+ *
353
+ * 다른 화면의 참조 칸에서 걸어 들어오면 주소가 `.../ops-master-material-definition/M0161-0003`
354
+ * 이 된다. 그 조각을 아무도 안 읽으면 106줄짜리 목록 첫 장이 뜨고, 사람은 방금 누른 이름을 다시
355
+ * 찾아야 한다 — 걸어온 보람이 없다.
356
+ *
357
+ * **그리드의 검색어를 세우는 방식은 안 된다.** 그렇게 해 봤더니 값은 실제로 세워지는데(기억에
358
+ * 남았다) 그 뒤 그리드가 설정을 복원하면서 지웠다. 훅 자리를 앞뒤로 옮겨도 이기지 못하는
359
+ * 경합이다. 질의를 만드는 이 자리에서 조건을 얹으면 경합이 없다 — 언제 불려도 같은 답이다.
360
+ * [확인함] 2026-09-04
361
+ *
362
+ * 자리 화면과 제조법 화면은 그 조각을 **파고들기**에 이미 쓰므로 여기서 빠진다.
363
+ */
364
+ const segment = this.pathSegmentNarrowsList ? this.lifecycle?.resourceId : undefined;
365
+ if (segment) {
366
+ filters = [...filters, { name: 'name', operator: 'eq', value: decodeURIComponent(segment) }];
367
+ }
368
+ const response = await client.query({
369
+ query: gql `
370
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
371
+ ${this.spec.query}(filters: $filters, pagination: $pagination, sortings: $sortings) {
372
+ items {
373
+ id
374
+ ${fields}
375
+ }
376
+ total
377
+ }
378
+ }
379
+ `,
380
+ variables: { filters, pagination: { page, limit }, sortings },
381
+ fetchPolicy: 'no-cache'
382
+ });
383
+ const payload = response.data?.[this.spec.query];
384
+ const records = (payload?.items ?? []).map((item) => this.spreadJson(item));
385
+ return { total: payload?.total ?? 0, records };
386
+ }
387
+ /**
388
+ * JSON 칸을 **사람이 고칠 수 있는 글자로 편다.**
389
+ *
390
+ * 서버는 구조를 구조로 낸다(`ScalarObject` 로 선언하지만 **스키마에 나가는 이름은 `Object`** 다) — 그것이
391
+ * 사실이고, 곧 붙을 전용 편집기가 원하는 모양이다.
392
+ * 그런데 지금 이 그리드의 JSON 칸은 글자 편집기라 객체를 그대로 주면 `[object Object]` 가 된다.
393
+ * 그래서 **화면에 들어올 때만** 편다. 스키마를 화면 사정에 맞추지 않고, 화면이 자기 몫을 한다.
394
+ *
395
+ * 이 옮김은 `packJson` 과 짝이다. 한쪽만 고치면 저장이 오류보고없이 망가진다.
396
+ */
397
+ spreadJson(item) {
398
+ const jsonColumns = this.spec.columns.filter(column => column.type === 'json');
399
+ if (!jsonColumns.length) {
400
+ return item;
401
+ }
402
+ const spread = { ...item };
403
+ for (const column of jsonColumns) {
404
+ const value = spread[column.name];
405
+ /* 비어 있는 것은 비어 있는 채로 둔다 — `null` 을 `"null"` 로 만들면 지운 것이 값이 된다. */
406
+ if (value === undefined || value === null || typeof value === 'string') {
407
+ continue;
408
+ }
409
+ spread[column.name] = JSON.stringify(value, null, 0);
410
+ }
411
+ return spread;
412
+ }
413
+ /**
414
+ * 저장하기 전에 JSON 칸의 글자를 **구조로 되읽는다.**
415
+ *
416
+ * 읽지 못하면 **보내지 않는다.** 그냥 보내면 글자가 통째로 값이 되어, 사람이 적은 구조가 사라진 채로
417
+ * 저장이 성공했다고 나온다. 어느 행 어느 칸인지 말해 주어야 고칠 수 있다.
418
+ */
419
+ packJson(patches) {
420
+ const jsonColumns = this.spec.columns.filter(column => column.type === 'json');
421
+ if (!jsonColumns.length) {
422
+ return { patches, problems: [] };
423
+ }
424
+ const problems = [];
425
+ const packed = patches.map((patch, index) => {
426
+ const one = { ...patch };
427
+ for (const column of jsonColumns) {
428
+ const value = one[column.name];
429
+ if (typeof value !== 'string') {
430
+ /* 손대지 않은 칸은 이미 구조다. 비운 칸은 비운 채로 간다. */
431
+ continue;
432
+ }
433
+ if (value.trim() === '') {
434
+ /* 비운 것은 「없앤다」는 뜻이다. 빈 글자로 보내면 칸의 뜻이 흐려진다. */
435
+ one[column.name] = null;
436
+ continue;
437
+ }
438
+ try {
439
+ one[column.name] = JSON.parse(value);
440
+ }
441
+ catch (error) {
442
+ problems.push(i18next.t('text.json-column-unreadable', {
443
+ row: index + 1,
444
+ column: i18next.t(`field.${column.label}`),
445
+ detail: error.message
446
+ }));
447
+ }
448
+ }
449
+ return one;
450
+ });
451
+ return { patches: packed, problems };
452
+ }
453
+ /**
454
+ * 파일로 올린 줄들을 이 화면의 마스터로 넣는다.
455
+ *
456
+ * ── 오류보고없이 버리지 않는다 ─────────────────────────────────────────────────
457
+ * 모르는 열 이름, 이름이 없는 줄, 중복된 이름을 **알린다.** 오류보고없이 빼면 사람은 다 올라간 줄 알고,
458
+ * 빠진 것은 나중에 「그 설비가 왜 없지」로 나타난다.
459
+ *
460
+ * ── 하나라도 틀리면 아무것도 안 보낸다 ───────────────────────────────────
461
+ * 절반만 들어가면 무엇이 들어갔는지 사람이 모른다. 파일을 고쳐 다시 올리는 편이 낫다.
462
+ *
463
+ * ── 새로 만들 것과 고칠 것을 이름으로 구분한다 ─────────────────────────────
464
+ * 서버는 `+`(새로)와 `M`(고침, id 필요)을 나눠 받는다. 그러니 **올리기 전에 그 이름들이 이미
465
+ * 있는지 물어야 한다.** 안 물으면 같은 이름이 두 벌 생긴다.
466
+ */
467
+ async importHandler(records) {
468
+ if (!records?.length) {
469
+ notify({ message: i18next.t('text.nothing-to-import'), level: 'info' });
470
+ return;
471
+ }
472
+ const byHeader = this.headerIndex();
473
+ const reading = readImportRows(records, header => byHeader.get(header));
474
+ if (reading.problems.length) {
475
+ /* 열 줄까지만 보인다 — 파일이 통째로 어긋나면 문제도 줄 수만큼 나온다. */
476
+ notify({ message: reading.problems.slice(0, 10).map(problem => this.sayProblem(problem)).join('\n'), level: 'error' });
477
+ return;
478
+ }
479
+ const existing = await this.idsByName(reading.rows.map(row => String(row.name)));
480
+ const patches = patchesFor(reading.rows, name => existing.get(name));
481
+ const packed = this.packJson(patches);
482
+ if (packed.problems.length) {
483
+ notify({ message: packed.problems.slice(0, 10).join('\n'), level: 'error' });
484
+ return;
485
+ }
486
+ const response = await client.mutate({
487
+ mutation: gql `
488
+ mutation ($patches: [Object!]!) {
489
+ ${this.spec.mutation}(patches: $patches) {
490
+ id
491
+ }
492
+ }
493
+ `,
494
+ variables: { patches: packed.patches }
495
+ });
496
+ /*
497
+ * 이 앱의 클라이언트는 서버가 거절해도 던지지 않고 `errors` 에 담아 준다. 여기서 보지 않으면
498
+ * 아래의 「올렸다」가 실패한 뒤에도 그대로 뜬다. 사유는 앱의 공통 오류 처리가 이미 띄우므로
499
+ * 여기서 다시 띄우지 않는다 — 같은 말이 두 번 뜬다.
500
+ */
501
+ if (response?.errors?.length) {
502
+ return;
503
+ }
504
+ const made = patches.filter(patch => patch.cuFlag === '+').length;
505
+ notify({
506
+ message: i18next.t('text.import-done', { made, changed: patches.length - made }),
507
+ level: 'info'
508
+ });
509
+ this.grist.fetch();
510
+ }
511
+ /**
512
+ * 파일의 머리글을 이 화면의 열 이름으로 바꾼다.
513
+ *
514
+ * **두 가지를 다 받는다** — 열 이름 그대로(`homeLocation`)와 화면에 보이는 말(`홈 자리`).
515
+ * 사람이 이 화면에서 내려받아 고쳐 올리면 머리글이 화면의 말이고, 다른 시스템에서 뽑아 오면
516
+ * 열 이름이다. 한쪽만 받으면 다른 쪽이 통째로 「모르는 열」이 된다.
517
+ */
518
+ /** 무엇이 잘못됐는지를 사람에게 보일 문장으로 바꾼다. 줄 번호는 엑셀에서 보는 그 번호다. */
519
+ sayProblem(problem) {
520
+ switch (problem.kind) {
521
+ case 'unknown-column':
522
+ return i18next.t('error.import-unknown-column', { line: problem.line, column: problem.column });
523
+ case 'no-name':
524
+ return i18next.t('error.import-no-name', { line: problem.line });
525
+ case 'duplicate-name':
526
+ return i18next.t('error.import-duplicate-name', { line: problem.line, name: problem.name });
527
+ }
528
+ }
529
+ headerIndex() {
530
+ const found = new Map();
531
+ for (const column of this.spec.columns) {
532
+ found.set(column.name, column.name);
533
+ found.set(i18next.t(`field.${column.name}`), column.name);
534
+ }
535
+ return found;
536
+ }
537
+ /** 이 이름들이 이미 있나 — 있으면 그 `id`. 없는 이름은 지도에 없다. */
538
+ async idsByName(names) {
539
+ const response = await client.query({
540
+ query: gql `
541
+ query ($filters: [Filter!], $pagination: Pagination) {
542
+ ${this.spec.query}(filters: $filters, pagination: $pagination) {
543
+ items {
544
+ id
545
+ name
546
+ }
547
+ }
548
+ }
549
+ `,
550
+ variables: {
551
+ filters: [{ name: 'name', operator: 'in', value: names }],
552
+ /* 올린 줄 수만큼만 돌아오면 된다. 기본 50으로 두면 51번째부터 새로 만들어 두 벌이 된다. */
553
+ pagination: { page: 1, limit: names.length }
554
+ },
555
+ fetchPolicy: 'no-cache'
556
+ });
557
+ return new Map((response.data?.[this.spec.query]?.items ?? []).map((item) => [item.name, item.id]));
558
+ }
559
+ /** 「언제부터」를 묻는다. 사람이 그만두면 `undefined` 이고, 그때는 **아무것도 안 보낸다.** */
560
+ askAppliedWhen(changes) {
561
+ return new Promise(resolve => {
562
+ const popup = openPopup(html `<applied-when-dialog
563
+ .changes=${changes}
564
+ .onAnswer=${(answer) => {
565
+ popup?.close?.();
566
+ resolve(answer);
567
+ }}
568
+ .onCancel=${() => {
569
+ popup?.close?.();
570
+ resolve(undefined);
571
+ }}
572
+ ></applied-when-dialog>`, { backdrop: true, size: 'medium', title: i18next.t('title.when-does-this-apply') });
573
+ });
574
+ }
575
+ async save() {
576
+ const patches = this.grist.dirtyRecords;
577
+ if (!patches?.length) {
578
+ notify({ message: i18next.t('text.nothing-changed'), level: 'info' });
579
+ return;
580
+ }
581
+ const packed = this.packJson(patches);
582
+ if (packed.problems.length) {
583
+ /* 하나도 보내지 않는다. 절반만 저장되면 화면과 저장된 것이 달라진다. */
584
+ notify({ message: packed.problems.join('\n'), level: 'error' });
585
+ return;
586
+ }
587
+ /*
588
+ * ── 배정과 선언은 「언제부터」를 묻고 보낸다 ─────────────────────────────
589
+ *
590
+ * 자리 배정 · 근무조 선언 · 부모 관계는 가동률 분모를 정한다. 그래서 값만 바꾸는 것이 아니라
591
+ * **언제부터 그렇게 볼 것인가**를 함께 정해야 하고, 과거를 적으면 지연 기록인지 정정인지까지
592
+ * 갈라야 한다(§`applied-when-dialog`).
593
+ *
594
+ * 안 물어도 저장은 된다 — 그때는 「지금부터」라는 주장이 된다. 다만 **묻지 않으면 사람이 그것을
595
+ * 주장한 줄 모른다.**
596
+ */
597
+ const assignments = assignmentChangesIn(this.spec.axis ?? '', patches);
598
+ const applied = assignments.length ? await this.askAppliedWhen(assignments) : undefined;
599
+ /* 그만두었으면 아무것도 안 보낸다 — 절반만 저장되면 화면과 저장된 것이 달라진다. */
600
+ if (assignments.length && !applied) {
601
+ return;
602
+ }
603
+ const response = await client.mutate({
604
+ /*
605
+ * **타입 이름은 `Object` 다.**
606
+ *
607
+ * 서버가 `ScalarObject` 라는 이름으로 선언하지만 스키마에 나가는 이름은 `Object` 이고,
608
+ * `ScalarObject` 로 적으면 「Unknown type」으로 거절된다. 2026-09-01부터 이 자리가 그렇게
609
+ * 적혀 있어 **모든 기준정보 화면의 저장이 안 됐다.** 화면은 오류를 그대로 보여 주지도
610
+ * 않았다 — 이 앱의 클라이언트는 서버가 거절해도 던지지 않는다.
611
+ */
612
+ mutation: gql `
613
+ mutation ($patches: [Object!]!, $applied: Object) {
614
+ ${this.spec.mutation}(patches: $patches, applied: $applied) {
615
+ id
616
+ name
617
+ }
618
+ }
619
+ `,
620
+ variables: { patches: packed.patches, applied }
621
+ });
622
+ /*
623
+ * 이 클라이언트는 서버가 거절해도 던지지 않는다 — 오류는 `response.errors` 에 담겨 온다.
624
+ * 보지 않으면 저장에 실패해도 화면이 목록을 다시 읽어 「저장된 것처럼」 보인다.
625
+ * 사유 자체는 앱의 공통 오류 처리가 띄운다.
626
+ */
627
+ if (response.errors?.length) {
628
+ return;
629
+ }
630
+ /* 지운 행은 사라지지 않고 유효 기간의 끝이 채워진다. 말해 주지 않으면 저장이 안 된 것으로 읽는다. */
631
+ if (packed.patches.some((patch) => String(patch.cuFlag).toUpperCase() === '-')) {
632
+ notify({ message: i18next.t('text.retired-not-deleted'), level: 'info' });
633
+ }
634
+ this.grist.fetch();
635
+ }
636
+ }
637
+ __decorate([
638
+ property({ type: Boolean }),
639
+ __metadata("design:type", Boolean)
640
+ ], MasterPageBase.prototype, "active", void 0);
641
+ __decorate([
642
+ property({ type: Object }),
643
+ __metadata("design:type", Object)
644
+ ], MasterPageBase.prototype, "gristConfig", void 0);
645
+ __decorate([
646
+ property({ type: String }),
647
+ __metadata("design:type", String)
648
+ ], MasterPageBase.prototype, "mode", void 0);
649
+ __decorate([
650
+ state(),
651
+ __metadata("design:type", Object)
652
+ ], MasterPageBase.prototype, "ready", void 0);
653
+ __decorate([
654
+ query('ox-grist'),
655
+ __metadata("design:type", DataGrist)
656
+ ], MasterPageBase.prototype, "grist", void 0);
657
+ //# sourceMappingURL=master-page-base.js.map