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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) 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/pages/data-entry/data-entry-list-page.js +2 -2
  44. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
  45. package/dist-client/tsconfig.tsbuildinfo +1 -1
  46. package/dist-server/service/data-sample/data-sample-query.d.ts +1 -1
  47. package/dist-server/service/data-sample/data-sample-query.js +3 -3
  48. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  49. package/dist-server/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +26 -26
  51. package/server/activities/activity-data-collect.ts +100 -0
  52. package/server/activities/activity-data-review.ts +82 -0
  53. package/server/activities/activity-ooc-resolve.ts +123 -0
  54. package/server/activities/activity-ooc-review.ts +144 -0
  55. package/server/activities/index.ts +11 -0
  56. package/server/controllers/create-data-sample.ts +426 -0
  57. package/server/controllers/data-use-case.ts +98 -0
  58. package/server/controllers/finalize-data-collection.ts +388 -0
  59. package/server/controllers/index.ts +3 -0
  60. package/server/controllers/issue-data-collection-task.ts +70 -0
  61. package/server/controllers/jasper-report.ts +186 -0
  62. package/server/controllers/query-data-summary-by-period.ts +178 -0
  63. package/server/controllers/shiny-report.ts +54 -0
  64. package/server/engine/index.ts +1 -0
  65. package/server/engine/task/create-data-sample.ts +100 -0
  66. package/server/engine/task/index.ts +2 -0
  67. package/server/engine/task/issue-collect-data.ts +45 -0
  68. package/server/index.ts +8 -0
  69. package/server/routes.ts +188 -0
  70. package/server/service/data-archive/data-archive-mutation.ts +273 -0
  71. package/server/service/data-archive/data-archive-query.ts +58 -0
  72. package/server/service/data-archive/data-archive-type.ts +48 -0
  73. package/server/service/data-archive/data-archive.ts +69 -0
  74. package/server/service/data-archive/index.ts +6 -0
  75. package/server/service/data-key-set/data-key-item-type.ts +31 -0
  76. package/server/service/data-key-set/data-key-set-mutation.ts +201 -0
  77. package/server/service/data-key-set/data-key-set-query.ts +68 -0
  78. package/server/service/data-key-set/data-key-set-type.ts +70 -0
  79. package/server/service/data-key-set/data-key-set.ts +86 -0
  80. package/server/service/data-key-set/index.ts +6 -0
  81. package/server/service/data-ooc/data-ooc-mutation.ts +154 -0
  82. package/server/service/data-ooc/data-ooc-query.ts +106 -0
  83. package/server/service/data-ooc/data-ooc-subscription.ts +48 -0
  84. package/server/service/data-ooc/data-ooc-type.ts +71 -0
  85. package/server/service/data-ooc/data-ooc.ts +259 -0
  86. package/server/service/data-ooc/index.ts +7 -0
  87. package/server/service/data-sample/data-sample-mutation.ts +18 -0
  88. package/server/service/data-sample/data-sample-query.ts +215 -0
  89. package/server/service/data-sample/data-sample-type.ts +47 -0
  90. package/server/service/data-sample/data-sample.ts +193 -0
  91. package/server/service/data-sample/index.ts +6 -0
  92. package/server/service/data-sensor/data-sensor-mutation.ts +116 -0
  93. package/server/service/data-sensor/data-sensor-query.ts +76 -0
  94. package/server/service/data-sensor/data-sensor-type.ts +104 -0
  95. package/server/service/data-sensor/data-sensor.ts +126 -0
  96. package/server/service/data-sensor/index.ts +6 -0
  97. package/server/service/data-set/data-item-type.ts +155 -0
  98. package/server/service/data-set/data-set-mutation.ts +552 -0
  99. package/server/service/data-set/data-set-query.ts +461 -0
  100. package/server/service/data-set/data-set-type.ts +204 -0
  101. package/server/service/data-set/data-set.ts +326 -0
  102. package/server/service/data-set/index.ts +6 -0
  103. package/server/service/data-set-history/data-set-history-query.ts +126 -0
  104. package/server/service/data-set-history/data-set-history-type.ts +12 -0
  105. package/server/service/data-set-history/data-set-history.ts +217 -0
  106. package/server/service/data-set-history/event-subscriber.ts +17 -0
  107. package/server/service/data-set-history/index.ts +7 -0
  108. package/server/service/data-spec/data-spec-manager.ts +21 -0
  109. package/server/service/data-spec/data-spec-query.ts +21 -0
  110. package/server/service/data-spec/data-spec.ts +45 -0
  111. package/server/service/data-spec/index.ts +5 -0
  112. package/server/service/data-summary/data-summary-mutation.ts +45 -0
  113. package/server/service/data-summary/data-summary-query.ts +179 -0
  114. package/server/service/data-summary/data-summary-type.ts +86 -0
  115. package/server/service/data-summary/data-summary.ts +170 -0
  116. package/server/service/data-summary/index.ts +7 -0
  117. package/server/service/index.ts +57 -0
  118. package/server/tsconfig.json +10 -0
  119. package/server/utils/config-resolver.ts +29 -0
  120. package/server/utils/index.ts +1 -0
@@ -0,0 +1,363 @@
1
+ import '@material/web/icon/icon.js'
2
+ import '@operato/data-grist'
3
+ import '@operato/context/ox-context-page-toolbar.js'
4
+ import './data-summary-view.js'
5
+
6
+ import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'
7
+ import { PageView, store } from '@operato/shell'
8
+ import { css, html } from 'lit'
9
+ import { customElement, property, query, state } from 'lit/decorators.js'
10
+ import moment from '@operato/moment-timezone-es'
11
+ import { DataGrist, GristRecord, FetchOption } from '@operato/data-grist'
12
+ import { client } from '@operato/graphql'
13
+ import { i18next, localize } from '@operato/i18n'
14
+ import { notify, openPopup } from '@operato/layout'
15
+ import { isMobileDevice } from '@operato/utils'
16
+
17
+ import { connect } from 'pwa-helpers/connect-mixin'
18
+ import gql from 'graphql-tag'
19
+
20
+ @customElement('data-summary-list-page')
21
+ export class DataSummaryListPage extends connect(store)(localize(i18next)(PageView)) {
22
+ static styles = [
23
+ ScrollbarStyles,
24
+ CommonHeaderStyles,
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
+ .header {
39
+ grid-template-areas: 'filters actions';
40
+ }
41
+ `
42
+ ]
43
+
44
+ @state() private mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'
45
+ @state() private gristConfig: any
46
+
47
+ @query('ox-grist') private grist!: DataGrist
48
+
49
+ get context() {
50
+ return {
51
+ title: i18next.t('title.data-summary list'),
52
+ search: {
53
+ handler: (search: string) => {
54
+ this.grist.searchText = search
55
+ },
56
+ value: this.grist?.searchText || ''
57
+ },
58
+ filter: {
59
+ handler: () => {
60
+ this.grist.toggleHeadroom()
61
+ }
62
+ },
63
+ help: 'dataset/data-summary',
64
+ exportable: {
65
+ name: i18next.t('title.data-summary list'),
66
+ data: this._exportableData.bind(this)
67
+ },
68
+ toolbar: false
69
+ }
70
+ }
71
+
72
+ render() {
73
+ const mode = this.mode || (isMobileDevice() ? 'LIST' : 'GRID')
74
+
75
+ return html`
76
+ <ox-grist
77
+ .mode=${mode}
78
+ .config=${this.gristConfig}
79
+ .fetchHandler=${this.fetchHandler.bind(this)}
80
+ ?url-params-sensitive=${false /* this.active */}
81
+ >
82
+ <div slot="headroom" class="header">
83
+ <div class="filters">
84
+ <ox-filters-form autofocus without-search></ox-filters-form>
85
+ </div>
86
+
87
+ <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
88
+ </div>
89
+ </ox-grist>
90
+ `
91
+ }
92
+
93
+ async pageInitialized(lifecycle) {
94
+ const yesterday = moment().subtract(1, 'day').format('YYYY-MM-DD')
95
+ const today = moment().format('YYYY-MM-DD')
96
+
97
+ this.gristConfig = {
98
+ list: { fields: ['dataSet', 'data', 'updater', 'updatedAt'] },
99
+ columns: [
100
+ { type: 'gutter', gutterName: 'sequence', fixed: true },
101
+ { type: 'gutter', gutterName: 'row-selector', multiple: true, fixed: true },
102
+ {
103
+ type: 'gutter',
104
+ gutterName: 'button',
105
+ fixed: true,
106
+ icon: 'assignment',
107
+ iconOnly: false,
108
+ title: i18next.t('button.detail'),
109
+ width: 72
110
+ },
111
+ {
112
+ type: 'string',
113
+ name: 'name',
114
+ fixed: true,
115
+ label: true,
116
+ header: i18next.t('field.name'),
117
+ record: {
118
+ editable: false
119
+ },
120
+ filter: 'search',
121
+ sortable: true,
122
+ width: 120,
123
+ imex: true
124
+ },
125
+ {
126
+ type: 'string',
127
+ name: 'description',
128
+ label: true,
129
+ header: i18next.t('field.description'),
130
+ record: {
131
+ editable: false
132
+ },
133
+ filter: 'search',
134
+ width: 150,
135
+ imex: true
136
+ },
137
+ {
138
+ type: 'string',
139
+ name: 'date',
140
+ header: i18next.t('field.date'),
141
+ sortable: true,
142
+ filter: {
143
+ type: 'date',
144
+ operator: 'between',
145
+ value: [yesterday, today]
146
+ },
147
+ width: 80,
148
+ imex: true
149
+ },
150
+ {
151
+ type: 'string',
152
+ name: 'period',
153
+ header: i18next.t('field.time-period'),
154
+ sortable: true,
155
+ width: 60,
156
+ imex: true
157
+ },
158
+ ...Array.from({ length: 5 }, (_, idx) => {
159
+ return {
160
+ type: 'string',
161
+ name: `key0${idx + 1}`,
162
+ header: {
163
+ renderer: i18next.t(`field.key-0${idx + 1}`),
164
+ group: i18next.t('field.key')
165
+ },
166
+ record: {
167
+ editable: false
168
+ },
169
+ width: 120,
170
+ imex: true
171
+ }
172
+ }),
173
+ ...Array.from({ length: 5 }, (_, idx) => {
174
+ return {
175
+ type: 'number',
176
+ name: `data0${idx + 1}`,
177
+ header: {
178
+ renderer: i18next.t(`field.data-0${idx + 1}`),
179
+ group: i18next.t('field.data')
180
+ },
181
+ record: {
182
+ editable: false,
183
+ align: 'right'
184
+ },
185
+ width: 120,
186
+ imex: true
187
+ }
188
+ }),
189
+ {
190
+ type: 'number',
191
+ name: 'count',
192
+ header: i18next.t('field.count'),
193
+ record: {
194
+ editable: false
195
+ },
196
+ width: 30
197
+ },
198
+ {
199
+ type: 'number',
200
+ name: 'countOoc',
201
+ header: i18next.t('field.count-ooc'),
202
+ record: {
203
+ editable: false
204
+ },
205
+ width: 30
206
+ },
207
+ {
208
+ type: 'number',
209
+ name: 'countOos',
210
+ header: i18next.t('field.count-oos'),
211
+ record: {
212
+ editable: false
213
+ },
214
+ width: 30
215
+ },
216
+ {
217
+ type: 'resource-object',
218
+ name: 'updater',
219
+ header: i18next.t('field.updater'),
220
+ sortable: true,
221
+ width: 120,
222
+ imex: true
223
+ },
224
+ {
225
+ type: 'datetime',
226
+ name: 'updatedAt',
227
+ header: i18next.t('field.updated_at'),
228
+ sortable: true,
229
+ width: 180,
230
+ imex: true
231
+ }
232
+ ],
233
+ rows: {
234
+ appendable: false,
235
+ selectable: {
236
+ multiple: true
237
+ },
238
+ classifier: function (record, rowIndex) {
239
+ var emphasized
240
+ if (record['oos']) {
241
+ emphasized = ['#8B0000', 'white']
242
+ } else if (record['ooc']) {
243
+ emphasized = ['#FF6B6B', 'white']
244
+ }
245
+
246
+ return {
247
+ emphasized
248
+ }
249
+ },
250
+ handlers: {
251
+ click: (columns, data, column, record, rowIndex) => {
252
+ openPopup(
253
+ html`
254
+ <data-summary-view data-summary-id=${record.id} style="background-color: white;"></data-summary-view>
255
+ `,
256
+ {
257
+ backdrop: true,
258
+ size: 'large',
259
+ title: i18next.t('title.data-summary view')
260
+ }
261
+ )
262
+ }
263
+ }
264
+ },
265
+ sorters: [
266
+ {
267
+ name: 'date',
268
+ desc: true
269
+ }
270
+ ]
271
+ }
272
+ }
273
+
274
+ async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) {
275
+ const response = await client.query({
276
+ query: gql`
277
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
278
+ responses: dataSummaries(filters: $filters, pagination: $pagination, sortings: $sortings) {
279
+ items {
280
+ id
281
+ name
282
+ description
283
+ dataSet {
284
+ id
285
+ }
286
+ date
287
+ period
288
+ key01
289
+ key02
290
+ key03
291
+ key04
292
+ key05
293
+ data01
294
+ data02
295
+ data03
296
+ data04
297
+ data05
298
+ summary
299
+ count
300
+ countOoc
301
+ countOos
302
+ updater {
303
+ id
304
+ name
305
+ }
306
+ updatedAt
307
+ }
308
+ total
309
+ }
310
+ }
311
+ `,
312
+ variables: {
313
+ filters,
314
+ pagination: { page, limit },
315
+ sortings
316
+ }
317
+ })
318
+
319
+ return {
320
+ total: response.data.responses.total || 0,
321
+ records: response.data.responses.items || []
322
+ }
323
+ }
324
+
325
+ _exportableData() {
326
+ let records = [] as GristRecord[]
327
+ if (this.grist.selected && this.grist.selected.length > 0) {
328
+ records = this.grist.selected
329
+ } else {
330
+ records = this.grist.data.records
331
+ }
332
+
333
+ var headerSetting = this.grist.compiledConfig.columns
334
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
335
+ .map(column => {
336
+ return column.imex === true
337
+ ? {
338
+ header: column.header.renderer(column),
339
+ key: column.name,
340
+ width: column.width,
341
+ type: column.type
342
+ }
343
+ : column.imex
344
+ })
345
+
346
+ var data = records.map(item => {
347
+ return {
348
+ id: item.id,
349
+ ...this.gristConfig.columns
350
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
351
+ .reduce((record, column) => {
352
+ const key = column.imex === true ? column.name : column.imex.key
353
+ record[key] = key
354
+ .split('.')
355
+ .reduce((obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), item)
356
+ return record
357
+ }, {})
358
+ }
359
+ })
360
+
361
+ return { header: headerSetting, data: data }
362
+ }
363
+ }