@things-factory/worklist 10.0.19 → 10.1.1
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/dist-client/activity-cells.d.ts +21 -0
- package/dist-client/activity-cells.js +117 -0
- package/dist-client/activity-cells.js.map +1 -0
- package/dist-client/activity-summary-generator.js +57 -11
- package/dist-client/activity-summary-generator.js.map +1 -1
- package/dist-client/approval-progress.d.ts +18 -0
- package/dist-client/approval-progress.js +31 -0
- package/dist-client/approval-progress.js.map +1 -0
- package/dist-client/bootstrap.js +6 -11
- package/dist-client/bootstrap.js.map +1 -1
- package/dist-client/chip-filters.d.ts +53 -0
- package/dist-client/chip-filters.js +60 -0
- package/dist-client/chip-filters.js.map +1 -0
- package/dist-client/components/activity-approval-ribon.d.ts +19 -0
- package/dist-client/components/activity-approval-ribon.js +50 -126
- package/dist-client/components/activity-approval-ribon.js.map +1 -1
- package/dist-client/components/activity-fields.d.ts +50 -0
- package/dist-client/components/activity-fields.js +393 -0
- package/dist-client/components/activity-fields.js.map +1 -0
- package/dist-client/components/activity-instance-ribon.d.ts +19 -0
- package/dist-client/components/activity-instance-ribon.js +55 -122
- package/dist-client/components/activity-instance-ribon.js.map +1 -1
- package/dist-client/components/activity-thread-ribon.d.ts +25 -0
- package/dist-client/components/activity-thread-ribon.js +64 -121
- package/dist-client/components/activity-thread-ribon.js.map +1 -1
- package/dist-client/components/activity-thread-timeline.d.ts +14 -2
- package/dist-client/components/activity-thread-timeline.js +234 -104
- package/dist-client/components/activity-thread-timeline.js.map +1 -1
- package/dist-client/components/state-ribon.d.ts +40 -0
- package/dist-client/components/state-ribon.js +200 -0
- package/dist-client/components/state-ribon.js.map +1 -0
- package/dist-client/due.d.ts +16 -0
- package/dist-client/due.js +78 -0
- package/dist-client/due.js.map +1 -0
- package/dist-client/pages/activity/activity-list-page.js +4 -6
- package/dist-client/pages/activity/activity-list-page.js.map +1 -1
- package/dist-client/pages/activity-approval/activity-approval-list-page.js +2 -1
- package/dist-client/pages/activity-approval/activity-approval-list-page.js.map +1 -1
- package/dist-client/pages/activity-approval/activity-approval-page.d.ts +52 -5
- package/dist-client/pages/activity-approval/activity-approval-page.js +265 -118
- package/dist-client/pages/activity-approval/activity-approval-page.js.map +1 -1
- package/dist-client/pages/activity-instance/activity-instance-list-page.d.ts +0 -1
- package/dist-client/pages/activity-instance/activity-instance-list-page.js +8 -24
- package/dist-client/pages/activity-instance/activity-instance-list-page.js.map +1 -1
- package/dist-client/pages/activity-instance/activity-instance-start-page.d.ts +1 -0
- package/dist-client/pages/activity-instance/activity-instance-start-page.js +7 -0
- package/dist-client/pages/activity-instance/activity-instance-start-page.js.map +1 -1
- package/dist-client/pages/activity-instance/activity-instance-view.js +1 -1
- package/dist-client/pages/activity-instance/activity-instance-view.js.map +1 -1
- package/dist-client/pages/activity-stats/activity-stats-list-page.js +2 -1
- package/dist-client/pages/activity-stats/activity-stats-list-page.js.map +1 -1
- package/dist-client/pages/activity-thread/activity-thread-page.d.ts +30 -4
- package/dist-client/pages/activity-thread/activity-thread-page.js +142 -66
- 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 +17 -6
- package/dist-client/pages/activity-thread/activity-thread-view-page.js +118 -65
- 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 +24 -7
- package/dist-client/pages/activity-thread/activity-thread-view.js +84 -308
- package/dist-client/pages/activity-thread/activity-thread-view.js.map +1 -1
- package/dist-client/pages/installable-activity/installable-activity-list-page.d.ts +1 -1
- package/dist-client/pages/installable-activity/installable-activity-list-page.js +13 -9
- package/dist-client/pages/installable-activity/installable-activity-list-page.js.map +1 -1
- package/dist-client/pages/todo/approval-done-list-page.d.ts +1 -0
- package/dist-client/pages/todo/approval-done-list-page.js +111 -58
- package/dist-client/pages/todo/approval-done-list-page.js.map +1 -1
- package/dist-client/pages/todo/approval-pending-list-page.d.ts +32 -1
- package/dist-client/pages/todo/approval-pending-list-page.js +485 -130
- package/dist-client/pages/todo/approval-pending-list-page.js.map +1 -1
- package/dist-client/pages/todo/done-list-calendar-page.d.ts +2 -0
- package/dist-client/pages/todo/done-list-calendar-page.js +213 -29
- package/dist-client/pages/todo/done-list-calendar-page.js.map +1 -1
- package/dist-client/pages/todo/done-list-page.d.ts +1 -0
- package/dist-client/pages/todo/done-list-page.js +126 -62
- package/dist-client/pages/todo/done-list-page.js.map +1 -1
- package/dist-client/pages/todo/draft-list-page.d.ts +1 -0
- package/dist-client/pages/todo/draft-list-page.js +82 -34
- package/dist-client/pages/todo/draft-list-page.js.map +1 -1
- package/dist-client/pages/todo/pickable-list-page.js +6 -10
- package/dist-client/pages/todo/pickable-list-page.js.map +1 -1
- package/dist-client/pages/todo/todo-list-page.d.ts +1 -1
- package/dist-client/pages/todo/todo-list-page.js +102 -78
- 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 +0 -6
- package/dist-client/route.js.map +1 -1
- package/dist-client/templates/activity-approval-context-template.js +60 -138
- package/dist-client/templates/activity-approval-context-template.js.map +1 -1
- package/dist-client/templates/activity-instance-context-template.js +13 -172
- package/dist-client/templates/activity-instance-context-template.js.map +1 -1
- package/dist-client/templates/activity-thread-context-template.js +39 -131
- package/dist-client/templates/activity-thread-context-template.js.map +1 -1
- package/dist-client/templates/context-panel.d.ts +26 -0
- package/dist-client/templates/context-panel.js +182 -0
- package/dist-client/templates/context-panel.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/when.d.ts +4 -0
- package/dist-client/when.js +72 -0
- package/dist-client/when.js.map +1 -0
- package/dist-server/controllers/activity-approval/_abort.js +2 -1
- package/dist-server/controllers/activity-approval/_abort.js.map +1 -1
- package/dist-server/controllers/activity-approval/approval-line.d.ts +106 -0
- package/dist-server/controllers/activity-approval/approval-line.js +151 -0
- package/dist-server/controllers/activity-approval/approval-line.js.map +1 -0
- package/dist-server/controllers/activity-approval/approve.js +61 -51
- package/dist-server/controllers/activity-approval/approve.js.map +1 -1
- package/dist-server/controllers/activity-approval/claim.d.ts +42 -0
- package/dist-server/controllers/activity-approval/claim.js +77 -0
- package/dist-server/controllers/activity-approval/claim.js.map +1 -0
- package/dist-server/controllers/activity-approval/create-approval.d.ts +41 -0
- package/dist-server/controllers/activity-approval/create-approval.js +78 -0
- package/dist-server/controllers/activity-approval/create-approval.js.map +1 -0
- package/dist-server/controllers/activity-approval/delegate.d.ts +16 -0
- package/dist-server/controllers/activity-approval/delegate.js +43 -7
- package/dist-server/controllers/activity-approval/delegate.js.map +1 -1
- package/dist-server/controllers/activity-approval/opinion.d.ts +10 -0
- package/dist-server/controllers/activity-approval/opinion.js +43 -0
- package/dist-server/controllers/activity-approval/opinion.js.map +1 -0
- package/dist-server/controllers/activity-approval/reject.js +21 -1
- package/dist-server/controllers/activity-approval/reject.js.map +1 -1
- package/dist-server/controllers/activity-approval/save.js +26 -2
- package/dist-server/controllers/activity-approval/save.js.map +1 -1
- package/dist-server/controllers/activity-installation/activity-installation-controller.d.ts +26 -0
- package/dist-server/controllers/activity-installation/activity-installation-controller.js +45 -0
- package/dist-server/controllers/activity-installation/activity-installation-controller.js.map +1 -1
- package/dist-server/controllers/activity-instance/approval-expectation.d.ts +34 -0
- package/dist-server/controllers/activity-instance/approval-expectation.js +18 -0
- package/dist-server/controllers/activity-instance/approval-expectation.js.map +1 -0
- package/dist-server/controllers/activity-instance/issue.js +32 -0
- package/dist-server/controllers/activity-instance/issue.js.map +1 -1
- package/dist-server/controllers/activity-thread/restart.js +17 -1
- package/dist-server/controllers/activity-thread/restart.js.map +1 -1
- package/dist-server/controllers/activity-thread/submit.js +23 -43
- package/dist-server/controllers/activity-thread/submit.js.map +1 -1
- package/dist-server/controllers/common.js +46 -0
- package/dist-server/controllers/common.js.map +1 -1
- package/dist-server/controllers/index.d.ts +1 -0
- package/dist-server/controllers/index.js +8 -0
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/service/activity/activity-mutation.js +25 -5
- package/dist-server/service/activity/activity-mutation.js.map +1 -1
- package/dist-server/service/activity/activity-type.d.ts +14 -0
- package/dist-server/service/activity/activity-type.js +8 -0
- package/dist-server/service/activity/activity-type.js.map +1 -1
- package/dist-server/service/activity/activity.d.ts +18 -0
- package/dist-server/service/activity/activity.js +5 -0
- package/dist-server/service/activity/activity.js.map +1 -1
- package/dist-server/service/activity-approval/activity-approval-mutation.js +3 -2
- package/dist-server/service/activity-approval/activity-approval-mutation.js.map +1 -1
- package/dist-server/service/activity-approval/activity-approval-query.d.ts +19 -1
- package/dist-server/service/activity-approval/activity-approval-query.js +186 -56
- package/dist-server/service/activity-approval/activity-approval-query.js.map +1 -1
- package/dist-server/service/activity-approval/activity-approval.d.ts +29 -1
- package/dist-server/service/activity-approval/activity-approval.js +19 -0
- package/dist-server/service/activity-approval/activity-approval.js.map +1 -1
- package/dist-server/service/activity-approval/my-pending-approvals.d.ts +21 -0
- package/dist-server/service/activity-approval/my-pending-approvals.js +40 -0
- package/dist-server/service/activity-approval/my-pending-approvals.js.map +1 -0
- package/dist-server/service/activity-instance/activity-instance-type.d.ts +20 -0
- package/dist-server/service/activity-instance/activity-instance-type.js +11 -0
- package/dist-server/service/activity-instance/activity-instance-type.js.map +1 -1
- package/dist-server/service/activity-instance/activity-instance.d.ts +6 -0
- package/dist-server/service/activity-instance/activity-instance.js +5 -0
- package/dist-server/service/activity-instance/activity-instance.js.map +1 -1
- package/dist-server/service/activity-stats/activity-stats-query.d.ts +5 -0
- package/dist-server/service/activity-stats/activity-stats-query.js +149 -11
- package/dist-server/service/activity-stats/activity-stats-query.js.map +1 -1
- package/dist-server/service/activity-stats/activity-stats-type.d.ts +19 -6
- package/dist-server/service/activity-stats/activity-stats-type.js +37 -10
- package/dist-server/service/activity-stats/activity-stats-type.js.map +1 -1
- package/dist-server/service/activity-stats/event-placement.d.ts +55 -0
- package/dist-server/service/activity-stats/event-placement.js +82 -0
- package/dist-server/service/activity-stats/event-placement.js.map +1 -0
- package/dist-server/service/activity-thread/activity-thread-query.js +48 -24
- package/dist-server/service/activity-thread/activity-thread-query.js.map +1 -1
- package/dist-server/service/activity-thread/my-open-threads.d.ts +15 -0
- package/dist-server/service/activity-thread/my-open-threads.js +40 -0
- package/dist-server/service/activity-thread/my-open-threads.js.map +1 -0
- package/dist-server/service/activity-thread/todo-order.d.ts +49 -0
- package/dist-server/service/activity-thread/todo-order.js +70 -0
- package/dist-server/service/activity-thread/todo-order.js.map +1 -0
- package/dist-server/service/installable-activity/installable-activity-mutation.d.ts +6 -0
- package/dist-server/service/installable-activity/installable-activity-mutation.js +7 -24
- package/dist-server/service/installable-activity/installable-activity-mutation.js.map +1 -1
- package/dist-server/service/nulls-last.d.ts +30 -0
- package/dist-server/service/nulls-last.js +37 -0
- package/dist-server/service/nulls-last.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/dataset/activity-instance-search-page.ko.md +5 -0
- package/helps/dataset/activity-instance-search-page.md +13 -0
- package/helps/worklist/activity-approval.ko.md +5 -0
- package/helps/worklist/activity-approval.md +14 -0
- package/helps/worklist/activity-bank-page.ko.md +5 -0
- package/helps/worklist/activity-bank-page.md +13 -0
- package/helps/worklist/activity-reporter-list.ko.md +5 -0
- package/helps/worklist/activity-reporter-list.md +13 -0
- package/helps/worklist/activity-store.ko.md +5 -0
- package/helps/worklist/activity-store.md +13 -0
- package/helps/worklist/activity-template.ko.md +5 -0
- package/helps/worklist/activity-template.md +13 -0
- package/helps/worklist/installable-activity.ko.md +5 -0
- package/helps/worklist/installable-activity.md +13 -0
- package/package.json +13 -12
- package/things-factory.config.js +0 -5
- package/translations/en.json +129 -51
- package/translations/ja.json +130 -52
- package/translations/ko.json +82 -4
- package/translations/ms.json +129 -51
- package/translations/zh.json +132 -54
- package/dist-client/pages/dashboard/dashboard-home.d.ts +0 -1
- package/dist-client/pages/dashboard/dashboard-home.js +0 -22
- package/dist-client/pages/dashboard/dashboard-home.js.map +0 -1
- package/dist-client/pages/worklist-home.d.ts +0 -1
- package/dist-client/pages/worklist-home.js +0 -17
- package/dist-client/pages/worklist-home.js.map +0 -1
|
@@ -2,125 +2,19 @@ import { __decorate, __metadata } from "tslib";
|
|
|
2
2
|
import '@material/web/icon/icon.js';
|
|
3
3
|
import '@things-factory/organization/dist-client/component/approval-line-view.js';
|
|
4
4
|
import '../components/activity-thread-timeline';
|
|
5
|
-
import { html,
|
|
5
|
+
import { html, LitElement, nothing } from 'lit';
|
|
6
6
|
import { customElement, property } from 'lit/decorators.js';
|
|
7
7
|
import { ContextToolbarOverlayStyle } from '@operato/context/ox-context-toolbar-overlay-style.js';
|
|
8
8
|
import { RouteController } from '@operato/shell';
|
|
9
9
|
import { i18next } from '@operato/i18n';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const safeLocale = locale || 'en-US';
|
|
13
|
-
return new Intl.DateTimeFormat(safeLocale, options);
|
|
14
|
-
}
|
|
15
|
-
catch (e) {
|
|
16
|
-
console.warn(`Invalid locale or options provided: ${locale}, falling back to default en-US.`, e);
|
|
17
|
-
return new Intl.DateTimeFormat('en-US', options);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
const formatter = getSafeFormatter(navigator.language, { dateStyle: 'full', timeStyle: 'short' });
|
|
10
|
+
import { currentApprovalOrder } from '../approval-progress.js';
|
|
11
|
+
import { ContextPanelStyles, valueCell, whenCell } from './context-panel.js';
|
|
21
12
|
let ActivityThreadContextTemplate = class ActivityThreadContextTemplate extends LitElement {
|
|
22
13
|
constructor() {
|
|
23
14
|
super(...arguments);
|
|
24
15
|
this._routeCtrl = new RouteController(this);
|
|
25
16
|
}
|
|
26
|
-
static { this.styles = [
|
|
27
|
-
ContextToolbarOverlayStyle,
|
|
28
|
-
css `
|
|
29
|
-
:host {
|
|
30
|
-
background-color: var(--md-sys-color-surface);
|
|
31
|
-
width: 100%;
|
|
32
|
-
min-width: 450px;
|
|
33
|
-
max-height: 100%;
|
|
34
|
-
overflow: auto;
|
|
35
|
-
--context-ui-padding: 0;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
:host([state='unassigned']) {
|
|
39
|
-
--worklist-status-color: #5f7184;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
:host([state='assigned']) {
|
|
43
|
-
--worklist-status-color: #5f7184;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
:host([state='started']) {
|
|
47
|
-
--worklist-status-color: #56af45;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
:host([state='delegated']) {
|
|
51
|
-
--worklist-status-color: #8654b0;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
:host([state='submitted']) {
|
|
55
|
-
--worklist-status-color: #428df3;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
:host([state='escalated']) {
|
|
59
|
-
--worklist-status-color: #595de5;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
:host([state='rejected']) {
|
|
63
|
-
--worklist-status-color: #f27429;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
:host([state='ended']) {
|
|
67
|
-
--worklist-status-color: #02acae;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
:host([state='aborted']) {
|
|
71
|
-
--worklist-status-color: #cb3a33;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
:host:before {
|
|
75
|
-
content: '';
|
|
76
|
-
position: absolute;
|
|
77
|
-
width: 0;
|
|
78
|
-
height: 0;
|
|
79
|
-
border: 22px solid transparent;
|
|
80
|
-
border-left-color: var(--worklist-status-color);
|
|
81
|
-
border-right: 0;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
div[info] {
|
|
85
|
-
padding: var(--spacing-medium);
|
|
86
|
-
border-bottom: var(--border-dim-color);
|
|
87
|
-
color: var(--md-sys-color-secondary);
|
|
88
|
-
|
|
89
|
-
div {
|
|
90
|
-
display: flex;
|
|
91
|
-
align-items: center;
|
|
92
|
-
padding: var(--spacing-small);
|
|
93
|
-
border-radius: var(--border-radius);
|
|
94
|
-
text-align: right;
|
|
95
|
-
clear: both;
|
|
96
|
-
overflow: hidden;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
div:nth-child(odd) {
|
|
100
|
-
background-color: var(--md-sys-color-background);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
label {
|
|
104
|
-
display: inline-block;
|
|
105
|
-
width: 25%;
|
|
106
|
-
text-align: right;
|
|
107
|
-
margin-right: 20px;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
span {
|
|
111
|
-
width: 15px;
|
|
112
|
-
height: 15px;
|
|
113
|
-
background-color: var(--worklist-status-color, tomato);
|
|
114
|
-
display: inline-block;
|
|
115
|
-
border-radius: 50%;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
activity-thread-timeline {
|
|
120
|
-
margin: var(--spacing-medium);
|
|
121
|
-
}
|
|
122
|
-
`
|
|
123
|
-
]; }
|
|
17
|
+
static { this.styles = [ContextToolbarOverlayStyle, ContextPanelStyles]; }
|
|
124
18
|
render() {
|
|
125
19
|
const activityThread = this._routeCtrl.context.activityThread || this.activityThread || {};
|
|
126
20
|
const { state, round, dueAt, assignedAt, terminatedAt, assignee, activityInstance, activityApprovals } = activityThread || {};
|
|
@@ -128,30 +22,44 @@ let ActivityThreadContextTemplate = class ActivityThreadContextTemplate extends
|
|
|
128
22
|
return html `
|
|
129
23
|
<div flow>
|
|
130
24
|
<div approval-line>
|
|
131
|
-
${approvalLine
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
<div><label>${i18next.t('field.description')}</label> ${description}</div>
|
|
138
|
-
<div>
|
|
139
|
-
<label>${i18next.t('field.status')}</label> <span></span> <strong
|
|
140
|
-
>${i18next.t('label.activity-state-' + state)}</strong
|
|
141
|
-
>
|
|
142
|
-
</div>
|
|
143
|
-
<div><label>${i18next.t('field.round')}</label> <strong>${round}</strong></div>
|
|
144
|
-
<div><label>${i18next.t('field.assignee')}</label> <strong>${assignee?.name}</strong></div>
|
|
145
|
-
<div>
|
|
146
|
-
<label>${i18next.t('field.assigned-at')}</label> ${assignedAt && formatter.format(new Date(assignedAt))}
|
|
147
|
-
</div>
|
|
148
|
-
<div><label>${i18next.t('field.due-at')}</label> ${dueAt && formatter.format(new Date(dueAt))}</div>
|
|
149
|
-
<div>
|
|
150
|
-
<label>${i18next.t('field.terminated-at')}</label> ${terminatedAt && formatter.format(new Date(terminatedAt))}
|
|
25
|
+
${approvalLine
|
|
26
|
+
? html `<approval-line-view
|
|
27
|
+
.model=${approvalLine}
|
|
28
|
+
.current=${currentApprovalOrder(activityApprovals)}
|
|
29
|
+
></approval-line-view>`
|
|
30
|
+
: html ``}
|
|
151
31
|
</div>
|
|
152
32
|
</div>
|
|
153
33
|
|
|
154
|
-
<
|
|
34
|
+
<dl class="given">
|
|
35
|
+
<!-- 차수는 1일 때 적지 않는다 — 거의 모든 건이 1차라 그 줄이 아무것도 알려 주지 않는다. -->
|
|
36
|
+
${Number(round) > 1
|
|
37
|
+
? html `
|
|
38
|
+
<dt>${i18next.t('field.round')}</dt>
|
|
39
|
+
<dd class="strong">${round}</dd>
|
|
40
|
+
`
|
|
41
|
+
: nothing}
|
|
42
|
+
|
|
43
|
+
<!-- 화면 본문과 같은 낱말을 쓴다 — 목록의 칸도 「담당자」다. -->
|
|
44
|
+
<dt>${i18next.t('field.wl-owner')}</dt>
|
|
45
|
+
<dd class="strong">${valueCell(assignee?.name)}</dd>
|
|
46
|
+
|
|
47
|
+
<dt>${i18next.t('field.assigned-at')}</dt>
|
|
48
|
+
<dd>${whenCell(assignedAt)}</dd>
|
|
49
|
+
|
|
50
|
+
<dt>${i18next.t('field.due-at')}</dt>
|
|
51
|
+
<dd>${whenCell(dueAt)}</dd>
|
|
52
|
+
|
|
53
|
+
<dt>${i18next.t('field.terminated-at')}</dt>
|
|
54
|
+
<dd>${whenCell(terminatedAt)}</dd>
|
|
55
|
+
</dl>
|
|
56
|
+
|
|
57
|
+
<!--
|
|
58
|
+
팝업 안에서는 편다. 팝업은 내용에 맞춰지지 않고 60%×60% 로 고정되므로
|
|
59
|
+
(@operato/popup 의 [hovering=center]), 접어 두면 아래가 흰 여백으로 남는다.
|
|
60
|
+
그리고 여기서 이력은 보조가 아니다 — 이 판을 여는 이유의 절반이 「어떻게 여기까지 왔나」다.
|
|
61
|
+
-->
|
|
62
|
+
<activity-thread-timeline .activityThread=${activityThread} open short-form></activity-thread-timeline>
|
|
155
63
|
`;
|
|
156
64
|
}
|
|
157
65
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-thread-context-template.js","sourceRoot":"","sources":["../../client/templates/activity-thread-context-template.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,0EAA0E,CAAA;AACjF,OAAO,wCAAwC,CAAA;AAE/C,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"activity-thread-context-template.js","sourceRoot":"","sources":["../../client/templates/activity-thread-context-template.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,0EAA0E,CAAA;AACjF,OAAO,wCAAwC,CAAA;AAE/C,OAAO,EAAE,IAAI,EAAO,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sDAAsD,CAAA;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE9D,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAG5E,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,UAAU;IAAtD;;QAKU,eAAU,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;IAqDhD,CAAC;aAzDQ,WAAM,GAAG,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,AAAnD,CAAmD;IAMhE,MAAM;QACJ,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,IAAI,EAAE,CAAA;QAE1F,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,GACpG,cAAc,IAAI,EAAE,CAAA;QACtB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,gBAAgB,IAAI,EAAE,CAAA;QAElE,OAAO,IAAI,CAAA;;;YAGH,YAAY;YACZ,CAAC,CAAC,IAAI,CAAA;yBACO,YAAY;2BACV,oBAAoB,CAAC,iBAAiB,CAAC;qCAC7B;YACzB,CAAC,CAAC,IAAI,CAAA,EAAE;;;;;;UAMV,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;YACjB,CAAC,CAAC,IAAI,CAAA;oBACI,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;mCACT,KAAK;aAC3B;YACH,CAAC,CAAC,OAAO;;;cAGL,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;6BACZ,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;;cAExC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;cAC9B,QAAQ,CAAC,UAAU,CAAC;;cAEpB,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;cACzB,QAAQ,CAAC,KAAK,CAAC;;cAEf,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;cAChC,QAAQ,CAAC,YAAY,CAAC;;;;;;;;kDAQc,cAAc;KAC3D,CAAA;IACH,CAAC;;AArDmC;IAAnC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qEAAuB;AAH9C,6BAA6B;IADlC,aAAa,CAAC,kCAAkC,CAAC;GAC5C,6BAA6B,CA0DlC","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@things-factory/organization/dist-client/component/approval-line-view.js'\nimport '../components/activity-thread-timeline'\n\nimport { html, css, LitElement, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { ContextToolbarOverlayStyle } from '@operato/context/ox-context-toolbar-overlay-style.js'\nimport { RouteController } from '@operato/shell'\nimport { i18next } from '@operato/i18n'\n\nimport { currentApprovalOrder } from '../approval-progress.js'\n\nimport { ContextPanelStyles, valueCell, whenCell } from './context-panel.js'\n\n@customElement('activity-thread-context-template')\nclass ActivityThreadContextTemplate extends LitElement {\n static styles = [ContextToolbarOverlayStyle, ContextPanelStyles]\n\n @property({ type: Object }) private activityThread\n\n private _routeCtrl = new RouteController(this)\n\n render() {\n const activityThread = this._routeCtrl.context.activityThread || this.activityThread || {}\n\n const { state, round, dueAt, assignedAt, terminatedAt, assignee, activityInstance, activityApprovals } =\n activityThread || {}\n const { name, description, approvalLine } = activityInstance || {}\n\n return html`\n <div flow>\n <div approval-line>\n ${approvalLine\n ? html`<approval-line-view\n .model=${approvalLine}\n .current=${currentApprovalOrder(activityApprovals)}\n ></approval-line-view>`\n : html``}\n </div>\n </div>\n\n <dl class=\"given\">\n <!-- 차수는 1일 때 적지 않는다 — 거의 모든 건이 1차라 그 줄이 아무것도 알려 주지 않는다. -->\n ${Number(round) > 1\n ? html`\n <dt>${i18next.t('field.round')}</dt>\n <dd class=\"strong\">${round}</dd>\n `\n : nothing}\n\n <!-- 화면 본문과 같은 낱말을 쓴다 — 목록의 칸도 「담당자」다. -->\n <dt>${i18next.t('field.wl-owner')}</dt>\n <dd class=\"strong\">${valueCell(assignee?.name)}</dd>\n\n <dt>${i18next.t('field.assigned-at')}</dt>\n <dd>${whenCell(assignedAt)}</dd>\n\n <dt>${i18next.t('field.due-at')}</dt>\n <dd>${whenCell(dueAt)}</dd>\n\n <dt>${i18next.t('field.terminated-at')}</dt>\n <dd>${whenCell(terminatedAt)}</dd>\n </dl>\n\n <!--\n 팝업 안에서는 편다. 팝업은 내용에 맞춰지지 않고 60%×60% 로 고정되므로\n (@operato/popup 의 [hovering=center]), 접어 두면 아래가 흰 여백으로 남는다.\n 그리고 여기서 이력은 보조가 아니다 — 이 판을 여는 이유의 절반이 「어떻게 여기까지 왔나」다.\n -->\n <activity-thread-timeline .activityThread=${activityThread} open short-form></activity-thread-timeline>\n `\n }\n\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 문서 아이콘이 여는 곁 패널 — **세 템플릿이 한 모양을 쓴다.**
|
|
3
|
+
*
|
|
4
|
+
* activity-thread · activity-approval · activity-instance 의 context template 셋이 같은 것을 보인다
|
|
5
|
+
* (결재선 · 이름 · 설명 · 상태 · 차수 · 담당자 · 시각 셋). 그런데 셋이 각자 스타일을 갖고 있었고,
|
|
6
|
+
* 상태색 여덟 개와 자체 시각 formatter 가 세 벌로 복사되어 있었다.
|
|
7
|
+
*
|
|
8
|
+
* ── 무엇을 고쳤나 (2026-09-06) ─────────────────────────────────────────────
|
|
9
|
+
* 1. 시각이 Monday, August 31, 2026 at 11:09 PM 이었다. 세 템플릿이 각자
|
|
10
|
+
* Intl.DateTimeFormat(navigator.language, dateStyle full) 을 들고 있었다. 이 패널을 여는 화면은
|
|
11
|
+
* 바로 뒤에서 2026. 8. 31. 오후 11:09 로 적고 있다 — 같은 값이 두 뼘 사이에서 두 말로 나왔다.
|
|
12
|
+
* 2. 왼쪽에 상태색 삼각형이 붙어 있었다. 하드코딩된 hex 여덟 개 중 하나를 골라 칠하는 장식인데,
|
|
13
|
+
* 상태는 이미 패널 안에 점과 글자로 적혀 있다. 같은 것을 두 번 말하면서 앱 팔레트를 따르지도
|
|
14
|
+
* 않았다.
|
|
15
|
+
* 3. 줄마다 배경색이 번갈아 깔렸다(nth-child odd). 여덟 줄짜리 표에 얼룩이 지고, 라벨 폭이 25% 로
|
|
16
|
+
* 고정이라 좁은 화면에서는 값이 밀렸다.
|
|
17
|
+
* 4. 값이 없으면 빈 칸이었다. 만기 시간과 완료 시간이 비어 있었는데, 값이 없는 것인지 화면이 못 낸
|
|
18
|
+
* 것인지 구별되지 않는다.
|
|
19
|
+
*/
|
|
20
|
+
export declare const ContextPanelStyles: import("lit").CSSResult[];
|
|
21
|
+
/** 상태 한 칸 — 점과 이름. 색만으로 뜻을 전하지 않는다. */
|
|
22
|
+
export declare function stateCell(state?: string): import("lit-html").TemplateResult<1>;
|
|
23
|
+
/** 시각 한 칸 — 화면 본문과 같은 표기(when.ts). 없으면 없다고 말한다. */
|
|
24
|
+
export declare function whenCell(at?: string | number | Date): unknown;
|
|
25
|
+
/** 값 한 칸 — 없으면 빈 칸으로 두지 않는다. */
|
|
26
|
+
export declare function valueCell(value?: any): unknown;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { css, html } from 'lit';
|
|
2
|
+
import { ScrollbarStyles } from '@operato/styles';
|
|
3
|
+
import { i18next } from '@operato/i18n';
|
|
4
|
+
import { whenText } from '../when.js';
|
|
5
|
+
import { fieldValue } from '../components/activity-fields.js';
|
|
6
|
+
/**
|
|
7
|
+
* 문서 아이콘이 여는 곁 패널 — **세 템플릿이 한 모양을 쓴다.**
|
|
8
|
+
*
|
|
9
|
+
* activity-thread · activity-approval · activity-instance 의 context template 셋이 같은 것을 보인다
|
|
10
|
+
* (결재선 · 이름 · 설명 · 상태 · 차수 · 담당자 · 시각 셋). 그런데 셋이 각자 스타일을 갖고 있었고,
|
|
11
|
+
* 상태색 여덟 개와 자체 시각 formatter 가 세 벌로 복사되어 있었다.
|
|
12
|
+
*
|
|
13
|
+
* ── 무엇을 고쳤나 (2026-09-06) ─────────────────────────────────────────────
|
|
14
|
+
* 1. 시각이 Monday, August 31, 2026 at 11:09 PM 이었다. 세 템플릿이 각자
|
|
15
|
+
* Intl.DateTimeFormat(navigator.language, dateStyle full) 을 들고 있었다. 이 패널을 여는 화면은
|
|
16
|
+
* 바로 뒤에서 2026. 8. 31. 오후 11:09 로 적고 있다 — 같은 값이 두 뼘 사이에서 두 말로 나왔다.
|
|
17
|
+
* 2. 왼쪽에 상태색 삼각형이 붙어 있었다. 하드코딩된 hex 여덟 개 중 하나를 골라 칠하는 장식인데,
|
|
18
|
+
* 상태는 이미 패널 안에 점과 글자로 적혀 있다. 같은 것을 두 번 말하면서 앱 팔레트를 따르지도
|
|
19
|
+
* 않았다.
|
|
20
|
+
* 3. 줄마다 배경색이 번갈아 깔렸다(nth-child odd). 여덟 줄짜리 표에 얼룩이 지고, 라벨 폭이 25% 로
|
|
21
|
+
* 고정이라 좁은 화면에서는 값이 밀렸다.
|
|
22
|
+
* 4. 값이 없으면 빈 칸이었다. 만기 시간과 완료 시간이 비어 있었는데, 값이 없는 것인지 화면이 못 낸
|
|
23
|
+
* 것인지 구별되지 않는다.
|
|
24
|
+
*/
|
|
25
|
+
/*
|
|
26
|
+
* 스크롤바는 제품 표준을 따른다(@operato/styles 의 ScrollbarStyles — 5px · 투명 트랙).
|
|
27
|
+
* 이 판은 반드시 스크롤한다(팝업이 고정 높이라 내용이 길면 안에서 넘긴다). 그런데 스타일을 안
|
|
28
|
+
* 넣어 두어 좁은 화면에서 브라우저 기본 스크롤바가 그대로 나왔다 — 이 앱의 다른 스크롤 영역과
|
|
29
|
+
* 굵기가 달랐다.
|
|
30
|
+
*/
|
|
31
|
+
export const ContextPanelStyles = [
|
|
32
|
+
ScrollbarStyles,
|
|
33
|
+
css `
|
|
34
|
+
/*
|
|
35
|
+
* ── 크기는 팝업이 정한다 ──────────────────────────────────────────────
|
|
36
|
+
* openPopup 이 만드는 상자 안에 들어간다. 그 상자가 폭과 높이를 정하고
|
|
37
|
+
* ([hovering=center] 의 60%×60%), 슬롯에 들어온 것을 width/height 100% 로 늘린다.
|
|
38
|
+
*
|
|
39
|
+
* 여기서 min-width / max-width / max-height 를 또 정했다가 **판이 상자보다 작아졌다** —
|
|
40
|
+
* 실측: 상자 598px · 판 560px, 오른쪽 38px 이 빈 채로 남았다. 상자를 그대로 채운다.
|
|
41
|
+
*
|
|
42
|
+
* 면·테두리·모서리·그림자도 팝업의 것을 쓴다 — 여기서 또 그리면 상자가 두 겹이 된다.
|
|
43
|
+
*/
|
|
44
|
+
:host {
|
|
45
|
+
display: block;
|
|
46
|
+
box-sizing: border-box;
|
|
47
|
+
width: 100%;
|
|
48
|
+
height: 100%;
|
|
49
|
+
overflow: auto;
|
|
50
|
+
|
|
51
|
+
background: var(--ui-panel, #ffffff);
|
|
52
|
+
color: var(--ui-ink, #17242c);
|
|
53
|
+
font-size: var(--ui-t-body, 13px);
|
|
54
|
+
--context-ui-padding: 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/*
|
|
58
|
+
* 결재선 — 판의 머리. 아래로 한 줄 그어 정보와 나눈다.
|
|
59
|
+
*
|
|
60
|
+
* 회색으로 채우지 않는다(SurfaceStyles 가 정한 규칙). 전에는 결재선 컴포넌트가 자기 회색 면을
|
|
61
|
+
* 칠해서 흰 판 위에 띠 하나가 얹혀 있었다.
|
|
62
|
+
*/
|
|
63
|
+
div[flow] {
|
|
64
|
+
padding: var(--spacing-medium, 8px) var(--spacing-medium, 8px) 0;
|
|
65
|
+
border-bottom: 1px solid var(--ui-line, #d5dce0);
|
|
66
|
+
/*
|
|
67
|
+
* 결재선이 판보다 넓을 수 있다 — 4단계짜리(나 · 품질팀장 · 공장장 · 생산팀장)가 좁은 화면의
|
|
68
|
+
* 팝업에서 오른쪽으로 잘렸다. 줄바꿈은 안 된다(단계 사이 이음선이 절대 위치라 줄이 바뀌면
|
|
69
|
+
* 허공에 그려진다). 그래서 이 띠 안에서만 가로로 넘긴다 — 판의 나머지는 그대로다.
|
|
70
|
+
*/
|
|
71
|
+
overflow-x: auto;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/*
|
|
75
|
+
* 이름과 값 — **본문 화면과 같은 구조다**(activity-fields 의 dl.given).
|
|
76
|
+
*
|
|
77
|
+
* ── 가운데로 밀었다가 되돌렸다 (2026-09-06) ──────────────────────────
|
|
78
|
+
* 값이 짧아 오른쪽이 비는 것을 결함으로 보고 묶음을 가운데 정렬했다. 그것이 틀렸다.
|
|
79
|
+
*
|
|
80
|
+
* 왼쪽 기준선이 사라진다 라벨을 세로로 훑어 읽는 목록인데, 항목 수와 글자 길이에 따라
|
|
81
|
+
* 블록이 좌우로 움직인다
|
|
82
|
+
* 판 안에 축이 둘이 된다 아래 타임라인은 왼쪽 정박이라 두 기준선이 어긋난다
|
|
83
|
+
* 화면과 달라진다 상세 · 완료 조회의 같은 구조는 왼쪽 정박이다
|
|
84
|
+
*
|
|
85
|
+
* label/value 목록은 값이 짧으면 오른쪽이 남는다. 그것이 정상이다.
|
|
86
|
+
*/
|
|
87
|
+
dl.given {
|
|
88
|
+
display: grid;
|
|
89
|
+
grid-template-columns: minmax(80px, max-content) 1fr;
|
|
90
|
+
gap: 8px var(--spacing-large, 16px);
|
|
91
|
+
margin: 0;
|
|
92
|
+
padding: var(--spacing-large, 16px);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
dl.given dt {
|
|
96
|
+
text-align: right;
|
|
97
|
+
color: var(--ui-muted, #57676f);
|
|
98
|
+
word-break: keep-all;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
dl.given dd {
|
|
102
|
+
margin: 0;
|
|
103
|
+
color: var(--ui-ink, #17242c);
|
|
104
|
+
word-break: break-word;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
dl.given dd.strong {
|
|
108
|
+
font-weight: 600;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
dl.given .none {
|
|
112
|
+
color: var(--ui-faint, #8a959c);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* 상태 — 화면의 머리 띠와 같은 모양이다(state-ribon 의 .state). */
|
|
116
|
+
.state {
|
|
117
|
+
display: inline-flex;
|
|
118
|
+
align-items: center;
|
|
119
|
+
gap: 6px;
|
|
120
|
+
font-weight: 600;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.state .dot {
|
|
124
|
+
width: 8px;
|
|
125
|
+
height: 8px;
|
|
126
|
+
border-radius: 50%;
|
|
127
|
+
background: var(--worklist-state-color, var(--ui-muted, #57676f));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
:host([state='unassigned']),
|
|
131
|
+
:host([state='assigned']),
|
|
132
|
+
:host([state='draft']) {
|
|
133
|
+
--worklist-state-color: var(--ui-muted, #57676f);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
:host([state='started']),
|
|
137
|
+
:host([state='issued']),
|
|
138
|
+
:host([state='posted']) {
|
|
139
|
+
--worklist-state-color: var(--ui-accent, #00727e);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
:host([state='submitted']),
|
|
143
|
+
:host([state='escalated']),
|
|
144
|
+
:host([state='delegated']),
|
|
145
|
+
:host([state='pending']) {
|
|
146
|
+
--worklist-state-color: var(--ui-info, #2b72ad);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
:host([state='rejected']) {
|
|
150
|
+
--worklist-state-color: var(--ui-warn, #9f5e02);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
:host([state='ended']),
|
|
154
|
+
:host([state='approved']) {
|
|
155
|
+
--worklist-state-color: var(--ui-good, #297d39);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
:host([state='aborted']),
|
|
159
|
+
:host([state='deprecated']) {
|
|
160
|
+
--worklist-state-color: var(--ui-crit, #d14946);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
activity-thread-timeline {
|
|
164
|
+
margin: 0 var(--spacing-large, 16px) var(--spacing-large, 16px);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
`
|
|
169
|
+
];
|
|
170
|
+
/** 상태 한 칸 — 점과 이름. 색만으로 뜻을 전하지 않는다. */
|
|
171
|
+
export function stateCell(state) {
|
|
172
|
+
return html `<span class="state"><i class="dot"></i>${i18next.t('label.activity-state-' + state)}</span>`;
|
|
173
|
+
}
|
|
174
|
+
/** 시각 한 칸 — 화면 본문과 같은 표기(when.ts). 없으면 없다고 말한다. */
|
|
175
|
+
export function whenCell(at) {
|
|
176
|
+
return fieldValue(whenText(at));
|
|
177
|
+
}
|
|
178
|
+
/** 값 한 칸 — 없으면 빈 칸으로 두지 않는다. */
|
|
179
|
+
export function valueCell(value) {
|
|
180
|
+
return fieldValue(value);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=context-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-panel.js","sourceRoot":"","sources":["../../client/templates/context-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAE7D;;;;;;;;;;;;;;;;;;GAkBG;AACH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe;IACf,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuIJ;CACA,CAAA;AAED,uCAAuC;AACvC,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,IAAI,CAAA,0CAA0C,OAAO,CAAC,CAAC,CAAC,uBAAuB,GAAG,KAAK,CAAC,SAAS,CAAA;AAC1G,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,QAAQ,CAAC,EAA2B;IAClD,OAAO,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;AACjC,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,SAAS,CAAC,KAAW;IACnC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC","sourcesContent":["import { css, html } from 'lit'\n\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport { i18next } from '@operato/i18n'\n\nimport { whenText } from '../when.js'\nimport { fieldValue } from '../components/activity-fields.js'\n\n/**\n * 문서 아이콘이 여는 곁 패널 — **세 템플릿이 한 모양을 쓴다.**\n *\n * activity-thread · activity-approval · activity-instance 의 context template 셋이 같은 것을 보인다\n * (결재선 · 이름 · 설명 · 상태 · 차수 · 담당자 · 시각 셋). 그런데 셋이 각자 스타일을 갖고 있었고,\n * 상태색 여덟 개와 자체 시각 formatter 가 세 벌로 복사되어 있었다.\n *\n * ── 무엇을 고쳤나 (2026-09-06) ─────────────────────────────────────────────\n * 1. 시각이 Monday, August 31, 2026 at 11:09 PM 이었다. 세 템플릿이 각자\n * Intl.DateTimeFormat(navigator.language, dateStyle full) 을 들고 있었다. 이 패널을 여는 화면은\n * 바로 뒤에서 2026. 8. 31. 오후 11:09 로 적고 있다 — 같은 값이 두 뼘 사이에서 두 말로 나왔다.\n * 2. 왼쪽에 상태색 삼각형이 붙어 있었다. 하드코딩된 hex 여덟 개 중 하나를 골라 칠하는 장식인데,\n * 상태는 이미 패널 안에 점과 글자로 적혀 있다. 같은 것을 두 번 말하면서 앱 팔레트를 따르지도\n * 않았다.\n * 3. 줄마다 배경색이 번갈아 깔렸다(nth-child odd). 여덟 줄짜리 표에 얼룩이 지고, 라벨 폭이 25% 로\n * 고정이라 좁은 화면에서는 값이 밀렸다.\n * 4. 값이 없으면 빈 칸이었다. 만기 시간과 완료 시간이 비어 있었는데, 값이 없는 것인지 화면이 못 낸\n * 것인지 구별되지 않는다.\n */\n/*\n * 스크롤바는 제품 표준을 따른다(@operato/styles 의 ScrollbarStyles — 5px · 투명 트랙).\n * 이 판은 반드시 스크롤한다(팝업이 고정 높이라 내용이 길면 안에서 넘긴다). 그런데 스타일을 안\n * 넣어 두어 좁은 화면에서 브라우저 기본 스크롤바가 그대로 나왔다 — 이 앱의 다른 스크롤 영역과\n * 굵기가 달랐다.\n */\nexport const ContextPanelStyles = [\n ScrollbarStyles,\n css`\n /*\n * ── 크기는 팝업이 정한다 ──────────────────────────────────────────────\n * openPopup 이 만드는 상자 안에 들어간다. 그 상자가 폭과 높이를 정하고\n * ([hovering=center] 의 60%×60%), 슬롯에 들어온 것을 width/height 100% 로 늘린다.\n *\n * 여기서 min-width / max-width / max-height 를 또 정했다가 **판이 상자보다 작아졌다** —\n * 실측: 상자 598px · 판 560px, 오른쪽 38px 이 빈 채로 남았다. 상자를 그대로 채운다.\n *\n * 면·테두리·모서리·그림자도 팝업의 것을 쓴다 — 여기서 또 그리면 상자가 두 겹이 된다.\n */\n :host {\n display: block;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n overflow: auto;\n\n background: var(--ui-panel, #ffffff);\n color: var(--ui-ink, #17242c);\n font-size: var(--ui-t-body, 13px);\n --context-ui-padding: 0;\n }\n\n /*\n * 결재선 — 판의 머리. 아래로 한 줄 그어 정보와 나눈다.\n *\n * 회색으로 채우지 않는다(SurfaceStyles 가 정한 규칙). 전에는 결재선 컴포넌트가 자기 회색 면을\n * 칠해서 흰 판 위에 띠 하나가 얹혀 있었다.\n */\n div[flow] {\n padding: var(--spacing-medium, 8px) var(--spacing-medium, 8px) 0;\n border-bottom: 1px solid var(--ui-line, #d5dce0);\n /*\n * 결재선이 판보다 넓을 수 있다 — 4단계짜리(나 · 품질팀장 · 공장장 · 생산팀장)가 좁은 화면의\n * 팝업에서 오른쪽으로 잘렸다. 줄바꿈은 안 된다(단계 사이 이음선이 절대 위치라 줄이 바뀌면\n * 허공에 그려진다). 그래서 이 띠 안에서만 가로로 넘긴다 — 판의 나머지는 그대로다.\n */\n overflow-x: auto;\n }\n\n /*\n * 이름과 값 — **본문 화면과 같은 구조다**(activity-fields 의 dl.given).\n *\n * ── 가운데로 밀었다가 되돌렸다 (2026-09-06) ──────────────────────────\n * 값이 짧아 오른쪽이 비는 것을 결함으로 보고 묶음을 가운데 정렬했다. 그것이 틀렸다.\n *\n * 왼쪽 기준선이 사라진다 라벨을 세로로 훑어 읽는 목록인데, 항목 수와 글자 길이에 따라\n * 블록이 좌우로 움직인다\n * 판 안에 축이 둘이 된다 아래 타임라인은 왼쪽 정박이라 두 기준선이 어긋난다\n * 화면과 달라진다 상세 · 완료 조회의 같은 구조는 왼쪽 정박이다\n *\n * label/value 목록은 값이 짧으면 오른쪽이 남는다. 그것이 정상이다.\n */\n dl.given {\n display: grid;\n grid-template-columns: minmax(80px, max-content) 1fr;\n gap: 8px var(--spacing-large, 16px);\n margin: 0;\n padding: var(--spacing-large, 16px);\n }\n\n dl.given dt {\n text-align: right;\n color: var(--ui-muted, #57676f);\n word-break: keep-all;\n }\n\n dl.given dd {\n margin: 0;\n color: var(--ui-ink, #17242c);\n word-break: break-word;\n }\n\n dl.given dd.strong {\n font-weight: 600;\n }\n\n dl.given .none {\n color: var(--ui-faint, #8a959c);\n }\n\n /* 상태 — 화면의 머리 띠와 같은 모양이다(state-ribon 의 .state). */\n .state {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n }\n\n .state .dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--worklist-state-color, var(--ui-muted, #57676f));\n }\n\n :host([state='unassigned']),\n :host([state='assigned']),\n :host([state='draft']) {\n --worklist-state-color: var(--ui-muted, #57676f);\n }\n\n :host([state='started']),\n :host([state='issued']),\n :host([state='posted']) {\n --worklist-state-color: var(--ui-accent, #00727e);\n }\n\n :host([state='submitted']),\n :host([state='escalated']),\n :host([state='delegated']),\n :host([state='pending']) {\n --worklist-state-color: var(--ui-info, #2b72ad);\n }\n\n :host([state='rejected']) {\n --worklist-state-color: var(--ui-warn, #9f5e02);\n }\n\n :host([state='ended']),\n :host([state='approved']) {\n --worklist-state-color: var(--ui-good, #297d39);\n }\n\n :host([state='aborted']),\n :host([state='deprecated']) {\n --worklist-state-color: var(--ui-crit, #d14946);\n }\n\n activity-thread-timeline {\n margin: 0 var(--spacing-large, 16px) var(--spacing-large, 16px);\n }\n\n\n`\n]\n\n/** 상태 한 칸 — 점과 이름. 색만으로 뜻을 전하지 않는다. */\nexport function stateCell(state?: string) {\n return html`<span class=\"state\"><i class=\"dot\"></i>${i18next.t('label.activity-state-' + state)}</span>`\n}\n\n/** 시각 한 칸 — 화면 본문과 같은 표기(when.ts). 없으면 없다고 말한다. */\nexport function whenCell(at?: string | number | Date) {\n return fieldValue(whenText(at))\n}\n\n/** 값 한 칸 — 없으면 빈 칸으로 두지 않는다. */\nexport function valueCell(value?: any) {\n return fieldValue(value)\n}\n"]}
|