@things-factory/dataset 5.0.0-alpha.12 → 5.0.0-alpha.15

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 (67) hide show
  1. package/client/bootstrap.js +3 -3
  2. package/client/pages/data-entry-form.js +14 -5
  3. package/client/pages/data-ooc.js +418 -0
  4. package/client/pages/data-sample.js +94 -47
  5. package/client/pages/data-sensor.js +1 -8
  6. package/client/pages/data-set.js +72 -10
  7. package/client/route.js +4 -0
  8. package/dist-server/controllers/data-use-case.js +57 -0
  9. package/dist-server/controllers/data-use-case.js.map +1 -0
  10. package/dist-server/controllers/index.js +17 -0
  11. package/dist-server/controllers/index.js.map +1 -1
  12. package/dist-server/index.js +1 -0
  13. package/dist-server/index.js.map +1 -1
  14. package/dist-server/service/data-item/data-item-type.js +6 -6
  15. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  16. package/dist-server/service/data-item/data-item.js +1 -1
  17. package/dist-server/service/data-item/data-item.js.map +1 -1
  18. package/dist-server/service/data-ooc/data-ooc-mutation.js +130 -0
  19. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  20. package/dist-server/service/data-ooc/data-ooc-query.js +115 -0
  21. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  22. package/dist-server/service/data-ooc/data-ooc-type.js +99 -0
  23. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  24. package/dist-server/service/data-ooc/data-ooc.js +218 -0
  25. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  26. package/dist-server/service/data-ooc/index.js +9 -0
  27. package/dist-server/service/data-ooc/index.js.map +1 -0
  28. package/dist-server/service/data-sample/data-sample-mutation.js +31 -89
  29. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  30. package/dist-server/service/data-sample/data-sample-type.js +5 -43
  31. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  32. package/dist-server/service/data-sample/data-sample.js +17 -3
  33. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  34. package/dist-server/service/data-set/data-set-mutation.js +1 -2
  35. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  36. package/dist-server/service/data-set/data-set-query.js +12 -0
  37. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  38. package/dist-server/service/data-set/data-set-type.js +19 -3
  39. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  40. package/dist-server/service/data-set/data-set.js +22 -10
  41. package/dist-server/service/data-set/data-set.js.map +1 -1
  42. package/dist-server/service/index.js +6 -2
  43. package/dist-server/service/index.js.map +1 -1
  44. package/package.json +15 -14
  45. package/server/controllers/data-use-case.ts +85 -0
  46. package/server/controllers/index.ts +1 -0
  47. package/server/index.ts +1 -0
  48. package/server/service/data-item/data-item-type.ts +3 -4
  49. package/server/service/data-item/data-item.ts +1 -1
  50. package/server/service/data-ooc/data-ooc-mutation.ts +117 -0
  51. package/server/service/data-ooc/data-ooc-query.ts +63 -0
  52. package/server/service/data-ooc/data-ooc-type.ts +62 -0
  53. package/server/service/data-ooc/data-ooc.ts +188 -0
  54. package/server/service/data-ooc/index.ts +6 -0
  55. package/server/service/data-sample/data-sample-mutation.ts +35 -97
  56. package/server/service/data-sample/data-sample-type.ts +3 -31
  57. package/server/service/data-sample/data-sample.ts +19 -3
  58. package/server/service/data-set/data-set-mutation.ts +1 -4
  59. package/server/service/data-set/data-set-query.ts +8 -1
  60. package/server/service/data-set/data-set-type.ts +15 -4
  61. package/server/service/data-set/data-set.ts +17 -7
  62. package/server/service/index.ts +6 -2
  63. package/things-factory.config.js +4 -0
  64. package/translations/en.json +13 -2
  65. package/translations/ko.json +13 -2
  66. package/translations/ms.json +13 -2
  67. package/translations/zh.json +13 -2
@@ -1,5 +1,5 @@
1
1
  import {
2
- Json5Renderer,
2
+ OxGristRendererJson5,
3
3
  registerEditor as registerGristEditor,
4
4
  registerRenderer as registerGristRenderer
5
5
  } from '@operato/data-grist'
@@ -9,8 +9,8 @@ import { OxGristEditorPartitionKeys } from '@operato/app/grist-editor/ox-grist-e
9
9
 
10
10
  export default function bootstrap() {
11
11
  registerGristEditor('data-item-spec', OxGristEditorDataItemSpec)
12
- registerGristRenderer('data-item-spec', Json5Renderer)
12
+ registerGristRenderer('data-item-spec', OxGristRendererJson5)
13
13
 
14
14
  registerGristEditor('partition-keys', OxGristEditorPartitionKeys)
15
- registerGristRenderer('partition-keys', Json5Renderer)
15
+ registerGristRenderer('partition-keys', OxGristRendererJson5)
16
16
  }
@@ -1,9 +1,10 @@
1
- import gql from 'graphql-tag'
2
- import { css, html, LitElement } from 'lit'
1
+ import '@operato/dataset/ox-data-entry-form.js'
3
2
 
4
- import { client } from '@operato/graphql'
3
+ import { LitElement, css, html } from 'lit'
5
4
  import { i18next, localize } from '@operato/i18n'
6
- import '@operato/dataset/ox-data-entry-form.js'
5
+
6
+ import { client } from '@operato/graphql'
7
+ import gql from 'graphql-tag'
7
8
 
8
9
  class DataEntryForm extends localize(i18next)(LitElement) {
9
10
  static get properties() {
@@ -52,7 +53,9 @@ class DataEntryForm extends localize(i18next)(LitElement) {
52
53
  async _updateDataItems() {
53
54
  const data = this.entryForm.buildValue()
54
55
  const dataSample = {
55
- dataSetId: this.dataSet.id,
56
+ dataSet: {
57
+ id: this.dataSet.id
58
+ },
56
59
  data
57
60
  }
58
61
 
@@ -69,6 +72,12 @@ class DataEntryForm extends localize(i18next)(LitElement) {
69
72
  dataSample
70
73
  }
71
74
  })
75
+
76
+ if (!response.errors) {
77
+ document.dispatchEvent(
78
+ new CustomEvent('notify', { detail: { message: i18next.t('text.data sample created successfully') } })
79
+ )
80
+ }
72
81
  }
73
82
  }
74
83
 
@@ -0,0 +1,418 @@
1
+ import '@operato/data-grist'
2
+
3
+ import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
4
+ import { PageView, store } from '@operato/shell'
5
+ import { css, html } from 'lit'
6
+ import { i18next, localize } from '@operato/i18n'
7
+
8
+ import { client } from '@operato/graphql'
9
+ import { connect } from 'pwa-helpers/connect-mixin'
10
+ import gql from 'graphql-tag'
11
+ import { isMobileDevice } from '@operato/utils'
12
+ import { notify } from '@operato/layout'
13
+
14
+ export class DataOoc extends connect(store)(localize(i18next)(PageView)) {
15
+ static get properties() {
16
+ return {
17
+ active: String,
18
+ gristConfig: Object
19
+ }
20
+ }
21
+
22
+ static get styles() {
23
+ return [
24
+ ScrollbarStyles,
25
+ css`
26
+ :host {
27
+ display: flex;
28
+ flex-direction: column;
29
+
30
+ overflow: hidden;
31
+ }
32
+
33
+ ox-grist {
34
+ overflow-y: auto;
35
+ flex: 1;
36
+ }
37
+
38
+ #filters {
39
+ display: flex;
40
+ flex-direction: row;
41
+ justify-content: space-between;
42
+
43
+ background-color: white;
44
+ }
45
+
46
+ #filters > * {
47
+ padding: var(--padding-default) var(--padding-wide);
48
+ }
49
+ `
50
+ ]
51
+ }
52
+
53
+ get context() {
54
+ return {
55
+ title: i18next.t('title.data-ooc list'),
56
+ help: 'integration/ui/data-ooc',
57
+ actions: [
58
+ {
59
+ title: i18next.t('button.delete'),
60
+ action: this._deleteDataOoc.bind(this),
61
+ ...CommonButtonStyles.delete
62
+ }
63
+ ],
64
+ exportable: {
65
+ name: i18next.t('title.data-ooc list'),
66
+ data: this._exportableData.bind(this)
67
+ }
68
+ }
69
+ }
70
+
71
+ render() {
72
+ return html`
73
+ <ox-grist
74
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
75
+ .config=${this.gristConfig}
76
+ .fetchHandler=${this.fetchHandler.bind(this)}
77
+ >
78
+ <div slot="headroom" id="filters">
79
+ <ox-filters-form></ox-filters-form>
80
+ </div>
81
+ </ox-grist>
82
+ `
83
+ }
84
+
85
+ get grist() {
86
+ return this.renderRoot.querySelector('ox-grist')
87
+ }
88
+
89
+ // update with url params value
90
+ _updateSearchConfig(lifecycle) {
91
+ // this.searchConfig = this.searchConfig.map(conf => {
92
+ // if (conf.name in lifecycle.params) {
93
+ // conf.value = lifecycle.params[conf.name]
94
+ // } else {
95
+ // delete conf.value
96
+ // }
97
+ // return conf
98
+ // })
99
+ }
100
+
101
+ // set default field value to record with searchConfig
102
+ _setDefaultFieldsValue(fields) {
103
+ // this.searchConfig.forEach(conf => {
104
+ // if (!fields[conf.name] && conf.value) {
105
+ // fields[conf.name] = conf.value
106
+ // }
107
+ // })
108
+ }
109
+
110
+ async pageInitialized(lifecycle) {
111
+ this._updateSearchConfig(lifecycle)
112
+
113
+ this.gristConfig = {
114
+ list: {
115
+ fields: ['dataSet', 'data', 'spec', 'correctiveAction', 'corrector', 'correctedAt', 'collectedAt', 'creator']
116
+ },
117
+ columns: [
118
+ { type: 'gutter', gutterName: 'sequence' },
119
+ { type: 'gutter', gutterName: 'row-selector', multiple: true },
120
+ {
121
+ type: 'string',
122
+ name: 'name',
123
+ label: true,
124
+ header: i18next.t('field.name'),
125
+ record: {
126
+ editable: true
127
+ },
128
+ filter: 'search',
129
+ sortable: true,
130
+ width: 120,
131
+ imex: true
132
+ },
133
+ {
134
+ type: 'string',
135
+ name: 'description',
136
+ label: true,
137
+ header: i18next.t('field.description'),
138
+ record: {
139
+ editable: true
140
+ },
141
+ filter: 'search',
142
+ width: 150,
143
+ imex: true
144
+ },
145
+ {
146
+ type: 'checkbox',
147
+ name: 'ooc',
148
+ header: i18next.t('field.ooc'),
149
+ record: {
150
+ editable: false
151
+ },
152
+ width: 30
153
+ },
154
+ {
155
+ type: 'checkbox',
156
+ name: 'oos',
157
+ header: i18next.t('field.oos'),
158
+ record: {
159
+ editable: false
160
+ },
161
+ width: 30
162
+ },
163
+ {
164
+ type: 'string',
165
+ name: 'state',
166
+ label: true,
167
+ header: i18next.t('field.state'),
168
+ record: {
169
+ editable: false
170
+ },
171
+ width: 150,
172
+ imex: true
173
+ },
174
+ {
175
+ type: 'textarea',
176
+ name: 'correctiveAction',
177
+ label: true,
178
+ header: i18next.t('field.corrective-action'),
179
+ record: {
180
+ editable: true
181
+ },
182
+ width: 150,
183
+ imex: true
184
+ },
185
+ {
186
+ type: 'resource-object',
187
+ name: 'dataSet',
188
+ header: i18next.t('field.data-set'),
189
+ record: {
190
+ editable: false
191
+ },
192
+ sortable: true,
193
+ width: 120,
194
+ imex: true
195
+ },
196
+ {
197
+ type: 'resource-object',
198
+ name: 'dataSample',
199
+ header: i18next.t('field.data-sample'),
200
+ record: {
201
+ editable: false
202
+ },
203
+ sortable: true,
204
+ width: 120,
205
+ imex: true
206
+ },
207
+ {
208
+ type: 'json5',
209
+ name: 'partitionKeys',
210
+ header: i18next.t('field.partition-keys'),
211
+ record: {
212
+ editable: false
213
+ },
214
+ width: 200,
215
+ imex: true
216
+ },
217
+ {
218
+ type: 'json5',
219
+ name: 'data',
220
+ header: i18next.t('field.data'),
221
+ record: {
222
+ editable: false
223
+ },
224
+ width: 200,
225
+ imex: true
226
+ },
227
+ {
228
+ type: 'json5',
229
+ name: 'spec',
230
+ header: i18next.t('field.spec'),
231
+ record: {
232
+ editable: false
233
+ },
234
+ width: 200
235
+ },
236
+ {
237
+ type: 'text',
238
+ name: 'rawData',
239
+ header: i18next.t('field.raw-data'),
240
+ record: {
241
+ editable: false
242
+ },
243
+ width: 200,
244
+ imex: true
245
+ },
246
+ {
247
+ type: 'resource-object',
248
+ name: 'updater',
249
+ header: i18next.t('field.updater'),
250
+ sortable: true,
251
+ width: 120,
252
+ imex: true
253
+ },
254
+ {
255
+ type: 'datetime',
256
+ name: 'updatedAt',
257
+ header: i18next.t('field.updated_at'),
258
+ sortable: true,
259
+ width: 180,
260
+ imex: true
261
+ },
262
+ {
263
+ type: 'datetime',
264
+ name: 'collectedAt',
265
+ header: i18next.t('field.collected_at'),
266
+ sortable: true,
267
+ width: 180,
268
+ imex: true
269
+ }
270
+ ],
271
+ rows: {
272
+ appendable: false,
273
+ selectable: {
274
+ multiple: true
275
+ }
276
+ },
277
+ sorters: [
278
+ {
279
+ name: 'updatedAt',
280
+ desc: true
281
+ }
282
+ ]
283
+ }
284
+
285
+ await this.updateComplete
286
+
287
+ this.grist.fetch()
288
+ }
289
+
290
+ async pageUpdated(changes, lifecycle) {
291
+ if (this.active) {
292
+ // update with url params value
293
+ this._updateSearchConfig(lifecycle)
294
+ await this.updateComplete
295
+
296
+ this.grist.fetch()
297
+ }
298
+ }
299
+
300
+ async fetchHandler({ page, limit, sortings = [], filters = [] }) {
301
+ const response = await client.query({
302
+ query: gql`
303
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
304
+ responses: dataOocs(filters: $filters, pagination: $pagination, sortings: $sortings) {
305
+ items {
306
+ id
307
+ name
308
+ description
309
+ dataSet {
310
+ id
311
+ name
312
+ }
313
+ dataSample {
314
+ id
315
+ name
316
+ }
317
+ partitionKeys
318
+ data
319
+ state
320
+ spec
321
+ ooc
322
+ oos
323
+ correctiveAction
324
+ correctedAt
325
+ corrector {
326
+ id
327
+ name
328
+ }
329
+ updater {
330
+ id
331
+ name
332
+ }
333
+ updatedAt
334
+ collectedAt
335
+ }
336
+ total
337
+ }
338
+ }
339
+ `,
340
+ variables: {
341
+ filters,
342
+ pagination: { page, limit },
343
+ sortings
344
+ }
345
+ })
346
+
347
+ return {
348
+ total: response.data.responses.total || 0,
349
+ records: response.data.responses.items || []
350
+ }
351
+ }
352
+
353
+ async _deleteDataOoc() {
354
+ if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
355
+ const ids = this.grist.selected.map(record => record.id)
356
+ if (ids && ids.length > 0) {
357
+ const response = await client.mutate({
358
+ mutation: gql`
359
+ mutation ($ids: [String!]!) {
360
+ deleteDataOocs(ids: $ids)
361
+ }
362
+ `,
363
+ variables: {
364
+ ids
365
+ }
366
+ })
367
+
368
+ if (!response.errors) {
369
+ this.grist.fetch()
370
+ notify({
371
+ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
372
+ })
373
+ }
374
+ }
375
+ }
376
+ }
377
+
378
+ _exportableData() {
379
+ let records = []
380
+ if (this.grist.selected && this.grist.selected.length > 0) {
381
+ records = this.grist.selected
382
+ } else {
383
+ records = this.grist.data.records
384
+ }
385
+
386
+ var headerSetting = this.grist.compiledConfig.columns
387
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
388
+ .map(column => {
389
+ return column.imex === true
390
+ ? {
391
+ header: column.header.renderer(),
392
+ key: column.name,
393
+ width: column.width,
394
+ type: column.type
395
+ }
396
+ : column.imex
397
+ })
398
+
399
+ var data = records.map(item => {
400
+ return {
401
+ id: item.id,
402
+ ...this.gristConfig.columns
403
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
404
+ .reduce((record, column) => {
405
+ const key = column.imex === true ? column.name : column.imex.key
406
+ record[key] = key
407
+ .split('.')
408
+ .reduce((obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), item)
409
+ return record
410
+ }, {})
411
+ }
412
+ })
413
+
414
+ return { header: headerSetting, data: data }
415
+ }
416
+ }
417
+
418
+ window.customElements.define('data-ooc-page', DataOoc)