@things-factory/dataset 5.0.0-alpha.10 → 5.0.0-alpha.13
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 +8 -4
- package/client/pages/data-entry-form.js +11 -4
- package/client/pages/data-sample.js +66 -21
- package/client/pages/data-sensor.js +6 -13
- package/client/pages/data-set.js +28 -21
- package/dist-server/service/data-sample/data-sample-mutation.js +4 -2
- package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
- package/package.json +15 -13
- package/server/service/data-sample/data-sample-mutation.ts +5 -2
- package/translations/en.json +2 -1
- package/translations/ko.json +2 -1
- package/translations/ms.json +2 -1
- package/translations/zh.json +2 -1
package/client/bootstrap.js
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
import {
|
2
|
-
|
2
|
+
OxGristRendererJson5,
|
3
3
|
registerEditor as registerGristEditor,
|
4
4
|
registerRenderer as registerGristRenderer
|
5
5
|
} from '@operato/data-grist'
|
6
6
|
|
7
|
-
import {
|
7
|
+
import { OxGristEditorDataItemSpec } from '@operato/dataset/grist-editor'
|
8
|
+
import { OxGristEditorPartitionKeys } from '@operato/app/grist-editor/ox-grist-editor-partition-keys.js'
|
8
9
|
|
9
10
|
export default function bootstrap() {
|
10
|
-
registerGristEditor('data-item-spec',
|
11
|
-
registerGristRenderer('data-item-spec',
|
11
|
+
registerGristEditor('data-item-spec', OxGristEditorDataItemSpec)
|
12
|
+
registerGristRenderer('data-item-spec', OxGristRendererJson5)
|
13
|
+
|
14
|
+
registerGristEditor('partition-keys', OxGristEditorPartitionKeys)
|
15
|
+
registerGristRenderer('partition-keys', OxGristRendererJson5)
|
12
16
|
}
|
@@ -1,9 +1,10 @@
|
|
1
|
-
import
|
2
|
-
import { css, html, LitElement } from 'lit'
|
1
|
+
import '@operato/dataset/ox-data-entry-form.js'
|
3
2
|
|
4
|
-
import {
|
3
|
+
import { LitElement, css, html } from 'lit'
|
5
4
|
import { i18next, localize } from '@operato/i18n'
|
6
|
-
|
5
|
+
|
6
|
+
import { client } from '@operato/graphql'
|
7
|
+
import gql from 'graphql-tag'
|
7
8
|
|
8
9
|
class DataEntryForm extends localize(i18next)(LitElement) {
|
9
10
|
static get properties() {
|
@@ -69,6 +70,12 @@ class DataEntryForm extends localize(i18next)(LitElement) {
|
|
69
70
|
dataSample
|
70
71
|
}
|
71
72
|
})
|
73
|
+
|
74
|
+
if (!response.errors) {
|
75
|
+
document.dispatchEvent(
|
76
|
+
new CustomEvent('notify', { detail: { message: i18next.t('text.data sample created successfully') } })
|
77
|
+
)
|
78
|
+
}
|
72
79
|
}
|
73
80
|
}
|
74
81
|
|
@@ -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() {
|
@@ -60,7 +60,11 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
60
60
|
action: this._deleteDataSample.bind(this),
|
61
61
|
...CommonButtonStyles.delete
|
62
62
|
}
|
63
|
-
]
|
63
|
+
],
|
64
|
+
exportable: {
|
65
|
+
name: i18next.t('title.data-sample list'),
|
66
|
+
data: this._exportableData.bind(this)
|
67
|
+
}
|
64
68
|
}
|
65
69
|
}
|
66
70
|
|
@@ -121,7 +125,8 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
121
125
|
},
|
122
126
|
filter: 'search',
|
123
127
|
sortable: true,
|
124
|
-
width: 120
|
128
|
+
width: 120,
|
129
|
+
imex: true
|
125
130
|
},
|
126
131
|
{
|
127
132
|
type: 'string',
|
@@ -132,7 +137,8 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
132
137
|
editable: true
|
133
138
|
},
|
134
139
|
filter: 'search',
|
135
|
-
width: 150
|
140
|
+
width: 150,
|
141
|
+
imex: true
|
136
142
|
},
|
137
143
|
{
|
138
144
|
type: 'resource-object',
|
@@ -142,16 +148,18 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
142
148
|
editable: false
|
143
149
|
},
|
144
150
|
sortable: true,
|
145
|
-
width: 120
|
151
|
+
width: 120,
|
152
|
+
imex: true
|
146
153
|
},
|
147
154
|
{
|
148
155
|
type: 'json5',
|
149
156
|
name: 'partitionKeys',
|
150
|
-
header: i18next.t('field.
|
157
|
+
header: i18next.t('field.partition-keys'),
|
151
158
|
record: {
|
152
159
|
editable: false
|
153
160
|
},
|
154
|
-
width: 200
|
161
|
+
width: 200,
|
162
|
+
imex: true
|
155
163
|
},
|
156
164
|
{
|
157
165
|
type: 'json5',
|
@@ -160,7 +168,8 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
160
168
|
record: {
|
161
169
|
editable: false
|
162
170
|
},
|
163
|
-
width: 200
|
171
|
+
width: 200,
|
172
|
+
imex: true
|
164
173
|
},
|
165
174
|
{
|
166
175
|
type: 'json5',
|
@@ -178,28 +187,32 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
178
187
|
record: {
|
179
188
|
editable: false
|
180
189
|
},
|
181
|
-
width: 200
|
190
|
+
width: 200,
|
191
|
+
imex: true
|
182
192
|
},
|
183
193
|
{
|
184
194
|
type: 'resource-object',
|
185
195
|
name: 'updater',
|
186
196
|
header: i18next.t('field.updater'),
|
187
197
|
sortable: true,
|
188
|
-
width: 120
|
198
|
+
width: 120,
|
199
|
+
imex: true
|
189
200
|
},
|
190
201
|
{
|
191
202
|
type: 'datetime',
|
192
203
|
name: 'updatedAt',
|
193
204
|
header: i18next.t('field.updated_at'),
|
194
205
|
sortable: true,
|
195
|
-
width: 180
|
206
|
+
width: 180,
|
207
|
+
imex: true
|
196
208
|
},
|
197
209
|
{
|
198
210
|
type: 'datetime',
|
199
211
|
name: 'collectedAt',
|
200
212
|
header: i18next.t('field.collected_at'),
|
201
213
|
sortable: true,
|
202
|
-
width: 180
|
214
|
+
width: 180,
|
215
|
+
imex: true
|
203
216
|
}
|
204
217
|
],
|
205
218
|
rows: {
|
@@ -296,11 +309,43 @@ export class DataSample extends connect(store)(localize(i18next)(PageView)) {
|
|
296
309
|
}
|
297
310
|
}
|
298
311
|
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
312
|
+
_exportableData() {
|
313
|
+
let records = []
|
314
|
+
if (this.grist.selected && this.grist.selected.length > 0) {
|
315
|
+
records = this.grist.selected
|
316
|
+
} else {
|
317
|
+
records = this.grist.data.records
|
303
318
|
}
|
319
|
+
|
320
|
+
var headerSetting = this.grist.compiledConfig.columns
|
321
|
+
.filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
|
322
|
+
.map(column => {
|
323
|
+
return column.imex === true
|
324
|
+
? {
|
325
|
+
header: column.header.renderer(),
|
326
|
+
key: column.name,
|
327
|
+
width: column.width,
|
328
|
+
type: column.type
|
329
|
+
}
|
330
|
+
: column.imex
|
331
|
+
})
|
332
|
+
|
333
|
+
var data = records.map(item => {
|
334
|
+
return {
|
335
|
+
id: item.id,
|
336
|
+
...this.gristConfig.columns
|
337
|
+
.filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
|
338
|
+
.reduce((record, column) => {
|
339
|
+
const key = column.imex === true ? column.name : column.imex.key
|
340
|
+
record[key] = key
|
341
|
+
.split('.')
|
342
|
+
.reduce((obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), item)
|
343
|
+
return record
|
344
|
+
}, {})
|
345
|
+
}
|
346
|
+
})
|
347
|
+
|
348
|
+
return { header: headerSetting, data: data }
|
304
349
|
}
|
305
350
|
}
|
306
351
|
|
@@ -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 DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
15
15
|
static get properties() {
|
@@ -382,13 +382,6 @@ export class DataSensor extends connect(store)(localize(i18next)(PageView)) {
|
|
382
382
|
}
|
383
383
|
}
|
384
384
|
|
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
385
|
async _copyDataSensor() {
|
393
386
|
var selected = this.grist.selected
|
394
387
|
if (selected.length == 0) return
|
package/client/pages/data-set.js
CHANGED
@@ -3,17 +3,17 @@ import './data-item-list'
|
|
3
3
|
import './data-set-importer'
|
4
4
|
import './data-entry-form'
|
5
5
|
|
6
|
-
import
|
6
|
+
import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
|
7
|
+
import { PageView, store } from '@operato/shell'
|
7
8
|
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
9
|
import { i18next, localize } from '@operato/i18n'
|
13
10
|
import { notify, openPopup } from '@operato/layout'
|
14
|
-
|
15
|
-
import {
|
11
|
+
|
12
|
+
import { client } from '@operato/graphql'
|
13
|
+
import { connect } from 'pwa-helpers/connect-mixin'
|
14
|
+
import gql from 'graphql-tag'
|
16
15
|
import { isMobileDevice } from '@operato/utils'
|
16
|
+
import moment from 'moment-timezone'
|
17
17
|
|
18
18
|
export class DataSet extends connect(store)(localize(i18next)(PageView)) {
|
19
19
|
static get properties() {
|
@@ -139,12 +139,15 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
|
|
139
139
|
handlers: {
|
140
140
|
click: (columns, data, column, record, rowIndex) => {
|
141
141
|
if (!record.id) return
|
142
|
-
openPopup(html` <data-item-list .dataSet=${record}></data-item-list> `, {
|
142
|
+
const popup = openPopup(html` <data-item-list .dataSet=${record}></data-item-list> `, {
|
143
143
|
backdrop: true,
|
144
144
|
help: 'data-set/ui/data-item-list',
|
145
145
|
size: 'large',
|
146
146
|
title: i18next.t('title.data-item list')
|
147
147
|
})
|
148
|
+
popup.onclosed = () => {
|
149
|
+
this.grist.fetch()
|
150
|
+
}
|
148
151
|
}
|
149
152
|
}
|
150
153
|
},
|
@@ -200,11 +203,14 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
|
|
200
203
|
width: 60
|
201
204
|
},
|
202
205
|
{
|
203
|
-
type: '
|
206
|
+
type: 'partition-keys',
|
204
207
|
name: 'partitionKeys',
|
205
|
-
header: i18next.t('field.
|
208
|
+
header: i18next.t('field.partition-keys'),
|
206
209
|
record: {
|
207
|
-
editable: true
|
210
|
+
editable: true,
|
211
|
+
options: {
|
212
|
+
objectified: true /* transfered as a object type */
|
213
|
+
}
|
208
214
|
},
|
209
215
|
width: 200
|
210
216
|
},
|
@@ -214,7 +220,10 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
|
|
214
220
|
label: true,
|
215
221
|
header: i18next.t('field.schedule'),
|
216
222
|
record: {
|
217
|
-
editable: true
|
223
|
+
editable: true,
|
224
|
+
options: {
|
225
|
+
objectified: true
|
226
|
+
}
|
218
227
|
},
|
219
228
|
width: 80,
|
220
229
|
label: true
|
@@ -303,6 +312,7 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
|
|
303
312
|
active
|
304
313
|
tag
|
305
314
|
type
|
315
|
+
unit
|
306
316
|
options
|
307
317
|
quota
|
308
318
|
spec
|
@@ -350,13 +360,6 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
|
|
350
360
|
}
|
351
361
|
}
|
352
362
|
|
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
363
|
async _copyDataSet() {
|
361
364
|
var selected = this.grist.selected
|
362
365
|
if (selected.length == 0) return
|
@@ -375,7 +378,9 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
|
|
375
378
|
}
|
376
379
|
})
|
377
380
|
|
378
|
-
if (!response.errors)
|
381
|
+
if (!response.errors) {
|
382
|
+
this.grist.fetch()
|
383
|
+
}
|
379
384
|
}
|
380
385
|
|
381
386
|
async _updateDataSet() {
|
@@ -406,7 +411,9 @@ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
|
|
406
411
|
}
|
407
412
|
})
|
408
413
|
|
409
|
-
if (!response.errors)
|
414
|
+
if (!response.errors) {
|
415
|
+
this.grist.fetch()
|
416
|
+
}
|
410
417
|
}
|
411
418
|
}
|
412
419
|
|
@@ -35,7 +35,7 @@ const replaceVariables = (keys, dic) => {
|
|
35
35
|
}
|
36
36
|
return keys;
|
37
37
|
};
|
38
|
-
// It is required UTC date for Partitioning File System like AWS S3.
|
38
|
+
// It is required UTC date for Partitioning File System like AWS S3 from Athena.
|
39
39
|
// ex) %YYYY, %MM, %DD
|
40
40
|
const formatDate = (keys, _moment) => {
|
41
41
|
for (const k in keys) {
|
@@ -64,10 +64,12 @@ let DataSampleMutation = class DataSampleMutation {
|
|
64
64
|
spec[dataItem.tag] = Object.assign(Object.assign({}, dataItem.spec), { name: dataItem.name /* do we need ? */ });
|
65
65
|
return spec;
|
66
66
|
}, {});
|
67
|
+
// appending spec to data for reporting and optimizing AWS Athena search
|
68
|
+
dataSample.data = Object.assign(Object.assign({}, dataSample.data), { _spec: JSON.stringify(spec) });
|
67
69
|
var partitionKeys = Object.assign({}, dataSet.partitionKeys);
|
68
70
|
const collectedAt = dataSample.collectedAt || new Date();
|
69
71
|
partitionKeys = formatDate(partitionKeys, (0, moment_1.default)(collectedAt).utc());
|
70
|
-
partitionKeys = replaceVariables(partitionKeys, Object.assign({
|
72
|
+
partitionKeys = replaceVariables(partitionKeys, Object.assign({ domain: domain.subdomain, dataSetId: dataSample.dataSetId }, dataSample.data));
|
71
73
|
return await tx.getRepository(data_sample_1.DataSample).save(Object.assign(Object.assign({ name: dataSet.name, description: dataSet.description }, dataSample), { domain,
|
72
74
|
partitionKeys,
|
73
75
|
spec,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"data-sample-mutation.js","sourceRoot":"","sources":["../../../server/service/data-sample/data-sample-mutation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,+CAAsE;AACtE,qCAA4B;AAE5B,sDAAiD;AACjD,mDAA8C;AAC9C,+CAA0C;AAC1C,yDAAmE;AAEnE,oDAA2B;AAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,yDAAyD,CAAC,CAAA;AAEzF,2CAA2C;AAC3C,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACrC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC3C,OAAO;YACL,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAClB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACnD,CAAC,CAAC,CAAA;KACL;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,
|
1
|
+
{"version":3,"file":"data-sample-mutation.js","sourceRoot":"","sources":["../../../server/service/data-sample/data-sample-mutation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@things-factory/dataset",
|
3
|
-
"version": "5.0.0-alpha.
|
3
|
+
"version": "5.0.0-alpha.13",
|
4
4
|
"main": "dist-server/index.js",
|
5
5
|
"browser": "client/index.js",
|
6
6
|
"things-factory": true,
|
@@ -24,17 +24,19 @@
|
|
24
24
|
"migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
|
25
25
|
},
|
26
26
|
"dependencies": {
|
27
|
-
"@operato/
|
28
|
-
"@operato/
|
29
|
-
"@operato/
|
30
|
-
"@operato/
|
31
|
-
"@operato/
|
32
|
-
"@operato/
|
33
|
-
"@operato/
|
34
|
-
"@operato/
|
35
|
-
"@
|
36
|
-
"@things-factory/
|
37
|
-
"@things-factory/
|
27
|
+
"@operato/app": "1.0.0-alpha.33",
|
28
|
+
"@operato/data-grist": "1.0.0-alpha.33",
|
29
|
+
"@operato/dataset": "1.0.0-alpha.33",
|
30
|
+
"@operato/graphql": "1.0.0-alpha.33",
|
31
|
+
"@operato/i18n": "1.0.0-alpha.33",
|
32
|
+
"@operato/layout": "1.0.0-alpha.33",
|
33
|
+
"@operato/shell": "1.0.0-alpha.33",
|
34
|
+
"@operato/styles": "1.0.0-alpha.33",
|
35
|
+
"@operato/utils": "1.0.0-alpha.33",
|
36
|
+
"@things-factory/auth-base": "^5.0.0-alpha.13",
|
37
|
+
"@things-factory/env": "^5.0.0-alpha.13",
|
38
|
+
"@things-factory/shell": "^5.0.0-alpha.13",
|
39
|
+
"moment": "^2.29.1"
|
38
40
|
},
|
39
|
-
"gitHead": "
|
41
|
+
"gitHead": "49704052461599b174959ff494abb9ef1facd887"
|
40
42
|
}
|
@@ -22,7 +22,7 @@ const replaceVariables = (keys, dic) => {
|
|
22
22
|
return keys
|
23
23
|
}
|
24
24
|
|
25
|
-
// It is required UTC date for Partitioning File System like AWS S3.
|
25
|
+
// It is required UTC date for Partitioning File System like AWS S3 from Athena.
|
26
26
|
// ex) %YYYY, %MM, %DD
|
27
27
|
const formatDate = (keys, _moment) => {
|
28
28
|
for (const k in keys) {
|
@@ -63,6 +63,9 @@ export class DataSampleMutation {
|
|
63
63
|
return spec
|
64
64
|
}, {})
|
65
65
|
|
66
|
+
// appending spec to data for reporting and optimizing AWS Athena search
|
67
|
+
dataSample.data = { ...dataSample.data, _spec: JSON.stringify(spec) }
|
68
|
+
|
66
69
|
var partitionKeys = {
|
67
70
|
...dataSet.partitionKeys
|
68
71
|
}
|
@@ -70,7 +73,7 @@ export class DataSampleMutation {
|
|
70
73
|
const collectedAt = dataSample.collectedAt || new Date()
|
71
74
|
partitionKeys = formatDate(partitionKeys, moment(collectedAt).utc())
|
72
75
|
partitionKeys = replaceVariables(partitionKeys, {
|
73
|
-
|
76
|
+
domain: domain.subdomain,
|
74
77
|
dataSetId: dataSample.dataSetId,
|
75
78
|
...dataSample.data
|
76
79
|
})
|
package/translations/en.json
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
"field.device-id": "device id",
|
7
7
|
"field.netmask": "network mask",
|
8
8
|
"field.options": "options",
|
9
|
-
"field.
|
9
|
+
"field.partition-keys": "partition keys",
|
10
10
|
"field.quota": "sampling #",
|
11
11
|
"field.raw-data": "raw data",
|
12
12
|
"field.ref-by": "ref. by",
|
@@ -14,6 +14,7 @@
|
|
14
14
|
"field.spec": "spec",
|
15
15
|
"field.tag": "tag name",
|
16
16
|
"field.unit": "unit",
|
17
|
+
"text.data sample created successfully": "a data sample created successfully",
|
17
18
|
"title.data-entry-form": "data entry form",
|
18
19
|
"title.data-item list": "data item list",
|
19
20
|
"title.data-sample list": "data sample list",
|
package/translations/ko.json
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
"field.device-id": "디바이스 아이디",
|
7
7
|
"field.netmask": "네트워크마스크",
|
8
8
|
"field.options": "선택옵션",
|
9
|
-
"field.
|
9
|
+
"field.partition-keys": "파티션 키",
|
10
10
|
"field.quota": "샘플수",
|
11
11
|
"field.raw-data": "데이타 원본",
|
12
12
|
"field.ref-by": "참조아이템",
|
@@ -14,6 +14,7 @@
|
|
14
14
|
"field.spec": "명세",
|
15
15
|
"field.tag": "태그이름",
|
16
16
|
"field.unit": "단위",
|
17
|
+
"text.data sample created successfully": "데이타 샘플이 성공적으로 생성되었습니다",
|
17
18
|
"title.data-entry-form": "데이타 입력",
|
18
19
|
"title.data-item list": "데이타 아이템 조회",
|
19
20
|
"title.data-sample list": "데이타 샘플 조회",
|
package/translations/ms.json
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
"field.device-id": "device id",
|
7
7
|
"field.netmask": "network mask",
|
8
8
|
"field.options": "options",
|
9
|
-
"field.
|
9
|
+
"field.partition-keys": "partition keys",
|
10
10
|
"field.quota": "sampling #",
|
11
11
|
"field.raw-data": "raw data",
|
12
12
|
"field.ref-by": "ref. by",
|
@@ -14,6 +14,7 @@
|
|
14
14
|
"field.spec": "spec",
|
15
15
|
"field.tag": "tag name",
|
16
16
|
"field.unit": "unit",
|
17
|
+
"text.data sample created successfully": "a data sample created successfully",
|
17
18
|
"title.data-entry-form": "data entry form",
|
18
19
|
"title.data-item list": "data item list",
|
19
20
|
"title.data-sample list": "data sample list",
|
package/translations/zh.json
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
"field.device-id": "device id",
|
7
7
|
"field.netmask": "network mask",
|
8
8
|
"field.options": "options",
|
9
|
-
"field.
|
9
|
+
"field.partition-keys": "partition keys",
|
10
10
|
"field.quota": "sampling #",
|
11
11
|
"field.raw-data": "raw data",
|
12
12
|
"field.ref-by": "ref. by",
|
@@ -14,6 +14,7 @@
|
|
14
14
|
"field.spec": "spec",
|
15
15
|
"field.tag": "tag name",
|
16
16
|
"field.unit": "unit",
|
17
|
+
"text.data sample created successfully": "a data sample created successfully",
|
17
18
|
"title.data-entry-form": "data entry form",
|
18
19
|
"title.data-item list": "data item list",
|
19
20
|
"title.data-sample list": "data sample list",
|