@things-factory/worklist 6.0.27 → 6.0.32
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/bootstrap.ts +9 -1
- package/client/components/activity-starter-form.ts +35 -10
- package/client/grist-editor/grist-editor-activity-search-key.ts +79 -0
- package/client/grist-editor/popup-activity-search-keys-input.ts +167 -0
- package/client/pages/activity/activity-list-page.ts +122 -11
- package/client/pages/activity/activity-partial-view.ts +85 -0
- package/client/pages/activity/starter-list-page.ts +1 -0
- package/client/pages/activity-approval/activity-approval-page.ts +6 -6
- package/client/pages/activity-instance/activity-instance-search-page.ts +377 -0
- package/client/pages/activity-instance/activity-instance-view.ts +135 -0
- package/client/pages/activity-store/activity-store-page.ts +1 -1
- package/client/pages/activity-template/activity-template-list-page.ts +29 -1
- package/client/pages/activity-thread/activity-thread-page.ts +8 -3
- package/client/pages/activity-thread/activity-thread-view.ts +102 -0
- package/client/pages/installable-activity/installable-activity-list-page.ts +29 -1
- package/client/pages/todo/approval-waiting-list-page.ts +19 -9
- package/client/pages/todo/done-list-page.ts +344 -0
- package/client/pages/todo/draft-list-page.ts +13 -2
- package/client/pages/todo/todo-list-page.ts +14 -3
- package/client/route.ts +8 -0
- package/client/types/activity-instance-type.ts +123 -0
- package/client/types/activity-instance.ts +124 -0
- package/client/types/activity-model-type.ts +40 -0
- package/client/types/activity-search-key-item-type.ts +9 -0
- package/client/types/activity-thread-type.ts +19 -0
- package/client/types/activity-thread.ts +88 -0
- package/client/types/activity.ts +103 -0
- package/client/{types.js → types/types.ts} +0 -9
- package/dist-client/bootstrap.js +4 -1
- package/dist-client/bootstrap.js.map +1 -1
- package/dist-client/components/activity-starter-form.d.ts +1 -1
- package/dist-client/components/activity-starter-form.js +34 -9
- package/dist-client/components/activity-starter-form.js.map +1 -1
- package/dist-client/grist-editor/grist-editor-activity-search-key.d.ts +12 -0
- package/dist-client/grist-editor/grist-editor-activity-search-key.js +70 -0
- package/dist-client/grist-editor/grist-editor-activity-search-key.js.map +1 -0
- package/dist-client/grist-editor/popup-activity-search-keys-input.d.ts +17 -0
- package/dist-client/grist-editor/popup-activity-search-keys-input.js +177 -0
- package/dist-client/grist-editor/popup-activity-search-keys-input.js.map +1 -0
- package/dist-client/pages/activity/activity-list-page.d.ts +4 -0
- package/dist-client/pages/activity/activity-list-page.js +121 -11
- package/dist-client/pages/activity/activity-list-page.js.map +1 -1
- package/dist-client/pages/activity/activity-partial-view.d.ts +13 -0
- package/dist-client/pages/activity/activity-partial-view.js +56 -0
- package/dist-client/pages/activity/activity-partial-view.js.map +1 -0
- package/dist-client/pages/activity/starter-list-page.js.map +1 -1
- package/dist-client/pages/activity-approval/activity-approval-page.js +6 -6
- package/dist-client/pages/activity-approval/activity-approval-page.js.map +1 -1
- package/dist-client/pages/activity-instance/activity-instance-search-page.d.ts +76 -0
- package/dist-client/pages/activity-instance/activity-instance-search-page.js +371 -0
- package/dist-client/pages/activity-instance/activity-instance-search-page.js.map +1 -0
- package/dist-client/pages/activity-instance/activity-instance-view.d.ts +14 -0
- package/dist-client/pages/activity-instance/activity-instance-view.js +130 -0
- package/dist-client/pages/activity-instance/activity-instance-view.js.map +1 -0
- package/dist-client/pages/activity-store/activity-store-page.js +1 -1
- package/dist-client/pages/activity-store/activity-store-page.js.map +1 -1
- package/dist-client/pages/activity-template/activity-template-list-page.js +29 -1
- package/dist-client/pages/activity-template/activity-template-list-page.js.map +1 -1
- package/dist-client/pages/activity-thread/activity-thread-page.js +8 -3
- package/dist-client/pages/activity-thread/activity-thread-page.js.map +1 -1
- package/dist-client/pages/activity-thread/activity-thread-view.d.ts +11 -0
- package/dist-client/pages/activity-thread/activity-thread-view.js +103 -0
- package/dist-client/pages/activity-thread/activity-thread-view.js.map +1 -0
- package/dist-client/pages/installable-activity/installable-activity-list-page.js +29 -1
- package/dist-client/pages/installable-activity/installable-activity-list-page.js.map +1 -1
- package/dist-client/pages/todo/approval-waiting-list-page.js +19 -9
- package/dist-client/pages/todo/approval-waiting-list-page.js.map +1 -1
- package/dist-client/pages/todo/done-list-page.d.ts +44 -0
- package/dist-client/pages/todo/done-list-page.js +342 -0
- package/dist-client/pages/todo/done-list-page.js.map +1 -0
- package/dist-client/pages/todo/draft-list-page.js +12 -2
- package/dist-client/pages/todo/draft-list-page.js.map +1 -1
- package/dist-client/pages/todo/todo-list-page.js +13 -3
- package/dist-client/pages/todo/todo-list-page.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +6 -0
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/types/activity-instance-type.d.ts +76 -0
- package/dist-client/types/activity-instance-type.js +11 -0
- package/dist-client/types/activity-instance-type.js.map +1 -0
- package/dist-client/types/activity-instance.d.ts +70 -0
- package/dist-client/types/activity-instance.js +36 -0
- package/dist-client/types/activity-instance.js.map +1 -0
- package/dist-client/types/activity-model-type.d.ts +31 -0
- package/dist-client/types/activity-model-type.js +18 -0
- package/dist-client/types/activity-model-type.js.map +1 -0
- package/dist-client/types/activity-search-key-item-type.d.ts +6 -0
- package/dist-client/types/activity-search-key-item-type.js +3 -0
- package/dist-client/types/activity-search-key-item-type.js.map +1 -0
- package/dist-client/types/activity-thread-type.d.ts +15 -0
- package/dist-client/types/activity-thread-type.js +7 -0
- package/dist-client/types/activity-thread-type.js.map +1 -0
- package/dist-client/types/activity-thread.d.ts +37 -0
- package/dist-client/types/activity-thread.js +51 -0
- package/dist-client/types/activity-thread.js.map +1 -0
- package/dist-client/types/activity.d.ts +65 -0
- package/dist-client/types/activity.js +35 -0
- package/dist-client/types/activity.js.map +1 -0
- package/dist-client/{types.d.ts → types/types.d.ts} +3 -7
- package/dist-client/{types.js → types/types.js} +0 -8
- package/dist-client/types/types.js.map +1 -0
- package/dist-server/controllers/activity-approval/approve.js +2 -0
- package/dist-server/controllers/activity-approval/approve.js.map +1 -1
- package/dist-server/controllers/activity-approval/reject.js +2 -0
- package/dist-server/controllers/activity-approval/reject.js.map +1 -1
- package/dist-server/controllers/{activity-installation-controller.js → activity-installation/activity-installation-controller.js} +8 -0
- package/dist-server/controllers/activity-installation/activity-installation-controller.js.map +1 -0
- package/dist-server/controllers/activity-installation/call-webhook.js.map +1 -0
- package/dist-server/controllers/activity-instance/abort.js +1 -1
- package/dist-server/controllers/activity-instance/abort.js.map +1 -1
- package/dist-server/controllers/activity-instance/adjust.js +1 -1
- package/dist-server/controllers/activity-instance/adjust.js.map +1 -1
- package/dist-server/controllers/activity-instance/delegate.js +5 -0
- package/dist-server/controllers/activity-instance/delegate.js.map +1 -1
- package/dist-server/controllers/activity-instance/draft.js +16 -1
- package/dist-server/controllers/activity-instance/draft.js.map +1 -1
- package/dist-server/controllers/activity-instance/post.js +38 -3
- package/dist-server/controllers/activity-instance/post.js.map +1 -1
- package/dist-server/controllers/activity-instance/start.js +1 -1
- package/dist-server/controllers/activity-instance/start.js.map +1 -1
- package/dist-server/controllers/activity-thread/submit.js +1 -1
- package/dist-server/controllers/activity-thread/submit.js.map +1 -1
- package/dist-server/controllers/common.js +72 -25
- package/dist-server/controllers/common.js.map +1 -1
- package/dist-server/controllers/index.js +1 -1
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/service/activity/activity-history.js +38 -1
- package/dist-server/service/activity/activity-history.js.map +1 -1
- package/dist-server/service/activity/activity-search-key-item-type.js +28 -0
- package/dist-server/service/activity/activity-search-key-item-type.js.map +1 -0
- package/dist-server/service/activity/activity-type.js +56 -0
- package/dist-server/service/activity/activity-type.js.map +1 -1
- package/dist-server/service/activity/activity.js +40 -4
- package/dist-server/service/activity/activity.js.map +1 -1
- package/dist-server/service/activity-approval/event-subscriber.js +1 -1
- package/dist-server/service/activity-approval/event-subscriber.js.map +1 -1
- package/dist-server/service/activity-instance/activity-instance-history.js +53 -0
- package/dist-server/service/activity-instance/activity-instance-history.js.map +1 -1
- package/dist-server/service/activity-instance/activity-instance-query.js +29 -0
- package/dist-server/service/activity-instance/activity-instance-query.js.map +1 -1
- package/dist-server/service/activity-instance/activity-instance-type.js +16 -0
- package/dist-server/service/activity-instance/activity-instance-type.js.map +1 -1
- package/dist-server/service/activity-instance/activity-instance.js +63 -0
- package/dist-server/service/activity-instance/activity-instance.js.map +1 -1
- package/dist-server/service/activity-instance/event-subscriber.js +4 -4
- package/dist-server/service/activity-instance/event-subscriber.js.map +1 -1
- package/dist-server/service/activity-thread/activity-thread-query.js +27 -0
- package/dist-server/service/activity-thread/activity-thread-query.js.map +1 -1
- package/dist-server/service/activity-thread/activity-thread.js +4 -1
- package/dist-server/service/activity-thread/activity-thread.js.map +1 -1
- package/dist-server/service/installable-activity/installable-activity-mutation.js +1 -1
- package/dist-server/service/installable-activity/installable-activity-mutation.js.map +1 -1
- package/dist-server/service/installable-activity/installable-activity-query.js +1 -1
- package/dist-server/service/installable-activity/installable-activity-query.js.map +1 -1
- package/dist-server/service/installable-activity/installable-activity.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -8
- package/server/controllers/activity-approval/approve.ts +3 -0
- package/server/controllers/activity-approval/reject.ts +3 -0
- package/server/controllers/{activity-installation-controller.ts → activity-installation/activity-installation-controller.ts} +12 -1
- package/server/controllers/activity-instance/abort.ts +1 -1
- package/server/controllers/activity-instance/adjust.ts +1 -1
- package/server/controllers/activity-instance/delegate.ts +9 -1
- package/server/controllers/activity-instance/draft.ts +16 -5
- package/server/controllers/activity-instance/post.ts +54 -6
- package/server/controllers/activity-instance/start.ts +1 -1
- package/server/controllers/activity-thread/submit.ts +1 -0
- package/server/controllers/common.ts +85 -28
- package/server/controllers/index.ts +1 -1
- package/server/service/activity/activity-history.ts +32 -1
- package/server/service/activity/activity-search-key-item-type.ts +16 -0
- package/server/service/activity/activity-type.ts +46 -1
- package/server/service/activity/activity.ts +34 -4
- package/server/service/activity-approval/event-subscriber.ts +1 -1
- package/server/service/activity-instance/activity-instance-history.ts +41 -0
- package/server/service/activity-instance/activity-instance-query.ts +30 -1
- package/server/service/activity-instance/activity-instance-type.ts +12 -0
- package/server/service/activity-instance/activity-instance.ts +49 -0
- package/server/service/activity-instance/event-subscriber.ts +4 -4
- package/server/service/activity-thread/activity-thread-query.ts +24 -0
- package/server/service/activity-thread/activity-thread.ts +6 -3
- package/server/service/installable-activity/installable-activity-mutation.ts +1 -1
- package/server/service/installable-activity/installable-activity-query.ts +1 -1
- package/server/service/installable-activity/installable-activity.ts +3 -1
- package/things-factory.config.js +5 -1
- package/translations/en.json +7 -0
- package/translations/ko.json +7 -0
- package/translations/ms.json +7 -0
- package/translations/zh.json +7 -0
- package/dist-client/types.js.map +0 -1
- package/dist-server/controllers/activity-installation-controller.js.map +0 -1
- package/dist-server/controllers/call-webhook.js.map +0 -1
- /package/dist-server/controllers/{call-webhook.js → activity-installation/call-webhook.js} +0 -0
- /package/server/controllers/{call-webhook.ts → activity-installation/call-webhook.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/worklist",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.32",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "dist-client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -27,12 +27,13 @@
|
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@operato/graphql": "^1.0.0",
|
|
29
29
|
"@operato/grist-editor": "^1.0.0",
|
|
30
|
-
"@things-factory/attachment-base": "^6.0.
|
|
31
|
-
"@things-factory/auth-base": "^6.0.
|
|
32
|
-
"@things-factory/board-service": "^6.0.
|
|
33
|
-
"@things-factory/context-ui": "^6.0.
|
|
34
|
-
"@things-factory/organization": "^6.0.
|
|
35
|
-
"@things-factory/shell": "^6.0.
|
|
30
|
+
"@things-factory/attachment-base": "^6.0.32",
|
|
31
|
+
"@things-factory/auth-base": "^6.0.32",
|
|
32
|
+
"@things-factory/board-service": "^6.0.32",
|
|
33
|
+
"@things-factory/context-ui": "^6.0.32",
|
|
34
|
+
"@things-factory/organization": "^6.0.32",
|
|
35
|
+
"@things-factory/shell": "^6.0.32",
|
|
36
|
+
"moment-timezone": "^0.5.40"
|
|
36
37
|
},
|
|
37
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "1b7b1eb2d2e1c0823ec69ee8160790c5da62072c"
|
|
38
39
|
}
|
|
@@ -2,6 +2,7 @@ import { getSystemUserFromOrgMemberItem } from '../../controllers/common'
|
|
|
2
2
|
import { ActivityThread, ActivityThreadStatus } from '../../service/activity-thread/activity-thread'
|
|
3
3
|
import { ActivityApproval, ActivityApprovalJudgment } from '../../service/activity-approval/activity-approval'
|
|
4
4
|
import { ApprovalLineItem } from '@things-factory/organization'
|
|
5
|
+
import { updateActivityInstanceState } from '../common'
|
|
5
6
|
|
|
6
7
|
export async function approve(
|
|
7
8
|
{ id, comment }: { id: string; comment: string },
|
|
@@ -77,5 +78,7 @@ export async function approve(
|
|
|
77
78
|
})
|
|
78
79
|
}
|
|
79
80
|
|
|
81
|
+
await updateActivityInstanceState(activityThread.activityInstanceId, context)
|
|
82
|
+
|
|
80
83
|
return result
|
|
81
84
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ActivityThread, ActivityThreadStatus } from '../../service/activity-thread/activity-thread'
|
|
2
2
|
import { ActivityApproval, ActivityApprovalJudgment } from '../../service/activity-approval/activity-approval'
|
|
3
|
+
import { updateActivityInstanceState } from '../common'
|
|
3
4
|
|
|
4
5
|
export async function reject(
|
|
5
6
|
{ id, comment }: { id: string; comment: string },
|
|
@@ -39,5 +40,7 @@ export async function reject(
|
|
|
39
40
|
updater: user
|
|
40
41
|
})
|
|
41
42
|
|
|
43
|
+
await updateActivityInstanceState(activityApproval.activityThread.activityInstanceId, context)
|
|
44
|
+
|
|
42
45
|
return result
|
|
43
46
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { InstallableActivity } from '
|
|
1
|
+
import { InstallableActivity } from '../../service/installable-activity/installable-activity'
|
|
2
2
|
|
|
3
3
|
export class ActivityInstallations {
|
|
4
4
|
static templates: { [name: string]: InstallableActivity } = {}
|
|
@@ -14,4 +14,15 @@ export class ActivityInstallations {
|
|
|
14
14
|
static list(): InstallableActivity[] {
|
|
15
15
|
return Object.values(ActivityInstallations.templates)
|
|
16
16
|
}
|
|
17
|
+
|
|
18
|
+
static async callback(name: string, activityInstance: any, context: ResolverContext) {
|
|
19
|
+
const installableActivity = ActivityInstallations.templates[name]
|
|
20
|
+
if (!installableActivity) {
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const { callback } = installableActivity
|
|
25
|
+
|
|
26
|
+
callback && (await callback(activityInstance, context))
|
|
27
|
+
}
|
|
17
28
|
}
|
|
@@ -25,7 +25,7 @@ export async function abort(
|
|
|
25
25
|
return await repository.save({
|
|
26
26
|
...activityInstance,
|
|
27
27
|
reason,
|
|
28
|
-
|
|
28
|
+
...(await evalActivityInstanceState(id, context)),
|
|
29
29
|
transaction: 'abort',
|
|
30
30
|
updater: user,
|
|
31
31
|
terminatedAt: new Date(),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ActivityInstance } from '../../service/activity-instance/activity-instance'
|
|
1
|
+
import { ActivityInstance, ActivityInstanceStatus } from '../../service/activity-instance/activity-instance'
|
|
2
2
|
import { evalActivityInstanceState } from '../common'
|
|
3
3
|
|
|
4
4
|
export async function delegate(
|
|
@@ -32,6 +32,14 @@ export async function delegate(
|
|
|
32
32
|
)
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
if (!activityInstance.isDelegatable()) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
context.t('error.activity-instance not delegatable', {
|
|
38
|
+
activityInstance: id
|
|
39
|
+
})
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
35
43
|
if (dueAt) {
|
|
36
44
|
activityInstance.dueAt = dueAt
|
|
37
45
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ActivityInstance, ActivityInstanceStatus } from '../../service/activity-instance/activity-instance'
|
|
2
2
|
import { NewActivityInstance } from '../../service/activity-instance/activity-instance-type'
|
|
3
3
|
import { Activity } from '../../service/activity/activity'
|
|
4
|
+
import { fillActivitySearchKeys } from '../common'
|
|
4
5
|
|
|
5
6
|
export async function draft(
|
|
6
7
|
activityInstance: NewActivityInstance,
|
|
@@ -10,7 +11,7 @@ export async function draft(
|
|
|
10
11
|
const { activityId, input, dueAt } = activityInstance
|
|
11
12
|
|
|
12
13
|
var repository = tx.getRepository(Activity)
|
|
13
|
-
var activity = {} as
|
|
14
|
+
var activity = {} as Activity
|
|
14
15
|
|
|
15
16
|
if (activityId) {
|
|
16
17
|
activity = await repository.findOne({
|
|
@@ -29,6 +30,12 @@ export async function draft(
|
|
|
29
30
|
|
|
30
31
|
activityInstance.adhocType = 'standard'
|
|
31
32
|
activityInstance.refBy = activityId
|
|
33
|
+
if (!activityInstance.assignees) {
|
|
34
|
+
activityInstance.assignees = activity.assignees
|
|
35
|
+
}
|
|
36
|
+
if (!activityInstance.approvalLine) {
|
|
37
|
+
activityInstance.approvalLine = activity.approvalLine
|
|
38
|
+
}
|
|
32
39
|
|
|
33
40
|
if (!dueAt && activity.standardTime) {
|
|
34
41
|
activityInstance.dueAt = new Date(Date.now() + activity.standardTime * 1000)
|
|
@@ -41,6 +48,7 @@ export async function draft(
|
|
|
41
48
|
value: assignee.value
|
|
42
49
|
}
|
|
43
50
|
})
|
|
51
|
+
} else {
|
|
44
52
|
}
|
|
45
53
|
|
|
46
54
|
if (activityInstance.approvalLine) {
|
|
@@ -52,17 +60,20 @@ export async function draft(
|
|
|
52
60
|
})
|
|
53
61
|
}
|
|
54
62
|
|
|
63
|
+
const activitySearchKeys = fillActivitySearchKeys(activity?.searchKeys, input)
|
|
64
|
+
|
|
55
65
|
return await tx.getRepository(ActivityInstance).save({
|
|
56
66
|
activityType: activity.activityType,
|
|
57
|
-
uiType: activity.uiType,
|
|
58
|
-
uiSource: activity.uiSource,
|
|
67
|
+
// uiType: activity.uiType,
|
|
68
|
+
// uiSource: activity.uiSource,
|
|
69
|
+
// viewType: activity.viewType,
|
|
70
|
+
// viewSource: activity.viewSource,
|
|
59
71
|
assigneeRole: activity.assigneeRole,
|
|
60
72
|
supervisoryRole: activity.supervisoryRole,
|
|
61
|
-
adhocType: activity.adhocType,
|
|
62
|
-
refBy: activity.refBy,
|
|
63
73
|
...activityInstance,
|
|
64
74
|
transaction: 'draft',
|
|
65
75
|
activity,
|
|
76
|
+
...activitySearchKeys,
|
|
66
77
|
state: ActivityInstanceStatus.Draft,
|
|
67
78
|
domain,
|
|
68
79
|
creator: user,
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { Activity } from '../../service/activity/activity'
|
|
1
2
|
import { ActivityInstance, ActivityInstanceStatus } from '../../service/activity-instance/activity-instance'
|
|
2
3
|
import { ActivityInstancePost } from '../../service/activity-instance/activity-instance-type'
|
|
3
4
|
import {
|
|
4
5
|
createActivityThreadsForAllRoleUsers,
|
|
5
6
|
createActivityThreadsForUsers,
|
|
6
|
-
getSystemUserFromOrgMemberItem
|
|
7
|
+
getSystemUserFromOrgMemberItem,
|
|
8
|
+
fillActivitySearchKeys
|
|
7
9
|
} from '../common'
|
|
8
10
|
|
|
9
11
|
export async function post(
|
|
@@ -11,7 +13,8 @@ export async function post(
|
|
|
11
13
|
context: ResolverContext
|
|
12
14
|
): Promise<ActivityInstance> {
|
|
13
15
|
const { domain, user, tx } = context.state
|
|
14
|
-
const
|
|
16
|
+
const issuedAt = new Date()
|
|
17
|
+
var { id, assignees, dueAt, approvalLine, activityId, input } = activityInstance
|
|
15
18
|
|
|
16
19
|
var origin = id
|
|
17
20
|
? await tx.getRepository(ActivityInstance).findOne({
|
|
@@ -29,20 +32,65 @@ export async function post(
|
|
|
29
32
|
})
|
|
30
33
|
: null
|
|
31
34
|
|
|
35
|
+
if (!origin && activityId) {
|
|
36
|
+
var repository = tx.getRepository(Activity)
|
|
37
|
+
var activity = {} as Activity
|
|
38
|
+
|
|
39
|
+
if (activityId) {
|
|
40
|
+
activity = await repository.findOne({
|
|
41
|
+
where: { domain: { id: domain.id }, id: activityId },
|
|
42
|
+
relations: ['assigneeRole', 'supervisoryRole']
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
if (!activity) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
context.t('error.activity not found', {
|
|
48
|
+
activity: activityId
|
|
49
|
+
})
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
activityInstance.activityType = activity.activityType
|
|
55
|
+
// activityInstance.uiType = activity.uiType
|
|
56
|
+
// activityInstance.uiSource = activity.uiSource
|
|
57
|
+
activityInstance.assigneeRole = activity.assigneeRole
|
|
58
|
+
activityInstance.supervisoryRole = activity.supervisoryRole
|
|
59
|
+
|
|
60
|
+
if (!assignees || !approvalLine) {
|
|
61
|
+
activityInstance.adhocType = 'standard'
|
|
62
|
+
activityInstance.refBy = activityId
|
|
63
|
+
if (!activityInstance.assignees) {
|
|
64
|
+
activityInstance.assignees = activity.assignees
|
|
65
|
+
}
|
|
66
|
+
if (!activityInstance.approvalLine) {
|
|
67
|
+
activityInstance.approvalLine = activity.approvalLine
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (!dueAt && activity.standardTime) {
|
|
71
|
+
activityInstance.dueAt = new Date(issuedAt.getTime() + activity.standardTime * 1000)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const activitySearchKeys = fillActivitySearchKeys(activity?.searchKeys, input)
|
|
77
|
+
|
|
32
78
|
const posted = await tx.getRepository(ActivityInstance).save({
|
|
79
|
+
creator: user,
|
|
33
80
|
...origin,
|
|
34
81
|
...activityInstance,
|
|
35
82
|
transaction: 'post',
|
|
83
|
+
activity,
|
|
84
|
+
...activitySearchKeys,
|
|
36
85
|
state: ActivityInstanceStatus.Posted,
|
|
37
86
|
domain,
|
|
38
|
-
|
|
39
|
-
updater: user
|
|
87
|
+
issuer: user,
|
|
88
|
+
updater: user,
|
|
89
|
+
issuedAt
|
|
40
90
|
})
|
|
41
91
|
|
|
42
92
|
const assignedUsers = await Promise.all(assignees.map(assignee => getSystemUserFromOrgMemberItem(assignee, context)))
|
|
43
93
|
|
|
44
|
-
assignees.map(async assignee => await getSystemUserFromOrgMemberItem(assignee, context))
|
|
45
|
-
|
|
46
94
|
if (assignedUsers.length == 0 && posted.threadsMin === 0 && posted.assigneeRoleId) {
|
|
47
95
|
await createActivityThreadsForAllRoleUsers('post', posted, context)
|
|
48
96
|
}
|
|
@@ -13,7 +13,7 @@ export async function start(id: string, context: ResolverContext): Promise<Activ
|
|
|
13
13
|
return await repository.save({
|
|
14
14
|
...activityInstance,
|
|
15
15
|
transaction: 'start',
|
|
16
|
-
|
|
16
|
+
...(await evalActivityInstanceState(id, context)),
|
|
17
17
|
updater: user,
|
|
18
18
|
startedAt: new Date()
|
|
19
19
|
})
|
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
import { Role, User } from '@things-factory/auth-base'
|
|
2
2
|
|
|
3
|
+
import { ActivitySearchKeyItem } from '../service/activity/activity-search-key-item-type'
|
|
3
4
|
import { ActivityInstance, ActivityInstanceStatus, AssigneeItem } from '../service/activity-instance/activity-instance'
|
|
4
5
|
import { ActivityThread, ActivityThreadStatus } from '../service/activity-thread/activity-thread'
|
|
5
6
|
import { Department, Employee, ApprovalLineItem, OrgMemberTargetType } from '@things-factory/organization'
|
|
7
|
+
import { ActivityInstallations } from './activity-installation/activity-installation-controller'
|
|
6
8
|
|
|
7
9
|
export async function updateActivityInstanceState(id: string, context: ResolverContext) {
|
|
8
10
|
const { tx } = context.state
|
|
9
11
|
|
|
10
|
-
await tx.getRepository(ActivityInstance).
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
'supervisoryRole',
|
|
18
|
-
'updater',
|
|
19
|
-
'creator',
|
|
20
|
-
'starter',
|
|
21
|
-
'terminator'
|
|
22
|
-
]
|
|
23
|
-
})),
|
|
12
|
+
var activityInstance = await tx.getRepository(ActivityInstance).findOne({
|
|
13
|
+
where: { id },
|
|
14
|
+
relations: ['domain', 'activity', 'assigneeRole', 'supervisoryRole', 'updater', 'creator', 'starter', 'terminator']
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
activityInstance = await tx.getRepository(ActivityInstance).save({
|
|
18
|
+
...activityInstance,
|
|
24
19
|
transaction: 'thread' /* change by transaction of activity thread */,
|
|
25
|
-
|
|
20
|
+
...(await evalActivityInstanceState(id, context))
|
|
26
21
|
})
|
|
22
|
+
|
|
23
|
+
await ActivityInstallations.callback(activityInstance.activity.name, activityInstance, context)
|
|
27
24
|
}
|
|
28
25
|
|
|
29
|
-
export async function evalActivityInstanceState(
|
|
30
|
-
|
|
26
|
+
export async function evalActivityInstanceState(
|
|
27
|
+
id: string,
|
|
28
|
+
context: ResolverContext
|
|
29
|
+
): Promise<Partial<ActivityInstance>> {
|
|
30
|
+
const { tx, user } = context.state
|
|
31
31
|
|
|
32
32
|
const activityInstance = await tx.getRepository(ActivityInstance).findOne({
|
|
33
33
|
where: { id },
|
|
34
34
|
relations: ['activityThreads']
|
|
35
35
|
})
|
|
36
|
-
const { threadsMin,
|
|
36
|
+
const { threadsMin, activityThreads, state, dueAt } = activityInstance
|
|
37
37
|
|
|
38
38
|
const validThreads = activityThreads.filter(thread => thread.isValid())
|
|
39
39
|
const pendingStartedThreads = activityThreads.filter(thread => thread.isPendingStarted())
|
|
@@ -43,17 +43,51 @@ export async function evalActivityInstanceState(id: string, context: ResolverCon
|
|
|
43
43
|
case state === ActivityInstanceStatus.Draft:
|
|
44
44
|
case state === ActivityInstanceStatus.Ended:
|
|
45
45
|
case state === ActivityInstanceStatus.Aborted:
|
|
46
|
-
return
|
|
46
|
+
return {}
|
|
47
47
|
case validThreads.length === 0:
|
|
48
|
-
return
|
|
48
|
+
return {
|
|
49
|
+
state: ActivityInstanceStatus.Posted
|
|
50
|
+
}
|
|
49
51
|
case threadsMin > validThreads.length:
|
|
50
|
-
return
|
|
52
|
+
return {
|
|
53
|
+
state: ActivityInstanceStatus.WaitingAssignment
|
|
54
|
+
}
|
|
51
55
|
case pendingStartedThreads.length > 0:
|
|
52
|
-
return
|
|
56
|
+
return {
|
|
57
|
+
state: ActivityInstanceStatus.Assigned,
|
|
58
|
+
assignedAt: new Date()
|
|
59
|
+
}
|
|
53
60
|
case pendingEndedThreads.length > 0:
|
|
54
|
-
|
|
61
|
+
var started = !dueAt || dueAt.getTime() > Date.now()
|
|
62
|
+
var changed =
|
|
63
|
+
(started && state !== ActivityInstanceStatus.Started) || (!started && state !== ActivityInstanceStatus.Pending)
|
|
64
|
+
|
|
65
|
+
return !changed
|
|
66
|
+
? null
|
|
67
|
+
: started
|
|
68
|
+
? {
|
|
69
|
+
state: ActivityInstanceStatus.Started,
|
|
70
|
+
startedAt: new Date(),
|
|
71
|
+
starter: user
|
|
72
|
+
}
|
|
73
|
+
: {
|
|
74
|
+
state: ActivityInstanceStatus.Pending
|
|
75
|
+
}
|
|
55
76
|
default:
|
|
56
|
-
return
|
|
77
|
+
return {
|
|
78
|
+
state: activityThreads.find(thread => thread.state == ActivityThreadStatus.Aborted)
|
|
79
|
+
? ActivityInstanceStatus.Aborted
|
|
80
|
+
: ActivityInstanceStatus.Ended,
|
|
81
|
+
reason: '',
|
|
82
|
+
output: activityThreads
|
|
83
|
+
.filter(thread => (thread.state = ActivityThreadStatus.Ended))
|
|
84
|
+
.reduce((sum, thread) => {
|
|
85
|
+
sum[thread.assigneeId] = thread.output
|
|
86
|
+
return sum
|
|
87
|
+
}, {} as any),
|
|
88
|
+
terminatedAt: new Date(),
|
|
89
|
+
terminator: user
|
|
90
|
+
}
|
|
57
91
|
}
|
|
58
92
|
}
|
|
59
93
|
|
|
@@ -68,8 +102,12 @@ export async function createActivityThreadsForUsers(
|
|
|
68
102
|
const threadRepo = tx.getRepository(ActivityThread)
|
|
69
103
|
const now = new Date()
|
|
70
104
|
|
|
105
|
+
const distinct = assignees.filter((assignee, idx) => {
|
|
106
|
+
return assignee && !assignees.slice(0, idx).find(x => x.id == assignee.id)
|
|
107
|
+
})
|
|
108
|
+
|
|
71
109
|
const result = await threadRepo.save(
|
|
72
|
-
|
|
110
|
+
distinct.map(assignee => {
|
|
73
111
|
return {
|
|
74
112
|
assignee,
|
|
75
113
|
state: ActivityThreadStatus.Assigned,
|
|
@@ -126,11 +164,20 @@ export async function getSystemUserFromMyDepartmentManager(context: ResolverCont
|
|
|
126
164
|
const department = await tx.getRepository(Department).findOne({
|
|
127
165
|
where: {
|
|
128
166
|
id: employee.departmentId
|
|
167
|
+
}
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
if (!department || !department.managerId) return
|
|
171
|
+
|
|
172
|
+
const manager = await tx.getRepository(Employee).findOne({
|
|
173
|
+
where: {
|
|
174
|
+
domain: { id: domain.id },
|
|
175
|
+
id: department.managerId
|
|
129
176
|
},
|
|
130
|
-
relations: ['
|
|
177
|
+
relations: ['user']
|
|
131
178
|
})
|
|
132
179
|
|
|
133
|
-
return
|
|
180
|
+
return manager?.user
|
|
134
181
|
}
|
|
135
182
|
|
|
136
183
|
export async function getSystemUserFromMySupervosor(context: ResolverContext): Promise<User> {
|
|
@@ -152,7 +199,7 @@ export async function getSystemUserFromMySupervosor(context: ResolverContext): P
|
|
|
152
199
|
relations: ['user']
|
|
153
200
|
})
|
|
154
201
|
|
|
155
|
-
return supervisor
|
|
202
|
+
return supervisor?.user
|
|
156
203
|
}
|
|
157
204
|
|
|
158
205
|
export async function getSystemUserFromOrgMemberItem(
|
|
@@ -193,3 +240,13 @@ export async function getSystemUserFromOrgMemberItem(
|
|
|
193
240
|
return await getSystemUserFromMySupervosor(context)
|
|
194
241
|
}
|
|
195
242
|
}
|
|
243
|
+
|
|
244
|
+
export function fillActivitySearchKeys(searchKeys: ActivitySearchKeyItem[], input: { [key: string]: any }) {
|
|
245
|
+
return searchKeys?.reduce((sum, key, index) => {
|
|
246
|
+
const value = input[key.inputKey]
|
|
247
|
+
if (value != null) {
|
|
248
|
+
sum[`key0${index + 1}`] = value instanceof Array ? value[0] : value
|
|
249
|
+
}
|
|
250
|
+
return sum
|
|
251
|
+
}, {})
|
|
252
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './activity-installation-controller'
|
|
1
|
+
export * from './activity-installation/activity-installation-controller'
|
|
@@ -10,7 +10,9 @@ import {
|
|
|
10
10
|
import { Role, User } from '@things-factory/auth-base'
|
|
11
11
|
import { config } from '@things-factory/env'
|
|
12
12
|
import { Domain } from '@things-factory/shell'
|
|
13
|
+
import { ApprovalLineItem } from '@things-factory/organization'
|
|
13
14
|
|
|
15
|
+
import { AssigneeItem } from '../activity-instance/activity-instance'
|
|
14
16
|
import { Activity, ActivityStatus, ActivityType, ActivityUIType } from './activity'
|
|
15
17
|
import { ActivityModelItem } from './activity-model-type'
|
|
16
18
|
|
|
@@ -73,6 +75,16 @@ export class ActivityHistory implements HistoryEntityInterface<Activity> {
|
|
|
73
75
|
@Field({ nullable: true })
|
|
74
76
|
startable?: boolean
|
|
75
77
|
|
|
78
|
+
@Column({
|
|
79
|
+
nullable: true
|
|
80
|
+
})
|
|
81
|
+
@Field({ nullable: true })
|
|
82
|
+
schedule?: string
|
|
83
|
+
|
|
84
|
+
@Column({ nullable: true })
|
|
85
|
+
@Field({ nullable: true })
|
|
86
|
+
timezone?: string
|
|
87
|
+
|
|
76
88
|
@Column({ nullable: true })
|
|
77
89
|
@Field({ nullable: true })
|
|
78
90
|
standardTime?: number
|
|
@@ -110,16 +122,35 @@ export class ActivityHistory implements HistoryEntityInterface<Activity> {
|
|
|
110
122
|
@RelationId((activity: Activity) => activity.supervisoryRole)
|
|
111
123
|
supervisoryRoleId?: string
|
|
112
124
|
|
|
125
|
+
@Column('simple-json', { nullable: true })
|
|
126
|
+
@Field(type => [AssigneeItem], { nullable: true, description: 'Who to resolve for the activity.' })
|
|
127
|
+
assignees?: AssigneeItem[]
|
|
128
|
+
|
|
129
|
+
@Column('simple-json', { nullable: true })
|
|
130
|
+
@Field(type => [ApprovalLineItem], {
|
|
131
|
+
nullable: true,
|
|
132
|
+
description: 'Approval line for handling the activity.'
|
|
133
|
+
})
|
|
134
|
+
approvalLine?: ApprovalLineItem[]
|
|
135
|
+
|
|
113
136
|
@Column({ nullable: true })
|
|
114
|
-
@Field({ nullable: true })
|
|
137
|
+
@Field({ nullable: true, description: 'The type of UI to be shown when a task is performed' })
|
|
115
138
|
uiType?: ActivityUIType
|
|
116
139
|
|
|
117
140
|
@Column({ nullable: true })
|
|
118
141
|
@Field({ nullable: true })
|
|
119
142
|
uiSource?: string
|
|
120
143
|
|
|
144
|
+
@Column({ nullable: true })
|
|
145
|
+
@Field({ nullable: true, description: 'The type of view to be shown when a task is approved' })
|
|
146
|
+
viewType?: ActivityUIType
|
|
147
|
+
|
|
121
148
|
@Column({ nullable: true })
|
|
122
149
|
@Field({ nullable: true })
|
|
150
|
+
viewSource?: string
|
|
151
|
+
|
|
152
|
+
@Column({ nullable: true })
|
|
153
|
+
@Field({ nullable: true, description: 'The type of report to be shown when a task is approved' })
|
|
123
154
|
reportType?: ActivityUIType
|
|
124
155
|
|
|
125
156
|
@Column({ nullable: true })
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Field, ObjectType } from 'type-graphql'
|
|
2
|
+
|
|
3
|
+
@ObjectType({ description: 'Entity for ActivitySearchKeyItem' })
|
|
4
|
+
export class ActivitySearchKeyItem {
|
|
5
|
+
@Field()
|
|
6
|
+
name: string
|
|
7
|
+
|
|
8
|
+
@Field({ nullable: true })
|
|
9
|
+
description?: string
|
|
10
|
+
|
|
11
|
+
@Field({ nullable: true })
|
|
12
|
+
inputKey: string
|
|
13
|
+
|
|
14
|
+
@Field({ nullable: true })
|
|
15
|
+
tKey?: string
|
|
16
|
+
}
|
|
@@ -3,9 +3,12 @@ import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
|
|
|
3
3
|
import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
|
|
4
4
|
|
|
5
5
|
import { ObjectRef, ScalarObject } from '@things-factory/shell'
|
|
6
|
+
import { ApprovalLineItem } from '@things-factory/organization'
|
|
6
7
|
|
|
7
|
-
import {
|
|
8
|
+
import { AssigneeItem } from '../activity-instance/activity-instance'
|
|
9
|
+
import { Activity, ActivityStatus, ActivityType, ActivityUIType } from './activity'
|
|
8
10
|
import { ActivityModelItem } from './activity-model-type'
|
|
11
|
+
import { ActivitySearchKeyItem } from './activity-search-key-item-type'
|
|
9
12
|
|
|
10
13
|
@InputType()
|
|
11
14
|
export class NewActivity {
|
|
@@ -18,6 +21,12 @@ export class NewActivity {
|
|
|
18
21
|
@Field({ nullable: true })
|
|
19
22
|
activityType?: ActivityType
|
|
20
23
|
|
|
24
|
+
@Field(type => ScalarObject, { nullable: true })
|
|
25
|
+
searchKeys?: ActivitySearchKeyItem[]
|
|
26
|
+
|
|
27
|
+
@Field({ nullable: true })
|
|
28
|
+
state?: ActivityStatus
|
|
29
|
+
|
|
21
30
|
@Field(type => ScalarObject, { nullable: true })
|
|
22
31
|
model?: ActivityModelItem[]
|
|
23
32
|
|
|
@@ -30,6 +39,9 @@ export class NewActivity {
|
|
|
30
39
|
@Field({ nullable: true })
|
|
31
40
|
schedule?: string
|
|
32
41
|
|
|
42
|
+
@Field({ nullable: true })
|
|
43
|
+
timezone?: string
|
|
44
|
+
|
|
33
45
|
@Field({ nullable: true })
|
|
34
46
|
standardTime?: number
|
|
35
47
|
|
|
@@ -51,12 +63,24 @@ export class NewActivity {
|
|
|
51
63
|
@Field(type => ObjectRef, { nullable: true })
|
|
52
64
|
supervisoryRole?: ObjectRef
|
|
53
65
|
|
|
66
|
+
@Field(type => ScalarObject, { nullable: true })
|
|
67
|
+
assignees?: AssigneeItem[]
|
|
68
|
+
|
|
69
|
+
@Field(type => ScalarObject, { nullable: true })
|
|
70
|
+
approvalLine?: ApprovalLineItem[]
|
|
71
|
+
|
|
54
72
|
@Field({ nullable: true })
|
|
55
73
|
uiType?: ActivityUIType
|
|
56
74
|
|
|
57
75
|
@Field({ nullable: true })
|
|
58
76
|
uiSource?: string
|
|
59
77
|
|
|
78
|
+
@Field({ nullable: true })
|
|
79
|
+
viewType?: ActivityUIType
|
|
80
|
+
|
|
81
|
+
@Field({ nullable: true })
|
|
82
|
+
viewSource?: string
|
|
83
|
+
|
|
60
84
|
@Field({ nullable: true })
|
|
61
85
|
reportType?: ActivityUIType
|
|
62
86
|
|
|
@@ -84,6 +108,12 @@ export class ActivityPatch {
|
|
|
84
108
|
@Field({ nullable: true })
|
|
85
109
|
activityType?: ActivityType
|
|
86
110
|
|
|
111
|
+
@Field(type => ScalarObject, { nullable: true })
|
|
112
|
+
searchKeys?: ActivitySearchKeyItem[]
|
|
113
|
+
|
|
114
|
+
@Field({ nullable: true })
|
|
115
|
+
state?: ActivityStatus
|
|
116
|
+
|
|
87
117
|
@Field(type => ScalarObject, { nullable: true })
|
|
88
118
|
model?: ActivityModelItem[]
|
|
89
119
|
|
|
@@ -96,6 +126,9 @@ export class ActivityPatch {
|
|
|
96
126
|
@Field({ nullable: true })
|
|
97
127
|
schedule?: string
|
|
98
128
|
|
|
129
|
+
@Field({ nullable: true })
|
|
130
|
+
timezone?: string
|
|
131
|
+
|
|
99
132
|
@Field({ nullable: true })
|
|
100
133
|
standardTime?: number
|
|
101
134
|
|
|
@@ -117,12 +150,24 @@ export class ActivityPatch {
|
|
|
117
150
|
@Field(type => ObjectRef, { nullable: true })
|
|
118
151
|
supervisoryRole?: ObjectRef
|
|
119
152
|
|
|
153
|
+
@Field(type => ScalarObject, { nullable: true })
|
|
154
|
+
assignees?: AssigneeItem[]
|
|
155
|
+
|
|
156
|
+
@Field(type => ScalarObject, { nullable: true })
|
|
157
|
+
approvalLine?: ApprovalLineItem[]
|
|
158
|
+
|
|
120
159
|
@Field({ nullable: true })
|
|
121
160
|
uiType?: ActivityUIType
|
|
122
161
|
|
|
123
162
|
@Field({ nullable: true })
|
|
124
163
|
uiSource?: string
|
|
125
164
|
|
|
165
|
+
@Field({ nullable: true })
|
|
166
|
+
viewType?: ActivityUIType
|
|
167
|
+
|
|
168
|
+
@Field({ nullable: true })
|
|
169
|
+
viewSource?: string
|
|
170
|
+
|
|
126
171
|
@Field({ nullable: true })
|
|
127
172
|
reportType?: ActivityUIType
|
|
128
173
|
|