@things-factory/ops-master 10.0.19 → 10.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/dist-client/bootstrap.d.ts +18 -0
  2. package/dist-client/bootstrap.js +36 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/index.d.ts +15 -1
  5. package/dist-client/index.js +18 -1
  6. package/dist-client/index.js.map +1 -1
  7. package/dist-client/pages/master/equipment-class.d.ts +12 -0
  8. package/dist-client/pages/master/equipment-class.js +42 -0
  9. package/dist-client/pages/master/equipment-class.js.map +1 -0
  10. package/dist-client/pages/master/equipment.d.ts +12 -0
  11. package/dist-client/pages/master/equipment.js +57 -0
  12. package/dist-client/pages/master/equipment.js.map +1 -0
  13. package/dist-client/pages/master/grist-iso-duration.d.ts +20 -0
  14. package/dist-client/pages/master/grist-iso-duration.js +70 -0
  15. package/dist-client/pages/master/grist-iso-duration.js.map +1 -0
  16. package/dist-client/pages/master/grist-reference.d.ts +91 -0
  17. package/dist-client/pages/master/grist-reference.js +419 -0
  18. package/dist-client/pages/master/grist-reference.js.map +1 -0
  19. package/dist-client/pages/master/import-rows.d.ts +35 -0
  20. package/dist-client/pages/master/import-rows.js +66 -0
  21. package/dist-client/pages/master/import-rows.js.map +1 -0
  22. package/dist-client/pages/master/iso-duration.d.ts +34 -0
  23. package/dist-client/pages/master/iso-duration.js +76 -0
  24. package/dist-client/pages/master/iso-duration.js.map +1 -0
  25. package/dist-client/pages/master/master-options.d.ts +33 -0
  26. package/dist-client/pages/master/master-options.js +47 -0
  27. package/dist-client/pages/master/master-options.js.map +1 -0
  28. package/dist-client/pages/master/master-page-base.d.ts +357 -0
  29. package/dist-client/pages/master/master-page-base.js +626 -0
  30. package/dist-client/pages/master/master-page-base.js.map +1 -0
  31. package/dist-client/pages/master/material-class.d.ts +12 -0
  32. package/dist-client/pages/master/material-class.js +42 -0
  33. package/dist-client/pages/master/material-class.js.map +1 -0
  34. package/dist-client/pages/master/material-definition.d.ts +12 -0
  35. package/dist-client/pages/master/material-definition.js +62 -0
  36. package/dist-client/pages/master/material-definition.js.map +1 -0
  37. package/dist-client/pages/master/operation-definition.d.ts +12 -0
  38. package/dist-client/pages/master/operation-definition.js +49 -0
  39. package/dist-client/pages/master/operation-definition.js.map +1 -0
  40. package/dist-client/pages/master/operational-location.d.ts +84 -0
  41. package/dist-client/pages/master/operational-location.js +426 -0
  42. package/dist-client/pages/master/operational-location.js.map +1 -0
  43. package/dist-client/pages/master/person.d.ts +12 -0
  44. package/dist-client/pages/master/person.js +41 -0
  45. package/dist-client/pages/master/person.js.map +1 -0
  46. package/dist-client/pages/master/personnel-class.d.ts +12 -0
  47. package/dist-client/pages/master/personnel-class.js +43 -0
  48. package/dist-client/pages/master/personnel-class.js.map +1 -0
  49. package/dist-client/pages/master/physical-asset-class.d.ts +12 -0
  50. package/dist-client/pages/master/physical-asset-class.js +40 -0
  51. package/dist-client/pages/master/physical-asset-class.js.map +1 -0
  52. package/dist-client/pages/master/physical-asset.d.ts +12 -0
  53. package/dist-client/pages/master/physical-asset.js +41 -0
  54. package/dist-client/pages/master/physical-asset.js.map +1 -0
  55. package/dist-client/pages/master/recipe-definition.d.ts +136 -0
  56. package/dist-client/pages/master/recipe-definition.js +404 -0
  57. package/dist-client/pages/master/recipe-definition.js.map +1 -0
  58. package/dist-client/pages/master/reference-targets.d.ts +42 -0
  59. package/dist-client/pages/master/reference-targets.js +82 -0
  60. package/dist-client/pages/master/reference-targets.js.map +1 -0
  61. package/dist-client/pages/master/route-definition.d.ts +19 -0
  62. package/dist-client/pages/master/route-definition.js +40 -0
  63. package/dist-client/pages/master/route-definition.js.map +1 -0
  64. package/dist-client/pages/master/stop-reason.d.ts +12 -0
  65. package/dist-client/pages/master/stop-reason.js +48 -0
  66. package/dist-client/pages/master/stop-reason.js.map +1 -0
  67. package/dist-client/pages/master/test-specification.d.ts +93 -0
  68. package/dist-client/pages/master/test-specification.js +449 -0
  69. package/dist-client/pages/master/test-specification.js.map +1 -0
  70. package/dist-client/pages/master-axes.d.ts +20 -29
  71. package/dist-client/pages/master-axes.js +32 -182
  72. package/dist-client/pages/master-axes.js.map +1 -1
  73. package/dist-client/route.d.ts +1 -1
  74. package/dist-client/route.js +76 -3
  75. package/dist-client/route.js.map +1 -1
  76. package/dist-client/tsconfig.tsbuildinfo +1 -1
  77. package/dist-server/service/asset/asset-lifecycle.d.ts +30 -7
  78. package/dist-server/service/asset/asset-lifecycle.js +33 -6
  79. package/dist-server/service/asset/asset-lifecycle.js.map +1 -1
  80. package/dist-server/service/asset/asset-master-resolver.d.ts +9 -0
  81. package/dist-server/service/asset/asset-master-resolver.js +41 -0
  82. package/dist-server/service/asset/asset-master-resolver.js.map +1 -1
  83. package/dist-server/service/asset/asset-master.js +1 -1
  84. package/dist-server/service/asset/asset-master.js.map +1 -1
  85. package/dist-server/service/asset/asset-query.d.ts +9 -1
  86. package/dist-server/service/asset/asset-query.js +28 -6
  87. package/dist-server/service/asset/asset-query.js.map +1 -1
  88. package/dist-server/service/asset/physical-asset-class.js +1 -1
  89. package/dist-server/service/asset/physical-asset-class.js.map +1 -1
  90. package/dist-server/service/asset/physical-asset.d.ts +17 -4
  91. package/dist-server/service/asset/physical-asset.js +6 -6
  92. package/dist-server/service/asset/physical-asset.js.map +1 -1
  93. package/dist-server/service/equipment/equipment-class.js +1 -1
  94. package/dist-server/service/equipment/equipment-class.js.map +1 -1
  95. package/dist-server/service/equipment/equipment-master-resolver.d.ts +9 -0
  96. package/dist-server/service/equipment/equipment-master-resolver.js +58 -0
  97. package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -1
  98. package/dist-server/service/equipment/equipment-master.d.ts +3 -2
  99. package/dist-server/service/equipment/equipment-master.js +21 -4
  100. package/dist-server/service/equipment/equipment-master.js.map +1 -1
  101. package/dist-server/service/equipment/equipment-query.d.ts +9 -1
  102. package/dist-server/service/equipment/equipment-query.js +28 -6
  103. package/dist-server/service/equipment/equipment-query.js.map +1 -1
  104. package/dist-server/service/equipment/equipment.d.ts +27 -1
  105. package/dist-server/service/equipment/equipment.js +8 -3
  106. package/dist-server/service/equipment/equipment.js.map +1 -1
  107. package/dist-server/service/equipment/state-period-rules.d.ts +19 -0
  108. package/dist-server/service/equipment/state-period-rules.js +35 -1
  109. package/dist-server/service/equipment/state-period-rules.js.map +1 -1
  110. package/dist-server/service/index.d.ts +4 -1
  111. package/dist-server/service/index.js +11 -2
  112. package/dist-server/service/index.js.map +1 -1
  113. package/dist-server/service/location/location-master-resolver.d.ts +29 -0
  114. package/dist-server/service/location/location-master-resolver.js +228 -1
  115. package/dist-server/service/location/location-master-resolver.js.map +1 -1
  116. package/dist-server/service/location/location-query.d.ts +9 -1
  117. package/dist-server/service/location/location-query.js +24 -9
  118. package/dist-server/service/location/location-query.js.map +1 -1
  119. package/dist-server/service/location/operational-location.d.ts +37 -0
  120. package/dist-server/service/location/operational-location.js +22 -2
  121. package/dist-server/service/location/operational-location.js.map +1 -1
  122. package/dist-server/service/master-axis.js +2 -2
  123. package/dist-server/service/master-axis.js.map +1 -1
  124. package/dist-server/service/master-conformance-resolver.d.ts +34 -0
  125. package/dist-server/service/master-conformance-resolver.js +143 -0
  126. package/dist-server/service/master-conformance-resolver.js.map +1 -0
  127. package/dist-server/service/master-conformance.d.ts +80 -0
  128. package/dist-server/service/master-conformance.js +266 -0
  129. package/dist-server/service/master-conformance.js.map +1 -0
  130. package/dist-server/service/master-page-query.d.ts +33 -0
  131. package/dist-server/service/master-page-query.js +55 -0
  132. package/dist-server/service/master-page-query.js.map +1 -0
  133. package/dist-server/service/master-page.d.ts +85 -0
  134. package/dist-server/service/master-page.js +104 -0
  135. package/dist-server/service/master-page.js.map +1 -0
  136. package/dist-server/service/material/material-class.js +1 -1
  137. package/dist-server/service/material/material-class.js.map +1 -1
  138. package/dist-server/service/material/material-definition.js +2 -2
  139. package/dist-server/service/material/material-definition.js.map +1 -1
  140. package/dist-server/service/material/material-master-resolver.d.ts +62 -0
  141. package/dist-server/service/material/material-master-resolver.js +213 -0
  142. package/dist-server/service/material/material-master-resolver.js.map +1 -1
  143. package/dist-server/service/material/material-query.d.ts +9 -1
  144. package/dist-server/service/material/material-query.js +28 -6
  145. package/dist-server/service/material/material-query.js.map +1 -1
  146. package/dist-server/service/material/recipe-index.d.ts +23 -0
  147. package/dist-server/service/material/recipe-index.js +44 -0
  148. package/dist-server/service/material/recipe-index.js.map +1 -0
  149. package/dist-server/service/operation/operation-definition.d.ts +1 -1
  150. package/dist-server/service/operation/operation-definition.js +4 -4
  151. package/dist-server/service/operation/operation-definition.js.map +1 -1
  152. package/dist-server/service/operation/operation-master-resolver.d.ts +24 -0
  153. package/dist-server/service/operation/operation-master-resolver.js +107 -0
  154. package/dist-server/service/operation/operation-master-resolver.js.map +1 -1
  155. package/dist-server/service/operation/operation-query.d.ts +10 -2
  156. package/dist-server/service/operation/operation-query.js +25 -10
  157. package/dist-server/service/operation/operation-query.js.map +1 -1
  158. package/dist-server/service/personnel/person.js +3 -3
  159. package/dist-server/service/personnel/person.js.map +1 -1
  160. package/dist-server/service/personnel/personnel-class.d.ts +1 -1
  161. package/dist-server/service/personnel/personnel-class.js +2 -2
  162. package/dist-server/service/personnel/personnel-class.js.map +1 -1
  163. package/dist-server/service/personnel/personnel-master-resolver.d.ts +9 -0
  164. package/dist-server/service/personnel/personnel-master-resolver.js +43 -0
  165. package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -1
  166. package/dist-server/service/personnel/personnel-master.js +1 -1
  167. package/dist-server/service/personnel/personnel-master.js.map +1 -1
  168. package/dist-server/service/personnel/personnel-query.d.ts +9 -1
  169. package/dist-server/service/personnel/personnel-query.js +28 -6
  170. package/dist-server/service/personnel/personnel-query.js.map +1 -1
  171. package/dist-server/service/recipe/recipe-definition.d.ts +3 -3
  172. package/dist-server/service/recipe/recipe-definition.js +3 -3
  173. package/dist-server/service/recipe/recipe-definition.js.map +1 -1
  174. package/dist-server/service/recipe/recipe-master-resolver.d.ts +1 -1
  175. package/dist-server/service/recipe/recipe-master-resolver.js +1 -1
  176. package/dist-server/service/recipe/recipe-master-resolver.js.map +1 -1
  177. package/dist-server/service/recipe/recipe-master.d.ts +1 -1
  178. package/dist-server/service/recipe/recipe-master.js +2 -2
  179. package/dist-server/service/recipe/recipe-master.js.map +1 -1
  180. package/dist-server/service/recipe/recipe-query.d.ts +11 -3
  181. package/dist-server/service/recipe/recipe-query.js +30 -9
  182. package/dist-server/service/recipe/recipe-query.js.map +1 -1
  183. package/dist-server/service/recipe/route-definition.d.ts +6 -6
  184. package/dist-server/service/recipe/route-definition.js +6 -6
  185. package/dist-server/service/recipe/route-definition.js.map +1 -1
  186. package/dist-server/service/resource/class-lineage.d.ts +46 -0
  187. package/dist-server/service/resource/class-lineage.js +80 -0
  188. package/dist-server/service/resource/class-lineage.js.map +1 -0
  189. package/dist-server/service/resource/class-members.d.ts +36 -0
  190. package/dist-server/service/resource/class-members.js +50 -0
  191. package/dist-server/service/resource/class-members.js.map +1 -0
  192. package/dist-server/service/resource/referrers.d.ts +54 -0
  193. package/dist-server/service/resource/referrers.js +99 -0
  194. package/dist-server/service/resource/referrers.js.map +1 -0
  195. package/dist-server/service/test-spec/criteria-check.d.ts +53 -0
  196. package/dist-server/service/test-spec/criteria-check.js +142 -0
  197. package/dist-server/service/test-spec/criteria-check.js.map +1 -0
  198. package/dist-server/service/test-spec/criteria-rows.d.ts +89 -0
  199. package/dist-server/service/test-spec/criteria-rows.js +139 -0
  200. package/dist-server/service/test-spec/criteria-rows.js.map +1 -0
  201. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +33 -7
  202. package/dist-server/service/test-spec/test-spec-master-resolver.js +137 -2
  203. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -1
  204. package/dist-server/service/test-spec/test-spec-query.d.ts +9 -1
  205. package/dist-server/service/test-spec/test-spec-query.js +23 -9
  206. package/dist-server/service/test-spec/test-spec-query.js.map +1 -1
  207. package/dist-server/service/test-spec/test-specification.js +1 -1
  208. package/dist-server/service/test-spec/test-specification.js.map +1 -1
  209. package/dist-server/tsconfig.tsbuildinfo +1 -1
  210. package/helps/ops-master/equipment-class.ko.md +11 -0
  211. package/helps/ops-master/equipment-class.md +11 -0
  212. package/helps/ops-master/equipment.ko.md +11 -0
  213. package/helps/ops-master/equipment.md +11 -0
  214. package/helps/ops-master/material-class.ko.md +11 -0
  215. package/helps/ops-master/material-class.md +11 -0
  216. package/helps/ops-master/material-definition.ko.md +11 -0
  217. package/helps/ops-master/material-definition.md +11 -0
  218. package/helps/ops-master/operation-definition.ko.md +11 -0
  219. package/helps/ops-master/operation-definition.md +11 -0
  220. package/helps/ops-master/operational-location.ko.md +11 -0
  221. package/helps/ops-master/operational-location.md +11 -0
  222. package/helps/ops-master/person.ko.md +11 -0
  223. package/helps/ops-master/person.md +11 -0
  224. package/helps/ops-master/personnel-class.ko.md +11 -0
  225. package/helps/ops-master/personnel-class.md +11 -0
  226. package/helps/ops-master/physical-asset-class.ko.md +11 -0
  227. package/helps/ops-master/physical-asset-class.md +11 -0
  228. package/helps/ops-master/physical-asset.ko.md +11 -0
  229. package/helps/ops-master/physical-asset.md +11 -0
  230. package/helps/ops-master/recipe-definition.ko.md +11 -0
  231. package/helps/ops-master/recipe-definition.md +11 -0
  232. package/helps/ops-master/route-definition.ko.md +11 -0
  233. package/helps/ops-master/route-definition.md +11 -0
  234. package/helps/ops-master/stop-reason.ko.md +11 -0
  235. package/helps/ops-master/stop-reason.md +11 -0
  236. package/helps/ops-master/test-specification.ko.md +11 -0
  237. package/helps/ops-master/test-specification.md +11 -0
  238. package/package.json +6 -6
  239. package/things-factory.config.js +22 -2
  240. package/translations/en.json +86 -3
  241. package/translations/ja.json +92 -1
  242. package/translations/ko.json +93 -10
  243. package/translations/ms.json +92 -1
  244. package/translations/zh.json +92 -1
  245. package/dist-client/pages/master-list.d.ts +0 -68
  246. package/dist-client/pages/master-list.js +0 -239
  247. package/dist-client/pages/master-list.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-definition.js","sourceRoot":"","sources":["../../../client/pages/master/recipe-definition.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport gql from 'graphql-tag'\n\nimport { FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { notify } from '@operato/layout'\nimport { navigate } from '@operato/shell'\n\nimport { EFFECTIVE, IDENTITY, MasterPageBase, MasterSpec } from './master-page-base.js'\n\n/** 서버가 주는 레시피 한 줄. */\ntype RecipeRecord = Record<string, any> & {\n id: string\n name: string\n materialDefinitionName?: string\n route?: string\n inputs?: RecipePart[]\n outputs?: RecipePart[]\n}\n\n/** 투입 · 산출 한 줄 — 무엇을 얼마나, 그리고 어느 공정에서. */\ntype RecipePart = { material?: string; qty?: number; operation?: string }\n\n/**\n * 제조법 — **BOM 이 사는 자리.**\n *\n * ── 왜 이 화면이 있어야 하나 ───────────────────────────────────────────────\n * 서버에는 축도 목록 질의도 수정 연산도 있는데 **화면이 없었다.** 그래서 「이 완제품 한 대에 무엇이\n * 몇 개 들어가나」를 제품 안에서 볼 길이 없었다. 품목 화면은 이름과 등급과 유효기간만 보이고,\n * 소요는 여기 있는데 여기로 오는 문이 없었다.\n *\n * ── 왜 두 단인가 ───────────────────────────────────────────────────────────\n * 레시피 하나의 투입이 마흔아홉 줄이다(군산 ECU). 그것을 레시피 목록의 한 칸에 넣으면 아무것도\n * 읽을 수 없고, 레시피와 투입을 한 표에 섞으면 **무엇이 레시피이고 무엇이 그 안의 줄인지** 사라진다.\n *\n * 그래서 로케이션과 같은 결로 둔다 — 목록에서 하나를 고르면 그 안으로 들어가고, 어디에 있는지는\n * 빵가루가 말한다. **자리의 주인은 URL 이다**(`pageUpdated`). 그래야 붙여 보낼 수 있고, 뒤로 가기가\n * 한 단 올라가고, 새로 고쳐도 그 자리에 남는다.\n *\n * ── 투입 자재를 여기서 고친다 ──────────────────────────────────────────────\n * 안에 들어가면 그 레시피의 투입이 줄로 선다. 고치면 **레시피 한 건의 `inputs` 를 통째로 다시 쓴다** —\n * `RecipePart` 는 자기 식별자가 없어서 줄 단위로 저장할 수 없다. 그래서 저장은 언제나 그 레시피\n * 하나에 대한 한 번의 쓰기다.\n *\n * ── 무엇을 만드는가는 고정 칸이다 ──────────────────────────────────────────\n * `materialDefinitionName` 이 이 레시피가 만드는 품목이고, `route` 가 그것이 타고 갈 라우팅이다. 이\n * 둘이 **품목과 라우팅을 잇는 유일한 자리**다 — 품목에서 라우팅으로 바로 가는 길은 없고, 있어서도 안 된다.\n * 같은 품목을 다른 라우팅으로 만드는 일이 있기 때문이다(라인 증설 · 시제품).\n */\n@customElement('ops-master-recipe-definition')\nexport class OpsMasterRecipeDefinition extends MasterPageBase {\n static styles = [\n ...MasterPageBase.styles,\n css`\n .scope {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 2px;\n min-height: 26px;\n }\n\n .scope button {\n display: flex;\n align-items: center;\n gap: 2px;\n border: none;\n background: none;\n padding: 2px 6px;\n cursor: pointer;\n color: var(--md-sys-color-primary);\n font: inherit;\n }\n\n .scope .sep {\n opacity: 0.4;\n }\n\n .scope .here {\n padding: 2px 6px;\n font-weight: 600;\n }\n\n .scope .makes {\n margin-left: 8px;\n opacity: 0.7;\n font-size: 0.9em;\n }\n `\n ]\n\n /**\n * 지금 열어 본 레시피. 비어 있으면 목록을 보고 있다.\n *\n * **이 값의 주인은 URL 이다.** 여기 직접 넣지 않는다 — `enter` 는 주소만 바꾸고, 바뀐 주소를\n * `pageUpdated` 가 받아 이 값을 다시 세운다.\n */\n @state() private opened?: RecipeRecord\n\n protected get spec(): MasterSpec {\n /* 안에 들어와 있으면 투입을 보이고, 아니면 레시피 목록을 보인다. */\n return this.opened ? this.partsSpec() : this.listSpec()\n }\n\n /** 레시피 목록 — 무엇을 만드나 · 어느 라우팅으로 · 투입이 몇 줄인가. */\n private listSpec(): MasterSpec {\n return {\n key: 'recipeDefinition',\n title: 'recipe',\n help: 'ops-master/recipe-definition',\n query: 'recipeDefinitions',\n mutation: 'updateMultipleRecipeDefinition',\n columns: [\n ...IDENTITY,\n {\n name: 'materialDefinitionName',\n label: 'makes',\n type: 'reference',\n reference: { queryName: 'materialDefinitions' },\n width: 180\n },\n { name: 'route', label: 'route', type: 'reference', reference: { queryName: 'routeDefinitions' }, width: 160 },\n /* 이 자리에 「투입 자재」 문이 들어간다 — 실제 칸은 `configOf` 가 갈아 끼운다. */\n { name: 'inputCount', label: 'inputs', type: 'number', width: 96, readonly: true },\n ...EFFECTIVE\n ]\n }\n }\n\n /**\n * 이 제조법에 들어가는 자재들 — 안으로 들어왔을 때의 표.\n *\n * 저장은 이 화면이 스스로 한다(`save` 를 덮어쓴다). `key` 와 `mutation` 은 그대로 두어 화면\n * 골격이 같은 축을 가리키게 한다.\n */\n /**\n * 「투입 자재」 칸을 목록에 끼운다 — **스펙이 아니라 여기서.**\n *\n * `MasterColumn` 은 렌더러를 모르는 좁은 타입이다. 자리 화면도 같은 이유로 여기서 끼운다\n * (`operational-location` 의 `configOf`). 스펙에 억지로 넣으면 타입을 속여야 하고, 그러면 다음\n * 사람이 스펙에 무엇을 넣을 수 있는지 알 수 없게 된다.\n */\n protected configOf() {\n const config = super.configOf()\n\n /* 안에 들어와 있으면 투입 자재 표다 — 그 표에는 이 칸이 없다. */\n if (this.opened) {\n return config\n }\n\n const columns = [...config.columns]\n const at = columns.findIndex((column: any) => column?.name === 'inputCount')\n\n if (at >= 0) {\n columns[at] = this.inputsColumn()\n }\n\n return { ...config, columns }\n }\n\n /**\n * ── 개수는 **문이다.** 죽은 숫자가 아니다 ───────────────────────────────\n *\n * 처음에는 그냥 못 고치는 숫자였다. 사용자가 물었다(2026-09-05): 「이게 뭐고 왜 편집이 안 되나」.\n * 둘 다 맞는 물음이었다 — 고칠 수 없는 칸이 **왜** 고칠 수 없는지 화면이 말하지 않으면, 보는\n * 사람은 그것을 망가진 칸으로 읽는다.\n *\n * 이 수는 값이 아니라 안에 든 것의 수다. 바꾸려면 안에 들어가 자재를 더하거나 빼야 한다. 그러니\n * 그 길을 이 칸이 직접 내야 한다 — 자리 화면의 「하위」가 이미 그렇게 한다.\n *\n * ```\n * 투입 자재\n * 3 › 셋이 들어간다. 누르면 그리로 간다\n * ― 아직 안 정했다. 누를 데가 없다\n * ```\n */\n private inputsColumn() {\n return {\n type: 'string',\n name: 'inputCount',\n width: 96,\n /* 폭을 끌 것이 없고, 개수로 정렬하려면 서버가 그 축을 내야 한다. */\n resizable: false,\n sortable: false,\n header: i18next.t('field.inputs'),\n record: {\n align: 'center',\n renderer: (_value: any, _column: any, record: RecipeRecord) => {\n /* 표 끝의 빈 줄에는 그리지 않는다 — 갈 곳이 없다. */\n if (!record?.id) return html``\n\n const count = (record as any).inputCount ?? 0\n\n /*\n * 비었으면 아무것도 그리지 않는다. 선택해도 빈 화면이 나오는 버튼은 없는 것이 낫고, 비우면\n * **아직 자재를 안 정한 제조법**이 눈에 띈다 — 그게 이 칸이 답하는 물음이다.\n */\n if (!count) return html``\n\n return html`<button\n class=\"icon wide\"\n title=${i18next.t('button.enter-recipe')}\n @click=${(e: Event) => {\n e.stopPropagation()\n this.enter(record)\n }}\n >\n <span>${count}</span>\n <md-icon>chevron_right</md-icon>\n </button>`\n }\n }\n }\n }\n\n private partsSpec(): MasterSpec {\n return {\n key: 'recipeDefinition',\n title: 'recipe',\n help: 'ops-master/recipe-definition',\n query: 'recipeDefinitions',\n mutation: 'updateMultipleRecipeDefinition',\n columns: [\n {\n name: 'material',\n label: 'material',\n type: 'reference',\n reference: { queryName: 'materialDefinitions' },\n width: 220,\n fixed: true\n },\n { name: 'qty', label: 'quantity', type: 'number', width: 100 },\n /*\n * 어느 공정에서 들어가나 — **BOM 이 말하지 않는 것.**\n *\n * ERP 의 BOM 은 「한 대에 몇 개」만 말한다. 그것이 언제 빠지는지는 작업표준서에 있고, 둘을\n * 붙여야 재고가 언제 줄어드는지가 정해진다. 붙이지 않으면 소요는 있는데 빠지는 시각이 없다.\n */\n {\n name: 'operation',\n label: 'operation',\n type: 'reference',\n reference: { queryName: 'operationDefinitions' },\n width: 200\n },\n { name: 'kind', label: 'part-kind', type: 'string', width: 90, readonly: true }\n ]\n }\n }\n\n /* 이 화면은 주소 조각을 **파고들기**에 쓴다 — 목록 좁히기로 겹쳐 쓰지 않는다. */\n protected get pathSegmentNarrowsList(): boolean {\n return false\n }\n\n async pageInitialized() {\n /*\n * 주소에 레시피가 담겨 있으면 여기서도 연다.\n *\n * `pageUpdated` 만 믿으면 주소로 바로 들어온 경우가 빠진다 — 그 호출이 이 함수보다 먼저 지나간다.\n * 로케이션 화면이 같은 것에 물렸다(2026-09-01).\n */\n await this.syncOpened(this.lifecycle?.resourceId)\n\n await super.pageInitialized()\n }\n\n async pageUpdated(changes: any, after: any, before: any) {\n if (after?.resourceId !== before?.resourceId) {\n await this.syncOpened(after?.resourceId)\n }\n\n await super.pageUpdated()\n }\n\n /** 주소가 가리키는 레시피를 연다. 없으면 목록이다. */\n private async syncOpened(key?: string) {\n this.opened = key ? await this.lookup(key) : undefined\n }\n\n /** 레시피 하나를 찾는다. 아이디로 찾고, 없으면 이름으로 찾는다 — 주소에는 사람이 읽는 이름이 온다. */\n private async lookup(key: string): Promise<RecipeRecord | undefined> {\n for (const field of ['id', 'name']) {\n const { records } = await this.fetchRecipes({\n page: 1,\n limit: 1,\n filters: [{ name: field, operator: 'eq', value: key }]\n } as FetchOption)\n\n if (records.length) {\n return records[0]\n }\n }\n\n return undefined\n }\n\n /** 레시피 자체를 읽는다 — 안에 들어와 있어도 이 질의는 레시피를 본다. */\n private async fetchRecipes(option: FetchOption): Promise<{ total: number; records: RecipeRecord[] }> {\n const { page = 1, limit = 50, sortings = [], filters = [] } = option\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n recipeDefinitions(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n materialDefinitionName\n route\n inputs\n outputs\n effectiveStart\n effectiveEnd\n }\n total\n }\n }\n `,\n variables: { filters, pagination: { page, limit }, sortings },\n fetchPolicy: 'no-cache'\n })\n\n const payload = response.data?.recipeDefinitions\n\n return { total: payload?.total ?? 0, records: (payload?.items ?? []) as RecipeRecord[] }\n }\n\n /**\n * 목록일 때는 레시피를, 안에서는 그 레시피의 투입과 산출을 낸다.\n *\n * **투입 자재 줄에는 서버가 준 식별자가 없다.** `RecipePart` 는 자기 아이디가 없어서, 화면이 순번으로\n * 만들어 준다 — 그 값은 저장할 때 쓰지 않고 표가 줄을 가리키는 데만 쓴다.\n */\n async fetchHandler(option: FetchOption) {\n if (!this.opened) {\n const { total, records } = await this.fetchRecipes(option)\n\n return { total, records: records.map(one => ({ ...one, inputCount: (one.inputs ?? []).length })) }\n }\n\n /* 안에서는 다시 읽는다 — 저장한 뒤 이 화면이 스스로 새로 고칠 수 있어야 한다. */\n const fresh = (await this.lookup(this.opened.name)) ?? this.opened\n this.opened = fresh\n\n const rows = [\n ...(fresh.inputs ?? []).map((part, at) => ({ id: `in-${at}`, kind: 'input', ...part })),\n ...(fresh.outputs ?? []).map((part, at) => ({ id: `out-${at}`, kind: 'output', ...part }))\n ]\n\n return { total: rows.length, records: rows }\n }\n\n protected renderScope() {\n if (!this.opened) {\n return html``\n }\n\n return html`\n <div class=\"scope\">\n <button @click=${() => this.enter(null)}>\n <md-icon>home</md-icon>\n ${i18next.t('label.all-recipes')}\n </button>\n <span class=\"sep\">/</span><span class=\"here\">${this.opened.name}</span>\n ${this.opened.materialDefinitionName\n ? html`<span class=\"makes\"\n >${i18next.t('label.makes')} ${this.opened.materialDefinitionName}${this.opened.route\n ? ` · ${this.opened.route}`\n : ''}</span\n >`\n : ''}\n </div>\n `\n }\n\n /**\n * 그 레시피로 들어간다. `null` 이면 목록으로 돌아간다.\n *\n * **주소만 바꾼다.** 셸이 주소를 물고 `pageUpdated` 를 부르고, 거기서 하나로 다시 선다.\n */\n private enter(recipe: RecipeRecord | null) {\n /* 아직 저장하지 않은 줄로는 들어갈 수 없다. 표 끝의 빈 줄에도 이 버튼이 붙는다. */\n if (recipe && !recipe.id) {\n return\n }\n\n navigate(recipe ? `${this.lifecycle?.page}/${recipe.name || recipe.id}` : `${this.lifecycle?.page}`)\n }\n\n /**\n * 저장 — **투입 자재 줄에는 자기 식별자가 없다.**\n *\n * `RecipePart` 는 아이디를 갖지 않아서 줄 단위로 저장할 수 없다. 그래서 안에서 고친 것은 표에\n * 서 있는 줄 전부를 모아 **그 레시피 한 건의 `inputs`·`outputs` 를 통째로 다시 쓴다.**\n *\n * 통째로 쓰는 것이 위험해 보이지만 그 반대가 더 위험하다 — 줄마다 쓰면 「셋째 줄」이 무엇인지\n * 서버가 알 방법이 없어서, 두 사람이 같은 레시피를 고칠 때 어느 줄이 어느 줄을 덮는지 정할 수\n * 없다. 한 번의 쓰기면 뒤엣사람이 앞엣사람의 것을 통째로 덮는 것이 눈에 보인다.\n *\n * 목록에서는 화면 골격의 저장을 그대로 쓴다 — 거기서는 레시피 한 줄이 곧 한 행이다.\n */\n protected async save() {\n if (!this.opened) {\n return await super.save()\n }\n\n if (!this.grist.dirtyRecords?.length) {\n notify({ message: i18next.t('text.nothing-changed'), level: 'info' })\n return\n }\n\n /* 표에 서 있는 모든 줄 — 고친 것만이 아니라 전부다. 통째로 다시 쓰기 때문이다. */\n const rows: any[] = this.grist.dirtyData?.records ?? []\n const part = (row: any) => ({\n material: String(row.material ?? '').trim(),\n qty: Number(row.qty ?? 0),\n ...(String(row.operation ?? '').trim() ? { operation: String(row.operation).trim() } : {})\n })\n\n const nameless = rows.filter(row => !String(row.material ?? '').trim())\n\n if (nameless.length) {\n /* 품목 없는 줄은 소요가 아니다. 하나라도 있으면 보내지 않는다. 절반만 저장되면 화면과 달라진다. */\n notify({ message: i18next.t('error.recipe-part-needs-material'), level: 'error' })\n return\n }\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($patches: [Object!]!) {\n updateMultipleRecipeDefinition(patches: $patches) {\n id\n }\n }\n `,\n variables: {\n patches: [\n {\n id: this.opened.id,\n name: this.opened.name,\n cuFlag: 'M',\n inputs: rows.filter(row => row.kind !== 'output').map(part),\n outputs: rows.filter(row => row.kind === 'output').map(part)\n }\n ]\n }\n })\n\n /* 이 클라이언트는 서버가 거절해도 던지지 않는다. 사유는 앱의 공통 오류 처리가 띄운다. */\n if (response?.errors?.length) {\n return\n }\n\n this.grist.fetch()\n }\n}\n"]}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 참조가 가리키는 표는 **어느 화면인가.**
3
+ *
4
+ * ── 왜 필요한가 ────────────────────────────────────────────────────────────
5
+ * 참조 칸이 「ECU-SUB-01」이라고 적어도 거기로 갈 길이 없었다. 그 자리가 무엇인지 보려면 자리
6
+ * 화면을 따로 열고 이름으로 찾아야 했다. 마스터는 그래프인데 화면은 표 열넷으로 흩어져 있어서,
7
+ * 한 축에서 다른 축으로 건너가는 일이 사람의 기억에 맡겨져 있었다.
8
+ *
9
+ * ── 왜 한 곳에 모으나 ──────────────────────────────────────────────────────
10
+ * 화면마다 「내 참조는 저 화면으로 간다」를 적으면 일곱 군데가 되고, 화면이 늘 때마다 여덟 · 아홉이
11
+ * 된다. 한 군데를 빠뜨리면 그 칸만 안 걸리는데, 안 걸리는 것은 오류가 아니라 **아무 일도 안 일어나는
12
+ * 것**이라 눈에 안 띈다.
13
+ *
14
+ * 여기 한 표로 두고, 화면이 참조하는 질의가 이 표에 다 있는지 테스트가 확인한다.
15
+ */
16
+ /** 질의 이름 → 그 표를 보여 주는 화면의 태그. */
17
+ export declare const REFERENCE_PAGE: Readonly<Record<string, string>>;
18
+ /** 이 꾸러미 밖에 사는 화면 — 파일이 여기 없으니 태그 검사가 따로 판단한다. */
19
+ export declare const ELSEWHERE: ReadonlySet<string>;
20
+ /**
21
+ * 지금 주소에서 **도메인까지의 앞부분**을 뗀다.
22
+ *
23
+ * 주소는 `/domain/<서브도메인>/<화면>` 이고, 파고든 화면이면 `/<이름>` 이 더 붙는다. 상대 경로로
24
+ * 옮기면 파고든 상태에서 한 칸 어긋난다 — `/domain/x/자리화면/GUNSAN` 에서 상대로 가면
25
+ * `/domain/x/자리화면/공정화면` 이 된다.
26
+ *
27
+ * 그래서 **`ops-master-` 로 시작하는 조각**을 찾아 그 앞까지를 자른다. 이 패키지의 화면 태그는 전부
28
+ * 그 접두사를 갖는다(`things-factory.config.js` 의 라우트 열넷).
29
+ *
30
+ * 처음에는 그리드 칸에서 페이지 요소를 거슬러 올라가 태그를 얻으려 했는데 안 됐다 — 칸이 셰도우
31
+ * 안에 있어 `closest` 가 경계를 못 넘고, 거슬러 올라가면 페이지가 아니라 `ox-grid-body` 가 나온다.
32
+ * [확인함] 2026-09-04
33
+ *
34
+ * 못 찾으면 `undefined` 를 낸다 — 짐작으로 자르면 엉뚱한 곳으로 보낸다.
35
+ */
36
+ export declare function domainBaseOf(pathname: string): string | undefined;
37
+ /**
38
+ * 그 이름을 보러 갈 주소. 갈 곳을 모르면 `undefined` — 부르는 쪽이 **문을 안 그린다.**
39
+ *
40
+ * 막다른 링크는 없는 링크보다 나쁘다. 선택했는데 아무 일도 안 나면 사람은 그것을 고장으로 읽는다.
41
+ */
42
+ export declare function referenceHref(queryName: string | undefined, value: string | undefined, pathname: string): string | undefined;
@@ -0,0 +1,82 @@
1
+ /**
2
+ * 참조가 가리키는 표는 **어느 화면인가.**
3
+ *
4
+ * ── 왜 필요한가 ────────────────────────────────────────────────────────────
5
+ * 참조 칸이 「ECU-SUB-01」이라고 적어도 거기로 갈 길이 없었다. 그 자리가 무엇인지 보려면 자리
6
+ * 화면을 따로 열고 이름으로 찾아야 했다. 마스터는 그래프인데 화면은 표 열넷으로 흩어져 있어서,
7
+ * 한 축에서 다른 축으로 건너가는 일이 사람의 기억에 맡겨져 있었다.
8
+ *
9
+ * ── 왜 한 곳에 모으나 ──────────────────────────────────────────────────────
10
+ * 화면마다 「내 참조는 저 화면으로 간다」를 적으면 일곱 군데가 되고, 화면이 늘 때마다 여덟 · 아홉이
11
+ * 된다. 한 군데를 빠뜨리면 그 칸만 안 걸리는데, 안 걸리는 것은 오류가 아니라 **아무 일도 안 일어나는
12
+ * 것**이라 눈에 안 띈다.
13
+ *
14
+ * 여기 한 표로 두고, 화면이 참조하는 질의가 이 표에 다 있는지 테스트가 확인한다.
15
+ */
16
+ /** 질의 이름 → 그 표를 보여 주는 화면의 태그. */
17
+ export const REFERENCE_PAGE = {
18
+ operationalLocations: 'ops-master-operational-location',
19
+ stopReasonList: 'ops-master-stop-reason',
20
+ materialDefinitions: 'ops-master-material-definition',
21
+ materialClasses: 'ops-master-material-class',
22
+ routeDefinitions: 'ops-master-route-definition',
23
+ recipeDefinitions: 'ops-master-recipe-definition',
24
+ operationDefinitions: 'ops-master-operation-definition',
25
+ personnelClasses: 'ops-master-personnel-class',
26
+ equipmentClasses: 'ops-master-equipment-class',
27
+ physicalAssetClasses: 'ops-master-physical-asset-class',
28
+ testSpecifications: 'ops-master-test-specification',
29
+ persons: 'ops-master-person',
30
+ equipmentList: 'ops-master-equipment',
31
+ physicalAssets: 'ops-master-physical-asset',
32
+ /*
33
+ * ── 이 하나만 다른 꾸러미의 화면이다 ────────────────────────────────────
34
+ *
35
+ * 근무조는 `@things-factory/work-shift` 가 갖는다. 자리가 「여기서 도는 근무조」를 고를 수 있게
36
+ * 되면서 이 표에 들어왔다.
37
+ *
38
+ * 접두사 규칙(`ops-master-`)에서 벗어나는 유일한 값이다. `domainBaseOf` 는 주소에서 그 접두사
39
+ * 앞까지를 자르므로 여기서 나온 링크도 같은 도메인 밑으로 간다 — 자르는 기준은 **지금 열려 있는
40
+ * 화면**의 태그이지 이 값이 아니다.
41
+ */
42
+ workShifts: 'work-shift'
43
+ };
44
+ /** 이 꾸러미 밖에 사는 화면 — 파일이 여기 없으니 태그 검사가 따로 판단한다. */
45
+ export const ELSEWHERE = new Set(['work-shift']);
46
+ /**
47
+ * 지금 주소에서 **도메인까지의 앞부분**을 뗀다.
48
+ *
49
+ * 주소는 `/domain/<서브도메인>/<화면>` 이고, 파고든 화면이면 `/<이름>` 이 더 붙는다. 상대 경로로
50
+ * 옮기면 파고든 상태에서 한 칸 어긋난다 — `/domain/x/자리화면/GUNSAN` 에서 상대로 가면
51
+ * `/domain/x/자리화면/공정화면` 이 된다.
52
+ *
53
+ * 그래서 **`ops-master-` 로 시작하는 조각**을 찾아 그 앞까지를 자른다. 이 패키지의 화면 태그는 전부
54
+ * 그 접두사를 갖는다(`things-factory.config.js` 의 라우트 열넷).
55
+ *
56
+ * 처음에는 그리드 칸에서 페이지 요소를 거슬러 올라가 태그를 얻으려 했는데 안 됐다 — 칸이 셰도우
57
+ * 안에 있어 `closest` 가 경계를 못 넘고, 거슬러 올라가면 페이지가 아니라 `ox-grid-body` 가 나온다.
58
+ * [확인함] 2026-09-04
59
+ *
60
+ * 못 찾으면 `undefined` 를 낸다 — 짐작으로 자르면 엉뚱한 곳으로 보낸다.
61
+ */
62
+ export function domainBaseOf(pathname) {
63
+ const at = pathname.search(/\/ops-master-/);
64
+ return at < 0 ? undefined : pathname.slice(0, at);
65
+ }
66
+ /**
67
+ * 그 이름을 보러 갈 주소. 갈 곳을 모르면 `undefined` — 부르는 쪽이 **문을 안 그린다.**
68
+ *
69
+ * 막다른 링크는 없는 링크보다 나쁘다. 선택했는데 아무 일도 안 나면 사람은 그것을 고장으로 읽는다.
70
+ */
71
+ export function referenceHref(queryName, value, pathname) {
72
+ if (!queryName || !value) {
73
+ return undefined;
74
+ }
75
+ const page = REFERENCE_PAGE[queryName];
76
+ const base = domainBaseOf(pathname);
77
+ if (!page || base === undefined) {
78
+ return undefined;
79
+ }
80
+ return `${base}/${page}/${encodeURIComponent(value)}`;
81
+ }
82
+ //# sourceMappingURL=reference-targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-targets.js","sourceRoot":"","sources":["../../../client/pages/master/reference-targets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,iCAAiC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAqC;IAC9D,oBAAoB,EAAE,iCAAiC;IACvD,cAAc,EAAE,wBAAwB;IACxC,mBAAmB,EAAE,gCAAgC;IACrD,eAAe,EAAE,2BAA2B;IAC5C,gBAAgB,EAAE,6BAA6B;IAC/C,iBAAiB,EAAE,8BAA8B;IACjD,oBAAoB,EAAE,iCAAiC;IACvD,gBAAgB,EAAE,4BAA4B;IAC9C,gBAAgB,EAAE,4BAA4B;IAC9C,oBAAoB,EAAE,iCAAiC;IACvD,kBAAkB,EAAE,+BAA+B;IACnD,OAAO,EAAE,mBAAmB;IAC5B,aAAa,EAAE,sBAAsB;IACrC,cAAc,EAAE,2BAA2B;IAC3C;;;;;;;;;OASG;IACH,UAAU,EAAE,YAAY;CACzB,CAAA;AAED,kDAAkD;AAClD,MAAM,CAAC,MAAM,SAAS,GAAwB,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;AAErE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IAE3C,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,SAA6B,EAC7B,KAAyB,EACzB,QAAgB;IAEhB,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAEnC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAA;AACvD,CAAC","sourcesContent":["/**\n * 참조가 가리키는 표는 **어느 화면인가.**\n *\n * ── 왜 필요한가 ────────────────────────────────────────────────────────────\n * 참조 칸이 「ECU-SUB-01」이라고 적어도 거기로 갈 길이 없었다. 그 자리가 무엇인지 보려면 자리\n * 화면을 따로 열고 이름으로 찾아야 했다. 마스터는 그래프인데 화면은 표 열넷으로 흩어져 있어서,\n * 한 축에서 다른 축으로 건너가는 일이 사람의 기억에 맡겨져 있었다.\n *\n * ── 왜 한 곳에 모으나 ──────────────────────────────────────────────────────\n * 화면마다 「내 참조는 저 화면으로 간다」를 적으면 일곱 군데가 되고, 화면이 늘 때마다 여덟 · 아홉이\n * 된다. 한 군데를 빠뜨리면 그 칸만 안 걸리는데, 안 걸리는 것은 오류가 아니라 **아무 일도 안 일어나는\n * 것**이라 눈에 안 띈다.\n *\n * 여기 한 표로 두고, 화면이 참조하는 질의가 이 표에 다 있는지 테스트가 확인한다.\n */\n\n/** 질의 이름 → 그 표를 보여 주는 화면의 태그. */\nexport const REFERENCE_PAGE: Readonly<Record<string, string>> = {\n operationalLocations: 'ops-master-operational-location',\n stopReasonList: 'ops-master-stop-reason',\n materialDefinitions: 'ops-master-material-definition',\n materialClasses: 'ops-master-material-class',\n routeDefinitions: 'ops-master-route-definition',\n recipeDefinitions: 'ops-master-recipe-definition',\n operationDefinitions: 'ops-master-operation-definition',\n personnelClasses: 'ops-master-personnel-class',\n equipmentClasses: 'ops-master-equipment-class',\n physicalAssetClasses: 'ops-master-physical-asset-class',\n testSpecifications: 'ops-master-test-specification',\n persons: 'ops-master-person',\n equipmentList: 'ops-master-equipment',\n physicalAssets: 'ops-master-physical-asset',\n /*\n * ── 이 하나만 다른 꾸러미의 화면이다 ────────────────────────────────────\n *\n * 근무조는 `@things-factory/work-shift` 가 갖는다. 자리가 「여기서 도는 근무조」를 고를 수 있게\n * 되면서 이 표에 들어왔다.\n *\n * 접두사 규칙(`ops-master-`)에서 벗어나는 유일한 값이다. `domainBaseOf` 는 주소에서 그 접두사\n * 앞까지를 자르므로 여기서 나온 링크도 같은 도메인 밑으로 간다 — 자르는 기준은 **지금 열려 있는\n * 화면**의 태그이지 이 값이 아니다.\n */\n workShifts: 'work-shift'\n}\n\n/** 이 꾸러미 밖에 사는 화면 — 파일이 여기 없으니 태그 검사가 따로 판단한다. */\nexport const ELSEWHERE: ReadonlySet<string> = new Set(['work-shift'])\n\n/**\n * 지금 주소에서 **도메인까지의 앞부분**을 뗀다.\n *\n * 주소는 `/domain/<서브도메인>/<화면>` 이고, 파고든 화면이면 `/<이름>` 이 더 붙는다. 상대 경로로\n * 옮기면 파고든 상태에서 한 칸 어긋난다 — `/domain/x/자리화면/GUNSAN` 에서 상대로 가면\n * `/domain/x/자리화면/공정화면` 이 된다.\n *\n * 그래서 **`ops-master-` 로 시작하는 조각**을 찾아 그 앞까지를 자른다. 이 패키지의 화면 태그는 전부\n * 그 접두사를 갖는다(`things-factory.config.js` 의 라우트 열넷).\n *\n * 처음에는 그리드 칸에서 페이지 요소를 거슬러 올라가 태그를 얻으려 했는데 안 됐다 — 칸이 셰도우\n * 안에 있어 `closest` 가 경계를 못 넘고, 거슬러 올라가면 페이지가 아니라 `ox-grid-body` 가 나온다.\n * [확인함] 2026-09-04\n *\n * 못 찾으면 `undefined` 를 낸다 — 짐작으로 자르면 엉뚱한 곳으로 보낸다.\n */\nexport function domainBaseOf(pathname: string): string | undefined {\n const at = pathname.search(/\\/ops-master-/)\n\n return at < 0 ? undefined : pathname.slice(0, at)\n}\n\n/**\n * 그 이름을 보러 갈 주소. 갈 곳을 모르면 `undefined` — 부르는 쪽이 **문을 안 그린다.**\n *\n * 막다른 링크는 없는 링크보다 나쁘다. 선택했는데 아무 일도 안 나면 사람은 그것을 고장으로 읽는다.\n */\nexport function referenceHref(\n queryName: string | undefined,\n value: string | undefined,\n pathname: string\n): string | undefined {\n if (!queryName || !value) {\n return undefined\n }\n\n const page = REFERENCE_PAGE[queryName]\n const base = domainBaseOf(pathname)\n\n if (!page || base === undefined) {\n return undefined\n }\n\n return `${base}/${page}/${encodeURIComponent(value)}`\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { MasterPageBase, MasterSpec } from './master-page-base.js';
2
+ /**
3
+ * 라우팅 — **무엇을 어떤 차례로 만드나.**
4
+ *
5
+ * ── 왜 이 화면이 있어야 하나 ───────────────────────────────────────────────
6
+ * 서버에는 축도 목록 질의도 수정 연산도 있는데 **화면이 없었다.** 그래서 고객이 자기 공장의 공정
7
+ * 차례를 못 고쳤다 — 작업지시에서 고르는 창은 있으나 이미 있는 것 중에서 고르는 것뿐이다.
8
+ *
9
+ * ── 단계는 한 칸에 늘어놓는다 ──────────────────────────────────────────────
10
+ * 차례가 곧 뜻이다. `steps` 는 공정 이름의 **순서 있는 목록**이고, 그 순서가 흐트러지면 다른 공장이
11
+ * 된다. 그래서 목록 칸(`list`)으로 두어 순서를 눈에 보이게 하고, 여기서 고칠 수 있게 한다.
12
+ *
13
+ * 각 단계가 실재하는 공정인지는 **커널이 본다** — 없는 공정을 적으면 그 라우팅을 타는 지시가 설 자리를
14
+ * 못 찾는다. 화면이 미리 막지 않는 것은, 공정을 먼저 만들고 라우팅을 잇는 순서와 라우팅을 먼저 그리고
15
+ * 공정을 채우는 순서가 둘 다 현장에 있기 때문이다.
16
+ */
17
+ export declare class OpsMasterRouteDefinition extends MasterPageBase {
18
+ protected get spec(): MasterSpec;
19
+ }
@@ -0,0 +1,40 @@
1
+ import { __decorate } from "tslib";
2
+ import { customElement } from 'lit/decorators.js';
3
+ import { EFFECTIVE, IDENTITY, MasterPageBase } from './master-page-base.js';
4
+ /**
5
+ * 라우팅 — **무엇을 어떤 차례로 만드나.**
6
+ *
7
+ * ── 왜 이 화면이 있어야 하나 ───────────────────────────────────────────────
8
+ * 서버에는 축도 목록 질의도 수정 연산도 있는데 **화면이 없었다.** 그래서 고객이 자기 공장의 공정
9
+ * 차례를 못 고쳤다 — 작업지시에서 고르는 창은 있으나 이미 있는 것 중에서 고르는 것뿐이다.
10
+ *
11
+ * ── 단계는 한 칸에 늘어놓는다 ──────────────────────────────────────────────
12
+ * 차례가 곧 뜻이다. `steps` 는 공정 이름의 **순서 있는 목록**이고, 그 순서가 흐트러지면 다른 공장이
13
+ * 된다. 그래서 목록 칸(`list`)으로 두어 순서를 눈에 보이게 하고, 여기서 고칠 수 있게 한다.
14
+ *
15
+ * 각 단계가 실재하는 공정인지는 **커널이 본다** — 없는 공정을 적으면 그 라우팅을 타는 지시가 설 자리를
16
+ * 못 찾는다. 화면이 미리 막지 않는 것은, 공정을 먼저 만들고 라우팅을 잇는 순서와 라우팅을 먼저 그리고
17
+ * 공정을 채우는 순서가 둘 다 현장에 있기 때문이다.
18
+ */
19
+ let OpsMasterRouteDefinition = class OpsMasterRouteDefinition extends MasterPageBase {
20
+ get spec() {
21
+ return {
22
+ key: 'routeDefinition',
23
+ title: 'route',
24
+ help: 'ops-master/route-definition',
25
+ query: 'routeDefinitions',
26
+ mutation: 'updateMultipleRouteDefinition',
27
+ columns: [
28
+ ...IDENTITY,
29
+ /* 차례가 곧 뜻이다 — 순서 있는 목록으로 둔다. */
30
+ { name: 'steps', label: 'route-steps', type: 'reference-list', reference: { queryName: 'operationDefinitions' }, width: 420 },
31
+ ...EFFECTIVE
32
+ ]
33
+ };
34
+ }
35
+ };
36
+ OpsMasterRouteDefinition = __decorate([
37
+ customElement('ops-master-route-definition')
38
+ ], OpsMasterRouteDefinition);
39
+ export { OpsMasterRouteDefinition };
40
+ //# sourceMappingURL=route-definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-definition.js","sourceRoot":"","sources":["../../../client/pages/master/route-definition.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,uBAAuB,CAAA;AAEvF;;;;;;;;;;;;;;GAcG;AAEI,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,cAAc;IAC1D,IAAc,IAAI;QAChB,OAAO;YACL,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,6BAA6B;YACnC,KAAK,EAAE,kBAAkB;YACzB,QAAQ,EAAE,+BAA+B;YACzC,OAAO,EAAE;gBACP,GAAG,QAAQ;gBACX,gCAAgC;gBAChC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC7H,GAAG,SAAS;aACb;SACF,CAAA;IACH,CAAC;CACF,CAAA;AAhBY,wBAAwB;IADpC,aAAa,CAAC,6BAA6B,CAAC;GAChC,wBAAwB,CAgBpC","sourcesContent":["import { customElement } from 'lit/decorators.js'\n\nimport { EFFECTIVE, IDENTITY, MasterPageBase, MasterSpec } from './master-page-base.js'\n\n/**\n * 라우팅 — **무엇을 어떤 차례로 만드나.**\n *\n * ── 왜 이 화면이 있어야 하나 ───────────────────────────────────────────────\n * 서버에는 축도 목록 질의도 수정 연산도 있는데 **화면이 없었다.** 그래서 고객이 자기 공장의 공정\n * 차례를 못 고쳤다 — 작업지시에서 고르는 창은 있으나 이미 있는 것 중에서 고르는 것뿐이다.\n *\n * ── 단계는 한 칸에 늘어놓는다 ──────────────────────────────────────────────\n * 차례가 곧 뜻이다. `steps` 는 공정 이름의 **순서 있는 목록**이고, 그 순서가 흐트러지면 다른 공장이\n * 된다. 그래서 목록 칸(`list`)으로 두어 순서를 눈에 보이게 하고, 여기서 고칠 수 있게 한다.\n *\n * 각 단계가 실재하는 공정인지는 **커널이 본다** — 없는 공정을 적으면 그 라우팅을 타는 지시가 설 자리를\n * 못 찾는다. 화면이 미리 막지 않는 것은, 공정을 먼저 만들고 라우팅을 잇는 순서와 라우팅을 먼저 그리고\n * 공정을 채우는 순서가 둘 다 현장에 있기 때문이다.\n */\n@customElement('ops-master-route-definition')\nexport class OpsMasterRouteDefinition extends MasterPageBase {\n protected get spec(): MasterSpec {\n return {\n key: 'routeDefinition',\n title: 'route',\n help: 'ops-master/route-definition',\n query: 'routeDefinitions',\n mutation: 'updateMultipleRouteDefinition',\n columns: [\n ...IDENTITY,\n /* 차례가 곧 뜻이다 — 순서 있는 목록으로 둔다. */\n { name: 'steps', label: 'route-steps', type: 'reference-list', reference: { queryName: 'operationDefinitions' }, width: 420 },\n ...EFFECTIVE\n ]\n }\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { MasterPageBase, MasterSpec } from './master-page-base.js';
2
+ /**
3
+ * 설비가 섰을 때 고르는 사유. 이 값이 그 정지를 가동률에서 빼는지 정한다.
4
+ *
5
+ * 계획 정지(교체 · 정비)와 고장을 갈라 두어야 가동률이 뜻을 갖는다. 사유는 계층이라 큰 갈래 아래 작은 갈래를 둔다.
6
+ *
7
+ * 화면 골격과 저장은 MasterPageBase 가 갖는다. 이 파일은 **이 화면이 무엇을 보이나**만 말한다 —
8
+ * 자기 인터페이스가 필요해지면 여기서 render 를 덮어쓴다.
9
+ */
10
+ export declare class OpsMasterStopReason extends MasterPageBase {
11
+ protected get spec(): MasterSpec;
12
+ }
@@ -0,0 +1,48 @@
1
+ import { __decorate } from "tslib";
2
+ import { customElement } from 'lit/decorators.js';
3
+ import { EFFECTIVE, IDENTITY, MasterPageBase } from './master-page-base.js';
4
+ /**
5
+ * 설비가 섰을 때 고르는 사유. 이 값이 그 정지를 가동률에서 빼는지 정한다.
6
+ *
7
+ * 계획 정지(교체 · 정비)와 고장을 갈라 두어야 가동률이 뜻을 갖는다. 사유는 계층이라 큰 갈래 아래 작은 갈래를 둔다.
8
+ *
9
+ * 화면 골격과 저장은 MasterPageBase 가 갖는다. 이 파일은 **이 화면이 무엇을 보이나**만 말한다 —
10
+ * 자기 인터페이스가 필요해지면 여기서 render 를 덮어쓴다.
11
+ */
12
+ let OpsMasterStopReason = class OpsMasterStopReason extends MasterPageBase {
13
+ get spec() {
14
+ return {
15
+ key: 'stopReason',
16
+ title: 'stop-reason',
17
+ help: 'ops-master/stop-reason',
18
+ query: 'stopReasonList',
19
+ mutation: 'updateMultipleStopReason',
20
+ columns: [
21
+ ...IDENTITY,
22
+ { name: 'status', label: 'state', type: 'string', width: 130 },
23
+ {
24
+ name: 'parentName',
25
+ label: 'parent-reason',
26
+ type: 'reference',
27
+ /*
28
+ * **`stopReasonList` 이지 `stopReasons` 가 아니다.**
29
+ *
30
+ * 마스터 질의 열둘 중 `stopReasons` 하나만 `items` 없이 배열을 그대로 낸다. 고르기
31
+ * 팝업은 `data.fetch.items` 를 읽으므로 그것을 가리키면 `Cannot read properties of
32
+ * undefined (reading 'map')` 로 터진다 — 이 화면 자신이 목록을 뽑을 때 쓰는 이름이
33
+ * `stopReasonList` 다. [확인함] 2026-09-04
34
+ */
35
+ reference: { queryName: 'stopReasonList' },
36
+ width: 150
37
+ },
38
+ { name: 'detailRequired', label: 'detail-required', type: 'boolean', width: 110 },
39
+ ...EFFECTIVE
40
+ ]
41
+ };
42
+ }
43
+ };
44
+ OpsMasterStopReason = __decorate([
45
+ customElement('ops-master-stop-reason')
46
+ ], OpsMasterStopReason);
47
+ export { OpsMasterStopReason };
48
+ //# sourceMappingURL=stop-reason.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-reason.js","sourceRoot":"","sources":["../../../client/pages/master/stop-reason.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,uBAAuB,CAAA;AAEvF;;;;;;;GAOG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,cAAc;IACrD,IAAc,IAAI;QAChB,OAAO;YACL,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,wBAAwB;YAC9B,KAAK,EAAE,gBAAgB;YACvB,QAAQ,EAAE,0BAA0B;YACpC,OAAO,EAAE;gBACP,GAAG,QAAQ;gBACX,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC9D;oBACE,IAAI,EAAE,YAAY;oBAClB,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,WAAW;oBACjB;;;;;;;uBAOG;oBACH,SAAS,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE;oBAC1C,KAAK,EAAE,GAAG;iBACX;gBACD,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;gBACjF,GAAG,SAAS;aACb;SACF,CAAA;IACH,CAAC;CACF,CAAA;AA/BY,mBAAmB;IAD/B,aAAa,CAAC,wBAAwB,CAAC;GAC3B,mBAAmB,CA+B/B","sourcesContent":["import { customElement } from 'lit/decorators.js'\n\nimport { EFFECTIVE, IDENTITY, MasterPageBase, MasterSpec } from './master-page-base.js'\n\n/**\n * 설비가 섰을 때 고르는 사유. 이 값이 그 정지를 가동률에서 빼는지 정한다.\n *\n * 계획 정지(교체 · 정비)와 고장을 갈라 두어야 가동률이 뜻을 갖는다. 사유는 계층이라 큰 갈래 아래 작은 갈래를 둔다.\n *\n * 화면 골격과 저장은 MasterPageBase 가 갖는다. 이 파일은 **이 화면이 무엇을 보이나**만 말한다 —\n * 자기 인터페이스가 필요해지면 여기서 render 를 덮어쓴다.\n */\n@customElement('ops-master-stop-reason')\nexport class OpsMasterStopReason extends MasterPageBase {\n protected get spec(): MasterSpec {\n return {\n key: 'stopReason',\n title: 'stop-reason',\n help: 'ops-master/stop-reason',\n query: 'stopReasonList',\n mutation: 'updateMultipleStopReason',\n columns: [\n ...IDENTITY,\n { name: 'status', label: 'state', type: 'string', width: 130 },\n {\n name: 'parentName',\n label: 'parent-reason',\n type: 'reference',\n /*\n * **`stopReasonList` 이지 `stopReasons` 가 아니다.**\n *\n * 마스터 질의 열둘 중 `stopReasons` 하나만 `items` 없이 배열을 그대로 낸다. 고르기\n * 팝업은 `data.fetch.items` 를 읽으므로 그것을 가리키면 `Cannot read properties of\n * undefined (reading 'map')` 로 터진다 — 이 화면 자신이 목록을 뽑을 때 쓰는 이름이\n * `stopReasonList` 다. [확인함] 2026-09-04\n */\n reference: { queryName: 'stopReasonList' },\n width: 150\n },\n { name: 'detailRequired', label: 'detail-required', type: 'boolean', width: 110 },\n ...EFFECTIVE\n ]\n }\n }\n}\n"]}
@@ -0,0 +1,93 @@
1
+ import '@operato/data-grist/ox-grist.js';
2
+ import { MasterPageBase, MasterSpec } from './master-page-base.js';
3
+ /**
4
+ * 무엇을 어떻게 검사하나 — 항목과 상하한과 방법.
5
+ *
6
+ * 인원 등급과 자산 등급이 이것을 요구 검사로 가리킨다.
7
+ *
8
+ * ── 왜 이 축만 자기 화면을 갖나 ────────────────────────────────────────────
9
+ * 다른 축의 칸은 글자 · 숫자 · 날짜라서 공통 그리드 하나로 충분하다. 검사 명세는 다르다. **명세 하나가
10
+ * 기준 여럿을 갖는다.** 기준 하나는 이름 · 설명 · 측정 속성 · 하한 · 상한 · 단위 · 표현식을 갖는다.
11
+ *
12
+ * 그것을 한 칸에 JSON 원문으로 보이면 품질팀장이 상한을 40.5 로 고치려고 중괄호를 세게 된다. 그것은
13
+ * 기준 정보를 다루는 화면이 아니라 개발자가 JSON 을 손보는 화면이다. 실제로 한동안 그랬다.
14
+ *
15
+ * ── 화면은 JSON 을 모른다 ──────────────────────────────────────────────────
16
+ * 서버가 기준을 **행으로** 낸다(`testSpecificationCriteria`) 그리고 행으로 받는다
17
+ * (`updateTestSpecificationCriteria`). 옮김은 서버의 `criteria-rows.ts` 한 곳이 맡는다.
18
+ *
19
+ * 그래서 저장이 언젠가 표로 내려가도 **이 파일은 바뀌지 않는다.** 화면이 JSON 을 풀면 그날 이 코드가
20
+ * 통째로 버려진다.
21
+ *
22
+ * ── 위아래로 나눈다 ────────────────────────────────────────────────────────
23
+ * 위는 명세 목록, 아래는 **고른 명세의 기준**이다. 아무것도 안 고른 상태를 빈 표로 두지 않는다 —
24
+ * 빈 표는 「기준이 없는 명세」와 같아 보이고, 그러면 사람이 기준을 다시 적는다.
25
+ */
26
+ export declare class OpsMasterTestSpecification extends MasterPageBase {
27
+ static styles: import("lit").CSSResult[];
28
+ protected get spec(): MasterSpec;
29
+ /** 지금 고른 명세의 이름. 없으면 아래를 빈 표로 두지 않는다. */
30
+ private picked?;
31
+ /**
32
+ * 지금 체크된 명세들.
33
+ *
34
+ * 아래는 **하나의 기준만** 보이는데 위에서 여럿을 체크할 수 있다(명세 여럿을 한 번에 종료하는 데
35
+ * 쓴다). 그때 화면이 아무 말도 안 하면 보이는 기준이 **여럿을 합친 것**으로 읽힌다. 그래서 몇 개가
36
+ * 체크돼 있는지 세어 말한다.
37
+ */
38
+ private checked;
39
+ private criteriaGrist;
40
+ /**
41
+ * 아래 표에서 아직 저장하지 않은 기준이 몇 건인가.
42
+ *
43
+ * ── 왜 세어 보이나 (2026-09-05) ────────────────────────────────────────
44
+ * 이 화면은 표가 둘인데 「저장」은 하나다. 아래를 고쳐 놓고도 그것이 저장 대상인지 화면 어디에도
45
+ * 안 적혀 있었다. 「복잡한 편집인데 저장 버튼의 기능이 위험해 보인다」(사용자).
46
+ *
47
+ * 세어서 표 머리에 적으면 두 가지가 한꺼번에 풀린다. 저장을 누르기 전에 **무엇이 나가는지** 보이고,
48
+ * 다른 명세로 넘어가려 할 때 **버릴 것이 있다**는 사실도 보인다.
49
+ */
50
+ private dirtyCriteria;
51
+ private countDirtyCriteria;
52
+ /**
53
+ * 기준 표의 구성.
54
+ *
55
+ * **단위 칸을 좁히지 않는다.** `MMT`(mm) · `CEL`(℃) 같은 UN/CEFACT 코드가 들어가고, 잘리면
56
+ * 「무엇으로 잰 값인지」가 화면에서 사라진다.
57
+ */
58
+ private get criteriaConfig();
59
+ render(): import("lit-html").TemplateResult<1>;
60
+ /**
61
+ * 위에서 고른 줄이 아래를 정한다.
62
+ *
63
+ * ── detail 모양이 거터 설정에 따라 다르다 ─────────────────────────────────
64
+ * `gutter-row-selector.js` 를 보면 두 모양을 낸다.
65
+ *
66
+ * ```
67
+ * multiple: true { added: [record], removed: [] } ← 이 화면이 쓰는 것
68
+ * 그 밖 { records: [record] }
69
+ * ```
70
+ *
71
+ * 한쪽만 읽으면 **오류보고없이 아무것도 안 골라진다.** 오류가 나지 않고 아래 표만 영원히 안내 문구로
72
+ * 남는다. 처음에 `records` 만 읽어서 실제로 그랬다. 그리드가 세우는 `__selected__` 를 읽는 방법도
73
+ * 있는데, 그 표시는 이 화면에 오지 않았다. 그래서 **둘 다 읽는다.**
74
+ *
75
+ * 여럿 고르면 마지막에 고른 것을 본다. 아래는 명세 하나의 기준을 보이는 자리라 둘을 함께 보일 수
76
+ * 없고, 아무 것이나 고르면 사람은 그것이 무엇의 기준인지 모른다.
77
+ */
78
+ private pick;
79
+ /**
80
+ * 고른 명세의 기준을 읽는다.
81
+ *
82
+ * 못 읽으면 **빈 목록으로 바꾸지 않는다.** 빈 목록은 「기준이 없다」와 같아 보이고, 그러면 사람이
83
+ * 기준을 다시 적어 넣는다. 무엇이 잘못됐는지 말하고 비운다.
84
+ */
85
+ private fetchCriteria;
86
+ /**
87
+ * 저장 — **위와 아래를 따로 낸다.**
88
+ *
89
+ * 명세 자체(이름 · 버전 · 유효 기간)는 공통 규칙이 저장하고, 기준은 이 축의 뮤테이션이 저장한다.
90
+ * 기준이 막히면 **명세 쪽도 되돌린다.** 절반만 저장되면 화면과 저장된 것이 달라진다.
91
+ */
92
+ protected save(): Promise<void>;
93
+ }