@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
@@ -0,0 +1,463 @@
1
+ import '@operato/data-grist'
2
+ import '@operato/board/ox-board-viewer.js'
3
+
4
+ import gql from 'graphql-tag'
5
+ import JSON5 from 'json5'
6
+ import { css, html } from 'lit'
7
+ import { connect } from 'pwa-helpers/connect-mixin'
8
+
9
+ import { getRenderer } from '@operato/data-grist'
10
+ import { OxDataUseCase } from '@operato/dataset'
11
+ import { client } from '@operato/graphql'
12
+ import { i18next, localize } from '@operato/i18n'
13
+ import { openPopup } from '@operato/layout'
14
+ import { navigate, PageView, store } from '@operato/shell'
15
+ import { CommonGristStyles, ScrollbarStyles } from '@operato/styles'
16
+ import { provider } from '@things-factory/board-ui'
17
+
18
+ const USECASE_OPTIONS = () => {
19
+ return ['', ...OxDataUseCase.getUseCaseNames()].map(name => {
20
+ return {
21
+ display: name,
22
+ value: name
23
+ }
24
+ })
25
+ }
26
+
27
+ const showMonitorView = (columns, data, column, record, rowIndex) => {
28
+ const { name, monitorType, monitorView } = record
29
+ const title = `${name} - ${i18next.t('title.data-monitor-view')}`
30
+
31
+ switch (monitorType) {
32
+ case 'generated':
33
+ openPopup(html` <div style="background-color: white;">Under construction</div> `, {
34
+ backdrop: true,
35
+ size: 'large',
36
+ title
37
+ })
38
+ break
39
+
40
+ case 'board':
41
+ const board = {
42
+ id: monitorView
43
+ }
44
+ openPopup(
45
+ html`
46
+ <ox-board-viewer
47
+ style="background-color: white;"
48
+ .board=${board}
49
+ .provider=${provider}
50
+ hide-fullscreen
51
+ hide-navigation
52
+ ></ox-board-viewer>
53
+ `,
54
+ {
55
+ closable: true,
56
+ backdrop: true,
57
+ size: 'large',
58
+ title
59
+ }
60
+ )
61
+
62
+ // navigate(`board-viewer/${monitorView}?interactive=true&title=${title}`)
63
+ break
64
+
65
+ case 'page':
66
+ navigate(monitorView)
67
+ break
68
+
69
+ case 'external':
70
+ window.open(monitorView, '_blank')
71
+ break
72
+ }
73
+ }
74
+
75
+ const showReportView = (columns, data, column, record, rowIndex) => {
76
+ const { name, reportType, reportView } = record
77
+ const title = `${name} - ${i18next.t('title.data-report-view')}`
78
+
79
+ switch (reportType) {
80
+ case 'generated':
81
+ openPopup(html` <div style="background-color: white;">Under construction</div> `, {
82
+ backdrop: true,
83
+ size: 'large',
84
+ title
85
+ })
86
+ break
87
+
88
+ case 'custom':
89
+ const board = {
90
+ id: reportView
91
+ }
92
+ openPopup(html` <div style="background-color: white;">Under construction</div> `, {
93
+ closable: true,
94
+ backdrop: true,
95
+ size: 'large',
96
+ title
97
+ })
98
+
99
+ break
100
+
101
+ case 'page':
102
+ navigate(reportView)
103
+ break
104
+
105
+ case 'external':
106
+ window.open(reportView, '_blank')
107
+ break
108
+ }
109
+ }
110
+
111
+ export class DataReportListPage extends connect(store)(localize(i18next)(PageView)) {
112
+ static get properties() {
113
+ return {
114
+ active: String,
115
+ gristConfig: Object,
116
+ filters: Object,
117
+ sorters: Object,
118
+ mode: String
119
+ }
120
+ }
121
+
122
+ static get styles() {
123
+ return [
124
+ ScrollbarStyles,
125
+ CommonGristStyles,
126
+ css`
127
+ :host {
128
+ display: flex;
129
+
130
+ width: 100%;
131
+
132
+ --grid-record-emphasized-background-color: red;
133
+ --grid-record-emphasized-color: yellow;
134
+ }
135
+ `
136
+ ]
137
+ }
138
+
139
+ get context() {
140
+ return {
141
+ title: i18next.t('title.data-entry list'),
142
+ help: 'dataset/data-entry-list'
143
+ }
144
+ }
145
+
146
+ render() {
147
+ const mode = 'CARD'
148
+
149
+ return html`
150
+ <ox-grist
151
+ .mode=${mode}
152
+ .config=${this.gristConfig}
153
+ .filters=${this.filters}
154
+ .orders=${this.orders}
155
+ .fetchHandler=${this.fetchHandler.bind(this)}
156
+ >
157
+ <div slot="headroom" id="filters">
158
+ <div id="filters">
159
+ <ox-filters-form></ox-filters-form>
160
+ </div>
161
+
162
+ <div id="sorters">
163
+ Sort
164
+ <mwc-icon
165
+ @click=${e => {
166
+ const target = e.currentTarget
167
+ this.renderRoot.querySelector('#sorter-control').open({
168
+ right: 0,
169
+ top: target.offsetTop + target.offsetHeight
170
+ })
171
+ }}
172
+ >expand_more</mwc-icon
173
+ >
174
+ <ox-popup id="sorter-control">
175
+ <ox-sorters-control> </ox-sorters-control>
176
+ </ox-popup>
177
+ </div>
178
+ </div>
179
+ </ox-grist>
180
+ `
181
+ }
182
+
183
+ get grist() {
184
+ return this.renderRoot.querySelector('ox-grist')
185
+ }
186
+
187
+ async pageInitialized(lifecycle) {
188
+ this.gristConfig = {
189
+ list: {
190
+ thumbnail: 'monitorView',
191
+ fields: ['name', 'description'],
192
+ details: ['schedule', 'type', 'useCase', 'latestCollectedAt', 'prevSchedule', 'nextSchedule']
193
+ },
194
+ columns: [
195
+ {
196
+ type: 'gutter',
197
+ gutterName: 'button',
198
+ icon: 'newspaper',
199
+ handlers: {
200
+ click: showReportView
201
+ }
202
+ },
203
+ {
204
+ type: 'gutter',
205
+ gutterName: 'button',
206
+ icon: 'analytics',
207
+ handlers: {
208
+ click: showMonitorView
209
+ }
210
+ },
211
+ {
212
+ type: 'string',
213
+ name: 'name',
214
+ header: i18next.t('field.name'),
215
+ record: {
216
+ editable: false
217
+ },
218
+ filter: 'search',
219
+ sortable: true,
220
+ width: 150
221
+ },
222
+ {
223
+ type: 'string',
224
+ name: 'description',
225
+ header: i18next.t('field.description'),
226
+ record: {
227
+ editable: false
228
+ },
229
+ filter: 'search',
230
+ width: 200
231
+ },
232
+ {
233
+ type: 'select',
234
+ name: 'type',
235
+ label: true,
236
+ header: i18next.t('field.type'),
237
+ record: {
238
+ editable: false,
239
+ options: [
240
+ {},
241
+ {
242
+ display: i18next.t('text.manually collected'),
243
+ value: 'manual'
244
+ },
245
+ {
246
+ display: i18next.t('text.automatically collected'),
247
+ value: 'automatic'
248
+ }
249
+ ]
250
+ },
251
+ sortable: true,
252
+ filter: true,
253
+ width: 60
254
+ },
255
+ {
256
+ type: 'select',
257
+ name: 'useCase',
258
+ label: true,
259
+ header: i18next.t('field.use-case'),
260
+ record: {
261
+ editable: false,
262
+ options: USECASE_OPTIONS
263
+ },
264
+ sortable: true,
265
+ filter: {
266
+ operator: 'eq',
267
+ options: USECASE_OPTIONS /* in case select options type is a function, filter should have its own options */
268
+ },
269
+ width: 80
270
+ },
271
+ {
272
+ type: 'crontab',
273
+ name: 'schedule',
274
+ label: true,
275
+ header: i18next.t('field.schedule'),
276
+ record: {
277
+ editable: false
278
+ },
279
+ width: 80,
280
+ label: true
281
+ },
282
+ {
283
+ type: 'resource-object',
284
+ name: 'entryRole',
285
+ header: i18next.t('field.entry-role'),
286
+ record: {
287
+ editable: false
288
+ },
289
+ width: 120
290
+ },
291
+ {
292
+ type: 'resource-object',
293
+ name: 'supervisoryRole',
294
+ header: i18next.t('field.supervisory-role'),
295
+ record: {
296
+ editable: false
297
+ },
298
+ width: 120
299
+ },
300
+ {
301
+ type: 'datetime',
302
+ name: 'latestCollectedAt',
303
+ label: true,
304
+ header: i18next.t('field.latest-collected-at'),
305
+ record: {
306
+ editable: false
307
+ },
308
+ width: 180
309
+ },
310
+ {
311
+ type: 'datetime',
312
+ name: 'prevSchedule',
313
+ label: true,
314
+ header: i18next.t('field.prev-schedule'),
315
+ record: {
316
+ editable: false
317
+ },
318
+ width: 180
319
+ },
320
+ {
321
+ type: 'datetime',
322
+ name: 'nextSchedule',
323
+ label: true,
324
+ header: i18next.t('field.next-schedule'),
325
+ record: {
326
+ editable: false
327
+ },
328
+ width: 180
329
+ },
330
+ {
331
+ type: 'string',
332
+ name: 'monitorView',
333
+ hidden: true,
334
+ record: {
335
+ editable: false,
336
+ renderer: function (value, column, record, rowIndex, field) {
337
+ const type = record.monitorType !== 'board' ? 'string' : 'image'
338
+ value = record.monitorType !== 'board' ? value : record.monitorBoard?.thumbnail
339
+
340
+ return getRenderer(type)(value, column, record, rowIndex, field)
341
+ }
342
+ }
343
+ }
344
+ ],
345
+ rows: {
346
+ selectable: {
347
+ multiple: false
348
+ },
349
+ handlers: {
350
+ click: showReportView
351
+ },
352
+ classifier: function (record, rowIndex) {}
353
+ },
354
+ sorters: [
355
+ {
356
+ name: 'name'
357
+ }
358
+ ]
359
+ }
360
+
361
+ await this.updateComplete
362
+
363
+ this.grist.fetch()
364
+ }
365
+
366
+ async pageUpdated(changes, lifecycle) {
367
+ if (this.active) {
368
+ await this.updateComplete
369
+
370
+ var filters = lifecycle.params?.['filters']
371
+ if (filters) {
372
+ try {
373
+ filters = JSON5.parse(filters)
374
+ this.filters = filters
375
+ } catch (e) {
376
+ console.error(`filters parameter parsing error: ${e}`)
377
+ }
378
+ }
379
+
380
+ var sorters = lifecycle.params?.['sorters']
381
+ if (sorters) {
382
+ try {
383
+ sorters = JSON5.parse(sorters)
384
+ this.sorters = sorters
385
+ } catch (e) {
386
+ console.error(`sorters parameter parsing error: ${e}`)
387
+ }
388
+ }
389
+
390
+ this.grist.fetch()
391
+ }
392
+ }
393
+
394
+ async fetchHandler({ page, limit, sortings = [], filters = [] }) {
395
+ const response = await client.query({
396
+ query: gql`
397
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
398
+ responses: dataSetsForReport(filters: $filters, pagination: $pagination, sortings: $sortings) {
399
+ items {
400
+ id
401
+ name
402
+ description
403
+ partitionKeys
404
+ active
405
+ type
406
+ useCase
407
+ schedule
408
+ timezone
409
+ entryRole {
410
+ id
411
+ name
412
+ }
413
+ supervisoryRole {
414
+ id
415
+ name
416
+ }
417
+ monitorType
418
+ monitorView
419
+ monitorBoard {
420
+ thumbnail
421
+ }
422
+ reportType
423
+ reportView
424
+ updater {
425
+ id
426
+ name
427
+ }
428
+ updatedAt
429
+ dataItems {
430
+ name
431
+ description
432
+ sequence
433
+ active
434
+ tag
435
+ type
436
+ unit
437
+ options
438
+ quota
439
+ spec
440
+ }
441
+ latestCollectedAt
442
+ nextSchedule
443
+ prevSchedule
444
+ }
445
+ total
446
+ }
447
+ }
448
+ `,
449
+ variables: {
450
+ filters,
451
+ pagination: { page, limit },
452
+ sortings
453
+ }
454
+ })
455
+
456
+ return {
457
+ total: response.data.responses.total || 0,
458
+ records: response.data.responses.items || []
459
+ }
460
+ }
461
+ }
462
+
463
+ window.customElements.define('data-report-list-page', DataReportListPage)