@things-factory/dataset 5.0.0-alpha.5 → 5.0.0-alpha.50

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 (107) 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 -2
  5. package/client/pages/data-entry/data-entry-list-page.js +423 -0
  6. package/client/pages/data-ooc/data-ooc-list-page.js +483 -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 +465 -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 +386 -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 -64
  16. package/client/pages/{data-item-list.js → data-set/data-item-list.js} +37 -12
  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 +746 -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-mutation.js +5 -1
  35. package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
  36. package/dist-server/service/data-item/data-item-query.js +7 -2
  37. package/dist-server/service/data-item/data-item-query.js.map +1 -1
  38. package/dist-server/service/data-item/data-item-type.js +15 -7
  39. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  40. package/dist-server/service/data-item/data-item.js +17 -3
  41. package/dist-server/service/data-item/data-item.js.map +1 -1
  42. package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
  43. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  44. package/dist-server/service/data-ooc/data-ooc-query.js +120 -0
  45. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  46. package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
  47. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  48. package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
  49. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  50. package/dist-server/service/data-ooc/data-ooc.js +237 -0
  51. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  52. package/dist-server/service/data-ooc/index.js +10 -0
  53. package/dist-server/service/data-ooc/index.js.map +1 -0
  54. package/dist-server/service/data-sample/data-sample-mutation.js +2 -138
  55. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  56. package/dist-server/service/data-sample/data-sample-query.js +7 -2
  57. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  58. package/dist-server/service/data-sample/data-sample-type.js +12 -42
  59. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  60. package/dist-server/service/data-sample/data-sample.js +34 -3
  61. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  62. package/dist-server/service/data-sensor/data-sensor-query.js +7 -2
  63. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  64. package/dist-server/service/data-set/data-set-mutation.js +40 -14
  65. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  66. package/dist-server/service/data-set/data-set-query.js +185 -3
  67. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  68. package/dist-server/service/data-set/data-set-type.js +84 -3
  69. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  70. package/dist-server/service/data-set/data-set.js +110 -15
  71. package/dist-server/service/data-set/data-set.js.map +1 -1
  72. package/dist-server/service/index.js +6 -2
  73. package/dist-server/service/index.js.map +1 -1
  74. package/package.json +19 -13
  75. package/server/controllers/create-data-sample.ts +177 -0
  76. package/server/controllers/data-use-case.ts +85 -0
  77. package/server/controllers/index.ts +2 -0
  78. package/server/controllers/jasper-report.ts +170 -0
  79. package/server/index.ts +1 -0
  80. package/server/routes.ts +21 -31
  81. package/server/service/data-item/data-item-mutation.ts +6 -1
  82. package/server/service/data-item/data-item-query.ts +9 -3
  83. package/server/service/data-item/data-item-type.ts +10 -6
  84. package/server/service/data-item/data-item.ts +15 -4
  85. package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
  86. package/server/service/data-ooc/data-ooc-query.ts +69 -0
  87. package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
  88. package/server/service/data-ooc/data-ooc-type.ts +68 -0
  89. package/server/service/data-ooc/data-ooc.ts +204 -0
  90. package/server/service/data-ooc/index.ts +7 -0
  91. package/server/service/data-sample/data-sample-mutation.ts +3 -172
  92. package/server/service/data-sample/data-sample-query.ts +9 -3
  93. package/server/service/data-sample/data-sample-type.ts +7 -28
  94. package/server/service/data-sample/data-sample.ts +33 -3
  95. package/server/service/data-sensor/data-sensor-query.ts +9 -3
  96. package/server/service/data-set/data-set-mutation.ts +53 -14
  97. package/server/service/data-set/data-set-query.ts +156 -4
  98. package/server/service/data-set/data-set-type.ts +65 -4
  99. package/server/service/data-set/data-set.ts +100 -12
  100. package/server/service/index.ts +6 -2
  101. package/things-factory.config.js +35 -7
  102. package/translations/en.json +46 -3
  103. package/translations/ko.json +45 -3
  104. package/translations/ms.json +44 -3
  105. package/translations/zh.json +44 -3
  106. package/client/pages/data-sample.js +0 -316
  107. package/client/pages/data-set.js +0 -457
@@ -0,0 +1,113 @@
1
+ import '@operato/data-grist'
2
+ import '@things-factory/form-ui'
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
+ import { encodeFormParams, getCookie } from '@things-factory/utils'
10
+
11
+ class DataReportEmbedPage extends localize(i18next)(PageView) {
12
+ static get properties() {
13
+ return {
14
+ _grnNo: String,
15
+ _status: String,
16
+ resourceId: String,
17
+ params: Object
18
+ }
19
+ }
20
+
21
+ static get styles() {
22
+ return [
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
+
41
+ get context() {
42
+ const filters = [
43
+ {
44
+ name: 'workDateRange',
45
+ type: 'date',
46
+ label: 'date',
47
+ operator: 'between'
48
+ }
49
+ ]
50
+ var actions = [
51
+ {
52
+ title: i18next.t('button.print'),
53
+ action: () => {
54
+ this.renderRoot.querySelector('iframe').contentWindow.print()
55
+ },
56
+ ...CommonButtonStyles.print
57
+ }
58
+ ]
59
+ return {
60
+ title: 'jasper-report',
61
+ actions,
62
+ filters
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" frameborder="0" style="border:0"></iframe>
76
+ `
77
+ }
78
+
79
+ async pageUpdated(changes, lifecycle) {
80
+ if (this.active) {
81
+ this.updateContext()
82
+ }
83
+ }
84
+
85
+ async _reportTemplate(filters) {
86
+ // convert filters array to object
87
+ const params = filters.reduce((acc, curr) => ((acc[curr.name] = curr.value), acc), {})
88
+ Object.assign(params, this.lifecycle.params)
89
+
90
+ const { workDateRange, workShift, reportView } = params
91
+
92
+ /** ignoring date conditions */
93
+ if (!workDateRange[0] || !workDateRange[1] || workDateRange[0] > workDateRange[1]) {
94
+ return
95
+ }
96
+
97
+ /** urlencoded params including test values */
98
+ const urlParams = {
99
+ table: 'samples',
100
+ dataSetId: this.lifecycle.resourceId,
101
+ fromWorkDate: workDateRange[0],
102
+ toWorkDate: workDateRange[1],
103
+ token: getCookie('access_token'),
104
+ workShift
105
+ }
106
+
107
+ const encodedUrlParams = encodeFormParams(urlParams)
108
+
109
+ this.shadowRoot.querySelector('#container').src = `${reportView}?params=${encodedUrlParams}`
110
+ }
111
+ }
112
+
113
+ window.customElements.define('data-report-embed-page', DataReportEmbedPage)
@@ -0,0 +1,465 @@
1
+ import '@operato/data-grist'
2
+ import '@operato/board/ox-board-viewer.js'
3
+
4
+ import gql from 'graphql-tag'
5
+ import JSON5 from 'json5'
6
+ import { css, html } from 'lit'
7
+ import { connect } from 'pwa-helpers/connect-mixin'
8
+
9
+ import { getRenderer } from '@operato/data-grist'
10
+ import { OxDataUseCase } from '@operato/dataset'
11
+ import { client } from '@operato/graphql'
12
+ import { i18next, localize } from '@operato/i18n'
13
+ import { openPopup } from '@operato/layout'
14
+ import { navigate, PageView, store } from '@operato/shell'
15
+ import { CommonGristStyles, ScrollbarStyles } from '@operato/styles'
16
+ import { provider } from '@things-factory/board-ui'
17
+
18
+ const USECASE_OPTIONS = () => {
19
+ return ['', ...OxDataUseCase.getUseCaseNames()].map(name => {
20
+ return {
21
+ display: name,
22
+ value: name
23
+ }
24
+ })
25
+ }
26
+
27
+ const showMonitorView = (columns, data, column, record, rowIndex) => {
28
+ const { id, name, monitorType, monitorView } = record
29
+ const title = `${name} - ${i18next.t('title.data-monitor-view')}`
30
+
31
+ switch (monitorType) {
32
+ case 'generated':
33
+ openPopup(html` <div style="background-color: white;">Under construction</div> `, {
34
+ backdrop: true,
35
+ size: 'large',
36
+ title
37
+ })
38
+ break
39
+
40
+ case 'board':
41
+ const board = {
42
+ id: monitorView
43
+ }
44
+ openPopup(
45
+ html`
46
+ <ox-board-viewer
47
+ style="background-color: white;"
48
+ .board=${board}
49
+ .provider=${provider}
50
+ hide-fullscreen
51
+ hide-navigation
52
+ ></ox-board-viewer>
53
+ `,
54
+ {
55
+ closable: true,
56
+ backdrop: true,
57
+ size: 'large',
58
+ title
59
+ }
60
+ )
61
+
62
+ // navigate(`board-viewer/${monitorView}?interactive=true&title=${title}`)
63
+ break
64
+
65
+ case 'page':
66
+ navigate(monitorView)
67
+ break
68
+
69
+ case 'external':
70
+ window.open(monitorView, '_blank')
71
+ break
72
+ }
73
+ }
74
+
75
+ const showReportView = (columns, data, column, record, rowIndex) => {
76
+ const { id, name, reportType, reportView, reportTemplate } = record
77
+ const title = `${name} - ${i18next.t('title.data-report-view')}`
78
+
79
+ switch (reportType) {
80
+ case 'generated':
81
+ openPopup(html` <div style="background-color: white;">Under construction</div> `, {
82
+ backdrop: true,
83
+ size: 'large',
84
+ title
85
+ })
86
+ break
87
+
88
+ case 'embed':
89
+ const board = {
90
+ id: reportView
91
+ }
92
+ navigate(`/data-report-embed/${id}?reportView=${encodeURIComponent(reportView)}`)
93
+ // openPopup(html` <div style="background-color: white;">Under construction</div> `, {
94
+ // closable: true,
95
+ // backdrop: true,
96
+ // size: 'large',
97
+ // title
98
+ // })
99
+
100
+ break
101
+
102
+ case 'page':
103
+ navigate(reportView + `/${id}?template=${encodeURIComponent(reportTemplate)}`)
104
+ break
105
+
106
+ case 'external':
107
+ window.open(reportView, '_blank')
108
+ break
109
+ }
110
+ }
111
+
112
+ export class DataReportListPage extends connect(store)(localize(i18next)(PageView)) {
113
+ static get properties() {
114
+ return {
115
+ active: String,
116
+ gristConfig: Object,
117
+ filters: Object,
118
+ sorters: Object,
119
+ mode: String
120
+ }
121
+ }
122
+
123
+ static get styles() {
124
+ return [
125
+ ScrollbarStyles,
126
+ CommonGristStyles,
127
+ css`
128
+ :host {
129
+ display: flex;
130
+
131
+ width: 100%;
132
+
133
+ --grid-record-emphasized-background-color: red;
134
+ --grid-record-emphasized-color: yellow;
135
+ }
136
+ `
137
+ ]
138
+ }
139
+
140
+ get context() {
141
+ return {
142
+ title: i18next.t('title.data-entry list'),
143
+ help: 'dataset/data-entry-list'
144
+ }
145
+ }
146
+
147
+ render() {
148
+ const mode = 'CARD'
149
+
150
+ return html`
151
+ <ox-grist
152
+ .mode=${mode}
153
+ .config=${this.gristConfig}
154
+ .filters=${this.filters}
155
+ .orders=${this.orders}
156
+ .fetchHandler=${this.fetchHandler.bind(this)}
157
+ >
158
+ <div slot="headroom" id="filters">
159
+ <div id="filters">
160
+ <ox-filters-form></ox-filters-form>
161
+ </div>
162
+
163
+ <div id="sorters">
164
+ Sort
165
+ <mwc-icon
166
+ @click=${e => {
167
+ const target = e.currentTarget
168
+ this.renderRoot.querySelector('#sorter-control').open({
169
+ right: 0,
170
+ top: target.offsetTop + target.offsetHeight
171
+ })
172
+ }}
173
+ >expand_more</mwc-icon
174
+ >
175
+ <ox-popup id="sorter-control">
176
+ <ox-sorters-control> </ox-sorters-control>
177
+ </ox-popup>
178
+ </div>
179
+ </div>
180
+ </ox-grist>
181
+ `
182
+ }
183
+
184
+ get grist() {
185
+ return this.renderRoot.querySelector('ox-grist')
186
+ }
187
+
188
+ async pageInitialized(lifecycle) {
189
+ this.gristConfig = {
190
+ list: {
191
+ thumbnail: 'monitorView',
192
+ fields: ['name', 'description'],
193
+ details: ['schedule', 'type', 'useCase', 'latestCollectedAt', 'prevSchedule', 'nextSchedule']
194
+ },
195
+ columns: [
196
+ {
197
+ type: 'gutter',
198
+ gutterName: 'button',
199
+ icon: 'newspaper',
200
+ handlers: {
201
+ click: showReportView
202
+ }
203
+ },
204
+ {
205
+ type: 'gutter',
206
+ gutterName: 'button',
207
+ icon: 'analytics',
208
+ handlers: {
209
+ click: showMonitorView
210
+ }
211
+ },
212
+ {
213
+ type: 'string',
214
+ name: 'name',
215
+ header: i18next.t('field.name'),
216
+ record: {
217
+ editable: false
218
+ },
219
+ filter: 'search',
220
+ sortable: true,
221
+ width: 150
222
+ },
223
+ {
224
+ type: 'string',
225
+ name: 'description',
226
+ header: i18next.t('field.description'),
227
+ record: {
228
+ editable: false
229
+ },
230
+ filter: 'search',
231
+ width: 200
232
+ },
233
+ {
234
+ type: 'select',
235
+ name: 'type',
236
+ label: true,
237
+ header: i18next.t('field.type'),
238
+ record: {
239
+ editable: false,
240
+ options: [
241
+ {},
242
+ {
243
+ display: i18next.t('text.manually collected'),
244
+ value: 'manual'
245
+ },
246
+ {
247
+ display: i18next.t('text.automatically collected'),
248
+ value: 'automatic'
249
+ }
250
+ ]
251
+ },
252
+ sortable: true,
253
+ filter: true,
254
+ width: 60
255
+ },
256
+ {
257
+ type: 'select',
258
+ name: 'useCase',
259
+ label: true,
260
+ header: i18next.t('field.use-case'),
261
+ record: {
262
+ editable: false,
263
+ options: USECASE_OPTIONS
264
+ },
265
+ sortable: true,
266
+ filter: {
267
+ operator: 'eq',
268
+ options: USECASE_OPTIONS /* in case select options type is a function, filter should have its own options */
269
+ },
270
+ width: 80
271
+ },
272
+ {
273
+ type: 'crontab',
274
+ name: 'schedule',
275
+ label: true,
276
+ header: i18next.t('field.schedule'),
277
+ record: {
278
+ editable: false
279
+ },
280
+ width: 80,
281
+ label: true
282
+ },
283
+ {
284
+ type: 'resource-object',
285
+ name: 'entryRole',
286
+ header: i18next.t('field.entry-role'),
287
+ record: {
288
+ editable: false
289
+ },
290
+ width: 120
291
+ },
292
+ {
293
+ type: 'resource-object',
294
+ name: 'supervisoryRole',
295
+ header: i18next.t('field.supervisory-role'),
296
+ record: {
297
+ editable: false
298
+ },
299
+ width: 120
300
+ },
301
+ {
302
+ type: 'datetime',
303
+ name: 'latestCollectedAt',
304
+ label: true,
305
+ header: i18next.t('field.latest-collected-at'),
306
+ record: {
307
+ editable: false
308
+ },
309
+ width: 180
310
+ },
311
+ {
312
+ type: 'datetime',
313
+ name: 'prevSchedule',
314
+ label: true,
315
+ header: i18next.t('field.prev-schedule'),
316
+ record: {
317
+ editable: false
318
+ },
319
+ width: 180
320
+ },
321
+ {
322
+ type: 'datetime',
323
+ name: 'nextSchedule',
324
+ label: true,
325
+ header: i18next.t('field.next-schedule'),
326
+ record: {
327
+ editable: false
328
+ },
329
+ width: 180
330
+ },
331
+ {
332
+ type: 'string',
333
+ name: 'monitorView',
334
+ hidden: true,
335
+ record: {
336
+ editable: false,
337
+ renderer: function (value, column, record, rowIndex, field) {
338
+ const type = record.monitorType !== 'board' ? 'string' : 'image'
339
+ value = record.monitorType !== 'board' ? value : record.monitorBoard?.thumbnail
340
+
341
+ return getRenderer(type)(value, column, record, rowIndex, field)
342
+ }
343
+ }
344
+ }
345
+ ],
346
+ rows: {
347
+ selectable: {
348
+ multiple: false
349
+ },
350
+ handlers: {
351
+ click: showReportView
352
+ },
353
+ classifier: function (record, rowIndex) {}
354
+ },
355
+ sorters: [
356
+ {
357
+ name: 'name'
358
+ }
359
+ ]
360
+ }
361
+
362
+ await this.updateComplete
363
+
364
+ this.grist.fetch()
365
+ }
366
+
367
+ async pageUpdated(changes, lifecycle) {
368
+ if (this.active) {
369
+ await this.updateComplete
370
+
371
+ var filters = lifecycle.params?.['filters']
372
+ if (filters) {
373
+ try {
374
+ filters = JSON5.parse(filters)
375
+ this.filters = filters
376
+ } catch (e) {
377
+ console.error(`filters parameter parsing error: ${e}`)
378
+ }
379
+ }
380
+
381
+ var sorters = lifecycle.params?.['sorters']
382
+ if (sorters) {
383
+ try {
384
+ sorters = JSON5.parse(sorters)
385
+ this.sorters = sorters
386
+ } catch (e) {
387
+ console.error(`sorters parameter parsing error: ${e}`)
388
+ }
389
+ }
390
+
391
+ this.grist.fetch()
392
+ }
393
+ }
394
+
395
+ async fetchHandler({ page, limit, sortings = [], filters = [] }) {
396
+ const response = await client.query({
397
+ query: gql`
398
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
399
+ responses: dataSetsForReport(filters: $filters, pagination: $pagination, sortings: $sortings) {
400
+ items {
401
+ id
402
+ name
403
+ description
404
+ partitionKeys
405
+ active
406
+ type
407
+ useCase
408
+ schedule
409
+ timezone
410
+ entryRole {
411
+ id
412
+ name
413
+ }
414
+ supervisoryRole {
415
+ id
416
+ name
417
+ }
418
+ monitorType
419
+ monitorView
420
+ monitorBoard {
421
+ thumbnail
422
+ }
423
+ reportType
424
+ reportView
425
+ reportTemplate
426
+ updater {
427
+ id
428
+ name
429
+ }
430
+ updatedAt
431
+ dataItems {
432
+ name
433
+ description
434
+ sequence
435
+ active
436
+ tag
437
+ type
438
+ unit
439
+ options
440
+ quota
441
+ spec
442
+ }
443
+ latestCollectedAt
444
+ nextSchedule
445
+ prevSchedule
446
+ }
447
+ total
448
+ }
449
+ }
450
+ `,
451
+ variables: {
452
+ filters,
453
+ pagination: { page, limit },
454
+ sortings
455
+ }
456
+ })
457
+
458
+ return {
459
+ total: response.data.responses.total || 0,
460
+ records: response.data.responses.items || []
461
+ }
462
+ }
463
+ }
464
+
465
+ 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)