@things-factory/dataset 8.0.0 → 8.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. package/client/activities/activity-data-review-edit.ts +150 -5
  2. package/client/activities/activity-data-review-view.ts +81 -0
  3. package/dist-client/activities/activity-data-review-edit.d.ts +5 -1
  4. package/dist-client/activities/activity-data-review-edit.js +152 -5
  5. package/dist-client/activities/activity-data-review-edit.js.map +1 -1
  6. package/dist-client/activities/activity-data-review-view.js +80 -0
  7. package/dist-client/activities/activity-data-review-view.js.map +1 -1
  8. package/dist-client/tsconfig.tsbuildinfo +1 -1
  9. package/dist-server/activities/activity-data-review.js +18 -5
  10. package/dist-server/activities/activity-data-review.js.map +1 -1
  11. package/dist-server/activities/activity-ooc-review.js +13 -52
  12. package/dist-server/activities/activity-ooc-review.js.map +1 -1
  13. package/dist-server/controllers/create-data-ooc.d.ts +4 -0
  14. package/dist-server/controllers/create-data-ooc.js +67 -0
  15. package/dist-server/controllers/create-data-ooc.js.map +1 -0
  16. package/dist-server/controllers/create-data-sample.js +4 -94
  17. package/dist-server/controllers/create-data-sample.js.map +1 -1
  18. package/dist-server/controllers/index.d.ts +3 -0
  19. package/dist-server/controllers/index.js +3 -0
  20. package/dist-server/controllers/index.js.map +1 -1
  21. package/dist-server/controllers/issue-ooc-resolve.d.ts +3 -0
  22. package/dist-server/controllers/issue-ooc-resolve.js +49 -0
  23. package/dist-server/controllers/issue-ooc-resolve.js.map +1 -0
  24. package/dist-server/controllers/issue-ooc-review.d.ts +3 -0
  25. package/dist-server/controllers/issue-ooc-review.js +47 -0
  26. package/dist-server/controllers/issue-ooc-review.js.map +1 -0
  27. package/dist-server/service/data-archive/index.d.ts +1 -1
  28. package/dist-server/service/data-ooc/index.d.ts +1 -1
  29. package/dist-server/service/data-sample/index.d.ts +1 -1
  30. package/dist-server/service/data-set/index.d.ts +1 -1
  31. package/dist-server/service/index.d.ts +2 -2
  32. package/dist-server/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +13 -13
  34. package/server/activities/activity-data-review.ts +32 -5
  35. package/server/activities/activity-ooc-review.ts +20 -69
  36. package/server/controllers/create-data-ooc.ts +80 -0
  37. package/server/controllers/create-data-sample.ts +4 -107
  38. package/server/controllers/index.ts +3 -0
  39. package/server/controllers/issue-ooc-resolve.ts +58 -0
  40. package/server/controllers/issue-ooc-review.ts +52 -0
  41. package/translations/en.json +3 -0
  42. package/translations/ja.json +3 -0
  43. package/translations/ko.json +3 -0
  44. package/translations/ms.json +3 -0
  45. package/translations/zh.json +3 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/dataset",
3
- "version": "8.0.0",
3
+ "version": "8.0.2",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -40,21 +40,21 @@
40
40
  "@operato/shell": "^8.0.0",
41
41
  "@operato/styles": "^8.0.0",
42
42
  "@operato/utils": "^8.0.0",
43
- "@things-factory/auth-base": "^8.0.0",
44
- "@things-factory/aws-base": "^8.0.0",
45
- "@things-factory/board-service": "^8.0.0",
46
- "@things-factory/env": "^8.0.0",
47
- "@things-factory/integration-base": "^8.0.0",
48
- "@things-factory/organization": "^8.0.0",
49
- "@things-factory/personalization": "^8.0.0",
50
- "@things-factory/scheduler-client": "^8.0.0",
51
- "@things-factory/shell": "^8.0.0",
52
- "@things-factory/work-shift": "^8.0.0",
53
- "@things-factory/worklist": "^8.0.0",
43
+ "@things-factory/auth-base": "^8.0.2",
44
+ "@things-factory/aws-base": "^8.0.2",
45
+ "@things-factory/board-service": "^8.0.2",
46
+ "@things-factory/env": "^8.0.2",
47
+ "@things-factory/integration-base": "^8.0.2",
48
+ "@things-factory/organization": "^8.0.2",
49
+ "@things-factory/personalization": "^8.0.2",
50
+ "@things-factory/scheduler-client": "^8.0.2",
51
+ "@things-factory/shell": "^8.0.2",
52
+ "@things-factory/work-shift": "^8.0.2",
53
+ "@things-factory/worklist": "^8.0.2",
54
54
  "cron-parser": "^4.3.0",
55
55
  "moment-timezone": "^0.5.45",
56
56
  "simple-statistics": "^7.8.3",
57
57
  "statistics": "^3.3.0"
58
58
  },
59
- "gitHead": "07ef27d272dd9a067a9648ac7013748510556a18"
59
+ "gitHead": "39d60f56e142561233ddf6d47b539c637971357c"
60
60
  }
@@ -1,26 +1,53 @@
1
1
  import { ActivityInstance, ActivityInstanceStatus, UpdateActivityInstanceStateAddendum } from '@things-factory/worklist'
2
2
 
3
- import { DataOocStatus } from '../service/data-ooc/data-ooc'
3
+ import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
4
4
  import { DataSample } from '../service/data-sample/data-sample'
5
+ import { createDataOoc } from '../controllers/create-data-ooc'
6
+ import { issueOocResolve } from '../controllers/issue-ooc-resolve'
5
7
 
6
8
  async function callback(
7
9
  activityInstance: ActivityInstance,
8
10
  addendum: UpdateActivityInstanceStateAddendum,
9
11
  context: ResolverContext
10
12
  ) {
11
- const { domain, tx, user } = context.state
13
+ const { domain, tx } = context.state
12
14
  const { input, output, state } = activityInstance
13
15
 
14
16
  if (state == ActivityInstanceStatus.Ended) {
15
- var dataSample = await tx.getRepository(DataSample).findOne({
16
- where: { domain: { id: domain.id }, id: input?.dataSample?.id }
17
+ const { dataSampleId } = input || {}
18
+
19
+ if (!dataSampleId) {
20
+ throw new Error('Data sample ID is missing in the input.')
21
+ }
22
+
23
+ const dataSample = await tx.getRepository(DataSample).findOne({
24
+ where: { domain: { id: domain.id }, id: dataSampleId },
25
+ relations: ['domain', 'dataSet', 'creator', 'updater']
17
26
  })
18
27
 
19
- dataSample = await tx.getRepository(DataSample).save({
28
+ await tx.getRepository(DataSample).save({
20
29
  ...dataSample,
21
30
  output,
22
31
  state: DataOocStatus.REVIEWED
23
32
  })
33
+
34
+ const { judgment, instruction } = output
35
+
36
+ if (judgment == 'abnormal') {
37
+ /* Review 결과가 Ooc 조치가 필요하다고 하면, DataOoc를 생성하고, DataOocResolve를 이슈한다. */
38
+ var ooc = await createDataOoc(dataSample, dataSample.dataSet, context)
39
+
40
+ ooc = await tx.getRepository(DataOoc).save({
41
+ ...ooc,
42
+ reviewedAt: activityInstance.terminatedAt,
43
+ reviewer: activityInstance.updater,
44
+ correctiveInstruction: instruction,
45
+ reviewActivityInstance: activityInstance,
46
+ state: DataOocStatus.REVIEWED
47
+ })
48
+
49
+ await issueOocResolve(ooc, dataSample.dataSet, instruction, context)
50
+ }
24
51
  }
25
52
  }
26
53
 
@@ -1,14 +1,7 @@
1
- import { In } from 'typeorm'
2
- import {
3
- Activity,
4
- ActivityInstance,
5
- ActivityInstanceStatus,
6
- UpdateActivityInstanceStateAddendum
7
- } from '@things-factory/worklist'
8
- import { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'
9
- import { Role } from '@things-factory/auth-base'
1
+ import { ActivityInstance, ActivityInstanceStatus, UpdateActivityInstanceStateAddendum } from '@things-factory/worklist'
10
2
 
11
3
  import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
4
+ import { issueOocResolve } from '../controllers/issue-ooc-resolve'
12
5
 
13
6
  async function callback(
14
7
  activityInstance: ActivityInstance,
@@ -20,69 +13,27 @@ async function callback(
20
13
  const { causedBy } = addendum || {}
21
14
 
22
15
  if (state == ActivityInstanceStatus.Ended) {
23
- const activity = (await tx.getRepository(Activity).findOneBy({
24
- domain: domain.parentId ? In([domain.id, domain.parentId]) : { id: domain.id },
25
- name: 'OOC Resolve'
26
- })) as Activity
16
+ const { dataOocId } = input
17
+ const correctiveInstruction = output?.instruction
27
18
 
28
- if (activity) {
29
- const { dataOocId } = input
30
- const correctiveInstruction = output?.instruction
19
+ var dataOoc = await tx.getRepository(DataOoc).findOne({
20
+ where: {
21
+ domain: { id: domain.id },
22
+ id: dataOocId
23
+ },
24
+ relations: ['dataSet']
25
+ })
31
26
 
32
- var dataOoc = await tx.getRepository(DataOoc).findOne({
33
- where: {
34
- domain: { id: domain.id },
35
- id: dataOocId
36
- },
37
- relations: ['dataSet']
38
- })
27
+ /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */
28
+ dataOoc = await tx.getRepository(DataOoc).save({
29
+ ...dataOoc,
30
+ reviewedAt: terminatedAt,
31
+ reviewer: user,
32
+ correctiveInstruction,
33
+ state: DataOocStatus.REVIEWED
34
+ })
39
35
 
40
- const dataSet = dataOoc.dataSet
41
- const { resolverRoleId, outlierApprovalLine } = dataSet
42
-
43
- /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */
44
- dataOoc = await tx.getRepository(DataOoc).save({
45
- ...dataOoc,
46
- reviewedAt: terminatedAt,
47
- reviewer: user,
48
- correctiveInstruction,
49
- state: DataOocStatus.REVIEWED
50
- })
51
-
52
- const assigneeRole =
53
- resolverRoleId &&
54
- (await tx.getRepository(Role).findOneBy({
55
- domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },
56
- id: resolverRoleId
57
- }))
58
-
59
- /* 해당 dataset의 작업 담당자(resolverRole)에게 OOC 해결을 위한 태스크를 지시한다. */
60
- if (assigneeRole) {
61
- const activityInstance = {
62
- name: `[OOC 조치] ${dataSet.name}`,
63
- description: dataSet.description,
64
- activityId: activity.id,
65
- dueAt: new Date(terminatedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),
66
- input: {
67
- dataOocId,
68
- instruction: correctiveInstruction
69
- },
70
- assigneeRole,
71
- threadsMin: 1,
72
- threadsMax: 1,
73
- approvalLine: outlierApprovalLine
74
- }
75
-
76
- dataOoc.resolveActivityInstance = await issue(activityInstance, context)
77
- await tx.getRepository(DataOoc).save(dataOoc)
78
- } else {
79
- console.error(
80
- `Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`
81
- )
82
- }
83
- } else {
84
- console.error('OOC Resolve Activity not installed.')
85
- }
36
+ await issueOocResolve(dataOoc, dataOoc.dataSet, correctiveInstruction, context)
86
37
  }
87
38
  }
88
39
 
@@ -0,0 +1,80 @@
1
+ import { In } from 'typeorm'
2
+
3
+ import { Scenario } from '@things-factory/integration-base'
4
+
5
+ import { DataSet } from '../service/data-set/data-set'
6
+ import { DataSample } from '../service/data-sample/data-sample'
7
+ import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
8
+
9
+ export async function createDataOoc(
10
+ dataSample: DataSample,
11
+ dataSet: DataSet,
12
+ context: ResolverContext
13
+ ): Promise<DataOoc> {
14
+ const { domain, user, tx } = context.state
15
+ const { collectedAt, data, ooc, oos, judgment, workDate, workShift } = dataSample
16
+
17
+ const dataOoc = await tx.getRepository(DataOoc).save({
18
+ ...dataSample,
19
+ history: [
20
+ {
21
+ user: {
22
+ id: user?.id,
23
+ // @ts-ignore
24
+ username: user?.username || user?.email,
25
+ name: user?.name
26
+ },
27
+ state: DataOocStatus.ISSUED,
28
+ timestamp: collectedAt
29
+ }
30
+ ],
31
+ state: DataOocStatus.ISSUED,
32
+ dataSample: dataSample
33
+ })
34
+
35
+ if (dataSet.outlierScenarioId) {
36
+ const scenario = await tx.getRepository(Scenario).findOne({
37
+ where: {
38
+ domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },
39
+ id: dataSet.outlierScenarioId
40
+ },
41
+ relations: ['domain', 'steps', 'updater']
42
+ })
43
+
44
+ if (scenario) {
45
+ scenario.start({
46
+ instanceName: scenario.name + ':' + dataSet.name + ':' + dataSample.id,
47
+ domain,
48
+ user,
49
+ variables: {
50
+ dataOocId: dataOoc.id,
51
+ dataSampleId: dataSample.id,
52
+ dataSet: dataSet.id,
53
+ data,
54
+ ooc,
55
+ oos,
56
+ judgment,
57
+ collectedAt,
58
+ workDate,
59
+ workShift,
60
+ domain: {
61
+ id: domain.id,
62
+ subdomain: domain.subdomain,
63
+ name: domain.name
64
+ },
65
+ updator: {
66
+ id: user.id,
67
+ // @ts-ignore
68
+ username: user.username || user.email,
69
+ email: user.email,
70
+ name: user.name
71
+ }
72
+ }
73
+ })
74
+ } else {
75
+ console.error(`Cannot find the set outlier-scenario for the dataset(${dataSet.name}).`)
76
+ }
77
+ }
78
+
79
+ return dataOoc
80
+ }
@@ -10,10 +10,11 @@ import { Scenario, publishData } from '@things-factory/integration-base'
10
10
  import { Activity } from '@things-factory/worklist'
11
11
  import { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'
12
12
 
13
- import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
14
13
  import { DataSample } from '../service/data-sample/data-sample'
15
14
  import { NewDataSample } from '../service/data-sample/data-sample-type'
16
15
  import { DataSet } from '../service/data-set/data-set'
16
+ import { createDataOoc } from './create-data-ooc'
17
+ import { issueOocReview } from './issue-ooc-review'
17
18
  import { DataUseCase } from './data-use-case'
18
19
 
19
20
  // See README.md at ## Data Samples
@@ -196,114 +197,10 @@ export async function createDataSample(newDataSample: NewDataSample, context: Re
196
197
  }
197
198
 
198
199
  if (ooc || oos) {
199
- const dataOoc = await tx.getRepository(DataOoc).save({
200
- ...dataSample,
201
- history: [
202
- {
203
- user: {
204
- id: user?.id,
205
- name: user?.name
206
- },
207
- state: DataOocStatus.ISSUED,
208
- timestamp: collectedAt
209
- }
210
- ],
211
- state: DataOocStatus.ISSUED,
212
- dataSample: dataSample
213
- })
214
-
215
- if (outlierScenarioId) {
216
- const scenario = await tx.getRepository(Scenario).findOne({
217
- where: {
218
- domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },
219
- id: outlierScenarioId
220
- },
221
- relations: ['domain', 'steps', 'updater']
222
- })
223
-
224
- if (scenario) {
225
- scenario.start({
226
- instanceName: scenario.name + ':' + dataSet.name + ':' + dataSample.id,
227
- domain,
228
- user,
229
- variables: {
230
- dataOocId: dataOoc.id,
231
- dataSampleId: dataSample.id,
232
- dataSet: dataSet.id,
233
- data,
234
- ooc,
235
- oos,
236
- judgment,
237
- collectedAt,
238
- workDate,
239
- workShift,
240
- domain: {
241
- id: domain.id,
242
- subdomain: domain.subdomain,
243
- name: domain.name
244
- },
245
- updator: {
246
- id: user.id,
247
- email: user.email,
248
- name: user.name
249
- }
250
- }
251
- })
252
- } else {
253
- console.error(`Cannot find the set outlier-scenario for the dataset(${dataSet.name}).`)
254
- }
255
- }
256
-
257
- const activity = (await tx.getRepository(Activity).findOneBy({
258
- domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },
259
- name: 'OOC Review'
260
- })) as Activity
261
-
262
- if (activity) {
263
- const assigneeRole =
264
- dataSet.supervisoryRoleId &&
265
- (await tx.getRepository(Role).findOneBy({
266
- domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },
267
- id: dataSet.supervisoryRoleId
268
- }))
269
-
270
- // const assignees = dataSet.supervisoryRoleId
271
- // ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assigneeRole }]
272
- // : []
273
-
274
- /* 해당 dataset의 supervisor로 하여금, OOC를 리뷰하고 instruction을 작성해서, OOC 해결을 위한 태스크를 dataset assignees에게 지시하도록 한다. */
275
- if (assigneeRole) {
276
- const activityInstance = {
277
- name: `[OOC 검토] ${dataSet.name}`,
278
- description: dataSet.description,
279
- activityId: activity.id,
280
- dueAt: new Date(collectedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),
281
- input: {
282
- dataOocId: dataOoc.id
283
- },
284
- assigneeRole,
285
- threadsMin: 1,
286
- threadsMax: 1,
287
- approvalLine: []
288
- }
289
-
290
- dataOoc.reviewActivityInstance = await issue(activityInstance as any, context)
291
- await tx.getRepository(DataOoc).save(dataOoc)
292
- } else {
293
- console.error(
294
- `Assignees are not set. So Data OOC Review task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`
295
- )
296
- }
297
- } else {
298
- console.warn('OOC Review Activity not installed.')
299
- }
200
+ const dataOoc = await createDataOoc(dataSample, dataSet, context)
201
+ await issueOocReview(dataOoc, dataSet, context)
300
202
 
301
203
  try {
302
- // pubsub.publish('data-ooc', {
303
- // dataOoc,
304
- // supervisoryRoleId: dataSet.supervisoryRoleId
305
- // })
306
-
307
204
  pubsub.publish('notification', {
308
205
  notification: {
309
206
  domain,
@@ -1,3 +1,6 @@
1
1
  export * from './create-data-sample'
2
+ export * from './create-data-ooc'
3
+ export * from './issue-ooc-review'
4
+ export * from './issue-ooc-resolve'
2
5
  export * from './data-use-case'
3
6
  export * from './query-data-summary-by-period'
@@ -0,0 +1,58 @@
1
+ import { In } from 'typeorm'
2
+ import { Activity } from '@things-factory/worklist'
3
+ import { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'
4
+ import { Role } from '@things-factory/auth-base'
5
+
6
+ import { DataOoc } from '../service/data-ooc/data-ooc'
7
+ import { DataSet } from 'service'
8
+
9
+ export async function issueOocResolve(
10
+ dataOoc: DataOoc,
11
+ dataSet: DataSet,
12
+ correctiveInstruction: string,
13
+ context: ResolverContext
14
+ ): Promise<void> {
15
+ const { domain, user, tx } = context.state
16
+ const { resolverRoleId, outlierApprovalLine } = dataSet
17
+
18
+ const activity = (await tx.getRepository(Activity).findOneBy({
19
+ domain: domain.parentId ? In([domain.id, domain.parentId]) : { id: domain.id },
20
+ name: 'OOC Resolve'
21
+ })) as Activity
22
+
23
+ if (activity) {
24
+ const assigneeRole =
25
+ resolverRoleId &&
26
+ (await tx.getRepository(Role).findOneBy({
27
+ domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },
28
+ id: resolverRoleId
29
+ }))
30
+
31
+ /* 해당 dataset의 작업 담당자(resolverRole)에게 OOC 해결을 위한 태스크를 지시한다. */
32
+ if (assigneeRole) {
33
+ const activityInstance = {
34
+ name: `[OOC 조치] ${dataSet.name}`,
35
+ description: dataSet.description,
36
+ activityId: activity.id,
37
+ dueAt: new Date(Date.now() + (activity.standardTime || 24 * 60 * 60) * 1000),
38
+ input: {
39
+ dataOocId: dataOoc.id,
40
+ instruction: correctiveInstruction
41
+ },
42
+ assigneeRole,
43
+ threadsMin: 1,
44
+ threadsMax: 1,
45
+ approvalLine: outlierApprovalLine
46
+ }
47
+
48
+ dataOoc.resolveActivityInstance = await issue(activityInstance, context)
49
+ await tx.getRepository(DataOoc).save(dataOoc)
50
+ } else {
51
+ console.error(
52
+ `Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`
53
+ )
54
+ }
55
+ } else {
56
+ console.error('OOC Resolve Activity not installed.')
57
+ }
58
+ }
@@ -0,0 +1,52 @@
1
+ import { In } from 'typeorm'
2
+
3
+ import { Role } from '@things-factory/auth-base'
4
+ import { Activity } from '@things-factory/worklist'
5
+ import { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'
6
+
7
+ import { DataSet } from '../service/data-set/data-set'
8
+ import { DataOoc } from '../service/data-ooc/data-ooc'
9
+
10
+ export async function issueOocReview(dataOoc: DataOoc, dataSet: DataSet, context: ResolverContext): Promise<void> {
11
+ const { domain, tx } = context.state
12
+ const { collectedAt } = dataOoc
13
+
14
+ const activity = (await tx.getRepository(Activity).findOneBy({
15
+ domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },
16
+ name: 'OOC Review'
17
+ })) as Activity
18
+
19
+ if (activity) {
20
+ const assigneeRole =
21
+ dataSet.supervisoryRoleId &&
22
+ (await tx.getRepository(Role).findOneBy({
23
+ domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },
24
+ id: dataSet.supervisoryRoleId
25
+ }))
26
+
27
+ if (assigneeRole) {
28
+ const activityInstance = {
29
+ name: `[OOC 검토] ${dataSet.name}`,
30
+ description: dataSet.description,
31
+ activityId: activity.id,
32
+ dueAt: new Date(collectedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),
33
+ input: {
34
+ dataOocId: dataOoc.id
35
+ },
36
+ assigneeRole,
37
+ threadsMin: 1,
38
+ threadsMax: 1,
39
+ approvalLine: []
40
+ }
41
+
42
+ dataOoc.reviewActivityInstance = await issue(activityInstance as any, context)
43
+ await tx.getRepository(DataOoc).save(dataOoc)
44
+ } else {
45
+ console.error(
46
+ `Assignees are not set. So Data OOC Review task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`
47
+ )
48
+ }
49
+ } else {
50
+ console.warn('OOC Review Activity not installed.')
51
+ }
52
+ }
@@ -99,6 +99,9 @@
99
99
  "label.datasample review timeline": "data sample review timeline",
100
100
  "label.end-date": "end date",
101
101
  "label.group-by data-keys": "group by each data-keys",
102
+ "label.judgment": "judgment",
103
+ "label.judgment-abnormal": "action needed",
104
+ "label.judgment-normal": "normal",
102
105
  "label.maximum value": "maximum value",
103
106
  "label.minimum value": "minimum value",
104
107
  "label.ooc resolve timeline": "OOC resolve timeline",
@@ -99,6 +99,9 @@
99
99
  "label.datasample review timeline": "データサンプルレビュータイムライン",
100
100
  "label.end-date": "終了日",
101
101
  "label.group-by data-keys": "各データキーごとにグループ化",
102
+ "label.judgment": "判定",
103
+ "label.judgment-abnormal": "措置必要",
104
+ "label.judgment-normal": "正常",
102
105
  "label.maximum value": "最大値",
103
106
  "label.minimum value": "最小値",
104
107
  "label.ooc resolve timeline": "OOC 解決タイムライン",
@@ -99,6 +99,9 @@
99
99
  "label.datasample review timeline": "데이타샘플 리뷰 타임라인",
100
100
  "label.end-date": "종료일",
101
101
  "label.group-by data-keys": "각 데이터 키별로 그룹화",
102
+ "label.judgment": "판정",
103
+ "label.judgment-abnormal": "조치필요",
104
+ "label.judgment-normal": "정상",
102
105
  "label.maximum value": "최대값",
103
106
  "label.minimum value": "최소값",
104
107
  "label.ooc resolve timeline": "OOC 조치 타임라인",
@@ -99,6 +99,9 @@
99
99
  "label.datasample review timeline": "garis masa ulasan sampel data",
100
100
  "label.end-date": "tarikh tamat",
101
101
  "label.group-by data-keys": "kumpulkan mengikut setiap data-keys",
102
+ "label.judgment": "penilaian",
103
+ "label.judgment-abnormal": "memerlukan tindakan",
104
+ "label.judgment-normal": "normal",
102
105
  "label.maximum value": "nilai maksimum",
103
106
  "label.minimum value": "nilai minimum",
104
107
  "label.ooc resolve timeline": "garis masa penyelesaian OOC",
@@ -99,6 +99,9 @@
99
99
  "label.datasample review timeline": "数据样本审查时间线",
100
100
  "label.end-date": "结束日期",
101
101
  "label.group-by data-keys": "按每个数据键分组",
102
+ "label.judgment": "判定",
103
+ "label.judgment-abnormal": "需要措施",
104
+ "label.judgment-normal": "正常",
102
105
  "label.maximum value": "最大值",
103
106
  "label.minimum value": "最小值",
104
107
  "label.ooc resolve timeline": "OOC 解决时间线",