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

Sign up to get free protection for your applications and to get access to all the features.
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
+ }