@things-factory/dataset 5.0.0-alpha.4 → 5.0.0-alpha.40

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 (97) hide show
  1. package/README.md +13 -0
  2. package/assets/data-samples.jpg +0 -0
  3. package/client/bootstrap.js +21 -1
  4. package/client/pages/{data-entry-form.js → data-entry/data-entry-form.js} +15 -2
  5. package/client/pages/data-entry/data-entry-list-page.js +423 -0
  6. package/client/pages/data-ooc/data-ooc-list-page.js +488 -0
  7. package/client/pages/data-ooc/data-ooc-view.js +182 -0
  8. package/client/pages/data-report/data-report-list-page.js +463 -0
  9. package/client/pages/{data-sample.js → data-sample/data-sample-list-page.js} +151 -76
  10. package/client/pages/data-sample/data-sample-view.js +97 -0
  11. package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +7 -12
  12. package/client/pages/{data-item-list.js → data-set/data-item-list.js} +37 -12
  13. package/client/pages/{data-set-importer.js → data-set/data-set-importer.js} +0 -0
  14. package/client/pages/data-set/data-set-list-page.js +727 -0
  15. package/client/route.js +18 -6
  16. package/dist-server/controllers/create-data-sample.js +133 -0
  17. package/dist-server/controllers/create-data-sample.js.map +1 -0
  18. package/dist-server/controllers/data-use-case.js +57 -0
  19. package/dist-server/controllers/data-use-case.js.map +1 -0
  20. package/dist-server/controllers/index.js +17 -0
  21. package/dist-server/controllers/index.js.map +1 -1
  22. package/dist-server/index.js +1 -0
  23. package/dist-server/index.js.map +1 -1
  24. package/dist-server/routes.js +9 -24
  25. package/dist-server/routes.js.map +1 -1
  26. package/dist-server/service/data-item/data-item-mutation.js +5 -1
  27. package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
  28. package/dist-server/service/data-item/data-item-query.js +7 -2
  29. package/dist-server/service/data-item/data-item-query.js.map +1 -1
  30. package/dist-server/service/data-item/data-item-type.js +15 -7
  31. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  32. package/dist-server/service/data-item/data-item.js +17 -3
  33. package/dist-server/service/data-item/data-item.js.map +1 -1
  34. package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
  35. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  36. package/dist-server/service/data-ooc/data-ooc-query.js +120 -0
  37. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  38. package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
  39. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  40. package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
  41. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  42. package/dist-server/service/data-ooc/data-ooc.js +237 -0
  43. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  44. package/dist-server/service/data-ooc/index.js +10 -0
  45. package/dist-server/service/data-ooc/index.js.map +1 -0
  46. package/dist-server/service/data-sample/data-sample-mutation.js +2 -138
  47. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  48. package/dist-server/service/data-sample/data-sample-query.js +7 -2
  49. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  50. package/dist-server/service/data-sample/data-sample-type.js +12 -42
  51. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  52. package/dist-server/service/data-sample/data-sample.js +34 -3
  53. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  54. package/dist-server/service/data-sensor/data-sensor-query.js +7 -2
  55. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  56. package/dist-server/service/data-set/data-set-mutation.js +1 -2
  57. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  58. package/dist-server/service/data-set/data-set-query.js +162 -3
  59. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  60. package/dist-server/service/data-set/data-set-type.js +75 -3
  61. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  62. package/dist-server/service/data-set/data-set.js +106 -15
  63. package/dist-server/service/data-set/data-set.js.map +1 -1
  64. package/dist-server/service/index.js +6 -2
  65. package/dist-server/service/index.js.map +1 -1
  66. package/package.json +18 -13
  67. package/server/controllers/create-data-sample.ts +177 -0
  68. package/server/controllers/data-use-case.ts +85 -0
  69. package/server/controllers/index.ts +1 -0
  70. package/server/index.ts +1 -0
  71. package/server/routes.ts +17 -31
  72. package/server/service/data-item/data-item-mutation.ts +6 -1
  73. package/server/service/data-item/data-item-query.ts +9 -3
  74. package/server/service/data-item/data-item-type.ts +10 -6
  75. package/server/service/data-item/data-item.ts +15 -4
  76. package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
  77. package/server/service/data-ooc/data-ooc-query.ts +69 -0
  78. package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
  79. package/server/service/data-ooc/data-ooc-type.ts +68 -0
  80. package/server/service/data-ooc/data-ooc.ts +204 -0
  81. package/server/service/data-ooc/index.ts +7 -0
  82. package/server/service/data-sample/data-sample-mutation.ts +3 -172
  83. package/server/service/data-sample/data-sample-query.ts +9 -3
  84. package/server/service/data-sample/data-sample-type.ts +7 -28
  85. package/server/service/data-sample/data-sample.ts +33 -3
  86. package/server/service/data-sensor/data-sensor-query.ts +9 -3
  87. package/server/service/data-set/data-set-mutation.ts +1 -4
  88. package/server/service/data-set/data-set-query.ts +135 -4
  89. package/server/service/data-set/data-set-type.ts +58 -4
  90. package/server/service/data-set/data-set.ts +97 -12
  91. package/server/service/index.ts +6 -2
  92. package/things-factory.config.js +18 -6
  93. package/translations/en.json +45 -3
  94. package/translations/ko.json +44 -3
  95. package/translations/ms.json +44 -3
  96. package/translations/zh.json +44 -3
  97. package/client/pages/data-set.js +0 -457
@@ -1,21 +1,62 @@
1
1
  {
2
+ "button.corrected": "조치완료",
3
+ "button.reviewed": "검토완료",
2
4
  "field.appliance": "어플라이언스",
3
5
  "field.collected_at": "수집일시",
6
+ "field.corrective-action": "조치 활동",
7
+ "field.corrector": "조치자",
8
+ "field.corrected-at": "조치 시간",
4
9
  "field.data": "데이타",
5
- "field.dataSet": "데이타셋",
10
+ "field.data-sample": "데이타 샘플",
11
+ "field.data-set": "데이타셋",
6
12
  "field.device-id": "디바이스 아이디",
13
+ "field.entry-role": "입력담당 역할",
14
+ "field.entry-type": "입력용 화면종류",
15
+ "field.entry-view": "입력용 화면",
16
+ "field.hidden": "숨기기",
17
+ "field.latest-collected-at": "최근 수집 시간",
18
+ "field.monitor-type": "모니터용 화면종류",
19
+ "field.monitor-view": "모니터용 화면",
7
20
  "field.netmask": "네트워크마스크",
21
+ "field.next-schedule": "다음 수집계획",
22
+ "field.oos": "허용한계 이탈여부",
23
+ "field.ooc": "관리한계 이탈여부",
8
24
  "field.options": "선택옵션",
9
- "field.partitionKeys": "파티션 키",
25
+ "field.partition-keys": "파티션 키",
26
+ "field.prev-schedule": "이전 수집계획",
10
27
  "field.quota": "샘플수",
11
28
  "field.raw-data": "데이타 원본",
12
29
  "field.ref-by": "참조아이템",
30
+ "field.report-type": "리포트용 화면종류",
31
+ "field.report-view": "리포트용 화면",
13
32
  "field.serial-no": "시리얼번호",
14
33
  "field.spec": "명세",
34
+ "field.state": "상태",
35
+ "field.supervisory-role": "관리자 역할",
15
36
  "field.tag": "태그이름",
37
+ "field.unit": "단위",
38
+ "field.use-case": "사용 사례",
39
+ "field.work-date": "작업기준일",
40
+ "field.work-shift": "교대근무조",
41
+ "label.acceptables": "허용값",
42
+ "label.critical limits": "허용 한계범위",
43
+ "label.minimum value": "최소값",
44
+ "label.maximum value": "최대값",
45
+ "label.pass limits": "통과 허용범위",
46
+ "label.target limits": "관리 목표범위",
47
+ "text.automatically collected": "자동 수집",
48
+ "text.data sample created successfully": "데이타 샘플이 성공적으로 생성되었습니다",
49
+ "text.data ooc updated successfully": "이탈데이타 내용이 수정되었습니다",
50
+ "text.manually collected": "수동 수집",
16
51
  "title.data-entry-form": "데이타 입력",
17
52
  "title.data-item list": "데이타 아이템 조회",
53
+ "title.data-monitor-view": "데이타 모니터",
54
+ "title.data-report-view": "데이타 리포트",
55
+ "title.data-ooc list": "데이타 이탈점 조회",
56
+ "title.data-ooc view": "데이타 이탈점 상세",
18
57
  "title.data-sample list": "데이타 샘플 조회",
58
+ "title.data-sample view": "데이타 샘플 상세",
19
59
  "title.data-sensor list": "데이타 센서 조회",
20
- "title.data-set list": "데이타 셋 조회"
60
+ "title.data-set list": "데이타 셋 조회",
61
+ "title.edit code": "코드 편집"
21
62
  }
@@ -1,21 +1,62 @@
1
1
  {
2
+ "button.corrected": "corrected",
3
+ "button.reviewed": "reviewed",
2
4
  "field.appliance": "appliance",
3
5
  "field.collected_at": "collected at",
6
+ "field.corrective-action": "corrective action",
7
+ "field.corrector": "corrector",
8
+ "field.corrected-at": "corrected at",
4
9
  "field.data": "data",
5
- "field.dataSet": "data set",
10
+ "field.data-sample": "data sample",
11
+ "field.data-set": "data set",
6
12
  "field.device-id": "device id",
13
+ "field.entry-role": "entry role",
14
+ "field.entry-type": "entry type",
15
+ "field.entry-view": "entry view",
16
+ "field.latest-collected-at": "latest collected at",
17
+ "field.monitor-type": "monitor type",
18
+ "field.monitor-view": "monitor view",
7
19
  "field.netmask": "network mask",
20
+ "field.next-schedule": "next schedule",
21
+ "field.oos": "out of critical limit",
22
+ "field.ooc": "out of control limit",
8
23
  "field.options": "options",
9
- "field.partitionKeys": "partition keys",
24
+ "field.hidden": "hidden",
25
+ "field.partition-keys": "partition keys",
26
+ "field.prev-schedule": "previous schedule",
10
27
  "field.quota": "sampling #",
11
28
  "field.raw-data": "raw data",
12
29
  "field.ref-by": "ref. by",
30
+ "field.report-type": "report type",
31
+ "field.report-view": "report view",
13
32
  "field.serial-no": "serial #",
14
33
  "field.spec": "spec",
34
+ "field.state": "keadaan",
35
+ "field.supervisory-role": "supervisory role",
15
36
  "field.tag": "tag name",
37
+ "field.unit": "unit",
38
+ "field.use-case": "use case",
39
+ "field.work-date": "work date",
40
+ "field.work-shift": "work shift",
41
+ "label.acceptables": "acceptables",
42
+ "label.critical limits": "critical limits",
43
+ "label.minimum value": "minimum value",
44
+ "label.maximum value": "maximum value",
45
+ "label.pass limits": "pass limits",
46
+ "label.target limits": "target limits",
47
+ "text.automatically collected": "automatically collected",
48
+ "text.data sample created successfully": "a data sample created successfully",
49
+ "text.data ooc updated successfully": "a data ooc updated successfully",
50
+ "text.manually collected": "manually collected",
16
51
  "title.data-entry-form": "data entry form",
17
52
  "title.data-item list": "data item list",
53
+ "title.data-monitor-view": "data monitor view",
54
+ "title.data-report-view": "data report view",
55
+ "title.data-ooc list": "data OOC list",
56
+ "title.data-ooc view": "data OOC view",
18
57
  "title.data-sample list": "data sample list",
58
+ "title.data-sample view": "data sample view",
19
59
  "title.data-sensor list": "data sensor list",
20
- "title.data-set list": "data set list"
60
+ "title.data-set list": "data set list",
61
+ "title.edit code": "edit code"
21
62
  }
@@ -1,21 +1,62 @@
1
1
  {
2
+ "button.corrected": "corrected",
3
+ "button.reviewed": "reviewed",
2
4
  "field.appliance": "appliance",
3
5
  "field.collected_at": "collected at",
6
+ "field.corrective-action": "corrective action",
7
+ "field.corrector": "corrector",
8
+ "field.corrected-at": "corrected at",
4
9
  "field.data": "data",
5
- "field.dataSet": "data set",
10
+ "field.data-sample": "data sample",
11
+ "field.data-set": "data set",
6
12
  "field.device-id": "device id",
13
+ "field.entry-role": "entry role",
14
+ "field.entry-type": "entry type",
15
+ "field.entry-view": "entry view",
16
+ "field.hidden": "hidden",
17
+ "field.latest-collected-at": "latest collected at",
18
+ "field.monitor-type": "monitor type",
19
+ "field.monitor-view": "monitor view",
7
20
  "field.netmask": "network mask",
21
+ "field.next-schedule": "next schedule",
22
+ "field.oos": "out of critical limit",
23
+ "field.ooc": "out of control limit",
8
24
  "field.options": "options",
9
- "field.partitionKeys": "partition keys",
25
+ "field.partition-keys": "partition keys",
26
+ "field.prev-schedule": "previous schedule",
10
27
  "field.quota": "sampling #",
11
28
  "field.raw-data": "raw data",
12
29
  "field.ref-by": "ref. by",
30
+ "field.report-type": "report type",
31
+ "field.report-view": "report view",
13
32
  "field.serial-no": "serial #",
14
33
  "field.spec": "spec",
34
+ "field.state": "状态",
35
+ "field.supervisory-role": "supervisory role",
15
36
  "field.tag": "tag name",
37
+ "field.unit": "unit",
38
+ "field.use-case": "use case",
39
+ "field.work-date": "work date",
40
+ "field.work-shift": "work shift",
41
+ "label.acceptables": "acceptables",
42
+ "label.critical limits": "critical limits",
43
+ "label.minimum value": "minimum value",
44
+ "label.maximum value": "maximum value",
45
+ "label.pass limits": "pass limits",
46
+ "label.target limits": "target limits",
47
+ "text.automatically collected": "automatically collected",
48
+ "text.data sample created successfully": "a data sample created successfully",
49
+ "text.data ooc updated successfully": "a data ooc updated successfully",
50
+ "text.manually collected": "manually collected",
16
51
  "title.data-entry-form": "data entry form",
17
52
  "title.data-item list": "data item list",
53
+ "title.data-monitor-view": "data monitor view",
54
+ "title.data-report-view": "data report view",
55
+ "title.data-ooc list": "data OOC list",
56
+ "title.data-ooc view": "data OOC view",
18
57
  "title.data-sample list": "data sample list",
58
+ "title.data-sample view": "data sample view",
19
59
  "title.data-sensor list": "data sensor list",
20
- "title.data-set list": "data set list"
60
+ "title.data-set list": "data set list",
61
+ "title.edit code": "edit code"
21
62
  }
@@ -1,457 +0,0 @@
1
- import '@operato/data-grist'
2
- import './data-item-list'
3
- import './data-set-importer'
4
- import './data-entry-form'
5
-
6
- import gql from 'graphql-tag'
7
- import { css, html } from 'lit'
8
- import moment from 'moment-timezone'
9
- import { connect } from 'pwa-helpers/connect-mixin'
10
-
11
- import { client } from '@operato/graphql'
12
- import { i18next, localize } from '@operato/i18n'
13
- import { notify, openPopup } from '@operato/layout'
14
- import { PageView, store } from '@operato/shell'
15
- import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
16
- import { isMobileDevice } from '@operato/utils'
17
-
18
- export class DataSet extends connect(store)(localize(i18next)(PageView)) {
19
- static get properties() {
20
- return {
21
- active: String,
22
- gristConfig: Object
23
- }
24
- }
25
-
26
- static get styles() {
27
- return [
28
- ScrollbarStyles,
29
- css`
30
- :host {
31
- display: flex;
32
- flex-direction: column;
33
-
34
- overflow: hidden;
35
- }
36
-
37
- ox-grist {
38
- overflow-y: auto;
39
- flex: 1;
40
- }
41
-
42
- #filters {
43
- display: flex;
44
- flex-direction: row;
45
- justify-content: space-between;
46
-
47
- background-color: white;
48
- }
49
-
50
- #filters > * {
51
- padding: var(--padding-default) var(--padding-wide);
52
- }
53
- `
54
- ]
55
- }
56
-
57
- get context() {
58
- return {
59
- title: i18next.t('title.data-set list'),
60
- help: 'integration/ui/data-set',
61
- actions: [
62
- {
63
- title: i18next.t('button.copy'),
64
- action: this._copyDataSet.bind(this),
65
- ...CommonButtonStyles.copy
66
- },
67
- {
68
- title: i18next.t('button.save'),
69
- action: this._updateDataSet.bind(this),
70
- ...CommonButtonStyles.save
71
- },
72
- {
73
- title: i18next.t('button.delete'),
74
- action: this._deleteDataSet.bind(this),
75
- ...CommonButtonStyles.delete
76
- }
77
- ],
78
- exportable: {
79
- name: i18next.t('title.data-set list'),
80
- data: this.exportHandler.bind(this)
81
- },
82
- importable: {
83
- handler: this.importHandler.bind(this)
84
- }
85
- }
86
- }
87
-
88
- render() {
89
- return html`
90
- <ox-grist
91
- .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
92
- .config=${this.gristConfig}
93
- .fetchHandler=${this.fetchHandler.bind(this)}
94
- >
95
- <div slot="headroom" id="filters">
96
- <ox-filters-form></ox-filters-form>
97
- </div>
98
- </ox-grist>
99
- `
100
- }
101
-
102
- get grist() {
103
- return this.renderRoot.querySelector('ox-grist')
104
- }
105
-
106
- // update with url params value
107
- _updateSearchConfig(lifecycle) {
108
- // this.searchConfig = this.searchConfig.map(conf => {
109
- // if (conf.name in lifecycle.params) {
110
- // conf.value = lifecycle.params[conf.name]
111
- // } else {
112
- // delete conf.value
113
- // }
114
- // return conf
115
- // })
116
- }
117
-
118
- // set default field value to record with searchConfig
119
- _setDefaultFieldsValue(fields) {
120
- // this.searchConfig.forEach(conf => {
121
- // if (!fields[conf.name] && conf.value) {
122
- // fields[conf.name] = conf.value
123
- // }
124
- // })
125
- }
126
-
127
- async pageInitialized(lifecycle) {
128
- this._updateSearchConfig(lifecycle)
129
-
130
- this.gristConfig = {
131
- list: { fields: ['name', 'description', 'schedule', 'active'] },
132
- columns: [
133
- { type: 'gutter', gutterName: 'sequence' },
134
- { type: 'gutter', gutterName: 'row-selector', multiple: true },
135
- {
136
- type: 'gutter',
137
- gutterName: 'button',
138
- icon: 'reorder',
139
- handlers: {
140
- click: (columns, data, column, record, rowIndex) => {
141
- if (!record.id) return
142
- openPopup(html` <data-item-list .dataSet=${record}></data-item-list> `, {
143
- backdrop: true,
144
- help: 'data-set/ui/data-item-list',
145
- size: 'large',
146
- title: i18next.t('title.data-item list')
147
- })
148
- }
149
- }
150
- },
151
- {
152
- type: 'gutter',
153
- gutterName: 'button',
154
- icon: 'fact_check',
155
- handlers: {
156
- click: (columns, data, column, record, rowIndex) => {
157
- openPopup(
158
- html` <data-entry-form .dataSet=${record} style="background-color: white;"></data-entry-form> `,
159
- {
160
- backdrop: true,
161
- size: 'large',
162
- title: i18next.t('title.data-entry-form')
163
- }
164
- )
165
- }
166
- }
167
- },
168
- {
169
- type: 'string',
170
- name: 'name',
171
- label: true,
172
- header: i18next.t('field.name'),
173
- record: {
174
- editable: true
175
- },
176
- filter: 'search',
177
- sortable: true,
178
- width: 150
179
- },
180
- {
181
- type: 'string',
182
- name: 'description',
183
- label: true,
184
- header: i18next.t('field.description'),
185
- record: {
186
- editable: true
187
- },
188
- filter: 'search',
189
- width: 200
190
- },
191
- {
192
- type: 'checkbox',
193
- name: 'active',
194
- label: true,
195
- header: i18next.t('field.active'),
196
- record: {
197
- editable: true
198
- },
199
- sortable: true,
200
- width: 60
201
- },
202
- {
203
- type: 'json',
204
- name: 'partitionKeys',
205
- header: i18next.t('field.partitionKeys'),
206
- record: {
207
- editable: true
208
- },
209
- width: 200
210
- },
211
- {
212
- type: 'crontab',
213
- name: 'schedule',
214
- label: true,
215
- header: i18next.t('field.schedule'),
216
- record: {
217
- editable: true
218
- },
219
- width: 80,
220
- label: true
221
- },
222
- {
223
- type: 'select',
224
- name: 'timezone',
225
- header: i18next.t('field.timezone'),
226
- record: {
227
- editable: true,
228
- options: ['', ...moment.tz.names()]
229
- },
230
- width: 120
231
- },
232
- {
233
- type: 'object',
234
- name: 'updater',
235
- header: i18next.t('field.updater'),
236
- record: {
237
- editable: false
238
- },
239
- sortable: true,
240
- width: 120
241
- },
242
- {
243
- type: 'datetime',
244
- name: 'updatedAt',
245
- header: i18next.t('field.updated_at'),
246
- record: {
247
- editable: false
248
- },
249
- sortable: true,
250
- width: 180
251
- }
252
- ],
253
- rows: {
254
- selectable: {
255
- multiple: true
256
- }
257
- },
258
- sorters: [
259
- {
260
- name: 'name'
261
- }
262
- ]
263
- }
264
-
265
- await this.updateComplete
266
-
267
- this.grist.fetch()
268
- }
269
-
270
- async pageUpdated(changes, lifecycle) {
271
- if (this.active) {
272
- // update with url params value
273
- this._updateSearchConfig(lifecycle)
274
- await this.updateComplete
275
-
276
- this.grist.fetch()
277
- }
278
- }
279
-
280
- async fetchHandler({ page, limit, sortings = [], filters = [] }) {
281
- const response = await client.query({
282
- query: gql`
283
- query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
284
- responses: dataSets(filters: $filters, pagination: $pagination, sortings: $sortings) {
285
- items {
286
- id
287
- name
288
- description
289
- partitionKeys
290
- slugger
291
- active
292
- schedule
293
- timezone
294
- updater {
295
- id
296
- name
297
- }
298
- updatedAt
299
- dataItems {
300
- name
301
- description
302
- sequence
303
- active
304
- tag
305
- type
306
- options
307
- quota
308
- spec
309
- }
310
- }
311
- total
312
- }
313
- }
314
- `,
315
- variables: {
316
- filters,
317
- pagination: { page, limit },
318
- sortings
319
- }
320
- })
321
-
322
- return {
323
- total: response.data.responses.total || 0,
324
- records: response.data.responses.items || []
325
- }
326
- }
327
-
328
- async _deleteDataSet() {
329
- if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
330
- const ids = this.grist.selected.map(record => record.id)
331
- if (ids && ids.length > 0) {
332
- const response = await client.mutate({
333
- mutation: gql`
334
- mutation ($ids: [String!]!) {
335
- deleteDataSets(ids: $ids)
336
- }
337
- `,
338
- variables: {
339
- ids
340
- }
341
- })
342
-
343
- if (!response.errors) {
344
- this.grist.fetch()
345
- notify({
346
- message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
347
- })
348
- }
349
- }
350
- }
351
- }
352
-
353
- async stateChanged(state) {
354
- if (this.active && this._currentPopupName && !state.layout.viewparts[this._currentPopupName]) {
355
- this.grist.fetch()
356
- this._currentPopupName = null
357
- }
358
- }
359
-
360
- async _copyDataSet() {
361
- var selected = this.grist.selected
362
- if (selected.length == 0) return
363
-
364
- if (!confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.copy') }))) return
365
- var response = await client.mutate({
366
- mutation: gql`
367
- mutation ($ids: [String!]!) {
368
- copyDataSets(ids: $ids) {
369
- id
370
- }
371
- }
372
- `,
373
- variables: {
374
- ids: selected.map(r => r.id)
375
- }
376
- })
377
-
378
- if (!response.errors) this.grist.fetch()
379
- }
380
-
381
- async _updateDataSet() {
382
- let patches = this.grist.dirtyRecords
383
- if (patches && patches.length) {
384
- patches = patches.map(patch => {
385
- let patchField = patch.id ? { id: patch.id } : {}
386
- const dirtyFields = patch.__dirtyfields__
387
- for (let key in dirtyFields) {
388
- patchField[key] = dirtyFields[key].after
389
- }
390
- this._setDefaultFieldsValue(patchField)
391
- patchField.cuFlag = patch.__dirty__
392
-
393
- return patchField
394
- })
395
-
396
- const response = await client.mutate({
397
- mutation: gql`
398
- mutation ($patches: [DataSetPatch!]!) {
399
- updateMultipleDataSet(patches: $patches) {
400
- name
401
- }
402
- }
403
- `,
404
- variables: {
405
- patches
406
- }
407
- })
408
-
409
- if (!response.errors) this.grist.fetch()
410
- }
411
- }
412
-
413
- async exportHandler() {
414
- const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records
415
- const targetFieldSet = new Set([
416
- 'id',
417
- 'name',
418
- 'type',
419
- 'description',
420
- 'tag',
421
- 'schedule',
422
- 'timezone',
423
- 'active',
424
- 'dataItems'
425
- ])
426
-
427
- return exportTargets.map(dataSet => {
428
- let tempObj = {}
429
- for (const field of targetFieldSet) {
430
- tempObj[field] = dataSet[field]
431
- }
432
-
433
- return tempObj
434
- })
435
- }
436
-
437
- async importHandler(records) {
438
- openPopup(
439
- html`
440
- <data-set-importer
441
- .dataSets=${records}
442
- @imported=${() => {
443
- history.back()
444
- this.grist.fetch()
445
- }}
446
- ></data-set-importer>
447
- `,
448
- {
449
- backdrop: true,
450
- size: 'large',
451
- title: i18next.t('title.import data-set')
452
- }
453
- )
454
- }
455
- }
456
-
457
- window.customElements.define('data-set-page', DataSet)