@things-factory/ops-master 10.0.18 → 10.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) 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 -169
  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 +12 -2
  111. package/dist-server/service/index.js +21 -1
  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.d.ts +1 -1
  123. package/dist-server/service/master-axis.js +16 -1
  124. package/dist-server/service/master-axis.js.map +1 -1
  125. package/dist-server/service/master-conformance-resolver.d.ts +34 -0
  126. package/dist-server/service/master-conformance-resolver.js +143 -0
  127. package/dist-server/service/master-conformance-resolver.js.map +1 -0
  128. package/dist-server/service/master-conformance.d.ts +80 -0
  129. package/dist-server/service/master-conformance.js +266 -0
  130. package/dist-server/service/master-conformance.js.map +1 -0
  131. package/dist-server/service/master-page-query.d.ts +33 -0
  132. package/dist-server/service/master-page-query.js +55 -0
  133. package/dist-server/service/master-page-query.js.map +1 -0
  134. package/dist-server/service/master-page.d.ts +85 -0
  135. package/dist-server/service/master-page.js +104 -0
  136. package/dist-server/service/master-page.js.map +1 -0
  137. package/dist-server/service/material/material-class.js +1 -1
  138. package/dist-server/service/material/material-class.js.map +1 -1
  139. package/dist-server/service/material/material-definition.js +2 -2
  140. package/dist-server/service/material/material-definition.js.map +1 -1
  141. package/dist-server/service/material/material-master-resolver.d.ts +62 -0
  142. package/dist-server/service/material/material-master-resolver.js +213 -0
  143. package/dist-server/service/material/material-master-resolver.js.map +1 -1
  144. package/dist-server/service/material/material-query.d.ts +9 -1
  145. package/dist-server/service/material/material-query.js +28 -6
  146. package/dist-server/service/material/material-query.js.map +1 -1
  147. package/dist-server/service/material/recipe-index.d.ts +23 -0
  148. package/dist-server/service/material/recipe-index.js +44 -0
  149. package/dist-server/service/material/recipe-index.js.map +1 -0
  150. package/dist-server/service/operation/index.d.ts +2 -1
  151. package/dist-server/service/operation/index.js +2 -1
  152. package/dist-server/service/operation/index.js.map +1 -1
  153. package/dist-server/service/operation/operation-definition.d.ts +1 -1
  154. package/dist-server/service/operation/operation-definition.js +4 -4
  155. package/dist-server/service/operation/operation-definition.js.map +1 -1
  156. package/dist-server/service/operation/operation-master-resolver.d.ts +24 -0
  157. package/dist-server/service/operation/operation-master-resolver.js +107 -0
  158. package/dist-server/service/operation/operation-master-resolver.js.map +1 -1
  159. package/dist-server/service/operation/operation-query.d.ts +10 -2
  160. package/dist-server/service/operation/operation-query.js +25 -10
  161. package/dist-server/service/operation/operation-query.js.map +1 -1
  162. package/dist-server/service/operation/operation-readiness-resolver.d.ts +39 -0
  163. package/dist-server/service/operation/operation-readiness-resolver.js +111 -0
  164. package/dist-server/service/operation/operation-readiness-resolver.js.map +1 -0
  165. package/dist-server/service/operation/operation-readiness.d.ts +34 -0
  166. package/dist-server/service/operation/operation-readiness.js +133 -0
  167. package/dist-server/service/operation/operation-readiness.js.map +1 -0
  168. package/dist-server/service/personnel/person.js +3 -3
  169. package/dist-server/service/personnel/person.js.map +1 -1
  170. package/dist-server/service/personnel/personnel-class-readiness.d.ts +22 -0
  171. package/dist-server/service/personnel/personnel-class-readiness.js +98 -0
  172. package/dist-server/service/personnel/personnel-class-readiness.js.map +1 -0
  173. package/dist-server/service/personnel/personnel-class.d.ts +1 -1
  174. package/dist-server/service/personnel/personnel-class.js +2 -2
  175. package/dist-server/service/personnel/personnel-class.js.map +1 -1
  176. package/dist-server/service/personnel/personnel-master-resolver.d.ts +9 -0
  177. package/dist-server/service/personnel/personnel-master-resolver.js +43 -0
  178. package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -1
  179. package/dist-server/service/personnel/personnel-master.js +1 -1
  180. package/dist-server/service/personnel/personnel-master.js.map +1 -1
  181. package/dist-server/service/personnel/personnel-query.d.ts +9 -1
  182. package/dist-server/service/personnel/personnel-query.js +28 -6
  183. package/dist-server/service/personnel/personnel-query.js.map +1 -1
  184. package/dist-server/service/personnel/qualification.d.ts +7 -0
  185. package/dist-server/service/personnel/qualification.js +25 -0
  186. package/dist-server/service/personnel/qualification.js.map +1 -1
  187. package/dist-server/service/recipe/index.d.ts +9 -0
  188. package/dist-server/service/recipe/index.js +14 -0
  189. package/dist-server/service/recipe/index.js.map +1 -0
  190. package/dist-server/service/recipe/recipe-definition.d.ts +71 -0
  191. package/dist-server/service/recipe/recipe-definition.js +130 -0
  192. package/dist-server/service/recipe/recipe-definition.js.map +1 -0
  193. package/dist-server/service/recipe/recipe-master-resolver.d.ts +28 -0
  194. package/dist-server/service/recipe/recipe-master-resolver.js +124 -0
  195. package/dist-server/service/recipe/recipe-master-resolver.js.map +1 -0
  196. package/dist-server/service/recipe/recipe-master.d.ts +37 -0
  197. package/dist-server/service/recipe/recipe-master.js +47 -0
  198. package/dist-server/service/recipe/recipe-master.js.map +1 -0
  199. package/dist-server/service/recipe/recipe-query.d.ts +21 -0
  200. package/dist-server/service/recipe/recipe-query.js +75 -0
  201. package/dist-server/service/recipe/recipe-query.js.map +1 -0
  202. package/dist-server/service/recipe/route-definition.d.ts +51 -0
  203. package/dist-server/service/recipe/route-definition.js +113 -0
  204. package/dist-server/service/recipe/route-definition.js.map +1 -0
  205. package/dist-server/service/resource/class-lineage.d.ts +46 -0
  206. package/dist-server/service/resource/class-lineage.js +80 -0
  207. package/dist-server/service/resource/class-lineage.js.map +1 -0
  208. package/dist-server/service/resource/class-members.d.ts +36 -0
  209. package/dist-server/service/resource/class-members.js +50 -0
  210. package/dist-server/service/resource/class-members.js.map +1 -0
  211. package/dist-server/service/resource/referrers.d.ts +54 -0
  212. package/dist-server/service/resource/referrers.js +99 -0
  213. package/dist-server/service/resource/referrers.js.map +1 -0
  214. package/dist-server/service/status/master-status.d.ts +0 -7
  215. package/dist-server/service/status/master-status.js +5 -6
  216. package/dist-server/service/status/master-status.js.map +1 -1
  217. package/dist-server/service/test-spec/criteria-check.d.ts +53 -0
  218. package/dist-server/service/test-spec/criteria-check.js +142 -0
  219. package/dist-server/service/test-spec/criteria-check.js.map +1 -0
  220. package/dist-server/service/test-spec/criteria-rows.d.ts +89 -0
  221. package/dist-server/service/test-spec/criteria-rows.js +139 -0
  222. package/dist-server/service/test-spec/criteria-rows.js.map +1 -0
  223. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +33 -7
  224. package/dist-server/service/test-spec/test-spec-master-resolver.js +137 -2
  225. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -1
  226. package/dist-server/service/test-spec/test-spec-query.d.ts +9 -1
  227. package/dist-server/service/test-spec/test-spec-query.js +23 -9
  228. package/dist-server/service/test-spec/test-spec-query.js.map +1 -1
  229. package/dist-server/service/test-spec/test-specification.js +1 -1
  230. package/dist-server/service/test-spec/test-specification.js.map +1 -1
  231. package/dist-server/tsconfig.tsbuildinfo +1 -1
  232. package/helps/ops-master/equipment-class.ko.md +11 -0
  233. package/helps/ops-master/equipment-class.md +11 -0
  234. package/helps/ops-master/equipment.ko.md +11 -0
  235. package/helps/ops-master/equipment.md +11 -0
  236. package/helps/ops-master/material-class.ko.md +11 -0
  237. package/helps/ops-master/material-class.md +11 -0
  238. package/helps/ops-master/material-definition.ko.md +11 -0
  239. package/helps/ops-master/material-definition.md +11 -0
  240. package/helps/ops-master/operation-definition.ko.md +11 -0
  241. package/helps/ops-master/operation-definition.md +11 -0
  242. package/helps/ops-master/operational-location.ko.md +11 -0
  243. package/helps/ops-master/operational-location.md +11 -0
  244. package/helps/ops-master/person.ko.md +11 -0
  245. package/helps/ops-master/person.md +11 -0
  246. package/helps/ops-master/personnel-class.ko.md +11 -0
  247. package/helps/ops-master/personnel-class.md +11 -0
  248. package/helps/ops-master/physical-asset-class.ko.md +11 -0
  249. package/helps/ops-master/physical-asset-class.md +11 -0
  250. package/helps/ops-master/physical-asset.ko.md +11 -0
  251. package/helps/ops-master/physical-asset.md +11 -0
  252. package/helps/ops-master/recipe-definition.ko.md +11 -0
  253. package/helps/ops-master/recipe-definition.md +11 -0
  254. package/helps/ops-master/route-definition.ko.md +11 -0
  255. package/helps/ops-master/route-definition.md +11 -0
  256. package/helps/ops-master/stop-reason.ko.md +11 -0
  257. package/helps/ops-master/stop-reason.md +11 -0
  258. package/helps/ops-master/test-specification.ko.md +11 -0
  259. package/helps/ops-master/test-specification.md +11 -0
  260. package/package.json +5 -5
  261. package/things-factory.config.js +22 -2
  262. package/translations/en.json +89 -6
  263. package/translations/ja.json +96 -1
  264. package/translations/ko.json +96 -13
  265. package/translations/ms.json +96 -1
  266. package/translations/zh.json +96 -1
  267. package/dist-client/pages/master-list.d.ts +0 -68
  268. package/dist-client/pages/master-list.js +0 -267
  269. package/dist-client/pages/master-list.js.map +0 -1
@@ -1,267 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import '@material/web/icon/icon.js';
3
- import '@operato/data-grist/ox-grist.js';
4
- import '@operato/data-grist/ox-filters-form.js';
5
- import '@operato/context/ox-context-page-toolbar.js';
6
- import gql from 'graphql-tag';
7
- import { css, html } from 'lit';
8
- import { customElement, property, query, state } from 'lit/decorators.js';
9
- import { DataGrist } from '@operato/data-grist';
10
- import { client } from '@operato/graphql';
11
- import { i18next, localize } from '@operato/i18n';
12
- import { notify } from '@operato/layout';
13
- import { p13n } from '@operato/p13n';
14
- import { PageView } from '@operato/shell';
15
- import { CommonGristStyles, CommonHeaderStyles, ScrollbarStyles } from '@operato/styles';
16
- import { isMobileDevice } from '@operato/utils';
17
- import { MASTER_AXIS_VIEWS, masterAxisViewOf } from './master-axes';
18
- /**
19
- * 마스터 화면 하나가 **열두 축을 다 맡는다.**
20
- *
21
- * 축은 주소의 질의로 받는다(`ops-master-list?axis=person`). 메뉴가 축마다 한 줄씩 걸고, 화면은 그
22
- * 하나다 — 규칙을 고칠 때 한 곳만 고치면 열두 축이 함께 바뀐다.
23
- *
24
- * ── 마스터는 그리드에서 고친다 ─────────────────────────────────────────────
25
- * 업무 기록(실적 · 검사 · 처분)은 조회 전용이다. 일어난 일을 나중에 고치면 「그때 무엇이 있었나」가
26
- * 사라진다. 마스터는 **선언**이라 다르다 — 지금의 규정이 무엇인지가 답이고, 규정은 바뀐다.
27
- *
28
- * ── 없앨 때 지우지 않는다 ──────────────────────────────────────────────────
29
- * 지운 행은 서버가 유효 기간의 끝을 채워 오늘부터 유효하지 않게 만든다. 실제로 지우면 그것을 가리키던
30
- * 지난 실적이 가리킬 것을 잃는다. 화면은 그 사실을 말해 준다 — 지운 줄 알았는데 목록에 남아 있으면
31
- * 사용자가 저장이 안 된 것으로 읽는다.
32
- */
33
- let OpsMasterList = class OpsMasterList extends p13n(localize(i18next)(PageView)) {
34
- constructor() {
35
- super(...arguments);
36
- this.active = false;
37
- this.mode = isMobileDevice() ? 'CARD' : 'GRID';
38
- this.loaded = 0;
39
- }
40
- static { this.styles = [
41
- CommonGristStyles,
42
- CommonHeaderStyles,
43
- ScrollbarStyles,
44
- css `
45
- :host {
46
- display: flex;
47
- flex-direction: column;
48
- overflow: hidden;
49
- }
50
-
51
- ox-grist {
52
- overflow-y: auto;
53
- flex: 1;
54
- }
55
-
56
- .scale {
57
- padding: var(--spacing-small) var(--spacing-large);
58
- color: var(--md-sys-color-on-surface-variant);
59
- font-size: 0.85rem;
60
- }
61
-
62
- .scale[data-capped] {
63
- color: var(--status-warning-color);
64
- }
65
- `
66
- ]; }
67
- get context() {
68
- return {
69
- title: this.axis ? i18next.t(`title.${this.axis.title}`) : i18next.t('title.master'),
70
- search: {
71
- handler: (search) => {
72
- this.grist.searchText = search;
73
- },
74
- value: this.grist?.searchText || ''
75
- },
76
- filter: {
77
- handler: () => {
78
- this.grist.toggleHeadroom();
79
- }
80
- },
81
- actions: [
82
- {
83
- title: i18next.t('button.save'),
84
- action: this.save.bind(this),
85
- icon: 'save'
86
- }
87
- ],
88
- exportable: {
89
- name: this.axis ? i18next.t(`title.${this.axis.title}`) : i18next.t('title.master'),
90
- data: () => this.grist.exportRecords()
91
- }
92
- };
93
- }
94
- render() {
95
- if (!this.axis) {
96
- /* 어느 축인지 모르면 빈 그리드를 보이지 않는다 — 빈 목록과 「축을 못 찾았다」가 구별되지 않는다. */
97
- return html `<div class="scale">${i18next.t('text.master-axis-unknown')}</div>`;
98
- }
99
- return html `
100
- <ox-grist .mode=${this.mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
101
- <div slot="headroom" class="header">
102
- <div class="title">${i18next.t(`title.${this.axis.title}`)}</div>
103
- <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
104
- </div>
105
- </ox-grist>
106
-
107
- ${this.scaleNotice()}
108
- `;
109
- }
110
- scaleNotice() {
111
- if (this.total === undefined) {
112
- return html `<div class="scale">${i18next.t('text.loaded-count', { loaded: this.loaded })}</div>`;
113
- }
114
- const capped = this.loaded < this.total;
115
- return html `
116
- <div class="scale" ?data-capped=${capped}>
117
- ${capped
118
- ? i18next.t('text.loaded-of-total-more', { loaded: this.loaded, total: this.total })
119
- : i18next.t('text.loaded-of-total', { loaded: this.loaded, total: this.total })}
120
- </div>
121
- `;
122
- }
123
- /** 주소가 바뀌면 축이 바뀐다. 셸이 이 훅으로 알려 준다. */
124
- async pageUpdated(changes, lifecycle) {
125
- const key = new URLSearchParams(lifecycle?.params ?? location.search).get('axis') ?? MASTER_AXIS_VIEWS[0].key;
126
- const axis = masterAxisViewOf(key);
127
- if (axis?.key === this.axis?.key) {
128
- return;
129
- }
130
- this.axis = axis;
131
- this.total = undefined;
132
- this.loaded = 0;
133
- if (axis) {
134
- this.gristConfig = this.configOf(axis);
135
- await this.updateComplete;
136
- this.grist?.fetch();
137
- }
138
- }
139
- configOf(axis) {
140
- return {
141
- list: { fields: ['name', 'description'], details: [] },
142
- columns: [
143
- { type: 'gutter', gutterName: 'sequence' },
144
- { type: 'gutter', gutterName: 'row-selector', multiple: true },
145
- ...axis.columns.map(column => this.columnOf(column))
146
- ],
147
- /* 새 행을 만들 수 있다 — 마스터를 채우는 것이 이 화면의 일이다. */
148
- rows: { appendable: true, selectable: { multiple: true } },
149
- sorters: [{ name: 'name', desc: false }]
150
- };
151
- }
152
- columnOf(column) {
153
- const header = i18next.t(`field.${column.label}`);
154
- const editable = !column.readonly;
155
- switch (column.type) {
156
- case 'number':
157
- return { type: 'float', name: column.name, header, record: { editable }, sortable: true, width: column.width };
158
- case 'boolean':
159
- return { type: 'boolean', name: column.name, header, record: { editable }, width: column.width };
160
- case 'date':
161
- return { type: 'datetime', name: column.name, header, record: { editable }, sortable: true, width: column.width };
162
- /*
163
- * 목록과 JSON 은 **글자로 고친다.** 전용 편집기를 만들면 축마다 다른 편집기가 생기고, 그 편집기가
164
- * 모르는 칸이 들어오면 값이 오류 보고 없이 사라진다. 지금은 있는 그대로 보이고 그대로 고친다.
165
- */
166
- case 'list':
167
- case 'json':
168
- return { type: 'string', name: column.name, header, record: { editable }, width: column.width };
169
- default:
170
- return {
171
- type: 'string',
172
- name: column.name,
173
- header,
174
- record: { editable },
175
- filter: 'search',
176
- sortable: true,
177
- width: column.width
178
- };
179
- }
180
- }
181
- async fetchHandler({ page = 1, limit = 50, sortings = [], filters = [] }) {
182
- if (!this.axis) {
183
- return { total: 0, records: [] };
184
- }
185
- const fields = this.axis.columns.map(column => column.name).join('\n');
186
- const response = await client.query({
187
- query: gql `
188
- query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
189
- ${this.axis.query}(filters: $filters, pagination: $pagination, sortings: $sortings) {
190
- items {
191
- id
192
- ${fields}
193
- }
194
- total
195
- }
196
- }
197
- `,
198
- variables: { filters, pagination: { page, limit }, sortings },
199
- fetchPolicy: 'no-cache'
200
- });
201
- const payload = response.data?.[this.axis.query];
202
- const items = payload?.items ?? [];
203
- const total = payload?.total;
204
- this.loaded = items.length;
205
- this.total = typeof total === 'number' ? total : undefined;
206
- return { total: total ?? 0, records: items };
207
- }
208
- async save() {
209
- if (!this.axis) {
210
- return;
211
- }
212
- const patches = this.grist.dirtyRecords;
213
- if (!patches?.length) {
214
- notify({ message: i18next.t('text.nothing-changed'), level: 'info' });
215
- return;
216
- }
217
- await client.mutate({
218
- mutation: gql `
219
- mutation ($patches: [ScalarObject!]!) {
220
- ${this.axis.mutation}(patches: $patches) {
221
- id
222
- name
223
- }
224
- }
225
- `,
226
- variables: { patches }
227
- });
228
- /* 지운 행은 사라지지 않고 유효 기간의 끝이 채워진다. 말해 주지 않으면 저장이 안 된 것으로 읽는다. */
229
- if (patches.some((patch) => String(patch.cuFlag).toUpperCase() === '-')) {
230
- notify({ message: i18next.t('text.retired-not-deleted'), level: 'info' });
231
- }
232
- this.grist.fetch();
233
- }
234
- };
235
- __decorate([
236
- property({ type: Boolean }),
237
- __metadata("design:type", Boolean)
238
- ], OpsMasterList.prototype, "active", void 0);
239
- __decorate([
240
- property({ type: Object }),
241
- __metadata("design:type", Object)
242
- ], OpsMasterList.prototype, "gristConfig", void 0);
243
- __decorate([
244
- property({ type: String }),
245
- __metadata("design:type", String)
246
- ], OpsMasterList.prototype, "mode", void 0);
247
- __decorate([
248
- state(),
249
- __metadata("design:type", Object)
250
- ], OpsMasterList.prototype, "axis", void 0);
251
- __decorate([
252
- state(),
253
- __metadata("design:type", Number)
254
- ], OpsMasterList.prototype, "total", void 0);
255
- __decorate([
256
- state(),
257
- __metadata("design:type", Object)
258
- ], OpsMasterList.prototype, "loaded", void 0);
259
- __decorate([
260
- query('ox-grist'),
261
- __metadata("design:type", DataGrist)
262
- ], OpsMasterList.prototype, "grist", void 0);
263
- OpsMasterList = __decorate([
264
- customElement('ops-master-list')
265
- ], OpsMasterList);
266
- export { OpsMasterList };
267
- //# sourceMappingURL=master-list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"master-list.js","sourceRoot":"","sources":["../../client/pages/master-list.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AAEnC,OAAO,iCAAiC,CAAA;AACxC,OAAO,wCAAwC,CAAA;AAC/C,OAAO,6CAA6C,CAAA;AAEpD,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,EAAc,iBAAiB,EAAkB,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAE/F;;;;;;;;;;;;;;GAcG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;IAA7D;;QA6BwB,WAAM,GAAY,KAAK,CAAA;QAExB,SAAI,GAA6B,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;QAI9E,WAAM,GAAG,CAAC,CAAA;IAmM7B,CAAC;aArOQ,WAAM,GAAG;QACd,iBAAiB;QACjB,kBAAkB;QAClB,eAAe;QACf,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;KAqBF;KACF,AA1BY,CA0BZ;IAYD,IAAI,OAAO;QACT,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;YACpF,MAAM,EAAE;gBACN,OAAO,EAAE,CAAC,MAAc,EAAE,EAAE;oBAC1B,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAA;gBAChC,CAAC;gBACD,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE;aACpC;YACD,MAAM,EAAE;gBACN,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAA;gBAC7B,CAAC;aACF;YACD,OAAO,EAAE;gBACP;oBACE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBAC/B,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC5B,IAAI,EAAE,MAAM;iBACb;aACF;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;gBACnF,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;aACvC;SACF,CAAA;IACH,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,6DAA6D;YAC7D,OAAO,IAAI,CAAA,sBAAsB,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAA;QAChF,CAAC;QAED,OAAO,IAAI,CAAA;wBACS,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,WAAW,kBAAkB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;+BAE5E,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;8DACN,IAAI,CAAC,OAAO;;;;QAIlE,IAAI,CAAC,WAAW,EAAE;KACrB,CAAA;IACH,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAA,sBAAsB,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAA;QAClG,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAA;QAEvC,OAAO,IAAI,CAAA;wCACyB,MAAM;UACpC,MAAM;YACN,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YACpF,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;KAEpF,CAAA;IACH,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,WAAW,CAAC,OAAY,EAAE,SAAc;QAC5C,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,SAAS,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QAC7G,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAElC,IAAI,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;YACjC,OAAM;QACR,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAA;QACtB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;QAEf,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YACtC,MAAM,IAAI,CAAC,cAAc,CAAA;YACzB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAA;QACrB,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,IAAoB;QACnC,OAAO;YACL,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YACtD,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC9D,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACrD;YACD,2CAA2C;YAC3C,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YAC1D,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;SACzC,CAAA;IACH,CAAC;IAEO,QAAQ,CAAC,MAAkB;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QACjD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAA;QAEjC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,QAAQ;gBACX,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;YAChH,KAAK,SAAS;gBACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;YAClG,KAAK,MAAM;gBACT,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;YACnH;;;eAGG;YACH,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM;gBACT,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;YACjG;gBACE,OAAO;oBACL,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,MAAM;oBACN,MAAM,EAAE,EAAE,QAAQ,EAAE;oBACpB,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,CAAA;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAe;QACnF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;QAClC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEtE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE,GAAG,CAAA;;YAEJ,IAAI,CAAC,IAAI,CAAC,KAAK;;;gBAGX,MAAM;;;;;OAKf;YACD,SAAS,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE;YAC7D,WAAW,EAAE,UAAU;SACxB,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAA;QAClC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAA;QAE5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;QAC1B,IAAI,CAAC,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;QAE1D,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC9C,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAA;QAEvC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YACrE,OAAM;QACR,CAAC;QAED,MAAM,MAAM,CAAC,MAAM,CAAC;YAClB,QAAQ,EAAE,GAAG,CAAA;;YAEP,IAAI,CAAC,IAAI,CAAC,QAAQ;;;;;OAKvB;YACD,SAAS,EAAE,EAAE,OAAO,EAAE;SACvB,CAAC,CAAA;QAEF,8DAA8D;QAC9D,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;YAC7E,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAC3E,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;;AAxM4B;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;6CAAwB;AACxB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;kDAAiB;AAChB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;2CAAoE;AAE9E;IAAhB,KAAK,EAAE;;2CAA8B;AACrB;IAAhB,KAAK,EAAE;;4CAAuB;AACd;IAAhB,KAAK,EAAE;;6CAAmB;AAEA;IAA1B,KAAK,CAAC,UAAU,CAAC;8BAAiB,SAAS;4CAAA;AArCjC,aAAa;IADzB,aAAa,CAAC,iBAAiB,CAAC;GACpB,aAAa,CAsOzB","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport '@operato/data-grist/ox-grist.js'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '@operato/context/ox-context-page-toolbar.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify } from '@operato/layout'\nimport { p13n } from '@operato/p13n'\nimport { PageView } from '@operato/shell'\nimport { CommonGristStyles, CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\n\nimport { AxisColumn, MASTER_AXIS_VIEWS, MasterAxisView, masterAxisViewOf } from './master-axes'\n\n/**\n * 마스터 화면 하나가 **열두 축을 다 맡는다.**\n *\n * 축은 주소의 질의로 받는다(`ops-master-list?axis=person`). 메뉴가 축마다 한 줄씩 걸고, 화면은 그\n * 하나다 — 규칙을 고칠 때 한 곳만 고치면 열두 축이 함께 바뀐다.\n *\n * ── 마스터는 그리드에서 고친다 ─────────────────────────────────────────────\n * 업무 기록(실적 · 검사 · 처분)은 조회 전용이다. 일어난 일을 나중에 고치면 「그때 무엇이 있었나」가\n * 사라진다. 마스터는 **선언**이라 다르다 — 지금의 규정이 무엇인지가 답이고, 규정은 바뀐다.\n *\n * ── 없앨 때 지우지 않는다 ──────────────────────────────────────────────────\n * 지운 행은 서버가 유효 기간의 끝을 채워 오늘부터 유효하지 않게 만든다. 실제로 지우면 그것을 가리키던\n * 지난 실적이 가리킬 것을 잃는다. 화면은 그 사실을 말해 준다 — 지운 줄 알았는데 목록에 남아 있으면\n * 사용자가 저장이 안 된 것으로 읽는다.\n */\n@customElement('ops-master-list')\nexport class OpsMasterList extends p13n(localize(i18next)(PageView)) {\n static styles = [\n CommonGristStyles,\n CommonHeaderStyles,\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n ox-grist {\n overflow-y: auto;\n flex: 1;\n }\n\n .scale {\n padding: var(--spacing-small) var(--spacing-large);\n color: var(--md-sys-color-on-surface-variant);\n font-size: 0.85rem;\n }\n\n .scale[data-capped] {\n color: var(--status-warning-color);\n }\n `\n ]\n\n @property({ type: Boolean }) active: boolean = false\n @property({ type: Object }) gristConfig: any\n @property({ type: String }) mode: 'CARD' | 'LIST' | 'GRID' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @state() private axis?: MasterAxisView\n @state() private total?: number\n @state() private loaded = 0\n\n @query('ox-grist') private grist!: DataGrist\n\n get context() {\n return {\n title: this.axis ? i18next.t(`title.${this.axis.title}`) : i18next.t('title.master'),\n search: {\n handler: (search: string) => {\n this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n filter: {\n handler: () => {\n this.grist.toggleHeadroom()\n }\n },\n actions: [\n {\n title: i18next.t('button.save'),\n action: this.save.bind(this),\n icon: 'save'\n }\n ],\n exportable: {\n name: this.axis ? i18next.t(`title.${this.axis.title}`) : i18next.t('title.master'),\n data: () => this.grist.exportRecords()\n }\n }\n }\n\n render() {\n if (!this.axis) {\n /* 어느 축인지 모르면 빈 그리드를 보이지 않는다 — 빈 목록과 「축을 못 찾았다」가 구별되지 않는다. */\n return html`<div class=\"scale\">${i18next.t('text.master-axis-unknown')}</div>`\n }\n\n return html`\n <ox-grist .mode=${this.mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>\n <div slot=\"headroom\" class=\"header\">\n <div class=\"title\">${i18next.t(`title.${this.axis.title}`)}</div>\n <ox-context-page-toolbar class=\"actions\" .context=${this.context}></ox-context-page-toolbar>\n </div>\n </ox-grist>\n\n ${this.scaleNotice()}\n `\n }\n\n private scaleNotice() {\n if (this.total === undefined) {\n return html`<div class=\"scale\">${i18next.t('text.loaded-count', { loaded: this.loaded })}</div>`\n }\n\n const capped = this.loaded < this.total\n\n return html`\n <div class=\"scale\" ?data-capped=${capped}>\n ${capped\n ? i18next.t('text.loaded-of-total-more', { loaded: this.loaded, total: this.total })\n : i18next.t('text.loaded-of-total', { loaded: this.loaded, total: this.total })}\n </div>\n `\n }\n\n /** 주소가 바뀌면 축이 바뀐다. 셸이 이 훅으로 알려 준다. */\n async pageUpdated(changes: any, lifecycle: any) {\n const key = new URLSearchParams(lifecycle?.params ?? location.search).get('axis') ?? MASTER_AXIS_VIEWS[0].key\n const axis = masterAxisViewOf(key)\n\n if (axis?.key === this.axis?.key) {\n return\n }\n\n this.axis = axis\n this.total = undefined\n this.loaded = 0\n\n if (axis) {\n this.gristConfig = this.configOf(axis)\n await this.updateComplete\n this.grist?.fetch()\n }\n }\n\n private configOf(axis: MasterAxisView) {\n return {\n list: { fields: ['name', 'description'], details: [] },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n ...axis.columns.map(column => this.columnOf(column))\n ],\n /* 새 행을 만들 수 있다 — 마스터를 채우는 것이 이 화면의 일이다. */\n rows: { appendable: true, selectable: { multiple: true } },\n sorters: [{ name: 'name', desc: false }]\n }\n }\n\n private columnOf(column: AxisColumn) {\n const header = i18next.t(`field.${column.label}`)\n const editable = !column.readonly\n\n switch (column.type) {\n case 'number':\n return { type: 'float', name: column.name, header, record: { editable }, sortable: true, width: column.width }\n case 'boolean':\n return { type: 'boolean', name: column.name, header, record: { editable }, width: column.width }\n case 'date':\n return { type: 'datetime', name: column.name, header, record: { editable }, sortable: true, width: column.width }\n /*\n * 목록과 JSON 은 **글자로 고친다.** 전용 편집기를 만들면 축마다 다른 편집기가 생기고, 그 편집기가\n * 모르는 칸이 들어오면 값이 오류 보고 없이 사라진다. 지금은 있는 그대로 보이고 그대로 고친다.\n */\n case 'list':\n case 'json':\n return { type: 'string', name: column.name, header, record: { editable }, width: column.width }\n default:\n return {\n type: 'string',\n name: column.name,\n header,\n record: { editable },\n filter: 'search',\n sortable: true,\n width: column.width\n }\n }\n }\n\n async fetchHandler({ page = 1, limit = 50, sortings = [], filters = [] }: FetchOption) {\n if (!this.axis) {\n return { total: 0, records: [] }\n }\n\n const fields = this.axis.columns.map(column => column.name).join('\\n')\n\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n ${this.axis.query}(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n ${fields}\n }\n total\n }\n }\n `,\n variables: { filters, pagination: { page, limit }, sortings },\n fetchPolicy: 'no-cache'\n })\n\n const payload = response.data?.[this.axis.query]\n const items = payload?.items ?? []\n const total = payload?.total\n\n this.loaded = items.length\n this.total = typeof total === 'number' ? total : undefined\n\n return { total: total ?? 0, records: items }\n }\n\n private async save() {\n if (!this.axis) {\n return\n }\n\n const patches = this.grist.dirtyRecords\n\n if (!patches?.length) {\n notify({ message: i18next.t('text.nothing-changed'), level: 'info' })\n return\n }\n\n await client.mutate({\n mutation: gql`\n mutation ($patches: [ScalarObject!]!) {\n ${this.axis.mutation}(patches: $patches) {\n id\n name\n }\n }\n `,\n variables: { patches }\n })\n\n /* 지운 행은 사라지지 않고 유효 기간의 끝이 채워진다. 말해 주지 않으면 저장이 안 된 것으로 읽는다. */\n if (patches.some((patch: any) => String(patch.cuFlag).toUpperCase() === '-')) {\n notify({ message: i18next.t('text.retired-not-deleted'), level: 'info' })\n }\n\n this.grist.fetch()\n }\n}\n"]}