@things-factory/dataset 5.0.0-alpha.1 → 5.0.0-alpha.12
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/client/bootstrap.js +15 -2
- package/client/pages/data-entry-form.js +75 -0
- package/client/pages/data-item-list.js +65 -16
- package/client/pages/data-sample.js +51 -16
- package/client/pages/data-sensor.js +446 -0
- package/client/pages/data-set.js +61 -16
- package/client/route.js +4 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/routes.js +64 -0
- 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-type.js +15 -6
- package/dist-server/service/data-item/data-item-type.js.map +1 -1
- package/dist-server/service/data-item/data-item.js +26 -6
- package/dist-server/service/data-item/data-item.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-mutation.js +41 -7
- package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-type.js +23 -2
- package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
- package/dist-server/service/data-sample/data-sample.js +44 -5
- package/dist-server/service/data-sample/data-sample.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-mutation.js +120 -0
- package/dist-server/service/data-sensor/data-sensor-mutation.js.map +1 -0
- package/dist-server/service/data-sensor/data-sensor-query.js +108 -0
- package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -0
- package/dist-server/service/data-sensor/data-sensor-type.js +147 -0
- package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -0
- package/dist-server/service/data-sensor/data-sensor.js +168 -0
- package/dist-server/service/data-sensor/data-sensor.js.map +1 -0
- package/dist-server/service/data-sensor/index.js +9 -0
- package/dist-server/service/data-sensor/index.js.map +1 -0
- package/dist-server/service/data-set/data-set-type.js +18 -0
- package/dist-server/service/data-set/data-set-type.js.map +1 -1
- package/dist-server/service/data-set/data-set.js +22 -3
- package/dist-server/service/data-set/data-set.js.map +1 -1
- package/dist-server/service/data-spec/data-spec-manager.js +20 -0
- package/dist-server/service/data-spec/data-spec-manager.js.map +1 -0
- package/dist-server/service/data-spec/data-spec-query.js +48 -0
- package/dist-server/service/data-spec/data-spec-query.js.map +1 -0
- package/dist-server/service/data-spec/data-spec.js +78 -0
- package/dist-server/service/data-spec/data-spec.js.map +1 -0
- package/dist-server/service/data-spec/index.js +8 -0
- package/dist-server/service/data-spec/index.js.map +1 -0
- package/dist-server/service/index.js +10 -2
- package/dist-server/service/index.js.map +1 -1
- package/package.json +14 -11
- package/server/index.ts +2 -0
- package/server/routes.ts +76 -0
- package/server/service/data-item/data-item-mutation.ts +6 -1
- package/server/service/data-item/data-item-type.ts +11 -6
- package/server/service/data-item/data-item.ts +21 -5
- package/server/service/data-sample/data-sample-mutation.ts +51 -5
- package/server/service/data-sample/data-sample-type.ts +17 -2
- package/server/service/data-sample/data-sample.ts +37 -2
- package/server/service/data-sensor/data-sensor-mutation.ts +110 -0
- package/server/service/data-sensor/data-sensor-query.ts +56 -0
- package/server/service/data-sensor/data-sensor-type.ts +98 -0
- package/server/service/data-sensor/data-sensor.ts +139 -0
- package/server/service/data-sensor/index.ts +6 -0
- package/server/service/data-set/data-set-type.ts +14 -0
- package/server/service/data-set/data-set.ts +17 -1
- package/server/service/data-spec/data-spec-manager.ts +21 -0
- package/server/service/data-spec/data-spec-query.ts +21 -0
- package/server/service/data-spec/data-spec.ts +44 -0
- package/server/service/data-spec/index.ts +5 -0
- package/server/service/index.ts +12 -4
- package/things-factory.config.js +4 -0
- package/translations/en.json +18 -4
- package/translations/ko.json +17 -3
- package/translations/ms.json +18 -4
- package/translations/zh.json +18 -4
package/client/bootstrap.js
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
-
import {
|
1
|
+
import {
|
2
|
+
Json5Renderer,
|
3
|
+
registerEditor as registerGristEditor,
|
4
|
+
registerRenderer as registerGristRenderer
|
5
|
+
} from '@operato/data-grist'
|
2
6
|
|
3
|
-
|
7
|
+
import { OxGristEditorDataItemSpec } from '@operato/dataset/grist-editor'
|
8
|
+
import { OxGristEditorPartitionKeys } from '@operato/app/grist-editor/ox-grist-editor-partition-keys.js'
|
9
|
+
|
10
|
+
export default function bootstrap() {
|
11
|
+
registerGristEditor('data-item-spec', OxGristEditorDataItemSpec)
|
12
|
+
registerGristRenderer('data-item-spec', Json5Renderer)
|
13
|
+
|
14
|
+
registerGristEditor('partition-keys', OxGristEditorPartitionKeys)
|
15
|
+
registerGristRenderer('partition-keys', Json5Renderer)
|
16
|
+
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import gql from 'graphql-tag'
|
2
|
+
import { css, html, LitElement } from 'lit'
|
3
|
+
|
4
|
+
import { client } from '@operato/graphql'
|
5
|
+
import { i18next, localize } from '@operato/i18n'
|
6
|
+
import '@operato/dataset/ox-data-entry-form.js'
|
7
|
+
|
8
|
+
class DataEntryForm extends localize(i18next)(LitElement) {
|
9
|
+
static get properties() {
|
10
|
+
return {
|
11
|
+
dataSet: Object
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
15
|
+
static get styles() {
|
16
|
+
return [
|
17
|
+
css`
|
18
|
+
:host {
|
19
|
+
display: flex;
|
20
|
+
flex-direction: column;
|
21
|
+
|
22
|
+
background-color: #fff;
|
23
|
+
}
|
24
|
+
|
25
|
+
ox-data-entry-form {
|
26
|
+
flex: 1;
|
27
|
+
margin: 10px;
|
28
|
+
}
|
29
|
+
|
30
|
+
.button-container {
|
31
|
+
display: flex;
|
32
|
+
margin-left: auto;
|
33
|
+
padding: var(--padding-default);
|
34
|
+
}
|
35
|
+
`
|
36
|
+
]
|
37
|
+
}
|
38
|
+
|
39
|
+
get entryForm() {
|
40
|
+
return this.renderRoot.querySelector('ox-data-entry-form')
|
41
|
+
}
|
42
|
+
|
43
|
+
render() {
|
44
|
+
return html`
|
45
|
+
<ox-data-entry-form .dataSet=${this.dataSet}></ox-data-entry-form>
|
46
|
+
<div class="button-container">
|
47
|
+
<mwc-button raised @click=${this._updateDataItems.bind(this)}>${i18next.t('button.save')}</mwc-button>
|
48
|
+
</div>
|
49
|
+
`
|
50
|
+
}
|
51
|
+
|
52
|
+
async _updateDataItems() {
|
53
|
+
const data = this.entryForm.buildValue()
|
54
|
+
const dataSample = {
|
55
|
+
dataSetId: this.dataSet.id,
|
56
|
+
data
|
57
|
+
}
|
58
|
+
|
59
|
+
const response = await client.mutate({
|
60
|
+
mutation: gql`
|
61
|
+
mutation ($dataSample: NewDataSample!) {
|
62
|
+
createDataSample(dataSample: $dataSample) {
|
63
|
+
id
|
64
|
+
collectedAt
|
65
|
+
}
|
66
|
+
}
|
67
|
+
`,
|
68
|
+
variables: {
|
69
|
+
dataSample
|
70
|
+
}
|
71
|
+
})
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
window.customElements.define('data-entry-form', DataEntryForm)
|
@@ -1,8 +1,8 @@
|
|
1
|
-
import
|
2
|
-
import {
|
1
|
+
import { LitElement, css, html } from 'lit'
|
2
|
+
import { i18next, localize } from '@operato/i18n'
|
3
3
|
|
4
4
|
import { client } from '@operato/graphql'
|
5
|
-
import
|
5
|
+
import gql from 'graphql-tag'
|
6
6
|
import { isMobileDevice } from '@operato/utils'
|
7
7
|
|
8
8
|
class DataItemList extends localize(i18next)(LitElement) {
|
@@ -33,9 +33,6 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
33
33
|
padding: var(--padding-default);
|
34
34
|
}
|
35
35
|
|
36
|
-
form {
|
37
|
-
position: relative;
|
38
|
-
}
|
39
36
|
[danger] {
|
40
37
|
--mdc-theme-primary: var(--mdc-danger-button-primary-color);
|
41
38
|
}
|
@@ -46,7 +43,7 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
46
43
|
]
|
47
44
|
}
|
48
45
|
|
49
|
-
get
|
46
|
+
get grist() {
|
50
47
|
return this.renderRoot.querySelector('ox-grist')
|
51
48
|
}
|
52
49
|
|
@@ -64,8 +61,6 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
64
61
|
`
|
65
62
|
}
|
66
63
|
|
67
|
-
async updated(changedProps) {}
|
68
|
-
|
69
64
|
async firstUpdated() {
|
70
65
|
this.gristConfig = {
|
71
66
|
list: { fields: ['name', 'description', 'active'] },
|
@@ -135,12 +130,58 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
135
130
|
sortable: true,
|
136
131
|
width: 60
|
137
132
|
},
|
133
|
+
{
|
134
|
+
type: 'string',
|
135
|
+
name: 'tag',
|
136
|
+
header: i18next.t('field.tag'),
|
137
|
+
record: {
|
138
|
+
editable: true
|
139
|
+
},
|
140
|
+
width: 180
|
141
|
+
},
|
138
142
|
{
|
139
143
|
type: 'select',
|
140
144
|
name: 'type',
|
141
145
|
header: i18next.t('field.type'),
|
142
146
|
record: {
|
143
|
-
options: ['number', 'text', 'select', 'boolean'],
|
147
|
+
options: ['', 'number', 'text', 'select', 'boolean', 'file'],
|
148
|
+
editable: true
|
149
|
+
},
|
150
|
+
width: 120
|
151
|
+
},
|
152
|
+
{
|
153
|
+
type: 'parameters',
|
154
|
+
name: 'options',
|
155
|
+
header: i18next.t('field.options'),
|
156
|
+
record: {
|
157
|
+
editable: true,
|
158
|
+
renderer: 'json5',
|
159
|
+
options: async (value, column, record, row, field) => {
|
160
|
+
return {
|
161
|
+
name: record.type,
|
162
|
+
help: '',
|
163
|
+
spec:
|
164
|
+
record.type === 'select'
|
165
|
+
? [
|
166
|
+
{
|
167
|
+
type: 'options' /* property-editor type */,
|
168
|
+
name: 'options',
|
169
|
+
label: i18next.t('field.options')
|
170
|
+
}
|
171
|
+
]
|
172
|
+
: [],
|
173
|
+
context: this.grist,
|
174
|
+
objectified: true
|
175
|
+
}
|
176
|
+
}
|
177
|
+
},
|
178
|
+
width: 120
|
179
|
+
},
|
180
|
+
{
|
181
|
+
type: 'string',
|
182
|
+
name: 'unit',
|
183
|
+
header: i18next.t('field.unit'),
|
184
|
+
record: {
|
144
185
|
editable: true
|
145
186
|
},
|
146
187
|
width: 120
|
@@ -155,11 +196,16 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
155
196
|
width: 60
|
156
197
|
},
|
157
198
|
{
|
158
|
-
type: '
|
199
|
+
type: 'data-item-spec',
|
159
200
|
name: 'spec',
|
160
201
|
header: i18next.t('field.spec'),
|
161
202
|
record: {
|
162
|
-
editable: true
|
203
|
+
editable: true,
|
204
|
+
options: {
|
205
|
+
name: '',
|
206
|
+
help: '',
|
207
|
+
objectified: true /* prevent from stringifying */
|
208
|
+
}
|
163
209
|
},
|
164
210
|
width: 200
|
165
211
|
}
|
@@ -198,7 +244,10 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
198
244
|
description
|
199
245
|
sequence
|
200
246
|
active
|
247
|
+
tag
|
201
248
|
type
|
249
|
+
options
|
250
|
+
unit
|
202
251
|
quota
|
203
252
|
spec
|
204
253
|
}
|
@@ -215,7 +264,7 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
215
264
|
}
|
216
265
|
|
217
266
|
async _updateDataItems() {
|
218
|
-
let patches = this.
|
267
|
+
let patches = this.grist._data.records
|
219
268
|
if (patches && patches.length) {
|
220
269
|
patches = patches.map(patch => {
|
221
270
|
var patchField = {}
|
@@ -241,14 +290,14 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
241
290
|
}
|
242
291
|
})
|
243
292
|
|
244
|
-
if (!response.errors) this.
|
293
|
+
if (!response.errors) this.grist.fetch()
|
245
294
|
}
|
246
295
|
}
|
247
296
|
|
248
297
|
async _deleteDataItems() {
|
249
298
|
if (!confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) return
|
250
299
|
|
251
|
-
const ids = this.
|
300
|
+
const ids = this.grist.selected.map(record => record.id)
|
252
301
|
if (!(ids && ids.length > 0)) return
|
253
302
|
|
254
303
|
const response = await client.mutate({
|
@@ -264,7 +313,7 @@ class DataItemList extends localize(i18next)(LitElement) {
|
|
264
313
|
|
265
314
|
if (response.errors) return
|
266
315
|
|
267
|
-
this.
|
316
|
+
this.grist.fetch()
|
268
317
|
await document.dispatchEvent(
|
269
318
|
new CustomEvent('notify', {
|
270
319
|
detail: {
|
@@ -1,15 +1,15 @@
|
|
1
1
|
import '@operato/data-grist'
|
2
2
|
|
3
|
-
import
|
3
|
+
import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
|
4
|
+
import { PageView, store } from '@operato/shell'
|
4
5
|
import { css, html } from 'lit'
|
5
|
-
import {
|
6
|
+
import { i18next, localize } from '@operato/i18n'
|
6
7
|
|
7
8
|
import { client } from '@operato/graphql'
|
8
|
-
import {
|
9
|
-
import
|
10
|
-
import { PageView, store } from '@operato/shell'
|
11
|
-
import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
|
9
|
+
import { connect } from 'pwa-helpers/connect-mixin'
|
10
|
+
import gql from 'graphql-tag'
|
12
11
|
import { isMobileDevice } from '@operato/utils'
|
12
|
+
import { notify } from '@operato/layout'
|
13
13
|
|
14
14
|
export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
15
15
|
static get properties() {
|
@@ -121,7 +121,7 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
121
121
|
},
|
122
122
|
filter: 'search',
|
123
123
|
sortable: true,
|
124
|
-
width:
|
124
|
+
width: 120
|
125
125
|
},
|
126
126
|
{
|
127
127
|
type: 'string',
|
@@ -132,15 +132,29 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
132
132
|
editable: true
|
133
133
|
},
|
134
134
|
filter: 'search',
|
135
|
-
width:
|
135
|
+
width: 150
|
136
136
|
},
|
137
137
|
{
|
138
|
-
type: '
|
139
|
-
name: '
|
140
|
-
|
138
|
+
type: 'resource-object',
|
139
|
+
name: 'dataSet',
|
140
|
+
header: i18next.t('field.dataSet'),
|
141
|
+
record: {
|
142
|
+
editable: false
|
143
|
+
},
|
144
|
+
sortable: true,
|
145
|
+
width: 120
|
141
146
|
},
|
142
147
|
{
|
143
|
-
type: '
|
148
|
+
type: 'json5',
|
149
|
+
name: 'partitionKeys',
|
150
|
+
header: i18next.t('field.partition-keys'),
|
151
|
+
record: {
|
152
|
+
editable: false
|
153
|
+
},
|
154
|
+
width: 200
|
155
|
+
},
|
156
|
+
{
|
157
|
+
type: 'json5',
|
144
158
|
name: 'data',
|
145
159
|
header: i18next.t('field.data'),
|
146
160
|
record: {
|
@@ -149,7 +163,7 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
149
163
|
width: 200
|
150
164
|
},
|
151
165
|
{
|
152
|
-
type: '
|
166
|
+
type: 'json5',
|
153
167
|
name: 'spec',
|
154
168
|
header: i18next.t('field.spec'),
|
155
169
|
record: {
|
@@ -157,9 +171,17 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
157
171
|
},
|
158
172
|
width: 200
|
159
173
|
},
|
160
|
-
|
161
174
|
{
|
162
|
-
type: '
|
175
|
+
type: 'text',
|
176
|
+
name: 'rawData',
|
177
|
+
header: i18next.t('field.raw-data'),
|
178
|
+
record: {
|
179
|
+
editable: false
|
180
|
+
},
|
181
|
+
width: 200
|
182
|
+
},
|
183
|
+
{
|
184
|
+
type: 'resource-object',
|
163
185
|
name: 'updater',
|
164
186
|
header: i18next.t('field.updater'),
|
165
187
|
sortable: true,
|
@@ -171,6 +193,13 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
171
193
|
header: i18next.t('field.updated_at'),
|
172
194
|
sortable: true,
|
173
195
|
width: 180
|
196
|
+
},
|
197
|
+
{
|
198
|
+
type: 'datetime',
|
199
|
+
name: 'collectedAt',
|
200
|
+
header: i18next.t('field.collected_at'),
|
201
|
+
sortable: true,
|
202
|
+
width: 180
|
174
203
|
}
|
175
204
|
],
|
176
205
|
rows: {
|
@@ -210,7 +239,12 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
210
239
|
id
|
211
240
|
name
|
212
241
|
description
|
213
|
-
|
242
|
+
dataSet {
|
243
|
+
id
|
244
|
+
name
|
245
|
+
description
|
246
|
+
}
|
247
|
+
partitionKeys
|
214
248
|
data
|
215
249
|
spec
|
216
250
|
updater {
|
@@ -218,6 +252,7 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
218
252
|
name
|
219
253
|
}
|
220
254
|
updatedAt
|
255
|
+
collectedAt
|
221
256
|
}
|
222
257
|
total
|
223
258
|
}
|