@things-factory/dataset 5.0.0-alpha.5 → 5.0.0-alpha.52
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 +9 -0
- package/assets/data-samples.jpg +0 -0
- package/client/bootstrap.js +21 -1
- package/client/pages/{data-entry-form.js → data-entry/data-entry-form.js} +15 -2
- package/client/pages/data-entry/data-entry-list-page.js +423 -0
- package/client/pages/data-ooc/data-ooc-list-page.js +483 -0
- package/client/pages/data-ooc/data-ooc-view.js +183 -0
- package/client/pages/data-report/data-report-embed-page.js +113 -0
- package/client/pages/data-report/data-report-list-page.js +465 -0
- package/client/pages/data-report/jasper-report-oocs-page.js +122 -0
- package/client/pages/data-report/jasper-report-samples-crosstab-page.js +122 -0
- package/client/pages/data-report/jasper-report-samples-page.js +122 -0
- package/client/pages/data-sample/data-sample-list-page.js +386 -0
- package/client/pages/data-sample/data-sample-view.js +98 -0
- package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +43 -64
- package/client/pages/{data-item-list.js → data-set/data-item-list.js} +35 -10
- package/client/pages/{data-set-importer.js → data-set/data-set-importer.js} +0 -0
- package/client/pages/data-set/data-set-list-page.js +746 -0
- package/client/route.js +34 -6
- package/config/config.development.js +13 -0
- package/config/config.production.js +1 -0
- package/dist-server/controllers/create-data-sample.js +133 -0
- package/dist-server/controllers/create-data-sample.js.map +1 -0
- package/dist-server/controllers/data-use-case.js +57 -0
- package/dist-server/controllers/data-use-case.js.map +1 -0
- package/dist-server/controllers/index.js +18 -0
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/controllers/jasper-report.js +156 -0
- package/dist-server/controllers/jasper-report.js.map +1 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/routes.js +13 -24
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/data-item/data-item-mutation.js +5 -1
- package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
- package/dist-server/service/data-item/data-item-query.js +7 -2
- package/dist-server/service/data-item/data-item-query.js.map +1 -1
- package/dist-server/service/data-item/data-item-type.js +15 -7
- package/dist-server/service/data-item/data-item-type.js.map +1 -1
- package/dist-server/service/data-item/data-item.js +17 -3
- package/dist-server/service/data-item/data-item.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
- package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc-query.js +121 -0
- package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
- package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
- package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc.js +237 -0
- package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
- package/dist-server/service/data-ooc/index.js +10 -0
- package/dist-server/service/data-ooc/index.js.map +1 -0
- package/dist-server/service/data-sample/data-sample-mutation.js +2 -138
- package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-query.js +8 -2
- package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-type.js +12 -42
- package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
- package/dist-server/service/data-sample/data-sample.js +34 -3
- package/dist-server/service/data-sample/data-sample.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-query.js +8 -2
- package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-mutation.js +40 -14
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +188 -3
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-type.js +84 -3
- package/dist-server/service/data-set/data-set-type.js.map +1 -1
- package/dist-server/service/data-set/data-set.js +110 -15
- package/dist-server/service/data-set/data-set.js.map +1 -1
- package/dist-server/service/index.js +6 -2
- package/dist-server/service/index.js.map +1 -1
- package/package.json +19 -13
- package/server/controllers/create-data-sample.ts +177 -0
- package/server/controllers/data-use-case.ts +85 -0
- package/server/controllers/index.ts +2 -0
- package/server/controllers/jasper-report.ts +170 -0
- package/server/index.ts +1 -0
- package/server/routes.ts +21 -31
- package/server/service/data-item/data-item-mutation.ts +6 -1
- package/server/service/data-item/data-item-query.ts +9 -3
- package/server/service/data-item/data-item-type.ts +10 -6
- package/server/service/data-item/data-item.ts +15 -4
- package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
- package/server/service/data-ooc/data-ooc-query.ts +70 -0
- package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
- package/server/service/data-ooc/data-ooc-type.ts +68 -0
- package/server/service/data-ooc/data-ooc.ts +204 -0
- package/server/service/data-ooc/index.ts +7 -0
- package/server/service/data-sample/data-sample-mutation.ts +3 -172
- package/server/service/data-sample/data-sample-query.ts +10 -3
- package/server/service/data-sample/data-sample-type.ts +7 -28
- package/server/service/data-sample/data-sample.ts +33 -3
- package/server/service/data-sensor/data-sensor-query.ts +10 -3
- package/server/service/data-set/data-set-mutation.ts +53 -14
- package/server/service/data-set/data-set-query.ts +159 -4
- package/server/service/data-set/data-set-type.ts +65 -4
- package/server/service/data-set/data-set.ts +100 -12
- package/server/service/index.ts +6 -2
- package/things-factory.config.js +35 -7
- package/translations/en.json +46 -3
- package/translations/ko.json +45 -3
- package/translations/ms.json +44 -3
- package/translations/zh.json +44 -3
- package/client/pages/data-sample.js +0 -316
- package/client/pages/data-set.js +0 -457
@@ -0,0 +1,98 @@
|
|
1
|
+
import '@operato/dataset/ox-data-sample-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 DataSampleView extends localize(i18next)(LitElement) {
|
11
|
+
static get properties() {
|
12
|
+
return {
|
13
|
+
dataSet: Object,
|
14
|
+
dataSample: Object
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
static get styles() {
|
19
|
+
return [
|
20
|
+
ScrollbarStyles,
|
21
|
+
css`
|
22
|
+
:host {
|
23
|
+
display: flex;
|
24
|
+
flex-direction: column;
|
25
|
+
|
26
|
+
background-color: #fff;
|
27
|
+
}
|
28
|
+
|
29
|
+
div[content] {
|
30
|
+
flex: 1;
|
31
|
+
|
32
|
+
display: flex;
|
33
|
+
overflow: auto;
|
34
|
+
}
|
35
|
+
|
36
|
+
ox-data-sample-view {
|
37
|
+
flex: 1;
|
38
|
+
padding: var(--padding-wide);
|
39
|
+
overflow: auto;
|
40
|
+
}
|
41
|
+
`
|
42
|
+
]
|
43
|
+
}
|
44
|
+
|
45
|
+
get sampleView() {
|
46
|
+
return this.renderRoot.querySelector('ox-data-sample-view')
|
47
|
+
}
|
48
|
+
|
49
|
+
render() {
|
50
|
+
return html`
|
51
|
+
<div content>
|
52
|
+
<ox-data-sample-view .dataSet=${this.dataSet} .dataSample=${this.dataSample}></ox-data-sample-view>
|
53
|
+
</div>
|
54
|
+
`
|
55
|
+
}
|
56
|
+
|
57
|
+
updated(changes) {
|
58
|
+
if (changes.has('dataSample')) {
|
59
|
+
this.fetchDataSet()
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
async fetchDataSet() {
|
64
|
+
const id = this.dataSample?.dataSet?.id
|
65
|
+
|
66
|
+
if (id) {
|
67
|
+
const response = await client.query({
|
68
|
+
query: gql`
|
69
|
+
query ($id: String!) {
|
70
|
+
dataSet(id: $id) {
|
71
|
+
id
|
72
|
+
name
|
73
|
+
description
|
74
|
+
useCase
|
75
|
+
dataItems {
|
76
|
+
id
|
77
|
+
name
|
78
|
+
description
|
79
|
+
active
|
80
|
+
unit
|
81
|
+
tag
|
82
|
+
type
|
83
|
+
spec
|
84
|
+
}
|
85
|
+
}
|
86
|
+
}
|
87
|
+
`,
|
88
|
+
variables: {
|
89
|
+
id: this.dataSample.dataSet.id
|
90
|
+
}
|
91
|
+
})
|
92
|
+
|
93
|
+
this.dataSet = response.data.dataSet
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
window.customElements.define('data-sample-view', DataSampleView)
|
@@ -8,20 +8,22 @@ import { client } from '@operato/graphql'
|
|
8
8
|
import { i18next, localize } from '@operato/i18n'
|
9
9
|
import { notify } from '@operato/layout'
|
10
10
|
import { PageView, store } from '@operato/shell'
|
11
|
-
import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
|
11
|
+
import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'
|
12
12
|
import { isMobileDevice } from '@operato/utils'
|
13
13
|
|
14
|
-
export class
|
14
|
+
export class DataSensorListPage extends connect(store)(localize(i18next)(PageView)) {
|
15
15
|
static get properties() {
|
16
16
|
return {
|
17
17
|
active: String,
|
18
|
-
gristConfig: Object
|
18
|
+
gristConfig: Object,
|
19
|
+
mode: String
|
19
20
|
}
|
20
21
|
}
|
21
22
|
|
22
23
|
static get styles() {
|
23
24
|
return [
|
24
25
|
ScrollbarStyles,
|
26
|
+
CommonGristStyles,
|
25
27
|
css`
|
26
28
|
:host {
|
27
29
|
display: flex;
|
@@ -34,18 +36,6 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
34
36
|
overflow-y: auto;
|
35
37
|
flex: 1;
|
36
38
|
}
|
37
|
-
|
38
|
-
#filters {
|
39
|
-
display: flex;
|
40
|
-
flex-direction: row;
|
41
|
-
justify-content: space-between;
|
42
|
-
|
43
|
-
background-color: white;
|
44
|
-
}
|
45
|
-
|
46
|
-
#filters > * {
|
47
|
-
padding: var(--padding-default) var(--padding-wide);
|
48
|
-
}
|
49
39
|
`
|
50
40
|
]
|
51
41
|
}
|
@@ -53,7 +43,7 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
53
43
|
get context() {
|
54
44
|
return {
|
55
45
|
title: i18next.t('title.data-sensor list'),
|
56
|
-
help: '
|
46
|
+
help: 'dataset/data-sensor',
|
57
47
|
actions: [
|
58
48
|
{
|
59
49
|
title: i18next.t('button.copy'),
|
@@ -75,14 +65,42 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
75
65
|
}
|
76
66
|
|
77
67
|
render() {
|
68
|
+
const mode = this.mode || (isMobileDevice() ? 'LIST' : 'GRID')
|
69
|
+
|
78
70
|
return html`
|
79
71
|
<ox-grist
|
80
|
-
.mode=${
|
72
|
+
.mode=${mode}
|
81
73
|
.config=${this.gristConfig}
|
82
74
|
.fetchHandler=${this.fetchHandler.bind(this)}
|
75
|
+
?url-params-sensitive=${this.active}
|
83
76
|
>
|
84
|
-
<div slot="headroom"
|
85
|
-
<
|
77
|
+
<div slot="headroom">
|
78
|
+
<div id="filters">
|
79
|
+
<ox-filters-form></ox-filters-form>
|
80
|
+
</div>
|
81
|
+
|
82
|
+
<div id="sorters">
|
83
|
+
Sort
|
84
|
+
<mwc-icon
|
85
|
+
@click=${e => {
|
86
|
+
const target = e.currentTarget
|
87
|
+
this.renderRoot.querySelector('#sorter-control').open({
|
88
|
+
right: 0,
|
89
|
+
top: target.offsetTop + target.offsetHeight
|
90
|
+
})
|
91
|
+
}}
|
92
|
+
>expand_more</mwc-icon
|
93
|
+
>
|
94
|
+
<ox-popup id="sorter-control">
|
95
|
+
<ox-sorters-control> </ox-sorters-control>
|
96
|
+
</ox-popup>
|
97
|
+
</div>
|
98
|
+
|
99
|
+
<div id="modes">
|
100
|
+
<mwc-icon @click=${() => (this.mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</mwc-icon>
|
101
|
+
<mwc-icon @click=${() => (this.mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</mwc-icon>
|
102
|
+
<mwc-icon @click=${() => (this.mode = 'CARD')} ?active=${mode == 'CARD'}>apps</mwc-icon>
|
103
|
+
</div>
|
86
104
|
</div>
|
87
105
|
</ox-grist>
|
88
106
|
`
|
@@ -92,30 +110,7 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
92
110
|
return this.renderRoot.querySelector('ox-grist')
|
93
111
|
}
|
94
112
|
|
95
|
-
// update with url params value
|
96
|
-
_updateSearchConfig(lifecycle) {
|
97
|
-
// this.searchConfig = this.searchConfig.map(conf => {
|
98
|
-
// if (conf.name in lifecycle.params) {
|
99
|
-
// conf.value = lifecycle.params[conf.name]
|
100
|
-
// } else {
|
101
|
-
// delete conf.value
|
102
|
-
// }
|
103
|
-
// return conf
|
104
|
-
// })
|
105
|
-
}
|
106
|
-
|
107
|
-
// set default field value to record with searchConfig
|
108
|
-
_setDefaultFieldsValue(fields) {
|
109
|
-
// this.searchConfig.forEach(conf => {
|
110
|
-
// if (!fields[conf.name] && conf.value) {
|
111
|
-
// fields[conf.name] = conf.value
|
112
|
-
// }
|
113
|
-
// })
|
114
|
-
}
|
115
|
-
|
116
113
|
async pageInitialized(lifecycle) {
|
117
|
-
this._updateSearchConfig(lifecycle)
|
118
|
-
|
119
114
|
this.gristConfig = {
|
120
115
|
list: { fields: ['name', 'description', 'active'] },
|
121
116
|
columns: [
|
@@ -153,6 +148,7 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
153
148
|
editable: true
|
154
149
|
},
|
155
150
|
sortable: true,
|
151
|
+
filter: true,
|
156
152
|
width: 60
|
157
153
|
},
|
158
154
|
{
|
@@ -176,6 +172,7 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
176
172
|
editable: true
|
177
173
|
},
|
178
174
|
sortable: true,
|
175
|
+
filter: 'search',
|
179
176
|
width: 150
|
180
177
|
},
|
181
178
|
{
|
@@ -194,7 +191,7 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
194
191
|
{
|
195
192
|
type: 'object',
|
196
193
|
name: 'dataSet',
|
197
|
-
header: i18next.t('field.
|
194
|
+
header: i18next.t('field.data-set'),
|
198
195
|
record: {
|
199
196
|
editable: true,
|
200
197
|
options: {
|
@@ -271,8 +268,8 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
271
268
|
},
|
272
269
|
{
|
273
270
|
type: 'datetime',
|
274
|
-
name: '
|
275
|
-
header: i18next.t('field.
|
271
|
+
name: 'updatedAt',
|
272
|
+
header: i18next.t('field.updated_at'),
|
276
273
|
record: {
|
277
274
|
editable: false
|
278
275
|
},
|
@@ -297,16 +294,6 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
297
294
|
this.grist.fetch()
|
298
295
|
}
|
299
296
|
|
300
|
-
async pageUpdated(changes, lifecycle) {
|
301
|
-
if (this.active) {
|
302
|
-
// update with url params value
|
303
|
-
this._updateSearchConfig(lifecycle)
|
304
|
-
await this.updateComplete
|
305
|
-
|
306
|
-
this.grist.fetch()
|
307
|
-
}
|
308
|
-
}
|
309
|
-
|
310
297
|
async fetchHandler({ page, limit, sortings = [], filters = [] }) {
|
311
298
|
const response = await client.query({
|
312
299
|
query: gql`
|
@@ -382,13 +369,6 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
382
369
|
}
|
383
370
|
}
|
384
371
|
|
385
|
-
async stateChanged(state) {
|
386
|
-
if (this.active && this._currentPopupName && !state.layout.viewparts[this._currentPopupName]) {
|
387
|
-
this.grist.fetch()
|
388
|
-
this._currentPopupName = null
|
389
|
-
}
|
390
|
-
}
|
391
|
-
|
392
372
|
async _copyDataSensor() {
|
393
373
|
var selected = this.grist.selected
|
394
374
|
if (selected.length == 0) return
|
@@ -419,7 +399,6 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
419
399
|
for (let key in dirtyFields) {
|
420
400
|
patchField[key] = dirtyFields[key].after
|
421
401
|
}
|
422
|
-
this._setDefaultFieldsValue(patchField)
|
423
402
|
patchField.cuFlag = patch.__dirty__
|
424
403
|
|
425
404
|
return patchField
|
@@ -443,4 +422,4 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
443
422
|
}
|
444
423
|
}
|
445
424
|
|
446
|
-
window.customElements.define('data-sensor-page',
|
425
|
+
window.customElements.define('data-sensor-list-page', DataSensorListPage)
|
@@ -61,8 +61,6 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
61
61
|
`
|
62
62
|
}
|
63
63
|
|
64
|
-
async updated(changedProps) {}
|
65
|
-
|
66
64
|
async firstUpdated() {
|
67
65
|
this.gristConfig = {
|
68
66
|
list: { fields: ['name', 'description', 'active'] },
|
@@ -132,6 +130,17 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
132
130
|
sortable: true,
|
133
131
|
width: 60
|
134
132
|
},
|
133
|
+
{
|
134
|
+
type: 'checkbox',
|
135
|
+
name: 'hidden',
|
136
|
+
label: true,
|
137
|
+
header: i18next.t('field.hidden'),
|
138
|
+
record: {
|
139
|
+
editable: true
|
140
|
+
},
|
141
|
+
sortable: true,
|
142
|
+
width: 60
|
143
|
+
},
|
135
144
|
{
|
136
145
|
type: 'string',
|
137
146
|
name: 'tag',
|
@@ -157,9 +166,7 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
157
166
|
header: i18next.t('field.options'),
|
158
167
|
record: {
|
159
168
|
editable: true,
|
160
|
-
renderer:
|
161
|
-
return typeof value === 'string' ? value : typeof value === 'object' ? JSON.stringify(value) : ''
|
162
|
-
},
|
169
|
+
renderer: 'json5',
|
163
170
|
options: async (value, column, record, row, field) => {
|
164
171
|
return {
|
165
172
|
name: record.type,
|
@@ -168,7 +175,7 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
168
175
|
record.type === 'select'
|
169
176
|
? [
|
170
177
|
{
|
171
|
-
type: 'options'
|
178
|
+
type: 'options' /* property-editor type */,
|
172
179
|
name: 'options',
|
173
180
|
label: 'options'
|
174
181
|
}
|
@@ -181,6 +188,15 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
181
188
|
},
|
182
189
|
width: 120
|
183
190
|
},
|
191
|
+
{
|
192
|
+
type: 'string',
|
193
|
+
name: 'unit',
|
194
|
+
header: i18next.t('field.unit'),
|
195
|
+
record: {
|
196
|
+
editable: true
|
197
|
+
},
|
198
|
+
width: 120
|
199
|
+
},
|
184
200
|
{
|
185
201
|
type: 'number',
|
186
202
|
name: 'quota',
|
@@ -191,11 +207,16 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
191
207
|
width: 60
|
192
208
|
},
|
193
209
|
{
|
194
|
-
type: '
|
210
|
+
type: 'data-item-spec',
|
195
211
|
name: 'spec',
|
196
212
|
header: i18next.t('field.spec'),
|
197
213
|
record: {
|
198
|
-
editable: true
|
214
|
+
editable: true,
|
215
|
+
options: {
|
216
|
+
name: '',
|
217
|
+
help: '',
|
218
|
+
objectified: true /* prevent from stringifying */
|
219
|
+
}
|
199
220
|
},
|
200
221
|
width: 200
|
201
222
|
}
|
@@ -216,7 +237,7 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
216
237
|
}
|
217
238
|
}
|
218
239
|
|
219
|
-
async fetchHandler({ filters, page, limit,
|
240
|
+
async fetchHandler({ filters, page, limit, sortings = [] }) {
|
220
241
|
const response = await client.query({
|
221
242
|
query: gql`
|
222
243
|
query {
|
@@ -234,9 +255,11 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
234
255
|
description
|
235
256
|
sequence
|
236
257
|
active
|
258
|
+
hidden
|
237
259
|
tag
|
238
260
|
type
|
239
261
|
options
|
262
|
+
unit
|
240
263
|
quota
|
241
264
|
spec
|
242
265
|
}
|
@@ -279,7 +302,9 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
279
302
|
}
|
280
303
|
})
|
281
304
|
|
282
|
-
if (!response.errors)
|
305
|
+
if (!response.errors) {
|
306
|
+
this.grist.fetch()
|
307
|
+
}
|
283
308
|
}
|
284
309
|
}
|
285
310
|
|
File without changes
|