@things-factory/dataset 5.0.0-alpha.2 → 5.0.0-alpha.20

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 (96) hide show
  1. package/README.md +12 -0
  2. package/assets/data-samples.jpg +0 -0
  3. package/client/bootstrap.js +16 -1
  4. package/client/pages/data-entry-form.js +84 -0
  5. package/client/pages/data-item-list.js +58 -16
  6. package/client/pages/data-ooc-view.js +182 -0
  7. package/client/pages/data-ooc.js +469 -0
  8. package/client/pages/data-sample-view.js +97 -0
  9. package/client/pages/data-sample.js +130 -55
  10. package/client/pages/data-sensor.js +8 -18
  11. package/client/pages/data-set.js +126 -25
  12. package/client/route.js +4 -0
  13. package/dist-server/controllers/create-data-sample.js +122 -0
  14. package/dist-server/controllers/create-data-sample.js.map +1 -0
  15. package/dist-server/controllers/data-use-case.js +57 -0
  16. package/dist-server/controllers/data-use-case.js.map +1 -0
  17. package/dist-server/controllers/index.js +17 -0
  18. package/dist-server/controllers/index.js.map +1 -1
  19. package/dist-server/index.js +2 -0
  20. package/dist-server/index.js.map +1 -1
  21. package/dist-server/routes.js +9 -24
  22. package/dist-server/routes.js.map +1 -1
  23. package/dist-server/service/data-item/data-item-mutation.js +5 -1
  24. package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
  25. package/dist-server/service/data-item/data-item-type.js +14 -5
  26. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  27. package/dist-server/service/data-item/data-item.js +20 -7
  28. package/dist-server/service/data-item/data-item.js.map +1 -1
  29. package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
  30. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  31. package/dist-server/service/data-ooc/data-ooc-query.js +115 -0
  32. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  33. package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
  34. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  35. package/dist-server/service/data-ooc/data-ooc-type.js +99 -0
  36. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  37. package/dist-server/service/data-ooc/data-ooc.js +227 -0
  38. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  39. package/dist-server/service/data-ooc/index.js +10 -0
  40. package/dist-server/service/data-ooc/index.js.map +1 -0
  41. package/dist-server/service/data-sample/data-sample-mutation.js +3 -105
  42. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  43. package/dist-server/service/data-sample/data-sample-type.js +6 -43
  44. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  45. package/dist-server/service/data-sample/data-sample.js +33 -12
  46. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  47. package/dist-server/service/data-set/data-set-mutation.js +1 -2
  48. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  49. package/dist-server/service/data-set/data-set-query.js +12 -0
  50. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  51. package/dist-server/service/data-set/data-set-type.js +19 -2
  52. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  53. package/dist-server/service/data-set/data-set.js +22 -10
  54. package/dist-server/service/data-set/data-set.js.map +1 -1
  55. package/dist-server/service/data-spec/data-spec-manager.js +20 -0
  56. package/dist-server/service/data-spec/data-spec-manager.js.map +1 -0
  57. package/dist-server/service/data-spec/data-spec-query.js +48 -0
  58. package/dist-server/service/data-spec/data-spec-query.js.map +1 -0
  59. package/dist-server/service/data-spec/data-spec.js +78 -0
  60. package/dist-server/service/data-spec/data-spec.js.map +1 -0
  61. package/dist-server/service/data-spec/index.js +8 -0
  62. package/dist-server/service/data-spec/index.js.map +1 -0
  63. package/dist-server/service/index.js +12 -4
  64. package/dist-server/service/index.js.map +1 -1
  65. package/package.json +15 -12
  66. package/server/controllers/create-data-sample.ts +161 -0
  67. package/server/controllers/data-use-case.ts +85 -0
  68. package/server/controllers/index.ts +1 -0
  69. package/server/index.ts +3 -0
  70. package/server/routes.ts +18 -32
  71. package/server/service/data-item/data-item-mutation.ts +6 -1
  72. package/server/service/data-item/data-item-type.ts +11 -7
  73. package/server/service/data-item/data-item.ts +16 -6
  74. package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
  75. package/server/service/data-ooc/data-ooc-query.ts +63 -0
  76. package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
  77. package/server/service/data-ooc/data-ooc-type.ts +62 -0
  78. package/server/service/data-ooc/data-ooc.ts +195 -0
  79. package/server/service/data-ooc/index.ts +7 -0
  80. package/server/service/data-sample/data-sample-mutation.ts +6 -128
  81. package/server/service/data-sample/data-sample-type.ts +4 -32
  82. package/server/service/data-sample/data-sample.ts +31 -10
  83. package/server/service/data-set/data-set-mutation.ts +1 -4
  84. package/server/service/data-set/data-set-query.ts +8 -1
  85. package/server/service/data-set/data-set-type.ts +17 -6
  86. package/server/service/data-set/data-set.ts +18 -8
  87. package/server/service/data-spec/data-spec-manager.ts +21 -0
  88. package/server/service/data-spec/data-spec-query.ts +21 -0
  89. package/server/service/data-spec/data-spec.ts +44 -0
  90. package/server/service/data-spec/index.ts +5 -0
  91. package/server/service/index.ts +16 -8
  92. package/things-factory.config.js +4 -0
  93. package/translations/en.json +20 -1
  94. package/translations/ko.json +21 -2
  95. package/translations/ms.json +20 -1
  96. package/translations/zh.json +20 -1
@@ -1,14 +1,15 @@
1
1
  import '@operato/data-grist'
2
+ import './data-sample-view.js'
2
3
 
3
- import gql from 'graphql-tag'
4
+ import { PageView, store } from '@operato/shell'
4
5
  import { css, html } from 'lit'
5
- import { connect } from 'pwa-helpers/connect-mixin'
6
+ import { i18next, localize } from '@operato/i18n'
7
+ import { notify, openPopup } from '@operato/layout'
6
8
 
9
+ import { ScrollbarStyles } from '@operato/styles'
7
10
  import { client } from '@operato/graphql'
8
- import { i18next, localize } from '@operato/i18n'
9
- import { notify } from '@operato/layout'
10
- import { PageView, store } from '@operato/shell'
11
- import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
11
+ import { connect } from 'pwa-helpers/connect-mixin'
12
+ import gql from 'graphql-tag'
12
13
  import { isMobileDevice } from '@operato/utils'
13
14
 
14
15
  export class DataSample extends connect(store)(localize(i18next)(PageView)) {
@@ -54,13 +55,11 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
54
55
  return {
55
56
  title: i18next.t('title.data-sample list'),
56
57
  help: 'integration/ui/data-sample',
57
- actions: [
58
- {
59
- title: i18next.t('button.delete'),
60
- action: this._deleteDataSample.bind(this),
61
- ...CommonButtonStyles.delete
62
- }
63
- ]
58
+ actions: [],
59
+ exportable: {
60
+ name: i18next.t('title.data-sample list'),
61
+ data: this._exportableData.bind(this)
62
+ }
64
63
  }
65
64
  }
66
65
 
@@ -111,17 +110,35 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
111
110
  columns: [
112
111
  { type: 'gutter', gutterName: 'sequence' },
113
112
  { type: 'gutter', gutterName: 'row-selector', multiple: true },
113
+ {
114
+ type: 'gutter',
115
+ gutterName: 'button',
116
+ icon: 'assignment',
117
+ handlers: {
118
+ click: (columns, data, column, record, rowIndex) => {
119
+ openPopup(
120
+ html` <data-sample-view .dataSample=${record} style="background-color: white;"></data-sample-view> `,
121
+ {
122
+ backdrop: true,
123
+ size: 'large',
124
+ title: i18next.t('title.data-sample view')
125
+ }
126
+ )
127
+ }
128
+ }
129
+ },
114
130
  {
115
131
  type: 'string',
116
132
  name: 'name',
117
133
  label: true,
118
134
  header: i18next.t('field.name'),
119
135
  record: {
120
- editable: true
136
+ editable: false
121
137
  },
122
138
  filter: 'search',
123
139
  sortable: true,
124
- width: 150
140
+ width: 120,
141
+ imex: true
125
142
  },
126
143
  {
127
144
  type: 'string',
@@ -129,32 +146,63 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
129
146
  label: true,
130
147
  header: i18next.t('field.description'),
131
148
  record: {
132
- editable: true
149
+ editable: false
133
150
  },
134
151
  filter: 'search',
135
- width: 200
152
+ width: 150,
153
+ imex: true
136
154
  },
137
155
  {
138
- type: 'object',
156
+ type: 'resource-object',
139
157
  name: 'dataSet',
140
158
  header: i18next.t('field.data-set'),
141
159
  record: {
142
160
  editable: false
143
161
  },
144
162
  sortable: true,
145
- width: 120
163
+ width: 120,
164
+ imex: true
165
+ },
166
+ {
167
+ type: 'json5',
168
+ name: 'partitionKeys',
169
+ header: i18next.t('field.partition-keys'),
170
+ record: {
171
+ editable: false
172
+ },
173
+ width: 200,
174
+ imex: true
175
+ },
176
+ {
177
+ type: 'checkbox',
178
+ name: 'ooc',
179
+ header: i18next.t('field.ooc'),
180
+ record: {
181
+ editable: false
182
+ },
183
+ width: 30
146
184
  },
147
185
  {
148
- type: 'json',
186
+ type: 'checkbox',
187
+ name: 'oos',
188
+ header: i18next.t('field.oos'),
189
+ record: {
190
+ editable: false
191
+ },
192
+ width: 30
193
+ },
194
+ {
195
+ type: 'json5',
149
196
  name: 'data',
150
197
  header: i18next.t('field.data'),
151
198
  record: {
152
199
  editable: false
153
200
  },
154
- width: 200
201
+ width: 200,
202
+ imex: true
155
203
  },
156
204
  {
157
- type: 'json',
205
+ type: 'json5',
158
206
  name: 'spec',
159
207
  header: i18next.t('field.spec'),
160
208
  record: {
@@ -163,45 +211,62 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
163
211
  width: 200
164
212
  },
165
213
  {
166
- type: 'code',
214
+ type: 'text',
167
215
  name: 'rawData',
168
216
  header: i18next.t('field.raw-data'),
169
217
  record: {
170
218
  editable: false
171
219
  },
172
- width: 200
220
+ width: 200,
221
+ imex: true
173
222
  },
174
223
  {
175
- type: 'object',
224
+ type: 'resource-object',
176
225
  name: 'updater',
177
226
  header: i18next.t('field.updater'),
178
227
  sortable: true,
179
- width: 120
228
+ width: 120,
229
+ imex: true
180
230
  },
181
231
  {
182
232
  type: 'datetime',
183
233
  name: 'updatedAt',
184
234
  header: i18next.t('field.updated_at'),
185
235
  sortable: true,
186
- width: 180
236
+ width: 180,
237
+ imex: true
187
238
  },
188
239
  {
189
240
  type: 'datetime',
190
241
  name: 'collectedAt',
191
242
  header: i18next.t('field.collected_at'),
192
243
  sortable: true,
193
- width: 180
244
+ width: 180,
245
+ imex: true
194
246
  }
195
247
  ],
196
248
  rows: {
197
249
  appendable: false,
198
250
  selectable: {
199
251
  multiple: true
252
+ },
253
+ classifier: function (record, rowIndex) {
254
+ var emphasized
255
+ if (record['oos']) {
256
+ emphasized = ['red']
257
+ } else if (record['ooc']) {
258
+ emphasized = 'orange'
259
+ }
260
+
261
+ return {
262
+ emphasized
263
+ }
200
264
  }
201
265
  },
202
266
  sorters: [
203
267
  {
204
- name: 'name'
268
+ name: 'updatedAt',
269
+ desc: true
205
270
  }
206
271
  ]
207
272
  }
@@ -235,8 +300,11 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
235
300
  name
236
301
  description
237
302
  }
303
+ partitionKeys
238
304
  data
239
305
  spec
306
+ ooc
307
+ oos
240
308
  updater {
241
309
  id
242
310
  name
@@ -261,36 +329,43 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
261
329
  }
262
330
  }
263
331
 
264
- async _deleteDataSample() {
265
- if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
266
- const ids = this.grist.selected.map(record => record.id)
267
- if (ids && ids.length > 0) {
268
- const response = await client.mutate({
269
- mutation: gql`
270
- mutation ($ids: [String!]!) {
271
- deleteDataSamples(ids: $ids)
332
+ _exportableData() {
333
+ let records = []
334
+ if (this.grist.selected && this.grist.selected.length > 0) {
335
+ records = this.grist.selected
336
+ } else {
337
+ records = this.grist.data.records
338
+ }
339
+
340
+ var headerSetting = this.grist.compiledConfig.columns
341
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
342
+ .map(column => {
343
+ return column.imex === true
344
+ ? {
345
+ header: column.header.renderer(),
346
+ key: column.name,
347
+ width: column.width,
348
+ type: column.type
272
349
  }
273
- `,
274
- variables: {
275
- ids
276
- }
277
- })
350
+ : column.imex
351
+ })
278
352
 
279
- if (!response.errors) {
280
- this.grist.fetch()
281
- notify({
282
- message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
283
- })
284
- }
353
+ var data = records.map(item => {
354
+ return {
355
+ id: item.id,
356
+ ...this.gristConfig.columns
357
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
358
+ .reduce((record, column) => {
359
+ const key = column.imex === true ? column.name : column.imex.key
360
+ record[key] = key
361
+ .split('.')
362
+ .reduce((obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), item)
363
+ return record
364
+ }, {})
285
365
  }
286
- }
287
- }
366
+ })
288
367
 
289
- async stateChanged(state) {
290
- if (this.active && this._currentPopupName && !state.layout.viewparts[this._currentPopupName]) {
291
- this.grist.fetch()
292
- this._currentPopupName = null
293
- }
368
+ return { header: headerSetting, data: data }
294
369
  }
295
370
  }
296
371
 
@@ -1,15 +1,15 @@
1
1
  import '@operato/data-grist'
2
2
 
3
- import gql from 'graphql-tag'
3
+ import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
4
+ import { PageView, store } from '@operato/shell'
4
5
  import { css, html } from 'lit'
5
- import { connect } from 'pwa-helpers/connect-mixin'
6
+ import { i18next, localize } from '@operato/i18n'
6
7
 
7
8
  import { client } from '@operato/graphql'
8
- import { i18next, localize } from '@operato/i18n'
9
- import { notify } from '@operato/layout'
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 DataSensor extends connect(store)(localize(i18next)(PageView)) {
15
15
  static get properties() {
@@ -153,6 +153,7 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
153
153
  editable: true
154
154
  },
155
155
  sortable: true,
156
+ filter: true,
156
157
  width: 60
157
158
  },
158
159
  {
@@ -176,6 +177,7 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
176
177
  editable: true
177
178
  },
178
179
  sortable: true,
180
+ filter: 'search',
179
181
  width: 150
180
182
  },
181
183
  {
@@ -334,11 +336,6 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
334
336
  model
335
337
  serialNo
336
338
  netmask
337
- collecter {
338
- id
339
- name
340
- }
341
- collectedAt
342
339
  updater {
343
340
  id
344
341
  name
@@ -387,13 +384,6 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
387
384
  }
388
385
  }
389
386
 
390
- async stateChanged(state) {
391
- if (this.active && this._currentPopupName && !state.layout.viewparts[this._currentPopupName]) {
392
- this.grist.fetch()
393
- this._currentPopupName = null
394
- }
395
- }
396
-
397
387
  async _copyDataSensor() {
398
388
  var selected = this.grist.selected
399
389
  if (selected.length == 0) return
@@ -1,18 +1,20 @@
1
1
  import '@operato/data-grist'
2
2
  import './data-item-list'
3
3
  import './data-set-importer'
4
+ import './data-entry-form'
4
5
 
5
- import gql from 'graphql-tag'
6
+ import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
7
+ import { PageView, store } from '@operato/shell'
6
8
  import { css, html } from 'lit'
7
- import moment from 'moment-timezone'
8
- import { connect } from 'pwa-helpers/connect-mixin'
9
-
10
- import { client } from '@operato/graphql'
11
9
  import { i18next, localize } from '@operato/i18n'
12
10
  import { notify, openPopup } from '@operato/layout'
13
- import { PageView, store } from '@operato/shell'
14
- import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
11
+
12
+ import { OxDataUseCase } from '@operato/dataset'
13
+ import { client } from '@operato/graphql'
14
+ import { connect } from 'pwa-helpers/connect-mixin'
15
+ import gql from 'graphql-tag'
15
16
  import { isMobileDevice } from '@operato/utils'
17
+ import moment from 'moment-timezone'
16
18
 
17
19
  export class DataSet extends connect(store)(localize(i18next)(PageView)) {
18
20
  static get properties() {
@@ -138,12 +140,32 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
138
140
  handlers: {
139
141
  click: (columns, data, column, record, rowIndex) => {
140
142
  if (!record.id) return
141
- openPopup(html` <data-item-list .dataSet=${record}></data-item-list> `, {
143
+ const popup = openPopup(html` <data-item-list .dataSet=${record}></data-item-list> `, {
142
144
  backdrop: true,
143
145
  help: 'data-set/ui/data-item-list',
144
146
  size: 'large',
145
147
  title: i18next.t('title.data-item list')
146
148
  })
149
+ popup.onclosed = () => {
150
+ this.grist.fetch()
151
+ }
152
+ }
153
+ }
154
+ },
155
+ {
156
+ type: 'gutter',
157
+ gutterName: 'button',
158
+ icon: 'fact_check',
159
+ handlers: {
160
+ click: (columns, data, column, record, rowIndex) => {
161
+ openPopup(
162
+ html` <data-entry-form .dataSet=${record} style="background-color: white;"></data-entry-form> `,
163
+ {
164
+ backdrop: true,
165
+ size: 'large',
166
+ title: i18next.t('title.data-entry-form')
167
+ }
168
+ )
147
169
  }
148
170
  }
149
171
  },
@@ -178,15 +200,62 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
178
200
  record: {
179
201
  editable: true
180
202
  },
203
+ filter: true,
181
204
  sortable: true,
182
205
  width: 60
183
206
  },
184
207
  {
185
- type: 'json',
208
+ type: 'select',
209
+ name: 'type',
210
+ label: true,
211
+ header: i18next.t('field.type'),
212
+ record: {
213
+ editable: true,
214
+ options: [
215
+ {},
216
+ {
217
+ display: 'Manually Collected',
218
+ value: 'manual'
219
+ },
220
+ {
221
+ display: 'Automatically Collected',
222
+ value: 'automatic'
223
+ }
224
+ ]
225
+ },
226
+ sortable: true,
227
+ filter: true,
228
+ width: 60
229
+ },
230
+ {
231
+ type: 'select',
232
+ name: 'useCase',
233
+ label: true,
234
+ header: i18next.t('field.use-case'),
235
+ record: {
236
+ editable: true,
237
+ options: () => {
238
+ return ['', ...OxDataUseCase.getUseCaseNames()].map(name => {
239
+ return {
240
+ display: name,
241
+ value: name
242
+ }
243
+ })
244
+ }
245
+ },
246
+ sortable: true,
247
+ filter: true,
248
+ width: 80
249
+ },
250
+ {
251
+ type: 'partition-keys',
186
252
  name: 'partitionKeys',
187
253
  header: i18next.t('field.partition-keys'),
188
254
  record: {
189
- editable: true
255
+ editable: true,
256
+ options: {
257
+ objectified: true /* transfered as a object type */
258
+ }
190
259
  },
191
260
  width: 200
192
261
  },
@@ -196,7 +265,10 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
196
265
  label: true,
197
266
  header: i18next.t('field.schedule'),
198
267
  record: {
199
- editable: true
268
+ editable: true,
269
+ options: {
270
+ objectified: true
271
+ }
200
272
  },
201
273
  width: 80,
202
274
  label: true
@@ -212,7 +284,20 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
212
284
  width: 120
213
285
  },
214
286
  {
215
- type: 'object',
287
+ type: 'resource-object',
288
+ name: 'supervisoryRole',
289
+ header: i18next.t('field.supervisory-role'),
290
+ record: {
291
+ editable: true,
292
+ options: {
293
+ queryName: 'roles'
294
+ }
295
+ },
296
+ sortable: true,
297
+ width: 120
298
+ },
299
+ {
300
+ type: 'resource-object',
216
301
  name: 'updater',
217
302
  header: i18next.t('field.updater'),
218
303
  record: {
@@ -271,8 +356,14 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
271
356
  partitionKeys
272
357
  slugger
273
358
  active
359
+ type
360
+ useCase
274
361
  schedule
275
362
  timezone
363
+ supervisoryRole {
364
+ id
365
+ name
366
+ }
276
367
  updater {
277
368
  id
278
369
  name
@@ -283,7 +374,10 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
283
374
  description
284
375
  sequence
285
376
  active
377
+ tag
286
378
  type
379
+ unit
380
+ options
287
381
  quota
288
382
  spec
289
383
  }
@@ -330,13 +424,6 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
330
424
  }
331
425
  }
332
426
 
333
- async stateChanged(state) {
334
- if (this.active && this._currentPopupName && !state.layout.viewparts[this._currentPopupName]) {
335
- this.grist.fetch()
336
- this._currentPopupName = null
337
- }
338
- }
339
-
340
427
  async _copyDataSet() {
341
428
  var selected = this.grist.selected
342
429
  if (selected.length == 0) return
@@ -355,7 +442,9 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
355
442
  }
356
443
  })
357
444
 
358
- if (!response.errors) this.grist.fetch()
445
+ if (!response.errors) {
446
+ this.grist.fetch()
447
+ }
359
448
  }
360
449
 
361
450
  async _updateDataSet() {
@@ -386,13 +475,25 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
386
475
  }
387
476
  })
388
477
 
389
- if (!response.errors) this.grist.fetch()
478
+ if (!response.errors) {
479
+ this.grist.fetch()
480
+ }
390
481
  }
391
482
  }
392
483
 
393
484
  async exportHandler() {
394
485
  const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records
395
- const targetFieldSet = new Set(['id', 'name', 'type', 'description', 'schedule', 'timezone', 'active', 'dataItems'])
486
+ const targetFieldSet = new Set([
487
+ 'id',
488
+ 'name',
489
+ 'type',
490
+ 'description',
491
+ 'tag',
492
+ 'schedule',
493
+ 'timezone',
494
+ 'active',
495
+ 'dataItems'
496
+ ])
396
497
 
397
498
  return exportTargets.map(dataSet => {
398
499
  let tempObj = {}
@@ -408,11 +509,11 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
408
509
  openPopup(
409
510
  html`
410
511
  <data-set-importer
411
- .dataSets="${records}"
412
- @imported="${() => {
512
+ .dataSets=${records}
513
+ @imported=${() => {
413
514
  history.back()
414
515
  this.grist.fetch()
415
- }}"
516
+ }}
416
517
  ></data-set-importer>
417
518
  `,
418
519
  {
package/client/route.js CHANGED
@@ -11,5 +11,9 @@ export default function route(page) {
11
11
  case 'data-sample':
12
12
  import('./pages/data-sample')
13
13
  return page
14
+
15
+ case 'data-ooc':
16
+ import('./pages/data-ooc')
17
+ return page
14
18
  }
15
19
  }