@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.
Files changed (195) hide show
  1. package/client/bootstrap.ts +9 -1
  2. package/client/components/activity-starter-form.ts +35 -10
  3. package/client/grist-editor/grist-editor-activity-search-key.ts +79 -0
  4. package/client/grist-editor/popup-activity-search-keys-input.ts +167 -0
  5. package/client/pages/activity/activity-list-page.ts +122 -11
  6. package/client/pages/activity/activity-partial-view.ts +85 -0
  7. package/client/pages/activity/starter-list-page.ts +1 -0
  8. package/client/pages/activity-approval/activity-approval-page.ts +6 -6
  9. package/client/pages/activity-instance/activity-instance-search-page.ts +377 -0
  10. package/client/pages/activity-instance/activity-instance-view.ts +135 -0
  11. package/client/pages/activity-store/activity-store-page.ts +1 -1
  12. package/client/pages/activity-template/activity-template-list-page.ts +29 -1
  13. package/client/pages/activity-thread/activity-thread-page.ts +8 -3
  14. package/client/pages/activity-thread/activity-thread-view.ts +102 -0
  15. package/client/pages/installable-activity/installable-activity-list-page.ts +29 -1
  16. package/client/pages/todo/approval-waiting-list-page.ts +19 -9
  17. package/client/pages/todo/done-list-page.ts +344 -0
  18. package/client/pages/todo/draft-list-page.ts +13 -2
  19. package/client/pages/todo/todo-list-page.ts +14 -3
  20. package/client/route.ts +8 -0
  21. package/client/types/activity-instance-type.ts +123 -0
  22. package/client/types/activity-instance.ts +124 -0
  23. package/client/types/activity-model-type.ts +40 -0
  24. package/client/types/activity-search-key-item-type.ts +9 -0
  25. package/client/types/activity-thread-type.ts +19 -0
  26. package/client/types/activity-thread.ts +88 -0
  27. package/client/types/activity.ts +103 -0
  28. package/client/{types.js → types/types.ts} +0 -9
  29. package/dist-client/bootstrap.js +4 -1
  30. package/dist-client/bootstrap.js.map +1 -1
  31. package/dist-client/components/activity-starter-form.d.ts +1 -1
  32. package/dist-client/components/activity-starter-form.js +34 -9
  33. package/dist-client/components/activity-starter-form.js.map +1 -1
  34. package/dist-client/grist-editor/grist-editor-activity-search-key.d.ts +12 -0
  35. package/dist-client/grist-editor/grist-editor-activity-search-key.js +70 -0
  36. package/dist-client/grist-editor/grist-editor-activity-search-key.js.map +1 -0
  37. package/dist-client/grist-editor/popup-activity-search-keys-input.d.ts +17 -0
  38. package/dist-client/grist-editor/popup-activity-search-keys-input.js +177 -0
  39. package/dist-client/grist-editor/popup-activity-search-keys-input.js.map +1 -0
  40. package/dist-client/pages/activity/activity-list-page.d.ts +4 -0
  41. package/dist-client/pages/activity/activity-list-page.js +121 -11
  42. package/dist-client/pages/activity/activity-list-page.js.map +1 -1
  43. package/dist-client/pages/activity/activity-partial-view.d.ts +13 -0
  44. package/dist-client/pages/activity/activity-partial-view.js +56 -0
  45. package/dist-client/pages/activity/activity-partial-view.js.map +1 -0
  46. package/dist-client/pages/activity/starter-list-page.js.map +1 -1
  47. package/dist-client/pages/activity-approval/activity-approval-page.js +6 -6
  48. package/dist-client/pages/activity-approval/activity-approval-page.js.map +1 -1
  49. package/dist-client/pages/activity-instance/activity-instance-search-page.d.ts +76 -0
  50. package/dist-client/pages/activity-instance/activity-instance-search-page.js +371 -0
  51. package/dist-client/pages/activity-instance/activity-instance-search-page.js.map +1 -0
  52. package/dist-client/pages/activity-instance/activity-instance-view.d.ts +14 -0
  53. package/dist-client/pages/activity-instance/activity-instance-view.js +130 -0
  54. package/dist-client/pages/activity-instance/activity-instance-view.js.map +1 -0
  55. package/dist-client/pages/activity-store/activity-store-page.js +1 -1
  56. package/dist-client/pages/activity-store/activity-store-page.js.map +1 -1
  57. package/dist-client/pages/activity-template/activity-template-list-page.js +29 -1
  58. package/dist-client/pages/activity-template/activity-template-list-page.js.map +1 -1
  59. package/dist-client/pages/activity-thread/activity-thread-page.js +8 -3
  60. package/dist-client/pages/activity-thread/activity-thread-page.js.map +1 -1
  61. package/dist-client/pages/activity-thread/activity-thread-view.d.ts +11 -0
  62. package/dist-client/pages/activity-thread/activity-thread-view.js +103 -0
  63. package/dist-client/pages/activity-thread/activity-thread-view.js.map +1 -0
  64. package/dist-client/pages/installable-activity/installable-activity-list-page.js +29 -1
  65. package/dist-client/pages/installable-activity/installable-activity-list-page.js.map +1 -1
  66. package/dist-client/pages/todo/approval-waiting-list-page.js +19 -9
  67. package/dist-client/pages/todo/approval-waiting-list-page.js.map +1 -1
  68. package/dist-client/pages/todo/done-list-page.d.ts +44 -0
  69. package/dist-client/pages/todo/done-list-page.js +342 -0
  70. package/dist-client/pages/todo/done-list-page.js.map +1 -0
  71. package/dist-client/pages/todo/draft-list-page.js +12 -2
  72. package/dist-client/pages/todo/draft-list-page.js.map +1 -1
  73. package/dist-client/pages/todo/todo-list-page.js +13 -3
  74. package/dist-client/pages/todo/todo-list-page.js.map +1 -1
  75. package/dist-client/route.d.ts +1 -1
  76. package/dist-client/route.js +6 -0
  77. package/dist-client/route.js.map +1 -1
  78. package/dist-client/tsconfig.tsbuildinfo +1 -1
  79. package/dist-client/types/activity-instance-type.d.ts +76 -0
  80. package/dist-client/types/activity-instance-type.js +11 -0
  81. package/dist-client/types/activity-instance-type.js.map +1 -0
  82. package/dist-client/types/activity-instance.d.ts +70 -0
  83. package/dist-client/types/activity-instance.js +36 -0
  84. package/dist-client/types/activity-instance.js.map +1 -0
  85. package/dist-client/types/activity-model-type.d.ts +31 -0
  86. package/dist-client/types/activity-model-type.js +18 -0
  87. package/dist-client/types/activity-model-type.js.map +1 -0
  88. package/dist-client/types/activity-search-key-item-type.d.ts +6 -0
  89. package/dist-client/types/activity-search-key-item-type.js +3 -0
  90. package/dist-client/types/activity-search-key-item-type.js.map +1 -0
  91. package/dist-client/types/activity-thread-type.d.ts +15 -0
  92. package/dist-client/types/activity-thread-type.js +7 -0
  93. package/dist-client/types/activity-thread-type.js.map +1 -0
  94. package/dist-client/types/activity-thread.d.ts +37 -0
  95. package/dist-client/types/activity-thread.js +51 -0
  96. package/dist-client/types/activity-thread.js.map +1 -0
  97. package/dist-client/types/activity.d.ts +65 -0
  98. package/dist-client/types/activity.js +35 -0
  99. package/dist-client/types/activity.js.map +1 -0
  100. package/dist-client/{types.d.ts → types/types.d.ts} +3 -7
  101. package/dist-client/{types.js → types/types.js} +0 -8
  102. package/dist-client/types/types.js.map +1 -0
  103. package/dist-server/controllers/activity-approval/approve.js +2 -0
  104. package/dist-server/controllers/activity-approval/approve.js.map +1 -1
  105. package/dist-server/controllers/activity-approval/reject.js +2 -0
  106. package/dist-server/controllers/activity-approval/reject.js.map +1 -1
  107. package/dist-server/controllers/{activity-installation-controller.js → activity-installation/activity-installation-controller.js} +8 -0
  108. package/dist-server/controllers/activity-installation/activity-installation-controller.js.map +1 -0
  109. package/dist-server/controllers/activity-installation/call-webhook.js.map +1 -0
  110. package/dist-server/controllers/activity-instance/abort.js +1 -1
  111. package/dist-server/controllers/activity-instance/abort.js.map +1 -1
  112. package/dist-server/controllers/activity-instance/adjust.js +1 -1
  113. package/dist-server/controllers/activity-instance/adjust.js.map +1 -1
  114. package/dist-server/controllers/activity-instance/delegate.js +5 -0
  115. package/dist-server/controllers/activity-instance/delegate.js.map +1 -1
  116. package/dist-server/controllers/activity-instance/draft.js +16 -1
  117. package/dist-server/controllers/activity-instance/draft.js.map +1 -1
  118. package/dist-server/controllers/activity-instance/post.js +38 -3
  119. package/dist-server/controllers/activity-instance/post.js.map +1 -1
  120. package/dist-server/controllers/activity-instance/start.js +1 -1
  121. package/dist-server/controllers/activity-instance/start.js.map +1 -1
  122. package/dist-server/controllers/activity-thread/submit.js +1 -1
  123. package/dist-server/controllers/activity-thread/submit.js.map +1 -1
  124. package/dist-server/controllers/common.js +72 -25
  125. package/dist-server/controllers/common.js.map +1 -1
  126. package/dist-server/controllers/index.js +1 -1
  127. package/dist-server/controllers/index.js.map +1 -1
  128. package/dist-server/service/activity/activity-history.js +38 -1
  129. package/dist-server/service/activity/activity-history.js.map +1 -1
  130. package/dist-server/service/activity/activity-search-key-item-type.js +28 -0
  131. package/dist-server/service/activity/activity-search-key-item-type.js.map +1 -0
  132. package/dist-server/service/activity/activity-type.js +56 -0
  133. package/dist-server/service/activity/activity-type.js.map +1 -1
  134. package/dist-server/service/activity/activity.js +40 -4
  135. package/dist-server/service/activity/activity.js.map +1 -1
  136. package/dist-server/service/activity-approval/event-subscriber.js +1 -1
  137. package/dist-server/service/activity-approval/event-subscriber.js.map +1 -1
  138. package/dist-server/service/activity-instance/activity-instance-history.js +53 -0
  139. package/dist-server/service/activity-instance/activity-instance-history.js.map +1 -1
  140. package/dist-server/service/activity-instance/activity-instance-query.js +29 -0
  141. package/dist-server/service/activity-instance/activity-instance-query.js.map +1 -1
  142. package/dist-server/service/activity-instance/activity-instance-type.js +16 -0
  143. package/dist-server/service/activity-instance/activity-instance-type.js.map +1 -1
  144. package/dist-server/service/activity-instance/activity-instance.js +63 -0
  145. package/dist-server/service/activity-instance/activity-instance.js.map +1 -1
  146. package/dist-server/service/activity-instance/event-subscriber.js +4 -4
  147. package/dist-server/service/activity-instance/event-subscriber.js.map +1 -1
  148. package/dist-server/service/activity-thread/activity-thread-query.js +27 -0
  149. package/dist-server/service/activity-thread/activity-thread-query.js.map +1 -1
  150. package/dist-server/service/activity-thread/activity-thread.js +4 -1
  151. package/dist-server/service/activity-thread/activity-thread.js.map +1 -1
  152. package/dist-server/service/installable-activity/installable-activity-mutation.js +1 -1
  153. package/dist-server/service/installable-activity/installable-activity-mutation.js.map +1 -1
  154. package/dist-server/service/installable-activity/installable-activity-query.js +1 -1
  155. package/dist-server/service/installable-activity/installable-activity-query.js.map +1 -1
  156. package/dist-server/service/installable-activity/installable-activity.js.map +1 -1
  157. package/dist-server/tsconfig.tsbuildinfo +1 -1
  158. package/package.json +9 -8
  159. package/server/controllers/activity-approval/approve.ts +3 -0
  160. package/server/controllers/activity-approval/reject.ts +3 -0
  161. package/server/controllers/{activity-installation-controller.ts → activity-installation/activity-installation-controller.ts} +12 -1
  162. package/server/controllers/activity-instance/abort.ts +1 -1
  163. package/server/controllers/activity-instance/adjust.ts +1 -1
  164. package/server/controllers/activity-instance/delegate.ts +9 -1
  165. package/server/controllers/activity-instance/draft.ts +16 -5
  166. package/server/controllers/activity-instance/post.ts +54 -6
  167. package/server/controllers/activity-instance/start.ts +1 -1
  168. package/server/controllers/activity-thread/submit.ts +1 -0
  169. package/server/controllers/common.ts +85 -28
  170. package/server/controllers/index.ts +1 -1
  171. package/server/service/activity/activity-history.ts +32 -1
  172. package/server/service/activity/activity-search-key-item-type.ts +16 -0
  173. package/server/service/activity/activity-type.ts +46 -1
  174. package/server/service/activity/activity.ts +34 -4
  175. package/server/service/activity-approval/event-subscriber.ts +1 -1
  176. package/server/service/activity-instance/activity-instance-history.ts +41 -0
  177. package/server/service/activity-instance/activity-instance-query.ts +30 -1
  178. package/server/service/activity-instance/activity-instance-type.ts +12 -0
  179. package/server/service/activity-instance/activity-instance.ts +49 -0
  180. package/server/service/activity-instance/event-subscriber.ts +4 -4
  181. package/server/service/activity-thread/activity-thread-query.ts +24 -0
  182. package/server/service/activity-thread/activity-thread.ts +6 -3
  183. package/server/service/installable-activity/installable-activity-mutation.ts +1 -1
  184. package/server/service/installable-activity/installable-activity-query.ts +1 -1
  185. package/server/service/installable-activity/installable-activity.ts +3 -1
  186. package/things-factory.config.js +5 -1
  187. package/translations/en.json +7 -0
  188. package/translations/ko.json +7 -0
  189. package/translations/ms.json +7 -0
  190. package/translations/zh.json +7 -0
  191. package/dist-client/types.js.map +0 -1
  192. package/dist-server/controllers/activity-installation-controller.js.map +0 -1
  193. package/dist-server/controllers/call-webhook.js.map +0 -1
  194. /package/dist-server/controllers/{call-webhook.js → activity-installation/call-webhook.js} +0 -0
  195. /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.27",
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.27",
31
- "@things-factory/auth-base": "^6.0.27",
32
- "@things-factory/board-service": "^6.0.27",
33
- "@things-factory/context-ui": "^6.0.27",
34
- "@things-factory/organization": "^6.0.27",
35
- "@things-factory/shell": "^6.0.27"
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": "684784a4f3e450e9ce07dcd51db70b8a2d2c2a0f"
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 '../service/installable-activity/installable-activity'
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
- state: await evalActivityInstanceState(id, context),
28
+ ...(await evalActivityInstanceState(id, context)),
29
29
  transaction: 'abort',
30
30
  updater: user,
31
31
  terminatedAt: new Date(),
@@ -19,7 +19,7 @@ export async function adjust(
19
19
  ...activityInstance,
20
20
  ...patch,
21
21
  transaction: 'adjust',
22
- state: await evalActivityInstanceState(id, context),
22
+ ...(await evalActivityInstanceState(id, context)),
23
23
  updater: user
24
24
  })
25
25
  }
@@ -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 any
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 { id, assignees } = activityInstance
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
- creator: user,
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
- state: await evalActivityInstanceState(id, context),
16
+ ...(await evalActivityInstanceState(id, context)),
17
17
  updater: user,
18
18
  startedAt: new Date()
19
19
  })
@@ -62,6 +62,7 @@ export async function submit(
62
62
  transaction: 'end',
63
63
  state: ActivityThreadStatus.Ended,
64
64
  updater: user,
65
+ terminator: user,
65
66
  terminatedAt: new Date()
66
67
  })
67
68
  }
@@ -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).save({
11
- ...(await tx.getRepository(ActivityInstance).findOne({
12
- where: { id },
13
- relations: [
14
- 'domain',
15
- 'activity',
16
- 'assigneeRole',
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
- state: await evalActivityInstanceState(id, context)
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(id: string, context: ResolverContext): Promise<ActivityInstanceStatus> {
30
- const { tx } = context.state
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, threadsMax, activityThreads, state, dueAt } = activityInstance
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 state
46
+ return {}
47
47
  case validThreads.length === 0:
48
- return ActivityInstanceStatus.Posted
48
+ return {
49
+ state: ActivityInstanceStatus.Posted
50
+ }
49
51
  case threadsMin > validThreads.length:
50
- return ActivityInstanceStatus.WaitingAssignment
52
+ return {
53
+ state: ActivityInstanceStatus.WaitingAssignment
54
+ }
51
55
  case pendingStartedThreads.length > 0:
52
- return ActivityInstanceStatus.Assigned
56
+ return {
57
+ state: ActivityInstanceStatus.Assigned,
58
+ assignedAt: new Date()
59
+ }
53
60
  case pendingEndedThreads.length > 0:
54
- return !dueAt || dueAt.getTime() > Date.now() ? ActivityInstanceStatus.Started : ActivityInstanceStatus.Pending
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 ActivityInstanceStatus.Ended
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
- assignees.map(assignee => {
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: ['manager']
177
+ relations: ['user']
131
178
  })
132
179
 
133
- return department.manager
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.user
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 { Activity, ActivityType, ActivityUIType } from './activity'
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