@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.
- package/README.md +13 -0
- package/assets/data-samples.jpg +0 -0
- package/client/bootstrap.js +21 -1
- package/client/pages/{data-entry-form.js → data-entry/data-entry-form.js} +15 -2
- package/client/pages/data-entry/data-entry-list-page.js +423 -0
- package/client/pages/data-ooc/data-ooc-list-page.js +488 -0
- package/client/pages/data-ooc/data-ooc-view.js +182 -0
- package/client/pages/data-report/data-report-list-page.js +463 -0
- package/client/pages/{data-sample.js → data-sample/data-sample-list-page.js} +151 -76
- package/client/pages/data-sample/data-sample-view.js +97 -0
- package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +7 -12
- package/client/pages/{data-item-list.js → data-set/data-item-list.js} +37 -12
- package/client/pages/{data-set-importer.js → data-set/data-set-importer.js} +0 -0
- package/client/pages/data-set/data-set-list-page.js +727 -0
- package/client/route.js +18 -6
- package/dist-server/controllers/create-data-sample.js +133 -0
- package/dist-server/controllers/create-data-sample.js.map +1 -0
- package/dist-server/controllers/data-use-case.js +57 -0
- package/dist-server/controllers/data-use-case.js.map +1 -0
- package/dist-server/controllers/index.js +17 -0
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/routes.js +9 -24
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/data-item/data-item-mutation.js +5 -1
- package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
- package/dist-server/service/data-item/data-item-query.js +7 -2
- package/dist-server/service/data-item/data-item-query.js.map +1 -1
- package/dist-server/service/data-item/data-item-type.js +15 -7
- package/dist-server/service/data-item/data-item-type.js.map +1 -1
- package/dist-server/service/data-item/data-item.js +17 -3
- package/dist-server/service/data-item/data-item.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
- package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc-query.js +120 -0
- package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
- package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
- package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc.js +237 -0
- package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
- package/dist-server/service/data-ooc/index.js +10 -0
- package/dist-server/service/data-ooc/index.js.map +1 -0
- package/dist-server/service/data-sample/data-sample-mutation.js +2 -138
- package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-query.js +7 -2
- package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-type.js +12 -42
- package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
- package/dist-server/service/data-sample/data-sample.js +34 -3
- package/dist-server/service/data-sample/data-sample.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-query.js +7 -2
- package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-mutation.js +1 -2
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +162 -3
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-type.js +75 -3
- package/dist-server/service/data-set/data-set-type.js.map +1 -1
- package/dist-server/service/data-set/data-set.js +106 -15
- package/dist-server/service/data-set/data-set.js.map +1 -1
- package/dist-server/service/index.js +6 -2
- package/dist-server/service/index.js.map +1 -1
- package/package.json +18 -13
- package/server/controllers/create-data-sample.ts +177 -0
- package/server/controllers/data-use-case.ts +85 -0
- package/server/controllers/index.ts +1 -0
- package/server/index.ts +1 -0
- package/server/routes.ts +17 -31
- package/server/service/data-item/data-item-mutation.ts +6 -1
- package/server/service/data-item/data-item-query.ts +9 -3
- package/server/service/data-item/data-item-type.ts +10 -6
- package/server/service/data-item/data-item.ts +15 -4
- package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
- package/server/service/data-ooc/data-ooc-query.ts +69 -0
- package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
- package/server/service/data-ooc/data-ooc-type.ts +68 -0
- package/server/service/data-ooc/data-ooc.ts +204 -0
- package/server/service/data-ooc/index.ts +7 -0
- package/server/service/data-sample/data-sample-mutation.ts +3 -172
- package/server/service/data-sample/data-sample-query.ts +9 -3
- package/server/service/data-sample/data-sample-type.ts +7 -28
- package/server/service/data-sample/data-sample.ts +33 -3
- package/server/service/data-sensor/data-sensor-query.ts +9 -3
- package/server/service/data-set/data-set-mutation.ts +1 -4
- package/server/service/data-set/data-set-query.ts +135 -4
- package/server/service/data-set/data-set-type.ts +58 -4
- package/server/service/data-set/data-set.ts +97 -12
- package/server/service/index.ts +6 -2
- package/things-factory.config.js +18 -6
- package/translations/en.json +45 -3
- package/translations/ko.json +44 -3
- package/translations/ms.json +44 -3
- package/translations/zh.json +44 -3
- 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
|
57
|
-
@Field(type => DataSet, { nullable:
|
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 {
|
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
|
27
|
-
|
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 {
|
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
|
29
|
-
|
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
|
-
|
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(
|
58
|
-
|
59
|
-
|
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
|
-
|
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
|
})
|
package/server/service/index.ts
CHANGED
@@ -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
|
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
|
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,
|
package/things-factory.config.js
CHANGED
@@ -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
|
package/translations/en.json
CHANGED
@@ -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.
|
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.
|
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
|
}
|