@things-factory/worklist 6.1.63 → 6.1.66

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 (45) hide show
  1. package/client/pages/activity-approval/activity-approval-page.ts +2 -1
  2. package/client/pages/activity-instance/activity-instance-search-page.ts +1 -1
  3. package/client/pages/activity-instance/activity-instance-view.ts +36 -26
  4. package/client/pages/activity-thread/activity-thread-page.ts +2 -1
  5. package/client/pages/activity-thread/activity-thread-view-page.ts +18 -41
  6. package/client/pages/activity-thread/activity-thread-view.ts +408 -0
  7. package/client/pages/todo/done-list-calendar-page.ts +1 -1
  8. package/client/pages/todo/done-list-page.ts +1 -1
  9. package/client/types/activity-instance.ts +4 -0
  10. package/dist-client/pages/activity-approval/activity-approval-page.js +2 -1
  11. package/dist-client/pages/activity-approval/activity-approval-page.js.map +1 -1
  12. package/dist-client/pages/activity-instance/activity-instance-search-page.js +1 -1
  13. package/dist-client/pages/activity-instance/activity-instance-search-page.js.map +1 -1
  14. package/dist-client/pages/activity-instance/activity-instance-view.d.ts +1 -1
  15. package/dist-client/pages/activity-instance/activity-instance-view.js +34 -13
  16. package/dist-client/pages/activity-instance/activity-instance-view.js.map +1 -1
  17. package/dist-client/pages/activity-thread/activity-thread-page.js +2 -1
  18. package/dist-client/pages/activity-thread/activity-thread-page.js.map +1 -1
  19. package/dist-client/pages/activity-thread/activity-thread-view-page.d.ts +5 -5
  20. package/dist-client/pages/activity-thread/activity-thread-view-page.js +17 -38
  21. package/dist-client/pages/activity-thread/activity-thread-view-page.js.map +1 -1
  22. package/dist-client/pages/activity-thread/activity-thread-view.d.ts +16 -0
  23. package/dist-client/pages/activity-thread/activity-thread-view.js +387 -0
  24. package/dist-client/pages/activity-thread/activity-thread-view.js.map +1 -0
  25. package/dist-client/pages/todo/done-list-calendar-page.js +1 -1
  26. package/dist-client/pages/todo/done-list-calendar-page.js.map +1 -1
  27. package/dist-client/pages/todo/done-list-page.js +1 -1
  28. package/dist-client/pages/todo/done-list-page.js.map +1 -1
  29. package/dist-client/route.d.ts +1 -1
  30. package/dist-client/tsconfig.tsbuildinfo +1 -1
  31. package/dist-client/types/activity-instance.d.ts +2 -0
  32. package/dist-client/types/activity-instance.js.map +1 -1
  33. package/dist-server/controllers/activity-instance/issue.js +1 -1
  34. package/dist-server/controllers/activity-instance/issue.js.map +1 -1
  35. package/dist-server/service/activity-instance/activity-instance-query.js +20 -0
  36. package/dist-server/service/activity-instance/activity-instance-query.js.map +1 -1
  37. package/dist-server/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +9 -9
  39. package/server/controllers/activity-instance/issue.ts +1 -1
  40. package/server/service/activity-instance/activity-instance-query.ts +10 -0
  41. package/translations/en.json +1 -1
  42. package/translations/ja.json +1 -1
  43. package/translations/ko.json +1 -1
  44. package/translations/ms.json +1 -1
  45. package/translations/zh.json +1 -1
@@ -197,8 +197,9 @@ export class ActivityApprovalPage extends connect(store)(localize(i18next)(PageV
197
197
  return this.customElementContent()
198
198
  case 'page':
199
199
  case 'external':
200
- default:
201
200
  return html``
201
+ default:
202
+ return this.generatedContent()
202
203
  }
203
204
  }
204
205
 
@@ -231,7 +231,7 @@ export class ActivityInstanceSearchPage extends connect(store)(localize(i18next)
231
231
  {
232
232
  type: 'json5',
233
233
  name: 'output',
234
- header: i18next.t('field.output'),
234
+ header: i18next.t('field.artifact'),
235
235
  record: {
236
236
  editable: false
237
237
  },
@@ -192,13 +192,13 @@ export class ActivityInstanceView extends localize(i18next)(LitElement) {
192
192
  border-bottom-color: #f4f4f4;
193
193
  border-top: 0;
194
194
  }
195
- [etc] div {
195
+ [thread] div {
196
196
  border-bottom: var(--border-dark-color);
197
197
  padding: var(--padding-narrow);
198
198
  text-align: right;
199
199
  overflow: hidden;
200
200
  }
201
- [etc] div label {
201
+ [thread] div label {
202
202
  float: left;
203
203
  width: 25%;
204
204
  text-align: left;
@@ -219,21 +219,8 @@ export class ActivityInstanceView extends localize(i18next)(LitElement) {
219
219
  return html`<div>no activity instance info.</div>`
220
220
  }
221
221
 
222
- const {
223
- id,
224
- name,
225
- description,
226
- input,
227
- output,
228
- state,
229
- assignedAt,
230
- startedAt,
231
- approvalLine,
232
- activityThreads,
233
- terminatedAt,
234
- updatedAt
235
- } = this.activityInstance
236
- const instance = this.activityInstance
222
+ const { id, name, description, state, issuer, assignedAt, startedAt, activityThreads, terminatedAt, updatedAt } =
223
+ this.activityInstance
237
224
 
238
225
  return html`
239
226
  <div instance-container>
@@ -242,7 +229,6 @@ export class ActivityInstanceView extends localize(i18next)(LitElement) {
242
229
  <strong>${name}</strong>
243
230
  ${description}
244
231
  </div>
245
- ${approvalLine ? html`<approval-line-view .model=${approvalLine}></approval-line-view>` : html``}
246
232
 
247
233
  <div>
248
234
  <label>${i18next.t('label.status')}</label>
@@ -250,6 +236,10 @@ export class ActivityInstanceView extends localize(i18next)(LitElement) {
250
236
  <strong>${i18next.t('label.activity-state-' + state)}</strong>
251
237
  </div>
252
238
 
239
+ <div issuer>
240
+ <mwc-icon>account_circle</mwc-icon>
241
+ <strong>${issuer?.name || ''}</strong>
242
+ </div>
253
243
  <div>
254
244
  <label>${i18next.t('field.assigned-at')}</label>${assignedAt && formatter.format(new Date(assignedAt))}
255
245
  </div>
@@ -259,11 +249,13 @@ export class ActivityInstanceView extends localize(i18next)(LitElement) {
259
249
  <label>${i18next.t('field.terminated-at')}</label>${terminatedAt && formatter.format(new Date(terminatedAt))}
260
250
  </div>
261
251
  </div>
262
- <div thread-container>${activityThreads?.map(activityThread => this.renderActivityThread(activityThread))}</div>
252
+ <div thread-container>
253
+ ${activityThreads?.map(activityThread => this.renderActivityThread(this.activityInstance!, activityThread))}
254
+ </div>
263
255
  `
264
256
  }
265
257
 
266
- renderActivityThread(activityThread: ActivityThread) {
258
+ renderActivityThread(activityInstance: ActivityInstance, activityThread: ActivityThread) {
267
259
  const {
268
260
  state,
269
261
  assignee,
@@ -274,7 +266,12 @@ export class ActivityInstanceView extends localize(i18next)(LitElement) {
274
266
  startedAt,
275
267
  terminatedAt
276
268
  } = activityThread
269
+ const { approvalLine } = activityInstance!
277
270
  const { name, email } = assignee || {}
271
+ const approvals = activityApprovals.sort((a, b) =>
272
+ a.round < b.round ? 1 : a.round > b.round ? -1 : a.order! < b.order! ? 1 : -1
273
+ )
274
+ const current = approvals[0]?.round == round ? approvals[0].order : -1
278
275
 
279
276
  return html`
280
277
  <div assignee>
@@ -282,7 +279,7 @@ export class ActivityInstanceView extends localize(i18next)(LitElement) {
282
279
  <strong>${name}</strong>
283
280
  </div>
284
281
 
285
- <div etc>
282
+ <div thread>
286
283
  <span subtitle>${i18next.t('label.information')}</span>
287
284
  <div>
288
285
  <label>${i18next.t('label.status')}</label>
@@ -300,15 +297,20 @@ export class ActivityInstanceView extends localize(i18next)(LitElement) {
300
297
  </div>
301
298
 
302
299
  <div>
303
- <span subtitle>${i18next.t('field.output')}</span>
300
+ <span subtitle>${i18next.t('field.artifact')}</span>
304
301
  ${this.renderInOut(output || {})}
305
302
  </div>
306
303
  <div timeline>
307
- <span subtitle>승인 검토 이력</span>
304
+ <span subtitle>${i18next.t('label.review-and-approval')}</span>
305
+
306
+ <div>
307
+ ${approvalLine
308
+ ? html`<approval-line-view .model=${approvalLine} .current=${current}></approval-line-view>`
309
+ : html``}
310
+ </div>
311
+
308
312
  <ol>
309
- ${activityApprovals
310
- .sort((a, b) => (a.round < b.round ? 1 : a.round > b.round ? -1 : a.order! < b.order! ? 1 : -1))
311
- .map(approval => this.renderActivityApproval(approval))}
313
+ ${approvals.map(approval => this.renderActivityApproval(approval))}
312
314
  </ol>
313
315
  </div>
314
316
  `
@@ -400,6 +402,14 @@ export class ActivityInstanceView extends localize(i18next)(LitElement) {
400
402
  key05
401
403
  input
402
404
  output
405
+ issuer {
406
+ name
407
+ email
408
+ }
409
+ starter {
410
+ name
411
+ email
412
+ }
403
413
  activity {
404
414
  id
405
415
  name
@@ -172,8 +172,9 @@ export class ActivityThreadPage extends connect(store)(localize(i18next)(PageVie
172
172
  return this.customElementContent()
173
173
  case 'page':
174
174
  case 'external':
175
- default:
176
175
  return html``
176
+ default:
177
+ return this.generatedContent()
177
178
  }
178
179
  }
179
180
 
@@ -1,5 +1,6 @@
1
- import '@operato/property-editor/ox-properties-dynamic-view.js'
2
1
  import '@operato/board/ox-board-viewer.js'
2
+ import '../../components/activity-thread-ribon.js'
3
+ import './activity-thread-view.js'
3
4
 
4
5
  import gql from 'graphql-tag'
5
6
  import { css, html } from 'lit'
@@ -32,6 +33,7 @@ const ActivityThreadFetchResult = `\
32
33
  description
33
34
  state
34
35
  activity {
36
+ id
35
37
  model {
36
38
  name
37
39
  description
@@ -85,7 +87,6 @@ export class ActivityThreadViewPage extends connect(store)(localize(i18next)(Pag
85
87
  flex-direction: column;
86
88
 
87
89
  width: 100%;
88
- padding: 5px;
89
90
  overflow: auto;
90
91
  }
91
92
 
@@ -94,6 +95,10 @@ export class ActivityThreadViewPage extends connect(store)(localize(i18next)(Pag
94
95
  height: 100%;
95
96
  }
96
97
 
98
+ activity-thread-view {
99
+ padding: var(--padding-default);
100
+ }
101
+
97
102
  #custom-content {
98
103
  flex: 1;
99
104
  }
@@ -107,13 +112,18 @@ export class ActivityThreadViewPage extends connect(store)(localize(i18next)(Pag
107
112
  return {
108
113
  title: this.lifecycle?.params?.['title'] || i18next.t('title.activity'),
109
114
  help: 'worklist/activity',
110
- actions: [],
111
- activityThread: this.activityThread
115
+ actions: []
116
+ // activityThread: this.activityThread
112
117
  }
113
118
  }
114
119
 
115
120
  render() {
116
- return html` ${this.activityContent()}`
121
+ const activityThread = this.activityThread
122
+
123
+ return html` ${activityThread
124
+ ? html`<activity-thread-ribon .activityThread=${activityThread}></activity-thread-ribon>`
125
+ : html``}
126
+ ${this.activityContent()}`
117
127
  }
118
128
 
119
129
  activityContent() {
@@ -128,8 +138,9 @@ export class ActivityThreadViewPage extends connect(store)(localize(i18next)(Pag
128
138
  return this.customElementContent()
129
139
  case 'page':
130
140
  case 'external':
131
- default:
132
141
  return html``
142
+ default:
143
+ return this.generatedContent()
133
144
  }
134
145
  }
135
146
 
@@ -169,43 +180,9 @@ export class ActivityThreadViewPage extends connect(store)(localize(i18next)(Pag
169
180
  }
170
181
 
171
182
  generatedContent() {
172
- var { output, activityInstance } = this.activityThread || {}
173
- var { input } = activityInstance || {}
174
-
175
- const inputSpec = this.getInputSpec()
176
- const outputSpec = this.getOutputSpec()
177
-
178
- if (!output) {
179
- output = inputSpec
180
- .filter(item => item.inout === 'inout')
181
- .reduce((inout, item) => {
182
- inout[item.name] = input[item.name]
183
- return inout
184
- }, {})
185
- }
186
-
187
183
  return keyed(
188
184
  this.activityThread.id,
189
- html`
190
- <fieldset>
191
- <legend>Input</legend>
192
- <ox-properties-dynamic-view
193
- data-name="input"
194
- .props=${inputSpec}
195
- .value=${input}
196
- ></ox-properties-dynamic-view>
197
- </fieldset>
198
-
199
- <fieldset>
200
- <legend>Output</legend>
201
- <ox-properties-dynamic-view
202
- data-name="output"
203
- .props=${outputSpec}
204
- .value=${output}
205
- @property-change=${e => (this.activityThread.output = e.currentTarget.value)}
206
- ></ox-properties-dynamic-view>
207
- </fieldset>
208
- `
185
+ html` <activity-thread-view .activityThreadId=${this.activityThread.id}></activity-thread-view> `
209
186
  )
210
187
  }
211
188
 
@@ -0,0 +1,408 @@
1
+ import '@things-factory/organization/dist-client/component/approval-line-view.js'
2
+
3
+ import gql from 'graphql-tag'
4
+ import { css, html, LitElement } from 'lit'
5
+ import { customElement, property, query, state } from 'lit/decorators.js'
6
+
7
+ import { client } from '@operato/graphql'
8
+ import { i18next, localize } from '@operato/i18n'
9
+ import { ScrollbarStyles } from '@operato/styles'
10
+
11
+ import { ActivityThread } from '../../types/activity-thread'
12
+ import { ActivityApproval } from '../../types/activity-approval'
13
+
14
+ const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'short', timeStyle: 'short' })
15
+
16
+ @customElement('activity-thread-view')
17
+ export class ActivityThreadView extends localize(i18next)(LitElement) {
18
+ static styles = [
19
+ ScrollbarStyles,
20
+ css`
21
+ :host {
22
+ display: flex;
23
+ flex-direction: column;
24
+ overflow: auto;
25
+ font-size: var(--fontsize-default);
26
+ }
27
+
28
+ :host([state='assigned']) {
29
+ --worklist-status-color: #5f7184;
30
+ }
31
+
32
+ :host([state='started']) {
33
+ --worklist-status-color: #56af45;
34
+ }
35
+
36
+ :host([state='delegated']) {
37
+ --worklist-status-color: #8654b0;
38
+ }
39
+
40
+ :host([state='submitted']) {
41
+ --worklist-status-color: #428df3;
42
+ }
43
+
44
+ :host([state='escalated']) {
45
+ --worklist-status-color: #595de5;
46
+ }
47
+
48
+ :host([state='rejected']) {
49
+ --worklist-status-color: #f27429;
50
+ }
51
+
52
+ :host([state='ended']) {
53
+ --worklist-status-color: #02acae;
54
+ }
55
+
56
+ :host([state='aborted']) {
57
+ --worklist-status-color: #cb3a33;
58
+ }
59
+
60
+ [instance-container] {
61
+ flex: 1;
62
+ background-color: var(--main-section-background-color);
63
+ border-right: var(--border-dark-color);
64
+ padding: var(--padding-wide);
65
+ color: var(--primary-text-color);
66
+ }
67
+ [thread-container] {
68
+ flex: 2;
69
+ padding: var(--padding-wide);
70
+ }
71
+ [instance-container] div {
72
+ margin-bottom: var(--margin-default);
73
+ padding-bottom: var(--padding-default);
74
+ border-bottom: var(--border-dark-color);
75
+ }
76
+ [instance-container] div label {
77
+ display: inline-block;
78
+ margin-right: var(--margin-default);
79
+ }
80
+ span[status] {
81
+ width: 15px;
82
+ height: 15px;
83
+ background-color: var(--worklist-status-color, tomato);
84
+ display: inline-block;
85
+ margin-right: var(--margin-narrow);
86
+ border-radius: 50%;
87
+ }
88
+ table {
89
+ width: 100%;
90
+ border-collapse: collapse;
91
+ }
92
+ th {
93
+ background-color: rgba(var(--primary-color-rgb), 0.05);
94
+ border-top: var(--grid-header-top-border);
95
+ border-bottom: var(--grid-header-bottom-border);
96
+ padding: var(--grid-header-padding);
97
+ text-overflow: ellipsis;
98
+ font: var(--grid-header-font);
99
+ color: var(--grid-header-color);
100
+ }
101
+ td {
102
+ padding: var(--padding-narrow);
103
+ border-bottom: var(--grid-record-border-bottom);
104
+ }
105
+ [assignee] * {
106
+ vertical-align: middle;
107
+ }
108
+ [assignee] mwc-icon {
109
+ opacity: 0.5;
110
+ }
111
+ [subtitle] {
112
+ display: block;
113
+ margin: var(--margin-wide) 0 var(--margin-narrow) 0;
114
+ font: bold 16px var(--theme-font);
115
+ color: var(--secondary-text-color);
116
+ }
117
+ [timeline] ol {
118
+ list-style: none;
119
+ margin: 0;
120
+ padding: 0;
121
+ }
122
+ [timeline] li {
123
+ display: flex;
124
+ }
125
+ [timeline] [info] {
126
+ flex: 1;
127
+ }
128
+ [timeline] [date] {
129
+ opacity: 0.7;
130
+ width: 120px;
131
+ font-size: var(--fontsize-small);
132
+ }
133
+ [timeline] [info] strong {
134
+ float: right;
135
+ }
136
+ [timeline] [status] {
137
+ margin: 0 var(--margin-narrow);
138
+ display: block;
139
+ border-radius: 50%;
140
+ width: 12px;
141
+ height: 12px;
142
+ position: relative;
143
+ top: 3px;
144
+ border: 2px solid #fff;
145
+ background-color: var(--worklist-status-color, tomato);
146
+ }
147
+ [timeline] [status]::before {
148
+ content: '';
149
+ height: 60px;
150
+ width: 2px;
151
+ display: block;
152
+ position: relative;
153
+ margin-left: 5px;
154
+ background-color: var(--worklist-status-color, tomato);
155
+ opacity: 0.2;
156
+ }
157
+ [timeline] [info] mwc-icon {
158
+ position: relative;
159
+ top: 3px;
160
+ font-size: var(--fontsize-large);
161
+ }
162
+ [timeline] [info] p {
163
+ background-color: #f4f4f4;
164
+ margin: var(--margin-narrow) 0 var(--margin-default) 0;
165
+ padding: var(--padding-narrow) var(--padding-default);
166
+ border-radius: var(--border-radius);
167
+ font-size: var(--fontsize-small);
168
+ text-align: justify;
169
+ }
170
+ [timeline] [info] p::before {
171
+ content: '';
172
+ float: right;
173
+ margin-top: -10px;
174
+ margin-right: 20px;
175
+ border: 7px solid transparent;
176
+ border-bottom-color: #f4f4f4;
177
+ border-top: 0;
178
+ }
179
+ [thread] div {
180
+ border-bottom: var(--border-dark-color);
181
+ padding: var(--padding-narrow);
182
+ text-align: right;
183
+ overflow: hidden;
184
+ }
185
+ [thread] div label {
186
+ float: left;
187
+ width: 25%;
188
+ text-align: left;
189
+ }
190
+ `
191
+ ]
192
+
193
+ @property({
194
+ type: String,
195
+ attribute: 'activity-thread-id'
196
+ })
197
+ activityThreadId?: string
198
+
199
+ @state() activityThread?: ActivityThread
200
+
201
+ render() {
202
+ if (!this.activityThread) {
203
+ return html`<div>no activity thread info.</div>`
204
+ }
205
+
206
+ const {
207
+ state,
208
+ assignee,
209
+ output,
210
+ round,
211
+ activityApprovals = [],
212
+ assignedAt,
213
+ startedAt,
214
+ terminatedAt,
215
+ activityInstance
216
+ } = this.activityThread
217
+ const { input, approvalLine } = activityInstance!
218
+ const { name, email } = assignee || {}
219
+ const approvals = activityApprovals.sort((a, b) =>
220
+ a.round < b.round ? 1 : a.round > b.round ? -1 : a.order! < b.order! ? 1 : -1
221
+ )
222
+ const current = approvals[0]?.round == round ? approvals[0].order : -1
223
+
224
+ return html`
225
+ <div assignee>
226
+ <mwc-icon>account_circle</mwc-icon>
227
+ <strong>${name}</strong>
228
+ </div>
229
+
230
+ <div thread>
231
+ <span subtitle>${i18next.t('label.information')}</span>
232
+ <div>
233
+ <label>${i18next.t('label.status')}</label>
234
+ <span status></span>
235
+ <strong>${i18next.t('label.activity-state-' + state)}</strong>
236
+ </div>
237
+ <div>
238
+ <label>${i18next.t('field.assigned-at')}</label> ${assignedAt && formatter.format(new Date(assignedAt))}
239
+ </div>
240
+ <div><label>${i18next.t('field.started-at')}</label> ${startedAt && formatter.format(new Date(startedAt))}</div>
241
+ <div>
242
+ <label>${i18next.t('field.terminated-at')}</label> ${terminatedAt && formatter.format(new Date(terminatedAt))}
243
+ </div>
244
+ <div><label>${i18next.t('field.round')}</label> ${round}</div>
245
+ </div>
246
+
247
+ <div>
248
+ <span subtitle>${i18next.t('field.artifact')}</span>
249
+ ${this.renderInOut({ ...input, ...output })}
250
+ </div>
251
+ <div timeline>
252
+ <span subtitle>${i18next.t('label.review-and-approval')}</span>
253
+
254
+ <div>
255
+ ${approvalLine
256
+ ? html`<approval-line-view .model=${approvalLine} .current=${current}></approval-line-view>`
257
+ : html``}
258
+ </div>
259
+
260
+ <ol>
261
+ ${approvals.map(approval => this.renderActivityApproval(approval))}
262
+ </ol>
263
+ </div>
264
+ `
265
+ }
266
+
267
+ renderActivityApproval(activityApproval: ActivityApproval) {
268
+ const { judgment, approver, comment, round, order, createdAt, terminatedAt } = activityApproval
269
+ const { name, email } = approver || {}
270
+
271
+ return html`
272
+ <li>
273
+ <span date>${formatter.format(new Date(terminatedAt || createdAt!))}</span>
274
+ <span status></span>
275
+ <span info>
276
+ ${i18next.t('label.activity-state-' + (judgment || 'started'))}
277
+ <strong><mwc-icon>account_circle</mwc-icon>${name}</strong>
278
+ <p>${comment}</p>
279
+ </span>
280
+ </li>
281
+ `
282
+ }
283
+
284
+ renderInOut(data) {
285
+ const { activity } = this.activityThread!.activityInstance!
286
+ const { model } = activity || {}
287
+
288
+ return html`
289
+ <table>
290
+ <tr>
291
+ <th>${i18next.t('label.name')}</th>
292
+ <th>${i18next.t('label.value')}</th>
293
+ </tr>
294
+ ${model?.map(
295
+ item => html`
296
+ <tr>
297
+ <td>${item.name}</td>
298
+ <td>${item.tag ? data[item.tag] : ''}</td>
299
+ </tr>
300
+ `
301
+ )}
302
+ </table>
303
+ `
304
+ }
305
+
306
+ updated(changes) {
307
+ if (changes.has('activityThreadId')) {
308
+ this.fetchActivityThread()
309
+ }
310
+ }
311
+
312
+ async fetchActivityThread() {
313
+ const id = this.activityThreadId
314
+
315
+ const response = await client.query({
316
+ query: gql`
317
+ query ($id: String!) {
318
+ activityThread(id: $id) {
319
+ state
320
+ transaction
321
+ output
322
+ assignee {
323
+ id
324
+ name
325
+ email
326
+ }
327
+ round
328
+ activityApprovals {
329
+ round
330
+ order
331
+ approver {
332
+ name
333
+ email
334
+ }
335
+ judgment
336
+ comment
337
+ createdAt
338
+ terminatedAt
339
+ }
340
+ assignedAt
341
+ startedAt
342
+ terminatedAt
343
+ updater {
344
+ id
345
+ name
346
+ }
347
+ activityInstance {
348
+ id
349
+ name
350
+ description
351
+ state
352
+ key01
353
+ key02
354
+ key03
355
+ key04
356
+ key05
357
+ input
358
+ output
359
+ activity {
360
+ id
361
+ name
362
+ description
363
+ searchKeys {
364
+ name
365
+ description
366
+ inputKey
367
+ tKey
368
+ }
369
+ model {
370
+ name
371
+ description
372
+ active
373
+ tag
374
+ inout
375
+ type
376
+ unit
377
+ options
378
+ quantifier
379
+ spec
380
+ }
381
+ }
382
+ approvalLine {
383
+ type
384
+ value
385
+ approver {
386
+ id
387
+ name
388
+ description
389
+ controlNo
390
+ }
391
+ }
392
+ assignedAt
393
+ startedAt
394
+ terminatedAt
395
+ updatedAt
396
+ }
397
+ }
398
+ }
399
+ `,
400
+ variables: {
401
+ id
402
+ }
403
+ })
404
+
405
+ this.activityThread = response.data.activityThread
406
+ this.setAttribute('state', this.activityThread?.state || '')
407
+ }
408
+ }
@@ -80,7 +80,7 @@ export class DoneListCalendarPage extends connect(store)(PageView) {
80
80
  const color = ['black', 'darkgray', 'orange', 'red'][priority || 0]
81
81
  const href =
82
82
  type == 'activity-thread'
83
- ? `activity-thread/${id}?title=${name}`
83
+ ? `activity-thread-view/${id}?title=${name}`
84
84
  : `activity-approval/${id}?title=${name}`
85
85
  const at = new Date(date).toLocaleTimeString([], {
86
86
  hourCycle: 'h23',
@@ -354,6 +354,6 @@ export class DoneListPage extends connect(store)(localize(i18next)(PageView)) {
354
354
  }
355
355
 
356
356
  openActivityThreadViewPage(activityThread) {
357
- navigate(`activity-thread/${activityThread.id}?title=${activityThread.name}`)
357
+ navigate(`activity-thread-view/${activityThread.id}?title=${activityThread.name}`)
358
358
  }
359
359
  }