@things-factory/dataset 5.0.0-alpha.1 → 5.0.0-alpha.10

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 (73) hide show
  1. package/client/bootstrap.js +11 -2
  2. package/client/pages/data-entry-form.js +75 -0
  3. package/client/pages/data-item-list.js +65 -16
  4. package/client/pages/data-sample.js +45 -10
  5. package/client/pages/data-sensor.js +446 -0
  6. package/client/pages/data-set.js +47 -8
  7. package/client/route.js +4 -0
  8. package/dist-server/index.js +1 -0
  9. package/dist-server/index.js.map +1 -1
  10. package/dist-server/routes.js +64 -0
  11. package/dist-server/routes.js.map +1 -1
  12. package/dist-server/service/data-item/data-item-mutation.js +5 -1
  13. package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
  14. package/dist-server/service/data-item/data-item-type.js +15 -6
  15. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  16. package/dist-server/service/data-item/data-item.js +26 -6
  17. package/dist-server/service/data-item/data-item.js.map +1 -1
  18. package/dist-server/service/data-sample/data-sample-mutation.js +41 -7
  19. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  20. package/dist-server/service/data-sample/data-sample-type.js +23 -2
  21. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  22. package/dist-server/service/data-sample/data-sample.js +44 -5
  23. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  24. package/dist-server/service/data-sensor/data-sensor-mutation.js +120 -0
  25. package/dist-server/service/data-sensor/data-sensor-mutation.js.map +1 -0
  26. package/dist-server/service/data-sensor/data-sensor-query.js +108 -0
  27. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -0
  28. package/dist-server/service/data-sensor/data-sensor-type.js +147 -0
  29. package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -0
  30. package/dist-server/service/data-sensor/data-sensor.js +168 -0
  31. package/dist-server/service/data-sensor/data-sensor.js.map +1 -0
  32. package/dist-server/service/data-sensor/index.js +9 -0
  33. package/dist-server/service/data-sensor/index.js.map +1 -0
  34. package/dist-server/service/data-set/data-set-type.js +18 -0
  35. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  36. package/dist-server/service/data-set/data-set.js +22 -3
  37. package/dist-server/service/data-set/data-set.js.map +1 -1
  38. package/dist-server/service/data-spec/data-spec-manager.js +20 -0
  39. package/dist-server/service/data-spec/data-spec-manager.js.map +1 -0
  40. package/dist-server/service/data-spec/data-spec-query.js +48 -0
  41. package/dist-server/service/data-spec/data-spec-query.js.map +1 -0
  42. package/dist-server/service/data-spec/data-spec.js +78 -0
  43. package/dist-server/service/data-spec/data-spec.js.map +1 -0
  44. package/dist-server/service/data-spec/index.js +8 -0
  45. package/dist-server/service/data-spec/index.js.map +1 -0
  46. package/dist-server/service/index.js +10 -2
  47. package/dist-server/service/index.js.map +1 -1
  48. package/package.json +13 -11
  49. package/server/index.ts +2 -0
  50. package/server/routes.ts +76 -0
  51. package/server/service/data-item/data-item-mutation.ts +6 -1
  52. package/server/service/data-item/data-item-type.ts +11 -6
  53. package/server/service/data-item/data-item.ts +21 -5
  54. package/server/service/data-sample/data-sample-mutation.ts +51 -5
  55. package/server/service/data-sample/data-sample-type.ts +17 -2
  56. package/server/service/data-sample/data-sample.ts +37 -2
  57. package/server/service/data-sensor/data-sensor-mutation.ts +110 -0
  58. package/server/service/data-sensor/data-sensor-query.ts +56 -0
  59. package/server/service/data-sensor/data-sensor-type.ts +98 -0
  60. package/server/service/data-sensor/data-sensor.ts +139 -0
  61. package/server/service/data-sensor/index.ts +6 -0
  62. package/server/service/data-set/data-set-type.ts +14 -0
  63. package/server/service/data-set/data-set.ts +17 -1
  64. package/server/service/data-spec/data-spec-manager.ts +21 -0
  65. package/server/service/data-spec/data-spec-query.ts +21 -0
  66. package/server/service/data-spec/data-spec.ts +44 -0
  67. package/server/service/data-spec/index.ts +5 -0
  68. package/server/service/index.ts +12 -4
  69. package/things-factory.config.js +4 -0
  70. package/translations/en.json +18 -4
  71. package/translations/ko.json +17 -3
  72. package/translations/ms.json +18 -4
  73. package/translations/zh.json +18 -4
@@ -1,3 +1,12 @@
1
- import { store } from '@things-factory/shell'
1
+ import {
2
+ Json5Renderer,
3
+ registerEditor as registerGristEditor,
4
+ registerRenderer as registerGristRenderer
5
+ } from '@operato/data-grist'
2
6
 
3
- export default function bootstrap() {}
7
+ import { OxDataItemSpecEditor } from '@operato/dataset/grist-editor'
8
+
9
+ export default function bootstrap() {
10
+ registerGristEditor('data-item-spec', OxDataItemSpecEditor)
11
+ registerGristRenderer('data-item-spec', Json5Renderer)
12
+ }
@@ -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 gql from 'graphql-tag'
2
- import { css, html, LitElement } from 'lit'
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 { i18next, localize } from '@operato/i18n'
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 dataGrist() {
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: 'json',
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.dataGrist._data.records
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.dataGrist.fetch()
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.dataGrist.selected.map(record => record.id)
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.dataGrist.fetch()
316
+ this.grist.fetch()
268
317
  await document.dispatchEvent(
269
318
  new CustomEvent('notify', {
270
319
  detail: {
@@ -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: 150
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: 200
135
+ width: 150
136
136
  },
137
137
  {
138
- type: 'string',
139
- name: 'dataSetId',
140
- hidden: true
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
146
+ },
147
+ {
148
+ type: 'json5',
149
+ name: 'partitionKeys',
150
+ header: i18next.t('field.partitionKeys'),
151
+ record: {
152
+ editable: false
153
+ },
154
+ width: 200
141
155
  },
142
156
  {
143
- type: 'json',
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: 'json',
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: 'object',
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
- dataSetId
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
  }