@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.
Files changed (102) hide show
  1. package/README.md +20 -0
  2. package/assets/data-report.jpg +0 -0
  3. package/assets/glue-table-indices.png +0 -0
  4. package/client/pages/data-key-set/data-key-set-importer.js +4 -6
  5. package/client/pages/data-key-set/data-key-set-list-page.js +97 -2
  6. package/client/pages/data-report/data-report-embed-page.js +16 -12
  7. package/client/pages/data-report/data-report-list-page.js +16 -13
  8. package/client/pages/data-report/data-report-samples-page.js +186 -0
  9. package/client/pages/data-set/data-set-importer.js +1 -1
  10. package/client/pages/data-set/data-set-list-page.js +8 -0
  11. package/client/route.js +16 -12
  12. package/config/config.development.js +10 -0
  13. package/config/config.production.js +21 -11
  14. package/dist-server/controllers/create-data-sample.js +3 -1
  15. package/dist-server/controllers/create-data-sample.js.map +1 -1
  16. package/dist-server/controllers/jasper-report.js +17 -12
  17. package/dist-server/controllers/jasper-report.js.map +1 -1
  18. package/dist-server/controllers/shiny-report.js +44 -0
  19. package/dist-server/controllers/shiny-report.js.map +1 -0
  20. package/dist-server/routes.js +8 -0
  21. package/dist-server/routes.js.map +1 -1
  22. package/dist-server/service/data-key-set/data-key-set-mutation.js +4 -4
  23. package/dist-server/service/data-key-set/data-key-set-mutation.js.map +1 -1
  24. package/dist-server/service/data-key-set/data-key-set-query.js +9 -11
  25. package/dist-server/service/data-key-set/data-key-set-query.js.map +1 -1
  26. package/dist-server/service/data-key-set/data-key-set-type.js +17 -0
  27. package/dist-server/service/data-key-set/data-key-set-type.js.map +1 -1
  28. package/dist-server/service/data-key-set/data-key-set.js +14 -4
  29. package/dist-server/service/data-key-set/data-key-set.js.map +1 -1
  30. package/dist-server/service/data-ooc/data-ooc-mutation.js +1 -1
  31. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -1
  32. package/dist-server/service/data-ooc/data-ooc-query.js +9 -11
  33. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
  34. package/dist-server/service/data-ooc/data-ooc-subscription.js +1 -2
  35. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -1
  36. package/dist-server/service/data-ooc/data-ooc-type.js +2 -3
  37. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -1
  38. package/dist-server/service/data-ooc/data-ooc.js +4 -5
  39. package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
  40. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  41. package/dist-server/service/data-sample/data-sample-query.js +12 -14
  42. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  43. package/dist-server/service/data-sample/data-sample-type.js +1 -2
  44. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  45. package/dist-server/service/data-sample/data-sample.js +3 -4
  46. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  47. package/dist-server/service/data-sensor/data-sensor-mutation.js +4 -4
  48. package/dist-server/service/data-sensor/data-sensor-mutation.js.map +1 -1
  49. package/dist-server/service/data-sensor/data-sensor-query.js +9 -11
  50. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  51. package/dist-server/service/data-sensor/data-sensor-type.js +4 -5
  52. package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -1
  53. package/dist-server/service/data-sensor/data-sensor.js +4 -5
  54. package/dist-server/service/data-sensor/data-sensor.js.map +1 -1
  55. package/dist-server/service/data-set/data-set-mutation.js +5 -4
  56. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  57. package/dist-server/service/data-set/data-set-query.js +24 -26
  58. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  59. package/dist-server/service/data-set/data-set-type.js +6 -7
  60. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  61. package/dist-server/service/data-set/data-set.js +7 -6
  62. package/dist-server/service/data-set/data-set.js.map +1 -1
  63. package/dist-server/service/data-set-history/data-set-history-query.js +14 -16
  64. package/dist-server/service/data-set-history/data-set-history-query.js.map +1 -1
  65. package/dist-server/service/data-set-history/data-set-history.js +5 -6
  66. package/dist-server/service/data-set-history/data-set-history.js.map +1 -1
  67. package/dist-server/tsconfig.tsbuildinfo +1 -1
  68. package/package.json +9 -9
  69. package/server/controllers/create-data-sample.ts +4 -0
  70. package/server/controllers/jasper-report.ts +17 -12
  71. package/server/controllers/shiny-report.ts +63 -0
  72. package/server/routes.ts +10 -0
  73. package/server/service/data-key-set/data-key-set-mutation.ts +16 -13
  74. package/server/service/data-key-set/data-key-set-query.ts +8 -9
  75. package/server/service/data-key-set/data-key-set-type.ts +13 -0
  76. package/server/service/data-key-set/data-key-set.ts +9 -0
  77. package/server/service/data-ooc/data-ooc-mutation.ts +12 -8
  78. package/server/service/data-ooc/data-ooc-query.ts +8 -9
  79. package/server/service/data-ooc/data-ooc-subscription.ts +1 -2
  80. package/server/service/data-sample/data-sample-mutation.ts +4 -1
  81. package/server/service/data-sample/data-sample-query.ts +10 -11
  82. package/server/service/data-sensor/data-sensor-mutation.ts +15 -9
  83. package/server/service/data-sensor/data-sensor-query.ts +9 -10
  84. package/server/service/data-set/data-set-mutation.ts +16 -11
  85. package/server/service/data-set/data-set-query.ts +18 -19
  86. package/server/service/data-set/data-set.ts +3 -1
  87. package/server/service/data-set-history/data-set-history-query.ts +13 -14
  88. package/things-factory.config.js +19 -15
  89. package/translations/en.json +1 -0
  90. package/translations/ko.json +1 -0
  91. package/translations/ms.json +1 -0
  92. package/translations/zh.json +1 -0
  93. package/dist-server/service/data-item/data-item-mutation.js +0 -69
  94. package/dist-server/service/data-item/data-item-mutation.js.map +0 -1
  95. package/dist-server/service/data-item/data-item-query.js +0 -100
  96. package/dist-server/service/data-item/data-item-query.js.map +0 -1
  97. package/dist-server/service/data-item/data-item-type.js +0 -80
  98. package/dist-server/service/data-item/data-item-type.js.map +0 -1
  99. package/dist-server/service/data-item/data-item.js +0 -136
  100. package/dist-server/service/data-item/data-item.js.map +0 -1
  101. package/dist-server/service/data-item/index.js +0 -9
  102. 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
  ![Architecture for data-samples](./assets/data-samples.jpg)
4
+ ## data-report process
5
+ ![data-report process](./assets/data-report.jpg)
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
+ ![partitions and indices](./assets/glue-table-indices.png)
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
- records: this.dataKeySets
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.error?.length) return
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: 'newspaper',
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 { encodeFormParams, getCookie } from '@things-factory/utils'
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: 'jasper-report',
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._reportTemplate(e.detail.filters)
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 _reportTemplate(filters) {
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: this.lifecycle.resourceId,
101
- fromWorkDate: workDateRange[0],
102
- toWorkDate: workDateRange[1],
103
- token: getCookie('access_token'),
104
- workShift
104
+ dataSetId: id,
105
+ startDate: workDateRange[0],
106
+ endDate: workDateRange[1],
107
+ workShift,
108
+ reportView
105
109
  }
106
110
 
107
- const encodedUrlParams = encodeFormParams(urlParams)
111
+ const encodedUrlParams = encodeUrlParams(urlParams)
108
112
 
109
- this.shadowRoot.querySelector('#container').src = `${reportView}?params=${encodedUrlParams}`
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)
@@ -94,7 +94,7 @@ export class DataSetImporter extends LitElement {
94
94
  variables: { dataSets: this.dataSets }
95
95
  })
96
96
 
97
- if (response.error?.length) return
97
+ if (response.errors?.length) return
98
98
 
99
99
  this.dispatchEvent(new CustomEvent('imported'))
100
100
  }
@@ -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
 
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
- import('./pages/data-report/jasper-report-samples-page.js')
33
- return page
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
- import('./pages/data-report/jasper-report-samples-crosstab-page.js')
37
- return page
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
- import('./pages/data-report/jasper-report-oocs-page.js')
41
- return page
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
- import('./pages/data-report/data-report-embed-page')
45
- return page
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')
@@ -5,6 +5,16 @@ module.exports = {
5
5
  host: 'localhost',
6
6
  port: 8090
7
7
  },
8
+ datasource: {
9
+ database: ''
10
+ },
11
+ method: 'POST'
12
+ },
13
+ shiny: {
14
+ endpoint: {
15
+ host: 'localhost',
16
+ port: 3838
17
+ },
8
18
  datasource: {
9
19
  database: ''
10
20
  }
@@ -1,13 +1,23 @@
1
1
  module.exports = {
2
- dataReport: {
3
- jasper: {
4
- endpoint: {
5
- host: 'localhost',
6
- port: 8090
7
- },
8
- datasource: {
9
- database: ''
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,