@things-factory/dataset 5.0.0-alpha.4 → 5.0.0-alpha.40

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 (97) hide show
  1. package/README.md +13 -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 -2
  5. package/client/pages/data-entry/data-entry-list-page.js +423 -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-report/data-report-list-page.js +463 -0
  9. package/client/pages/{data-sample.js → data-sample/data-sample-list-page.js} +151 -76
  10. package/client/pages/data-sample/data-sample-view.js +97 -0
  11. package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +7 -12
  12. package/client/pages/{data-item-list.js → data-set/data-item-list.js} +37 -12
  13. package/client/pages/{data-set-importer.js → data-set/data-set-importer.js} +0 -0
  14. package/client/pages/data-set/data-set-list-page.js +727 -0
  15. package/client/route.js +18 -6
  16. package/dist-server/controllers/create-data-sample.js +133 -0
  17. package/dist-server/controllers/create-data-sample.js.map +1 -0
  18. package/dist-server/controllers/data-use-case.js +57 -0
  19. package/dist-server/controllers/data-use-case.js.map +1 -0
  20. package/dist-server/controllers/index.js +17 -0
  21. package/dist-server/controllers/index.js.map +1 -1
  22. package/dist-server/index.js +1 -0
  23. package/dist-server/index.js.map +1 -1
  24. package/dist-server/routes.js +9 -24
  25. package/dist-server/routes.js.map +1 -1
  26. package/dist-server/service/data-item/data-item-mutation.js +5 -1
  27. package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
  28. package/dist-server/service/data-item/data-item-query.js +7 -2
  29. package/dist-server/service/data-item/data-item-query.js.map +1 -1
  30. package/dist-server/service/data-item/data-item-type.js +15 -7
  31. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  32. package/dist-server/service/data-item/data-item.js +17 -3
  33. package/dist-server/service/data-item/data-item.js.map +1 -1
  34. package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
  35. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  36. package/dist-server/service/data-ooc/data-ooc-query.js +120 -0
  37. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  38. package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
  39. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  40. package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
  41. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  42. package/dist-server/service/data-ooc/data-ooc.js +237 -0
  43. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  44. package/dist-server/service/data-ooc/index.js +10 -0
  45. package/dist-server/service/data-ooc/index.js.map +1 -0
  46. package/dist-server/service/data-sample/data-sample-mutation.js +2 -138
  47. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  48. package/dist-server/service/data-sample/data-sample-query.js +7 -2
  49. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  50. package/dist-server/service/data-sample/data-sample-type.js +12 -42
  51. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  52. package/dist-server/service/data-sample/data-sample.js +34 -3
  53. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  54. package/dist-server/service/data-sensor/data-sensor-query.js +7 -2
  55. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  56. package/dist-server/service/data-set/data-set-mutation.js +1 -2
  57. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  58. package/dist-server/service/data-set/data-set-query.js +162 -3
  59. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  60. package/dist-server/service/data-set/data-set-type.js +75 -3
  61. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  62. package/dist-server/service/data-set/data-set.js +106 -15
  63. package/dist-server/service/data-set/data-set.js.map +1 -1
  64. package/dist-server/service/index.js +6 -2
  65. package/dist-server/service/index.js.map +1 -1
  66. package/package.json +18 -13
  67. package/server/controllers/create-data-sample.ts +177 -0
  68. package/server/controllers/data-use-case.ts +85 -0
  69. package/server/controllers/index.ts +1 -0
  70. package/server/index.ts +1 -0
  71. package/server/routes.ts +17 -31
  72. package/server/service/data-item/data-item-mutation.ts +6 -1
  73. package/server/service/data-item/data-item-query.ts +9 -3
  74. package/server/service/data-item/data-item-type.ts +10 -6
  75. package/server/service/data-item/data-item.ts +15 -4
  76. package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
  77. package/server/service/data-ooc/data-ooc-query.ts +69 -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 +3 -172
  83. package/server/service/data-sample/data-sample-query.ts +9 -3
  84. package/server/service/data-sample/data-sample-type.ts +7 -28
  85. package/server/service/data-sample/data-sample.ts +33 -3
  86. package/server/service/data-sensor/data-sensor-query.ts +9 -3
  87. package/server/service/data-set/data-set-mutation.ts +1 -4
  88. package/server/service/data-set/data-set-query.ts +135 -4
  89. package/server/service/data-set/data-set-type.ts +58 -4
  90. package/server/service/data-set/data-set.ts +97 -12
  91. package/server/service/index.ts +6 -2
  92. package/things-factory.config.js +18 -6
  93. package/translations/en.json +45 -3
  94. package/translations/ko.json +44 -3
  95. package/translations/ms.json +44 -3
  96. package/translations/zh.json +44 -3
  97. package/client/pages/data-set.js +0 -457
@@ -20,6 +20,11 @@ const ORMCONFIG = config.get('ormconfig', {})
20
20
  const DATABASE_TYPE = ORMCONFIG.type
21
21
  @Entity()
22
22
  @Index('ix_data_sample_0', (dataSample: DataSample) => [dataSample.domain, dataSample.dataSet], { unique: false })
23
+ @Index(
24
+ 'ix_data_sample_2',
25
+ (dataSample: DataSample) => [dataSample.domain, dataSample.dataSet, dataSample.collectedAt],
26
+ { unique: false }
27
+ )
23
28
  @ObjectType({ description: 'Entity for DataSample' })
24
29
  export class DataSample {
25
30
  @PrimaryGeneratedColumn('uuid')
@@ -49,16 +54,21 @@ export class DataSample {
49
54
  @Field({ nullable: true })
50
55
  type?: string
51
56
 
57
+ @Column({
58
+ nullable: true
59
+ })
60
+ @Field({ nullable: true })
61
+ useCase?: string
62
+
52
63
  @Column('simple-json', { nullable: true })
53
64
  @Field(type => ScalarObject, { nullable: true })
54
65
  partitionKeys?: ScalarObject
55
66
 
56
- @ManyToOne(type => DataSet, dataSet => dataSet.dataSamples)
57
- @Field(type => DataSet, { nullable: true })
67
+ @ManyToOne(type => DataSet)
68
+ @Field(type => DataSet, { nullable: false })
58
69
  dataSet?: DataSet
59
70
 
60
71
  @RelationId((dataSample: DataSample) => dataSample.dataSet)
61
- @Field({ nullable: true })
62
72
  dataSetId?: string
63
73
 
64
74
  @Column('simple-json', { nullable: true })
@@ -87,6 +97,26 @@ export class DataSample {
87
97
  @Field({ nullable: true })
88
98
  source?: string
89
99
 
100
+ @Column({
101
+ nullable: true
102
+ })
103
+ @Field({ nullable: true })
104
+ ooc?: boolean
105
+
106
+ @Column({
107
+ nullable: true
108
+ })
109
+ @Field({ nullable: true })
110
+ oos?: boolean
111
+
112
+ @Column({ nullable: true })
113
+ @Field({ nullable: true })
114
+ workDate?: string
115
+
116
+ @Column({ nullable: true })
117
+ @Field({ nullable: true })
118
+ workShift?: string
119
+
90
120
  @Column({ nullable: true })
91
121
  @Field({ nullable: true })
92
122
  collectedAt?: Date
@@ -2,7 +2,7 @@ import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graph
2
2
  import { getRepository } from 'typeorm'
3
3
 
4
4
  import { Appliance, User } from '@things-factory/auth-base'
5
- import { convertListParams, Domain, ListParam } from '@things-factory/shell'
5
+ import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
6
6
 
7
7
  import { DataSet } from '../data-set/data-set'
8
8
  import { DataSensor } from './data-sensor'
@@ -23,8 +23,14 @@ export class DataSensorQuery {
23
23
  async dataSensors(@Args() params: ListParam, @Ctx() context: any): Promise<DataSensorList> {
24
24
  const { domain } = context.state
25
25
 
26
- const convertedParams = convertListParams(params, domain.id)
27
- const [items, total] = await getRepository(DataSensor).findAndCount(convertedParams)
26
+ const queryBuilder = getQueryBuilderFromListParams({
27
+ repository: getRepository(DataSensor),
28
+ params,
29
+ domain,
30
+ alias: 'datasensor'
31
+ })
32
+
33
+ const [items, total] = await queryBuilder.getManyAndCount()
28
34
 
29
35
  return { items, total }
30
36
  }
@@ -200,10 +200,7 @@ export class DataSetMutation {
200
200
 
201
201
  return copiedDataSets.map(dataSet => {
202
202
  dataSet.dataItems = copiedDataItems.filter(dataItem => dataItem.dataSet == dataSet.id)
203
- return {
204
- ...dataSet,
205
- state: 'UNLOADED' // DataSetInstanceStatus.UNLOADED
206
- }
203
+ return dataSet
207
204
  })
208
205
  }
209
206
  }
@@ -1,13 +1,17 @@
1
1
  import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
2
  import { getRepository } from 'typeorm'
3
3
 
4
- import { User } from '@things-factory/auth-base'
5
- import { convertListParams, Domain, ListParam } from '@things-factory/shell'
4
+ import { Role, User } from '@things-factory/auth-base'
5
+ import { Board } from '@things-factory/board-service'
6
+ import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
6
7
 
7
8
  import { DataItem } from '../data-item/data-item'
9
+ import { DataSample } from '../data-sample/data-sample'
8
10
  import { DataSet } from './data-set'
9
11
  import { DataSetList } from './data-set-type'
10
12
 
13
+ var parser = require('cron-parser')
14
+
11
15
  @Resolver(DataSet)
12
16
  export class DataSetQuery {
13
17
  @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
@@ -25,8 +29,66 @@ export class DataSetQuery {
25
29
  async dataSets(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
26
30
  const { domain } = context.state
27
31
 
28
- const convertedParams = convertListParams(params, domain.id)
29
- const [items, total] = await getRepository(DataSet).findAndCount(convertedParams)
32
+ const queryBuilder = getQueryBuilderFromListParams({
33
+ repository: getRepository(DataSet),
34
+ params,
35
+ domain,
36
+ alias: 'dataset'
37
+ })
38
+
39
+ const [items, total] = await queryBuilder.getManyAndCount()
40
+
41
+ return { items, total }
42
+ }
43
+
44
+ @Query(returns => DataSetList, { description: 'To fetch multiple DataSets for data entry manually' })
45
+ async dataSetsForEntry(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
46
+ var { domain, user } = context.state
47
+
48
+ /* 조회한 사용자가 entry-role을 가진 data-set 리스트만 반환 */
49
+ user = await getRepository(User).findOne({
50
+ where: { id: user.id },
51
+ relations: ['roles']
52
+ })
53
+ const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)
54
+
55
+ const queryBuilder = getQueryBuilderFromListParams({
56
+ repository: getRepository(DataSet),
57
+ params,
58
+ domain,
59
+ alias: 'dataset'
60
+ })
61
+
62
+ queryBuilder.andWhere(`dataset.active = :active`, { active: true })
63
+ queryBuilder.andWhere(`dataset.entry_role_id IN (:...roles)`, { roles })
64
+
65
+ const [items, total] = await queryBuilder.getManyAndCount()
66
+
67
+ return { items, total }
68
+ }
69
+
70
+ @Query(returns => DataSetList, { description: 'To fetch multiple DataSets to see data report' })
71
+ async dataSetsForReport(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
72
+ var { domain, user } = context.state
73
+
74
+ /* 조회한 사용자가 supervisory 역할을 가진 data-set 리스트만 반환 */
75
+ user = await getRepository(User).findOne({
76
+ where: { id: user.id },
77
+ relations: ['roles']
78
+ })
79
+ const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)
80
+
81
+ const queryBuilder = getQueryBuilderFromListParams({
82
+ repository: getRepository(DataSet),
83
+ params,
84
+ domain,
85
+ alias: 'dataset'
86
+ })
87
+
88
+ queryBuilder.andWhere(`dataset.active = :active`, { active: true })
89
+ queryBuilder.andWhere(`dataset.supervisory_role_id IN (:...roles)`, { roles })
90
+
91
+ const [items, total] = await queryBuilder.getManyAndCount()
30
92
 
31
93
  return { items, total }
32
94
  }
@@ -38,6 +100,34 @@ export class DataSetQuery {
38
100
  })
39
101
  }
40
102
 
103
+ @FieldResolver(type => Role)
104
+ async entryRole(@Root() dataSet: DataSet): Promise<Role> {
105
+ return await getRepository(Role).findOne({
106
+ id: dataSet.entryRoleId
107
+ })
108
+ }
109
+
110
+ @FieldResolver(type => Role)
111
+ async supervisoryRole(@Root() dataSet: DataSet): Promise<Role> {
112
+ return await getRepository(Role).findOne({
113
+ id: dataSet.supervisoryRoleId
114
+ })
115
+ }
116
+
117
+ @FieldResolver(type => Board, { nullable: true })
118
+ async entryBoard(@Root() dataSet: DataSet) {
119
+ if (dataSet.entryType == 'board' && dataSet.entryView) {
120
+ return await getRepository(Board).findOne({ id: dataSet.entryView })
121
+ }
122
+ }
123
+
124
+ @FieldResolver(type => Board, { nullable: true })
125
+ async monitorBoard(@Root() dataSet: DataSet) {
126
+ if (dataSet.monitorType == 'board' && dataSet.monitorView) {
127
+ return await getRepository(Board).findOne({ id: dataSet.monitorView })
128
+ }
129
+ }
130
+
41
131
  @FieldResolver(type => Domain)
42
132
  async domain(@Root() dataSet: DataSet): Promise<Domain> {
43
133
  return await getRepository(Domain).findOne(dataSet.domainId)
@@ -52,4 +142,45 @@ export class DataSetQuery {
52
142
  async creator(@Root() dataSet: DataSet): Promise<User> {
53
143
  return await getRepository(User).findOne(dataSet.creatorId)
54
144
  }
145
+
146
+ @FieldResolver(type => Date, { nullable: true })
147
+ async latestCollectedAt(@Root() dataSet: DataSet): Promise<Date> {
148
+ const sample = await getRepository(DataSample).findOne({
149
+ select: ['collectedAt'],
150
+ where: { dataSet },
151
+ order: { collectedAt: 'DESC' }
152
+ })
153
+
154
+ return sample?.collectedAt
155
+ }
156
+
157
+ @FieldResolver(type => Date, { nullable: true })
158
+ async nextSchedule(@Root() dataSet: DataSet): Promise<Date> {
159
+ const { domainId, schedule, timezone } = dataSet
160
+
161
+ if (!schedule) {
162
+ return
163
+ }
164
+
165
+ var interval = parser.parseExpression(schedule, {
166
+ tz: timezone || ((await getRepository(Domain).findOne(domainId)) as Domain).timezone || 'UTC'
167
+ })
168
+
169
+ return interval.next().toDate()
170
+ }
171
+
172
+ @FieldResolver(type => Date, { nullable: true })
173
+ async prevSchedule(@Root() dataSet: DataSet): Promise<Date> {
174
+ const { domainId, schedule, timezone } = dataSet
175
+
176
+ if (!schedule) {
177
+ return
178
+ }
179
+
180
+ var interval = parser.parseExpression(schedule, {
181
+ tz: timezone || ((await getRepository(Domain).findOne(domainId)) as Domain).timezone || 'UTC'
182
+ })
183
+
184
+ return interval.prev().toDate()
185
+ }
55
186
  }
@@ -1,8 +1,8 @@
1
1
  import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
2
 
3
- import { ScalarObject } from '@things-factory/shell'
3
+ import { ObjectRef, ScalarObject } from '@things-factory/shell'
4
4
 
5
- import { DataSet } from './data-set'
5
+ import { DataSet, DataSetEntryType, DataSetMonitorType, DataSetReportType } from './data-set'
6
6
 
7
7
  @InputType()
8
8
  export class NewDataSet {
@@ -12,11 +12,20 @@ export class NewDataSet {
12
12
  @Field({ nullable: true })
13
13
  description?: string
14
14
 
15
+ @Field(type => ObjectRef, { nullable: true })
16
+ entryRole?: ObjectRef
17
+
18
+ @Field(type => ObjectRef, { nullable: true })
19
+ supervisoryRole?: ObjectRef
20
+
15
21
  @Field({ nullable: true })
16
22
  active?: boolean
17
23
 
18
24
  @Field({ nullable: true })
19
- type?: string
25
+ type?: 'manual' | 'automatic' | string
26
+
27
+ @Field({ nullable: true })
28
+ useCase?: string
20
29
 
21
30
  @Field(type => ScalarObject, { nullable: true })
22
31
  partitionKeys?: ScalarObject
@@ -26,6 +35,24 @@ export class NewDataSet {
26
35
 
27
36
  @Field({ nullable: true })
28
37
  timezone?: string
38
+
39
+ @Field({ nullable: true })
40
+ entryType?: DataSetEntryType
41
+
42
+ @Field({ nullable: true })
43
+ entryView?: string
44
+
45
+ @Field({ nullable: true })
46
+ monitorType?: DataSetMonitorType
47
+
48
+ @Field({ nullable: true })
49
+ monitorView?: string
50
+
51
+ @Field({ nullable: true })
52
+ reportType?: DataSetReportType
53
+
54
+ @Field({ nullable: true })
55
+ reportView?: string
29
56
  }
30
57
 
31
58
  @InputType()
@@ -39,11 +66,20 @@ export class DataSetPatch {
39
66
  @Field({ nullable: true })
40
67
  description?: string
41
68
 
69
+ @Field(type => ObjectRef, { nullable: true })
70
+ supervisoryRole?: ObjectRef
71
+
72
+ @Field(type => ObjectRef, { nullable: true })
73
+ entryRole?: ObjectRef
74
+
42
75
  @Field({ nullable: true })
43
76
  active?: boolean
44
77
 
45
78
  @Field({ nullable: true })
46
- type?: string
79
+ type?: 'manual' | 'automatic' | string
80
+
81
+ @Field({ nullable: true })
82
+ useCase?: string
47
83
 
48
84
  @Field(type => ScalarObject, { nullable: true })
49
85
  partitionKeys?: ScalarObject
@@ -54,6 +90,24 @@ export class DataSetPatch {
54
90
  @Field({ nullable: true })
55
91
  timezone?: string
56
92
 
93
+ @Field({ nullable: true })
94
+ entryType?: DataSetEntryType
95
+
96
+ @Field({ nullable: true })
97
+ entryView?: string
98
+
99
+ @Field({ nullable: true })
100
+ monitorType?: DataSetMonitorType
101
+
102
+ @Field({ nullable: true })
103
+ monitorView?: string
104
+
105
+ @Field({ nullable: true })
106
+ reportType?: DataSetReportType
107
+
108
+ @Field({ nullable: true })
109
+ reportView?: string
110
+
57
111
  @Field()
58
112
  cuFlag: string
59
113
  }
@@ -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,46 @@ 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 DataSetEntryType {
20
+ Generated = 'generated',
21
+ Board = 'board',
22
+ Page = 'page',
23
+ ExternalURL = 'external'
24
+ }
25
+
26
+ registerEnumType(DataSetEntryType, {
27
+ name: 'DataSetEntryType',
28
+ description: 'entry type enumeration for data-set'
29
+ })
30
+
31
+ export enum DataSetMonitorType {
32
+ Generated = 'generated',
33
+ Board = 'board',
34
+ Page = 'page',
35
+ ExternalURL = 'external'
36
+ }
37
+
38
+ registerEnumType(DataSetMonitorType, {
39
+ name: 'DataSetMonitorType',
40
+ description: 'monitor type enumeration for data-set'
41
+ })
42
+
43
+ export enum DataSetReportType {
44
+ Generated = 'generated',
45
+ Board = 'board',
46
+ Page = 'page',
47
+ ExternalURL = 'external'
48
+ }
49
+
50
+ registerEnumType(DataSetReportType, {
51
+ name: 'DataSetReportType',
52
+ description: 'report type enumeration for data-set'
53
+ })
19
54
 
20
55
  @Entity()
21
56
  @Index('ix_data_set_0', (dataSet: DataSet) => [dataSet.domain, dataSet.name], { unique: true })
@@ -48,30 +83,80 @@ export class DataSet {
48
83
  @Field({ nullable: true })
49
84
  active?: boolean
50
85
 
86
+ @ManyToOne(type => Role, {
87
+ nullable: true
88
+ })
89
+ @Field(type => Role, { nullable: true })
90
+ entryRole?: Role
91
+
92
+ @RelationId((dataSet: DataSet) => dataSet.entryRole)
93
+ entryRoleId?: string
94
+
95
+ @ManyToOne(type => Role, {
96
+ nullable: true
97
+ })
98
+ @Field(type => Role, { nullable: true })
99
+ supervisoryRole?: Role
100
+
101
+ @RelationId((dataSet: DataSet) => dataSet.supervisoryRole)
102
+ supervisoryRoleId?: string
103
+
51
104
  @Column({
52
105
  nullable: true
53
106
  })
54
107
  @Field({ nullable: true })
55
- type?: string
108
+ type?: 'manual' | 'automatic' | string
56
109
 
57
- @Column('simple-json', { nullable: true })
58
- @Field(type => ScalarObject, { nullable: true })
59
- partitionKeys?: ScalarObject
110
+ @Column({
111
+ nullable: true
112
+ })
113
+ @Field({ nullable: true })
114
+ entryType?: DataSetEntryType
115
+
116
+ @Column({
117
+ nullable: true
118
+ })
119
+ @Field({ nullable: true })
120
+ entryView?: string
121
+
122
+ @Column({
123
+ nullable: true
124
+ })
125
+ @Field({ nullable: true })
126
+ monitorType?: DataSetMonitorType
60
127
 
61
128
  @Column({
62
129
  nullable: true
63
130
  })
64
131
  @Field({ nullable: true })
65
- slugger?: string
132
+ monitorView?: string
133
+
134
+ @Column({
135
+ nullable: true
136
+ })
137
+ @Field({ nullable: true })
138
+ reportType?: DataSetReportType
139
+
140
+ @Column({
141
+ nullable: true
142
+ })
143
+ @Field({ nullable: true })
144
+ reportView?: string
145
+
146
+ @Column({
147
+ nullable: true
148
+ })
149
+ @Field({ nullable: true })
150
+ useCase?: string
151
+
152
+ @Column('simple-json', { nullable: true })
153
+ @Field(type => ScalarObject, { nullable: true })
154
+ partitionKeys?: ScalarObject
66
155
 
67
156
  @OneToMany(type => DataItem, dataItem => dataItem.dataSet)
68
157
  @Field(type => [DataItem], { nullable: true })
69
158
  dataItems: DataItem[]
70
159
 
71
- @OneToMany(type => DataSample, dataSample => dataSample.dataSet)
72
- @Field(type => [DataSample], { nullable: true })
73
- dataSamples: DataSample[]
74
-
75
160
  @Column({
76
161
  nullable: true
77
162
  })
@@ -1,11 +1,13 @@
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'
6
7
  import { entities as DataSpecEntities, resolvers as DataSpecResolvers } from './data-spec'
7
8
 
8
9
  /* EXPORT ENTITY TYPES */
10
+ export * from './data-ooc/data-ooc'
9
11
  export * from './data-sensor/data-sensor'
10
12
  export * from './data-sample/data-sample'
11
13
  export * from './data-item/data-item'
@@ -14,6 +16,7 @@ export * from './data-spec/data-spec'
14
16
 
15
17
  export const entities = [
16
18
  /* ENTITIES */
19
+ ...DataOocEntities,
17
20
  ...DataSensorEntities,
18
21
  ...DataSampleEntities,
19
22
  ...DataItemEntities,
@@ -24,6 +27,7 @@ export const entities = [
24
27
  export const schema = {
25
28
  resolverClasses: [
26
29
  /* RESOLVER CLASSES */
30
+ ...DataOocResolvers,
27
31
  ...DataSensorResolvers,
28
32
  ...DataSampleResolvers,
29
33
  ...DataItemResolvers,
@@ -5,16 +5,28 @@ 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'
26
+ },
27
+ {
28
+ tagname: 'data-report-list-page',
29
+ page: 'data-report-list'
18
30
  }
19
31
  ],
20
32
  bootstrap
@@ -1,21 +1,63 @@
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",
5
- "field.dataSet": "data set",
10
+ "field.data-sample": "data sample",
11
+ "field.data-set": "data set",
6
12
  "field.device-id": "device id",
13
+ "field.entry-role": "entry role",
14
+ "field.entry-type": "entry type",
15
+ "field.entry-view": "entry view",
16
+ "field.hidden": "hidden",
17
+ "field.latest-collected-at": "latest collected at",
18
+ "field.monitor-type": "monitor type",
19
+ "field.monitor-view": "monitor view",
7
20
  "field.netmask": "network mask",
21
+ "field.next-schedule": "next schedule",
22
+ "field.oos": "out of critical limit",
23
+ "field.ooc": "out of control limit",
8
24
  "field.options": "options",
9
- "field.partitionKeys": "partition keys",
25
+ "field.partition-keys": "partition keys",
26
+ "field.prev-schedule": "previous schedule",
10
27
  "field.quota": "sampling #",
11
28
  "field.raw-data": "raw data",
12
29
  "field.ref-by": "ref. by",
30
+ "field.report-type": "report type",
31
+ "field.report-view": "report view",
13
32
  "field.serial-no": "serial #",
14
33
  "field.spec": "spec",
34
+ "field.state": "state",
35
+ "field.supervisory-role": "supervisory role",
15
36
  "field.tag": "tag name",
37
+ "field.unit": "unit",
38
+ "field.use-case": "use case",
39
+ "field.work-date": "work date",
40
+ "field.work-shift": "work shift",
41
+ "label.acceptables": "acceptables",
42
+ "label.critical limits": "critical limits",
43
+ "label.minimum value": "minimum value",
44
+ "label.maximum value": "maximum value",
45
+ "label.pass limits": "pass limits",
46
+ "label.target limits": "target limits",
47
+ "text.automatically collected": "automatically collected",
48
+ "text.data sample created successfully": "a data sample created successfully",
49
+ "text.data ooc updated successfully": "a data ooc updated successfully",
50
+ "text.manually collected": "manually collected",
16
51
  "title.data-entry-form": "data entry form",
52
+ "title.data-entry list": "data entry list",
17
53
  "title.data-item list": "data item list",
54
+ "title.data-monitor-view": "data monitor view",
55
+ "title.data-report-view": "data report view",
56
+ "title.data-ooc list": "data OOC list",
57
+ "title.data-ooc view": "data OOC view",
18
58
  "title.data-sample list": "data sample list",
59
+ "title.data-sample view": "data sample view",
19
60
  "title.data-sensor list": "data sensor list",
20
- "title.data-set list": "data set list"
61
+ "title.data-set list": "data set list",
62
+ "title.edit code": "edit code"
21
63
  }