@things-factory/worklist 6.0.43 → 6.0.45
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/client/pages/activity-stats/activity-stats-importer.ts +97 -0
- package/client/pages/activity-stats/activity-stats-list-page.ts +348 -0
- package/client/pages/todo/approval-done-list-page.ts +340 -0
- package/client/pages/todo/approval-pending-list-page.ts +1 -1
- package/client/pages/todo/done-list-calendar-page.ts +115 -0
- package/client/pages/todo/done-list-page.ts +1 -2
- package/client/pages/todo/pickable-list-page.ts +2 -1
- package/client/route.ts +12 -0
- package/client/themes/calendar-theme.css +54 -0
- package/dist-client/pages/activity-stats/activity-stats-importer.d.ts +22 -0
- package/dist-client/pages/activity-stats/activity-stats-importer.js +100 -0
- package/dist-client/pages/activity-stats/activity-stats-importer.js.map +1 -0
- package/dist-client/pages/activity-stats/activity-stats-list-page.d.ts +62 -0
- package/dist-client/pages/activity-stats/activity-stats-list-page.js +326 -0
- package/dist-client/pages/activity-stats/activity-stats-list-page.js.map +1 -0
- package/dist-client/pages/todo/approval-done-list-page.d.ts +39 -0
- package/dist-client/pages/todo/approval-done-list-page.js +338 -0
- package/dist-client/pages/todo/approval-done-list-page.js.map +1 -0
- package/dist-client/pages/todo/approval-pending-list-page.js +1 -1
- package/dist-client/pages/todo/approval-pending-list-page.js.map +1 -1
- package/dist-client/pages/todo/done-list-calendar-page.d.ts +24 -0
- package/dist-client/pages/todo/done-list-calendar-page.js +107 -0
- package/dist-client/pages/todo/done-list-calendar-page.js.map +1 -0
- package/dist-client/pages/todo/done-list-page.js +1 -2
- package/dist-client/pages/todo/done-list-page.js.map +1 -1
- package/dist-client/pages/todo/pickable-list-page.d.ts +1 -0
- package/dist-client/pages/todo/pickable-list-page.js +2 -1
- package/dist-client/pages/todo/pickable-list-page.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +9 -0
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/activity-approval/activity-approval-query.js +48 -0
- package/dist-server/service/activity-approval/activity-approval-query.js.map +1 -1
- package/dist-server/service/activity-stats/activity-stats-query.js +93 -0
- package/dist-server/service/activity-stats/activity-stats-query.js.map +1 -0
- package/dist-server/service/activity-stats/activity-stats-type.js +47 -0
- package/dist-server/service/activity-stats/activity-stats-type.js.map +1 -0
- package/dist-server/service/activity-stats/index.js +6 -0
- package/dist-server/service/activity-stats/index.js.map +1 -0
- package/dist-server/service/activity-summary/activity-summary-query.js +4 -22
- package/dist-server/service/activity-summary/activity-summary-query.js.map +1 -1
- package/dist-server/service/index.js +2 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/worklist/activity-bank.md +22 -0
- package/helps/worklist/{activity-approval.md → activity-stats.md} +1 -1
- package/helps/worklist/draft-list.md +15 -0
- package/helps/worklist/worklist-concept.md +11 -8
- package/package.json +3 -2
- package/server/service/activity-approval/activity-approval-query.ts +45 -1
- package/server/service/activity-stats/activity-stats-query.ts +94 -0
- package/server/service/activity-stats/activity-stats-type.ts +34 -0
- package/server/service/activity-stats/index.ts +3 -0
- package/server/service/activity-summary/activity-summary-query.ts +4 -22
- package/server/service/index.ts +2 -0
- package/things-factory.config.js +4 -1
- package/translations/en.json +10 -0
- package/translations/ko.json +12 -2
- package/translations/ms.json +10 -0
- package/translations/zh.json +10 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# 업무 뱅크
|
|
2
|
+
|
|
3
|
+
## 개요
|
|
4
|
+
|
|
5
|
+
워크리스트 시스템에서 미할당 업무들을 모아둔 곳인 업무뱅크는, 다양한 업무들을 포함하는 일종의 업무 목록 혹은 대기열(queue)입니다. 이 업무들은 일반적으로 프로젝트나 팀에서 진행해야 할 일들 중 미해결된 업무들로 구성됩니다. 업무뱅크에 포함된 업무들은 우선순위, 난이도, 기간 등 다양한 정보들을 가지고 있으며, 해당 업무를 담당하는 사용자가 할당되기 전까지는 "미할당 상태"로 존재합니다.
|
|
6
|
+
|
|
7
|
+
업무뱅크에서 업무를 선택(pick)하면, 해당 업무를 수행할 수 있는 자격 역할을 가진 사용자가 그 업무를 자신의 TODO 리스트로 옮길 수 있습니다. 이렇게 옮겨진 업무는 해당 사용자의 개인 TODO 리스트에 추가되어, 이후 해당 사용자가 해당 업무를 수행하도록 할당됩니다.
|
|
8
|
+
|
|
9
|
+
이러한 시스템을 통해, 업무뱅크를 통해 미할당된 업무들을 한 곳에서 모아서 효율적으로 관리할 수 있습니다. 또한, 업무를 수행하는 사용자들이 자신의 업무 선택을 할 수 있는 기능을 제공하여, 업무를 더욱 효과적으로 분배하고 업무 수행의 효율성을 높일 수 있습니다.
|
|
10
|
+
|
|
11
|
+
## 업무 쇼핑
|
|
12
|
+
|
|
13
|
+
아직 할당되지 않은 작업들의 리스트를 조회하고, 그 중에서 사용자가 스스로에게 해당 업무를 할당하여 수행할 수 있는 기능입니다.
|
|
14
|
+
미할당 업무를 스스로에게 할당하는 것을 업무를 선택(PICK)한다고 하며, 이런 대상업무들이 업무뱅크에 리스트되어 있습니다.
|
|
15
|
+
|
|
16
|
+
사용자가 업무뱅크에서 볼 수 있는 미할당 업무들은 사용자에게 할당되지는 않았지만, 해당 업무에 대해서 사용자가 수행할 수 있는 자격이 있는 업무들만 조회되게 됩니다.
|
|
17
|
+
그러한 자격은 보통 시스템에서 부여된 역할(Role)에 의해서 결정됩니다.
|
|
18
|
+
|
|
19
|
+
보통 업무를 정의하고 업무뱅크에 올릴 때(POST) 해당 업무를 수행할 수 있는 자격 역할(Role)을 지정하게 됩니다.
|
|
20
|
+
따라서, 해당 역할(Role)을 가진 사용자들이 그 업무를 선택(PICK)할 수 있는 것입니다.
|
|
21
|
+
|
|
22
|
+
사용자가 선택(PICK)한 업무는 나의 할일 리스트에 포함되게 되며, 업무뱅크 리스트에서 사라지게 됩니다.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# 작성중인 업무
|
|
2
|
+
|
|
3
|
+
## 개요
|
|
4
|
+
|
|
5
|
+
워크리스트 시스템에서 작성중인 업무는 일반적으로 "Draft" 상태로 분류됩니다. 이러한 업무는 아직 완료되지 않았거나, 작업이 일시 중단된 상태이며, 업무를 작성하고 있는 사용자가 해당 업무를 다시 가져와서 작업을 계속할 수 있도록 보관되어야 하는 상태입니다.
|
|
6
|
+
|
|
7
|
+
따라서, 워크리스트 시스템에서는 해당 사용자가 작성중인 업무를 리스팅할 수 있는 기능을 제공합니다. 이를 통해, 작성중인 업무를 쉽게 찾을 수 있으며, 다시 해당 업무를 가져와서 작업을 이어나갈 수 있습니다. 일반적으로, 작성중인 업무를 리스팅하는 기능은 사용자의 개인적인 작업 대시보드에서 제공되며, 해당 사용자가 작성 중인 모든 업무들의 요약 정보를 한 눈에 볼 수 있도록 구성되어 있습니다.
|
|
8
|
+
|
|
9
|
+
또한, 해당 기능은 작성중인 업무들의 상세 정보를 확인할 수 있는 링크를 제공하여, 사용자가 해당 업무의 내용을 다시 확인하거나 수정할 수 있도록 합니다. 이러한 기능을 통해, 작성중인 업무들을 보다 쉽게 관리하고, 업무 작성에 대한 효율성을 높일 수 있습니다.
|
|
10
|
+
|
|
11
|
+
## 작동 방식
|
|
12
|
+
|
|
13
|
+
"작성중인 업무"는 업무를 정의하고 할당하고자 하는 사용자가 업무를 기획하는 과정에서 초안작업(Draft) 중인 상태의 업무를 의미합니다.
|
|
14
|
+
따라서, 이 상태의 업무는 아직 포스팅되기 전이며, 사용자가 그 과정에서 취소할 수도 있으며, 최종 완성하여 업무를 할당하거나 업무뱅크에 리스팅할 수도 있습니다.
|
|
15
|
+
이렇게 작성완료되어 할당 또는 업무뱅크에 리스팅된 상태를 포스트(Posted) 상태라고 합니다.
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
- 재개: 보류 상태의 유저태스크가 다시 진행 중인 상태가 됩니다.
|
|
43
43
|
- 완료: 진행 중인 유저태스크가 완료 상태가 됩니다.
|
|
44
44
|
|
|
45
|
-
## TODO 리스트
|
|
45
|
+
## TODO 리스트 (나의 할일 리스트)
|
|
46
46
|
|
|
47
47
|
TODO 리스트는 업무 처리에서 아직 해야 할 일들을 기록하고 추적하는 방법 중 하나입니다. 예를 들어, 업무 처리 중에 다음과 같은 상황이 생길 수 있습니다.
|
|
48
48
|
|
|
@@ -54,16 +54,19 @@ TODO 리스트는 업무 처리에서 아직 해야 할 일들을 기록하고
|
|
|
54
54
|
|
|
55
55
|
또한, TODO 리스트는 작성자의 생각을 정리하는 데에도 도움이 됩니다. 작성자가 어떤 일을 해야 하는지 명확하게 파악하고, 일을 처리하는 과정에서 생각이 더해질 경우 리스트에 추가하고, 처리가 완료된 일은 리스트에서 제거하여 업무 처리 상황을 파악할 수 있습니다. 이를 통해 업무 처리의 투명성을 높이고, 업무 처리에 대한 관리와 추적이 용이해집니다.
|
|
56
56
|
|
|
57
|
-
##
|
|
57
|
+
## 승인 대기 리스트
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
승인 대기 리스트는 업무 진행자가 자신이 수행한 업무에 대한 검토나 지속적인 추진을 위해서 관리자의 승인을 요청한 것들 중에서 내가 승인 또는 반려 처리해야하는 리스트를 보여줍니다.
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
사용자는 승인 대기 리스트에서 처리하고자 하는 업무를 선택하고 승인 또는 반려 처리를 할 수 있습니다.
|
|
62
|
+
이 과정에서 승인 또는 반려의 사유 등 판단의 근거를 코멘트로 남기도록 하고 있습니다.
|
|
62
63
|
|
|
63
|
-
|
|
64
|
+
사용자가 승인 또는 반려한 업무 이력은 '내가 수행한 승인리스트'에서 조회할 수 있습니다.
|
|
64
65
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
## 내가 수행한 승인리스트
|
|
67
|
+
|
|
68
|
+
내가 수행한 승인리스트는 이미 처리된 승인 업무를 기록하는 리스트입니다.
|
|
69
|
+
|
|
70
|
+
내가 수행한 승인리스트를 유지하는 것은 업무나 작업의 처리상태를 파악하고, 추후에 해당 작업이나 업무를 참조해야 할 때 유용합니다.
|
|
68
71
|
|
|
69
72
|
(이 페이지는 ChatGPT로 작성되었습니다.)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/worklist",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.45",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "dist-client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
+
"@operato/event-view": "^1.0.0",
|
|
28
29
|
"@operato/graphql": "^1.0.0",
|
|
29
30
|
"@operato/grist-editor": "^1.0.0",
|
|
30
31
|
"@things-factory/attachment-base": "^6.0.43",
|
|
@@ -36,5 +37,5 @@
|
|
|
36
37
|
"@things-factory/shell": "^6.0.43",
|
|
37
38
|
"moment-timezone": "^0.5.40"
|
|
38
39
|
},
|
|
39
|
-
"gitHead": "
|
|
40
|
+
"gitHead": "7ed9a41bd28093df9b43126ee38c0cdd0522afda"
|
|
40
41
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
|
|
2
2
|
import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
|
|
3
3
|
import { User } from '@things-factory/auth-base'
|
|
4
|
-
import { ActivityInstance } from '../activity-instance/activity-instance'
|
|
5
4
|
import { ActivityThread } from '../activity-thread/activity-thread'
|
|
6
5
|
import { ActivityApproval, ActivityApprovalJudgment } from './activity-approval'
|
|
7
6
|
import { ActivityApprovalList } from './activity-approval-type'
|
|
@@ -76,6 +75,51 @@ export class ActivityApprovalQuery {
|
|
|
76
75
|
return { items, total }
|
|
77
76
|
}
|
|
78
77
|
|
|
78
|
+
@Query(returns => ActivityApprovalList, {
|
|
79
|
+
description: 'To fetch the approvals(ActivityApprovals) which has done by me'
|
|
80
|
+
})
|
|
81
|
+
async approvalDoneList(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<ActivityApprovalList> {
|
|
82
|
+
var { domain, user } = context.state
|
|
83
|
+
|
|
84
|
+
const judgment = [
|
|
85
|
+
ActivityApprovalJudgment.Escalated,
|
|
86
|
+
ActivityApprovalJudgment.Delegated,
|
|
87
|
+
ActivityApprovalJudgment.Approved,
|
|
88
|
+
ActivityApprovalJudgment.Rejected
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
const [items, total] = await getQueryBuilderFromListParams({
|
|
92
|
+
repository: getRepository(ActivityApproval),
|
|
93
|
+
params,
|
|
94
|
+
domain,
|
|
95
|
+
alias: 'ap',
|
|
96
|
+
searchables: ['name', 'description'],
|
|
97
|
+
filtersMap: {
|
|
98
|
+
name: {
|
|
99
|
+
relationColumn: 'activityThread.activityInstance',
|
|
100
|
+
columnName: 'name'
|
|
101
|
+
},
|
|
102
|
+
description: {
|
|
103
|
+
relationColumn: 'activityThread.activityInstance',
|
|
104
|
+
columnName: 'description'
|
|
105
|
+
},
|
|
106
|
+
priority: {
|
|
107
|
+
relationColumn: 'activityThread.activityInstance',
|
|
108
|
+
columnName: 'priority'
|
|
109
|
+
},
|
|
110
|
+
dueAt: {
|
|
111
|
+
relationColumn: 'activityThread.activityInstance',
|
|
112
|
+
columnName: 'dueAt'
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
.andWhere('ap.judgment IN (:...judgment)', { judgment })
|
|
117
|
+
.andWhere('ap.approver = :user', { user: user.id })
|
|
118
|
+
.getManyAndCount()
|
|
119
|
+
|
|
120
|
+
return { items, total }
|
|
121
|
+
}
|
|
122
|
+
|
|
79
123
|
@FieldResolver(type => ActivityThread)
|
|
80
124
|
async activityThread(@Root() activityApproval: ActivityApproval): Promise<ActivityThread> {
|
|
81
125
|
return await getRepository(ActivityThread).findOneBy({ id: activityApproval.activityThreadId })
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
|
|
2
|
+
import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
|
|
3
|
+
import { User } from '@things-factory/auth-base'
|
|
4
|
+
import { ActivityEvent, ActivityEventStatus } from './activity-stats-type'
|
|
5
|
+
import { ActivityThread, ActivityThreadStatus } from '../activity-thread/activity-thread'
|
|
6
|
+
import { ActivityApproval, ActivityApprovalJudgment } from '../activity-approval/activity-approval'
|
|
7
|
+
|
|
8
|
+
@Resolver(ActivityStatsQuery)
|
|
9
|
+
export class ActivityStatsQuery {
|
|
10
|
+
@Query(returns => [ActivityEvent], { description: 'To fetch activity events by period' })
|
|
11
|
+
async activityEvents(
|
|
12
|
+
@Arg('from') from: string,
|
|
13
|
+
@Arg('to') to: string,
|
|
14
|
+
@Ctx() context: ResolverContext
|
|
15
|
+
): Promise<ActivityEvent[]> {
|
|
16
|
+
const { domain, user } = context.state
|
|
17
|
+
|
|
18
|
+
if (!from) {
|
|
19
|
+
const beginOfToday = new Date()
|
|
20
|
+
beginOfToday.setHours(0, 0, 0, 0)
|
|
21
|
+
from = beginOfToday.toISOString().split('T').join(' ')
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (!to) {
|
|
25
|
+
const endOfToday = new Date()
|
|
26
|
+
endOfToday.setDate(endOfToday.getDate() + 1)
|
|
27
|
+
endOfToday.setHours(0, 0, 0, 0)
|
|
28
|
+
to = endOfToday.toISOString().split('T').join(' ')
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const status = [ActivityThreadStatus.Ended, ActivityThreadStatus.Aborted]
|
|
32
|
+
|
|
33
|
+
var params = { filters: [{ name: 'terminatedAt', operator: 'between', value: [from, to] }] }
|
|
34
|
+
|
|
35
|
+
var doneItems = await getQueryBuilderFromListParams({
|
|
36
|
+
repository: getRepository(ActivityThread),
|
|
37
|
+
params,
|
|
38
|
+
domain,
|
|
39
|
+
alias: 'at'
|
|
40
|
+
})
|
|
41
|
+
.leftJoinAndSelect('at.activityInstance', 'ai')
|
|
42
|
+
.andWhere('at.state IN (:...status)', { status })
|
|
43
|
+
.andWhere('at.assignee = :user', { user: user.id })
|
|
44
|
+
.getMany()
|
|
45
|
+
|
|
46
|
+
const activityThreadDoneEvents = doneItems.map(({ id, activityInstance, terminatedAt }) => {
|
|
47
|
+
return {
|
|
48
|
+
id,
|
|
49
|
+
name: activityInstance.name,
|
|
50
|
+
date: terminatedAt,
|
|
51
|
+
priority: activityInstance.priority,
|
|
52
|
+
state: ActivityEventStatus.Done,
|
|
53
|
+
type: 'activity-thread'
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
const judgment = [
|
|
58
|
+
ActivityApprovalJudgment.Escalated,
|
|
59
|
+
ActivityApprovalJudgment.Delegated,
|
|
60
|
+
ActivityApprovalJudgment.Approved,
|
|
61
|
+
ActivityApprovalJudgment.Rejected
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
const approvalDoneItems = await getQueryBuilderFromListParams({
|
|
65
|
+
repository: getRepository(ActivityApproval),
|
|
66
|
+
params,
|
|
67
|
+
domain,
|
|
68
|
+
alias: 'ap'
|
|
69
|
+
})
|
|
70
|
+
.leftJoinAndSelect('ap.activityThread', 'at')
|
|
71
|
+
.leftJoinAndSelect('at.activityInstance', 'ai')
|
|
72
|
+
.andWhere('ap.judgment IN (:...judgment)', { judgment })
|
|
73
|
+
.andWhere('ap.approver = :user', { user: user.id })
|
|
74
|
+
.getMany()
|
|
75
|
+
|
|
76
|
+
const activityApprovalDoneEvents = approvalDoneItems.map(({ id, activityThread, terminatedAt, judgment }) => {
|
|
77
|
+
const activityInstance = activityThread.activityInstance
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
id,
|
|
81
|
+
name: activityInstance.name,
|
|
82
|
+
date: terminatedAt,
|
|
83
|
+
priority: activityInstance.priority,
|
|
84
|
+
state:
|
|
85
|
+
judgment == ActivityApprovalJudgment.Approved || ActivityApprovalJudgment.Escalated
|
|
86
|
+
? ActivityEventStatus.Approved
|
|
87
|
+
: ActivityEventStatus.Rejected,
|
|
88
|
+
type: 'activity-approval'
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
return [...activityThreadDoneEvents, ...activityApprovalDoneEvents]
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
|
|
2
|
+
|
|
3
|
+
export enum ActivityEventStatus {
|
|
4
|
+
Done = 'done',
|
|
5
|
+
Pending = 'pending',
|
|
6
|
+
Approved = 'approved',
|
|
7
|
+
Rejected = 'rejected'
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
registerEnumType(ActivityEventStatus, {
|
|
11
|
+
name: 'ActivityEventStatus',
|
|
12
|
+
description: 'state enumeration of a Activity Event'
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
@ObjectType()
|
|
16
|
+
export class ActivityEvent {
|
|
17
|
+
@Field({ nullable: true })
|
|
18
|
+
id?: string
|
|
19
|
+
|
|
20
|
+
@Field({ nullable: true })
|
|
21
|
+
name?: string
|
|
22
|
+
|
|
23
|
+
@Field({ nullable: true })
|
|
24
|
+
type?: string
|
|
25
|
+
|
|
26
|
+
@Field({ nullable: true })
|
|
27
|
+
priority?: number
|
|
28
|
+
|
|
29
|
+
@Field({ nullable: true })
|
|
30
|
+
state?: ActivityEventStatus
|
|
31
|
+
|
|
32
|
+
@Field({ nullable: true })
|
|
33
|
+
date?: Date
|
|
34
|
+
}
|
|
@@ -25,12 +25,7 @@ export class ActivitySummaryQuery {
|
|
|
25
25
|
repository: getRepository(ActivityThread),
|
|
26
26
|
params: {},
|
|
27
27
|
domain,
|
|
28
|
-
alias: 'at'
|
|
29
|
-
searchables: ['name', 'description'],
|
|
30
|
-
filtersMap: {
|
|
31
|
-
name: { columnName: 'name', relationColumn: 'activityInstance' },
|
|
32
|
-
description: { columnName: 'description', relationColumn: 'activityInstance' }
|
|
33
|
-
}
|
|
28
|
+
alias: 'at'
|
|
34
29
|
})
|
|
35
30
|
.andWhere('at.state NOT IN (:...status)', { status })
|
|
36
31
|
.andWhere('at.assignee = :user', { user: user.id })
|
|
@@ -55,18 +50,7 @@ export class ActivitySummaryQuery {
|
|
|
55
50
|
repository: getRepository(ActivityApproval),
|
|
56
51
|
params: {},
|
|
57
52
|
domain,
|
|
58
|
-
alias: 'ap'
|
|
59
|
-
searchables: ['name', 'description'],
|
|
60
|
-
filtersMap: {
|
|
61
|
-
name: {
|
|
62
|
-
relationColumn: 'activityThread.activityInstance',
|
|
63
|
-
columnName: 'name'
|
|
64
|
-
},
|
|
65
|
-
description: {
|
|
66
|
-
relationColumn: 'activityThread.activityInstance',
|
|
67
|
-
columnName: 'description'
|
|
68
|
-
}
|
|
69
|
-
}
|
|
53
|
+
alias: 'ap'
|
|
70
54
|
})
|
|
71
55
|
.andWhere('ap.judgment NOT IN (:...judgment)', { judgment })
|
|
72
56
|
.andWhere('ap.approver = :user', { user: user.id })
|
|
@@ -99,8 +83,7 @@ export class ActivitySummaryQuery {
|
|
|
99
83
|
repository: getRepository(ActivityInstance),
|
|
100
84
|
params: {},
|
|
101
85
|
domain,
|
|
102
|
-
alias: 'ai'
|
|
103
|
-
searchables: ['name', 'description']
|
|
86
|
+
alias: 'ai'
|
|
104
87
|
})
|
|
105
88
|
.leftJoinAndSelect('ai.activityThreads', 'threads', 'threads.assignee = :user', { user: user.id })
|
|
106
89
|
.andWhere('ai.state IN (:...status)', {
|
|
@@ -122,8 +105,7 @@ export class ActivitySummaryQuery {
|
|
|
122
105
|
repository: getRepository(ActivityInstance),
|
|
123
106
|
params: {},
|
|
124
107
|
domain,
|
|
125
|
-
alias: 'ai'
|
|
126
|
-
searchables: ['name', 'description']
|
|
108
|
+
alias: 'ai'
|
|
127
109
|
})
|
|
128
110
|
.andWhere('ai.state IN (:...status)', { status })
|
|
129
111
|
.andWhere('ai.creator = :user', { user: user.id })
|
package/server/service/index.ts
CHANGED
|
@@ -8,6 +8,7 @@ export * from './installable-activity/installable-activity'
|
|
|
8
8
|
export * from './activity-summary/activity-summary'
|
|
9
9
|
|
|
10
10
|
/* IMPORT ENTITIES AND RESOLVERS */
|
|
11
|
+
import { resolvers as ActivityStatsResolvers } from './activity-stats'
|
|
11
12
|
import {
|
|
12
13
|
entities as ActivityApprovalEntities,
|
|
13
14
|
resolvers as ActivityApprovalResolvers,
|
|
@@ -57,6 +58,7 @@ export const subscribers = [
|
|
|
57
58
|
export const schema = {
|
|
58
59
|
resolverClasses: [
|
|
59
60
|
/* RESOLVER CLASSES */
|
|
61
|
+
...ActivityStatsResolvers,
|
|
60
62
|
...ActivityApprovalResolvers,
|
|
61
63
|
...ActivityResolvers,
|
|
62
64
|
...ActivityInstanceResolvers,
|
package/things-factory.config.js
CHANGED
|
@@ -9,8 +9,10 @@ export default {
|
|
|
9
9
|
{ tagname: 'worklist-dashboard', page: 'worklist-dashboard' },
|
|
10
10
|
{ tagname: 'pickable-list-page', page: 'pickable-list' },
|
|
11
11
|
{ tagname: 'todo-list-page', page: 'todo-list' },
|
|
12
|
+
{ tagname: 'done-list-calendar-page', page: 'done-list-calendar' },
|
|
12
13
|
{ tagname: 'done-list-page', page: 'done-list' },
|
|
13
14
|
{ tagname: 'approval-pending-list-page', page: 'approval-pending-list' },
|
|
15
|
+
{ tagname: 'approval-done-list-page', page: 'approval-done-list' },
|
|
14
16
|
{ tagname: 'draft-list-page', page: 'draft-list' },
|
|
15
17
|
{ tagname: 'starter-list-page', page: 'starter-list' },
|
|
16
18
|
{ tagname: 'reporter-list-page', page: 'reporter-list' },
|
|
@@ -29,6 +31,7 @@ export default {
|
|
|
29
31
|
{ tagname: 'activity-store-page', page: 'activity-store' },
|
|
30
32
|
{ tagname: 'activity-thread-list-page', page: 'activity-thread-list' },
|
|
31
33
|
{ tagname: 'installable-activity-list-page', page: 'installable-activity-list' },
|
|
32
|
-
{ tagname: 'activity-approval-list-page', page: 'activity-approval-list' }
|
|
34
|
+
{ tagname: 'activity-approval-list-page', page: 'activity-approval-list' },
|
|
35
|
+
{ tagname: 'activity-stats-list-page', page: 'activity-stats-list' }
|
|
33
36
|
]
|
|
34
37
|
}
|
package/translations/en.json
CHANGED
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
"field.inout": "inout",
|
|
24
24
|
"field.input-key": "input-key",
|
|
25
25
|
"field.issuer": "issuer",
|
|
26
|
+
"field.round": "round",
|
|
27
|
+
"field.judgment": "judgment",
|
|
28
|
+
"field.comment": "comment",
|
|
26
29
|
"field.posted-at": "posted at",
|
|
27
30
|
"field.issuer-role": "issuer role",
|
|
28
31
|
"field.lead-time": "LT(sec)",
|
|
@@ -44,6 +47,8 @@
|
|
|
44
47
|
"field.supervisory-role": "supervisory role",
|
|
45
48
|
"field.tact-time": "TT(sec)",
|
|
46
49
|
"field.tag": "tag name",
|
|
50
|
+
"field.created-at": "created at",
|
|
51
|
+
"field.updated-at": "terminated at",
|
|
47
52
|
"field.terminated-at": "terminated at",
|
|
48
53
|
"field.ui-type": "UI type",
|
|
49
54
|
"field.ui-source": "UI source",
|
|
@@ -62,11 +67,13 @@
|
|
|
62
67
|
"label.activity-state-submitted": "submitted",
|
|
63
68
|
"label.activity-state-escalated": "escalated",
|
|
64
69
|
"label.activity-state-pending": "pending",
|
|
70
|
+
"label.activity-state-approved": "approved",
|
|
65
71
|
"label.activity-state-rejected": "rejected",
|
|
66
72
|
"label.activity-state-ended": "ended",
|
|
67
73
|
"label.activity-state-aborted": "aborted",
|
|
68
74
|
"label.days": "days",
|
|
69
75
|
"label.filter-aborted": "aborted",
|
|
76
|
+
"label.filter-rejected": "rejected",
|
|
70
77
|
"label.filter-important": "important",
|
|
71
78
|
"label.filter-due": "due",
|
|
72
79
|
"label.filter-recent": "recent",
|
|
@@ -85,6 +92,7 @@
|
|
|
85
92
|
"text.task_is_saved_successfully": "task is saved successfully",
|
|
86
93
|
"text.task_is_started_successfully": "task is started successfully.",
|
|
87
94
|
"title.activity bank": "activity bank",
|
|
95
|
+
"title.activity shopping": "activity shopping",
|
|
88
96
|
"title.activity list": "activity list",
|
|
89
97
|
"title.activity model item list": "activity model item list",
|
|
90
98
|
"title.activity instance list": "activity instance list",
|
|
@@ -100,9 +108,11 @@
|
|
|
100
108
|
"title.activity summary": "activity summary",
|
|
101
109
|
"title.activity template model item list": "activity template model item list",
|
|
102
110
|
"title.activity template list": "activity template list",
|
|
111
|
+
"title.approval done list": "approval done list",
|
|
103
112
|
"title.approval pending list": "approval pending list",
|
|
104
113
|
"title.assigned list": "assigned list",
|
|
105
114
|
"title.done list": "done list",
|
|
115
|
+
"title.done list calendar": "done list calendar",
|
|
106
116
|
"title.draft list": "draft list",
|
|
107
117
|
"title.edit duration": "edit duration",
|
|
108
118
|
"title.installable activity list": "installable activity list",
|
package/translations/ko.json
CHANGED
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
"field.inout": "입출력",
|
|
24
24
|
"field.input-key": "입력키",
|
|
25
25
|
"field.issuer": "발급자",
|
|
26
|
+
"field.round": "차수",
|
|
27
|
+
"field.judgment": "판정",
|
|
28
|
+
"field.comment": "코멘트",
|
|
26
29
|
"field.posted-at": "발급일",
|
|
27
30
|
"field.issuer-role": "발급자 역할",
|
|
28
31
|
"field.lead-time": "LT(초)",
|
|
@@ -44,6 +47,8 @@
|
|
|
44
47
|
"field.supervisory-role": "관리자 역할",
|
|
45
48
|
"field.tact-time": "TT(초)",
|
|
46
49
|
"field.tag": "태그이름",
|
|
50
|
+
"field.created-at": "생성 시간",
|
|
51
|
+
"field.updated-at": "수정 시간",
|
|
47
52
|
"field.terminated-at": "완료 시간",
|
|
48
53
|
"field.ui-type": "화면 타입",
|
|
49
54
|
"field.ui-source": "화면 소스",
|
|
@@ -60,13 +65,15 @@
|
|
|
60
65
|
"label.activity-state-started": "진행중",
|
|
61
66
|
"label.activity-state-delegated": "위임됨",
|
|
62
67
|
"label.activity-state-submitted": "제출됨",
|
|
63
|
-
"label.activity-state-escalated": "
|
|
68
|
+
"label.activity-state-escalated": "상위승인중",
|
|
64
69
|
"label.activity-state-pending": "지연중",
|
|
65
70
|
"label.activity-state-rejected": "반려됨",
|
|
71
|
+
"label.activity-state-approved": "승인됨",
|
|
66
72
|
"label.activity-state-ended": "완료됨",
|
|
67
73
|
"label.activity-state-aborted": "취소됨",
|
|
68
74
|
"label.days": "일",
|
|
69
75
|
"label.filter-aborted": "중단",
|
|
76
|
+
"label.filter-rejected": "반려",
|
|
70
77
|
"label.filter-important": "중요",
|
|
71
78
|
"label.filter-due": "만기",
|
|
72
79
|
"label.filter-recent": "최근",
|
|
@@ -85,6 +92,7 @@
|
|
|
85
92
|
"text.task_is_saved_successfully": "업무가 성공적으로 저장되었습니다.",
|
|
86
93
|
"text.task_is_started_successfully": "업무가 성공적으로 시작되었습니다.",
|
|
87
94
|
"title.activity bank": "업무 뱅크",
|
|
95
|
+
"title.activity shopping": "업무 쇼핑",
|
|
88
96
|
"title.activity list": "업무정의 리스트",
|
|
89
97
|
"title.activity model item list": "업무 모델 항목",
|
|
90
98
|
"title.activity instance list": "업무 리스트",
|
|
@@ -100,9 +108,11 @@
|
|
|
100
108
|
"title.activity summary": "업무 종합 현황",
|
|
101
109
|
"title.activity template model item list": "업무 템플릿 모델 항목",
|
|
102
110
|
"title.activity template list": "업무 템플릿",
|
|
111
|
+
"title.approval done list": "내가 수행한 승인 리스트",
|
|
103
112
|
"title.approval pending list": "승인 대기 리스트",
|
|
104
113
|
"title.assigned list": "나의 연관 업무 현황",
|
|
105
|
-
"title.done list": "
|
|
114
|
+
"title.done list": "업무 이력",
|
|
115
|
+
"title.done list calendar": "업무 이력 캘린더",
|
|
106
116
|
"title.draft list": "작성중인 업무",
|
|
107
117
|
"title.edit duration": "소요시간 편집",
|
|
108
118
|
"title.installable activity list": "설치 가능 업무",
|
package/translations/ms.json
CHANGED
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
"field.inout": "[ms] inout",
|
|
24
24
|
"field.input-key": "[ms] input-key",
|
|
25
25
|
"field.issuer": "issuer",
|
|
26
|
+
"field.round": "round",
|
|
27
|
+
"field.judgment": "judgment",
|
|
28
|
+
"field.comment": "comment",
|
|
26
29
|
"field.posted-at": "posted at",
|
|
27
30
|
"field.issuer-role": "issuer role",
|
|
28
31
|
"field.lead-time": "LT(sec)",
|
|
@@ -44,6 +47,8 @@
|
|
|
44
47
|
"field.supervisory-role": "supervisory role",
|
|
45
48
|
"field.tact-time": "TT(sec)",
|
|
46
49
|
"field.tag": "[ms] tag name",
|
|
50
|
+
"field.created-at": "[ms] created at",
|
|
51
|
+
"field.updated-at": "[ms] updated at",
|
|
47
52
|
"field.terminated-at": "[ms] terminated at",
|
|
48
53
|
"field.ui-type": "UI type",
|
|
49
54
|
"field.ui-source": "UI source",
|
|
@@ -62,11 +67,13 @@
|
|
|
62
67
|
"label.activity-state-submitted": "[ms] submitted",
|
|
63
68
|
"label.activity-state-escalated": "[ms] escalated",
|
|
64
69
|
"label.activity-state-pending": "[ms] pending",
|
|
70
|
+
"label.activity-state-approved": "[ms] approved",
|
|
65
71
|
"label.activity-state-rejected": "[ms] rejected",
|
|
66
72
|
"label.activity-state-ended": "[ms] ended",
|
|
67
73
|
"label.activity-state-aborted": "[ms] aborted",
|
|
68
74
|
"label.days": "[ms] days",
|
|
69
75
|
"label.filter-aborted": "aborted",
|
|
76
|
+
"label.filter-rejected": "rejected",
|
|
70
77
|
"label.filter-important": "important",
|
|
71
78
|
"label.filter-due": "due",
|
|
72
79
|
"label.filter-recent": "recent",
|
|
@@ -85,6 +92,7 @@
|
|
|
85
92
|
"text.task_is_saved_successfully": "[ms] task is saved successfully",
|
|
86
93
|
"text.task_is_started_successfully": "[ms] task is started successfully.",
|
|
87
94
|
"title.activity bank": "[ms] activity bank",
|
|
95
|
+
"title.activity shopping": "[ms] activity shopping",
|
|
88
96
|
"title.activity list": "[ms] activity list",
|
|
89
97
|
"title.activity model item list": "[ms] activity model item list",
|
|
90
98
|
"title.activity instance list": "[ms] activity instance list",
|
|
@@ -100,9 +108,11 @@
|
|
|
100
108
|
"title.activity summary": "[ms] activity summary",
|
|
101
109
|
"title.activity template model item list": "[ms] activity template model item list",
|
|
102
110
|
"title.activity template list": "[ms] activity template list",
|
|
111
|
+
"title.approval done list": "[ms] approval done list",
|
|
103
112
|
"title.approval pending list": "[ms] approval pending list",
|
|
104
113
|
"title.assigned list": "[ms] assigned list",
|
|
105
114
|
"title.done list": "[ms] done list",
|
|
115
|
+
"title.done list calendar": "[ms] done list calendar",
|
|
106
116
|
"title.draft list": "[ms] draft list",
|
|
107
117
|
"title.edit duration": "[ms] edit duration",
|
|
108
118
|
"title.installable activity list": "[ms] installable activity list",
|
package/translations/zh.json
CHANGED
|
@@ -22,6 +22,9 @@
|
|
|
22
22
|
"field.inout": "[zh] inout",
|
|
23
23
|
"field.input-key": "[zh] input-key",
|
|
24
24
|
"field.issuer": "issuer",
|
|
25
|
+
"field.round": "round",
|
|
26
|
+
"field.judgment": "judgment",
|
|
27
|
+
"field.comment": "comment",
|
|
25
28
|
"field.hidden": "hidden",
|
|
26
29
|
"field.posted-at": "posted at",
|
|
27
30
|
"field.provider": "provider",
|
|
@@ -44,6 +47,8 @@
|
|
|
44
47
|
"field.supervisory-role": "supervisory role",
|
|
45
48
|
"field.tact-time": "TT(sec)",
|
|
46
49
|
"field.tag": "[zh] tag name",
|
|
50
|
+
"field.created-at": "[zh] created at",
|
|
51
|
+
"field.updated-at": "[zh] updated at",
|
|
47
52
|
"field.terminated-at": "[zh] terminated at",
|
|
48
53
|
"field.ui-type": "UI type",
|
|
49
54
|
"field.ui-source": "UI source",
|
|
@@ -62,11 +67,13 @@
|
|
|
62
67
|
"label.activity-state-submitted": "[zh] submitted",
|
|
63
68
|
"label.activity-state-escalated": "[zh] escalated",
|
|
64
69
|
"label.activity-state-pending": "[zh] pending",
|
|
70
|
+
"label.activity-state-approved": "[zh] approved",
|
|
65
71
|
"label.activity-state-rejected": "[zh] rejected",
|
|
66
72
|
"label.activity-state-ended": "[zh] ended",
|
|
67
73
|
"label.activity-state-aborted": "[zh] aborted",
|
|
68
74
|
"label.days": "天",
|
|
69
75
|
"label.filter-aborted": "aborted",
|
|
76
|
+
"label.filter-rejected": "rejected",
|
|
70
77
|
"label.filter-important": "important",
|
|
71
78
|
"label.filter-due": "due",
|
|
72
79
|
"label.filter-recent": "recent",
|
|
@@ -85,6 +92,7 @@
|
|
|
85
92
|
"text.task_is_saved_successfully": "[zh] task is saved successfully",
|
|
86
93
|
"text.task_is_started_successfully": "[zh] task is started successfully.",
|
|
87
94
|
"title.activity bank": "[zh] activity bank",
|
|
95
|
+
"title.activity shopping": "[zh] activity shopping",
|
|
88
96
|
"title.activity list": "[zh] activity list",
|
|
89
97
|
"title.activity model item list": "[zh] activity model item list",
|
|
90
98
|
"title.activity instance list": "[zh] activity instance list",
|
|
@@ -100,9 +108,11 @@
|
|
|
100
108
|
"title.activity summary": "[zh] activity summary",
|
|
101
109
|
"title.activity template model item list": "[zh] activity template model item list",
|
|
102
110
|
"title.activity template list": "[zh] activity template list",
|
|
111
|
+
"title.approval done list": "[zh] approval done list",
|
|
103
112
|
"title.approval pending list": "[zh] approval pending list",
|
|
104
113
|
"title.assigned list": "[zh] assigned list",
|
|
105
114
|
"title.done list": "[zh] done list",
|
|
115
|
+
"title.done list calendar": "[zh] done list calendar",
|
|
106
116
|
"title.draft list": "[zh] draft list",
|
|
107
117
|
"title.edit duration": "[zh] edit duration",
|
|
108
118
|
"title.installable activity list": "[zh] installable activity list",
|