@things-factory/dataset 8.0.0-beta.9 → 8.0.2

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 (134) hide show
  1. package/client/activities/activity-data-collect-edit.ts +105 -0
  2. package/client/activities/activity-data-collect-view.ts +91 -0
  3. package/client/activities/activity-data-review-edit.ts +278 -0
  4. package/client/activities/activity-data-review-view.ts +226 -0
  5. package/client/activities/activity-ooc-resolve-edit.ts +195 -0
  6. package/client/activities/activity-ooc-resolve-view.ts +143 -0
  7. package/client/activities/activity-ooc-review-edit.ts +173 -0
  8. package/client/activities/activity-ooc-review-view.ts +129 -0
  9. package/client/bootstrap.ts +35 -0
  10. package/client/components/data-entry-form.ts +109 -0
  11. package/client/index.ts +1 -0
  12. package/client/pages/data-archive/data-archive-list-page.ts +277 -0
  13. package/client/pages/data-archive/data-archive-request-popup.ts +177 -0
  14. package/client/pages/data-entry/data-entry-list-page.ts +464 -0
  15. package/client/pages/data-key-set/data-key-item-list.ts +183 -0
  16. package/client/pages/data-key-set/data-key-set-importer.ts +89 -0
  17. package/client/pages/data-key-set/data-key-set-list-page.ts +413 -0
  18. package/client/pages/data-ooc/data-ooc-list-page.ts +549 -0
  19. package/client/pages/data-ooc/data-ooc-page.ts +164 -0
  20. package/client/pages/data-ooc/data-ooc-view.ts +236 -0
  21. package/client/pages/data-ooc/data-oocs-page.ts +200 -0
  22. package/client/pages/data-report/data-report-embed-page.ts +108 -0
  23. package/client/pages/data-report/data-report-list-page.ts +454 -0
  24. package/client/pages/data-report/data-report-samples-page.ts +174 -0
  25. package/client/pages/data-report/jasper-report-oocs-page.ts +110 -0
  26. package/client/pages/data-report/jasper-report-samples-crosstab-page.ts +110 -0
  27. package/client/pages/data-report/jasper-report-samples-page.ts +110 -0
  28. package/client/pages/data-sample/data-sample-list-page.ts +442 -0
  29. package/client/pages/data-sample/data-sample-page.ts +55 -0
  30. package/client/pages/data-sample/data-sample-search-page.ts +424 -0
  31. package/client/pages/data-sample/data-sample-view.ts +292 -0
  32. package/client/pages/data-sample/data-samples-page.ts +249 -0
  33. package/client/pages/data-sensor/data-sensor-list-page.ts +456 -0
  34. package/client/pages/data-set/data-item-list.ts +304 -0
  35. package/client/pages/data-set/data-set-importer.ts +89 -0
  36. package/client/pages/data-set/data-set-list-page.ts +1078 -0
  37. package/client/pages/data-summary/data-summary-list-page.ts +363 -0
  38. package/client/pages/data-summary/data-summary-period-page.ts +439 -0
  39. package/client/pages/data-summary/data-summary-search-page.ts +426 -0
  40. package/client/pages/data-summary/data-summary-view.ts +133 -0
  41. package/client/route.ts +91 -0
  42. package/client/tsconfig.json +13 -0
  43. package/dist-client/activities/activity-data-review-edit.js +19 -10
  44. package/dist-client/activities/activity-data-review-edit.js.map +1 -1
  45. package/dist-client/activities/activity-data-review-view.js +80 -0
  46. package/dist-client/activities/activity-data-review-view.js.map +1 -1
  47. package/dist-client/pages/data-entry/data-entry-list-page.js +2 -2
  48. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
  49. package/dist-client/tsconfig.tsbuildinfo +1 -1
  50. package/dist-server/controllers/create-data-ooc.js +2 -0
  51. package/dist-server/controllers/create-data-ooc.js.map +1 -1
  52. package/dist-server/service/data-archive/index.d.ts +1 -1
  53. package/dist-server/service/data-ooc/index.d.ts +1 -1
  54. package/dist-server/service/data-sample/data-sample-query.d.ts +1 -1
  55. package/dist-server/service/data-sample/data-sample-query.js +3 -3
  56. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  57. package/dist-server/service/data-sample/index.d.ts +1 -1
  58. package/dist-server/service/data-set/index.d.ts +1 -1
  59. package/dist-server/service/index.d.ts +2 -2
  60. package/dist-server/tsconfig.tsbuildinfo +1 -1
  61. package/package.json +26 -26
  62. package/server/activities/activity-data-collect.ts +100 -0
  63. package/server/activities/activity-data-review.ts +109 -0
  64. package/server/activities/activity-ooc-resolve.ts +123 -0
  65. package/server/activities/activity-ooc-review.ts +95 -0
  66. package/server/activities/index.ts +11 -0
  67. package/server/controllers/create-data-ooc.ts +80 -0
  68. package/server/controllers/create-data-sample.ts +323 -0
  69. package/server/controllers/data-use-case.ts +98 -0
  70. package/server/controllers/finalize-data-collection.ts +388 -0
  71. package/server/controllers/index.ts +6 -0
  72. package/server/controllers/issue-data-collection-task.ts +70 -0
  73. package/server/controllers/issue-ooc-resolve.ts +58 -0
  74. package/server/controllers/issue-ooc-review.ts +52 -0
  75. package/server/controllers/jasper-report.ts +186 -0
  76. package/server/controllers/query-data-summary-by-period.ts +178 -0
  77. package/server/controllers/shiny-report.ts +54 -0
  78. package/server/engine/index.ts +1 -0
  79. package/server/engine/task/create-data-sample.ts +100 -0
  80. package/server/engine/task/index.ts +2 -0
  81. package/server/engine/task/issue-collect-data.ts +45 -0
  82. package/server/index.ts +8 -0
  83. package/server/routes.ts +188 -0
  84. package/server/service/data-archive/data-archive-mutation.ts +273 -0
  85. package/server/service/data-archive/data-archive-query.ts +58 -0
  86. package/server/service/data-archive/data-archive-type.ts +48 -0
  87. package/server/service/data-archive/data-archive.ts +69 -0
  88. package/server/service/data-archive/index.ts +6 -0
  89. package/server/service/data-key-set/data-key-item-type.ts +31 -0
  90. package/server/service/data-key-set/data-key-set-mutation.ts +201 -0
  91. package/server/service/data-key-set/data-key-set-query.ts +68 -0
  92. package/server/service/data-key-set/data-key-set-type.ts +70 -0
  93. package/server/service/data-key-set/data-key-set.ts +86 -0
  94. package/server/service/data-key-set/index.ts +6 -0
  95. package/server/service/data-ooc/data-ooc-mutation.ts +154 -0
  96. package/server/service/data-ooc/data-ooc-query.ts +106 -0
  97. package/server/service/data-ooc/data-ooc-subscription.ts +48 -0
  98. package/server/service/data-ooc/data-ooc-type.ts +71 -0
  99. package/server/service/data-ooc/data-ooc.ts +259 -0
  100. package/server/service/data-ooc/index.ts +7 -0
  101. package/server/service/data-sample/data-sample-mutation.ts +18 -0
  102. package/server/service/data-sample/data-sample-query.ts +215 -0
  103. package/server/service/data-sample/data-sample-type.ts +47 -0
  104. package/server/service/data-sample/data-sample.ts +193 -0
  105. package/server/service/data-sample/index.ts +6 -0
  106. package/server/service/data-sensor/data-sensor-mutation.ts +116 -0
  107. package/server/service/data-sensor/data-sensor-query.ts +76 -0
  108. package/server/service/data-sensor/data-sensor-type.ts +104 -0
  109. package/server/service/data-sensor/data-sensor.ts +126 -0
  110. package/server/service/data-sensor/index.ts +6 -0
  111. package/server/service/data-set/data-item-type.ts +155 -0
  112. package/server/service/data-set/data-set-mutation.ts +552 -0
  113. package/server/service/data-set/data-set-query.ts +461 -0
  114. package/server/service/data-set/data-set-type.ts +204 -0
  115. package/server/service/data-set/data-set.ts +326 -0
  116. package/server/service/data-set/index.ts +6 -0
  117. package/server/service/data-set-history/data-set-history-query.ts +126 -0
  118. package/server/service/data-set-history/data-set-history-type.ts +12 -0
  119. package/server/service/data-set-history/data-set-history.ts +217 -0
  120. package/server/service/data-set-history/event-subscriber.ts +17 -0
  121. package/server/service/data-set-history/index.ts +7 -0
  122. package/server/service/data-spec/data-spec-manager.ts +21 -0
  123. package/server/service/data-spec/data-spec-query.ts +21 -0
  124. package/server/service/data-spec/data-spec.ts +45 -0
  125. package/server/service/data-spec/index.ts +5 -0
  126. package/server/service/data-summary/data-summary-mutation.ts +45 -0
  127. package/server/service/data-summary/data-summary-query.ts +179 -0
  128. package/server/service/data-summary/data-summary-type.ts +86 -0
  129. package/server/service/data-summary/data-summary.ts +170 -0
  130. package/server/service/data-summary/index.ts +7 -0
  131. package/server/service/index.ts +57 -0
  132. package/server/tsconfig.json +10 -0
  133. package/server/utils/config-resolver.ts +29 -0
  134. package/server/utils/index.ts +1 -0
@@ -0,0 +1,249 @@
1
+ import '@operato/dataset/ox-data-sample-view.js'
2
+ import '@operato/dataset/ox-data-ooc-brief-view.js'
3
+ import '@things-factory/worklist/dist-client/components/activity-thread-timeline.js'
4
+
5
+ import gql from 'graphql-tag'
6
+ import { PropertyValues, html, css, nothing } from 'lit'
7
+ import { customElement, state } from 'lit/decorators.js'
8
+ import { PageView } from '@operato/shell'
9
+ import { i18next, localize } from '@operato/i18n'
10
+ import { client } from '@operato/graphql'
11
+
12
+ /**
13
+ * 이 페이지는 여러개의 Data Sample을 한번에 프린트하기 위한 용도로 사용되는 페이지이다.
14
+ */
15
+ @customElement('data-samples-page')
16
+ export class DataSamplesPage extends localize(i18next)(PageView) {
17
+ static styles = [
18
+ css`
19
+ :host {
20
+ display: block;
21
+ overflow: auto;
22
+ }
23
+
24
+ .end {
25
+ page-break-after: always;
26
+ break-after: always;
27
+ }
28
+ `
29
+ ]
30
+
31
+ @state() dataSamples?: any[]
32
+
33
+ get context() {
34
+ return {
35
+ title: i18next.t('title.data-sample view')
36
+ }
37
+ }
38
+
39
+ render() {
40
+ return this.dataSamples?.map(dataSample => {
41
+ if (dataSample?.dataOoc) {
42
+ var reviewActivityThread = dataSample.dataOoc.reviewActivityInstance?.activityThreads?.[0]
43
+ var resolveActivityThread = dataSample.dataOoc.resolveActivityInstance?.activityThreads?.[0]
44
+ } else {
45
+ var reviewActivityThread = dataSample?.reviewActivityInstance?.activityThreads?.[0]
46
+ }
47
+
48
+ return html`
49
+ ${!dataSample.dataOoc
50
+ ? html` <ox-data-sample-view .dataSample=${dataSample}></ox-data-sample-view> `
51
+ : html` <ox-data-ooc-brief-view .dataOoc=${dataSample.dataOoc}></ox-data-ooc-brief-view>`}
52
+ ${reviewActivityThread
53
+ ? html`
54
+ <activity-thread-timeline
55
+ subtitle=${String(i18next.t(dataSample?.dataOoc ? 'label.ooc review timeline' : 'label.datasample review timeline'))}
56
+ .activityThread=${reviewActivityThread}
57
+ short-form
58
+ ></activity-thread-timeline>
59
+ `
60
+ : nothing}
61
+ ${resolveActivityThread
62
+ ? html`
63
+ <activity-thread-timeline
64
+ subtitle=${String(i18next.t('label.ooc resolve timeline'))}
65
+ .activityThread=${resolveActivityThread}
66
+ short-form
67
+ ></activity-thread-timeline>
68
+ `
69
+ : nothing}
70
+ <div class="end"></div>
71
+ `
72
+ })
73
+ }
74
+
75
+ updated(changes: PropertyValues<this>) {}
76
+
77
+ pageUpdated(changes: any, lifecycle: any, before: any) {
78
+ if (this.active) {
79
+ /*
80
+ * this page is activated
81
+ */
82
+ const { ids = '' } = lifecycle.params
83
+
84
+ this.fetchSamples(ids.split('|').map(id => id.trim()))
85
+ } else {
86
+ /* this page is deactivated */
87
+ }
88
+ }
89
+
90
+ async fetchSamples(ids: string[]) {
91
+ const filters = [
92
+ {
93
+ name: 'id',
94
+ operator: 'in',
95
+ value: ids
96
+ }
97
+ ]
98
+
99
+ const response = await client.query({
100
+ query: gql`
101
+ query ($filters: [Filter!]) {
102
+ dataSamples(filters: $filters) {
103
+ items {
104
+ id
105
+ name
106
+ description
107
+ useCase
108
+ key01
109
+ key02
110
+ key03
111
+ key04
112
+ key05
113
+ data
114
+ ooc
115
+ oos
116
+ updatedAt
117
+ collectedAt
118
+ updater {
119
+ id
120
+ name
121
+ }
122
+ dataSet {
123
+ id
124
+ name
125
+ description
126
+ }
127
+ dataItems {
128
+ name
129
+ description
130
+ active
131
+ hidden
132
+ tag
133
+ group
134
+ type
135
+ unit
136
+ options
137
+ quota
138
+ spec
139
+ stat
140
+ }
141
+ judgment
142
+ workDate
143
+ workShift
144
+ reviewActivityInstance {
145
+ ...ActivityInstanceFragment
146
+ }
147
+ dataOoc {
148
+ name
149
+ description
150
+ useCase
151
+ dataSet {
152
+ id
153
+ name
154
+ }
155
+ key01
156
+ key02
157
+ key03
158
+ key04
159
+ key05
160
+ partitionKeys
161
+ dataItems {
162
+ name
163
+ description
164
+ active
165
+ hidden
166
+ tag
167
+ group
168
+ type
169
+ unit
170
+ options
171
+ quota
172
+ spec
173
+ stat
174
+ }
175
+ data
176
+ rawData
177
+ judgment
178
+ ooc
179
+ oos
180
+ state
181
+ history
182
+ workDate
183
+ workShift
184
+ correctiveInstruction
185
+ correctiveAction
186
+ reviewedAt
187
+ reviewer {
188
+ id
189
+ name
190
+ }
191
+ correctedAt
192
+ corrector {
193
+ id
194
+ name
195
+ }
196
+ updater {
197
+ id
198
+ name
199
+ }
200
+ updatedAt
201
+ collectedAt
202
+ reviewActivityInstance {
203
+ ...ActivityInstanceFragment
204
+ }
205
+ resolveActivityInstance {
206
+ ...ActivityInstanceFragment
207
+ }
208
+ }
209
+ }
210
+ }
211
+ }
212
+
213
+ fragment ActivityInstanceFragment on ActivityInstance {
214
+ activityThreads {
215
+ assignee {
216
+ name
217
+ }
218
+ output
219
+ activityApprovals {
220
+ judgment
221
+ approver {
222
+ name
223
+ }
224
+ comment
225
+ createdAt
226
+ updatedAt
227
+ terminatedAt
228
+ }
229
+ activityThreadHistories {
230
+ transaction
231
+ reason
232
+ updater {
233
+ name
234
+ }
235
+ updatedAt
236
+ state
237
+ output
238
+ }
239
+ }
240
+ }
241
+ `,
242
+ variables: {
243
+ filters
244
+ }
245
+ })
246
+
247
+ this.dataSamples = response.data.dataSamples.items
248
+ }
249
+ }
@@ -0,0 +1,456 @@
1
+ import '@material/web/icon/icon.js'
2
+ import '@operato/data-grist'
3
+ import '@operato/context/ox-context-page-toolbar.js'
4
+
5
+ import gql from 'graphql-tag'
6
+ import { css, html } from 'lit'
7
+ import { customElement, property, query, state } from 'lit/decorators.js'
8
+
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 } from '@operato/layout'
14
+ import { PageView, store } from '@operato/shell'
15
+ import { CommonGristStyles, CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'
16
+ import { isMobileDevice } from '@operato/utils'
17
+ import { DataGrist, FetchOption } from '@operato/data-grist'
18
+ import { OxPrompt } from '@operato/popup/ox-prompt.js'
19
+
20
+ import { p13n } from '@operato/p13n'
21
+
22
+ @customElement('data-sensor-list-page')
23
+ export class DataSensorListPage extends connect(store)(p13n(localize(i18next)(PageView))) {
24
+ static styles = [
25
+ ScrollbarStyles,
26
+ CommonGristStyles,
27
+ CommonHeaderStyles,
28
+ css`
29
+ :host {
30
+ display: flex;
31
+ flex-direction: column;
32
+
33
+ overflow: hidden;
34
+ }
35
+
36
+ ox-grist {
37
+ overflow-y: auto;
38
+ flex: 1;
39
+ }
40
+
41
+ .header {
42
+ grid-template-areas: 'filters actions';
43
+ }
44
+ `
45
+ ]
46
+
47
+ @state() private gristConfig: any
48
+ @state() private mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'
49
+
50
+ @query('ox-grist') private grist!: DataGrist
51
+
52
+ get context() {
53
+ return {
54
+ title: i18next.t('title.data-sensor list'),
55
+ search: {
56
+ handler: (search: string) => {
57
+ this.grist.searchText = search
58
+ },
59
+ value: this.grist?.searchText || ''
60
+ },
61
+ filter: {
62
+ handler: () => {
63
+ this.grist.toggleHeadroom()
64
+ }
65
+ },
66
+ help: 'dataset/data-sensor',
67
+ actions: [
68
+ {
69
+ icon: 'content_copy',
70
+ title: i18next.t('button.copy'),
71
+ action: this._copyDataSensor.bind(this)
72
+ },
73
+ {
74
+ icon: 'save',
75
+ title: i18next.t('button.save'),
76
+ action: this._updateDataSensor.bind(this)
77
+ },
78
+ {
79
+ icon: 'delete',
80
+ title: i18next.t('button.delete'),
81
+ action: this._deleteDataSensor.bind(this),
82
+ emphasis: {
83
+ danger: true
84
+ }
85
+ }
86
+ ],
87
+ toolbar: false
88
+ }
89
+ }
90
+
91
+ render() {
92
+ const mode = this.mode || (isMobileDevice() ? 'LIST' : 'GRID')
93
+
94
+ return html`
95
+ <ox-grist
96
+ .mode=${mode}
97
+ .config=${this.gristConfig}
98
+ .fetchHandler=${this.fetchHandler.bind(this)}
99
+ .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}
100
+ ?url-params-sensitive=${this.active}
101
+ >
102
+ <div slot="headroom" class="header">
103
+ <div class="filters">
104
+ <ox-filters-form class="filter" autofocus without-search></ox-filters-form>
105
+ </div>
106
+
107
+ <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
108
+ </div>
109
+
110
+ <ox-grist-personalizer slot="setting"></ox-grist-personalizer>
111
+ </ox-grist>
112
+ `
113
+ }
114
+
115
+ async pageInitialized(lifecycle) {
116
+ this.gristConfig = {
117
+ list: { fields: ['name', 'description', 'active'] },
118
+ columns: [
119
+ { type: 'gutter', gutterName: 'sequence', fixed: true },
120
+ { type: 'gutter', gutterName: 'row-selector', multiple: true, fixed: true },
121
+ {
122
+ type: 'string',
123
+ name: 'name',
124
+ label: true,
125
+ header: i18next.t('field.name'),
126
+ record: {
127
+ editable: true
128
+ },
129
+ filter: 'search',
130
+ sortable: true,
131
+ width: 150,
132
+ fixed: true
133
+ },
134
+ {
135
+ type: 'string',
136
+ name: 'description',
137
+ label: true,
138
+ header: i18next.t('field.description'),
139
+ record: {
140
+ editable: true
141
+ },
142
+ filter: 'search',
143
+ width: 200
144
+ },
145
+ {
146
+ type: 'checkbox',
147
+ name: 'active',
148
+ label: true,
149
+ header: i18next.t('field.active'),
150
+ record: {
151
+ editable: true
152
+ },
153
+ sortable: true,
154
+ filter: true,
155
+ width: 60
156
+ },
157
+ {
158
+ type: 'string',
159
+ name: 'deviceId',
160
+ label: true,
161
+ header: i18next.t('field.device-id'),
162
+ record: {
163
+ editable: true
164
+ },
165
+ filter: 'search',
166
+ sortable: true,
167
+ width: 150
168
+ },
169
+ {
170
+ type: 'varname',
171
+ name: 'tag',
172
+ label: true,
173
+ header: i18next.t('field.tag'),
174
+ record: {
175
+ editable: true
176
+ },
177
+ sortable: true,
178
+ filter: 'search',
179
+ width: 150
180
+ },
181
+ {
182
+ type: 'object',
183
+ name: 'appliance',
184
+ header: i18next.t('field.appliance'),
185
+ record: {
186
+ editable: true,
187
+ options: {
188
+ queryName: 'appliances'
189
+ }
190
+ },
191
+ sortable: true,
192
+ width: 120
193
+ },
194
+ {
195
+ type: 'resource-object',
196
+ name: 'decoder',
197
+ header: {
198
+ renderer: i18next.t('field.decoder-scenario')
199
+ },
200
+ record: {
201
+ editable: true,
202
+ options: {
203
+ title: i18next.t('title.lookup scenario'),
204
+ queryName: 'scenarios',
205
+ columns: [
206
+ { name: 'id', hidden: true },
207
+ { name: 'name', header: i18next.t('field.name'), filter: 'search' },
208
+ { name: 'description', header: i18next.t('field.description'), filter: 'search' }
209
+ ],
210
+ list: { fields: ['name', 'description'] }
211
+ }
212
+ },
213
+ filter: false,
214
+ width: 120
215
+ },
216
+ {
217
+ type: 'object',
218
+ name: 'dataSet',
219
+ header: i18next.t('field.data-set'),
220
+ record: {
221
+ editable: true,
222
+ options: {
223
+ queryName: 'dataSets'
224
+ }
225
+ },
226
+ sortable: true,
227
+ width: 120
228
+ },
229
+ {
230
+ type: 'string',
231
+ name: 'refBy',
232
+ label: true,
233
+ header: i18next.t('field.ref-by'),
234
+ record: {
235
+ editable: true
236
+ },
237
+ sortable: true,
238
+ width: 150
239
+ },
240
+ {
241
+ type: 'string',
242
+ name: 'model',
243
+ label: true,
244
+ header: i18next.t('field.model'),
245
+ record: {
246
+ editable: true
247
+ },
248
+ sortable: true,
249
+ width: 150
250
+ },
251
+ {
252
+ type: 'string',
253
+ name: 'brand',
254
+ label: true,
255
+ header: i18next.t('field.brand'),
256
+ record: {
257
+ editable: true
258
+ },
259
+ sortable: true,
260
+ width: 150
261
+ },
262
+ {
263
+ type: 'string',
264
+ name: 'serialNo',
265
+ label: true,
266
+ header: i18next.t('field.serial-no'),
267
+ record: {
268
+ editable: true
269
+ },
270
+ sortable: true,
271
+ width: 150
272
+ },
273
+ {
274
+ type: 'string',
275
+ name: 'netmask',
276
+ label: true,
277
+ header: i18next.t('field.netmask'),
278
+ record: {
279
+ editable: true
280
+ },
281
+ sortable: true,
282
+ width: 150
283
+ },
284
+ {
285
+ type: 'object',
286
+ name: 'updater',
287
+ header: i18next.t('field.updater'),
288
+ record: {
289
+ editable: false
290
+ },
291
+ sortable: true,
292
+ width: 120
293
+ },
294
+ {
295
+ type: 'datetime',
296
+ name: 'updatedAt',
297
+ header: i18next.t('field.updated_at'),
298
+ record: {
299
+ editable: false
300
+ },
301
+ sortable: true,
302
+ width: 180
303
+ }
304
+ ],
305
+ rows: {
306
+ selectable: {
307
+ multiple: true
308
+ }
309
+ },
310
+ sorters: [
311
+ {
312
+ name: 'name'
313
+ }
314
+ ]
315
+ }
316
+ }
317
+
318
+ async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) {
319
+ const response = await client.query({
320
+ query: gql`
321
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
322
+ responses: dataSensors(filters: $filters, pagination: $pagination, sortings: $sortings) {
323
+ items {
324
+ id
325
+ name
326
+ description
327
+ active
328
+ deviceId
329
+ tag
330
+ appliance {
331
+ id
332
+ name
333
+ description
334
+ }
335
+ dataSet {
336
+ id
337
+ name
338
+ description
339
+ }
340
+ decoder {
341
+ id
342
+ name
343
+ description
344
+ }
345
+ refBy
346
+ brand
347
+ model
348
+ serialNo
349
+ netmask
350
+ updater {
351
+ id
352
+ name
353
+ }
354
+ updatedAt
355
+ }
356
+ total
357
+ }
358
+ }
359
+ `,
360
+ variables: {
361
+ filters,
362
+ pagination: { page, limit },
363
+ sortings
364
+ }
365
+ })
366
+
367
+ return {
368
+ total: response.data.responses.total || 0,
369
+ records: response.data.responses.items || []
370
+ }
371
+ }
372
+
373
+ async _deleteDataSensor() {
374
+ if (
375
+ await OxPrompt.open({
376
+ title: i18next.t('text.are_you_sure'),
377
+ text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),
378
+ confirmButton: { text: i18next.t('button.confirm') },
379
+ cancelButton: { text: i18next.t('button.cancel') }
380
+ })
381
+ ) {
382
+ const ids = this.grist.selected.map(record => record.id)
383
+ if (ids && ids.length > 0) {
384
+ const response = await client.mutate({
385
+ mutation: gql`
386
+ mutation ($ids: [String!]!) {
387
+ deleteDataSensors(ids: $ids)
388
+ }
389
+ `,
390
+ variables: {
391
+ ids
392
+ }
393
+ })
394
+
395
+ if (!response.errors) {
396
+ this.grist.fetch()
397
+ notify({
398
+ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
399
+ })
400
+ }
401
+ }
402
+ }
403
+ }
404
+
405
+ async _copyDataSensor() {
406
+ var selected = this.grist.selected
407
+ if (selected.length == 0) return
408
+
409
+ if (!confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.copy') }))) return
410
+ var response = await client.mutate({
411
+ mutation: gql`
412
+ mutation ($ids: [String!]!) {
413
+ copyDataSensors(ids: $ids) {
414
+ id
415
+ }
416
+ }
417
+ `,
418
+ variables: {
419
+ ids: selected.map(r => r.id)
420
+ }
421
+ })
422
+
423
+ if (!response.errors) this.grist.fetch()
424
+ }
425
+
426
+ async _updateDataSensor() {
427
+ let patches = this.grist.dirtyRecords
428
+ if (patches && patches.length) {
429
+ patches = patches.map(patch => {
430
+ let patchField: any = patch.id ? { id: patch.id } : {}
431
+ const dirtyFields = patch.__dirtyfields__
432
+ for (let key in dirtyFields) {
433
+ patchField[key] = dirtyFields[key].after
434
+ }
435
+ patchField.cuFlag = patch.__dirty__
436
+
437
+ return patchField
438
+ })
439
+
440
+ const response = await client.mutate({
441
+ mutation: gql`
442
+ mutation ($patches: [DataSensorPatch!]!) {
443
+ updateMultipleDataSensor(patches: $patches) {
444
+ name
445
+ }
446
+ }
447
+ `,
448
+ variables: {
449
+ patches
450
+ }
451
+ })
452
+
453
+ if (!response.errors) this.grist.fetch()
454
+ }
455
+ }
456
+ }