@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.
- package/dist-client/bootstrap.d.ts +18 -0
- package/dist-client/bootstrap.js +36 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/index.d.ts +15 -1
- package/dist-client/index.js +18 -1
- package/dist-client/index.js.map +1 -1
- package/dist-client/pages/master/equipment-class.d.ts +12 -0
- package/dist-client/pages/master/equipment-class.js +42 -0
- package/dist-client/pages/master/equipment-class.js.map +1 -0
- package/dist-client/pages/master/equipment.d.ts +12 -0
- package/dist-client/pages/master/equipment.js +57 -0
- package/dist-client/pages/master/equipment.js.map +1 -0
- package/dist-client/pages/master/grist-iso-duration.d.ts +20 -0
- package/dist-client/pages/master/grist-iso-duration.js +70 -0
- package/dist-client/pages/master/grist-iso-duration.js.map +1 -0
- package/dist-client/pages/master/grist-reference.d.ts +91 -0
- package/dist-client/pages/master/grist-reference.js +419 -0
- package/dist-client/pages/master/grist-reference.js.map +1 -0
- package/dist-client/pages/master/import-rows.d.ts +35 -0
- package/dist-client/pages/master/import-rows.js +66 -0
- package/dist-client/pages/master/import-rows.js.map +1 -0
- package/dist-client/pages/master/iso-duration.d.ts +34 -0
- package/dist-client/pages/master/iso-duration.js +76 -0
- package/dist-client/pages/master/iso-duration.js.map +1 -0
- package/dist-client/pages/master/master-options.d.ts +33 -0
- package/dist-client/pages/master/master-options.js +47 -0
- package/dist-client/pages/master/master-options.js.map +1 -0
- package/dist-client/pages/master/master-page-base.d.ts +357 -0
- package/dist-client/pages/master/master-page-base.js +626 -0
- package/dist-client/pages/master/master-page-base.js.map +1 -0
- package/dist-client/pages/master/material-class.d.ts +12 -0
- package/dist-client/pages/master/material-class.js +42 -0
- package/dist-client/pages/master/material-class.js.map +1 -0
- package/dist-client/pages/master/material-definition.d.ts +12 -0
- package/dist-client/pages/master/material-definition.js +62 -0
- package/dist-client/pages/master/material-definition.js.map +1 -0
- package/dist-client/pages/master/operation-definition.d.ts +12 -0
- package/dist-client/pages/master/operation-definition.js +49 -0
- package/dist-client/pages/master/operation-definition.js.map +1 -0
- package/dist-client/pages/master/operational-location.d.ts +84 -0
- package/dist-client/pages/master/operational-location.js +426 -0
- package/dist-client/pages/master/operational-location.js.map +1 -0
- package/dist-client/pages/master/person.d.ts +12 -0
- package/dist-client/pages/master/person.js +41 -0
- package/dist-client/pages/master/person.js.map +1 -0
- package/dist-client/pages/master/personnel-class.d.ts +12 -0
- package/dist-client/pages/master/personnel-class.js +43 -0
- package/dist-client/pages/master/personnel-class.js.map +1 -0
- package/dist-client/pages/master/physical-asset-class.d.ts +12 -0
- package/dist-client/pages/master/physical-asset-class.js +40 -0
- package/dist-client/pages/master/physical-asset-class.js.map +1 -0
- package/dist-client/pages/master/physical-asset.d.ts +12 -0
- package/dist-client/pages/master/physical-asset.js +41 -0
- package/dist-client/pages/master/physical-asset.js.map +1 -0
- package/dist-client/pages/master/recipe-definition.d.ts +136 -0
- package/dist-client/pages/master/recipe-definition.js +404 -0
- package/dist-client/pages/master/recipe-definition.js.map +1 -0
- package/dist-client/pages/master/reference-targets.d.ts +42 -0
- package/dist-client/pages/master/reference-targets.js +82 -0
- package/dist-client/pages/master/reference-targets.js.map +1 -0
- package/dist-client/pages/master/route-definition.d.ts +19 -0
- package/dist-client/pages/master/route-definition.js +40 -0
- package/dist-client/pages/master/route-definition.js.map +1 -0
- package/dist-client/pages/master/stop-reason.d.ts +12 -0
- package/dist-client/pages/master/stop-reason.js +48 -0
- package/dist-client/pages/master/stop-reason.js.map +1 -0
- package/dist-client/pages/master/test-specification.d.ts +93 -0
- package/dist-client/pages/master/test-specification.js +449 -0
- package/dist-client/pages/master/test-specification.js.map +1 -0
- package/dist-client/pages/master-axes.d.ts +20 -29
- package/dist-client/pages/master-axes.js +32 -169
- package/dist-client/pages/master-axes.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +76 -3
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/asset/asset-lifecycle.d.ts +30 -7
- package/dist-server/service/asset/asset-lifecycle.js +33 -6
- package/dist-server/service/asset/asset-lifecycle.js.map +1 -1
- package/dist-server/service/asset/asset-master-resolver.d.ts +9 -0
- package/dist-server/service/asset/asset-master-resolver.js +41 -0
- package/dist-server/service/asset/asset-master-resolver.js.map +1 -1
- package/dist-server/service/asset/asset-master.js +1 -1
- package/dist-server/service/asset/asset-master.js.map +1 -1
- package/dist-server/service/asset/asset-query.d.ts +9 -1
- package/dist-server/service/asset/asset-query.js +28 -6
- package/dist-server/service/asset/asset-query.js.map +1 -1
- package/dist-server/service/asset/physical-asset-class.js +1 -1
- package/dist-server/service/asset/physical-asset-class.js.map +1 -1
- package/dist-server/service/asset/physical-asset.d.ts +17 -4
- package/dist-server/service/asset/physical-asset.js +6 -6
- package/dist-server/service/asset/physical-asset.js.map +1 -1
- package/dist-server/service/equipment/equipment-class.js +1 -1
- package/dist-server/service/equipment/equipment-class.js.map +1 -1
- package/dist-server/service/equipment/equipment-master-resolver.d.ts +9 -0
- package/dist-server/service/equipment/equipment-master-resolver.js +58 -0
- package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -1
- package/dist-server/service/equipment/equipment-master.d.ts +3 -2
- package/dist-server/service/equipment/equipment-master.js +21 -4
- package/dist-server/service/equipment/equipment-master.js.map +1 -1
- package/dist-server/service/equipment/equipment-query.d.ts +9 -1
- package/dist-server/service/equipment/equipment-query.js +28 -6
- package/dist-server/service/equipment/equipment-query.js.map +1 -1
- package/dist-server/service/equipment/equipment.d.ts +27 -1
- package/dist-server/service/equipment/equipment.js +8 -3
- package/dist-server/service/equipment/equipment.js.map +1 -1
- package/dist-server/service/equipment/state-period-rules.d.ts +19 -0
- package/dist-server/service/equipment/state-period-rules.js +35 -1
- package/dist-server/service/equipment/state-period-rules.js.map +1 -1
- package/dist-server/service/index.d.ts +12 -2
- package/dist-server/service/index.js +21 -1
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/location/location-master-resolver.d.ts +29 -0
- package/dist-server/service/location/location-master-resolver.js +228 -1
- package/dist-server/service/location/location-master-resolver.js.map +1 -1
- package/dist-server/service/location/location-query.d.ts +9 -1
- package/dist-server/service/location/location-query.js +24 -9
- package/dist-server/service/location/location-query.js.map +1 -1
- package/dist-server/service/location/operational-location.d.ts +37 -0
- package/dist-server/service/location/operational-location.js +22 -2
- package/dist-server/service/location/operational-location.js.map +1 -1
- package/dist-server/service/master-axis.d.ts +1 -1
- package/dist-server/service/master-axis.js +16 -1
- package/dist-server/service/master-axis.js.map +1 -1
- package/dist-server/service/master-conformance-resolver.d.ts +34 -0
- package/dist-server/service/master-conformance-resolver.js +143 -0
- package/dist-server/service/master-conformance-resolver.js.map +1 -0
- package/dist-server/service/master-conformance.d.ts +80 -0
- package/dist-server/service/master-conformance.js +266 -0
- package/dist-server/service/master-conformance.js.map +1 -0
- package/dist-server/service/master-page-query.d.ts +33 -0
- package/dist-server/service/master-page-query.js +55 -0
- package/dist-server/service/master-page-query.js.map +1 -0
- package/dist-server/service/master-page.d.ts +85 -0
- package/dist-server/service/master-page.js +104 -0
- package/dist-server/service/master-page.js.map +1 -0
- package/dist-server/service/material/material-class.js +1 -1
- package/dist-server/service/material/material-class.js.map +1 -1
- package/dist-server/service/material/material-definition.js +2 -2
- package/dist-server/service/material/material-definition.js.map +1 -1
- package/dist-server/service/material/material-master-resolver.d.ts +62 -0
- package/dist-server/service/material/material-master-resolver.js +213 -0
- package/dist-server/service/material/material-master-resolver.js.map +1 -1
- package/dist-server/service/material/material-query.d.ts +9 -1
- package/dist-server/service/material/material-query.js +28 -6
- package/dist-server/service/material/material-query.js.map +1 -1
- package/dist-server/service/material/recipe-index.d.ts +23 -0
- package/dist-server/service/material/recipe-index.js +44 -0
- package/dist-server/service/material/recipe-index.js.map +1 -0
- package/dist-server/service/operation/index.d.ts +2 -1
- package/dist-server/service/operation/index.js +2 -1
- package/dist-server/service/operation/index.js.map +1 -1
- package/dist-server/service/operation/operation-definition.d.ts +1 -1
- package/dist-server/service/operation/operation-definition.js +4 -4
- package/dist-server/service/operation/operation-definition.js.map +1 -1
- package/dist-server/service/operation/operation-master-resolver.d.ts +24 -0
- package/dist-server/service/operation/operation-master-resolver.js +107 -0
- package/dist-server/service/operation/operation-master-resolver.js.map +1 -1
- package/dist-server/service/operation/operation-query.d.ts +10 -2
- package/dist-server/service/operation/operation-query.js +25 -10
- package/dist-server/service/operation/operation-query.js.map +1 -1
- package/dist-server/service/operation/operation-readiness-resolver.d.ts +39 -0
- package/dist-server/service/operation/operation-readiness-resolver.js +111 -0
- package/dist-server/service/operation/operation-readiness-resolver.js.map +1 -0
- package/dist-server/service/operation/operation-readiness.d.ts +34 -0
- package/dist-server/service/operation/operation-readiness.js +133 -0
- package/dist-server/service/operation/operation-readiness.js.map +1 -0
- package/dist-server/service/personnel/person.js +3 -3
- package/dist-server/service/personnel/person.js.map +1 -1
- package/dist-server/service/personnel/personnel-class-readiness.d.ts +22 -0
- package/dist-server/service/personnel/personnel-class-readiness.js +98 -0
- package/dist-server/service/personnel/personnel-class-readiness.js.map +1 -0
- package/dist-server/service/personnel/personnel-class.d.ts +1 -1
- package/dist-server/service/personnel/personnel-class.js +2 -2
- package/dist-server/service/personnel/personnel-class.js.map +1 -1
- package/dist-server/service/personnel/personnel-master-resolver.d.ts +9 -0
- package/dist-server/service/personnel/personnel-master-resolver.js +43 -0
- package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -1
- package/dist-server/service/personnel/personnel-master.js +1 -1
- package/dist-server/service/personnel/personnel-master.js.map +1 -1
- package/dist-server/service/personnel/personnel-query.d.ts +9 -1
- package/dist-server/service/personnel/personnel-query.js +28 -6
- package/dist-server/service/personnel/personnel-query.js.map +1 -1
- package/dist-server/service/personnel/qualification.d.ts +7 -0
- package/dist-server/service/personnel/qualification.js +25 -0
- package/dist-server/service/personnel/qualification.js.map +1 -1
- package/dist-server/service/recipe/index.d.ts +9 -0
- package/dist-server/service/recipe/index.js +14 -0
- package/dist-server/service/recipe/index.js.map +1 -0
- package/dist-server/service/recipe/recipe-definition.d.ts +71 -0
- package/dist-server/service/recipe/recipe-definition.js +130 -0
- package/dist-server/service/recipe/recipe-definition.js.map +1 -0
- package/dist-server/service/recipe/recipe-master-resolver.d.ts +28 -0
- package/dist-server/service/recipe/recipe-master-resolver.js +124 -0
- package/dist-server/service/recipe/recipe-master-resolver.js.map +1 -0
- package/dist-server/service/recipe/recipe-master.d.ts +37 -0
- package/dist-server/service/recipe/recipe-master.js +47 -0
- package/dist-server/service/recipe/recipe-master.js.map +1 -0
- package/dist-server/service/recipe/recipe-query.d.ts +21 -0
- package/dist-server/service/recipe/recipe-query.js +75 -0
- package/dist-server/service/recipe/recipe-query.js.map +1 -0
- package/dist-server/service/recipe/route-definition.d.ts +51 -0
- package/dist-server/service/recipe/route-definition.js +113 -0
- package/dist-server/service/recipe/route-definition.js.map +1 -0
- package/dist-server/service/resource/class-lineage.d.ts +46 -0
- package/dist-server/service/resource/class-lineage.js +80 -0
- package/dist-server/service/resource/class-lineage.js.map +1 -0
- package/dist-server/service/resource/class-members.d.ts +36 -0
- package/dist-server/service/resource/class-members.js +50 -0
- package/dist-server/service/resource/class-members.js.map +1 -0
- package/dist-server/service/resource/referrers.d.ts +54 -0
- package/dist-server/service/resource/referrers.js +99 -0
- package/dist-server/service/resource/referrers.js.map +1 -0
- package/dist-server/service/status/master-status.d.ts +0 -7
- package/dist-server/service/status/master-status.js +5 -6
- package/dist-server/service/status/master-status.js.map +1 -1
- package/dist-server/service/test-spec/criteria-check.d.ts +53 -0
- package/dist-server/service/test-spec/criteria-check.js +142 -0
- package/dist-server/service/test-spec/criteria-check.js.map +1 -0
- package/dist-server/service/test-spec/criteria-rows.d.ts +89 -0
- package/dist-server/service/test-spec/criteria-rows.js +139 -0
- package/dist-server/service/test-spec/criteria-rows.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +33 -7
- package/dist-server/service/test-spec/test-spec-master-resolver.js +137 -2
- package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -1
- package/dist-server/service/test-spec/test-spec-query.d.ts +9 -1
- package/dist-server/service/test-spec/test-spec-query.js +23 -9
- package/dist-server/service/test-spec/test-spec-query.js.map +1 -1
- package/dist-server/service/test-spec/test-specification.js +1 -1
- package/dist-server/service/test-spec/test-specification.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/ops-master/equipment-class.ko.md +11 -0
- package/helps/ops-master/equipment-class.md +11 -0
- package/helps/ops-master/equipment.ko.md +11 -0
- package/helps/ops-master/equipment.md +11 -0
- package/helps/ops-master/material-class.ko.md +11 -0
- package/helps/ops-master/material-class.md +11 -0
- package/helps/ops-master/material-definition.ko.md +11 -0
- package/helps/ops-master/material-definition.md +11 -0
- package/helps/ops-master/operation-definition.ko.md +11 -0
- package/helps/ops-master/operation-definition.md +11 -0
- package/helps/ops-master/operational-location.ko.md +11 -0
- package/helps/ops-master/operational-location.md +11 -0
- package/helps/ops-master/person.ko.md +11 -0
- package/helps/ops-master/person.md +11 -0
- package/helps/ops-master/personnel-class.ko.md +11 -0
- package/helps/ops-master/personnel-class.md +11 -0
- package/helps/ops-master/physical-asset-class.ko.md +11 -0
- package/helps/ops-master/physical-asset-class.md +11 -0
- package/helps/ops-master/physical-asset.ko.md +11 -0
- package/helps/ops-master/physical-asset.md +11 -0
- package/helps/ops-master/recipe-definition.ko.md +11 -0
- package/helps/ops-master/recipe-definition.md +11 -0
- package/helps/ops-master/route-definition.ko.md +11 -0
- package/helps/ops-master/route-definition.md +11 -0
- package/helps/ops-master/stop-reason.ko.md +11 -0
- package/helps/ops-master/stop-reason.md +11 -0
- package/helps/ops-master/test-specification.ko.md +11 -0
- package/helps/ops-master/test-specification.md +11 -0
- package/package.json +5 -5
- package/things-factory.config.js +22 -2
- package/translations/en.json +89 -6
- package/translations/ja.json +96 -1
- package/translations/ko.json +96 -13
- package/translations/ms.json +96 -1
- package/translations/zh.json +96 -1
- package/dist-client/pages/master-list.d.ts +0 -68
- package/dist-client/pages/master-list.js +0 -267
- 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":"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","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"]}
|