@things-factory/dataset 5.0.0-alpha.9 → 5.0.0-zeta.1

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 (105) hide show
  1. package/README.md +9 -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 -3
  5. package/client/pages/data-entry/data-entry-list-page.js +390 -0
  6. package/client/pages/data-ooc/data-ooc-list-page.js +416 -0
  7. package/client/pages/data-ooc/data-ooc-view.js +183 -0
  8. package/client/pages/data-report/data-report-embed-page.js +113 -0
  9. package/client/pages/data-report/data-report-list-page.js +432 -0
  10. package/client/pages/data-report/jasper-report-oocs-page.js +122 -0
  11. package/client/pages/data-report/jasper-report-samples-crosstab-page.js +122 -0
  12. package/client/pages/data-report/jasper-report-samples-page.js +122 -0
  13. package/client/pages/data-sample/data-sample-list-page.js +372 -0
  14. package/client/pages/data-sample/data-sample-view.js +98 -0
  15. package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +43 -68
  16. package/client/pages/{data-item-list.js → data-set/data-item-list.js} +36 -11
  17. package/client/pages/{data-set-importer.js → data-set/data-set-importer.js} +0 -0
  18. package/client/pages/data-set/data-set-list-page.js +739 -0
  19. package/client/route.js +34 -6
  20. package/config/config.development.js +13 -0
  21. package/config/config.production.js +1 -0
  22. package/dist-server/controllers/create-data-sample.js +133 -0
  23. package/dist-server/controllers/create-data-sample.js.map +1 -0
  24. package/dist-server/controllers/data-use-case.js +57 -0
  25. package/dist-server/controllers/data-use-case.js.map +1 -0
  26. package/dist-server/controllers/index.js +18 -0
  27. package/dist-server/controllers/index.js.map +1 -1
  28. package/dist-server/controllers/jasper-report.js +156 -0
  29. package/dist-server/controllers/jasper-report.js.map +1 -0
  30. package/dist-server/index.js +1 -0
  31. package/dist-server/index.js.map +1 -1
  32. package/dist-server/routes.js +13 -24
  33. package/dist-server/routes.js.map +1 -1
  34. package/dist-server/service/data-item/data-item-query.js +6 -2
  35. package/dist-server/service/data-item/data-item-query.js.map +1 -1
  36. package/dist-server/service/data-item/data-item-type.js +15 -7
  37. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  38. package/dist-server/service/data-item/data-item.js +17 -3
  39. package/dist-server/service/data-item/data-item.js.map +1 -1
  40. package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
  41. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  42. package/dist-server/service/data-ooc/data-ooc-query.js +120 -0
  43. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  44. package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
  45. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  46. package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
  47. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  48. package/dist-server/service/data-ooc/data-ooc.js +237 -0
  49. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  50. package/dist-server/service/data-ooc/index.js +10 -0
  51. package/dist-server/service/data-ooc/index.js.map +1 -0
  52. package/dist-server/service/data-sample/data-sample-mutation.js +2 -138
  53. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  54. package/dist-server/service/data-sample/data-sample-query.js +7 -2
  55. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  56. package/dist-server/service/data-sample/data-sample-type.js +12 -42
  57. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  58. package/dist-server/service/data-sample/data-sample.js +34 -3
  59. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  60. package/dist-server/service/data-sensor/data-sensor-query.js +7 -2
  61. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  62. package/dist-server/service/data-set/data-set-mutation.js +40 -14
  63. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  64. package/dist-server/service/data-set/data-set-query.js +190 -3
  65. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  66. package/dist-server/service/data-set/data-set-type.js +84 -3
  67. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  68. package/dist-server/service/data-set/data-set.js +110 -15
  69. package/dist-server/service/data-set/data-set.js.map +1 -1
  70. package/dist-server/service/index.js +6 -2
  71. package/dist-server/service/index.js.map +1 -1
  72. package/package.json +19 -13
  73. package/server/controllers/create-data-sample.ts +177 -0
  74. package/server/controllers/data-use-case.ts +85 -0
  75. package/server/controllers/index.ts +2 -0
  76. package/server/controllers/jasper-report.ts +170 -0
  77. package/server/index.ts +1 -0
  78. package/server/routes.ts +21 -31
  79. package/server/service/data-item/data-item-query.ts +8 -3
  80. package/server/service/data-item/data-item-type.ts +10 -6
  81. package/server/service/data-item/data-item.ts +15 -4
  82. package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
  83. package/server/service/data-ooc/data-ooc-query.ts +69 -0
  84. package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
  85. package/server/service/data-ooc/data-ooc-type.ts +68 -0
  86. package/server/service/data-ooc/data-ooc.ts +204 -0
  87. package/server/service/data-ooc/index.ts +7 -0
  88. package/server/service/data-sample/data-sample-mutation.ts +3 -168
  89. package/server/service/data-sample/data-sample-query.ts +9 -3
  90. package/server/service/data-sample/data-sample-type.ts +7 -28
  91. package/server/service/data-sample/data-sample.ts +33 -3
  92. package/server/service/data-sensor/data-sensor-query.ts +9 -3
  93. package/server/service/data-set/data-set-mutation.ts +53 -14
  94. package/server/service/data-set/data-set-query.ts +161 -4
  95. package/server/service/data-set/data-set-type.ts +65 -4
  96. package/server/service/data-set/data-set.ts +100 -12
  97. package/server/service/index.ts +6 -2
  98. package/things-factory.config.js +35 -7
  99. package/translations/en.json +46 -3
  100. package/translations/ko.json +45 -3
  101. package/translations/ms.json +44 -3
  102. package/translations/zh.json +44 -3
  103. package/client/pages/data-sample.js +0 -307
  104. package/client/pages/data-set.js +0 -457
  105. package/yarn-error.log +0 -23244
@@ -0,0 +1,432 @@
1
+ import '@operato/data-grist'
2
+ import '@operato/board/ox-board-viewer.js'
3
+
4
+ import gql from 'graphql-tag'
5
+ import { css, html } from 'lit'
6
+ import { connect } from 'pwa-helpers/connect-mixin'
7
+
8
+ import { getRenderer } from '@operato/data-grist'
9
+ import { OxDataUseCase } from '@operato/dataset'
10
+ import { client } from '@operato/graphql'
11
+ import { i18next, localize } from '@operato/i18n'
12
+ import { openPopup } from '@operato/layout'
13
+ import { navigate, PageView, store } from '@operato/shell'
14
+ import { CommonGristStyles, ScrollbarStyles } from '@operato/styles'
15
+ import { provider } from '@things-factory/board-ui'
16
+
17
+ const USECASE_OPTIONS = () => {
18
+ return ['', ...OxDataUseCase.getUseCaseNames()].map(name => {
19
+ return {
20
+ display: name,
21
+ value: name
22
+ }
23
+ })
24
+ }
25
+
26
+ const showMonitorView = (columns, data, column, record, rowIndex) => {
27
+ const { id, name, monitorType, monitorView } = record
28
+ const title = `${name} - ${i18next.t('title.data-monitor-view')}`
29
+
30
+ switch (monitorType) {
31
+ case 'generated':
32
+ openPopup(html` <div style="background-color: white;">Under construction</div> `, {
33
+ backdrop: true,
34
+ size: 'large',
35
+ title
36
+ })
37
+ break
38
+
39
+ case 'board':
40
+ const board = {
41
+ id: monitorView
42
+ }
43
+ openPopup(
44
+ html`
45
+ <ox-board-viewer
46
+ style="background-color: white;"
47
+ .board=${board}
48
+ .provider=${provider}
49
+ hide-fullscreen
50
+ hide-navigation
51
+ ></ox-board-viewer>
52
+ `,
53
+ {
54
+ closable: true,
55
+ backdrop: true,
56
+ size: 'large',
57
+ title
58
+ }
59
+ )
60
+
61
+ // navigate(`board-viewer/${monitorView}?interactive=true&title=${title}`)
62
+ break
63
+
64
+ case 'page':
65
+ navigate(monitorView)
66
+ break
67
+
68
+ case 'external':
69
+ window.open(monitorView, '_blank')
70
+ break
71
+ }
72
+ }
73
+
74
+ const showReportView = (columns, data, column, record, rowIndex) => {
75
+ const { id, name, reportType, reportView, reportTemplate } = record
76
+ const title = `${name} - ${i18next.t('title.data-report-view')}`
77
+
78
+ switch (reportType) {
79
+ case 'generated':
80
+ openPopup(html` <div style="background-color: white;">Under construction</div> `, {
81
+ backdrop: true,
82
+ size: 'large',
83
+ title
84
+ })
85
+ break
86
+
87
+ case 'embed':
88
+ const board = {
89
+ id: reportView
90
+ }
91
+ navigate(`/data-report-embed/${id}?reportView=${encodeURIComponent(reportView)}`)
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 + `/${id}?template=${encodeURIComponent(reportTemplate)}`)
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">
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
+
362
+ async fetchHandler({ page, limit, sortings = [], filters = [] }) {
363
+ const response = await client.query({
364
+ query: gql`
365
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
366
+ responses: dataSetsForReport(filters: $filters, pagination: $pagination, sortings: $sortings) {
367
+ items {
368
+ id
369
+ name
370
+ description
371
+ partitionKeys
372
+ active
373
+ type
374
+ useCase
375
+ schedule
376
+ timezone
377
+ entryRole {
378
+ id
379
+ name
380
+ }
381
+ supervisoryRole {
382
+ id
383
+ name
384
+ }
385
+ monitorType
386
+ monitorView
387
+ monitorBoard {
388
+ thumbnail
389
+ }
390
+ reportType
391
+ reportView
392
+ reportTemplate
393
+ updater {
394
+ id
395
+ name
396
+ }
397
+ updatedAt
398
+ dataItems {
399
+ name
400
+ description
401
+ sequence
402
+ active
403
+ tag
404
+ type
405
+ unit
406
+ options
407
+ quota
408
+ spec
409
+ }
410
+ latestCollectedAt
411
+ nextSchedule
412
+ prevSchedule
413
+ }
414
+ total
415
+ }
416
+ }
417
+ `,
418
+ variables: {
419
+ filters,
420
+ pagination: { page, limit },
421
+ sortings
422
+ }
423
+ })
424
+
425
+ return {
426
+ total: response.data.responses.total || 0,
427
+ records: response.data.responses.items || []
428
+ }
429
+ }
430
+ }
431
+
432
+ window.customElements.define('data-report-list-page', DataReportListPage)
@@ -0,0 +1,122 @@
1
+ import '@operato/data-grist'
2
+ import '@operato/form'
3
+
4
+ import { css, html } from 'lit'
5
+
6
+ import { i18next, localize } from '@operato/i18n'
7
+ import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
8
+ import { PageView } from '@things-factory/shell'
9
+
10
+ class JasperReportOocsPage extends localize(i18next)(PageView) {
11
+ static get properties() {
12
+ return {
13
+ _grnNo: String,
14
+ _status: String,
15
+ resourceId: String,
16
+ params: Object
17
+ }
18
+ }
19
+
20
+ static get styles() {
21
+ return [
22
+ ScrollbarStyles,
23
+ css`
24
+ :host {
25
+ display: flex;
26
+ flex-direction: column;
27
+ padding: 0;
28
+ }
29
+
30
+ #container {
31
+ flex: 1;
32
+ padding: 0;
33
+ margin: 0;
34
+ border: 0;
35
+ }
36
+ `
37
+ ]
38
+ }
39
+
40
+ get context() {
41
+ const filters = [
42
+ {
43
+ name: 'workDateRange',
44
+ type: 'date',
45
+ label: 'date',
46
+ operator: 'between'
47
+ }
48
+ ]
49
+ var actions = [
50
+ {
51
+ title: i18next.t('button.print'),
52
+ action: () => {
53
+ this.renderRoot.querySelector('iframe').contentWindow.print()
54
+ },
55
+ ...CommonButtonStyles.print
56
+ }
57
+ ]
58
+ return {
59
+ title: 'jasper-report',
60
+ actions,
61
+ filters
62
+ }
63
+ }
64
+
65
+ render() {
66
+ return html`
67
+ <ox-filters-form-base
68
+ .filters=${this.context.filters}
69
+ @filters-change=${e => {
70
+ console.log('filters changed', e.detail)
71
+ this._reportTemplate(e.detail.filters)
72
+ }}
73
+ ?url-params-sensitive=${this.active}
74
+ ></ox-filters-form-base>
75
+ <iframe id="container"></iframe>
76
+ `
77
+ }
78
+
79
+ get searchForm() {
80
+ return this.renderRoot.querySelector('ox-filters-form-base')
81
+ }
82
+ async pageUpdated(changes, lifecycle) {
83
+ if (this.active) {
84
+ this.updateContext()
85
+ }
86
+ }
87
+
88
+ async _reportTemplate(filters) {
89
+ const params = filters.reduce((acc, curr) => ((acc[curr.name] = curr.value), acc), {})
90
+ Object.assign(params, this.lifecycle.params)
91
+
92
+ const { workDateRange, workShift, template } = params
93
+
94
+ /** ignoring date conditions */
95
+ if (!workDateRange[0] || !workDateRange[1] || workDateRange[0] > workDateRange[1]) {
96
+ return
97
+ }
98
+
99
+ /** urlencoded params including test values */
100
+ const urlParams = {
101
+ table: 'ooc',
102
+ dataSetId: this.lifecycle.resourceId,
103
+ fromWorkDate: workDateRange[0],
104
+ toWorkDate: workDateRange[1],
105
+ workShift,
106
+ template,
107
+ templateType: 'normal'
108
+ }
109
+
110
+ const encodedUrlParams = Object.keys(urlParams)
111
+ .filter(key => {
112
+ // ignore empty
113
+ return !!urlParams[key]
114
+ })
115
+ .map(key => `${key}=${encodeURIComponent(urlParams[key])}`)
116
+ .join('&')
117
+
118
+ this.shadowRoot.querySelector('#container').src = `/data-report/jasper?${encodedUrlParams}`
119
+ }
120
+ }
121
+
122
+ window.customElements.define('jasper-report-oocs-page', JasperReportOocsPage)
@@ -0,0 +1,122 @@
1
+ import '@operato/data-grist'
2
+ import '@operato/form'
3
+
4
+ import { css, html } from 'lit'
5
+
6
+ import { i18next, localize } from '@operato/i18n'
7
+ import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
8
+ import { PageView } from '@things-factory/shell'
9
+
10
+ class JasperReportSamplesCrosstabPage extends localize(i18next)(PageView) {
11
+ static get properties() {
12
+ return {
13
+ _grnNo: String,
14
+ _status: String,
15
+ resourceId: String,
16
+ params: Object
17
+ }
18
+ }
19
+
20
+ static get styles() {
21
+ return [
22
+ ScrollbarStyles,
23
+ css`
24
+ :host {
25
+ display: flex;
26
+ flex-direction: column;
27
+ padding: 0;
28
+ }
29
+
30
+ #container {
31
+ flex: 1;
32
+ padding: 0;
33
+ margin: 0;
34
+ border: 0;
35
+ }
36
+ `
37
+ ]
38
+ }
39
+
40
+ get context() {
41
+ const filters = [
42
+ {
43
+ name: 'workDateRange',
44
+ type: 'date',
45
+ label: 'date',
46
+ operator: 'between'
47
+ }
48
+ ]
49
+ var actions = [
50
+ {
51
+ title: i18next.t('button.print'),
52
+ action: () => {
53
+ this.renderRoot.querySelector('iframe').contentWindow.print()
54
+ },
55
+ ...CommonButtonStyles.print
56
+ }
57
+ ]
58
+ return {
59
+ title: 'jasper-report',
60
+ actions,
61
+ filters
62
+ }
63
+ }
64
+
65
+ render() {
66
+ return html`
67
+ <ox-filters-form-base
68
+ .filters=${this.context.filters}
69
+ @filters-change=${e => {
70
+ console.log('filters changed', e.detail)
71
+ this._reportTemplate(e.detail.filters)
72
+ }}
73
+ ?url-params-sensitive=${this.active}
74
+ ></ox-filters-form-base>
75
+ <iframe id="container"></iframe>
76
+ `
77
+ }
78
+
79
+ get searchForm() {
80
+ return this.renderRoot.querySelector('ox-filters-form-base')
81
+ }
82
+ async pageUpdated(changes, lifecycle) {
83
+ if (this.active) {
84
+ this.updateContext()
85
+ }
86
+ }
87
+
88
+ async _reportTemplate(filters) {
89
+ const params = filters.reduce((acc, curr) => ((acc[curr.name] = curr.value), acc), {})
90
+ Object.assign(params, this.lifecycle.params)
91
+
92
+ const { workDateRange, workShift, template } = params
93
+
94
+ /** ignoring date conditions */
95
+ if (!workDateRange[0] || !workDateRange[1] || workDateRange[0] > workDateRange[1]) {
96
+ return
97
+ }
98
+
99
+ /** urlencoded params including test values */
100
+ const urlParams = {
101
+ table: 'samples',
102
+ dataSetId: this.lifecycle.resourceId,
103
+ fromWorkDate: workDateRange[0],
104
+ toWorkDate: workDateRange[1],
105
+ workShift,
106
+ template,
107
+ templateType: 'crosstab'
108
+ }
109
+
110
+ const encodedUrlParams = Object.keys(urlParams)
111
+ .filter(key => {
112
+ // ignore empty
113
+ return !!urlParams[key]
114
+ })
115
+ .map(key => `${key}=${encodeURIComponent(urlParams[key])}`)
116
+ .join('&')
117
+
118
+ this.shadowRoot.querySelector('#container').src = `/data-report/jasper?${encodedUrlParams}`
119
+ }
120
+ }
121
+
122
+ window.customElements.define('jasper-report-samples-crosstab-page', JasperReportSamplesCrosstabPage)