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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) 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 +133 -0
  4. package/client/activities/activity-data-review-view.ts +145 -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.d.ts +1 -5
  44. package/dist-client/activities/activity-data-review-edit.js +5 -143
  45. package/dist-client/activities/activity-data-review-edit.js.map +1 -1
  46. package/dist-client/pages/data-entry/data-entry-list-page.js +2 -2
  47. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
  48. package/dist-client/tsconfig.tsbuildinfo +1 -1
  49. package/dist-server/activities/activity-data-review.js +5 -18
  50. package/dist-server/activities/activity-data-review.js.map +1 -1
  51. package/dist-server/activities/activity-ooc-review.js +52 -13
  52. package/dist-server/activities/activity-ooc-review.js.map +1 -1
  53. package/dist-server/controllers/create-data-sample.js +94 -4
  54. package/dist-server/controllers/create-data-sample.js.map +1 -1
  55. package/dist-server/controllers/index.d.ts +0 -3
  56. package/dist-server/controllers/index.js +0 -3
  57. package/dist-server/controllers/index.js.map +1 -1
  58. package/dist-server/service/data-sample/data-sample-query.d.ts +1 -1
  59. package/dist-server/service/data-sample/data-sample-query.js +3 -3
  60. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  61. package/dist-server/service/index.d.ts +1 -1
  62. package/dist-server/tsconfig.tsbuildinfo +1 -1
  63. package/package.json +26 -26
  64. package/server/activities/activity-data-collect.ts +100 -0
  65. package/server/activities/activity-data-review.ts +82 -0
  66. package/server/activities/activity-ooc-resolve.ts +123 -0
  67. package/server/activities/activity-ooc-review.ts +144 -0
  68. package/server/activities/index.ts +11 -0
  69. package/server/controllers/create-data-sample.ts +426 -0
  70. package/server/controllers/data-use-case.ts +98 -0
  71. package/server/controllers/finalize-data-collection.ts +388 -0
  72. package/server/controllers/index.ts +3 -0
  73. package/server/controllers/issue-data-collection-task.ts +70 -0
  74. package/server/controllers/jasper-report.ts +186 -0
  75. package/server/controllers/query-data-summary-by-period.ts +178 -0
  76. package/server/controllers/shiny-report.ts +54 -0
  77. package/server/engine/index.ts +1 -0
  78. package/server/engine/task/create-data-sample.ts +100 -0
  79. package/server/engine/task/index.ts +2 -0
  80. package/server/engine/task/issue-collect-data.ts +45 -0
  81. package/server/index.ts +8 -0
  82. package/server/routes.ts +188 -0
  83. package/server/service/data-archive/data-archive-mutation.ts +273 -0
  84. package/server/service/data-archive/data-archive-query.ts +58 -0
  85. package/server/service/data-archive/data-archive-type.ts +48 -0
  86. package/server/service/data-archive/data-archive.ts +69 -0
  87. package/server/service/data-archive/index.ts +6 -0
  88. package/server/service/data-key-set/data-key-item-type.ts +31 -0
  89. package/server/service/data-key-set/data-key-set-mutation.ts +201 -0
  90. package/server/service/data-key-set/data-key-set-query.ts +68 -0
  91. package/server/service/data-key-set/data-key-set-type.ts +70 -0
  92. package/server/service/data-key-set/data-key-set.ts +86 -0
  93. package/server/service/data-key-set/index.ts +6 -0
  94. package/server/service/data-ooc/data-ooc-mutation.ts +154 -0
  95. package/server/service/data-ooc/data-ooc-query.ts +106 -0
  96. package/server/service/data-ooc/data-ooc-subscription.ts +48 -0
  97. package/server/service/data-ooc/data-ooc-type.ts +71 -0
  98. package/server/service/data-ooc/data-ooc.ts +259 -0
  99. package/server/service/data-ooc/index.ts +7 -0
  100. package/server/service/data-sample/data-sample-mutation.ts +18 -0
  101. package/server/service/data-sample/data-sample-query.ts +215 -0
  102. package/server/service/data-sample/data-sample-type.ts +47 -0
  103. package/server/service/data-sample/data-sample.ts +193 -0
  104. package/server/service/data-sample/index.ts +6 -0
  105. package/server/service/data-sensor/data-sensor-mutation.ts +116 -0
  106. package/server/service/data-sensor/data-sensor-query.ts +76 -0
  107. package/server/service/data-sensor/data-sensor-type.ts +104 -0
  108. package/server/service/data-sensor/data-sensor.ts +126 -0
  109. package/server/service/data-sensor/index.ts +6 -0
  110. package/server/service/data-set/data-item-type.ts +155 -0
  111. package/server/service/data-set/data-set-mutation.ts +552 -0
  112. package/server/service/data-set/data-set-query.ts +461 -0
  113. package/server/service/data-set/data-set-type.ts +204 -0
  114. package/server/service/data-set/data-set.ts +326 -0
  115. package/server/service/data-set/index.ts +6 -0
  116. package/server/service/data-set-history/data-set-history-query.ts +126 -0
  117. package/server/service/data-set-history/data-set-history-type.ts +12 -0
  118. package/server/service/data-set-history/data-set-history.ts +217 -0
  119. package/server/service/data-set-history/event-subscriber.ts +17 -0
  120. package/server/service/data-set-history/index.ts +7 -0
  121. package/server/service/data-spec/data-spec-manager.ts +21 -0
  122. package/server/service/data-spec/data-spec-query.ts +21 -0
  123. package/server/service/data-spec/data-spec.ts +45 -0
  124. package/server/service/data-spec/index.ts +5 -0
  125. package/server/service/data-summary/data-summary-mutation.ts +45 -0
  126. package/server/service/data-summary/data-summary-query.ts +179 -0
  127. package/server/service/data-summary/data-summary-type.ts +86 -0
  128. package/server/service/data-summary/data-summary.ts +170 -0
  129. package/server/service/data-summary/index.ts +7 -0
  130. package/server/service/index.ts +57 -0
  131. package/server/tsconfig.json +10 -0
  132. package/server/utils/config-resolver.ts +29 -0
  133. package/server/utils/index.ts +1 -0
  134. package/translations/en.json +0 -3
  135. package/translations/ja.json +0 -3
  136. package/translations/ko.json +0 -3
  137. package/translations/ms.json +0 -3
  138. package/translations/zh.json +0 -3
  139. package/dist-server/controllers/create-data-ooc.d.ts +0 -4
  140. package/dist-server/controllers/create-data-ooc.js +0 -65
  141. package/dist-server/controllers/create-data-ooc.js.map +0 -1
  142. package/dist-server/controllers/issue-ooc-resolve.d.ts +0 -3
  143. package/dist-server/controllers/issue-ooc-resolve.js +0 -49
  144. package/dist-server/controllers/issue-ooc-resolve.js.map +0 -1
  145. package/dist-server/controllers/issue-ooc-review.d.ts +0 -3
  146. package/dist-server/controllers/issue-ooc-review.js +0 -47
  147. package/dist-server/controllers/issue-ooc-review.js.map +0 -1
@@ -0,0 +1,442 @@
1
+ import '@material/web/icon/icon.js'
2
+ import '@operato/data-grist'
3
+ import '@operato/context/ox-context-page-toolbar.js'
4
+ import './data-sample-view.js'
5
+
6
+ import gql from 'graphql-tag'
7
+ import { css, html } from 'lit'
8
+ import { customElement, property, query, state } from 'lit/decorators.js'
9
+ import { connect } from 'pwa-helpers/connect-mixin'
10
+ import moment from '@operato/moment-timezone-es'
11
+
12
+ import { DataGrist, FetchOption, GristRecord } from '@operato/data-grist'
13
+ import { client } from '@operato/graphql'
14
+ import { i18next, localize } from '@operato/i18n'
15
+ import { openPopup } from '@operato/layout'
16
+ import { PageView, store } from '@operato/shell'
17
+ import { CommonGristStyles, CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'
18
+ import { isMobileDevice } from '@operato/utils'
19
+ import { GhostPrint } from '@operato/ghost-print'
20
+
21
+ import { p13n } from '@operato/p13n'
22
+
23
+ @customElement('data-sample-list-page')
24
+ export class DataSampleListPage extends connect(store)(p13n(localize(i18next)(PageView))) {
25
+ static styles = [
26
+ ScrollbarStyles,
27
+ CommonGristStyles,
28
+ CommonHeaderStyles,
29
+ css`
30
+ :host {
31
+ display: flex;
32
+ flex-direction: column;
33
+
34
+ overflow: hidden;
35
+
36
+ --grid-header-padding: 2px 0 2px 9px;
37
+ }
38
+
39
+ ox-grist {
40
+ overflow-y: auto;
41
+ flex: 1;
42
+ }
43
+
44
+ .header {
45
+ grid-template-areas: 'filters actions';
46
+ }
47
+ `
48
+ ]
49
+
50
+ @state() gristConfig: any
51
+ @state() mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'
52
+
53
+ @query('ox-grist') private grist!: DataGrist
54
+
55
+ get context() {
56
+ return {
57
+ title: i18next.t('title.data-sample list'),
58
+ search: {
59
+ handler: (search: string) => {
60
+ this.grist.searchText = search
61
+ },
62
+ value: this.grist?.searchText || ''
63
+ },
64
+ filter: {
65
+ handler: () => {
66
+ this.grist.toggleHeadroom()
67
+ }
68
+ },
69
+ help: 'dataset/data-sample',
70
+ actions: [
71
+ {
72
+ title: i18next.t('button.print'),
73
+ action: this.printSamples.bind(this),
74
+ icon: 'print'
75
+ }
76
+ ],
77
+ exportable: {
78
+ name: i18next.t('title.data-sample list'),
79
+ data: this._exportableData.bind(this)
80
+ },
81
+ toolbar: false
82
+ }
83
+ }
84
+
85
+ render() {
86
+ const mode = this.mode || (isMobileDevice() ? 'LIST' : 'GRID')
87
+
88
+ return html`
89
+ <ox-grist
90
+ .mode=${mode}
91
+ .config=${this.gristConfig}
92
+ .fetchHandler=${this.fetchHandler.bind(this)}
93
+ .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}
94
+ ?url-params-sensitive=${false /* this.active */}
95
+ >
96
+ <div slot="headroom" class="header">
97
+ <div class="filters">
98
+ <ox-filters-form class="filter" autofocus without-search></ox-filters-form>
99
+ </div>
100
+
101
+ <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
102
+ </div>
103
+
104
+ <ox-grist-personalizer slot="setting"></ox-grist-personalizer>
105
+ </ox-grist>
106
+ `
107
+ }
108
+
109
+ async pageInitialized(lifecycle) {
110
+ const yesterday = moment().subtract(1, 'day').format('YYYY-MM-DD')
111
+ const today = moment().format('YYYY-MM-DD')
112
+
113
+ this.gristConfig = {
114
+ list: { fields: ['dataSet', 'data', 'updater', 'updatedAt'] },
115
+ columns: [
116
+ { type: 'gutter', gutterName: 'sequence', fixed: true },
117
+ { type: 'gutter', gutterName: 'row-selector', fixed: true, multiple: true },
118
+ {
119
+ type: 'gutter',
120
+ gutterName: 'button',
121
+ fixed: true,
122
+ icon: 'assignment',
123
+ iconOnly: false,
124
+ title: i18next.t('button.detail'),
125
+ width: 72
126
+ },
127
+ {
128
+ type: 'string',
129
+ name: 'name',
130
+ fixed: true,
131
+ label: true,
132
+ header: i18next.t('field.name'),
133
+ record: {
134
+ editable: false
135
+ },
136
+ filter: 'search',
137
+ sortable: true,
138
+ width: 120,
139
+ imex: true
140
+ },
141
+ {
142
+ type: 'string',
143
+ name: 'description',
144
+ label: true,
145
+ header: i18next.t('field.description'),
146
+ record: {
147
+ editable: false
148
+ },
149
+ filter: 'search',
150
+ width: 150,
151
+ imex: true
152
+ },
153
+ {
154
+ type: 'string',
155
+ name: 'key01',
156
+ header: {
157
+ renderer: i18next.t('field.key-01'),
158
+ group: i18next.t('field.key')
159
+ },
160
+ record: {
161
+ editable: false
162
+ },
163
+ sortable: true,
164
+ width: 120,
165
+ imex: true
166
+ },
167
+ {
168
+ type: 'string',
169
+ name: 'key02',
170
+ header: {
171
+ renderer: i18next.t('field.key-02'),
172
+ group: i18next.t('field.key')
173
+ },
174
+ record: {
175
+ editable: false
176
+ },
177
+ sortable: true,
178
+ width: 120,
179
+ imex: true
180
+ },
181
+ {
182
+ type: 'string',
183
+ name: 'key03',
184
+ header: {
185
+ renderer: i18next.t('field.key-03'),
186
+ group: i18next.t('field.key')
187
+ },
188
+ record: {
189
+ editable: false
190
+ },
191
+ sortable: true,
192
+ width: 120,
193
+ imex: true
194
+ },
195
+ {
196
+ type: 'string',
197
+ name: 'key04',
198
+ header: {
199
+ renderer: i18next.t('field.key-04'),
200
+ group: i18next.t('field.key')
201
+ },
202
+ record: {
203
+ editable: false
204
+ },
205
+ sortable: true,
206
+ width: 120,
207
+ imex: true
208
+ },
209
+ {
210
+ type: 'string',
211
+ name: 'key05',
212
+ header: {
213
+ renderer: i18next.t('field.key-05'),
214
+ group: i18next.t('field.key')
215
+ },
216
+ record: {
217
+ editable: false
218
+ },
219
+ sortable: true,
220
+ width: 120,
221
+ imex: true
222
+ },
223
+ {
224
+ type: 'checkbox',
225
+ name: 'ooc',
226
+ header: i18next.t('field.ooc'),
227
+ record: {
228
+ editable: false
229
+ },
230
+ width: 30
231
+ },
232
+ {
233
+ type: 'checkbox',
234
+ name: 'oos',
235
+ header: i18next.t('field.oos'),
236
+ record: {
237
+ editable: false
238
+ },
239
+ width: 30
240
+ },
241
+ {
242
+ type: 'json5',
243
+ name: 'data',
244
+ header: i18next.t('field.data'),
245
+ record: {
246
+ editable: false
247
+ },
248
+ width: 200,
249
+ imex: true
250
+ },
251
+ {
252
+ type: 'json5',
253
+ name: 'rawData',
254
+ header: i18next.t('field.raw-data'),
255
+ record: {
256
+ editable: false
257
+ },
258
+ width: 200,
259
+ imex: true
260
+ },
261
+ {
262
+ type: 'string',
263
+ name: 'workDate',
264
+ header: i18next.t('field.work-date'),
265
+ sortable: true,
266
+ filter: {
267
+ type: 'date',
268
+ operator: 'between',
269
+ value: [yesterday, today]
270
+ },
271
+ width: 80,
272
+ imex: true
273
+ },
274
+ {
275
+ type: 'string',
276
+ name: 'workShift',
277
+ header: i18next.t('field.work-shift'),
278
+ sortable: true,
279
+ width: 40,
280
+ imex: true
281
+ },
282
+ {
283
+ type: 'datetime',
284
+ name: 'collectedAt',
285
+ header: i18next.t('field.collected-at'),
286
+ sortable: true,
287
+ width: 180,
288
+ imex: true
289
+ },
290
+ {
291
+ type: 'resource-object',
292
+ name: 'updater',
293
+ header: i18next.t('field.updater'),
294
+ sortable: true,
295
+ width: 120,
296
+ imex: true
297
+ },
298
+ {
299
+ type: 'datetime',
300
+ name: 'updatedAt',
301
+ header: i18next.t('field.updated_at'),
302
+ sortable: true,
303
+ width: 180,
304
+ imex: true
305
+ }
306
+ ],
307
+ rows: {
308
+ appendable: false,
309
+ selectable: {
310
+ multiple: true
311
+ },
312
+ classifier: function (record, rowIndex) {
313
+ var emphasized
314
+ if (record['oos']) {
315
+ emphasized = ['#8B0000', 'white']
316
+ } else if (record['ooc']) {
317
+ emphasized = ['#FF6B6B', 'white']
318
+ }
319
+
320
+ return {
321
+ emphasized
322
+ }
323
+ },
324
+ handlers: {
325
+ click: (columns, data, column, record, rowIndex) => {
326
+ openPopup(
327
+ html`
328
+ <data-sample-view data-sample-id=${record.id} style="background-color: white;"></data-sample-view>
329
+ `,
330
+ {
331
+ backdrop: true,
332
+ size: 'large',
333
+ title: i18next.t('title.data-sample view')
334
+ }
335
+ )
336
+ }
337
+ }
338
+ },
339
+ sorters: [
340
+ {
341
+ name: 'collectedAt',
342
+ desc: true
343
+ }
344
+ ]
345
+ }
346
+ }
347
+
348
+ async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) {
349
+ const response = await client.query({
350
+ query: gql`
351
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
352
+ responses: dataSamples(filters: $filters, pagination: $pagination, sortings: $sortings) {
353
+ items {
354
+ id
355
+ name
356
+ description
357
+ useCase
358
+ key01
359
+ key02
360
+ key03
361
+ key04
362
+ key05
363
+ data
364
+ rawData
365
+ ooc
366
+ oos
367
+ judgment
368
+ workDate
369
+ workShift
370
+ updater {
371
+ id
372
+ name
373
+ }
374
+ updatedAt
375
+ collectedAt
376
+ }
377
+ total
378
+ }
379
+ }
380
+ `,
381
+ variables: {
382
+ filters,
383
+ pagination: { page, limit },
384
+ sortings
385
+ }
386
+ })
387
+
388
+ return {
389
+ total: response.data.responses.total || 0,
390
+ records: response.data.responses.items || []
391
+ }
392
+ }
393
+
394
+ _exportableData() {
395
+ let records = [] as GristRecord[]
396
+ if (this.grist.selected && this.grist.selected.length > 0) {
397
+ records = this.grist.selected
398
+ } else {
399
+ records = this.grist.data.records
400
+ }
401
+
402
+ var headerSetting = this.grist.compiledConfig.columns
403
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
404
+ .map(column => {
405
+ return column.imex === true
406
+ ? {
407
+ header: column.header.renderer(column),
408
+ key: column.name,
409
+ width: column.width,
410
+ type: column.type
411
+ }
412
+ : column.imex
413
+ })
414
+
415
+ var data = records.map(item => {
416
+ return {
417
+ id: item.id,
418
+ ...this.gristConfig.columns
419
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
420
+ .reduce((record, column) => {
421
+ const key = column.imex === true ? column.name : column.imex.key
422
+ record[key] = key
423
+ .split('.')
424
+ .reduce((obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), item)
425
+ return record
426
+ }, {})
427
+ }
428
+ })
429
+
430
+ return { header: headerSetting, data: data }
431
+ }
432
+
433
+ printSamples() {
434
+ const selected = this.grist.selected
435
+ const ids = selected.map(record => record.id).join('|')
436
+
437
+ GhostPrint.print({
438
+ src: `./data-samples?ids=${ids}`
439
+ // pending: 200 * selected.length
440
+ })
441
+ }
442
+ }
@@ -0,0 +1,55 @@
1
+ import { PropertyValues, html, css } from 'lit'
2
+ import { customElement, property } from 'lit/decorators.js'
3
+ import { PageView } from '@operato/shell'
4
+ import { i18next, localize } from '@operato/i18n'
5
+
6
+ import './data-sample-view.js'
7
+
8
+ @customElement('data-sample-page')
9
+ export class DataSampleViewPage extends localize(i18next)(PageView) {
10
+ static styles = [
11
+ css`
12
+ :host {
13
+ display: flex;
14
+ }
15
+
16
+ data-sample-view {
17
+ flex: 1;
18
+ }
19
+
20
+ @media print {
21
+ :host {
22
+ display: block;
23
+ overflow: visible;
24
+ }
25
+ }
26
+ `
27
+ ]
28
+
29
+ @property({ type: Object }) dataSampleId?: any
30
+
31
+ get context() {
32
+ return {
33
+ title: i18next.t('title.data-sample view'),
34
+ help: 'dataset/data-sample',
35
+ actions: []
36
+ }
37
+ }
38
+
39
+ render() {
40
+ return html` <data-sample-view .dataSampleId=${this.dataSampleId}></data-sample-view> `
41
+ }
42
+
43
+ updated(changes: PropertyValues<this>) {}
44
+
45
+ pageUpdated(changes: any, lifecycle: any, before: any) {
46
+ if (this.active) {
47
+ /*
48
+ * this page is activated
49
+ */
50
+ this.dataSampleId = lifecycle.resourceId
51
+ } else {
52
+ /* this page is deactivated */
53
+ }
54
+ }
55
+ }