@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.
- package/client/pages/activity-approval/activity-approval-page.ts +2 -1
- package/client/pages/activity-instance/activity-instance-search-page.ts +1 -1
- package/client/pages/activity-instance/activity-instance-view.ts +36 -26
- package/client/pages/activity-thread/activity-thread-page.ts +2 -1
- package/client/pages/activity-thread/activity-thread-view-page.ts +18 -41
- package/client/pages/activity-thread/activity-thread-view.ts +408 -0
- package/client/pages/todo/done-list-calendar-page.ts +1 -1
- package/client/pages/todo/done-list-page.ts +1 -1
- package/client/types/activity-instance.ts +4 -0
- package/dist-client/pages/activity-approval/activity-approval-page.js +2 -1
- package/dist-client/pages/activity-approval/activity-approval-page.js.map +1 -1
- package/dist-client/pages/activity-instance/activity-instance-search-page.js +1 -1
- package/dist-client/pages/activity-instance/activity-instance-search-page.js.map +1 -1
- package/dist-client/pages/activity-instance/activity-instance-view.d.ts +1 -1
- package/dist-client/pages/activity-instance/activity-instance-view.js +34 -13
- package/dist-client/pages/activity-instance/activity-instance-view.js.map +1 -1
- package/dist-client/pages/activity-thread/activity-thread-page.js +2 -1
- package/dist-client/pages/activity-thread/activity-thread-page.js.map +1 -1
- package/dist-client/pages/activity-thread/activity-thread-view-page.d.ts +5 -5
- package/dist-client/pages/activity-thread/activity-thread-view-page.js +17 -38
- package/dist-client/pages/activity-thread/activity-thread-view-page.js.map +1 -1
- package/dist-client/pages/activity-thread/activity-thread-view.d.ts +16 -0
- package/dist-client/pages/activity-thread/activity-thread-view.js +387 -0
- package/dist-client/pages/activity-thread/activity-thread-view.js.map +1 -0
- package/dist-client/pages/todo/done-list-calendar-page.js +1 -1
- package/dist-client/pages/todo/done-list-calendar-page.js.map +1 -1
- package/dist-client/pages/todo/done-list-page.js +1 -1
- package/dist-client/pages/todo/done-list-page.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/types/activity-instance.d.ts +2 -0
- package/dist-client/types/activity-instance.js.map +1 -1
- package/dist-server/controllers/activity-instance/issue.js +1 -1
- package/dist-server/controllers/activity-instance/issue.js.map +1 -1
- package/dist-server/service/activity-instance/activity-instance-query.js +20 -0
- package/dist-server/service/activity-instance/activity-instance-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -9
- package/server/controllers/activity-instance/issue.ts +1 -1
- package/server/service/activity-instance/activity-instance-query.ts +10 -0
- package/translations/en.json +1 -1
- package/translations/ja.json +1 -1
- package/translations/ko.json +1 -1
- package/translations/ms.json +1 -1
- 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
|
|
|
@@ -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
|
-
[
|
|
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
|
-
[
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
300
|
+
<span subtitle>${i18next.t('field.artifact')}</span>
|
|
304
301
|
${this.renderInOut(output || {})}
|
|
305
302
|
</div>
|
|
306
303
|
<div timeline>
|
|
307
|
-
<span subtitle
|
|
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
|
-
${
|
|
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
|
-
|
|
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
|
}
|