@things-factory/dataset 5.0.14 → 5.0.16
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 +40 -16
- package/assets/data-report.jpg +0 -0
- package/assets/diagram.jpg +0 -0
- package/assets/glue-table-indices.png +0 -0
- package/client/pages/data-archive/data-archive-list-page.js +290 -0
- package/client/pages/data-archive/data-archive-request-popup.js +180 -0
- package/client/pages/data-key-set/data-key-set-list-page.js +98 -3
- package/client/pages/data-report/data-report-embed-page.js +16 -12
- package/client/pages/data-report/data-report-list-page.js +18 -15
- package/client/pages/data-report/data-report-samples-page.js +186 -0
- package/client/pages/data-set/data-set-list-page.js +9 -1
- package/client/route.js +20 -12
- package/config/config.development.js +21 -0
- package/config/config.production.js +32 -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 +19 -14
- package/dist-server/controllers/jasper-report.js.map +1 -1
- package/dist-server/controllers/shiny-report.js +41 -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-archive/data-archive-mutation.js +227 -0
- package/dist-server/service/data-archive/data-archive-mutation.js.map +1 -0
- package/dist-server/service/data-archive/data-archive-query.js +85 -0
- package/dist-server/service/data-archive/data-archive-query.js.map +1 -0
- package/dist-server/service/data-archive/data-archive-type.js +74 -0
- package/dist-server/service/data-archive/data-archive-type.js.map +1 -0
- package/dist-server/service/data-archive/data-archive.js +80 -0
- package/dist-server/service/data-archive/data-archive.js.map +1 -0
- package/dist-server/service/data-archive/index.js +9 -0
- package/dist-server/service/data-archive/index.js.map +1 -0
- package/dist-server/service/data-key-set/data-key-item-type.js.map +1 -1
- 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.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 +11 -0
- package/dist-server/service/data-key-set/data-key-set.js.map +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.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -1
- 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.map +1 -1
- package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
- package/dist-server/service/data-sample/data-sample.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-mutation.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor.js.map +1 -1
- package/dist-server/service/data-set/data-item-type.js.map +1 -1
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-type.js.map +1 -1
- package/dist-server/service/data-set/data-set.js +2 -0
- package/dist-server/service/data-set/data-set.js.map +1 -1
- 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-type.js.map +1 -1
- package/dist-server/service/data-set-history/data-set-history.js.map +1 -1
- package/dist-server/service/data-set-history/event-subscriber.js.map +1 -1
- package/dist-server/service/data-spec/data-spec-query.js.map +1 -1
- package/dist-server/service/data-spec/data-spec.js.map +1 -1
- package/dist-server/service/index.js +5 -2
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/config-resolver.js +33 -0
- package/dist-server/utils/config-resolver.js.map +1 -0
- package/dist-server/utils/index.js +5 -0
- package/dist-server/utils/index.js.map +1 -0
- package/helps/dataset/data-archive.md +9 -0
- package/helps/dataset/data-entry-list.md +2 -0
- package/helps/dataset/data-key-set.md +10 -0
- package/helps/dataset/data-ooc.md +11 -0
- package/helps/dataset/data-report-list.md +4 -0
- package/helps/dataset/data-sample-search.md +2 -0
- package/helps/dataset/data-sample.md +11 -0
- package/helps/dataset/data-sensor.md +13 -0
- package/helps/dataset/data-set.md +28 -0
- package/helps/dataset/ui/data-item-list.md +19 -0
- package/helps/dataset/ui/data-key-item-list.md +2 -0
- package/package.json +7 -7
- package/server/controllers/create-data-sample.ts +4 -0
- package/server/controllers/jasper-report.ts +20 -14
- package/server/controllers/shiny-report.ts +60 -0
- package/server/routes.ts +11 -0
- package/server/service/data-archive/data-archive-mutation.ts +253 -0
- package/server/service/data-archive/data-archive-query.ts +56 -0
- package/server/service/data-archive/data-archive-type.ts +49 -0
- package/server/service/data-archive/data-archive.ts +69 -0
- package/server/service/data-archive/index.ts +6 -0
- 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-set/data-set.ts +3 -1
- package/server/service/index.ts +5 -2
- package/server/utils/config-resolver.ts +29 -0
- package/server/utils/index.ts +1 -0
- package/things-factory.config.js +20 -12
- package/translations/en.json +18 -2
- package/translations/ko.json +16 -1
- package/translations/ms.json +2 -0
- package/translations/zh.json +2 -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
@@ -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
|
|
@@ -138,8 +137,8 @@ export class DataReportListPage extends connect(store)(localize(i18next)(PageVie
|
|
138
137
|
|
139
138
|
get context() {
|
140
139
|
return {
|
141
|
-
title: i18next.t('title.data-
|
142
|
-
help: 'dataset/data-
|
140
|
+
title: i18next.t('title.data-report list'),
|
141
|
+
help: 'dataset/data-report-list'
|
143
142
|
}
|
144
143
|
}
|
145
144
|
|
@@ -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)
|
@@ -86,6 +86,14 @@ const REPORT_TYPES = [
|
|
86
86
|
{
|
87
87
|
display: 'External URL',
|
88
88
|
value: 'external'
|
89
|
+
},
|
90
|
+
{
|
91
|
+
display: 'Jasper',
|
92
|
+
value: 'jasper'
|
93
|
+
},
|
94
|
+
{
|
95
|
+
display: 'Shiny',
|
96
|
+
value: 'shiny'
|
89
97
|
}
|
90
98
|
]
|
91
99
|
|
@@ -217,7 +225,7 @@ export class DataSetListPage extends connect(store)(localize(i18next)(PageView))
|
|
217
225
|
if (!record.id) return
|
218
226
|
const popup = openPopup(html` <data-item-list .dataSet=${record}></data-item-list> `, {
|
219
227
|
backdrop: true,
|
220
|
-
help: '
|
228
|
+
help: 'dataset/ui/data-item-list',
|
221
229
|
size: 'large',
|
222
230
|
title: i18next.t('title.data-item list')
|
223
231
|
})
|
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
|
@@ -27,22 +31,26 @@ export default function route(page) {
|
|
27
31
|
case 'data-report-list':
|
28
32
|
import('./pages/data-report/data-report-list-page.js')
|
29
33
|
return page
|
30
|
-
|
31
|
-
case '
|
32
|
-
import('./pages/data-
|
34
|
+
|
35
|
+
case 'data-archive-list':
|
36
|
+
import('./pages/data-archive/data-archive-list-page.js')
|
33
37
|
return page
|
34
38
|
|
35
|
-
case 'jasper-report-samples
|
36
|
-
|
37
|
-
|
39
|
+
// case 'jasper-report-samples':
|
40
|
+
// import('./pages/data-report/jasper-report-samples-page.js')
|
41
|
+
// return page
|
38
42
|
|
39
|
-
case 'jasper-report-
|
40
|
-
|
41
|
-
|
43
|
+
// case 'jasper-report-samples-crosstab':
|
44
|
+
// import('./pages/data-report/jasper-report-samples-crosstab-page.js')
|
45
|
+
// return page
|
42
46
|
|
43
|
-
case '
|
44
|
-
|
45
|
-
|
47
|
+
// case 'jasper-report-oocs':
|
48
|
+
// import('./pages/data-report/jasper-report-oocs-page.js')
|
49
|
+
// return page
|
50
|
+
|
51
|
+
// case 'data-report-embed':
|
52
|
+
// import('./pages/data-report/data-report-embed-page')
|
53
|
+
// return page
|
46
54
|
|
47
55
|
case 'data-key-set-list':
|
48
56
|
import('./pages/data-key-set/data-key-set-list-page.js')
|
@@ -1,10 +1,31 @@
|
|
1
1
|
module.exports = {
|
2
|
+
dataArchive: {
|
3
|
+
dataset: {
|
4
|
+
endpoint: {
|
5
|
+
host: 'localhost',
|
6
|
+
port: 80
|
7
|
+
},
|
8
|
+
datasource: {
|
9
|
+
database: ''
|
10
|
+
}
|
11
|
+
}
|
12
|
+
},
|
2
13
|
dataReport: {
|
3
14
|
jasper: {
|
4
15
|
endpoint: {
|
5
16
|
host: 'localhost',
|
6
17
|
port: 8090
|
7
18
|
},
|
19
|
+
datasource: {
|
20
|
+
database: ''
|
21
|
+
},
|
22
|
+
method: 'POST'
|
23
|
+
},
|
24
|
+
shiny: {
|
25
|
+
endpoint: {
|
26
|
+
host: 'localhost',
|
27
|
+
port: 3838
|
28
|
+
},
|
8
29
|
datasource: {
|
9
30
|
database: ''
|
10
31
|
}
|
@@ -1,13 +1,34 @@
|
|
1
1
|
module.exports = {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
2
|
+
dataArchive: {
|
3
|
+
dataset: {
|
4
|
+
endpoint: {
|
5
|
+
host: 'localhost',
|
6
|
+
port: 80
|
7
|
+
},
|
8
|
+
datasource: {
|
9
|
+
database: ''
|
10
|
+
}
|
11
|
+
}
|
12
|
+
},
|
13
|
+
dataReport: {
|
14
|
+
jasper: {
|
15
|
+
endpoint: {
|
16
|
+
host: 'localhost',
|
17
|
+
port: 8090
|
18
|
+
},
|
19
|
+
datasource: {
|
20
|
+
database: ''
|
21
|
+
},
|
22
|
+
method: 'POST'
|
23
|
+
},
|
24
|
+
shiny: {
|
25
|
+
endpoint: {
|
26
|
+
host: 'localhost',
|
27
|
+
port: 3838
|
28
|
+
},
|
29
|
+
datasource: {
|
30
|
+
database: ''
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
13
34
|
}
|
@@ -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,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"create-data-sample.js","sourceRoot":"","sources":["../../server/controllers/create-data-sample.ts"],"names":[],"mappings":"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
|
1
|
+
{"version":3,"file":"create-data-sample.js","sourceRoot":"","sources":["../../server/controllers/create-data-sample.ts"],"names":[],"mappings":"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","sourcesContent":["import moment from 'moment-timezone'\nimport { EntityManager } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain, getRedirectSubdomainPath, pubsub } from '@things-factory/shell'\nimport { getWorkDateAndShift } from '@things-factory/work-shift'\n\nimport { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'\nimport { DataSample } from '../service/data-sample/data-sample'\nimport { NewDataSample } from '../service/data-sample/data-sample-type'\nimport { DataSet } from '../service/data-set/data-set'\nimport { DataUseCase } from './data-use-case'\n\n// See README.md at ## Data Samples\nprocess.env.TZ = 'UTC'\n\nconst fillDataKeys = (dataKeySet, data) => {\n const keys = dataKeySet?.dataKeyItems || []\n return keys.reduce((sum, key, index) => {\n const value = data[key.dataKey]\n if (value != null) {\n sum[`key0${index + 1}`] = value instanceof Array ? value[0] : value\n }\n return sum\n }, {})\n}\n\n// parse variable javascript string pattern\nconst replaceVariables = (keys, dic) => {\n for (const k in keys) {\n const matches = keys[k].match(/\\$\\{\\w*\\}/g)\n matches &&\n matches.forEach(m => {\n keys[k] = keys[k].replace(m, dic[m.slice(2, -1)])\n })\n }\n return keys\n}\n\n// It is required UTC date for Partitioning File System like AWS S3 from Athena.\n// ex) %YYYY, %MM, %DD\nconst formatDate = (keys, _moment) => {\n for (const k in keys) {\n const matches = keys[k].match(/%\\w*/g)\n matches &&\n matches.forEach(m => {\n keys[k] = keys[k].replace(m, _moment.format(m.substr(1)))\n })\n }\n return keys\n}\n\nexport async function createDataSample(\n dataSample: NewDataSample,\n context: { state: { domain: Domain; user: User; tx: EntityManager } }\n): Promise<DataSample> {\n const { domain, user, tx } = context.state\n\n const dataSet = await tx.getRepository(DataSet).findOne({\n where: { id: dataSample.dataSet.id },\n relations: ['dataKeySet']\n })\n\n const dataItems = dataSet.dataItems\n const collectedAt = dataSample.collectedAt || new Date()\n\n const timezone = dataSet.timezone || domain.timezone || 'UTC'\n const format = 'YYYY-MM-DD'\n\n // workDate ex) 2022-04-04\n const { workDate, workShift } = await getWorkDateAndShift(domain, collectedAt, { timezone, format })\n\n // local time dataSet timezone or domain timezone or default 'UTC'\n\n const localDateTz = moment(collectedAt).tz(timezone)\n const defaultPartitionKeys = {\n domain: domain.subdomain,\n datasetid: dataSample.dataSet.id /* It should not be 'data_set_id' as column name duplicated for Glue */,\n date: localDateTz.format(format) /* local time date */,\n workdate: workDate /* working date */,\n workshift: workShift\n }\n\n var partitionKeys = {\n ...defaultPartitionKeys,\n ...dataSet.partitionKeys\n }\n\n partitionKeys = formatDate(partitionKeys, localDateTz)\n partitionKeys = replaceVariables(partitionKeys, dataSample.data)\n\n const dataKeys = fillDataKeys(dataSet?.dataKeySet, dataSample.data)\n\n const { ooc, oos, judgment } = DataUseCase.evaluate(dataSet, dataItems, dataSample.data) || {}\n const result = await tx.getRepository(DataSample).save({\n name: dataSet.name,\n description: dataSet.description,\n useCase: dataSet.useCase,\n type: dataSet.type,\n ...dataSample,\n ...dataKeys,\n dataSetVersion: dataSet.version,\n domain,\n partitionKeys,\n ooc,\n oos,\n judgment,\n collectedAt,\n workDate,\n workShift,\n creator: user,\n updater: user\n })\n\n if (ooc || oos) {\n const dataOoc = await tx.getRepository(DataOoc).save({\n ...result,\n history: [\n {\n user: {\n id: user.id,\n name: user.name\n },\n state: DataOocStatus.CREATED,\n timestamp: Date.now()\n }\n ],\n state: DataOocStatus.CREATED\n })\n\n pubsub.publish('data-ooc', {\n dataOoc,\n supervisoryRoleId: dataSet.supervisoryRoleId\n })\n\n pubsub.publish('notification', {\n notification: {\n domain,\n type: 'error',\n title: `Data OOC occurred on '${dataSet.name}'`,\n body: `Data OOC occurred on '${dataSet.name}'`,\n url: getRedirectSubdomainPath(context, domain.subdomain, `/data-ooc/${dataOoc.id}`),\n timestamp: collectedAt\n }\n })\n }\n\n return result\n}\n"]}
|
@@ -4,11 +4,12 @@ exports.renderJasperReport = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
5
5
|
const form_data_1 = tslib_1.__importDefault(require("form-data"));
|
6
6
|
const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
|
7
|
+
const config_resolver_1 = require("../utils/config-resolver");
|
7
8
|
const attachment_base_1 = require("@things-factory/attachment-base");
|
8
9
|
const aws_base_1 = require("@things-factory/aws-base");
|
9
10
|
const env_1 = require("@things-factory/env");
|
10
11
|
const dataReportConfig = env_1.config.get('dataReport');
|
11
|
-
const { jasper: { endpoint:
|
12
|
+
const { jasper: { endpoint: ENDPOINT, datasource: { database: DATABASE } } } = dataReportConfig || {
|
12
13
|
jasper: {
|
13
14
|
endpoint: {},
|
14
15
|
datasource: {}
|
@@ -96,20 +97,23 @@ function parseJsonDataField(rows) {
|
|
96
97
|
}
|
97
98
|
const athenaClient = new aws_base_1.AthenaController();
|
98
99
|
async function queryAthena(params) {
|
99
|
-
const { table, domain,
|
100
|
+
const { table, domain, datasetId, startDate, endDate, workShift, timezone } = params;
|
100
101
|
const queryData = {
|
101
|
-
sql: `SELECT name, description, data, spec, workdate, workshift,
|
102
|
+
sql: `SELECT ds.name, ds.description, ds.data, dsh.data_items as spec, ds.workdate, ds.workshift,
|
102
103
|
DATE_FORMAT(
|
103
104
|
FROM_UNIXTIME(collected_at / 1000 / 1000) AT TIME ZONE '${timezone || 'UTC'}',
|
104
105
|
'%Y-%m-%d %H:%i:%s'
|
105
|
-
) AS
|
106
|
-
FROM ${table}
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
106
|
+
) AS dscollected_at
|
107
|
+
FROM ${table} ds
|
108
|
+
JOIN data_set_histories dsh
|
109
|
+
ON (ds.datasetid = dsh.original_id
|
110
|
+
and ds.data_set_version = dsh.version)
|
111
|
+
WHERE ds.domain='${domain}'
|
112
|
+
AND ds.datasetid = '${datasetId}'
|
113
|
+
AND ds.workdate >= '${startDate}'
|
114
|
+
AND ds.workdate <= '${endDate}'
|
115
|
+
${workShift ? "AND ds.workshift = '" + workShift + "'" : ''}
|
116
|
+
ORDER BY ds.collected_at`,
|
113
117
|
db: DATABASE
|
114
118
|
};
|
115
119
|
// and json_extract_scalar(data, '$.dauid') = 'A8032AD81730'
|
@@ -117,7 +121,7 @@ async function queryAthena(params) {
|
|
117
121
|
}
|
118
122
|
async function renderJasperReport(context) {
|
119
123
|
const { state: { domain }, query } = context;
|
120
|
-
const template = await attachment_base_1.STORAGE.readFile(query['
|
124
|
+
const template = await attachment_base_1.STORAGE.readFile(query['reportTemplate'] || 'dynamic_header_sample.jrxml', 'utf-8');
|
121
125
|
let templateType = query['templateType'] || 'crosstab';
|
122
126
|
let parsedData = [];
|
123
127
|
// @todo: get dataset timezone
|
@@ -147,8 +151,9 @@ async function renderJasperReport(context) {
|
|
147
151
|
formData.append('template', template);
|
148
152
|
formData.append('jsonString', JSON.stringify(parsedData));
|
149
153
|
formData.append('parameters', JSON.stringify(parameters));
|
150
|
-
const
|
151
|
-
const
|
154
|
+
const { reportView } = query;
|
155
|
+
const url = (0, config_resolver_1.getEndpointUrl)(ENDPOINT, reportView);
|
156
|
+
const response = await (0, node_fetch_1.default)(url, {
|
152
157
|
method: 'POST',
|
153
158
|
body: formData
|
154
159
|
});
|