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

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 (134) 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 +278 -0
  4. package/client/activities/activity-data-review-view.ts +226 -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.js +19 -10
  44. package/dist-client/activities/activity-data-review-edit.js.map +1 -1
  45. package/dist-client/activities/activity-data-review-view.js +80 -0
  46. package/dist-client/activities/activity-data-review-view.js.map +1 -1
  47. package/dist-client/pages/data-entry/data-entry-list-page.js +2 -2
  48. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
  49. package/dist-client/tsconfig.tsbuildinfo +1 -1
  50. package/dist-server/controllers/create-data-ooc.js +2 -0
  51. package/dist-server/controllers/create-data-ooc.js.map +1 -1
  52. package/dist-server/service/data-archive/index.d.ts +1 -1
  53. package/dist-server/service/data-ooc/index.d.ts +1 -1
  54. package/dist-server/service/data-sample/data-sample-query.d.ts +1 -1
  55. package/dist-server/service/data-sample/data-sample-query.js +3 -3
  56. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  57. package/dist-server/service/data-sample/index.d.ts +1 -1
  58. package/dist-server/service/data-set/index.d.ts +1 -1
  59. package/dist-server/service/index.d.ts +2 -2
  60. package/dist-server/tsconfig.tsbuildinfo +1 -1
  61. package/package.json +26 -26
  62. package/server/activities/activity-data-collect.ts +100 -0
  63. package/server/activities/activity-data-review.ts +109 -0
  64. package/server/activities/activity-ooc-resolve.ts +123 -0
  65. package/server/activities/activity-ooc-review.ts +95 -0
  66. package/server/activities/index.ts +11 -0
  67. package/server/controllers/create-data-ooc.ts +80 -0
  68. package/server/controllers/create-data-sample.ts +323 -0
  69. package/server/controllers/data-use-case.ts +98 -0
  70. package/server/controllers/finalize-data-collection.ts +388 -0
  71. package/server/controllers/index.ts +6 -0
  72. package/server/controllers/issue-data-collection-task.ts +70 -0
  73. package/server/controllers/issue-ooc-resolve.ts +58 -0
  74. package/server/controllers/issue-ooc-review.ts +52 -0
  75. package/server/controllers/jasper-report.ts +186 -0
  76. package/server/controllers/query-data-summary-by-period.ts +178 -0
  77. package/server/controllers/shiny-report.ts +54 -0
  78. package/server/engine/index.ts +1 -0
  79. package/server/engine/task/create-data-sample.ts +100 -0
  80. package/server/engine/task/index.ts +2 -0
  81. package/server/engine/task/issue-collect-data.ts +45 -0
  82. package/server/index.ts +8 -0
  83. package/server/routes.ts +188 -0
  84. package/server/service/data-archive/data-archive-mutation.ts +273 -0
  85. package/server/service/data-archive/data-archive-query.ts +58 -0
  86. package/server/service/data-archive/data-archive-type.ts +48 -0
  87. package/server/service/data-archive/data-archive.ts +69 -0
  88. package/server/service/data-archive/index.ts +6 -0
  89. package/server/service/data-key-set/data-key-item-type.ts +31 -0
  90. package/server/service/data-key-set/data-key-set-mutation.ts +201 -0
  91. package/server/service/data-key-set/data-key-set-query.ts +68 -0
  92. package/server/service/data-key-set/data-key-set-type.ts +70 -0
  93. package/server/service/data-key-set/data-key-set.ts +86 -0
  94. package/server/service/data-key-set/index.ts +6 -0
  95. package/server/service/data-ooc/data-ooc-mutation.ts +154 -0
  96. package/server/service/data-ooc/data-ooc-query.ts +106 -0
  97. package/server/service/data-ooc/data-ooc-subscription.ts +48 -0
  98. package/server/service/data-ooc/data-ooc-type.ts +71 -0
  99. package/server/service/data-ooc/data-ooc.ts +259 -0
  100. package/server/service/data-ooc/index.ts +7 -0
  101. package/server/service/data-sample/data-sample-mutation.ts +18 -0
  102. package/server/service/data-sample/data-sample-query.ts +215 -0
  103. package/server/service/data-sample/data-sample-type.ts +47 -0
  104. package/server/service/data-sample/data-sample.ts +193 -0
  105. package/server/service/data-sample/index.ts +6 -0
  106. package/server/service/data-sensor/data-sensor-mutation.ts +116 -0
  107. package/server/service/data-sensor/data-sensor-query.ts +76 -0
  108. package/server/service/data-sensor/data-sensor-type.ts +104 -0
  109. package/server/service/data-sensor/data-sensor.ts +126 -0
  110. package/server/service/data-sensor/index.ts +6 -0
  111. package/server/service/data-set/data-item-type.ts +155 -0
  112. package/server/service/data-set/data-set-mutation.ts +552 -0
  113. package/server/service/data-set/data-set-query.ts +461 -0
  114. package/server/service/data-set/data-set-type.ts +204 -0
  115. package/server/service/data-set/data-set.ts +326 -0
  116. package/server/service/data-set/index.ts +6 -0
  117. package/server/service/data-set-history/data-set-history-query.ts +126 -0
  118. package/server/service/data-set-history/data-set-history-type.ts +12 -0
  119. package/server/service/data-set-history/data-set-history.ts +217 -0
  120. package/server/service/data-set-history/event-subscriber.ts +17 -0
  121. package/server/service/data-set-history/index.ts +7 -0
  122. package/server/service/data-spec/data-spec-manager.ts +21 -0
  123. package/server/service/data-spec/data-spec-query.ts +21 -0
  124. package/server/service/data-spec/data-spec.ts +45 -0
  125. package/server/service/data-spec/index.ts +5 -0
  126. package/server/service/data-summary/data-summary-mutation.ts +45 -0
  127. package/server/service/data-summary/data-summary-query.ts +179 -0
  128. package/server/service/data-summary/data-summary-type.ts +86 -0
  129. package/server/service/data-summary/data-summary.ts +170 -0
  130. package/server/service/data-summary/index.ts +7 -0
  131. package/server/service/index.ts +57 -0
  132. package/server/tsconfig.json +10 -0
  133. package/server/utils/config-resolver.ts +29 -0
  134. package/server/utils/index.ts +1 -0
@@ -0,0 +1,454 @@
1
+ import '@material/web/icon/icon.js'
2
+ import '@operato/data-grist'
3
+ import '@operato/context/ox-context-page-toolbar.js'
4
+ import '@operato/board/ox-board-viewer.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
+
11
+ import { getRenderer, DataGrist, FetchOption } from '@operato/data-grist'
12
+ import { OxDataUseCase } from '@operato/dataset'
13
+ import { client } from '@operato/graphql'
14
+ import { i18next, localize } from '@operato/i18n'
15
+ import { openPopup } from '@operato/layout'
16
+ import { navigate, PageView, store } from '@operato/shell'
17
+ import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'
18
+ import { encodeUrlParams } from '@operato/utils'
19
+
20
+ import { provider } from '@things-factory/board-ui/dist-client'
21
+
22
+ const USECASE_OPTIONS = () => {
23
+ return ['', ...OxDataUseCase.getUseCaseNames()].map(name => {
24
+ return {
25
+ display: name,
26
+ value: name
27
+ }
28
+ })
29
+ }
30
+
31
+ const showMonitorView = (columns, data, column, record, rowIndex) => {
32
+ const { id, name, monitorType, monitorView } = record
33
+ const title = `${name} - ${i18next.t('title.data-monitor-view')}`
34
+
35
+ switch (monitorType) {
36
+ case 'generated':
37
+ openPopup(html` <div style="background-color: white;">Under construction</div> `, {
38
+ backdrop: true,
39
+ size: 'large',
40
+ title
41
+ })
42
+ break
43
+
44
+ case 'board':
45
+ const board = {
46
+ id: monitorView
47
+ }
48
+ openPopup(
49
+ html`
50
+ <ox-board-viewer
51
+ style="background-color: white;"
52
+ .board=${board}
53
+ .provider=${provider}
54
+ hide-fullscreen
55
+ hide-navigation
56
+ ></ox-board-viewer>
57
+ `,
58
+ {
59
+ closable: true,
60
+ backdrop: true,
61
+ size: 'large',
62
+ title
63
+ }
64
+ )
65
+
66
+ // navigate(`board-viewer/${monitorView}?interactive=true&title=${title}`)
67
+ break
68
+
69
+ case 'custom-element':
70
+ break
71
+
72
+ case 'page':
73
+ navigate(monitorView)
74
+ break
75
+
76
+ case 'external':
77
+ window.open(monitorView, '_blank')
78
+ break
79
+ }
80
+ }
81
+
82
+ const showReportView = (columns, data, column, record, rowIndex) => {
83
+ const { id: datasetId, dataKeySet, name, reportType, reportView, reportTemplate } = record
84
+ const { id: dataKeySetId } = dataKeySet || { id: '' }
85
+ const title = `${name} - ${i18next.t('title.data-report-view')}`
86
+
87
+ switch (reportType) {
88
+ case 'generated':
89
+ openPopup(html` <div style="background-color: white;">Under construction</div> `, {
90
+ backdrop: true,
91
+ size: 'large',
92
+ title
93
+ })
94
+ break
95
+
96
+ case 'embed':
97
+ break
98
+
99
+ case 'custom-element':
100
+ break
101
+
102
+ case 'page':
103
+ break
104
+
105
+ case 'external':
106
+ window.open(reportView, '_blank')
107
+ break
108
+
109
+ case 'jasper':
110
+ case 'shiny':
111
+ const encodedUrlParams = encodeUrlParams({ datasetId, dataKeySetId, reportType, reportView, reportTemplate })
112
+ navigate(`/data-report-samples/?${encodedUrlParams}`)
113
+ break
114
+
115
+ default:
116
+ break
117
+ }
118
+ }
119
+
120
+ @customElement('data-report-list-page')
121
+ export class DataReportListPage extends connect(store)(localize(i18next)(PageView)) {
122
+ static styles = [
123
+ ScrollbarStyles,
124
+ CommonHeaderStyles,
125
+ css`
126
+ :host {
127
+ display: flex;
128
+
129
+ width: 100%;
130
+
131
+ --grid-record-emphasized-background-color: #8b0000;
132
+ --grid-record-emphasized-color: #ff6b6b;
133
+ }
134
+
135
+ ox-grist {
136
+ overflow-y: auto;
137
+ flex: 1;
138
+ }
139
+
140
+ .header {
141
+ grid-template-areas: 'filters actions';
142
+ }
143
+ `
144
+ ]
145
+
146
+ @state() gristConfig: any
147
+ @state() mode: 'CARD' | 'GRID' | 'LIST' = 'CARD'
148
+
149
+ @query('ox-grist') private grist!: DataGrist
150
+
151
+ get context() {
152
+ return {
153
+ title: i18next.t('title.data-report list'),
154
+ help: 'dataset/data-report-list',
155
+ search: {
156
+ handler: (search: string) => {
157
+ this.grist.searchText = search
158
+ },
159
+ value: this.grist?.searchText || ''
160
+ },
161
+ filter: {
162
+ handler: () => {
163
+ this.grist.toggleHeadroom()
164
+ }
165
+ },
166
+ toolbar: false
167
+ }
168
+ }
169
+
170
+ render() {
171
+ const mode = 'CARD'
172
+
173
+ return html`
174
+ <ox-grist
175
+ .mode=${mode}
176
+ .config=${this.gristConfig}
177
+ .fetchHandler=${this.fetchHandler.bind(this)}
178
+ ?url-params-sensitive=${this.active}
179
+ >
180
+ <div slot="headroom" class="header">
181
+ <div class="filters">
182
+ <ox-filters-form class="filter" autofocus without-search></ox-filters-form>
183
+ </div>
184
+
185
+ <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
186
+ </div>
187
+ </ox-grist>
188
+ `
189
+ }
190
+
191
+ async pageInitialized(lifecycle) {
192
+ this.gristConfig = {
193
+ list: {
194
+ thumbnail: 'monitorView',
195
+ fields: ['name', 'description'],
196
+ details: ['schedule', 'type', 'useCase', 'latestCollectedAt', 'prevSchedule', 'nextSchedule']
197
+ },
198
+ columns: [
199
+ {
200
+ type: 'gutter',
201
+ gutterName: 'button',
202
+ icon: 'newspaper',
203
+ iconOnly: false,
204
+ title: i18next.t('button.view-report'),
205
+ width: 100,
206
+ handlers: {
207
+ click: showReportView
208
+ }
209
+ },
210
+ {
211
+ type: 'gutter',
212
+ gutterName: 'button',
213
+ icon: 'analytics',
214
+ iconOnly: false,
215
+ title: i18next.t('button.view-monitor'),
216
+ width: 110,
217
+ handlers: {
218
+ click: showMonitorView
219
+ }
220
+ },
221
+ {
222
+ type: 'string',
223
+ name: 'name',
224
+ header: i18next.t('field.name'),
225
+ record: {
226
+ editable: false
227
+ },
228
+ filter: 'search',
229
+ sortable: true,
230
+ width: 150
231
+ },
232
+ {
233
+ type: 'string',
234
+ name: 'description',
235
+ header: i18next.t('field.description'),
236
+ record: {
237
+ editable: false
238
+ },
239
+ filter: 'search',
240
+ width: 200
241
+ },
242
+ {
243
+ type: 'select',
244
+ name: 'type',
245
+ label: true,
246
+ header: i18next.t('field.type'),
247
+ record: {
248
+ editable: false,
249
+ options: [
250
+ {},
251
+ {
252
+ display: i18next.t('text.manually collected'),
253
+ value: 'manual'
254
+ },
255
+ {
256
+ display: i18next.t('text.automatically collected'),
257
+ value: 'automatic'
258
+ }
259
+ ]
260
+ },
261
+ sortable: true,
262
+ filter: true,
263
+ width: 60
264
+ },
265
+ {
266
+ type: 'select',
267
+ name: 'useCase',
268
+ label: true,
269
+ header: i18next.t('field.use-case'),
270
+ record: {
271
+ editable: false,
272
+ options: USECASE_OPTIONS
273
+ },
274
+ sortable: true,
275
+ filter: {
276
+ operator: 'eq',
277
+ options: USECASE_OPTIONS /* in case select options type is a function, filter should have its own options */
278
+ },
279
+ width: 80
280
+ },
281
+ {
282
+ type: 'crontab',
283
+ name: 'schedule',
284
+ label: true,
285
+ header: i18next.t('field.schedule'),
286
+ record: {
287
+ editable: false
288
+ },
289
+ width: 80
290
+ },
291
+ {
292
+ type: 'resource-object',
293
+ name: 'entryRole',
294
+ header: i18next.t('field.entry-role'),
295
+ record: {
296
+ editable: false
297
+ },
298
+ width: 120
299
+ },
300
+ {
301
+ type: 'resource-object',
302
+ name: 'supervisoryRole',
303
+ header: i18next.t('field.supervisory-role'),
304
+ record: {
305
+ editable: false
306
+ },
307
+ width: 120
308
+ },
309
+ {
310
+ type: 'datetime',
311
+ name: 'latestCollectedAt',
312
+ label: true,
313
+ header: i18next.t('field.latest-collected-at'),
314
+ record: {
315
+ editable: false
316
+ },
317
+ width: 180
318
+ },
319
+ {
320
+ type: 'datetime',
321
+ name: 'prevSchedule',
322
+ label: true,
323
+ header: i18next.t('field.prev-schedule'),
324
+ record: {
325
+ editable: false
326
+ },
327
+ width: 180
328
+ },
329
+ {
330
+ type: 'datetime',
331
+ name: 'nextSchedule',
332
+ label: true,
333
+ header: i18next.t('field.next-schedule'),
334
+ record: {
335
+ editable: false
336
+ },
337
+ width: 180
338
+ },
339
+ {
340
+ type: 'string',
341
+ name: 'monitorView',
342
+ hidden: true,
343
+ record: {
344
+ editable: false,
345
+ renderer: function (value, column, record, rowIndex, field) {
346
+ const type = record.monitorType !== 'board' ? 'string' : 'image'
347
+
348
+ let renderedValue
349
+
350
+ if (record.monitorType === 'board' && record.entryBoard?.thumbnail) {
351
+ renderedValue = record.entryBoard.thumbnail
352
+ } else {
353
+ renderedValue = html`<md-icon style="--md-icon-size: 64px;">newsmode</md-icon>`
354
+ }
355
+
356
+ return getRenderer(type)(renderedValue, column, record, rowIndex, field)
357
+ }
358
+ }
359
+ }
360
+ ],
361
+ rows: {
362
+ appendable: false,
363
+ selectable: {
364
+ multiple: false
365
+ },
366
+ handlers: {
367
+ click: showReportView
368
+ },
369
+ classifier: function (record, rowIndex) {}
370
+ },
371
+ sorters: [
372
+ {
373
+ name: 'name'
374
+ }
375
+ ]
376
+ }
377
+ }
378
+
379
+ async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) {
380
+ const response = await client.query({
381
+ query: gql`
382
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
383
+ responses: dataSetsForReport(filters: $filters, pagination: $pagination, sortings: $sortings) {
384
+ items {
385
+ id
386
+ dataKeySet {
387
+ id
388
+ name
389
+ }
390
+ name
391
+ description
392
+ partitionKeys
393
+ active
394
+ type
395
+ useCase
396
+ schedule
397
+ timezone
398
+ entryRole {
399
+ id
400
+ name
401
+ }
402
+ supervisoryRole {
403
+ id
404
+ name
405
+ }
406
+ monitorType
407
+ monitorView
408
+ monitorBoard {
409
+ thumbnail
410
+ }
411
+ reportType
412
+ reportView
413
+ reportTemplate
414
+ updater {
415
+ id
416
+ name
417
+ }
418
+ updatedAt
419
+ dataItems {
420
+ name
421
+ description
422
+ active
423
+ hidden
424
+ tag
425
+ group
426
+ type
427
+ unit
428
+ options
429
+ quota
430
+ spec
431
+ stat
432
+ }
433
+ latestCollectedAt
434
+ nextSchedule
435
+ prevSchedule
436
+ nextSummarySchedule
437
+ }
438
+ total
439
+ }
440
+ }
441
+ `,
442
+ variables: {
443
+ filters,
444
+ pagination: { page, limit },
445
+ sortings
446
+ }
447
+ })
448
+
449
+ return {
450
+ total: response.data.responses.total || 0,
451
+ records: response.data.responses.items || []
452
+ }
453
+ }
454
+ }
@@ -0,0 +1,174 @@
1
+ /**
2
+ * data sample report page from 'data-key-set-list-page'
3
+ * dateKeySetId is required
4
+ */
5
+ import '@operato/data-grist'
6
+
7
+ import gql from 'graphql-tag'
8
+ import { css, html } from 'lit'
9
+ import { customElement, property, query, state } from 'lit/decorators.js'
10
+ import { connect } from 'pwa-helpers/connect-mixin'
11
+ import moment from '@operato/moment-timezone-es'
12
+
13
+ import { client } from '@operato/graphql'
14
+ import { i18next, localize } from '@operato/i18n'
15
+ import { PageView, store } from '@operato/shell'
16
+ import { ScrollbarStyles } from '@operato/styles'
17
+ import { encodeUrlParams } from '@operato/utils'
18
+ import { FetchOption } from '@operato/data-grist'
19
+
20
+ @customElement('data-report-samples-page')
21
+ export class DataReportSamplesPage extends connect(store)(localize(i18next)(PageView)) {
22
+ static styles = [
23
+ ScrollbarStyles,
24
+ css`
25
+ :host {
26
+ display: flex;
27
+ flex-direction: column;
28
+ padding: 0;
29
+ }
30
+
31
+ #container {
32
+ flex: 1;
33
+ padding: 0;
34
+ margin: 0;
35
+ border: 0;
36
+ }
37
+ `
38
+ ]
39
+
40
+ @state() dataKeySetId?: string
41
+ @state() dataKeySet: any
42
+ @query('iframe') container!: HTMLIFrameElement
43
+
44
+ get context() {
45
+ const yesterday = moment().subtract(1, 'day').format('YYYY-MM-DD')
46
+ const today = moment().format('YYYY-MM-DD')
47
+
48
+ const filters = [
49
+ {
50
+ name: 'workDateRange',
51
+ type: 'date',
52
+ label: i18next.t('field.work-date'),
53
+ operator: 'between',
54
+ value: [yesterday, today]
55
+ },
56
+ ...this.getDataKeyFilters()
57
+ ]
58
+
59
+ return {
60
+ title: i18next.t('title.data-report samples'),
61
+ help: 'dataset/data-report-samples',
62
+ filters
63
+ }
64
+ }
65
+
66
+ getDataKeyFilters() {
67
+ return (
68
+ this.dataKeySet?.dataKeyItems.map((item, index) => {
69
+ return {
70
+ type: 'string',
71
+ name: `key_0${index + 1}`,
72
+ label: i18next.t(item.tKey),
73
+ operator: 'i_like',
74
+ width: 120
75
+ }
76
+ }) || []
77
+ )
78
+ }
79
+
80
+ render() {
81
+ // clear if pre-loaded
82
+ this.container.src = ''
83
+
84
+ return html`
85
+ <ox-filters-form-base
86
+ .filters=${this.context.filters}
87
+ @filters-change=${e => {
88
+ console.log('filters changed', e.detail)
89
+ this.renderTemplate(e.detail.filters)
90
+ }}
91
+ ?url-params-sensitive=${this.active}
92
+ ></ox-filters-form-base>
93
+
94
+ <iframe></iframe>
95
+ `
96
+ }
97
+
98
+ renderTemplate(filters) {
99
+ const params = filters.reduce((acc, curr) => ((acc[curr.name] = curr.value), acc), {})
100
+ Object.assign(params, this.lifecycle.params)
101
+
102
+ const filterNames = this.getDataKeyFilters().map(x => x.name)
103
+ const dataKeyFilters = filters.filter(x => filterNames.includes(x.name))
104
+ const { workDateRange } = params
105
+
106
+ /** ignoring date conditions */
107
+ if (!workDateRange[0] || !workDateRange[1] || workDateRange[0] > workDateRange[1]) {
108
+ return
109
+ }
110
+
111
+ /** urlencoded params including test values */
112
+ const urlParams = {
113
+ reportType: params.reportType,
114
+ reportView: params.reportView,
115
+ reportTemplate: params.reportTemplate,
116
+ table: 'samples',
117
+ datasetId: params.datasetId,
118
+ dataKeySetId: params.dataKeySetId,
119
+ startDate: workDateRange[0],
120
+ endDate: workDateRange[1],
121
+ dataKeySetItems: JSON.stringify(this.dataKeySet?.dataKeyItems || []),
122
+ dataKeyFilters: JSON.stringify(dataKeyFilters)
123
+ }
124
+
125
+ const encodedUrlParams = encodeUrlParams(urlParams)
126
+
127
+ const reportUrl = `/data-report/${urlParams.reportType}/`
128
+ this.container.src = `${reportUrl}?${encodedUrlParams}`
129
+ }
130
+
131
+ pageUpdated(changes, lifecycle) {
132
+ if (this.active) {
133
+ const { dataKeySetId } = lifecycle.params
134
+ this.dataKeySetId = dataKeySetId
135
+ return
136
+ }
137
+ }
138
+
139
+ async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) {}
140
+
141
+ async updated(changes) {
142
+ if (changes.has('dataKeySetId')) {
143
+ if (!this.dataKeySetId) {
144
+ this.dataKeySet = null
145
+ return
146
+ }
147
+
148
+ const response = await client.query({
149
+ query: gql`
150
+ query ($id: String!) {
151
+ dataKeySet(id: $id) {
152
+ id
153
+ name
154
+ description
155
+ reportType
156
+ reportView
157
+ dataKeyItems {
158
+ name
159
+ description
160
+ dataKey
161
+ tKey
162
+ }
163
+ }
164
+ }
165
+ `,
166
+ variables: {
167
+ id: this.dataKeySetId
168
+ }
169
+ })
170
+
171
+ this.dataKeySet = response.data.dataKeySet
172
+ }
173
+ }
174
+ }