@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.
Files changed (215) hide show
  1. package/dist-client/activity-cells.d.ts +21 -0
  2. package/dist-client/activity-cells.js +117 -0
  3. package/dist-client/activity-cells.js.map +1 -0
  4. package/dist-client/activity-summary-generator.js +57 -11
  5. package/dist-client/activity-summary-generator.js.map +1 -1
  6. package/dist-client/approval-progress.d.ts +18 -0
  7. package/dist-client/approval-progress.js +31 -0
  8. package/dist-client/approval-progress.js.map +1 -0
  9. package/dist-client/bootstrap.js +6 -11
  10. package/dist-client/bootstrap.js.map +1 -1
  11. package/dist-client/chip-filters.d.ts +53 -0
  12. package/dist-client/chip-filters.js +60 -0
  13. package/dist-client/chip-filters.js.map +1 -0
  14. package/dist-client/components/activity-approval-ribon.d.ts +19 -0
  15. package/dist-client/components/activity-approval-ribon.js +50 -126
  16. package/dist-client/components/activity-approval-ribon.js.map +1 -1
  17. package/dist-client/components/activity-fields.d.ts +50 -0
  18. package/dist-client/components/activity-fields.js +393 -0
  19. package/dist-client/components/activity-fields.js.map +1 -0
  20. package/dist-client/components/activity-instance-ribon.d.ts +19 -0
  21. package/dist-client/components/activity-instance-ribon.js +55 -122
  22. package/dist-client/components/activity-instance-ribon.js.map +1 -1
  23. package/dist-client/components/activity-thread-ribon.d.ts +25 -0
  24. package/dist-client/components/activity-thread-ribon.js +64 -121
  25. package/dist-client/components/activity-thread-ribon.js.map +1 -1
  26. package/dist-client/components/activity-thread-timeline.d.ts +14 -2
  27. package/dist-client/components/activity-thread-timeline.js +234 -104
  28. package/dist-client/components/activity-thread-timeline.js.map +1 -1
  29. package/dist-client/components/state-ribon.d.ts +40 -0
  30. package/dist-client/components/state-ribon.js +200 -0
  31. package/dist-client/components/state-ribon.js.map +1 -0
  32. package/dist-client/due.d.ts +16 -0
  33. package/dist-client/due.js +78 -0
  34. package/dist-client/due.js.map +1 -0
  35. package/dist-client/pages/activity/activity-list-page.js +4 -6
  36. package/dist-client/pages/activity/activity-list-page.js.map +1 -1
  37. package/dist-client/pages/activity-approval/activity-approval-list-page.js +2 -1
  38. package/dist-client/pages/activity-approval/activity-approval-list-page.js.map +1 -1
  39. package/dist-client/pages/activity-approval/activity-approval-page.d.ts +52 -5
  40. package/dist-client/pages/activity-approval/activity-approval-page.js +265 -118
  41. package/dist-client/pages/activity-approval/activity-approval-page.js.map +1 -1
  42. package/dist-client/pages/activity-instance/activity-instance-list-page.d.ts +0 -1
  43. package/dist-client/pages/activity-instance/activity-instance-list-page.js +8 -24
  44. package/dist-client/pages/activity-instance/activity-instance-list-page.js.map +1 -1
  45. package/dist-client/pages/activity-instance/activity-instance-start-page.d.ts +1 -0
  46. package/dist-client/pages/activity-instance/activity-instance-start-page.js +7 -0
  47. package/dist-client/pages/activity-instance/activity-instance-start-page.js.map +1 -1
  48. package/dist-client/pages/activity-instance/activity-instance-view.js +1 -1
  49. package/dist-client/pages/activity-instance/activity-instance-view.js.map +1 -1
  50. package/dist-client/pages/activity-stats/activity-stats-list-page.js +2 -1
  51. package/dist-client/pages/activity-stats/activity-stats-list-page.js.map +1 -1
  52. package/dist-client/pages/activity-thread/activity-thread-page.d.ts +30 -4
  53. package/dist-client/pages/activity-thread/activity-thread-page.js +142 -66
  54. package/dist-client/pages/activity-thread/activity-thread-page.js.map +1 -1
  55. package/dist-client/pages/activity-thread/activity-thread-view-page.d.ts +17 -6
  56. package/dist-client/pages/activity-thread/activity-thread-view-page.js +118 -65
  57. package/dist-client/pages/activity-thread/activity-thread-view-page.js.map +1 -1
  58. package/dist-client/pages/activity-thread/activity-thread-view.d.ts +24 -7
  59. package/dist-client/pages/activity-thread/activity-thread-view.js +84 -308
  60. package/dist-client/pages/activity-thread/activity-thread-view.js.map +1 -1
  61. package/dist-client/pages/installable-activity/installable-activity-list-page.d.ts +1 -1
  62. package/dist-client/pages/installable-activity/installable-activity-list-page.js +13 -9
  63. package/dist-client/pages/installable-activity/installable-activity-list-page.js.map +1 -1
  64. package/dist-client/pages/todo/approval-done-list-page.d.ts +1 -0
  65. package/dist-client/pages/todo/approval-done-list-page.js +111 -58
  66. package/dist-client/pages/todo/approval-done-list-page.js.map +1 -1
  67. package/dist-client/pages/todo/approval-pending-list-page.d.ts +32 -1
  68. package/dist-client/pages/todo/approval-pending-list-page.js +485 -130
  69. package/dist-client/pages/todo/approval-pending-list-page.js.map +1 -1
  70. package/dist-client/pages/todo/done-list-calendar-page.d.ts +2 -0
  71. package/dist-client/pages/todo/done-list-calendar-page.js +213 -29
  72. package/dist-client/pages/todo/done-list-calendar-page.js.map +1 -1
  73. package/dist-client/pages/todo/done-list-page.d.ts +1 -0
  74. package/dist-client/pages/todo/done-list-page.js +126 -62
  75. package/dist-client/pages/todo/done-list-page.js.map +1 -1
  76. package/dist-client/pages/todo/draft-list-page.d.ts +1 -0
  77. package/dist-client/pages/todo/draft-list-page.js +82 -34
  78. package/dist-client/pages/todo/draft-list-page.js.map +1 -1
  79. package/dist-client/pages/todo/pickable-list-page.js +6 -10
  80. package/dist-client/pages/todo/pickable-list-page.js.map +1 -1
  81. package/dist-client/pages/todo/todo-list-page.d.ts +1 -1
  82. package/dist-client/pages/todo/todo-list-page.js +102 -78
  83. package/dist-client/pages/todo/todo-list-page.js.map +1 -1
  84. package/dist-client/route.d.ts +1 -1
  85. package/dist-client/route.js +0 -6
  86. package/dist-client/route.js.map +1 -1
  87. package/dist-client/templates/activity-approval-context-template.js +60 -138
  88. package/dist-client/templates/activity-approval-context-template.js.map +1 -1
  89. package/dist-client/templates/activity-instance-context-template.js +13 -172
  90. package/dist-client/templates/activity-instance-context-template.js.map +1 -1
  91. package/dist-client/templates/activity-thread-context-template.js +39 -131
  92. package/dist-client/templates/activity-thread-context-template.js.map +1 -1
  93. package/dist-client/templates/context-panel.d.ts +26 -0
  94. package/dist-client/templates/context-panel.js +182 -0
  95. package/dist-client/templates/context-panel.js.map +1 -0
  96. package/dist-client/tsconfig.tsbuildinfo +1 -1
  97. package/dist-client/when.d.ts +4 -0
  98. package/dist-client/when.js +72 -0
  99. package/dist-client/when.js.map +1 -0
  100. package/dist-server/controllers/activity-approval/_abort.js +2 -1
  101. package/dist-server/controllers/activity-approval/_abort.js.map +1 -1
  102. package/dist-server/controllers/activity-approval/approval-line.d.ts +106 -0
  103. package/dist-server/controllers/activity-approval/approval-line.js +151 -0
  104. package/dist-server/controllers/activity-approval/approval-line.js.map +1 -0
  105. package/dist-server/controllers/activity-approval/approve.js +61 -51
  106. package/dist-server/controllers/activity-approval/approve.js.map +1 -1
  107. package/dist-server/controllers/activity-approval/claim.d.ts +42 -0
  108. package/dist-server/controllers/activity-approval/claim.js +77 -0
  109. package/dist-server/controllers/activity-approval/claim.js.map +1 -0
  110. package/dist-server/controllers/activity-approval/create-approval.d.ts +41 -0
  111. package/dist-server/controllers/activity-approval/create-approval.js +78 -0
  112. package/dist-server/controllers/activity-approval/create-approval.js.map +1 -0
  113. package/dist-server/controllers/activity-approval/delegate.d.ts +16 -0
  114. package/dist-server/controllers/activity-approval/delegate.js +43 -7
  115. package/dist-server/controllers/activity-approval/delegate.js.map +1 -1
  116. package/dist-server/controllers/activity-approval/opinion.d.ts +10 -0
  117. package/dist-server/controllers/activity-approval/opinion.js +43 -0
  118. package/dist-server/controllers/activity-approval/opinion.js.map +1 -0
  119. package/dist-server/controllers/activity-approval/reject.js +21 -1
  120. package/dist-server/controllers/activity-approval/reject.js.map +1 -1
  121. package/dist-server/controllers/activity-approval/save.js +26 -2
  122. package/dist-server/controllers/activity-approval/save.js.map +1 -1
  123. package/dist-server/controllers/activity-installation/activity-installation-controller.d.ts +26 -0
  124. package/dist-server/controllers/activity-installation/activity-installation-controller.js +45 -0
  125. package/dist-server/controllers/activity-installation/activity-installation-controller.js.map +1 -1
  126. package/dist-server/controllers/activity-instance/approval-expectation.d.ts +34 -0
  127. package/dist-server/controllers/activity-instance/approval-expectation.js +18 -0
  128. package/dist-server/controllers/activity-instance/approval-expectation.js.map +1 -0
  129. package/dist-server/controllers/activity-instance/issue.js +32 -0
  130. package/dist-server/controllers/activity-instance/issue.js.map +1 -1
  131. package/dist-server/controllers/activity-thread/restart.js +17 -1
  132. package/dist-server/controllers/activity-thread/restart.js.map +1 -1
  133. package/dist-server/controllers/activity-thread/submit.js +23 -43
  134. package/dist-server/controllers/activity-thread/submit.js.map +1 -1
  135. package/dist-server/controllers/common.js +46 -0
  136. package/dist-server/controllers/common.js.map +1 -1
  137. package/dist-server/controllers/index.d.ts +1 -0
  138. package/dist-server/controllers/index.js +8 -0
  139. package/dist-server/controllers/index.js.map +1 -1
  140. package/dist-server/service/activity/activity-mutation.js +25 -5
  141. package/dist-server/service/activity/activity-mutation.js.map +1 -1
  142. package/dist-server/service/activity/activity-type.d.ts +14 -0
  143. package/dist-server/service/activity/activity-type.js +8 -0
  144. package/dist-server/service/activity/activity-type.js.map +1 -1
  145. package/dist-server/service/activity/activity.d.ts +18 -0
  146. package/dist-server/service/activity/activity.js +5 -0
  147. package/dist-server/service/activity/activity.js.map +1 -1
  148. package/dist-server/service/activity-approval/activity-approval-mutation.js +3 -2
  149. package/dist-server/service/activity-approval/activity-approval-mutation.js.map +1 -1
  150. package/dist-server/service/activity-approval/activity-approval-query.d.ts +19 -1
  151. package/dist-server/service/activity-approval/activity-approval-query.js +186 -56
  152. package/dist-server/service/activity-approval/activity-approval-query.js.map +1 -1
  153. package/dist-server/service/activity-approval/activity-approval.d.ts +29 -1
  154. package/dist-server/service/activity-approval/activity-approval.js +19 -0
  155. package/dist-server/service/activity-approval/activity-approval.js.map +1 -1
  156. package/dist-server/service/activity-approval/my-pending-approvals.d.ts +21 -0
  157. package/dist-server/service/activity-approval/my-pending-approvals.js +40 -0
  158. package/dist-server/service/activity-approval/my-pending-approvals.js.map +1 -0
  159. package/dist-server/service/activity-instance/activity-instance-type.d.ts +20 -0
  160. package/dist-server/service/activity-instance/activity-instance-type.js +11 -0
  161. package/dist-server/service/activity-instance/activity-instance-type.js.map +1 -1
  162. package/dist-server/service/activity-instance/activity-instance.d.ts +6 -0
  163. package/dist-server/service/activity-instance/activity-instance.js +5 -0
  164. package/dist-server/service/activity-instance/activity-instance.js.map +1 -1
  165. package/dist-server/service/activity-stats/activity-stats-query.d.ts +5 -0
  166. package/dist-server/service/activity-stats/activity-stats-query.js +149 -11
  167. package/dist-server/service/activity-stats/activity-stats-query.js.map +1 -1
  168. package/dist-server/service/activity-stats/activity-stats-type.d.ts +19 -6
  169. package/dist-server/service/activity-stats/activity-stats-type.js +37 -10
  170. package/dist-server/service/activity-stats/activity-stats-type.js.map +1 -1
  171. package/dist-server/service/activity-stats/event-placement.d.ts +55 -0
  172. package/dist-server/service/activity-stats/event-placement.js +82 -0
  173. package/dist-server/service/activity-stats/event-placement.js.map +1 -0
  174. package/dist-server/service/activity-thread/activity-thread-query.js +48 -24
  175. package/dist-server/service/activity-thread/activity-thread-query.js.map +1 -1
  176. package/dist-server/service/activity-thread/my-open-threads.d.ts +15 -0
  177. package/dist-server/service/activity-thread/my-open-threads.js +40 -0
  178. package/dist-server/service/activity-thread/my-open-threads.js.map +1 -0
  179. package/dist-server/service/activity-thread/todo-order.d.ts +49 -0
  180. package/dist-server/service/activity-thread/todo-order.js +70 -0
  181. package/dist-server/service/activity-thread/todo-order.js.map +1 -0
  182. package/dist-server/service/installable-activity/installable-activity-mutation.d.ts +6 -0
  183. package/dist-server/service/installable-activity/installable-activity-mutation.js +7 -24
  184. package/dist-server/service/installable-activity/installable-activity-mutation.js.map +1 -1
  185. package/dist-server/service/nulls-last.d.ts +30 -0
  186. package/dist-server/service/nulls-last.js +37 -0
  187. package/dist-server/service/nulls-last.js.map +1 -0
  188. package/dist-server/tsconfig.tsbuildinfo +1 -1
  189. package/helps/dataset/activity-instance-search-page.ko.md +5 -0
  190. package/helps/dataset/activity-instance-search-page.md +13 -0
  191. package/helps/worklist/activity-approval.ko.md +5 -0
  192. package/helps/worklist/activity-approval.md +14 -0
  193. package/helps/worklist/activity-bank-page.ko.md +5 -0
  194. package/helps/worklist/activity-bank-page.md +13 -0
  195. package/helps/worklist/activity-reporter-list.ko.md +5 -0
  196. package/helps/worklist/activity-reporter-list.md +13 -0
  197. package/helps/worklist/activity-store.ko.md +5 -0
  198. package/helps/worklist/activity-store.md +13 -0
  199. package/helps/worklist/activity-template.ko.md +5 -0
  200. package/helps/worklist/activity-template.md +13 -0
  201. package/helps/worklist/installable-activity.ko.md +5 -0
  202. package/helps/worklist/installable-activity.md +13 -0
  203. package/package.json +13 -12
  204. package/things-factory.config.js +0 -5
  205. package/translations/en.json +129 -51
  206. package/translations/ja.json +130 -52
  207. package/translations/ko.json +82 -4
  208. package/translations/ms.json +129 -51
  209. package/translations/zh.json +132 -54
  210. package/dist-client/pages/dashboard/dashboard-home.d.ts +0 -1
  211. package/dist-client/pages/dashboard/dashboard-home.js +0 -22
  212. package/dist-client/pages/dashboard/dashboard-home.js.map +0 -1
  213. package/dist-client/pages/worklist-home.d.ts +0 -1
  214. package/dist-client/pages/worklist-home.js +0 -17
  215. 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, css, LitElement } from 'lit';
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
- function getSafeFormatter(locale, options) {
11
- try {
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 ? html ` <approval-line-view .model=${approvalLine}></approval-line-view> ` : html ``}
132
- </div>
133
- </div>
134
-
135
- <div info>
136
- <div><label>${i18next.t('field.name')}</label> <strong>${name}</strong></div>
137
- <div><label>${i18next.t('field.description')}</label> ${description}</div>
138
- <div>
139
- <label>${i18next.t('field.status')}</label> <span></span>&nbsp;<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
- <activity-thread-timeline .activityThread=${activityThread} short-form></activity-thread-timeline>
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":"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","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\nfunction getSafeFormatter(locale: string, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n try {\n const safeLocale = locale || 'en-US'\n return new Intl.DateTimeFormat(safeLocale, options)\n } catch (e) {\n console.warn(`Invalid locale or options provided: ${locale}, falling back to default en-US.`, e)\n return new Intl.DateTimeFormat('en-US', options)\n }\n}\n\nconst formatter = getSafeFormatter(navigator.language, { dateStyle: 'full', timeStyle: 'short' })\n@customElement('activity-thread-context-template')\nclass ActivityThreadContextTemplate extends LitElement {\n static styles = [\n ContextToolbarOverlayStyle,\n css`\n :host {\n background-color: var(--md-sys-color-surface);\n width: 100%;\n min-width: 450px;\n max-height: 100%;\n overflow: auto;\n --context-ui-padding: 0;\n }\n\n :host([state='unassigned']) {\n --worklist-status-color: #5f7184;\n }\n\n :host([state='assigned']) {\n --worklist-status-color: #5f7184;\n }\n\n :host([state='started']) {\n --worklist-status-color: #56af45;\n }\n\n :host([state='delegated']) {\n --worklist-status-color: #8654b0;\n }\n\n :host([state='submitted']) {\n --worklist-status-color: #428df3;\n }\n\n :host([state='escalated']) {\n --worklist-status-color: #595de5;\n }\n\n :host([state='rejected']) {\n --worklist-status-color: #f27429;\n }\n\n :host([state='ended']) {\n --worklist-status-color: #02acae;\n }\n\n :host([state='aborted']) {\n --worklist-status-color: #cb3a33;\n }\n\n :host:before {\n content: '';\n position: absolute;\n width: 0;\n height: 0;\n border: 22px solid transparent;\n border-left-color: var(--worklist-status-color);\n border-right: 0;\n }\n\n div[info] {\n padding: var(--spacing-medium);\n border-bottom: var(--border-dim-color);\n color: var(--md-sys-color-secondary);\n\n div {\n display: flex;\n align-items: center;\n padding: var(--spacing-small);\n border-radius: var(--border-radius);\n text-align: right;\n clear: both;\n overflow: hidden;\n }\n\n div:nth-child(odd) {\n background-color: var(--md-sys-color-background);\n }\n\n label {\n display: inline-block;\n width: 25%;\n text-align: right;\n margin-right: 20px;\n }\n\n span {\n width: 15px;\n height: 15px;\n background-color: var(--worklist-status-color, tomato);\n display: inline-block;\n border-radius: 50%;\n }\n }\n\n activity-thread-timeline {\n margin: var(--spacing-medium);\n }\n `\n ]\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 ? html` <approval-line-view .model=${approvalLine}></approval-line-view> ` : html``}\n </div>\n </div>\n\n <div info>\n <div><label>${i18next.t('field.name')}</label> <strong>${name}</strong></div>\n <div><label>${i18next.t('field.description')}</label> ${description}</div>\n <div>\n <label>${i18next.t('field.status')}</label> <span></span>&nbsp;<strong\n >${i18next.t('label.activity-state-' + state)}</strong\n >\n </div>\n <div><label>${i18next.t('field.round')}</label> <strong>${round}</strong></div>\n <div><label>${i18next.t('field.assignee')}</label> <strong>${assignee?.name}</strong></div>\n <div>\n <label>${i18next.t('field.assigned-at')}</label> ${assignedAt && formatter.format(new Date(assignedAt))}\n </div>\n <div><label>${i18next.t('field.due-at')}</label> ${dueAt && formatter.format(new Date(dueAt))}</div>\n <div>\n <label>${i18next.t('field.terminated-at')}</label> ${terminatedAt && formatter.format(new Date(terminatedAt))}\n </div>\n </div>\n\n <activity-thread-timeline .activityThread=${activityThread} short-form></activity-thread-timeline>\n `\n }\n\n}\n"]}
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"]}