@things-factory/dataset 8.0.0-alpha.8 → 8.0.0-beta.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. package/client/activities/activity-ooc-resolve-edit.ts +1 -1
  2. package/client/activities/activity-ooc-review-edit.ts +1 -1
  3. package/client/pages/data-entry/data-entry-list-page.ts +30 -10
  4. package/client/pages/data-sensor/data-sensor-list-page.ts +1 -1
  5. package/client/pages/data-set/data-item-list.ts +1 -1
  6. package/client/pages/data-set/data-set-list-page.ts +25 -16
  7. package/dist-client/activities/activity-ooc-resolve-edit.js +1 -1
  8. package/dist-client/activities/activity-ooc-resolve-edit.js.map +1 -1
  9. package/dist-client/activities/activity-ooc-review-edit.js +1 -1
  10. package/dist-client/activities/activity-ooc-review-edit.js.map +1 -1
  11. package/dist-client/pages/data-entry/data-entry-list-page.js +28 -9
  12. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
  13. package/dist-client/pages/data-sensor/data-sensor-list-page.js +1 -1
  14. package/dist-client/pages/data-sensor/data-sensor-list-page.js.map +1 -1
  15. package/dist-client/pages/data-set/data-item-list.js +1 -1
  16. package/dist-client/pages/data-set/data-item-list.js.map +1 -1
  17. package/dist-client/pages/data-set/data-set-list-page.js +25 -16
  18. package/dist-client/pages/data-set/data-set-list-page.js.map +1 -1
  19. package/dist-client/tsconfig.tsbuildinfo +1 -1
  20. package/dist-server/activities/activity-data-collect.d.ts +1 -0
  21. package/dist-server/activities/activity-data-collect.js +1 -0
  22. package/dist-server/activities/activity-data-collect.js.map +1 -1
  23. package/dist-server/activities/activity-data-review.d.ts +1 -0
  24. package/dist-server/activities/activity-data-review.js +1 -0
  25. package/dist-server/activities/activity-data-review.js.map +1 -1
  26. package/dist-server/activities/activity-ooc-resolve.d.ts +1 -0
  27. package/dist-server/activities/activity-ooc-resolve.js +2 -1
  28. package/dist-server/activities/activity-ooc-resolve.js.map +1 -1
  29. package/dist-server/activities/activity-ooc-review.d.ts +1 -0
  30. package/dist-server/activities/activity-ooc-review.js +14 -5
  31. package/dist-server/activities/activity-ooc-review.js.map +1 -1
  32. package/dist-server/controllers/create-data-sample.js +18 -12
  33. package/dist-server/controllers/create-data-sample.js.map +1 -1
  34. package/dist-server/controllers/issue-data-collection-task.js +6 -6
  35. package/dist-server/controllers/issue-data-collection-task.js.map +1 -1
  36. package/dist-server/service/data-ooc/data-ooc-query.js +1 -1
  37. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
  38. package/dist-server/service/data-ooc/data-ooc.js +12 -3
  39. package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
  40. package/dist-server/service/data-sample/data-sample-query.js +1 -1
  41. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  42. package/dist-server/service/data-sample/data-sample.js +4 -1
  43. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  44. package/dist-server/service/data-set/data-set-mutation.js +7 -36
  45. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  46. package/dist-server/service/data-set/data-set-query.d.ts +3 -0
  47. package/dist-server/service/data-set/data-set-query.js +100 -27
  48. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  49. package/dist-server/service/data-set/data-set-type.d.ts +4 -3
  50. package/dist-server/service/data-set/data-set-type.js +20 -6
  51. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  52. package/dist-server/service/data-set/data-set.d.ts +3 -0
  53. package/dist-server/service/data-set/data-set.js +20 -0
  54. package/dist-server/service/data-set/data-set.js.map +1 -1
  55. package/dist-server/service/data-set-history/data-set-history.js +7 -2
  56. package/dist-server/service/data-set-history/data-set-history.js.map +1 -1
  57. package/dist-server/service/data-summary/data-summary-query.js +1 -1
  58. package/dist-server/service/data-summary/data-summary-query.js.map +1 -1
  59. package/dist-server/tsconfig.tsbuildinfo +1 -1
  60. package/package.json +26 -26
  61. package/server/activities/activity-data-collect.ts +12 -2
  62. package/server/activities/activity-data-review.ts +6 -1
  63. package/server/activities/activity-ooc-resolve.ts +2 -1
  64. package/server/activities/activity-ooc-review.ts +30 -8
  65. package/server/controllers/create-data-sample.ts +18 -12
  66. package/server/controllers/issue-data-collection-task.ts +6 -7
  67. package/server/service/data-ooc/data-ooc-query.ts +1 -1
  68. package/server/service/data-ooc/data-ooc.ts +12 -3
  69. package/server/service/data-sample/data-sample-query.ts +1 -1
  70. package/server/service/data-sample/data-sample.ts +4 -1
  71. package/server/service/data-set/data-set-mutation.ts +3 -40
  72. package/server/service/data-set/data-set-query.ts +94 -28
  73. package/server/service/data-set/data-set-type.ts +16 -5
  74. package/server/service/data-set/data-set.ts +17 -0
  75. package/server/service/data-set-history/data-set-history.ts +8 -2
  76. package/server/service/data-summary/data-summary-query.ts +1 -1
  77. package/translations/en.json +2 -0
  78. package/translations/ja.json +2 -0
  79. package/translations/ko.json +2 -0
  80. package/translations/ms.json +2 -0
  81. package/translations/zh.json +2 -0
@@ -1,5 +1,5 @@
1
1
  import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
- import { In } from 'typeorm'
2
+ import { Brackets, In } from 'typeorm'
3
3
 
4
4
  import { Attachment } from '@things-factory/attachment-base'
5
5
  import { Role, User } from '@things-factory/auth-base'
@@ -19,6 +19,7 @@ var parser = require('cron-parser')
19
19
 
20
20
  @Resolver(DataSet)
21
21
  export class DataSetQuery {
22
+ // 데이터셋을 ID로 조회
22
23
  @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
23
24
  @Query(returns => DataSet, { description: 'To fetch a DataSet' })
24
25
  async dataSet(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataSet> {
@@ -29,6 +30,7 @@ export class DataSetQuery {
29
30
  })
30
31
  }
31
32
 
33
+ // 데이터셋을 이름으로 조회
32
34
  @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
33
35
  @Query(returns => DataSet, { description: 'To fetch a DataSet by name' })
34
36
  async dataSetByName(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<DataSet> {
@@ -39,6 +41,7 @@ export class DataSetQuery {
39
41
  })
40
42
  }
41
43
 
44
+ // 여러 데이터셋을 조회
42
45
  @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
43
46
  @Query(returns => DataSetList, { description: 'To fetch multiple DataSets' })
44
47
  async dataSets(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<DataSetList> {
@@ -57,6 +60,7 @@ export class DataSetQuery {
57
60
  return { items, total }
58
61
  }
59
62
 
63
+ // 데이터 입력을 위한 데이터셋 조회
60
64
  @Query(returns => DataSetList, { description: 'To fetch multiple DataSets for data entry manually' })
61
65
  async dataSetsForEntry(
62
66
  @Args(type => ListParam) params: ListParam,
@@ -64,7 +68,7 @@ export class DataSetQuery {
64
68
  ): Promise<DataSetList> {
65
69
  var { domain, user } = context.state
66
70
 
67
- /* 조회한 사용자가 entry-role을 가진 data-set 리스트만 반환 */
71
+ // 조회한 사용자가 entry-role을 가진 data-set 리스트만 반환
68
72
  user = await getRepository(User).findOne({
69
73
  where: { id: user.id },
70
74
  relations: ['roles']
@@ -86,12 +90,21 @@ export class DataSetQuery {
86
90
  searchables: ['name', 'description']
87
91
  })
88
92
  .andWhere('dataset.active = :active', { active: true })
89
- .andWhere('dataset.entryRole IN (:...roles)', { roles })
93
+ .andWhere(
94
+ new Brackets(qb => {
95
+ qb.where('dataset.supervisoryRole IN (:...roles)').orWhere('dataset.entryRole IN (:...roles)')
96
+ })
97
+ )
98
+ .setParameter('roles', roles)
90
99
  .getManyAndCount()
91
100
 
92
- return { items, total }
101
+ return {
102
+ items,
103
+ total
104
+ }
93
105
  }
94
106
 
107
+ // 데이터 보고를 위한 데이터셋 조회
95
108
  @Query(returns => DataSetList, { description: 'To fetch multiple DataSets to see data report' })
96
109
  async dataSetsForReport(
97
110
  @Args(type => ListParam) params: ListParam,
@@ -99,7 +112,7 @@ export class DataSetQuery {
99
112
  ): Promise<DataSetList> {
100
113
  var { domain, user } = context.state
101
114
 
102
- /* 조회한 사용자가 supervisory 역할을 가진 data-set 리스트만 반환 */
115
+ // 조회한 사용자가 supervisory 역할을 가진 data-set 리스트만 반환
103
116
  user = await getRepository(User).findOne({
104
117
  where: { id: user.id },
105
118
  relations: ['roles']
@@ -124,9 +137,10 @@ export class DataSetQuery {
124
137
  return { items, total }
125
138
  }
126
139
 
140
+ // 데이터셋의 상태를 조회
127
141
  @FieldResolver(type => DataSetState)
128
142
  async status(@Root() dataSet: DataSet): Promise<DataSetState> {
129
- // get information from scheduler service
143
+ // 스케줄러 서비스에서 정보 가져오기
130
144
  return {
131
145
  id: '',
132
146
  scheduleId: '',
@@ -136,6 +150,7 @@ export class DataSetQuery {
136
150
  }
137
151
  }
138
152
 
153
+ // 데이터셋의 데이터 항목을 조회
139
154
  @FieldResolver(type => [DataItem])
140
155
  async dataItems(@Root() dataSet: DataSet): Promise<DataItem[]> {
141
156
  if (dataSet.dataItems instanceof Array) {
@@ -145,6 +160,7 @@ export class DataSetQuery {
145
160
  return []
146
161
  }
147
162
 
163
+ // 데이터셋의 entry 역할을 조회
148
164
  @FieldResolver(type => Role)
149
165
  async entryRole(@Root() dataSet: DataSet): Promise<Role> {
150
166
  return (
@@ -156,7 +172,8 @@ export class DataSetQuery {
156
172
  )
157
173
  }
158
174
 
159
- @FieldResolver(type => Role)
175
+ // 데이터셋의 supervisory 역할을 조회
176
+ @FieldResolver(type => Role, { description: 'Retrieves the supervisory role for the dataset' })
160
177
  async supervisoryRole(@Root() dataSet: DataSet): Promise<Role> {
161
178
  return (
162
179
  dataSet.supervisoryRole ||
@@ -167,7 +184,19 @@ export class DataSetQuery {
167
184
  )
168
185
  }
169
186
 
170
- @FieldResolver(type => [AssigneeItem])
187
+ // 데이터셋의 resolver 역할을 조회
188
+ @FieldResolver(type => Role, { description: 'Retrieves the resolver role for the dataset' })
189
+ async resolverRole(@Root() dataSet: DataSet): Promise<Role> {
190
+ return (
191
+ dataSet.resolverRole ||
192
+ (dataSet.resolverRoleId &&
193
+ (await getRepository(Role).findOneBy({
194
+ id: dataSet.resolverRoleId
195
+ })))
196
+ )
197
+ }
198
+
199
+ @FieldResolver(type => [AssigneeItem], { description: 'Retrieves the assignee items for the dataset' })
171
200
  async assignees(@Root() dataSet: DataSet, @Ctx() context: ResolverContext): Promise<AssigneeItem[]> {
172
201
  const { domain, user } = context.state
173
202
  const { assignees } = dataSet
@@ -208,7 +237,7 @@ export class DataSetQuery {
208
237
  return assigneeItemList
209
238
  }
210
239
 
211
- @FieldResolver(type => [ApprovalLineItem])
240
+ @FieldResolver(type => [ApprovalLineItem], { description: 'Retrieves the approval line items for the dataset' })
212
241
  async approvalLine(@Root() dataSet: DataSet, @Ctx() context: ResolverContext): Promise<ApprovalLineItem[]> {
213
242
  const { domain, user } = context.state
214
243
  const { reviewApprovalLine } = dataSet
@@ -250,21 +279,21 @@ export class DataSetQuery {
250
279
  return approvalLineItems
251
280
  }
252
281
 
253
- @FieldResolver(type => Board, { nullable: true })
282
+ @FieldResolver(type => Board, { nullable: true, description: 'Retrieves the entry board for the dataset' })
254
283
  async entryBoard(@Root() dataSet: DataSet): Promise<Board> {
255
284
  if (dataSet.entryType == 'board' && dataSet.entryView) {
256
285
  return await getRepository(Board).findOneBy({ id: dataSet.entryView })
257
286
  }
258
287
  }
259
288
 
260
- @FieldResolver(type => Board, { nullable: true })
289
+ @FieldResolver(type => Board, { nullable: true, description: 'Retrieves the monitor board for the dataset' })
261
290
  async monitorBoard(@Root() dataSet: DataSet): Promise<Board> {
262
291
  if (dataSet.monitorType == 'board' && dataSet.monitorView) {
263
292
  return await getRepository(Board).findOneBy({ id: dataSet.monitorView })
264
293
  }
265
294
  }
266
295
 
267
- @FieldResolver(type => DataKeySet, { nullable: true })
296
+ @FieldResolver(type => DataKeySet, { nullable: true, description: 'Retrieves the data key set for the dataset' })
268
297
  async dataKeySet(@Root() dataSet: DataSet): Promise<DataKeySet> {
269
298
  return (
270
299
  dataSet.dataKeySet ||
@@ -275,7 +304,7 @@ export class DataSetQuery {
275
304
  )
276
305
  }
277
306
 
278
- @FieldResolver(type => Scenario)
307
+ @FieldResolver(type => Scenario, { description: 'Retrieves the normal scenario for the dataset.' })
279
308
  async normalScenario(@Root() dataSet: DataSet): Promise<Scenario> {
280
309
  return (
281
310
  dataSet.normalScenario ||
@@ -286,7 +315,7 @@ export class DataSetQuery {
286
315
  )
287
316
  }
288
317
 
289
- @FieldResolver(type => Scenario)
318
+ @FieldResolver(type => Scenario, { description: 'Retrieves the outlier scenario for the dataset.' })
290
319
  async outlierScenario(@Root() dataSet: DataSet): Promise<Scenario> {
291
320
  return (
292
321
  dataSet.outlierScenario ||
@@ -297,22 +326,25 @@ export class DataSetQuery {
297
326
  )
298
327
  }
299
328
 
329
+ // 데이터셋의 도메인을 조회
300
330
  @FieldResolver(type => Domain)
301
331
  async domain(@Root() dataSet: DataSet): Promise<Domain> {
302
332
  return dataSet.domainId && (await getRepository(Domain).findOneBy({ id: dataSet.domainId }))
303
333
  }
304
334
 
335
+ // 데이터셋의 업데이트한 사용자를 조회
305
336
  @FieldResolver(type => User)
306
337
  async updater(@Root() dataSet: DataSet): Promise<User> {
307
338
  return dataSet.updaterId && (await getRepository(User).findOneBy({ id: dataSet.updaterId }))
308
339
  }
309
340
 
341
+ // 데이터셋의 생성자를 조회
310
342
  @FieldResolver(type => User)
311
343
  async creator(@Root() dataSet: DataSet): Promise<User> {
312
344
  return dataSet.creatorId && (await getRepository(User).findOneBy({ id: dataSet.creatorId }))
313
345
  }
314
346
 
315
- @FieldResolver(type => Date, { nullable: true })
347
+ @FieldResolver(type => Date, { nullable: true, description: 'Retrieves the latest collection time for the dataset.' })
316
348
  async latestCollectedAt(@Root() dataSet: DataSet): Promise<Date> {
317
349
  const sample = await getRepository(DataSample).findOne({
318
350
  select: ['id', 'collectedAt'],
@@ -323,7 +355,7 @@ export class DataSetQuery {
323
355
  return sample?.collectedAt
324
356
  }
325
357
 
326
- @FieldResolver(type => Date, { nullable: true })
358
+ @FieldResolver(type => Date, { nullable: true, description: 'Retrieves the next schedule time for the dataset.' })
327
359
  async nextSchedule(@Root() dataSet: DataSet): Promise<Date> {
328
360
  const { domainId, schedule, timezone } = dataSet
329
361
 
@@ -338,7 +370,7 @@ export class DataSetQuery {
338
370
  return interval.next().toDate()
339
371
  }
340
372
 
341
- @FieldResolver(type => Date, { nullable: true })
373
+ @FieldResolver(type => Date, { nullable: true, description: 'Retrieves the previous schedule time for the dataset.' })
342
374
  async prevSchedule(@Root() dataSet: DataSet): Promise<Date> {
343
375
  const { domainId, schedule, timezone } = dataSet
344
376
 
@@ -353,7 +385,10 @@ export class DataSetQuery {
353
385
  return interval.prev().toDate()
354
386
  }
355
387
 
356
- @FieldResolver(type => Date, { nullable: true })
388
+ @FieldResolver(type => Date, {
389
+ nullable: true,
390
+ description: 'Retrieves the next summary schedule time for the dataset.'
391
+ })
357
392
  async nextSummarySchedule(@Root() dataSet: DataSet): Promise<Date> {
358
393
  const { domainId, summarySchedule, timezone } = dataSet
359
394
 
@@ -367,20 +402,19 @@ export class DataSetQuery {
367
402
 
368
403
  return interval.next().toDate()
369
404
 
370
- // /* FIXME: getSchedules 의 파라미터를 수정해야한다. scheduler 가 없거나 커넥션이 끊겨있어서 오래걸리는 문제는 어떻게 ?? 비동기로 처리한다. 어떻게???
371
- // client: {
372
- // application: Application,
373
- // group: `${domain.id}`,
374
- // type: 'data-set',
375
- // key: dataSet.id,
376
- // operation: 'summary'
377
- // },
378
- // */
405
+ // FIXME: getSchedules 의 파라미터를 수정해야한다. scheduler 가 없거나 커넥션이 끊겨있어서 오래걸리는 문제는 어떻게 ?? 비동기로 처리한다. 어떻게???
406
+ // client: {
407
+ // application: Application,
408
+ // group: `${domain.id}`,
409
+ // type: 'data-set',
410
+ // key: dataSet.id,
411
+ // operation: 'summary'
412
+ // }
379
413
  // const schedule = getSchedules('name', 'group', false)
380
414
  // return schedule.nextSchedule
381
415
  }
382
416
 
383
- @FieldResolver(type => String)
417
+ @FieldResolver(type => String, { description: 'Retrieves the report template for the dataset.' })
384
418
  async reportTemplate(@Root() dataset: DataSet): Promise<string | undefined> {
385
419
  const attachment: Attachment = await getRepository(Attachment).findOne({
386
420
  where: {
@@ -392,4 +426,36 @@ export class DataSetQuery {
392
426
 
393
427
  return attachment?.path
394
428
  }
429
+
430
+ @FieldResolver(returns => Boolean, { description: 'Whether the user is a supervisor for this dataset' })
431
+ async isSupervisor(@Root() dataset: DataSet, @Ctx() context: ResolverContext): Promise<boolean> {
432
+ const { user, domain } = context.state
433
+
434
+ const foundUser = await getRepository(User).findOne({
435
+ where: { id: user.id },
436
+ relations: ['roles']
437
+ })
438
+
439
+ const roles = foundUser.roles
440
+ .filter(role => role.domainId === domain.id || (domain.parentId && role.domainId === domain.parentId))
441
+ .map(role => role.id)
442
+
443
+ return roles.includes(dataset.supervisoryRoleId)
444
+ }
445
+
446
+ @FieldResolver(returns => Boolean, { description: 'Whether the user is allowed to enter data for this dataset' })
447
+ async isEntryAllowed(@Root() dataset: DataSet, @Ctx() context: ResolverContext): Promise<boolean> {
448
+ const { user, domain } = context.state
449
+
450
+ const foundUser = await getRepository(User).findOne({
451
+ where: { id: user.id },
452
+ relations: ['roles']
453
+ })
454
+
455
+ const roles = foundUser.roles
456
+ .filter(role => role.domainId === domain.id || (domain.parentId && role.domainId === domain.parentId))
457
+ .map(role => role.id)
458
+
459
+ return roles.includes(dataset.entryRoleId)
460
+ }
395
461
  }
@@ -4,7 +4,6 @@ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
4
4
 
5
5
  import { ApprovalLineItem } from '@things-factory/organization'
6
6
  import { ObjectRef, ScalarObject } from '@things-factory/shell'
7
- import { AssigneeItem } from '@things-factory/worklist'
8
7
 
9
8
  import { DataItemPatch } from './data-item-type'
10
9
  import { DataSet, DataSetEntryType, DataSetMonitorType, DataSetReportType, DataSetSummaryPeriodType } from './data-set'
@@ -29,8 +28,8 @@ export class NewDataSet {
29
28
  @Field(type => ObjectRef, { nullable: true })
30
29
  supervisoryRole?: ObjectRef
31
30
 
32
- @Field(type => ScalarObject, { nullable: true })
33
- assignees?: AssigneeItem[]
31
+ @Field(type => ObjectRef, { nullable: true })
32
+ resolverRole?: ObjectRef
34
33
 
35
34
  @Field(type => ScalarObject, { nullable: true })
36
35
  reviewApprovalLine?: ApprovalLineItem[]
@@ -91,6 +90,12 @@ export class NewDataSet {
91
90
 
92
91
  @Field({ nullable: true })
93
92
  summaryPeriod?: DataSetSummaryPeriodType
93
+
94
+ @Field({
95
+ nullable: true,
96
+ description: 'The maximum allowed time limit (in seconds) for completing the data entry operation'
97
+ })
98
+ timeLimit?: number
94
99
  }
95
100
 
96
101
  @InputType()
@@ -116,8 +121,8 @@ export class DataSetPatch {
116
121
  @Field(type => ObjectRef, { nullable: true })
117
122
  entryRole?: ObjectRef
118
123
 
119
- @Field(type => ScalarObject, { nullable: true })
120
- assignees?: AssigneeItem[]
124
+ @Field(type => ObjectRef, { nullable: true })
125
+ resolverRole?: ObjectRef
121
126
 
122
127
  @Field(type => ScalarObject, { nullable: true })
123
128
  reviewApprovalLine?: ApprovalLineItem[]
@@ -179,6 +184,12 @@ export class DataSetPatch {
179
184
  @Field({ nullable: true })
180
185
  summaryPeriod?: DataSetSummaryPeriodType
181
186
 
187
+ @Field({
188
+ nullable: true,
189
+ description: 'The maximum allowed time limit (in seconds) for completing the data entry operation'
190
+ })
191
+ timeLimit?: number
192
+
182
193
  @Field()
183
194
  cuFlag: string
184
195
  }
@@ -150,6 +150,16 @@ export class DataSet {
150
150
  @RelationId((dataSet: DataSet) => dataSet.supervisoryRole)
151
151
  supervisoryRoleId?: string
152
152
 
153
+ @ManyToOne(type => Role, { nullable: true })
154
+ @Field(type => Role, {
155
+ nullable: true,
156
+ description: 'The final authority on resolving outlier related to that dataset.'
157
+ })
158
+ resolverRole?: Role
159
+
160
+ @RelationId((dataSet: DataSet) => dataSet.resolverRole)
161
+ resolverRoleId?: string
162
+
153
163
  @Column('simple-json', { nullable: true })
154
164
  @Field(type => [AssigneeItem], { nullable: true, description: 'Who to contact for OOC issues' })
155
165
  assignees?: AssigneeItem[]
@@ -285,6 +295,13 @@ export class DataSet {
285
295
  @Field({ nullable: true, description: 'The summary schedule ID of the dataset' })
286
296
  summaryScheduleId?: string
287
297
 
298
+ @Column({ nullable: true })
299
+ @Field({
300
+ nullable: true,
301
+ description: 'The maximum allowed time limit (in seconds) for completing the data entry operation'
302
+ })
303
+ timeLimit?: number
304
+
288
305
  @CreateDateColumn()
289
306
  @Field({ nullable: true, description: 'The date and time the dataset was created' })
290
307
  createdAt?: Date
@@ -204,8 +204,14 @@ export class DataSetHistory implements HistoryEntityInterface<DataSet> {
204
204
  ? 'enum'
205
205
  : DATABASE_TYPE == 'oracle'
206
206
  ? 'varchar2'
207
- : 'smallint',
208
- enum: HistoryActionType
207
+ : DATABASE_TYPE == 'mssql'
208
+ ? 'nvarchar'
209
+ : 'varchar',
210
+ enum:
211
+ DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
212
+ ? HistoryActionType
213
+ : undefined,
214
+ length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 10
209
215
  })
210
216
  public action!: HistoryActionType
211
217
  }
@@ -154,7 +154,7 @@ export class DataSummaryQuery {
154
154
  async dataItems(@Root() dataSummary: DataSummary): Promise<DataItem[]> {
155
155
  const dataSet = dataSummary.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataSummary.dataSetId }))
156
156
 
157
- return dataSet?.dataItems || []
157
+ return dataSet?.dataItems.filter(item => item.active) || []
158
158
  }
159
159
 
160
160
  @FieldResolver(type => DataSet)
@@ -70,6 +70,7 @@
70
70
  "field.report-view": "report view",
71
71
  "field.request-params": "request parameters",
72
72
  "field.requires-review": "requires review",
73
+ "field.resolver-role": "resolver role",
73
74
  "field.review-approval-line": "review approval line",
74
75
  "field.role": "role",
75
76
  "field.serial-no": "serial #",
@@ -82,6 +83,7 @@
82
83
  "field.supervisory-role": "supervisory role",
83
84
  "field.t-key": "translation key",
84
85
  "field.tag": "tag name",
86
+ "field.time-limit": "time limit",
85
87
  "field.time-period": "time period",
86
88
  "field.unit": "unit",
87
89
  "field.use-case": "use case",
@@ -41,6 +41,7 @@
41
41
  "field.entry-view": "入力用画面",
42
42
  "field.finalizing-function": "最終処理関数",
43
43
  "field.hidden": "隠し",
44
+ "field.hours-limit": "制限時間",
44
45
  "field.item": "項目",
45
46
  "field.key": "キ",
46
47
  "field.key-01": "キー1",
@@ -71,6 +72,7 @@
71
72
  "field.report-view": "レポート用画面",
72
73
  "field.request-params": "リクエスト パラメータ",
73
74
  "field.requires-review": "見直しが必要",
75
+ "field.resolver-role": "解決者役割",
74
76
  "field.review-approval-line": "決済ライン",
75
77
  "field.role": "ロール",
76
78
  "field.serial-no": "シリアル番号",
@@ -71,6 +71,7 @@
71
71
  "field.report-view": "리포트용 화면",
72
72
  "field.request-params": "요청 매개변수",
73
73
  "field.requires-review": "검토 요청",
74
+ "field.resolver-role": "해결자 역할",
74
75
  "field.review-approval-line": "결재라인",
75
76
  "field.role": "역할",
76
77
  "field.serial-no": "시리얼번호",
@@ -82,6 +83,7 @@
82
83
  "field.supervisory-role": "관리자 역할",
83
84
  "field.t-key": "번역 키",
84
85
  "field.tag": "태그이름",
86
+ "field.time-limit": "제한시간",
85
87
  "field.time-period": "시간단위",
86
88
  "field.unit": "단위",
87
89
  "field.use-case": "사용 사례",
@@ -71,6 +71,7 @@
71
71
  "field.report-view": "paparan laporan",
72
72
  "field.request-params": "parameter permintaan",
73
73
  "field.requires-review": "memerlukan semakan",
74
+ "field.resolver-role": "peranan penyelesai",
74
75
  "field.review-approval-line": "baris kelulusan",
75
76
  "field.role": "peranan",
76
77
  "field.serial-no": "no. siri",
@@ -82,6 +83,7 @@
82
83
  "field.supervisory-role": "peranan pengawasan",
83
84
  "field.t-key": "kunci terjemahan",
84
85
  "field.tag": "nama tag",
86
+ "field.time-limit": "had masa",
85
87
  "field.time-period": "tempoh masa",
86
88
  "field.unit": "unit",
87
89
  "field.use-case": "kes penggunaan",
@@ -71,6 +71,7 @@
71
71
  "field.report-view": "报告界面",
72
72
  "field.request-params": "请求参数",
73
73
  "field.requires-review": "需要审查",
74
+ "field.resolver-role": "解决者角色",
74
75
  "field.review-approval-line": "审批线",
75
76
  "field.role": "角色",
76
77
  "field.serial-no": "序列号",
@@ -82,6 +83,7 @@
82
83
  "field.supervisory-role": "监管角色",
83
84
  "field.t-key": "翻译键",
84
85
  "field.tag": "标签名",
86
+ "field.time-limit": "限制时间",
85
87
  "field.time-period": "时间单位",
86
88
  "field.unit": "单位",
87
89
  "field.use-case": "使用案例",