@things-factory/dataset 5.0.0-alpha.3 → 5.0.0-alpha.30

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 (98) hide show
  1. package/README.md +13 -0
  2. package/assets/data-samples.jpg +0 -0
  3. package/client/bootstrap.js +16 -1
  4. package/client/pages/data-entry/data-entry-form.js +85 -0
  5. package/client/pages/data-entry/data-entry-list-page.js +464 -0
  6. package/client/pages/data-ooc/data-ooc-list-page.js +488 -0
  7. package/client/pages/data-ooc/data-ooc-view.js +182 -0
  8. package/client/pages/{data-sample.js → data-sample/data-sample-list-page.js} +153 -59
  9. package/client/pages/data-sample/data-sample-view.js +97 -0
  10. package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +11 -16
  11. package/client/pages/{data-item-list.js → data-set/data-item-list.js} +70 -16
  12. package/client/pages/{data-set-importer.js → data-set/data-set-importer.js} +0 -0
  13. package/client/pages/{data-set.js → data-set/data-set-list-page.js} +282 -76
  14. package/client/route.js +14 -6
  15. package/dist-server/controllers/create-data-sample.js +133 -0
  16. package/dist-server/controllers/create-data-sample.js.map +1 -0
  17. package/dist-server/controllers/data-use-case.js +57 -0
  18. package/dist-server/controllers/data-use-case.js.map +1 -0
  19. package/dist-server/controllers/index.js +17 -0
  20. package/dist-server/controllers/index.js.map +1 -1
  21. package/dist-server/index.js +2 -0
  22. package/dist-server/index.js.map +1 -1
  23. package/dist-server/routes.js +9 -24
  24. package/dist-server/routes.js.map +1 -1
  25. package/dist-server/service/data-item/data-item-mutation.js +5 -1
  26. package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
  27. package/dist-server/service/data-item/data-item-type.js +18 -6
  28. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  29. package/dist-server/service/data-item/data-item.js +27 -7
  30. package/dist-server/service/data-item/data-item.js.map +1 -1
  31. package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
  32. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  33. package/dist-server/service/data-ooc/data-ooc-query.js +115 -0
  34. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  35. package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
  36. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  37. package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
  38. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  39. package/dist-server/service/data-ooc/data-ooc.js +237 -0
  40. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  41. package/dist-server/service/data-ooc/index.js +10 -0
  42. package/dist-server/service/data-ooc/index.js.map +1 -0
  43. package/dist-server/service/data-sample/data-sample-mutation.js +3 -105
  44. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  45. package/dist-server/service/data-sample/data-sample-type.js +12 -42
  46. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  47. package/dist-server/service/data-sample/data-sample.js +34 -3
  48. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  49. package/dist-server/service/data-set/data-set-mutation.js +1 -2
  50. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  51. package/dist-server/service/data-set/data-set-query.js +110 -1
  52. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  53. package/dist-server/service/data-set/data-set-type.js +48 -4
  54. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  55. package/dist-server/service/data-set/data-set.js +59 -15
  56. package/dist-server/service/data-set/data-set.js.map +1 -1
  57. package/dist-server/service/data-spec/data-spec-manager.js +20 -0
  58. package/dist-server/service/data-spec/data-spec-manager.js.map +1 -0
  59. package/dist-server/service/data-spec/data-spec-query.js +48 -0
  60. package/dist-server/service/data-spec/data-spec-query.js.map +1 -0
  61. package/dist-server/service/data-spec/data-spec.js +78 -0
  62. package/dist-server/service/data-spec/data-spec.js.map +1 -0
  63. package/dist-server/service/data-spec/index.js +8 -0
  64. package/dist-server/service/data-spec/index.js.map +1 -0
  65. package/dist-server/service/index.js +12 -4
  66. package/dist-server/service/index.js.map +1 -1
  67. package/package.json +18 -12
  68. package/server/controllers/create-data-sample.ts +175 -0
  69. package/server/controllers/data-use-case.ts +85 -0
  70. package/server/controllers/index.ts +1 -0
  71. package/server/index.ts +3 -0
  72. package/server/routes.ts +17 -31
  73. package/server/service/data-item/data-item-mutation.ts +6 -1
  74. package/server/service/data-item/data-item-type.ts +13 -6
  75. package/server/service/data-item/data-item.ts +21 -5
  76. package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
  77. package/server/service/data-ooc/data-ooc-query.ts +63 -0
  78. package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
  79. package/server/service/data-ooc/data-ooc-type.ts +68 -0
  80. package/server/service/data-ooc/data-ooc.ts +204 -0
  81. package/server/service/data-ooc/index.ts +7 -0
  82. package/server/service/data-sample/data-sample-mutation.ts +6 -128
  83. package/server/service/data-sample/data-sample-type.ts +7 -28
  84. package/server/service/data-sample/data-sample.ts +33 -3
  85. package/server/service/data-set/data-set-mutation.ts +1 -4
  86. package/server/service/data-set/data-set-query.ts +87 -2
  87. package/server/service/data-set/data-set-type.ts +37 -4
  88. package/server/service/data-set/data-set.ts +52 -12
  89. package/server/service/data-spec/data-spec-manager.ts +21 -0
  90. package/server/service/data-spec/data-spec-query.ts +21 -0
  91. package/server/service/data-spec/data-spec.ts +44 -0
  92. package/server/service/data-spec/index.ts +5 -0
  93. package/server/service/index.ts +16 -8
  94. package/things-factory.config.js +14 -6
  95. package/translations/en.json +30 -0
  96. package/translations/ko.json +30 -1
  97. package/translations/ms.json +29 -0
  98. package/translations/zh.json +29 -0
@@ -1,4 +1,4 @@
1
- import { Field, ID, ObjectType } from 'type-graphql'
1
+ import { Field, ID, ObjectType, registerEnumType } from 'type-graphql'
2
2
  import {
3
3
  Column,
4
4
  CreateDateColumn,
@@ -11,11 +11,22 @@ import {
11
11
  UpdateDateColumn
12
12
  } from 'typeorm'
13
13
 
14
- import { User } from '@things-factory/auth-base'
14
+ import { Role, User } from '@things-factory/auth-base'
15
15
  import { Domain, ScalarObject } from '@things-factory/shell'
16
16
 
17
17
  import { DataItem } from '../data-item/data-item'
18
- import { DataSample } from '../data-sample/data-sample'
18
+
19
+ export enum DataSetViewType {
20
+ Generated = 'generated',
21
+ Board = 'board',
22
+ Page = 'page',
23
+ ExternalURL = 'external'
24
+ }
25
+
26
+ registerEnumType(DataSetViewType, {
27
+ name: 'DataSetViewType',
28
+ description: 'view type enumeration for data-set'
29
+ })
19
30
 
20
31
  @Entity()
21
32
  @Index('ix_data_set_0', (dataSet: DataSet) => [dataSet.domain, dataSet.name], { unique: true })
@@ -48,30 +59,59 @@ export class DataSet {
48
59
  @Field({ nullable: true })
49
60
  active?: boolean
50
61
 
62
+ @ManyToOne(type => Role, {
63
+ nullable: true
64
+ })
65
+ @Field(type => Role, { nullable: true })
66
+ supervisoryRole?: Role
67
+
68
+ @RelationId((dataSet: DataSet) => dataSet.supervisoryRole)
69
+ supervisoryRoleId?: string
70
+
51
71
  @Column({
52
72
  nullable: true
53
73
  })
54
74
  @Field({ nullable: true })
55
- type?: string
75
+ type?: 'manual' | 'automatic' | string
56
76
 
57
- @Column('simple-json', { nullable: true })
58
- @Field(type => ScalarObject, { nullable: true })
59
- partitionKeys?: ScalarObject
77
+ @Column({
78
+ nullable: true
79
+ })
80
+ @Field({ nullable: true })
81
+ entryType?: DataSetViewType
82
+
83
+ @Column({
84
+ nullable: true
85
+ })
86
+ @Field({ nullable: true })
87
+ entryView?: string
60
88
 
61
89
  @Column({
62
90
  nullable: true
63
91
  })
64
92
  @Field({ nullable: true })
65
- slugger?: string
93
+ monitorType?: DataSetViewType
94
+
95
+ @Column({
96
+ nullable: true
97
+ })
98
+ @Field({ nullable: true })
99
+ monitorView?: string
100
+
101
+ @Column({
102
+ nullable: true
103
+ })
104
+ @Field({ nullable: true })
105
+ useCase?: string
106
+
107
+ @Column('simple-json', { nullable: true })
108
+ @Field(type => ScalarObject, { nullable: true })
109
+ partitionKeys?: ScalarObject
66
110
 
67
111
  @OneToMany(type => DataItem, dataItem => dataItem.dataSet)
68
112
  @Field(type => [DataItem], { nullable: true })
69
113
  dataItems: DataItem[]
70
114
 
71
- @OneToMany(type => DataSample, dataSample => dataSample.dataSet)
72
- @Field(type => [DataSample], { nullable: true })
73
- dataSamples: DataSample[]
74
-
75
115
  @Column({
76
116
  nullable: true
77
117
  })
@@ -0,0 +1,21 @@
1
+ import { DataSpec } from './data-spec'
2
+
3
+ export class DataSpecManager {
4
+ static specRegistry: { [type: string]: DataSpec } = {}
5
+
6
+ static getDataSpec(type: string): DataSpec {
7
+ return DataSpecManager.specRegistry[type]
8
+ }
9
+
10
+ static registerDataSpec(type: string, dataSpec: DataSpec) {
11
+ DataSpecManager.specRegistry[type] = dataSpec
12
+ }
13
+
14
+ static unregisterDataSpec(type: string) {
15
+ delete DataSpecManager.specRegistry[type]
16
+ }
17
+
18
+ static getDataSpecs(): DataSpec[] {
19
+ return Object.values(DataSpecManager.specRegistry)
20
+ }
21
+ }
@@ -0,0 +1,21 @@
1
+ import { Resolver, Query, Arg } from 'type-graphql'
2
+ import { DataSpec, DataSpecList } from './data-spec'
3
+ import { DataSpecManager } from './data-spec-manager'
4
+
5
+ @Resolver(DataSpec)
6
+ export class DataSpecQuery {
7
+ @Query(returns => DataSpec, { description: 'To fetch a data-spec' })
8
+ dataSpec(@Arg('name') name: string): DataSpec {
9
+ return DataSpecManager.getDataSpec(name)
10
+ }
11
+
12
+ @Query(returns => DataSpecList, { description: 'To fetch all data-specs' })
13
+ dataSpecs(): DataSpecList {
14
+ const items = DataSpecManager.getDataSpecs()
15
+
16
+ return {
17
+ items,
18
+ total: items.length
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,44 @@
1
+ import { ObjectType, Field, Int } from 'type-graphql'
2
+ import { ScalarObject } from '@things-factory/shell'
3
+
4
+ @ObjectType()
5
+ export class DataSpecItem {
6
+ @Field()
7
+ type: string
8
+
9
+ @Field()
10
+ label: string
11
+
12
+ @Field()
13
+ name: string
14
+
15
+ @Field({ nullable: true })
16
+ placeholder?: string
17
+
18
+ @Field(type => ScalarObject, { nullable: true })
19
+ property?: ScalarObject
20
+ }
21
+
22
+ @ObjectType()
23
+ export class DataSpec {
24
+ @Field()
25
+ name: string
26
+
27
+ @Field({ nullable: true })
28
+ description: string
29
+
30
+ @Field({ nullable: true })
31
+ help: string
32
+
33
+ @Field(type => [DataSpecItem], { nullable: true })
34
+ specItems: DataSpecItem[]
35
+ }
36
+
37
+ @ObjectType()
38
+ export class DataSpecList {
39
+ @Field(type => [DataSpec])
40
+ items: DataSpec[]
41
+
42
+ @Field(type => Int)
43
+ total: number
44
+ }
@@ -0,0 +1,5 @@
1
+ import { DataSpec } from './data-spec'
2
+ import { DataSpecQuery } from './data-spec-query'
3
+
4
+ export const entities = [DataSpec]
5
+ export const resolvers = [DataSpecQuery]
@@ -1,29 +1,37 @@
1
+ import { entities as DataItemEntities, resolvers as DataItemResolvers } from './data-item'
1
2
  /* IMPORT ENTITIES AND RESOLVERS */
2
- import { entities as DataSensorEntities, resolvers as DataSensorResolvers } from './data-sensor'
3
+ import { entities as DataOocEntities, resolvers as DataOocResolvers } from './data-ooc'
3
4
  import { entities as DataSampleEntities, resolvers as DataSampleResolvers } from './data-sample'
4
- import { entities as DataItemEntities, resolvers as DataItemResolvers } from './data-item'
5
+ import { entities as DataSensorEntities, resolvers as DataSensorResolvers } from './data-sensor'
5
6
  import { entities as DataSetEntities, resolvers as DataSetResolvers } from './data-set'
7
+ import { entities as DataSpecEntities, resolvers as DataSpecResolvers } from './data-spec'
6
8
 
7
9
  /* EXPORT ENTITY TYPES */
10
+ export * from './data-ooc/data-ooc'
8
11
  export * from './data-sensor/data-sensor'
9
12
  export * from './data-sample/data-sample'
10
13
  export * from './data-item/data-item'
11
14
  export * from './data-set/data-set'
15
+ export * from './data-spec/data-spec'
12
16
 
13
17
  export const entities = [
14
18
  /* ENTITIES */
15
- ...DataSensorEntities,
16
- ...DataSampleEntities,
19
+ ...DataOocEntities,
20
+ ...DataSensorEntities,
21
+ ...DataSampleEntities,
17
22
  ...DataItemEntities,
18
- ...DataSetEntities
23
+ ...DataSetEntities,
24
+ ...DataSpecEntities
19
25
  ]
20
26
 
21
27
  export const schema = {
22
28
  resolverClasses: [
23
29
  /* RESOLVER CLASSES */
24
- ...DataSensorResolvers,
25
- ...DataSampleResolvers,
30
+ ...DataOocResolvers,
31
+ ...DataSensorResolvers,
32
+ ...DataSampleResolvers,
26
33
  ...DataItemResolvers,
27
- ...DataSetResolvers
34
+ ...DataSetResolvers,
35
+ ...DataSpecResolvers
28
36
  ]
29
37
  }
@@ -5,16 +5,24 @@ export default {
5
5
  route,
6
6
  routes: [
7
7
  {
8
- tagname: 'data-set-page',
9
- page: 'data-set'
8
+ tagname: 'data-set-list-page',
9
+ page: 'data-set-list'
10
10
  },
11
11
  {
12
- tagname: 'data-sensor-page',
13
- page: 'data-sensor'
12
+ tagname: 'data-sensor-list-page',
13
+ page: 'data-sensor-list'
14
14
  },
15
15
  {
16
- tagname: 'data-sample-page',
17
- page: 'data-sample'
16
+ tagname: 'data-sample-list-page',
17
+ page: 'data-sample-list'
18
+ },
19
+ {
20
+ tagname: 'data-ooc-list-page',
21
+ page: 'data-ooc-list'
22
+ },
23
+ {
24
+ tagname: 'data-entry-list-page',
25
+ page: 'data-entry-list'
18
26
  }
19
27
  ],
20
28
  bootstrap
@@ -1,19 +1,49 @@
1
1
  {
2
+ "button.corrected": "corrected",
3
+ "button.reviewed": "reviewed",
2
4
  "field.appliance": "appliance",
3
5
  "field.collected_at": "collected at",
6
+ "field.corrective-action": "corrective action",
7
+ "field.corrector": "corrector",
8
+ "field.corrected-at": "corrected at",
4
9
  "field.data": "data",
10
+ "field.data-sample": "data sample",
5
11
  "field.data-set": "data set",
6
12
  "field.device-id": "device id",
13
+ "field.entry-type": "entry type",
14
+ "field.entry-view": "entry view",
15
+ "field.hidden": "hidden",
16
+ "field.latest-collected-at": "latest collected at",
17
+ "field.monitor-type": "monitor type",
18
+ "field.monitor-view": "monitor view",
7
19
  "field.netmask": "network mask",
20
+ "field.next-schedule": "next schedule",
21
+ "field.oos": "out of critical limit",
22
+ "field.ooc": "out of control limit",
23
+ "field.options": "options",
8
24
  "field.partition-keys": "partition keys",
25
+ "field.prev-schedule": "previous schedule",
9
26
  "field.quota": "sampling #",
10
27
  "field.raw-data": "raw data",
11
28
  "field.ref-by": "ref. by",
12
29
  "field.serial-no": "serial #",
13
30
  "field.spec": "spec",
31
+ "field.state": "state",
32
+ "field.supervisory-role": "supervisory role",
14
33
  "field.tag": "tag name",
34
+ "field.unit": "unit",
35
+ "field.use-case": "use case",
36
+ "field.work-date": "work date",
37
+ "field.work-shift": "work shift",
38
+ "text.data sample created successfully": "a data sample created successfully",
39
+ "text.data ooc updated successfully": "a data ooc updated successfully",
40
+ "title.data-entry-form": "data entry form",
41
+ "title.data-entry list": "data entry list",
15
42
  "title.data-item list": "data item list",
43
+ "title.data-ooc list": "data OOC list",
44
+ "title.data-ooc view": "data OOC view",
16
45
  "title.data-sample list": "data sample list",
46
+ "title.data-sample view": "data sample view",
17
47
  "title.data-sensor list": "data sensor list",
18
48
  "title.data-set list": "data set list"
19
49
  }
@@ -1,19 +1,48 @@
1
1
  {
2
+ "button.corrected": "조치완료",
3
+ "button.reviewed": "검토완료",
2
4
  "field.appliance": "어플라이언스",
3
5
  "field.collected_at": "수집일시",
6
+ "field.corrective-action": "조치 활동",
7
+ "field.corrector": "조치자",
8
+ "field.corrected-at": "조치 시간",
4
9
  "field.data": "데이타",
10
+ "field.data-sample": "데이타 샘플",
5
11
  "field.data-set": "데이타셋",
6
12
  "field.device-id": "디바이스 아이디",
13
+ "field.entry-type": "입력용 화면종류",
14
+ "field.entry-view": "입력용 화면",
15
+ "field.hidden": "숨기기",
16
+ "field.latest-collected-at": "최근 수집 시간",
17
+ "field.monitor-type": "모니터용 화면종류",
18
+ "field.monitor-view": "모니터용 화면",
7
19
  "field.netmask": "네트워크마스크",
20
+ "field.next-schedule": "다음 수집계획",
21
+ "field.oos": "허용한계 이탈여부",
22
+ "field.ooc": "관리한계 이탈여부",
23
+ "field.options": "선택옵션",
8
24
  "field.partition-keys": "파티션 키",
25
+ "field.prev-schedule": "이전 수집계획",
9
26
  "field.quota": "샘플수",
10
27
  "field.raw-data": "데이타 원본",
11
28
  "field.ref-by": "참조아이템",
12
29
  "field.serial-no": "시리얼번호",
13
30
  "field.spec": "명세",
14
- "field.tag": "태크이름",
31
+ "field.state": "상태",
32
+ "field.supervisory-role": "관리자 역할",
33
+ "field.tag": "태그이름",
34
+ "field.unit": "단위",
35
+ "field.use-case": "사용 사례",
36
+ "field.work-date": "작업기준일",
37
+ "field.work-shift": "교대근무조",
38
+ "text.data sample created successfully": "데이타 샘플이 성공적으로 생성되었습니다",
39
+ "text.data ooc updated successfully": "이탈데이타 내용이 수정되었습니다",
40
+ "title.data-entry-form": "데이타 입력",
15
41
  "title.data-item list": "데이타 아이템 조회",
42
+ "title.data-ooc list": "데이타 이탈점 조회",
43
+ "title.data-ooc view": "데이타 이탈점 상세",
16
44
  "title.data-sample list": "데이타 샘플 조회",
45
+ "title.data-sample view": "데이타 샘플 상세",
17
46
  "title.data-sensor list": "데이타 센서 조회",
18
47
  "title.data-set list": "데이타 셋 조회"
19
48
  }
@@ -1,19 +1,48 @@
1
1
  {
2
+ "button.corrected": "corrected",
3
+ "button.reviewed": "reviewed",
2
4
  "field.appliance": "appliance",
3
5
  "field.collected_at": "collected at",
6
+ "field.corrective-action": "corrective action",
7
+ "field.corrector": "corrector",
8
+ "field.corrected-at": "corrected at",
4
9
  "field.data": "data",
10
+ "field.data-sample": "data sample",
5
11
  "field.data-set": "data set",
6
12
  "field.device-id": "device id",
13
+ "field.entry-type": "entry type",
14
+ "field.entry-view": "entry view",
15
+ "field.latest-collected-at": "latest collected at",
16
+ "field.monitor-type": "monitor type",
17
+ "field.monitor-view": "monitor view",
7
18
  "field.netmask": "network mask",
19
+ "field.next-schedule": "next schedule",
20
+ "field.oos": "out of critical limit",
21
+ "field.ooc": "out of control limit",
22
+ "field.options": "options",
23
+ "field.hidden": "hidden",
8
24
  "field.partition-keys": "partition keys",
25
+ "field.prev-schedule": "previous schedule",
9
26
  "field.quota": "sampling #",
10
27
  "field.raw-data": "raw data",
11
28
  "field.ref-by": "ref. by",
12
29
  "field.serial-no": "serial #",
13
30
  "field.spec": "spec",
31
+ "field.state": "keadaan",
32
+ "field.supervisory-role": "supervisory role",
14
33
  "field.tag": "tag name",
34
+ "field.unit": "unit",
35
+ "field.use-case": "use case",
36
+ "field.work-date": "work date",
37
+ "field.work-shift": "work shift",
38
+ "text.data sample created successfully": "a data sample created successfully",
39
+ "text.data ooc updated successfully": "a data ooc updated successfully",
40
+ "title.data-entry-form": "data entry form",
15
41
  "title.data-item list": "data item list",
42
+ "title.data-ooc list": "data OOC list",
43
+ "title.data-ooc view": "data OOC view",
16
44
  "title.data-sample list": "data sample list",
45
+ "title.data-sample view": "data sample view",
17
46
  "title.data-sensor list": "data sensor list",
18
47
  "title.data-set list": "data set list"
19
48
  }
@@ -1,19 +1,48 @@
1
1
  {
2
+ "button.corrected": "corrected",
3
+ "button.reviewed": "reviewed",
2
4
  "field.appliance": "appliance",
3
5
  "field.collected_at": "collected at",
6
+ "field.corrective-action": "corrective action",
7
+ "field.corrector": "corrector",
8
+ "field.corrected-at": "corrected at",
4
9
  "field.data": "data",
10
+ "field.data-sample": "data sample",
5
11
  "field.data-set": "data set",
6
12
  "field.device-id": "device id",
13
+ "field.entry-type": "entry type",
14
+ "field.entry-view": "entry view",
15
+ "field.hidden": "hidden",
16
+ "field.latest-collected-at": "latest collected at",
17
+ "field.monitor-type": "monitor type",
18
+ "field.monitor-view": "monitor view",
7
19
  "field.netmask": "network mask",
20
+ "field.next-schedule": "next schedule",
21
+ "field.oos": "out of critical limit",
22
+ "field.ooc": "out of control limit",
23
+ "field.options": "options",
8
24
  "field.partition-keys": "partition keys",
25
+ "field.prev-schedule": "previous schedule",
9
26
  "field.quota": "sampling #",
10
27
  "field.raw-data": "raw data",
11
28
  "field.ref-by": "ref. by",
12
29
  "field.serial-no": "serial #",
13
30
  "field.spec": "spec",
31
+ "field.state": "状态",
32
+ "field.supervisory-role": "supervisory role",
14
33
  "field.tag": "tag name",
34
+ "field.unit": "unit",
35
+ "field.use-case": "use case",
36
+ "field.work-date": "work date",
37
+ "field.work-shift": "work shift",
38
+ "text.data sample created successfully": "a data sample created successfully",
39
+ "text.data ooc updated successfully": "a data ooc updated successfully",
40
+ "title.data-entry-form": "data entry form",
15
41
  "title.data-item list": "data item list",
42
+ "title.data-ooc list": "data OOC list",
43
+ "title.data-ooc view": "data OOC view",
16
44
  "title.data-sample list": "data sample list",
45
+ "title.data-sample view": "data sample view",
17
46
  "title.data-sensor list": "data sensor list",
18
47
  "title.data-set list": "data set list"
19
48
  }