@things-factory/dataset 5.0.0-alpha.8 → 5.0.0-zeta.0

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 -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-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 +6 -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 +190 -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 +8 -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 -168
  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 +161 -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 -307
  107. package/client/pages/data-set.js +0 -457
@@ -0,0 +1,416 @@
1
+ import '@operato/data-grist'
2
+ import './data-ooc-view.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 { client } from '@operato/graphql'
9
+ import { i18next, localize } from '@operato/i18n'
10
+ import { openPopup } from '@operato/layout'
11
+ import { PageView, store } from '@operato/shell'
12
+ import { CommonGristStyles, ScrollbarStyles } from '@operato/styles'
13
+ import { isMobileDevice } from '@operato/utils'
14
+
15
+ export class DataOocListPage extends connect(store)(localize(i18next)(PageView)) {
16
+ static get properties() {
17
+ return {
18
+ active: String,
19
+ gristConfig: Object,
20
+ mode: String
21
+ }
22
+ }
23
+
24
+ static get styles() {
25
+ return [
26
+ ScrollbarStyles,
27
+ CommonGristStyles,
28
+ css`
29
+ :host {
30
+ display: flex;
31
+ flex-direction: column;
32
+
33
+ overflow: hidden;
34
+ }
35
+
36
+ ox-grist {
37
+ overflow-y: auto;
38
+ flex: 1;
39
+ }
40
+ `
41
+ ]
42
+ }
43
+
44
+ get context() {
45
+ return {
46
+ title: i18next.t('title.data-ooc list'),
47
+ help: 'dataset/data-ooc',
48
+ actions: [
49
+ // {
50
+ // title: i18next.t('button.save'),
51
+ // action: this._updateDataOoc.bind(this),
52
+ // ...CommonButtonStyles.save
53
+ // }
54
+ ],
55
+ exportable: {
56
+ name: i18next.t('title.data-ooc list'),
57
+ data: this._exportableData.bind(this)
58
+ }
59
+ }
60
+ }
61
+
62
+ render() {
63
+ const mode = this.mode || (isMobileDevice() ? 'LIST' : 'GRID')
64
+
65
+ return html`
66
+ <ox-grist
67
+ .mode=${mode}
68
+ .config=${this.gristConfig}
69
+ .fetchHandler=${this.fetchHandler.bind(this)}
70
+ ?url-params-sensitive=${this.active}
71
+ >
72
+ <div slot="headroom">
73
+ <div id="filters">
74
+ <ox-filters-form></ox-filters-form>
75
+ </div>
76
+
77
+ <div id="sorters">
78
+ Sort
79
+ <mwc-icon
80
+ @click=${e => {
81
+ const target = e.currentTarget
82
+ this.renderRoot.querySelector('#sorter-control').open({
83
+ right: 0,
84
+ top: target.offsetTop + target.offsetHeight
85
+ })
86
+ }}
87
+ >expand_more</mwc-icon
88
+ >
89
+ <ox-popup id="sorter-control">
90
+ <ox-sorters-control> </ox-sorters-control>
91
+ </ox-popup>
92
+ </div>
93
+
94
+ <div id="modes">
95
+ <mwc-icon @click=${() => (this.mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</mwc-icon>
96
+ <mwc-icon @click=${() => (this.mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</mwc-icon>
97
+ <mwc-icon @click=${() => (this.mode = 'CARD')} ?active=${mode == 'CARD'}>apps</mwc-icon>
98
+ </div>
99
+ </div>
100
+ </ox-grist>
101
+ `
102
+ }
103
+
104
+ get grist() {
105
+ return this.renderRoot.querySelector('ox-grist')
106
+ }
107
+
108
+ async pageInitialized(lifecycle) {
109
+ this.gristConfig = {
110
+ list: {
111
+ fields: ['dataSet', 'data', 'spec', 'correctiveAction', 'corrector', 'correctedAt', 'collectedAt', 'creator']
112
+ },
113
+ columns: [
114
+ { type: 'gutter', gutterName: 'sequence' },
115
+ { type: 'gutter', gutterName: 'row-selector', multiple: true },
116
+ {
117
+ type: 'gutter',
118
+ gutterName: 'button',
119
+ icon: 'assignment_turned_in',
120
+ handlers: {
121
+ click: (columns, data, column, record, rowIndex) => {
122
+ const popup = openPopup(
123
+ html` <data-ooc-view .dataOoc=${record} style="background-color: white;"></data-ooc-view> `,
124
+ {
125
+ backdrop: true,
126
+ size: 'large',
127
+ title: i18next.t('title.data-ooc view')
128
+ }
129
+ )
130
+ popup.onclosed = () => {
131
+ this.grist.fetch()
132
+ }
133
+ }
134
+ }
135
+ },
136
+ {
137
+ type: 'string',
138
+ name: 'name',
139
+ label: true,
140
+ header: i18next.t('field.name'),
141
+ record: {
142
+ editable: true
143
+ },
144
+ filter: 'search',
145
+ sortable: true,
146
+ width: 120,
147
+ imex: true
148
+ },
149
+ {
150
+ type: 'string',
151
+ name: 'description',
152
+ label: true,
153
+ header: i18next.t('field.description'),
154
+ record: {
155
+ editable: true
156
+ },
157
+ filter: 'search',
158
+ width: 150,
159
+ imex: true
160
+ },
161
+ {
162
+ type: 'string',
163
+ name: 'history',
164
+ hidden: true,
165
+ imex: true
166
+ },
167
+ {
168
+ type: 'checkbox',
169
+ name: 'ooc',
170
+ header: i18next.t('field.ooc'),
171
+ record: {
172
+ editable: false
173
+ },
174
+ width: 30
175
+ },
176
+ {
177
+ type: 'checkbox',
178
+ name: 'oos',
179
+ header: i18next.t('field.oos'),
180
+ record: {
181
+ editable: false
182
+ },
183
+ width: 30
184
+ },
185
+ {
186
+ type: 'select',
187
+ name: 'state',
188
+ label: true,
189
+ header: i18next.t('field.state'),
190
+ record: {
191
+ editable: false,
192
+ options: ['', 'CREATED', 'REVIEWED', 'CORRECTED']
193
+ },
194
+ width: 100,
195
+ filter: true,
196
+ imex: true
197
+ },
198
+ {
199
+ type: 'textarea',
200
+ name: 'correctiveAction',
201
+ label: true,
202
+ header: i18next.t('field.corrective-action'),
203
+ record: {
204
+ editable: true
205
+ },
206
+ width: 150,
207
+ imex: true
208
+ },
209
+ {
210
+ type: 'resource-object',
211
+ name: 'dataSet',
212
+ header: i18next.t('field.data-set'),
213
+ record: {
214
+ editable: false
215
+ },
216
+ sortable: true,
217
+ width: 120,
218
+ imex: true
219
+ },
220
+ {
221
+ type: 'json5',
222
+ name: 'partitionKeys',
223
+ header: i18next.t('field.partition-keys'),
224
+ record: {
225
+ editable: false
226
+ },
227
+ width: 200,
228
+ imex: true
229
+ },
230
+ {
231
+ type: 'json5',
232
+ name: 'data',
233
+ header: i18next.t('field.data'),
234
+ record: {
235
+ editable: false
236
+ },
237
+ width: 200,
238
+ imex: true
239
+ },
240
+ {
241
+ type: 'json5',
242
+ name: 'spec',
243
+ header: i18next.t('field.spec'),
244
+ record: {
245
+ editable: false
246
+ },
247
+ width: 200
248
+ },
249
+ {
250
+ type: 'text',
251
+ name: 'rawData',
252
+ header: i18next.t('field.raw-data'),
253
+ record: {
254
+ editable: false
255
+ },
256
+ width: 200,
257
+ imex: true
258
+ },
259
+ {
260
+ type: 'string',
261
+ name: 'workDate',
262
+ header: i18next.t('field.work-date'),
263
+ sortable: true,
264
+ width: 80,
265
+ imex: true
266
+ },
267
+ {
268
+ type: 'string',
269
+ name: 'workShift',
270
+ header: i18next.t('field.work-shift'),
271
+ sortable: true,
272
+ width: 40,
273
+ imex: true
274
+ },
275
+ {
276
+ type: 'datetime',
277
+ name: 'collectedAt',
278
+ header: i18next.t('field.collected-at'),
279
+ sortable: true,
280
+ width: 180,
281
+ imex: true
282
+ },
283
+ {
284
+ type: 'resource-object',
285
+ name: 'updater',
286
+ header: i18next.t('field.updater'),
287
+ sortable: true,
288
+ width: 120,
289
+ imex: true
290
+ },
291
+ {
292
+ type: 'datetime',
293
+ name: 'updatedAt',
294
+ header: i18next.t('field.updated_at'),
295
+ sortable: true,
296
+ width: 180,
297
+ imex: true
298
+ }
299
+ ],
300
+ rows: {
301
+ appendable: false,
302
+ selectable: {
303
+ multiple: true
304
+ }
305
+ },
306
+ sorters: [
307
+ {
308
+ name: 'updatedAt',
309
+ desc: true
310
+ }
311
+ ]
312
+ }
313
+
314
+ await this.updateComplete
315
+
316
+ this.grist.fetch()
317
+ }
318
+
319
+ async fetchHandler({ page, limit, sortings = [], filters = [] }) {
320
+ const response = await client.query({
321
+ query: gql`
322
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
323
+ responses: dataOocs(filters: $filters, pagination: $pagination, sortings: $sortings) {
324
+ items {
325
+ id
326
+ name
327
+ description
328
+ dataSet {
329
+ id
330
+ name
331
+ }
332
+ dataSample {
333
+ id
334
+ name
335
+ }
336
+ partitionKeys
337
+ data
338
+ rawData
339
+ state
340
+ spec
341
+ ooc
342
+ oos
343
+ history
344
+ workDate
345
+ workShift
346
+ correctiveAction
347
+ correctedAt
348
+ corrector {
349
+ id
350
+ name
351
+ }
352
+ updater {
353
+ id
354
+ name
355
+ }
356
+ updatedAt
357
+ collectedAt
358
+ }
359
+ total
360
+ }
361
+ }
362
+ `,
363
+ variables: {
364
+ filters,
365
+ pagination: { page, limit },
366
+ sortings
367
+ }
368
+ })
369
+
370
+ return {
371
+ total: response.data.responses.total || 0,
372
+ records: response.data.responses.items || []
373
+ }
374
+ }
375
+
376
+ _exportableData() {
377
+ let records = []
378
+ if (this.grist.selected && this.grist.selected.length > 0) {
379
+ records = this.grist.selected
380
+ } else {
381
+ records = this.grist.data.records
382
+ }
383
+
384
+ var headerSetting = this.grist.compiledConfig.columns
385
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
386
+ .map(column => {
387
+ return column.imex === true
388
+ ? {
389
+ header: column.header.renderer(),
390
+ key: column.name,
391
+ width: column.width,
392
+ type: column.type
393
+ }
394
+ : column.imex
395
+ })
396
+
397
+ var data = records.map(item => {
398
+ return {
399
+ id: item.id,
400
+ ...this.gristConfig.columns
401
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
402
+ .reduce((record, column) => {
403
+ const key = column.imex === true ? column.name : column.imex.key
404
+ record[key] = key
405
+ .split('.')
406
+ .reduce((obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), item)
407
+ return record
408
+ }, {})
409
+ }
410
+ })
411
+
412
+ return { header: headerSetting, data: data }
413
+ }
414
+ }
415
+
416
+ window.customElements.define('data-ooc-list-page', DataOocListPage)
@@ -0,0 +1,183 @@
1
+ import '@operato/dataset/ox-data-ooc-view.js'
2
+
3
+ import gql from 'graphql-tag'
4
+ import { css, html, LitElement } from 'lit'
5
+
6
+ import { client } from '@operato/graphql'
7
+ import { i18next, localize } from '@operato/i18n'
8
+ import { ScrollbarStyles } from '@operato/styles'
9
+
10
+ class DataOocView extends localize(i18next)(LitElement) {
11
+ static get styles() {
12
+ return [
13
+ ScrollbarStyles,
14
+ css`
15
+ :host {
16
+ display: flex;
17
+ flex-direction: column;
18
+
19
+ background-color: #fff;
20
+ }
21
+
22
+ div[content] {
23
+ flex: 1;
24
+
25
+ display: flex;
26
+ overflow: auto;
27
+ }
28
+
29
+ ox-data-ooc-view {
30
+ flex: 1;
31
+ padding: var(--padding-wide);
32
+ overflow: auto;
33
+ }
34
+
35
+ label[comment] {
36
+ display: flex;
37
+ flex-direction: column;
38
+
39
+ padding: var(--padding-wide);
40
+ }
41
+
42
+ label[comment] div {
43
+ display: flex;
44
+ }
45
+
46
+ mwc-icon {
47
+ color: var(--status-danger-color);
48
+ }
49
+
50
+ textarea {
51
+ border: var(--input-field-border);
52
+ border-radius: var(--input-border-radius);
53
+ padding: var(--input-field-padding);
54
+ font: var(--input-field-font);
55
+ }
56
+
57
+ .button-container {
58
+ display: flex;
59
+ margin-left: auto;
60
+ padding: var(--padding-default);
61
+ }
62
+ `
63
+ ]
64
+ }
65
+
66
+ static get properties() {
67
+ return {
68
+ dataSet: Object,
69
+ dataOoc: Object
70
+ }
71
+ }
72
+
73
+ get sampleView() {
74
+ return this.renderRoot.querySelector('ox-data-ooc-view')
75
+ }
76
+
77
+ render() {
78
+ const state = this.dataOoc.state
79
+
80
+ return html`
81
+ <div content>
82
+ <ox-data-ooc-view .dataSet=${this.dataSet} .dataOoc=${this.dataOoc}></ox-data-ooc-view>
83
+ </div>
84
+
85
+ ${state === 'CREATED' || state === 'REVIEWED'
86
+ ? html`
87
+ <label comment>
88
+ <div><mwc-icon>build_circle</mwc-icon> <span>correction activity</span></div>
89
+ <textarea placeholder="조치 내용을 입력해주세요."></textarea>
90
+ </label>
91
+ `
92
+ : html``}
93
+
94
+ <div class="button-container">
95
+ ${state === 'CREATED'
96
+ ? html`<mwc-button raised @click=${() => this._processOoc('REVIEWED')}
97
+ >${i18next.t('button.reviewed')}</mwc-button
98
+ >`
99
+ : state === 'REVIEWED'
100
+ ? html`<mwc-button raised @click=${() => this._processOoc('CORRECTED')}
101
+ >${i18next.t('button.corrected')}</mwc-button
102
+ >`
103
+ : html``}
104
+ </div>
105
+ `
106
+ }
107
+
108
+ updated(changes) {
109
+ if (changes.has('dataOoc')) {
110
+ this.fetchDataSet()
111
+ }
112
+ }
113
+
114
+ async fetchDataSet() {
115
+ const id = this.dataOoc?.dataSet?.id
116
+
117
+ if (id) {
118
+ const response = await client.query({
119
+ query: gql`
120
+ query ($id: String!) {
121
+ dataSet(id: $id) {
122
+ id
123
+ name
124
+ description
125
+ useCase
126
+ dataItems {
127
+ id
128
+ name
129
+ description
130
+ active
131
+ unit
132
+ tag
133
+ type
134
+ spec
135
+ }
136
+ }
137
+ }
138
+ `,
139
+ variables: {
140
+ id: this.dataOoc.dataSet.id
141
+ }
142
+ })
143
+
144
+ this.dataSet = response.data.dataSet
145
+ }
146
+ }
147
+
148
+ async _processOoc(state) {
149
+ const commentTextArea = this.renderRoot.querySelector('textarea')
150
+ const comment = commentTextArea && commentTextArea.value
151
+ if (!comment || !comment.trim()) {
152
+ commentTextArea.focus()
153
+ return
154
+ }
155
+
156
+ const patch = {
157
+ state,
158
+ correctiveAction: comment
159
+ }
160
+
161
+ const response = await client.mutate({
162
+ mutation: gql`
163
+ mutation ($id: String!, $patch: DataOocPatch!) {
164
+ updateDataOoc(id: $id, patch: $patch) {
165
+ id
166
+ }
167
+ }
168
+ `,
169
+ variables: {
170
+ id: this.dataOoc.id,
171
+ patch
172
+ }
173
+ })
174
+
175
+ if (!response.errors) {
176
+ document.dispatchEvent(
177
+ new CustomEvent('notify', { detail: { message: i18next.t('text.data ooc updated successfully') } })
178
+ )
179
+ }
180
+ }
181
+ }
182
+
183
+ window.customElements.define('data-ooc-view', DataOocView)
@@ -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)