@things-factory/ops-master 10.1.248 → 10.1.250

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 +4 -4
@@ -0,0 +1,763 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@operato/data-grist/ox-grist.js';
3
+ import gql from 'graphql-tag';
4
+ import { html, css, nothing } from 'lit';
5
+ import { state } from 'lit/decorators.js';
6
+ import { client } from '@operato/graphql';
7
+ import { i18next } from '@operato/i18n';
8
+ import { OxPrompt } from '@operato/popup';
9
+ import { IDENTITY, MasterPageBase } from './master-page-base.js';
10
+ import { requestMasterChangeApproval, masterChangeStatus } from '../../master-change-approval.js';
11
+ import { revisionText as t, revisionDate as date, revisionStyles } from './revision-comparison.js';
12
+ import { materialRevisionFields } from './material-revision-fields.js';
13
+ import { localDateTime, isoFromLocal, isBaseline, reasonOf } from './revision-view.js';
14
+ /** Shared workflow, not shared domain payload. Both consumers keep their existing page/URL identities. */
15
+ export class RevisionWorkspace extends MasterPageBase {
16
+ constructor() {
17
+ super(...arguments);
18
+ this.newName = '';
19
+ this.busy = false;
20
+ this.dirty = false;
21
+ this.failure = '';
22
+ this.message = '';
23
+ this.statuses = {};
24
+ this.serial = 0;
25
+ }
26
+ static { this.styles = [
27
+ ...MasterPageBase.styles,
28
+ revisionStyles,
29
+ css `
30
+ :host {
31
+ display: flex;
32
+ flex-direction: column;
33
+ min-height: 0;
34
+ }
35
+ ox-grist {
36
+ flex: 1;
37
+ min-height: 240px;
38
+ }
39
+ ox-grist[hidden] {
40
+ display: none;
41
+ }
42
+ .workspace {
43
+ overflow: auto;
44
+ flex: 1;
45
+ padding: 20px 24px;
46
+ }
47
+ .bar {
48
+ display: flex;
49
+ align-items: center;
50
+ gap: 12px;
51
+ flex-wrap: wrap;
52
+ }
53
+ .bar h2 {
54
+ margin: 8px 0;
55
+ font-size: var(--ui-t-title, 20px);
56
+ flex: 1;
57
+ overflow-wrap: anywhere;
58
+ }
59
+ .summary {
60
+ display: grid;
61
+ grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
62
+ gap: 16px;
63
+ margin: 20px 0;
64
+ }
65
+ .card {
66
+ padding: 16px;
67
+ border: 1px solid var(--ui-line);
68
+ border-radius: 6px;
69
+ background: var(--md-sys-color-surface);
70
+ }
71
+ .card h3 {
72
+ margin: 0 0 10px;
73
+ }
74
+ .card p {
75
+ margin: 8px 0;
76
+ }
77
+ .current {
78
+ border-inline-start: 4px solid var(--md-sys-color-primary);
79
+ }
80
+ .fields {
81
+ display: grid;
82
+ grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
83
+ gap: 16px;
84
+ margin: 16px 0;
85
+ }
86
+ label {
87
+ display: flex;
88
+ flex-direction: column;
89
+ gap: 6px;
90
+ font-size: var(--ui-t-small, 13px);
91
+ }
92
+ input,
93
+ textarea {
94
+ box-sizing: border-box;
95
+ width: 100%;
96
+ padding: 8px;
97
+ border: 1px solid var(--ui-line);
98
+ border-radius: 4px;
99
+ font: inherit;
100
+ background: var(--md-sys-color-surface);
101
+ color: inherit;
102
+ }
103
+ td input {
104
+ min-width: 100px;
105
+ }
106
+ textarea {
107
+ min-height: 70px;
108
+ }
109
+ .actions {
110
+ display: flex;
111
+ flex-wrap: wrap;
112
+ gap: 12px;
113
+ margin-top: 20px;
114
+ align-items: center;
115
+ }
116
+ .notice {
117
+ padding: 12px;
118
+ background: var(--md-sys-color-surface-container);
119
+ border-radius: 4px;
120
+ }
121
+ .failure {
122
+ padding: 12px;
123
+ border-inline-start: 4px solid var(--md-sys-color-error);
124
+ color: var(--md-sys-color-error);
125
+ }
126
+ .empty {
127
+ padding: 24px;
128
+ }
129
+ .hint {
130
+ font-size: var(--ui-t-small, 13px);
131
+ }
132
+ .editor {
133
+ border-top: 1px solid var(--ui-line);
134
+ margin-top: 20px;
135
+ padding-top: 12px;
136
+ }
137
+ @media (max-width: 700px) {
138
+ .workspace {
139
+ padding: 12px;
140
+ }
141
+ .summary {
142
+ grid-template-columns: 1fr;
143
+ }
144
+ .fields {
145
+ grid-template-columns: 1fr;
146
+ }
147
+ }
148
+ `
149
+ ]; }
150
+ get recipe() {
151
+ return this.axis === 'recipeDefinition';
152
+ }
153
+ get material() { return this.axis === 'materialDefinition'; }
154
+ get names() {
155
+ if (this.material)
156
+ return { noun: 'material', list: 'materialDefinitions', overview: 'materialDefinitionRevisions', subject: 'materialId', create: 'createMaterialDefinitionDraft', edit: 'editMaterialDefinitionDraft', publish: 'publishMaterialDefinitionDraft' };
157
+ return this.recipe
158
+ ? {
159
+ noun: 'recipe',
160
+ list: 'recipeDefinitions',
161
+ overview: 'recipeRevisions',
162
+ subject: 'recipeId',
163
+ create: 'createRecipeDraft',
164
+ edit: 'editRecipeDraft',
165
+ publish: 'publishRecipeDraft'
166
+ }
167
+ : {
168
+ noun: 'spec',
169
+ list: 'testSpecifications',
170
+ overview: 'testSpecificationRevisions',
171
+ subject: 'specId',
172
+ create: 'createTestSpecificationDraft',
173
+ edit: 'editTestSpecificationDraft',
174
+ publish: 'publishTestSpecificationDraft'
175
+ };
176
+ }
177
+ get spec() {
178
+ return {
179
+ key: this.axis,
180
+ title: this.material ? 'material' : this.recipe ? 'recipe' : 'test-specification',
181
+ help: 'ops-master/' + (this.material ? 'material-definition' : this.recipe ? 'recipe-definition' : 'test-specification'),
182
+ query: this.names.list,
183
+ mutation: this.material ? 'updateMultipleMaterialDefinition' : this.recipe ? 'updateMultipleRecipeDefinition' : 'updateMultipleTestSpecification',
184
+ columns: [
185
+ ...IDENTITY,
186
+ ...(this.material ? [
187
+ { name: 'rootClasses', label: 'material-type', type: 'list', width: 120 },
188
+ { name: 'classPath', label: 'class-lineage', type: 'list', width: 180 },
189
+ { name: 'madeBy', label: 'made-by', type: 'list', width: 180 },
190
+ { name: 'usedIn', label: 'used-in', type: 'list', width: 180 }
191
+ ] : []),
192
+ { name: 'revisionNumber', label: 'revision', type: 'number' },
193
+ { name: 'effectiveStart', label: 'effective-start', type: 'date' }
194
+ ].map(column => ({ ...column, readonly: true }))
195
+ };
196
+ }
197
+ get pathSegmentNarrowsList() {
198
+ return false;
199
+ }
200
+ get context() {
201
+ return {
202
+ ...super.context,
203
+ importable: undefined,
204
+ exportable: this.overview || this.draft ? undefined : super.context.exportable,
205
+ search: this.overview || this.draft ? undefined : super.context.search,
206
+ description: t('purpose'),
207
+ actions: this.draft && !this.draft.frozenAt
208
+ ? [
209
+ {
210
+ title: this.approvalRequired ? t('request-approval') : i18next.t('button.save'),
211
+ icon: 'done',
212
+ emphasis: { raised: true },
213
+ disabled: this.busy || this.approvalRequired === undefined,
214
+ action: () => this.submit()
215
+ }
216
+ ]
217
+ : this.overview || this.draft
218
+ ? []
219
+ : [
220
+ {
221
+ title: t(this.material ? 'new-material' : this.recipe ? 'new-recipe' : 'new-spec'),
222
+ icon: 'add',
223
+ emphasis: { raised: true },
224
+ action: () => this.startNew()
225
+ }
226
+ ]
227
+ };
228
+ }
229
+ updated(changes) {
230
+ super.updated(changes);
231
+ if (this.active && ['overview', 'draft', 'busy', 'approvalRequired'].some(key => changes.has(key)))
232
+ this.updateContext();
233
+ }
234
+ configOf() {
235
+ const config = super.configOf();
236
+ return { ...config, rows: { ...config.rows, appendable: false, selectable: { multiple: false } } };
237
+ }
238
+ async pageInitialized() {
239
+ await super.pageInitialized();
240
+ await this.openResource(this.lifecycle?.resourceId);
241
+ }
242
+ async pageUpdated(changes, after, before) {
243
+ await super.pageUpdated();
244
+ if (after?.resourceId !== before?.resourceId)
245
+ await this.openResource(after?.resourceId);
246
+ }
247
+ async openResource(key) {
248
+ if (!key)
249
+ return;
250
+ await this.run(async () => {
251
+ const response = await client.query({
252
+ query: gql(`query($filters:[Filter!]){${this.names.list}(filters:$filters){items{id}}}`),
253
+ variables: { filters: [{ name: 'name', operator: 'eq', value: key }] },
254
+ fetchPolicy: 'no-cache'
255
+ });
256
+ this.assert(response);
257
+ const row = response.data[this.names.list].items[0];
258
+ if (row)
259
+ await this.load(row.id);
260
+ });
261
+ }
262
+ assert(response) {
263
+ if (response.errors?.length)
264
+ throw new Error(response.errors.map((e) => e.message).join('\n'));
265
+ if (!response.data)
266
+ throw new Error(t('no-response'));
267
+ }
268
+ async run(work) {
269
+ if (this.busy)
270
+ return;
271
+ this.busy = true;
272
+ this.failure = '';
273
+ try {
274
+ await work();
275
+ }
276
+ catch (error) {
277
+ this.failure = error.message;
278
+ }
279
+ finally {
280
+ this.busy = false;
281
+ }
282
+ }
283
+ async canLeave() {
284
+ return (!this.dirty ||
285
+ !!(await OxPrompt.open({
286
+ title: t('unsaved'),
287
+ text: t('discard-question'),
288
+ confirmButton: { text: t('discard') },
289
+ cancelButton: { text: t('keep-editing') }
290
+ })));
291
+ }
292
+ blank() {
293
+ return {
294
+ version: '1',
295
+ description: '',
296
+ materialDefinitionName: '',
297
+ effectiveFrom: new Date().toISOString(),
298
+ reason: '',
299
+ materialClassIds: [], properties: [], testSpecificationIds: [],
300
+ criteria: [],
301
+ inputs: [],
302
+ outputs: []
303
+ };
304
+ }
305
+ async policy() {
306
+ const response = await client.query({
307
+ query: gql `
308
+ query ($axis: String!) {
309
+ masterChangePolicy(axis: $axis)
310
+ }
311
+ `,
312
+ variables: { axis: this.axis },
313
+ fetchPolicy: 'no-cache'
314
+ });
315
+ this.assert(response);
316
+ this.approvalRequired = response.data.masterChangePolicy.approvalRequired;
317
+ }
318
+ async startNew() {
319
+ if (!(await this.canLeave()))
320
+ return;
321
+ await this.run(async () => {
322
+ ++this.serial;
323
+ this.overview = undefined;
324
+ this.draft = this.blank();
325
+ this.newName = '';
326
+ this.dirty = false;
327
+ this.message = '';
328
+ await this.policy();
329
+ });
330
+ }
331
+ async pick(event) {
332
+ const row = event.detail?.records?.[0] ?? event.detail?.added?.[0];
333
+ if (!row?.id || !(await this.canLeave()))
334
+ return;
335
+ await this.run(async () => {
336
+ this.draft = undefined;
337
+ this.dirty = false;
338
+ this.message = '';
339
+ await this.load(row.id);
340
+ });
341
+ }
342
+ async load(id) {
343
+ const serial = ++this.serial;
344
+ const response = await client.query({
345
+ query: gql(`query($id:String!){${this.names.overview}(${this.names.subject}:$id)}`),
346
+ variables: { id },
347
+ fetchPolicy: 'no-cache'
348
+ });
349
+ this.assert(response);
350
+ if (serial !== this.serial)
351
+ return;
352
+ this.overview = response.data[this.names.overview];
353
+ await this.policy();
354
+ const statuses = {};
355
+ await Promise.all(this.overview.revisions
356
+ .filter((row) => row.activityInstanceId)
357
+ .map(async (row) => {
358
+ try {
359
+ statuses[row.id] = await masterChangeStatus(this, row.activityInstanceId);
360
+ }
361
+ catch (error) {
362
+ statuses[row.id] = { state: 'unknown', comment: error.message };
363
+ }
364
+ }));
365
+ if (serial === this.serial)
366
+ this.statuses = statuses;
367
+ }
368
+ get currentSegment() {
369
+ return this.overview?.schedule.find((s) => s.state === 'current');
370
+ }
371
+ get current() {
372
+ return this.overview?.revisions.find((r) => r.id === this.currentSegment?.revisionId);
373
+ }
374
+ get comparisonBase() {
375
+ if (this.draft?.id && (!this.dirty || this.draft.frozenAt))
376
+ return this.overview?.revisions.find((r) => r.id === this.draft.baseRevisionId);
377
+ const at = this.draft?.effectiveFrom;
378
+ const segment = this.overview?.schedule.find((s) => s.validFrom <= at && (!s.validTo || at < s.validTo));
379
+ return this.overview?.revisions.find((r) => r.id === segment?.revisionId);
380
+ }
381
+ stateOf(row) {
382
+ const segment = this.overview?.schedule.find((s) => s.revisionId === row.id);
383
+ return (segment?.state ??
384
+ (row.activityInstanceId ? (this.statuses[row.id]?.state ?? 'unknown') : row.frozenAt ? 'approved' : 'draft'));
385
+ }
386
+ async openRevision(row, fork = false) {
387
+ if (!(await this.canLeave()))
388
+ return;
389
+ this.draft = structuredClone(row ?? this.blank());
390
+ if (fork)
391
+ this.draft = {
392
+ ...this.draft,
393
+ id: undefined,
394
+ revisionNumber: undefined,
395
+ frozenAt: undefined,
396
+ activityInstanceId: undefined,
397
+ editGeneration: undefined,
398
+ baseRevisionId: undefined,
399
+ releaseKind: null,
400
+ effectiveFrom: new Date().toISOString(),
401
+ reason: ''
402
+ };
403
+ this.dirty = false;
404
+ this.message = '';
405
+ await this.updateComplete;
406
+ this.renderRoot.querySelector('.editor')?.scrollIntoView({ block: 'start', behavior: 'smooth' });
407
+ }
408
+ change(field, value) {
409
+ this.draft = { ...this.draft, [field]: value };
410
+ this.dirty = true;
411
+ this.message = '';
412
+ }
413
+ line(section, index, field, value) {
414
+ const rows = this.draft[section].map((row) => ({ ...row, limit: { ...row.limit } }));
415
+ const numeric = ['qty', 'minimum', 'maximum'].includes(field);
416
+ const next = numeric ? (value === '' ? undefined : Number(value)) : value;
417
+ if (section === 'criteria' && ['minimum', 'maximum', 'uom'].includes(field))
418
+ rows[index].limit[field] = next;
419
+ else
420
+ rows[index][field] = next;
421
+ this.change(section, rows);
422
+ }
423
+ async save() {
424
+ await this.run(async () => {
425
+ await this.persist();
426
+ this.message = t('saved');
427
+ });
428
+ }
429
+ async persist(publish = false) {
430
+ if (!this.draft || this.draft.frozenAt)
431
+ return;
432
+ const invalid = this.renderRoot.querySelector('input:invalid,textarea:invalid');
433
+ if (invalid) {
434
+ invalid.reportValidity();
435
+ throw new Error(t('required-fields'));
436
+ }
437
+ const { version, description, criteria, inputs, outputs, materialDefinitionName, route, effectiveFrom, reason } = this.draft;
438
+ const content = this.material
439
+ ? { description, materialClassIds: this.draft.materialClassIds, properties: this.draft.properties, testSpecificationIds: this.draft.testSpecificationIds, effectiveFrom, reason }
440
+ : this.recipe
441
+ ? { description, inputs, outputs, materialDefinitionName, route: route || null, effectiveFrom, reason }
442
+ : { version, description, criteria, effectiveFrom, reason };
443
+ const n = this.names;
444
+ const saveOnce = this.material ? 'saveAndPublishMaterialDefinition' : this.recipe ? 'saveAndPublishRecipe' : 'saveAndPublishTestSpecification';
445
+ const response = publish
446
+ ? await client.mutate({
447
+ mutation: gql(`mutation($subject:String,$name:String,$revisionId:String,$editGeneration:Int,$content:Object!){${saveOnce}(${n.subject}:$subject,name:$name,revisionId:$revisionId,editGeneration:$editGeneration,content:$content)}`),
448
+ variables: { subject: this.overview?.[n.subject], name: this.overview ? undefined : this.newName,
449
+ revisionId: this.draft.id, editGeneration: this.draft.editGeneration, content }
450
+ })
451
+ : this.draft.id
452
+ ? await client.mutate({
453
+ mutation: gql(`mutation($id:String!,$generation:Int!,$content:Object!){${n.edit}(revisionId:$id,editGeneration:$generation,content:$content)}`),
454
+ variables: { id: this.draft.id, generation: this.draft.editGeneration, content }
455
+ })
456
+ : await client.mutate({
457
+ mutation: gql(`mutation($subject:String,$name:String,$content:Object!){${n.create}(${n.subject}:$subject,name:$name,content:$content)}`),
458
+ variables: { subject: this.overview?.[n.subject], name: this.overview ? undefined : this.newName, content }
459
+ });
460
+ this.assert(response);
461
+ this.draft = publish ? response.data[saveOnce].revision : response.data[n.edit] ?? response.data[n.create];
462
+ this.dirty = false;
463
+ await this.load(this.draft[n.subject]);
464
+ await this.grist?.fetch();
465
+ }
466
+ async submit() {
467
+ await this.run(async () => {
468
+ if (!this.draft || this.draft.frozenAt)
469
+ return;
470
+ await this.policy();
471
+ if (!this.approvalRequired) {
472
+ await this.persist(true);
473
+ this.message = t('published');
474
+ return;
475
+ }
476
+ await this.persist();
477
+ if (!this.draft?.id || this.draft.frozenAt)
478
+ return;
479
+ await requestMasterChangeApproval(this, {
480
+ axis: this.axis,
481
+ revisionId: this.draft.id,
482
+ editGeneration: this.draft.editGeneration
483
+ });
484
+ const id = this.draft.id;
485
+ await this.load(this.draft[this.names.subject]);
486
+ this.draft = this.overview.revisions.find((r) => r.id === id);
487
+ await this.grist?.fetch();
488
+ this.message = t('submitted');
489
+ });
490
+ }
491
+ content(row, editable = false) {
492
+ if (this.material)
493
+ return materialRevisionFields(row, editable ? (field, value) => this.change(field, value) : undefined);
494
+ return (this.recipe ? ['inputs', 'outputs'] : ['criteria']).map(section => {
495
+ const fields = section === 'criteria'
496
+ ? ['id', 'description', 'evaluatedPropertyId', 'minimum', 'maximum', 'uom', 'expression']
497
+ : section === 'inputs'
498
+ ? ['material', 'qty', 'operation']
499
+ : ['material', 'qty'];
500
+ return html `<h3>${t(section)}</h3>
501
+ <div class="scroll">
502
+ <table>
503
+ <thead>
504
+ <tr>
505
+ ${fields.map(field => html `<th>${t(field)}</th>`)}${editable ? html `<th>${t('actions')}</th>` : nothing}
506
+ </tr>
507
+ </thead>
508
+ <tbody>
509
+ ${(row[section] ?? []).map((line, index) => html `<tr>
510
+ ${fields.map(field => {
511
+ const value = section === 'criteria' && ['minimum', 'maximum', 'uom'].includes(field)
512
+ ? line.limit?.[field]
513
+ : line[field];
514
+ return html `<td>
515
+ ${editable ? html `<input aria-label=${t(section) + ' ' + (index + 1) + ' ' + t(field)} .value=${String(value ?? '')} type=${['qty', 'minimum', 'maximum'].includes(field) ? 'number' : 'text'} step="any" ?required=${['id', 'material', 'qty', 'evaluatedPropertyId'].includes(field)} @input=${(e) => this.line(section, index, field, e.target.value)} />` : (value ?? '—')}
516
+ </td>`;
517
+ })}${editable
518
+ ? html `<td>
519
+ <button
520
+ aria-label=${t('remove-row', { n: index + 1 })}
521
+ @click=${() => this.change(section, row[section].filter((_, i) => i !== index))}
522
+ >
523
+ ${t('remove')}
524
+ </button>
525
+ </td>`
526
+ : nothing}
527
+ </tr>`)}
528
+ </tbody>
529
+ </table>
530
+ </div>
531
+ ${editable ? html `<button @click=${() => this.change(section, [...row[section], section === 'criteria' ? { id: '', description: '', limit: {} } : { lineKey: crypto.randomUUID(), material: '', qty: 1 }])}>${t('add-' + section)}</button>` : nothing}
532
+ ${section === 'criteria' && row.criteria?.some((c) => c.expression) ? html `<p class="notice">${t('expression-preserved')}</p>` : nothing}`;
533
+ });
534
+ }
535
+ status(row) {
536
+ const state = this.stateOf(row), decision = this.statuses[row.id];
537
+ return html `<span class="pill">${t(state)}</span
538
+ >${decision?.who ? html `<span> · ${decision.who}</span>` : ''}${decision?.comment ? html `<p>${decision.comment}</p>` : ''}${decision?.open ? html `<button @click=${() => decision.open()}>${t('approval-detail')}</button>` : ''}`;
539
+ }
540
+ render() {
541
+ const current = this.current;
542
+ const next = this.overview?.schedule.filter((s) => s.state === 'scheduled') ?? [];
543
+ const changes = this.overview?.revisions.filter((r) => !this.overview.schedule.some((s) => s.revisionId === r.id)) ?? [];
544
+ const readonly = !!this.draft?.frozenAt || this.busy;
545
+ return html ` <ox-grist
546
+ ?hidden=${!!this.overview || !!this.draft}
547
+ .mode=${this.mode}
548
+ .config=${this.gristConfig}
549
+ .fetchHandler=${this.fetchHandler.bind(this)}
550
+ @select-record-change=${this.pick.bind(this)}
551
+ ></ox-grist>
552
+ ${this.overview || this.draft
553
+ ? html `<main class="workspace" aria-busy=${this.busy}>
554
+ <div class="bar">
555
+ <button
556
+ ?disabled=${this.busy}
557
+ @click=${async () => {
558
+ if (await this.canLeave()) {
559
+ this.overview = undefined;
560
+ this.draft = undefined;
561
+ this.dirty = false;
562
+ await this.grist?.fetch();
563
+ }
564
+ }}
565
+ >
566
+ ${t('back-list')}
567
+ </button>
568
+ <h2>${this.overview?.name ?? t(this.material ? 'new-material' : this.recipe ? 'new-recipe' : 'new-spec')}</h2>
569
+ ${this.overview
570
+ ? html `<button
571
+ ?disabled=${this.busy}
572
+ @click=${() => this.run(async () => {
573
+ this.message = '';
574
+ await this.load(this.overview[this.names.subject]);
575
+ await this.grist?.fetch();
576
+ })}
577
+ >
578
+ ${t('refresh')}</button
579
+ ><button
580
+ class="primary"
581
+ ?disabled=${this.busy}
582
+ @click=${() => this.openRevision(current, true)}
583
+ >
584
+ ${t('create-change')}
585
+ </button>`
586
+ : ''}
587
+ </div>
588
+ ${this.overview
589
+ ? html `<div class="summary">
590
+ <section class="card current">
591
+ <h3>${t('current')}</h3>
592
+ ${current
593
+ ? html `<strong>${t('revision-value', { n: current.revisionNumber })}</strong>
594
+ <p>
595
+ ${date(this.currentSegment.validFrom)} →
596
+ ${this.currentSegment.validTo ? date(this.currentSegment.validTo) : t('until-change')}
597
+ </p>
598
+ <button @click=${() => this.openRevision(current)}>${t('view-current')}</button>`
599
+ : html `<p>${t('no-current')}</p>`}
600
+ </section>
601
+ <section class="card">
602
+ <h3>${t('changes-in-progress')} · ${changes.length}</h3>
603
+ ${changes.length ? changes.map((row) => html `<p><button @click=${() => this.openRevision(row)}>${t('revision-value', { n: row.revisionNumber })}</button> ${this.status(row)}</p>`) : html `<p class="muted">${t('no-drafts')}</p>`}
604
+ </section>
605
+ <section class="card">
606
+ <h3>${t('scheduled')}</h3>
607
+ ${next.length
608
+ ? next.map((segment) => {
609
+ const row = this.overview.revisions.find((r) => r.id === segment.revisionId);
610
+ return html `<p>
611
+ <button @click=${() => this.openRevision(row)}>
612
+ ${t('revision-value', { n: row.revisionNumber })}
613
+ </button>
614
+ · ${date(segment.validFrom)}
615
+ </p>`;
616
+ })
617
+ : html `<p class="muted">${t('no-scheduled')}</p>`}
618
+ </section>
619
+ </div>
620
+ ${!this.draft && current
621
+ ? html `<h3>${t('current-content')}</h3>
622
+ <p>${current.description}</p>
623
+ ${this.content(current)}`
624
+ : ''}
625
+ <details>
626
+ <summary>${t('history')}</summary>
627
+ <table>
628
+ <thead>
629
+ <tr>
630
+ <th>${t('revision')}</th>
631
+ <th>${t('state')}</th>
632
+ <th>${t('effectiveFrom')}</th>
633
+ <th>${t('reason')}</th>
634
+ </tr>
635
+ </thead>
636
+ <tbody>
637
+ ${[...this.overview.revisions].reverse().map((row) => html `<tr>
638
+ <td><button @click=${() => this.openRevision(row)}>${row.revisionNumber}</button></td>
639
+ <td>${this.status(row)}</td>
640
+ <td>${date(row.effectiveFrom)}</td>
641
+ <td>
642
+ ${reasonOf(row, t('first-record'))}
643
+ ${isBaseline(row) ? html `<div class="muted">${t('first-record-why')}</div>` : nothing}
644
+ </td>
645
+ </tr>`)}
646
+ </tbody>
647
+ </table>
648
+ </details>`
649
+ : ''}
650
+ ${this.draft
651
+ ? html `<section class="editor">
652
+ <div class="bar">
653
+ <h3>
654
+ ${this.draft.id ? t('revision-value', { n: this.draft.revisionNumber }) : t('new-change')}
655
+ </h3>
656
+ ${this.draft.id ? this.status(this.draft) : ''}<button
657
+ ?disabled=${this.busy}
658
+ @click=${async () => {
659
+ if (await this.canLeave()) {
660
+ this.draft = undefined;
661
+ this.dirty = false;
662
+ }
663
+ }}
664
+ >
665
+ ${t('close-editor')}
666
+ </button>
667
+ </div>
668
+ <p class="notice">${t(this.material ? 'material-impact' : this.recipe ? 'recipe-impact' : 'spec-impact')}</p>
669
+ <div class="fields">
670
+ ${!this.overview
671
+ ? html `<label
672
+ >${t('name')}<input
673
+ required
674
+ .value=${this.newName}
675
+ @input=${(e) => {
676
+ this.newName = e.target.value;
677
+ this.dirty = true;
678
+ }}
679
+ /></label>`
680
+ : ''}
681
+ ${['description', ...(this.material ? [] : this.recipe ? ['materialDefinitionName', 'route'] : ['version'])].map(field => html `<label>${t(field)}<input ?disabled=${readonly} ?required=${field === 'materialDefinitionName' || field === 'version'} .value=${this.draft[field] ?? ''} @input=${(e) => this.change(field, e.target.value)} /></label>`)}
682
+ <label
683
+ >${t('effectiveFrom')}<input
684
+ type="datetime-local"
685
+ required
686
+ ?disabled=${readonly}
687
+ .value=${localDateTime(this.draft.effectiveFrom)}
688
+ @change=${(e) => {
689
+ try {
690
+ this.change('effectiveFrom', isoFromLocal(e.target.value));
691
+ }
692
+ catch {
693
+ this.failure = t('invalid-date');
694
+ }
695
+ }}
696
+ /><span class="muted hint"
697
+ >${t('time-zone')} · ${Intl.DateTimeFormat().resolvedOptions().timeZone}</span
698
+ ></label
699
+ >
700
+ <label
701
+ >${t('reason')}<textarea
702
+ required
703
+ ?disabled=${readonly}
704
+ .value=${this.draft.reason ?? ''}
705
+ @input=${(e) => this.change('reason', e.target.value)}
706
+ ></textarea>
707
+ </label>
708
+ </div>
709
+ ${this.content(this.draft, !readonly)}
710
+ <ops-master-revision-comparison
711
+ .axis=${this.axis}
712
+ .before=${this.comparisonBase}
713
+ .after=${this.draft}
714
+ ></ops-master-revision-comparison>
715
+ <div class="actions">
716
+ ${this.draft.frozenAt ? html `<button ?disabled=${this.busy} @click=${() => this.openRevision(this.draft, true)}>${t('create-change')}</button>` : html `<button ?disabled=${this.busy} @click=${() => this.save()}>${t('save-draft')}</button>`}${this.dirty ? html `<span>${t('unsaved')}</span>` : ''}
717
+ </div>
718
+ </section>`
719
+ : ''}
720
+ ${this.message ? html `<p role="status" class="notice">${this.message}</p>` : ''}${this.failure ? html `<p role="alert" class="failure">${this.failure}</p>` : ''}
721
+ </main>`
722
+ : this.failure
723
+ ? html `<p role="alert" class="failure">${this.failure}</p>`
724
+ : nothing}`;
725
+ }
726
+ }
727
+ __decorate([
728
+ state(),
729
+ __metadata("design:type", Object)
730
+ ], RevisionWorkspace.prototype, "overview", void 0);
731
+ __decorate([
732
+ state(),
733
+ __metadata("design:type", Object)
734
+ ], RevisionWorkspace.prototype, "draft", void 0);
735
+ __decorate([
736
+ state(),
737
+ __metadata("design:type", Object)
738
+ ], RevisionWorkspace.prototype, "newName", void 0);
739
+ __decorate([
740
+ state(),
741
+ __metadata("design:type", Object)
742
+ ], RevisionWorkspace.prototype, "busy", void 0);
743
+ __decorate([
744
+ state(),
745
+ __metadata("design:type", Object)
746
+ ], RevisionWorkspace.prototype, "dirty", void 0);
747
+ __decorate([
748
+ state(),
749
+ __metadata("design:type", Object)
750
+ ], RevisionWorkspace.prototype, "failure", void 0);
751
+ __decorate([
752
+ state(),
753
+ __metadata("design:type", Object)
754
+ ], RevisionWorkspace.prototype, "message", void 0);
755
+ __decorate([
756
+ state(),
757
+ __metadata("design:type", Object)
758
+ ], RevisionWorkspace.prototype, "approvalRequired", void 0);
759
+ __decorate([
760
+ state(),
761
+ __metadata("design:type", Object)
762
+ ], RevisionWorkspace.prototype, "statuses", void 0);
763
+ //# sourceMappingURL=revision-workspace.js.map