@things-factory/dataset 5.0.0-alpha.5 → 5.0.0-alpha.50

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 (107) hide show
  1. package/README.md +9 -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 +483 -0
  7. package/client/pages/data-ooc/data-ooc-view.js +183 -0
  8. package/client/pages/data-report/data-report-embed-page.js +113 -0
  9. package/client/pages/data-report/data-report-list-page.js +465 -0
  10. package/client/pages/data-report/jasper-report-oocs-page.js +122 -0
  11. package/client/pages/data-report/jasper-report-samples-crosstab-page.js +122 -0
  12. package/client/pages/data-report/jasper-report-samples-page.js +122 -0
  13. package/client/pages/data-sample/data-sample-list-page.js +386 -0
  14. package/client/pages/data-sample/data-sample-view.js +98 -0
  15. package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +43 -64
  16. package/client/pages/{data-item-list.js → data-set/data-item-list.js} +37 -12
  17. package/client/pages/{data-set-importer.js → data-set/data-set-importer.js} +0 -0
  18. package/client/pages/data-set/data-set-list-page.js +746 -0
  19. package/client/route.js +34 -6
  20. package/config/config.development.js +13 -0
  21. package/config/config.production.js +1 -0
  22. package/dist-server/controllers/create-data-sample.js +133 -0
  23. package/dist-server/controllers/create-data-sample.js.map +1 -0
  24. package/dist-server/controllers/data-use-case.js +57 -0
  25. package/dist-server/controllers/data-use-case.js.map +1 -0
  26. package/dist-server/controllers/index.js +18 -0
  27. package/dist-server/controllers/index.js.map +1 -1
  28. package/dist-server/controllers/jasper-report.js +156 -0
  29. package/dist-server/controllers/jasper-report.js.map +1 -0
  30. package/dist-server/index.js +1 -0
  31. package/dist-server/index.js.map +1 -1
  32. package/dist-server/routes.js +13 -24
  33. package/dist-server/routes.js.map +1 -1
  34. package/dist-server/service/data-item/data-item-mutation.js +5 -1
  35. package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
  36. package/dist-server/service/data-item/data-item-query.js +7 -2
  37. package/dist-server/service/data-item/data-item-query.js.map +1 -1
  38. package/dist-server/service/data-item/data-item-type.js +15 -7
  39. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  40. package/dist-server/service/data-item/data-item.js +17 -3
  41. package/dist-server/service/data-item/data-item.js.map +1 -1
  42. package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
  43. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  44. package/dist-server/service/data-ooc/data-ooc-query.js +120 -0
  45. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  46. package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
  47. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  48. package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
  49. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  50. package/dist-server/service/data-ooc/data-ooc.js +237 -0
  51. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  52. package/dist-server/service/data-ooc/index.js +10 -0
  53. package/dist-server/service/data-ooc/index.js.map +1 -0
  54. package/dist-server/service/data-sample/data-sample-mutation.js +2 -138
  55. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  56. package/dist-server/service/data-sample/data-sample-query.js +7 -2
  57. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  58. package/dist-server/service/data-sample/data-sample-type.js +12 -42
  59. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  60. package/dist-server/service/data-sample/data-sample.js +34 -3
  61. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  62. package/dist-server/service/data-sensor/data-sensor-query.js +7 -2
  63. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  64. package/dist-server/service/data-set/data-set-mutation.js +40 -14
  65. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  66. package/dist-server/service/data-set/data-set-query.js +185 -3
  67. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  68. package/dist-server/service/data-set/data-set-type.js +84 -3
  69. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  70. package/dist-server/service/data-set/data-set.js +110 -15
  71. package/dist-server/service/data-set/data-set.js.map +1 -1
  72. package/dist-server/service/index.js +6 -2
  73. package/dist-server/service/index.js.map +1 -1
  74. package/package.json +19 -13
  75. package/server/controllers/create-data-sample.ts +177 -0
  76. package/server/controllers/data-use-case.ts +85 -0
  77. package/server/controllers/index.ts +2 -0
  78. package/server/controllers/jasper-report.ts +170 -0
  79. package/server/index.ts +1 -0
  80. package/server/routes.ts +21 -31
  81. package/server/service/data-item/data-item-mutation.ts +6 -1
  82. package/server/service/data-item/data-item-query.ts +9 -3
  83. package/server/service/data-item/data-item-type.ts +10 -6
  84. package/server/service/data-item/data-item.ts +15 -4
  85. package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
  86. package/server/service/data-ooc/data-ooc-query.ts +69 -0
  87. package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
  88. package/server/service/data-ooc/data-ooc-type.ts +68 -0
  89. package/server/service/data-ooc/data-ooc.ts +204 -0
  90. package/server/service/data-ooc/index.ts +7 -0
  91. package/server/service/data-sample/data-sample-mutation.ts +3 -172
  92. package/server/service/data-sample/data-sample-query.ts +9 -3
  93. package/server/service/data-sample/data-sample-type.ts +7 -28
  94. package/server/service/data-sample/data-sample.ts +33 -3
  95. package/server/service/data-sensor/data-sensor-query.ts +9 -3
  96. package/server/service/data-set/data-set-mutation.ts +53 -14
  97. package/server/service/data-set/data-set-query.ts +156 -4
  98. package/server/service/data-set/data-set-type.ts +65 -4
  99. package/server/service/data-set/data-set.ts +100 -12
  100. package/server/service/index.ts +6 -2
  101. package/things-factory.config.js +35 -7
  102. package/translations/en.json +46 -3
  103. package/translations/ko.json +45 -3
  104. package/translations/ms.json +44 -3
  105. package/translations/zh.json +44 -3
  106. package/client/pages/data-sample.js +0 -316
  107. package/client/pages/data-set.js +0 -457
@@ -0,0 +1,483 @@
1
+ import '@operato/data-grist'
2
+ import './data-ooc-view.js'
3
+
4
+ import gql from 'graphql-tag'
5
+ import { css, html } from 'lit'
6
+ import { connect } from 'pwa-helpers/connect-mixin'
7
+
8
+ import { client } from '@operato/graphql'
9
+ import { i18next, localize } from '@operato/i18n'
10
+ import { openPopup } from '@operato/layout'
11
+ import { PageView, store } from '@operato/shell'
12
+ import { CommonGristStyles, ScrollbarStyles } from '@operato/styles'
13
+ import { isMobileDevice } from '@operato/utils'
14
+
15
+ export class DataOocListPage extends connect(store)(localize(i18next)(PageView)) {
16
+ static get properties() {
17
+ return {
18
+ active: String,
19
+ gristConfig: Object,
20
+ mode: String
21
+ }
22
+ }
23
+
24
+ static get styles() {
25
+ return [
26
+ ScrollbarStyles,
27
+ CommonGristStyles,
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
+ ]
42
+ }
43
+
44
+ get context() {
45
+ return {
46
+ title: i18next.t('title.data-ooc list'),
47
+ help: 'dataset/data-ooc',
48
+ actions: [
49
+ // {
50
+ // title: i18next.t('button.save'),
51
+ // action: this._updateDataOoc.bind(this),
52
+ // ...CommonButtonStyles.save
53
+ // }
54
+ ],
55
+ exportable: {
56
+ name: i18next.t('title.data-ooc list'),
57
+ data: this._exportableData.bind(this)
58
+ }
59
+ }
60
+ }
61
+
62
+ render() {
63
+ const mode = this.mode || (isMobileDevice() ? 'LIST' : 'GRID')
64
+
65
+ return html`
66
+ <ox-grist
67
+ .mode=${mode}
68
+ .config=${this.gristConfig}
69
+ .fetchHandler=${this.fetchHandler.bind(this)}
70
+ ?url-params-sensitive=${this.active}
71
+ >
72
+ <div slot="headroom">
73
+ <div id="filters">
74
+ <ox-filters-form></ox-filters-form>
75
+ </div>
76
+
77
+ <div id="sorters">
78
+ Sort
79
+ <mwc-icon
80
+ @click=${e => {
81
+ const target = e.currentTarget
82
+ this.renderRoot.querySelector('#sorter-control').open({
83
+ right: 0,
84
+ top: target.offsetTop + target.offsetHeight
85
+ })
86
+ }}
87
+ >expand_more</mwc-icon
88
+ >
89
+ <ox-popup id="sorter-control">
90
+ <ox-sorters-control> </ox-sorters-control>
91
+ </ox-popup>
92
+ </div>
93
+
94
+ <div id="modes">
95
+ <mwc-icon @click=${() => (this.mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</mwc-icon>
96
+ <mwc-icon @click=${() => (this.mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</mwc-icon>
97
+ <mwc-icon @click=${() => (this.mode = 'CARD')} ?active=${mode == 'CARD'}>apps</mwc-icon>
98
+ </div>
99
+ </div>
100
+ </ox-grist>
101
+ `
102
+ }
103
+
104
+ get grist() {
105
+ return this.renderRoot.querySelector('ox-grist')
106
+ }
107
+
108
+ async pageInitialized(lifecycle) {
109
+ this.gristConfig = {
110
+ list: {
111
+ fields: ['dataSet', 'data', 'spec', 'correctiveAction', 'corrector', 'correctedAt', 'collectedAt', 'creator']
112
+ },
113
+ columns: [
114
+ { type: 'gutter', gutterName: 'sequence' },
115
+ { type: 'gutter', gutterName: 'row-selector', multiple: true },
116
+ {
117
+ type: 'gutter',
118
+ gutterName: 'button',
119
+ icon: 'assignment_turned_in',
120
+ handlers: {
121
+ click: (columns, data, column, record, rowIndex) => {
122
+ const popup = openPopup(
123
+ html` <data-ooc-view .dataOoc=${record} style="background-color: white;"></data-ooc-view> `,
124
+ {
125
+ backdrop: true,
126
+ size: 'large',
127
+ title: i18next.t('title.data-ooc view')
128
+ }
129
+ )
130
+ popup.onclosed = () => {
131
+ this.grist.fetch()
132
+ }
133
+ }
134
+ }
135
+ },
136
+ {
137
+ type: 'string',
138
+ name: 'name',
139
+ label: true,
140
+ header: i18next.t('field.name'),
141
+ record: {
142
+ editable: true
143
+ },
144
+ filter: 'search',
145
+ sortable: true,
146
+ width: 120,
147
+ imex: true
148
+ },
149
+ {
150
+ type: 'string',
151
+ name: 'description',
152
+ label: true,
153
+ header: i18next.t('field.description'),
154
+ record: {
155
+ editable: true
156
+ },
157
+ filter: 'search',
158
+ width: 150,
159
+ imex: true
160
+ },
161
+ {
162
+ type: 'string',
163
+ name: 'history',
164
+ hidden: true,
165
+ imex: true
166
+ },
167
+ {
168
+ type: 'checkbox',
169
+ name: 'ooc',
170
+ header: i18next.t('field.ooc'),
171
+ record: {
172
+ editable: false
173
+ },
174
+ width: 30
175
+ },
176
+ {
177
+ type: 'checkbox',
178
+ name: 'oos',
179
+ header: i18next.t('field.oos'),
180
+ record: {
181
+ editable: false
182
+ },
183
+ width: 30
184
+ },
185
+ {
186
+ type: 'select',
187
+ name: 'state',
188
+ label: true,
189
+ header: i18next.t('field.state'),
190
+ record: {
191
+ editable: false,
192
+ options: ['', 'CREATED', 'REVIEWED', 'CORRECTED']
193
+ },
194
+ width: 100,
195
+ filter: true,
196
+ imex: true
197
+ },
198
+ {
199
+ type: 'textarea',
200
+ name: 'correctiveAction',
201
+ label: true,
202
+ header: i18next.t('field.corrective-action'),
203
+ record: {
204
+ editable: true
205
+ },
206
+ width: 150,
207
+ imex: true
208
+ },
209
+ {
210
+ type: 'resource-object',
211
+ name: 'dataSet',
212
+ header: i18next.t('field.data-set'),
213
+ record: {
214
+ editable: false
215
+ },
216
+ sortable: true,
217
+ width: 120,
218
+ imex: true
219
+ },
220
+ {
221
+ type: 'json5',
222
+ name: 'partitionKeys',
223
+ header: i18next.t('field.partition-keys'),
224
+ record: {
225
+ editable: false
226
+ },
227
+ width: 200,
228
+ imex: true
229
+ },
230
+ {
231
+ type: 'json5',
232
+ name: 'data',
233
+ header: i18next.t('field.data'),
234
+ record: {
235
+ editable: false
236
+ },
237
+ width: 200,
238
+ imex: true
239
+ },
240
+ {
241
+ type: 'json5',
242
+ name: 'spec',
243
+ header: i18next.t('field.spec'),
244
+ record: {
245
+ editable: false
246
+ },
247
+ width: 200
248
+ },
249
+ {
250
+ type: 'text',
251
+ name: 'rawData',
252
+ header: i18next.t('field.raw-data'),
253
+ record: {
254
+ editable: false
255
+ },
256
+ width: 200,
257
+ imex: true
258
+ },
259
+ {
260
+ type: 'string',
261
+ name: 'workDate',
262
+ header: i18next.t('field.work-date'),
263
+ sortable: true,
264
+ width: 80,
265
+ imex: true
266
+ },
267
+ {
268
+ type: 'string',
269
+ name: 'workShift',
270
+ header: i18next.t('field.work-shift'),
271
+ sortable: true,
272
+ width: 40,
273
+ imex: true
274
+ },
275
+ {
276
+ type: 'datetime',
277
+ name: 'collectedAt',
278
+ header: i18next.t('field.collected-at'),
279
+ sortable: true,
280
+ width: 180,
281
+ imex: true
282
+ },
283
+ {
284
+ type: 'resource-object',
285
+ name: 'updater',
286
+ header: i18next.t('field.updater'),
287
+ sortable: true,
288
+ width: 120,
289
+ imex: true
290
+ },
291
+ {
292
+ type: 'datetime',
293
+ name: 'updatedAt',
294
+ header: i18next.t('field.updated_at'),
295
+ sortable: true,
296
+ width: 180,
297
+ imex: true
298
+ }
299
+ ],
300
+ rows: {
301
+ appendable: false,
302
+ selectable: {
303
+ multiple: true
304
+ }
305
+ },
306
+ sorters: [
307
+ {
308
+ name: 'updatedAt',
309
+ desc: true
310
+ }
311
+ ]
312
+ }
313
+
314
+ await this.updateComplete
315
+
316
+ this.grist.fetch()
317
+ }
318
+
319
+ // async pageUpdated(changes, lifecycle) {
320
+ // if (this.active) {
321
+ // // update with url params value
322
+ // this._updateSearchConfig(lifecycle)
323
+ // await this.updateComplete
324
+
325
+ // this.grist.fetch()
326
+ // }
327
+ // }
328
+
329
+ async fetchHandler({ page, limit, sortings = [], filters = [] }) {
330
+ const response = await client.query({
331
+ query: gql`
332
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
333
+ responses: dataOocs(filters: $filters, pagination: $pagination, sortings: $sortings) {
334
+ items {
335
+ id
336
+ name
337
+ description
338
+ dataSet {
339
+ id
340
+ name
341
+ }
342
+ dataSample {
343
+ id
344
+ name
345
+ }
346
+ partitionKeys
347
+ data
348
+ rawData
349
+ state
350
+ spec
351
+ ooc
352
+ oos
353
+ history
354
+ workDate
355
+ workShift
356
+ correctiveAction
357
+ correctedAt
358
+ corrector {
359
+ id
360
+ name
361
+ }
362
+ updater {
363
+ id
364
+ name
365
+ }
366
+ updatedAt
367
+ collectedAt
368
+ }
369
+ total
370
+ }
371
+ }
372
+ `,
373
+ variables: {
374
+ filters,
375
+ pagination: { page, limit },
376
+ sortings
377
+ }
378
+ })
379
+
380
+ return {
381
+ total: response.data.responses.total || 0,
382
+ records: response.data.responses.items || []
383
+ }
384
+ }
385
+
386
+ // async _updateDataOoc() {
387
+ // let patches = this.grist.dirtyRecords
388
+ // if (patches && patches.length) {
389
+ // patches = patches.map(patch => {
390
+ // let patchField = patch.id ? { id: patch.id } : {}
391
+ // const dirtyFields = patch.__dirtyfields__
392
+ // for (let key in dirtyFields) {
393
+ // patchField[key] = dirtyFields[key].after
394
+ // }
395
+ // this._setDefaultFieldsValue(patchField)
396
+ // patchField.cuFlag = patch.__dirty__
397
+
398
+ // return patchField
399
+ // })
400
+
401
+ // const response = await client.mutate({
402
+ // mutation: gql`
403
+ // mutation ($patches: [DataOocPatch!]!) {
404
+ // updateMultipleDataOoc(patches: $patches) {
405
+ // name
406
+ // }
407
+ // }
408
+ // `,
409
+ // variables: {
410
+ // patches
411
+ // }
412
+ // })
413
+
414
+ // if (!response.errors) this.grist.fetch()
415
+ // }
416
+ // }
417
+
418
+ // async _deleteDataOoc() {
419
+ // if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
420
+ // const ids = this.grist.selected.map(record => record.id)
421
+ // if (ids && ids.length > 0) {
422
+ // const response = await client.mutate({
423
+ // mutation: gql`
424
+ // mutation ($ids: [String!]!) {
425
+ // deleteDataOocs(ids: $ids)
426
+ // }
427
+ // `,
428
+ // variables: {
429
+ // ids
430
+ // }
431
+ // })
432
+
433
+ // if (!response.errors) {
434
+ // this.grist.fetch()
435
+ // notify({
436
+ // message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
437
+ // })
438
+ // }
439
+ // }
440
+ // }
441
+ // }
442
+
443
+ _exportableData() {
444
+ let records = []
445
+ if (this.grist.selected && this.grist.selected.length > 0) {
446
+ records = this.grist.selected
447
+ } else {
448
+ records = this.grist.data.records
449
+ }
450
+
451
+ var headerSetting = this.grist.compiledConfig.columns
452
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
453
+ .map(column => {
454
+ return column.imex === true
455
+ ? {
456
+ header: column.header.renderer(),
457
+ key: column.name,
458
+ width: column.width,
459
+ type: column.type
460
+ }
461
+ : column.imex
462
+ })
463
+
464
+ var data = records.map(item => {
465
+ return {
466
+ id: item.id,
467
+ ...this.gristConfig.columns
468
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
469
+ .reduce((record, column) => {
470
+ const key = column.imex === true ? column.name : column.imex.key
471
+ record[key] = key
472
+ .split('.')
473
+ .reduce((obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), item)
474
+ return record
475
+ }, {})
476
+ }
477
+ })
478
+
479
+ return { header: headerSetting, data: data }
480
+ }
481
+ }
482
+
483
+ window.customElements.define('data-ooc-list-page', DataOocListPage)
@@ -0,0 +1,183 @@
1
+ import '@operato/dataset/ox-data-ooc-view.js'
2
+
3
+ import gql from 'graphql-tag'
4
+ import { css, html, LitElement } from 'lit'
5
+
6
+ import { client } from '@operato/graphql'
7
+ import { i18next, localize } from '@operato/i18n'
8
+ import { ScrollbarStyles } from '@operato/styles'
9
+
10
+ class DataOocView extends localize(i18next)(LitElement) {
11
+ static get styles() {
12
+ return [
13
+ ScrollbarStyles,
14
+ css`
15
+ :host {
16
+ display: flex;
17
+ flex-direction: column;
18
+
19
+ background-color: #fff;
20
+ }
21
+
22
+ div[content] {
23
+ flex: 1;
24
+
25
+ display: flex;
26
+ overflow: auto;
27
+ }
28
+
29
+ ox-data-ooc-view {
30
+ flex: 1;
31
+ padding: var(--padding-wide);
32
+ overflow: auto;
33
+ }
34
+
35
+ label[comment] {
36
+ display: flex;
37
+ flex-direction: column;
38
+
39
+ padding: var(--padding-wide);
40
+ }
41
+
42
+ label[comment] div {
43
+ display: flex;
44
+ }
45
+
46
+ mwc-icon {
47
+ color: var(--status-danger-color);
48
+ }
49
+
50
+ textarea {
51
+ border: var(--input-field-border);
52
+ border-radius: var(--input-border-radius);
53
+ padding: var(--input-field-padding);
54
+ font: var(--input-field-font);
55
+ }
56
+
57
+ .button-container {
58
+ display: flex;
59
+ margin-left: auto;
60
+ padding: var(--padding-default);
61
+ }
62
+ `
63
+ ]
64
+ }
65
+
66
+ static get properties() {
67
+ return {
68
+ dataSet: Object,
69
+ dataOoc: Object
70
+ }
71
+ }
72
+
73
+ get sampleView() {
74
+ return this.renderRoot.querySelector('ox-data-ooc-view')
75
+ }
76
+
77
+ render() {
78
+ const state = this.dataOoc.state
79
+
80
+ return html`
81
+ <div content>
82
+ <ox-data-ooc-view .dataSet=${this.dataSet} .dataOoc=${this.dataOoc}></ox-data-ooc-view>
83
+ </div>
84
+
85
+ ${state === 'CREATED' || state === 'REVIEWED'
86
+ ? html`
87
+ <label comment>
88
+ <div><mwc-icon>build_circle</mwc-icon> <span>correction activity</span></div>
89
+ <textarea placeholder="조치 내용을 입력해주세요."></textarea>
90
+ </label>
91
+ `
92
+ : html``}
93
+
94
+ <div class="button-container">
95
+ ${state === 'CREATED'
96
+ ? html`<mwc-button raised @click=${() => this._processOoc('REVIEWED')}
97
+ >${i18next.t('button.reviewed')}</mwc-button
98
+ >`
99
+ : state === 'REVIEWED'
100
+ ? html`<mwc-button raised @click=${() => this._processOoc('CORRECTED')}
101
+ >${i18next.t('button.corrected')}</mwc-button
102
+ >`
103
+ : html``}
104
+ </div>
105
+ `
106
+ }
107
+
108
+ updated(changes) {
109
+ if (changes.has('dataOoc')) {
110
+ this.fetchDataSet()
111
+ }
112
+ }
113
+
114
+ async fetchDataSet() {
115
+ const id = this.dataOoc?.dataSet?.id
116
+
117
+ if (id) {
118
+ const response = await client.query({
119
+ query: gql`
120
+ query ($id: String!) {
121
+ dataSet(id: $id) {
122
+ id
123
+ name
124
+ description
125
+ useCase
126
+ dataItems {
127
+ id
128
+ name
129
+ description
130
+ active
131
+ unit
132
+ tag
133
+ type
134
+ spec
135
+ }
136
+ }
137
+ }
138
+ `,
139
+ variables: {
140
+ id: this.dataOoc.dataSet.id
141
+ }
142
+ })
143
+
144
+ this.dataSet = response.data.dataSet
145
+ }
146
+ }
147
+
148
+ async _processOoc(state) {
149
+ const commentTextArea = this.renderRoot.querySelector('textarea')
150
+ const comment = commentTextArea && commentTextArea.value
151
+ if (!comment || !comment.trim()) {
152
+ commentTextArea.focus()
153
+ return
154
+ }
155
+
156
+ const patch = {
157
+ state,
158
+ correctiveAction: comment
159
+ }
160
+
161
+ const response = await client.mutate({
162
+ mutation: gql`
163
+ mutation ($id: String!, $patch: DataOocPatch!) {
164
+ updateDataOoc(id: $id, patch: $patch) {
165
+ id
166
+ }
167
+ }
168
+ `,
169
+ variables: {
170
+ id: this.dataOoc.id,
171
+ patch
172
+ }
173
+ })
174
+
175
+ if (!response.errors) {
176
+ document.dispatchEvent(
177
+ new CustomEvent('notify', { detail: { message: i18next.t('text.data ooc updated successfully') } })
178
+ )
179
+ }
180
+ }
181
+ }
182
+
183
+ window.customElements.define('data-ooc-view', DataOocView)