@things-factory/dataset 5.0.0-alpha.9 → 5.0.0-y.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 (105) hide show
  1. package/README.md +9 -0
  2. package/assets/data-samples.jpg +0 -0
  3. package/client/bootstrap.js +21 -1
  4. package/client/pages/{data-entry-form.js → data-entry/data-entry-form.js} +15 -3
  5. package/client/pages/data-entry/data-entry-list-page.js +423 -0
  6. package/client/pages/data-ooc/data-ooc-list-page.js +483 -0
  7. package/client/pages/data-ooc/data-ooc-view.js +183 -0
  8. package/client/pages/data-report/data-report-embed-page.js +113 -0
  9. package/client/pages/data-report/data-report-list-page.js +465 -0
  10. package/client/pages/data-report/jasper-report-oocs-page.js +122 -0
  11. package/client/pages/data-report/jasper-report-samples-crosstab-page.js +122 -0
  12. package/client/pages/data-report/jasper-report-samples-page.js +122 -0
  13. package/client/pages/data-sample/data-sample-list-page.js +386 -0
  14. package/client/pages/data-sample/data-sample-view.js +98 -0
  15. package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +43 -64
  16. package/client/pages/{data-item-list.js → data-set/data-item-list.js} +35 -10
  17. package/client/pages/{data-set-importer.js → data-set/data-set-importer.js} +0 -0
  18. package/client/pages/data-set/data-set-list-page.js +743 -0
  19. package/client/route.js +34 -6
  20. package/config/config.development.js +13 -0
  21. package/config/config.production.js +1 -0
  22. package/dist-server/controllers/create-data-sample.js +133 -0
  23. package/dist-server/controllers/create-data-sample.js.map +1 -0
  24. package/dist-server/controllers/data-use-case.js +57 -0
  25. package/dist-server/controllers/data-use-case.js.map +1 -0
  26. package/dist-server/controllers/index.js +18 -0
  27. package/dist-server/controllers/index.js.map +1 -1
  28. package/dist-server/controllers/jasper-report.js +156 -0
  29. package/dist-server/controllers/jasper-report.js.map +1 -0
  30. package/dist-server/index.js +1 -0
  31. package/dist-server/index.js.map +1 -1
  32. package/dist-server/routes.js +13 -24
  33. package/dist-server/routes.js.map +1 -1
  34. package/dist-server/service/data-item/data-item-query.js +6 -2
  35. package/dist-server/service/data-item/data-item-query.js.map +1 -1
  36. package/dist-server/service/data-item/data-item-type.js +15 -7
  37. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  38. package/dist-server/service/data-item/data-item.js +17 -3
  39. package/dist-server/service/data-item/data-item.js.map +1 -1
  40. package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
  41. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  42. package/dist-server/service/data-ooc/data-ooc-query.js +120 -0
  43. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  44. package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
  45. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  46. package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
  47. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  48. package/dist-server/service/data-ooc/data-ooc.js +237 -0
  49. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  50. package/dist-server/service/data-ooc/index.js +10 -0
  51. package/dist-server/service/data-ooc/index.js.map +1 -0
  52. package/dist-server/service/data-sample/data-sample-mutation.js +2 -138
  53. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  54. package/dist-server/service/data-sample/data-sample-query.js +7 -2
  55. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  56. package/dist-server/service/data-sample/data-sample-type.js +12 -42
  57. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  58. package/dist-server/service/data-sample/data-sample.js +34 -3
  59. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  60. package/dist-server/service/data-sensor/data-sensor-query.js +7 -2
  61. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  62. package/dist-server/service/data-set/data-set-mutation.js +40 -14
  63. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  64. package/dist-server/service/data-set/data-set-query.js +189 -3
  65. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  66. package/dist-server/service/data-set/data-set-type.js +84 -3
  67. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  68. package/dist-server/service/data-set/data-set.js +110 -15
  69. package/dist-server/service/data-set/data-set.js.map +1 -1
  70. package/dist-server/service/index.js +6 -2
  71. package/dist-server/service/index.js.map +1 -1
  72. package/package.json +19 -13
  73. package/server/controllers/create-data-sample.ts +177 -0
  74. package/server/controllers/data-use-case.ts +85 -0
  75. package/server/controllers/index.ts +2 -0
  76. package/server/controllers/jasper-report.ts +170 -0
  77. package/server/index.ts +1 -0
  78. package/server/routes.ts +21 -31
  79. package/server/service/data-item/data-item-query.ts +8 -3
  80. package/server/service/data-item/data-item-type.ts +10 -6
  81. package/server/service/data-item/data-item.ts +15 -4
  82. package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
  83. package/server/service/data-ooc/data-ooc-query.ts +69 -0
  84. package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
  85. package/server/service/data-ooc/data-ooc-type.ts +68 -0
  86. package/server/service/data-ooc/data-ooc.ts +204 -0
  87. package/server/service/data-ooc/index.ts +7 -0
  88. package/server/service/data-sample/data-sample-mutation.ts +3 -168
  89. package/server/service/data-sample/data-sample-query.ts +9 -3
  90. package/server/service/data-sample/data-sample-type.ts +7 -28
  91. package/server/service/data-sample/data-sample.ts +33 -3
  92. package/server/service/data-sensor/data-sensor-query.ts +9 -3
  93. package/server/service/data-set/data-set-mutation.ts +53 -14
  94. package/server/service/data-set/data-set-query.ts +164 -4
  95. package/server/service/data-set/data-set-type.ts +65 -4
  96. package/server/service/data-set/data-set.ts +100 -12
  97. package/server/service/index.ts +6 -2
  98. package/things-factory.config.js +35 -7
  99. package/translations/en.json +46 -3
  100. package/translations/ko.json +45 -3
  101. package/translations/ms.json +44 -3
  102. package/translations/zh.json +44 -3
  103. package/client/pages/data-sample.js +0 -307
  104. package/client/pages/data-set.js +0 -457
  105. package/yarn-error.log +0 -23244
@@ -1,457 +0,0 @@
1
- import '@operato/data-grist'
2
- import './data-item-list'
3
- import './data-set-importer'
4
- import './data-entry-form'
5
-
6
- import gql from 'graphql-tag'
7
- import { css, html } from 'lit'
8
- import moment from 'moment-timezone'
9
- import { connect } from 'pwa-helpers/connect-mixin'
10
-
11
- import { client } from '@operato/graphql'
12
- import { i18next, localize } from '@operato/i18n'
13
- import { notify, openPopup } from '@operato/layout'
14
- import { PageView, store } from '@operato/shell'
15
- import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
16
- import { isMobileDevice } from '@operato/utils'
17
-
18
- export class DataSet extends connect(store)(localize(i18next)(PageView)) {
19
- static get properties() {
20
- return {
21
- active: String,
22
- gristConfig: Object
23
- }
24
- }
25
-
26
- static get styles() {
27
- return [
28
- ScrollbarStyles,
29
- css`
30
- :host {
31
- display: flex;
32
- flex-direction: column;
33
-
34
- overflow: hidden;
35
- }
36
-
37
- ox-grist {
38
- overflow-y: auto;
39
- flex: 1;
40
- }
41
-
42
- #filters {
43
- display: flex;
44
- flex-direction: row;
45
- justify-content: space-between;
46
-
47
- background-color: white;
48
- }
49
-
50
- #filters > * {
51
- padding: var(--padding-default) var(--padding-wide);
52
- }
53
- `
54
- ]
55
- }
56
-
57
- get context() {
58
- return {
59
- title: i18next.t('title.data-set list'),
60
- help: 'integration/ui/data-set',
61
- actions: [
62
- {
63
- title: i18next.t('button.copy'),
64
- action: this._copyDataSet.bind(this),
65
- ...CommonButtonStyles.copy
66
- },
67
- {
68
- title: i18next.t('button.save'),
69
- action: this._updateDataSet.bind(this),
70
- ...CommonButtonStyles.save
71
- },
72
- {
73
- title: i18next.t('button.delete'),
74
- action: this._deleteDataSet.bind(this),
75
- ...CommonButtonStyles.delete
76
- }
77
- ],
78
- exportable: {
79
- name: i18next.t('title.data-set list'),
80
- data: this.exportHandler.bind(this)
81
- },
82
- importable: {
83
- handler: this.importHandler.bind(this)
84
- }
85
- }
86
- }
87
-
88
- render() {
89
- return html`
90
- <ox-grist
91
- .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
92
- .config=${this.gristConfig}
93
- .fetchHandler=${this.fetchHandler.bind(this)}
94
- >
95
- <div slot="headroom" id="filters">
96
- <ox-filters-form></ox-filters-form>
97
- </div>
98
- </ox-grist>
99
- `
100
- }
101
-
102
- get grist() {
103
- return this.renderRoot.querySelector('ox-grist')
104
- }
105
-
106
- // update with url params value
107
- _updateSearchConfig(lifecycle) {
108
- // this.searchConfig = this.searchConfig.map(conf => {
109
- // if (conf.name in lifecycle.params) {
110
- // conf.value = lifecycle.params[conf.name]
111
- // } else {
112
- // delete conf.value
113
- // }
114
- // return conf
115
- // })
116
- }
117
-
118
- // set default field value to record with searchConfig
119
- _setDefaultFieldsValue(fields) {
120
- // this.searchConfig.forEach(conf => {
121
- // if (!fields[conf.name] && conf.value) {
122
- // fields[conf.name] = conf.value
123
- // }
124
- // })
125
- }
126
-
127
- async pageInitialized(lifecycle) {
128
- this._updateSearchConfig(lifecycle)
129
-
130
- this.gristConfig = {
131
- list: { fields: ['name', 'description', 'schedule', 'active'] },
132
- columns: [
133
- { type: 'gutter', gutterName: 'sequence' },
134
- { type: 'gutter', gutterName: 'row-selector', multiple: true },
135
- {
136
- type: 'gutter',
137
- gutterName: 'button',
138
- icon: 'reorder',
139
- handlers: {
140
- click: (columns, data, column, record, rowIndex) => {
141
- if (!record.id) return
142
- openPopup(html` <data-item-list .dataSet=${record}></data-item-list> `, {
143
- backdrop: true,
144
- help: 'data-set/ui/data-item-list',
145
- size: 'large',
146
- title: i18next.t('title.data-item list')
147
- })
148
- }
149
- }
150
- },
151
- {
152
- type: 'gutter',
153
- gutterName: 'button',
154
- icon: 'fact_check',
155
- handlers: {
156
- click: (columns, data, column, record, rowIndex) => {
157
- openPopup(
158
- html` <data-entry-form .dataSet=${record} style="background-color: white;"></data-entry-form> `,
159
- {
160
- backdrop: true,
161
- size: 'large',
162
- title: i18next.t('title.data-entry-form')
163
- }
164
- )
165
- }
166
- }
167
- },
168
- {
169
- type: 'string',
170
- name: 'name',
171
- label: true,
172
- header: i18next.t('field.name'),
173
- record: {
174
- editable: true
175
- },
176
- filter: 'search',
177
- sortable: true,
178
- width: 150
179
- },
180
- {
181
- type: 'string',
182
- name: 'description',
183
- label: true,
184
- header: i18next.t('field.description'),
185
- record: {
186
- editable: true
187
- },
188
- filter: 'search',
189
- width: 200
190
- },
191
- {
192
- type: 'checkbox',
193
- name: 'active',
194
- label: true,
195
- header: i18next.t('field.active'),
196
- record: {
197
- editable: true
198
- },
199
- sortable: true,
200
- width: 60
201
- },
202
- {
203
- type: 'json',
204
- name: 'partitionKeys',
205
- header: i18next.t('field.partitionKeys'),
206
- record: {
207
- editable: true
208
- },
209
- width: 200
210
- },
211
- {
212
- type: 'crontab',
213
- name: 'schedule',
214
- label: true,
215
- header: i18next.t('field.schedule'),
216
- record: {
217
- editable: true
218
- },
219
- width: 80,
220
- label: true
221
- },
222
- {
223
- type: 'select',
224
- name: 'timezone',
225
- header: i18next.t('field.timezone'),
226
- record: {
227
- editable: true,
228
- options: ['', ...moment.tz.names()]
229
- },
230
- width: 120
231
- },
232
- {
233
- type: 'resource-object',
234
- name: 'updater',
235
- header: i18next.t('field.updater'),
236
- record: {
237
- editable: false
238
- },
239
- sortable: true,
240
- width: 120
241
- },
242
- {
243
- type: 'datetime',
244
- name: 'updatedAt',
245
- header: i18next.t('field.updated_at'),
246
- record: {
247
- editable: false
248
- },
249
- sortable: true,
250
- width: 180
251
- }
252
- ],
253
- rows: {
254
- selectable: {
255
- multiple: true
256
- }
257
- },
258
- sorters: [
259
- {
260
- name: 'name'
261
- }
262
- ]
263
- }
264
-
265
- await this.updateComplete
266
-
267
- this.grist.fetch()
268
- }
269
-
270
- async pageUpdated(changes, lifecycle) {
271
- if (this.active) {
272
- // update with url params value
273
- this._updateSearchConfig(lifecycle)
274
- await this.updateComplete
275
-
276
- this.grist.fetch()
277
- }
278
- }
279
-
280
- async fetchHandler({ page, limit, sortings = [], filters = [] }) {
281
- const response = await client.query({
282
- query: gql`
283
- query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
284
- responses: dataSets(filters: $filters, pagination: $pagination, sortings: $sortings) {
285
- items {
286
- id
287
- name
288
- description
289
- partitionKeys
290
- slugger
291
- active
292
- schedule
293
- timezone
294
- updater {
295
- id
296
- name
297
- }
298
- updatedAt
299
- dataItems {
300
- name
301
- description
302
- sequence
303
- active
304
- tag
305
- type
306
- options
307
- quota
308
- spec
309
- }
310
- }
311
- total
312
- }
313
- }
314
- `,
315
- variables: {
316
- filters,
317
- pagination: { page, limit },
318
- sortings
319
- }
320
- })
321
-
322
- return {
323
- total: response.data.responses.total || 0,
324
- records: response.data.responses.items || []
325
- }
326
- }
327
-
328
- async _deleteDataSet() {
329
- if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
330
- const ids = this.grist.selected.map(record => record.id)
331
- if (ids && ids.length > 0) {
332
- const response = await client.mutate({
333
- mutation: gql`
334
- mutation ($ids: [String!]!) {
335
- deleteDataSets(ids: $ids)
336
- }
337
- `,
338
- variables: {
339
- ids
340
- }
341
- })
342
-
343
- if (!response.errors) {
344
- this.grist.fetch()
345
- notify({
346
- message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
347
- })
348
- }
349
- }
350
- }
351
- }
352
-
353
- async stateChanged(state) {
354
- if (this.active && this._currentPopupName && !state.layout.viewparts[this._currentPopupName]) {
355
- this.grist.fetch()
356
- this._currentPopupName = null
357
- }
358
- }
359
-
360
- async _copyDataSet() {
361
- var selected = this.grist.selected
362
- if (selected.length == 0) return
363
-
364
- if (!confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.copy') }))) return
365
- var response = await client.mutate({
366
- mutation: gql`
367
- mutation ($ids: [String!]!) {
368
- copyDataSets(ids: $ids) {
369
- id
370
- }
371
- }
372
- `,
373
- variables: {
374
- ids: selected.map(r => r.id)
375
- }
376
- })
377
-
378
- if (!response.errors) this.grist.fetch()
379
- }
380
-
381
- async _updateDataSet() {
382
- let patches = this.grist.dirtyRecords
383
- if (patches && patches.length) {
384
- patches = patches.map(patch => {
385
- let patchField = patch.id ? { id: patch.id } : {}
386
- const dirtyFields = patch.__dirtyfields__
387
- for (let key in dirtyFields) {
388
- patchField[key] = dirtyFields[key].after
389
- }
390
- this._setDefaultFieldsValue(patchField)
391
- patchField.cuFlag = patch.__dirty__
392
-
393
- return patchField
394
- })
395
-
396
- const response = await client.mutate({
397
- mutation: gql`
398
- mutation ($patches: [DataSetPatch!]!) {
399
- updateMultipleDataSet(patches: $patches) {
400
- name
401
- }
402
- }
403
- `,
404
- variables: {
405
- patches
406
- }
407
- })
408
-
409
- if (!response.errors) this.grist.fetch()
410
- }
411
- }
412
-
413
- async exportHandler() {
414
- const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records
415
- const targetFieldSet = new Set([
416
- 'id',
417
- 'name',
418
- 'type',
419
- 'description',
420
- 'tag',
421
- 'schedule',
422
- 'timezone',
423
- 'active',
424
- 'dataItems'
425
- ])
426
-
427
- return exportTargets.map(dataSet => {
428
- let tempObj = {}
429
- for (const field of targetFieldSet) {
430
- tempObj[field] = dataSet[field]
431
- }
432
-
433
- return tempObj
434
- })
435
- }
436
-
437
- async importHandler(records) {
438
- openPopup(
439
- html`
440
- <data-set-importer
441
- .dataSets=${records}
442
- @imported=${() => {
443
- history.back()
444
- this.grist.fetch()
445
- }}
446
- ></data-set-importer>
447
- `,
448
- {
449
- backdrop: true,
450
- size: 'large',
451
- title: i18next.t('title.import data-set')
452
- }
453
- )
454
- }
455
- }
456
-
457
- window.customElements.define('data-set-page', DataSet)