@things-factory/dataset 5.0.14 → 6.0.0-alpha.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.
- package/README.md +20 -0
- package/assets/data-report.jpg +0 -0
- package/assets/glue-table-indices.png +0 -0
- package/client/pages/data-key-set/data-key-set-importer.js +4 -6
- package/client/pages/data-key-set/data-key-set-list-page.js +97 -2
- package/client/pages/data-report/data-report-embed-page.js +16 -12
- package/client/pages/data-report/data-report-list-page.js +16 -13
- package/client/pages/data-report/data-report-samples-page.js +186 -0
- package/client/pages/data-set/data-set-importer.js +1 -1
- package/client/pages/data-set/data-set-list-page.js +8 -0
- package/client/route.js +16 -12
- package/config/config.development.js +10 -0
- package/config/config.production.js +21 -11
- package/dist-server/controllers/create-data-sample.js +3 -1
- package/dist-server/controllers/create-data-sample.js.map +1 -1
- package/dist-server/controllers/jasper-report.js +17 -12
- package/dist-server/controllers/jasper-report.js.map +1 -1
- package/dist-server/controllers/shiny-report.js +44 -0
- package/dist-server/controllers/shiny-report.js.map +1 -0
- package/dist-server/routes.js +8 -0
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/data-key-set/data-key-set-mutation.js +4 -4
- package/dist-server/service/data-key-set/data-key-set-mutation.js.map +1 -1
- package/dist-server/service/data-key-set/data-key-set-query.js +9 -11
- package/dist-server/service/data-key-set/data-key-set-query.js.map +1 -1
- package/dist-server/service/data-key-set/data-key-set-type.js +17 -0
- package/dist-server/service/data-key-set/data-key-set-type.js.map +1 -1
- package/dist-server/service/data-key-set/data-key-set.js +14 -4
- package/dist-server/service/data-key-set/data-key-set.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-mutation.js +1 -1
- package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-query.js +9 -11
- package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-subscription.js +1 -2
- package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-type.js +2 -3
- package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc.js +4 -5
- package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-query.js +12 -14
- package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-type.js +1 -2
- package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
- package/dist-server/service/data-sample/data-sample.js +3 -4
- package/dist-server/service/data-sample/data-sample.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-mutation.js +4 -4
- package/dist-server/service/data-sensor/data-sensor-mutation.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-query.js +9 -11
- package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-type.js +4 -5
- package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor.js +4 -5
- package/dist-server/service/data-sensor/data-sensor.js.map +1 -1
- package/dist-server/service/data-set/data-set-mutation.js +5 -4
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +24 -26
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-type.js +6 -7
- package/dist-server/service/data-set/data-set-type.js.map +1 -1
- package/dist-server/service/data-set/data-set.js +7 -6
- package/dist-server/service/data-set/data-set.js.map +1 -1
- package/dist-server/service/data-set-history/data-set-history-query.js +14 -16
- package/dist-server/service/data-set-history/data-set-history-query.js.map +1 -1
- package/dist-server/service/data-set-history/data-set-history.js +5 -6
- package/dist-server/service/data-set-history/data-set-history.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -9
- package/server/controllers/create-data-sample.ts +4 -0
- package/server/controllers/jasper-report.ts +17 -12
- package/server/controllers/shiny-report.ts +63 -0
- package/server/routes.ts +10 -0
- package/server/service/data-key-set/data-key-set-mutation.ts +16 -13
- package/server/service/data-key-set/data-key-set-query.ts +8 -9
- package/server/service/data-key-set/data-key-set-type.ts +13 -0
- package/server/service/data-key-set/data-key-set.ts +9 -0
- package/server/service/data-ooc/data-ooc-mutation.ts +12 -8
- package/server/service/data-ooc/data-ooc-query.ts +8 -9
- package/server/service/data-ooc/data-ooc-subscription.ts +1 -2
- package/server/service/data-sample/data-sample-mutation.ts +4 -1
- package/server/service/data-sample/data-sample-query.ts +10 -11
- package/server/service/data-sensor/data-sensor-mutation.ts +15 -9
- package/server/service/data-sensor/data-sensor-query.ts +9 -10
- package/server/service/data-set/data-set-mutation.ts +16 -11
- package/server/service/data-set/data-set-query.ts +18 -19
- package/server/service/data-set/data-set.ts +3 -1
- package/server/service/data-set-history/data-set-history-query.ts +13 -14
- package/things-factory.config.js +19 -15
- package/translations/en.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
- package/dist-server/service/data-item/data-item-mutation.js +0 -69
- package/dist-server/service/data-item/data-item-mutation.js.map +0 -1
- package/dist-server/service/data-item/data-item-query.js +0 -100
- package/dist-server/service/data-item/data-item-query.js.map +0 -1
- package/dist-server/service/data-item/data-item-type.js +0 -80
- package/dist-server/service/data-item/data-item-type.js.map +0 -1
- package/dist-server/service/data-item/data-item.js +0 -136
- package/dist-server/service/data-item/data-item.js.map +0 -1
- package/dist-server/service/data-item/index.js +0 -9
- package/dist-server/service/data-item/index.js.map +0 -1
package/README.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
# dataset
|
2
2
|
## Architecture for data-samples
|
3
3
|

|
4
|
+
## data-report process
|
5
|
+

|
6
|
+
|
7
|
+
'shiny' uses the next lambda. But 'jasper' is not using this lambda now. Consider using the same data service.
|
8
|
+
- https://github.com/operatochef/serverless/tree/main/func-transform-data-samples
|
9
|
+
|
4
10
|
## Partition Keys
|
5
11
|
At the early stage, partition keys are desinged for dynamic partitioning for Athena. But It will be required so many AWS Glue crawlers also by each 'data-sets'.
|
6
12
|
|
@@ -17,7 +23,21 @@ Now partition keys are fixed
|
|
17
23
|
- workdate: working date
|
18
24
|
- workshift
|
19
25
|
|
26
|
+
### Glue Catalog Table Indices
|
27
|
+
Partitions can be indices. You can create new indices with combination of partitions.
|
28
|
+
It affects query performance and finding partitions.
|
29
|
+

|
30
|
+
## Data Samples
|
31
|
+
sample data could have an own timestamp if it is from a sensor data.
|
32
|
+
'collected_at' uses this timestamp.
|
33
|
+
Manual type of data is used 'Date.now() and new Date()'
|
34
|
+
Graphql might affect timezone of server os for Date type field.
|
35
|
+
'TZ=UTC node' can help to solve this when server starts.
|
36
|
+
Or use ``` process.env.TZ = 'UTC' ```.
|
37
|
+
Now applied in 'create-data-samples.ts'
|
38
|
+
|
20
39
|
## PostgreSQL query for dataset
|
40
|
+
This is not using now.
|
21
41
|
```
|
22
42
|
select
|
23
43
|
data::json#>>'{product,0}' as product,
|
Binary file
|
Binary file
|
@@ -75,11 +75,9 @@ export class DataKeySetImporter extends LitElement {
|
|
75
75
|
<ox-grist
|
76
76
|
.mode=${isMobileDevice() ? 'LIST' : 'GRID'}
|
77
77
|
.config=${this.columns}
|
78
|
-
.data=${
|
79
|
-
|
80
|
-
|
81
|
-
}
|
82
|
-
}
|
78
|
+
.data=${{
|
79
|
+
records: this.dataKeySets
|
80
|
+
}}
|
83
81
|
></ox-grist>
|
84
82
|
|
85
83
|
<div class="button-container">
|
@@ -98,7 +96,7 @@ export class DataKeySetImporter extends LitElement {
|
|
98
96
|
variables: { dataKeySets: this.dataKeySets }
|
99
97
|
})
|
100
98
|
|
101
|
-
if (response.
|
99
|
+
if (response.errors?.length) return
|
102
100
|
|
103
101
|
this.dispatchEvent(new CustomEvent('imported'))
|
104
102
|
}
|
@@ -12,7 +12,40 @@ import { notify, openPopup } from '@operato/layout'
|
|
12
12
|
import { navigate, PageView, store } from '@operato/shell'
|
13
13
|
import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'
|
14
14
|
import { isMobileDevice } from '@operato/utils'
|
15
|
+
import { encodeUrlParams } from '@things-factory/utils'
|
15
16
|
|
17
|
+
import { getEditor, getRenderer } from '@operato/data-grist'
|
18
|
+
|
19
|
+
const REPORT_TYPES = [
|
20
|
+
{
|
21
|
+
display: '',
|
22
|
+
value: ''
|
23
|
+
},
|
24
|
+
{
|
25
|
+
display: 'Generated',
|
26
|
+
value: 'generated'
|
27
|
+
},
|
28
|
+
{
|
29
|
+
display: 'Embed',
|
30
|
+
value: 'embed'
|
31
|
+
},
|
32
|
+
{
|
33
|
+
display: 'Page',
|
34
|
+
value: 'page'
|
35
|
+
},
|
36
|
+
{
|
37
|
+
display: 'External URL',
|
38
|
+
value: 'external'
|
39
|
+
},
|
40
|
+
{
|
41
|
+
display: 'Jasper',
|
42
|
+
value: 'jasper'
|
43
|
+
},
|
44
|
+
{
|
45
|
+
display: 'Shiny',
|
46
|
+
value: 'shiny'
|
47
|
+
}
|
48
|
+
]
|
16
49
|
export class DataKeySetListPage extends connect(store)(localize(i18next)(PageView)) {
|
17
50
|
static get properties() {
|
18
51
|
return {
|
@@ -136,13 +169,45 @@ export class DataKeySetListPage extends connect(store)(localize(i18next)(PageVie
|
|
136
169
|
{
|
137
170
|
type: 'gutter',
|
138
171
|
gutterName: 'button',
|
139
|
-
icon: '
|
172
|
+
icon: 'checklist',
|
140
173
|
handlers: {
|
141
174
|
click: (columns, data, column, record, rowIndex) => {
|
142
175
|
navigate(`data-sample-search/${record.id}`)
|
143
176
|
}
|
144
177
|
}
|
145
178
|
},
|
179
|
+
{
|
180
|
+
type: 'gutter',
|
181
|
+
gutterName: 'button',
|
182
|
+
icon: 'newspaper',
|
183
|
+
handlers: {
|
184
|
+
click: (columns, data, column, record, rowIndex) => {
|
185
|
+
try {
|
186
|
+
const { id:dataKeySetId, reportType, reportView } = record
|
187
|
+
switch (reportType) {
|
188
|
+
case 'generated':
|
189
|
+
break
|
190
|
+
case 'page':
|
191
|
+
break
|
192
|
+
case 'embed':
|
193
|
+
break
|
194
|
+
case 'external':
|
195
|
+
reportView && window.open(reportView, '_blank')
|
196
|
+
break
|
197
|
+
case 'jasper':
|
198
|
+
case 'shiny':
|
199
|
+
const urlParams = encodeUrlParams({ dataKeySetId, reportType, reportView })
|
200
|
+
navigate(`data-report-samples/?${urlParams}`)
|
201
|
+
break
|
202
|
+
default:
|
203
|
+
break
|
204
|
+
}
|
205
|
+
} catch(ex) {
|
206
|
+
console.log(ex)
|
207
|
+
}
|
208
|
+
}
|
209
|
+
}
|
210
|
+
},
|
146
211
|
{
|
147
212
|
type: 'string',
|
148
213
|
name: 'name',
|
@@ -176,6 +241,34 @@ export class DataKeySetListPage extends connect(store)(localize(i18next)(PageVie
|
|
176
241
|
sortable: true,
|
177
242
|
width: 60
|
178
243
|
},
|
244
|
+
{
|
245
|
+
type: 'select',
|
246
|
+
name: 'reportType',
|
247
|
+
label: true,
|
248
|
+
header: i18next.t('field.report-type'),
|
249
|
+
record: {
|
250
|
+
editable: true,
|
251
|
+
options: REPORT_TYPES
|
252
|
+
},
|
253
|
+
width: 80
|
254
|
+
},
|
255
|
+
{
|
256
|
+
type: 'string',
|
257
|
+
name: 'reportView',
|
258
|
+
header: i18next.t('field.report-view'),
|
259
|
+
record: {
|
260
|
+
editable: true,
|
261
|
+
editor: function (value, column, record, rowIndex, field) {
|
262
|
+
var type = record.reportType !== 'custom' ? 'string' : 'script'
|
263
|
+
return getEditor(type)(value, column, record, rowIndex, field)
|
264
|
+
},
|
265
|
+
renderer: function (value, column, record, rowIndex, field) {
|
266
|
+
var type = record.reportType !== 'custom' ? 'string' : 'string'
|
267
|
+
return getRenderer(type)(value, column, record, rowIndex, field)
|
268
|
+
}
|
269
|
+
},
|
270
|
+
width: 140
|
271
|
+
},
|
179
272
|
{
|
180
273
|
type: 'resource-object',
|
181
274
|
name: 'updater',
|
@@ -226,6 +319,8 @@ export class DataKeySetListPage extends connect(store)(localize(i18next)(PageVie
|
|
226
319
|
name
|
227
320
|
description
|
228
321
|
active
|
322
|
+
reportType
|
323
|
+
reportView
|
229
324
|
dataKeyItems {
|
230
325
|
name
|
231
326
|
description
|
@@ -315,7 +410,7 @@ export class DataKeySetListPage extends connect(store)(localize(i18next)(PageVie
|
|
315
410
|
|
316
411
|
async exportHandler() {
|
317
412
|
const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records
|
318
|
-
const targetFieldSet = new Set(['id', 'name', 'description', 'active'])
|
413
|
+
const targetFieldSet = new Set(['id', 'name', 'description', 'active', 'reportType', 'reportView'])
|
319
414
|
|
320
415
|
return exportTargets.map(dataKeySet => {
|
321
416
|
let tempObj = {}
|
@@ -1,3 +1,7 @@
|
|
1
|
+
/**
|
2
|
+
* report page from 'data-set-list-page'
|
3
|
+
* datasetId is required
|
4
|
+
*/
|
1
5
|
import '@operato/data-grist'
|
2
6
|
import '@things-factory/form-ui'
|
3
7
|
|
@@ -6,7 +10,7 @@ import { css, html } from 'lit'
|
|
6
10
|
import { i18next, localize } from '@operato/i18n'
|
7
11
|
import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
|
8
12
|
import { PageView } from '@things-factory/shell'
|
9
|
-
import {
|
13
|
+
import { encodeUrlParams, getCookie } from '@things-factory/utils'
|
10
14
|
|
11
15
|
class DataReportEmbedPage extends localize(i18next)(PageView) {
|
12
16
|
static get properties() {
|
@@ -57,7 +61,7 @@ class DataReportEmbedPage extends localize(i18next)(PageView) {
|
|
57
61
|
}
|
58
62
|
]
|
59
63
|
return {
|
60
|
-
title: '
|
64
|
+
title: 'data-report-embed',
|
61
65
|
actions,
|
62
66
|
filters
|
63
67
|
}
|
@@ -68,7 +72,7 @@ class DataReportEmbedPage extends localize(i18next)(PageView) {
|
|
68
72
|
.filters=${this.context.filters}
|
69
73
|
@filters-change=${e => {
|
70
74
|
console.log('filters changed', e.detail)
|
71
|
-
this.
|
75
|
+
this.reportTemplate(e.detail.filters)
|
72
76
|
}}
|
73
77
|
?url-params-sensitive=${this.active}
|
74
78
|
></ox-filters-form-base>
|
@@ -82,12 +86,12 @@ class DataReportEmbedPage extends localize(i18next)(PageView) {
|
|
82
86
|
}
|
83
87
|
}
|
84
88
|
|
85
|
-
async
|
89
|
+
async reportTemplate(filters) {
|
86
90
|
// convert filters array to object
|
87
91
|
const params = filters.reduce((acc, curr) => ((acc[curr.name] = curr.value), acc), {})
|
88
92
|
Object.assign(params, this.lifecycle.params)
|
89
93
|
|
90
|
-
const { workDateRange, workShift, reportView } = params
|
94
|
+
const { id, workDateRange, workShift, reportType, reportView } = params
|
91
95
|
|
92
96
|
/** ignoring date conditions */
|
93
97
|
if (!workDateRange[0] || !workDateRange[1] || workDateRange[0] > workDateRange[1]) {
|
@@ -97,16 +101,16 @@ class DataReportEmbedPage extends localize(i18next)(PageView) {
|
|
97
101
|
/** urlencoded params including test values */
|
98
102
|
const urlParams = {
|
99
103
|
table: 'samples',
|
100
|
-
dataSetId:
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
104
|
+
dataSetId: id,
|
105
|
+
startDate: workDateRange[0],
|
106
|
+
endDate: workDateRange[1],
|
107
|
+
workShift,
|
108
|
+
reportView
|
105
109
|
}
|
106
110
|
|
107
|
-
const encodedUrlParams =
|
111
|
+
const encodedUrlParams = encodeUrlParams(urlParams)
|
108
112
|
|
109
|
-
this.shadowRoot.querySelector('#container').src =
|
113
|
+
this.shadowRoot.querySelector('#container').src = `/data-report/${reportType}/?${encodedUrlParams}`
|
110
114
|
}
|
111
115
|
}
|
112
116
|
|
@@ -13,6 +13,7 @@ import { openPopup } from '@operato/layout'
|
|
13
13
|
import { navigate, PageView, store } from '@operato/shell'
|
14
14
|
import { CommonGristStyles, ScrollbarStyles } from '@operato/styles'
|
15
15
|
import { provider } from '@things-factory/board-ui'
|
16
|
+
import { encodeUrlParams } from '@things-factory/utils'
|
16
17
|
|
17
18
|
const USECASE_OPTIONS = () => {
|
18
19
|
return ['', ...OxDataUseCase.getUseCaseNames()].map(name => {
|
@@ -72,7 +73,8 @@ const showMonitorView = (columns, data, column, record, rowIndex) => {
|
|
72
73
|
}
|
73
74
|
|
74
75
|
const showReportView = (columns, data, column, record, rowIndex) => {
|
75
|
-
const { id, name, reportType, reportView, reportTemplate } = record
|
76
|
+
const { id:datasetId, dataKeySet, name, reportType, reportView, reportTemplate } = record
|
77
|
+
const { id:dataKeySetId } = dataKeySet || { id: '' }
|
76
78
|
const title = `${name} - ${i18next.t('title.data-report-view')}`
|
77
79
|
|
78
80
|
switch (reportType) {
|
@@ -85,26 +87,23 @@ const showReportView = (columns, data, column, record, rowIndex) => {
|
|
85
87
|
break
|
86
88
|
|
87
89
|
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
90
|
break
|
100
91
|
|
101
92
|
case 'page':
|
102
|
-
navigate(reportView + `/${id}?template=${encodeURIComponent(reportTemplate)}`)
|
103
93
|
break
|
104
94
|
|
105
95
|
case 'external':
|
106
96
|
window.open(reportView, '_blank')
|
107
97
|
break
|
98
|
+
|
99
|
+
case 'jasper':
|
100
|
+
case 'shiny':
|
101
|
+
const encodedUrlParams = encodeUrlParams({ datasetId, dataKeySetId, reportType, reportView, reportTemplate })
|
102
|
+
navigate(`/data-report-samples/?${encodedUrlParams}`)
|
103
|
+
break
|
104
|
+
|
105
|
+
default:
|
106
|
+
break
|
108
107
|
}
|
109
108
|
}
|
110
109
|
|
@@ -366,6 +365,10 @@ export class DataReportListPage extends connect(store)(localize(i18next)(PageVie
|
|
366
365
|
responses: dataSetsForReport(filters: $filters, pagination: $pagination, sortings: $sortings) {
|
367
366
|
items {
|
368
367
|
id
|
368
|
+
dataKeySet {
|
369
|
+
id
|
370
|
+
name
|
371
|
+
}
|
369
372
|
name
|
370
373
|
description
|
371
374
|
partitionKeys
|
@@ -0,0 +1,186 @@
|
|
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 { connect } from 'pwa-helpers/connect-mixin'
|
10
|
+
|
11
|
+
import { client } from '@operato/graphql'
|
12
|
+
import { i18next, localize } from '@operato/i18n'
|
13
|
+
import { PageView, store } from '@operato/shell'
|
14
|
+
import { ScrollbarStyles } from '@operato/styles'
|
15
|
+
|
16
|
+
import { encodeUrlParams } from '@things-factory/utils'
|
17
|
+
|
18
|
+
export class DataReportSamplesPage extends connect(store)(localize(i18next)(PageView)) {
|
19
|
+
static get properties() {
|
20
|
+
return {
|
21
|
+
dataKeySetId: String,
|
22
|
+
dataKeySet: Object,
|
23
|
+
active: String
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
static get styles() {
|
28
|
+
return [
|
29
|
+
ScrollbarStyles,
|
30
|
+
css`
|
31
|
+
:host {
|
32
|
+
display: flex;
|
33
|
+
flex-direction: column;
|
34
|
+
padding: 0;
|
35
|
+
}
|
36
|
+
|
37
|
+
#container {
|
38
|
+
flex: 1;
|
39
|
+
padding: 0;
|
40
|
+
margin: 0;
|
41
|
+
border: 0;
|
42
|
+
}
|
43
|
+
`
|
44
|
+
]
|
45
|
+
}
|
46
|
+
|
47
|
+
get context() {
|
48
|
+
|
49
|
+
const today = new Date().toISOString().split('T')[0]
|
50
|
+
|
51
|
+
const filters = [
|
52
|
+
{
|
53
|
+
name: 'workDateRange',
|
54
|
+
type: 'date',
|
55
|
+
label: i18next.t('field.work-date'),
|
56
|
+
operator: 'between',
|
57
|
+
value: [today, today] // not working...
|
58
|
+
},
|
59
|
+
...this.getDataKeyFilters()
|
60
|
+
]
|
61
|
+
|
62
|
+
return {
|
63
|
+
title: i18next.t('title.data-report samples'),
|
64
|
+
help: 'dataset/data-report-samples',
|
65
|
+
filters
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
getDataKeyFilters() {
|
70
|
+
return (
|
71
|
+
this.dataKeySet?.dataKeyItems.map((item, index) => {
|
72
|
+
return {
|
73
|
+
type: 'string',
|
74
|
+
name: `key_0${index + 1}`,
|
75
|
+
label: i18next.t(item.tKey),
|
76
|
+
operator: 'i_like',
|
77
|
+
width: 120
|
78
|
+
}
|
79
|
+
}) || []
|
80
|
+
)
|
81
|
+
}
|
82
|
+
|
83
|
+
render() {
|
84
|
+
// clear if pre-loaded
|
85
|
+
const container = this.shadowRoot.querySelector('#container')
|
86
|
+
if (container) {
|
87
|
+
container.src = ""
|
88
|
+
// @TODO: Clear filters
|
89
|
+
/** */
|
90
|
+
}
|
91
|
+
|
92
|
+
return html`
|
93
|
+
<ox-filters-form-base
|
94
|
+
.filters=${this.context.filters}
|
95
|
+
@filters-change=${e => {
|
96
|
+
console.log('filters changed', e.detail)
|
97
|
+
this.renderTemplate(e.detail.filters)
|
98
|
+
}}
|
99
|
+
?url-params-sensitive=${this.active}
|
100
|
+
></ox-filters-form-base>
|
101
|
+
<iframe id="container"></iframe>
|
102
|
+
`
|
103
|
+
}
|
104
|
+
|
105
|
+
renderTemplate(filters) {
|
106
|
+
const params = filters.reduce((acc, curr) => ((acc[curr.name] = curr.value), acc), {})
|
107
|
+
Object.assign(params, this.lifecycle.params)
|
108
|
+
|
109
|
+
const filterNames = this.getDataKeyFilters().map(x => x.name)
|
110
|
+
const dataKeyFilters = filters.filter(x => filterNames.includes(x.name))
|
111
|
+
const { workDateRange } = params
|
112
|
+
|
113
|
+
/** ignoring date conditions */
|
114
|
+
if (!workDateRange[0] || !workDateRange[1] || workDateRange[0] > workDateRange[1]) {
|
115
|
+
return
|
116
|
+
}
|
117
|
+
|
118
|
+
/** urlencoded params including test values */
|
119
|
+
const urlParams = {
|
120
|
+
reportType: params.reportType,
|
121
|
+
reportView: params.reportView,
|
122
|
+
reportTemplate: params.reportTemplate,
|
123
|
+
table: 'samples',
|
124
|
+
datasetId: params.datasetId,
|
125
|
+
dataKeySetId: params.dataKeySetId,
|
126
|
+
startDate: workDateRange[0],
|
127
|
+
endDate: workDateRange[1],
|
128
|
+
dataKeySetItems: JSON.stringify(this.dataKeySet?.dataKeyItems || []),
|
129
|
+
dataKeyFilters: JSON.stringify(dataKeyFilters)
|
130
|
+
}
|
131
|
+
|
132
|
+
const encodedUrlParams = encodeUrlParams(urlParams)
|
133
|
+
|
134
|
+
const reportUrl = `/data-report/${urlParams.reportType}/`
|
135
|
+
this.shadowRoot.querySelector('#container').src = `${reportUrl}?${encodedUrlParams}`
|
136
|
+
}
|
137
|
+
|
138
|
+
pageUpdated(changes, lifecycle) {
|
139
|
+
if (this.active) {
|
140
|
+
const { dataKeySetId } = lifecycle.params
|
141
|
+
this.dataKeySetId = dataKeySetId
|
142
|
+
return
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
146
|
+
async fetchHandler({ page, limit, sortings = [], filters = [] }) {
|
147
|
+
|
148
|
+
}
|
149
|
+
|
150
|
+
async updated(changes) {
|
151
|
+
if (changes.has('dataKeySetId')) {
|
152
|
+
if (!this.dataKeySetId) {
|
153
|
+
this.dataKeySet = null
|
154
|
+
return
|
155
|
+
}
|
156
|
+
|
157
|
+
const response = await client.query({
|
158
|
+
query: gql`
|
159
|
+
query ($id: String!) {
|
160
|
+
dataKeySet(id: $id) {
|
161
|
+
id
|
162
|
+
name
|
163
|
+
description
|
164
|
+
reportType
|
165
|
+
reportView
|
166
|
+
dataKeyItems {
|
167
|
+
name
|
168
|
+
description
|
169
|
+
dataKey
|
170
|
+
tKey
|
171
|
+
}
|
172
|
+
}
|
173
|
+
}
|
174
|
+
`,
|
175
|
+
variables: {
|
176
|
+
id: this.dataKeySetId
|
177
|
+
}
|
178
|
+
})
|
179
|
+
|
180
|
+
this.dataKeySet = response.data.dataKeySet
|
181
|
+
}
|
182
|
+
}
|
183
|
+
|
184
|
+
}
|
185
|
+
|
186
|
+
window.customElements.define('data-report-samples-page', DataReportSamplesPage)
|
package/client/route.js
CHANGED
@@ -16,6 +16,10 @@ export default function route(page) {
|
|
16
16
|
import('./pages/data-sample/data-sample-search-page.js')
|
17
17
|
return page
|
18
18
|
|
19
|
+
case 'data-report-samples':
|
20
|
+
import('./pages/data-report/data-report-samples-page.js')
|
21
|
+
return page
|
22
|
+
|
19
23
|
case 'data-ooc-list':
|
20
24
|
import('./pages/data-ooc/data-ooc-list-page.js')
|
21
25
|
return page
|
@@ -28,21 +32,21 @@ export default function route(page) {
|
|
28
32
|
import('./pages/data-report/data-report-list-page.js')
|
29
33
|
return page
|
30
34
|
|
31
|
-
case 'jasper-report-samples':
|
32
|
-
|
33
|
-
|
35
|
+
// case 'jasper-report-samples':
|
36
|
+
// import('./pages/data-report/jasper-report-samples-page.js')
|
37
|
+
// return page
|
34
38
|
|
35
|
-
case 'jasper-report-samples-crosstab':
|
36
|
-
|
37
|
-
|
39
|
+
// case 'jasper-report-samples-crosstab':
|
40
|
+
// import('./pages/data-report/jasper-report-samples-crosstab-page.js')
|
41
|
+
// return page
|
38
42
|
|
39
|
-
case 'jasper-report-oocs':
|
40
|
-
|
41
|
-
|
43
|
+
// case 'jasper-report-oocs':
|
44
|
+
// import('./pages/data-report/jasper-report-oocs-page.js')
|
45
|
+
// return page
|
42
46
|
|
43
|
-
case 'data-report-embed':
|
44
|
-
|
45
|
-
|
47
|
+
// case 'data-report-embed':
|
48
|
+
// import('./pages/data-report/data-report-embed-page')
|
49
|
+
// return page
|
46
50
|
|
47
51
|
case 'data-key-set-list':
|
48
52
|
import('./pages/data-key-set/data-key-set-list-page.js')
|
@@ -1,13 +1,23 @@
|
|
1
1
|
module.exports = {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
2
|
+
dataReport: {
|
3
|
+
jasper: {
|
4
|
+
endpoint: {
|
5
|
+
host: 'localhost',
|
6
|
+
port: 8090
|
7
|
+
},
|
8
|
+
datasource: {
|
9
|
+
database: ''
|
10
|
+
},
|
11
|
+
method: 'POST'
|
12
|
+
},
|
13
|
+
shiny: {
|
14
|
+
endpoint: {
|
15
|
+
host: 'localhost',
|
16
|
+
port: 3838
|
17
|
+
},
|
18
|
+
datasource: {
|
19
|
+
database: ''
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
13
23
|
}
|
@@ -9,6 +9,8 @@ const data_ooc_1 = require("../service/data-ooc/data-ooc");
|
|
9
9
|
const data_sample_1 = require("../service/data-sample/data-sample");
|
10
10
|
const data_set_1 = require("../service/data-set/data-set");
|
11
11
|
const data_use_case_1 = require("./data-use-case");
|
12
|
+
// See README.md at ## Data Samples
|
13
|
+
process.env.TZ = 'UTC';
|
12
14
|
const fillDataKeys = (dataKeySet, data) => {
|
13
15
|
const keys = (dataKeySet === null || dataKeySet === void 0 ? void 0 : dataKeySet.dataKeyItems) || [];
|
14
16
|
return keys.reduce((sum, key, index) => {
|
@@ -68,7 +70,7 @@ async function createDataSample(dataSample, context) {
|
|
68
70
|
partitionKeys = replaceVariables(partitionKeys, dataSample.data);
|
69
71
|
const dataKeys = fillDataKeys(dataSet === null || dataSet === void 0 ? void 0 : dataSet.dataKeySet, dataSample.data);
|
70
72
|
const { ooc, oos, judgment } = data_use_case_1.DataUseCase.evaluate(dataSet, dataItems, dataSample.data) || {};
|
71
|
-
const result = await tx.getRepository(data_sample_1.DataSample).save(Object.assign(Object.assign(Object.assign({ name: dataSet.name, description: dataSet.description, useCase: dataSet.useCase }, dataSample), dataKeys), { dataSetVersion: dataSet.version, domain,
|
73
|
+
const result = await tx.getRepository(data_sample_1.DataSample).save(Object.assign(Object.assign(Object.assign({ name: dataSet.name, description: dataSet.description, useCase: dataSet.useCase, type: dataSet.type }, dataSample), dataKeys), { dataSetVersion: dataSet.version, domain,
|
72
74
|
partitionKeys,
|
73
75
|
ooc,
|
74
76
|
oos,
|