@rytass/bpm-core-react 0.3.0 → 0.3.2

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 (184) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/README.md +13 -1
  3. package/dist/chunks/app-navigation-BSkMsEhy.js +268 -0
  4. package/dist/chunks/app-navigation-BSkMsEhy.js.map +1 -0
  5. package/dist/chunks/app-navigation-KnlJCUp1.cjs +2 -0
  6. package/dist/chunks/app-navigation-KnlJCUp1.cjs.map +1 -0
  7. package/dist/chunks/approval-instance-list-page-CVXgE2K3.cjs +2 -0
  8. package/dist/chunks/approval-instance-list-page-CVXgE2K3.cjs.map +1 -0
  9. package/dist/chunks/{approval-instance-list-page-BgE4vQw8.js → approval-instance-list-page-CqNdoZqx.js} +103 -99
  10. package/dist/chunks/approval-instance-list-page-CqNdoZqx.js.map +1 -0
  11. package/dist/chunks/builder-CMlJfQHE.cjs +3 -0
  12. package/dist/chunks/builder-CMlJfQHE.cjs.map +1 -0
  13. package/dist/chunks/{builder-Du_0apkh.js → builder-D950gct_.js} +436 -432
  14. package/dist/chunks/builder-D950gct_.js.map +1 -0
  15. package/dist/chunks/categories-5yEM3p3N.cjs +2 -0
  16. package/dist/chunks/categories-5yEM3p3N.cjs.map +1 -0
  17. package/dist/chunks/categories-BIpOG451.js +387 -0
  18. package/dist/chunks/categories-BIpOG451.js.map +1 -0
  19. package/dist/chunks/dashboard-page-1K_jQXQk.cjs +2 -0
  20. package/dist/chunks/dashboard-page-1K_jQXQk.cjs.map +1 -0
  21. package/dist/chunks/dashboard-page-R_T2OEiE.js +122 -0
  22. package/dist/chunks/dashboard-page-R_T2OEiE.js.map +1 -0
  23. package/dist/chunks/delegations-B2j-wNEO.js +646 -0
  24. package/dist/chunks/delegations-B2j-wNEO.js.map +1 -0
  25. package/dist/chunks/delegations-CsB9ozLu.cjs +2 -0
  26. package/dist/chunks/delegations-CsB9ozLu.cjs.map +1 -0
  27. package/dist/chunks/delegations-CvtwTXNP.cjs +2 -0
  28. package/dist/chunks/delegations-CvtwTXNP.cjs.map +1 -0
  29. package/dist/chunks/delegations-dKodb0WW.js +573 -0
  30. package/dist/chunks/delegations-dKodb0WW.js.map +1 -0
  31. package/dist/chunks/detail-BcGAqJ_R.js +1523 -0
  32. package/dist/chunks/detail-BcGAqJ_R.js.map +1 -0
  33. package/dist/chunks/detail-CqjqLd65.cjs +2 -0
  34. package/dist/chunks/detail-CqjqLd65.cjs.map +1 -0
  35. package/dist/chunks/{format-date-time-hKLVMxq4.cjs → format-date-time-26_pFvv4.cjs} +2 -2
  36. package/dist/chunks/{format-date-time-hKLVMxq4.cjs.map → format-date-time-26_pFvv4.cjs.map} +1 -1
  37. package/dist/chunks/notifications-2swRqDPF.js +198 -0
  38. package/dist/chunks/notifications-2swRqDPF.js.map +1 -0
  39. package/dist/chunks/notifications-BaYDebFt.cjs +2 -0
  40. package/dist/chunks/notifications-BaYDebFt.cjs.map +1 -0
  41. package/dist/chunks/{orgs-c29y74w2.js → orgs-CuHxxd_n.js} +665 -661
  42. package/dist/chunks/orgs-CuHxxd_n.js.map +1 -0
  43. package/dist/chunks/orgs-YMiVLNvL.cjs +2 -0
  44. package/dist/chunks/orgs-YMiVLNvL.cjs.map +1 -0
  45. package/dist/chunks/routes-config-2aKbWq2H.cjs +2 -0
  46. package/dist/chunks/routes-config-2aKbWq2H.cjs.map +1 -0
  47. package/dist/chunks/routes-config-dxahImVe.js +43 -0
  48. package/dist/chunks/routes-config-dxahImVe.js.map +1 -0
  49. package/dist/chunks/templates-DTkbSgFY.cjs +2 -0
  50. package/dist/chunks/templates-DTkbSgFY.cjs.map +1 -0
  51. package/dist/chunks/{templates-Dn9QHFSy.js → templates-DoDWM68t.js} +136 -132
  52. package/dist/chunks/templates-DoDWM68t.js.map +1 -0
  53. package/dist/chunks/users-3ySyUW4u.cjs +2 -0
  54. package/dist/chunks/users-3ySyUW4u.cjs.map +1 -0
  55. package/dist/chunks/users-sMfrSjRQ.js +219 -0
  56. package/dist/chunks/users-sMfrSjRQ.js.map +1 -0
  57. package/dist/components/app-navigation.d.ts +17 -10
  58. package/dist/index.cjs +1 -1
  59. package/dist/index.cjs.map +1 -1
  60. package/dist/index.d.ts +1 -0
  61. package/dist/index.js +101 -99
  62. package/dist/index.js.map +1 -1
  63. package/dist/lib/notification-drawer-provider.d.ts +1 -1
  64. package/dist/lib/notification-unread-provider.d.ts +1 -1
  65. package/dist/lib/providers.d.ts +1 -1
  66. package/dist/lib/routes-config.d.ts +96 -0
  67. package/dist/next/index.cjs +1 -1
  68. package/dist/next/index.cjs.map +1 -1
  69. package/dist/next/index.d.ts +1 -0
  70. package/dist/next/index.js +22 -21
  71. package/dist/next/index.js.map +1 -1
  72. package/dist/pages/admin/delegations/index.cjs +1 -1
  73. package/dist/pages/admin/delegations/index.js +1 -1
  74. package/dist/pages/admin/orgs/index.cjs +1 -1
  75. package/dist/pages/admin/orgs/index.js +1 -1
  76. package/dist/pages/admin/users/index.cjs +1 -1
  77. package/dist/pages/admin/users/index.js +1 -1
  78. package/dist/pages/delegations/index.cjs +1 -1
  79. package/dist/pages/delegations/index.js +1 -1
  80. package/dist/pages/forms/builder/index.cjs +1 -1
  81. package/dist/pages/forms/builder/index.js +1 -1
  82. package/dist/pages/instances/detail/index.cjs +1 -1
  83. package/dist/pages/instances/detail/index.js +1 -1
  84. package/dist/pages/settings/notifications/index.cjs +1 -1
  85. package/dist/pages/settings/notifications/index.js +1 -1
  86. package/dist/pages/templates/categories/index.cjs +1 -1
  87. package/dist/pages/templates/categories/index.js +1 -1
  88. package/dist/pages/templates/index.cjs +1 -1
  89. package/dist/pages/templates/index.js +1 -1
  90. package/dist/views/admin/delegations/index.cjs +1 -1
  91. package/dist/views/admin/delegations/index.js +1 -1
  92. package/dist/views/admin/index.cjs +1 -1
  93. package/dist/views/admin/index.js +3 -3
  94. package/dist/views/admin/orgs/index.cjs +1 -1
  95. package/dist/views/admin/orgs/index.js +1 -1
  96. package/dist/views/admin/users/index.cjs +1 -1
  97. package/dist/views/admin/users/index.js +1 -1
  98. package/dist/views/cc/index.cjs +1 -1
  99. package/dist/views/cc/index.js +1 -1
  100. package/dist/views/dashboard/index.cjs +1 -1
  101. package/dist/views/dashboard/index.js +1 -1
  102. package/dist/views/delegations/index.cjs +1 -1
  103. package/dist/views/delegations/index.js +1 -1
  104. package/dist/views/forms/builder/index.cjs +1 -1
  105. package/dist/views/forms/builder/index.js +1 -1
  106. package/dist/views/forms/index.cjs +1 -1
  107. package/dist/views/forms/index.cjs.map +1 -1
  108. package/dist/views/forms/index.js +84 -80
  109. package/dist/views/forms/index.js.map +1 -1
  110. package/dist/views/inbox/index.cjs +1 -1
  111. package/dist/views/inbox/index.cjs.map +1 -1
  112. package/dist/views/inbox/index.js +83 -79
  113. package/dist/views/inbox/index.js.map +1 -1
  114. package/dist/views/instances/detail/index.cjs +1 -1
  115. package/dist/views/instances/detail/index.js +1 -1
  116. package/dist/views/instances/new/index.cjs +1 -1
  117. package/dist/views/instances/new/index.cjs.map +1 -1
  118. package/dist/views/instances/new/index.js +107 -100
  119. package/dist/views/instances/new/index.js.map +1 -1
  120. package/dist/views/search/index.cjs +1 -1
  121. package/dist/views/search/index.js +1 -1
  122. package/dist/views/sent/index.cjs +1 -1
  123. package/dist/views/sent/index.js +1 -1
  124. package/dist/views/settings/index.cjs +1 -1
  125. package/dist/views/settings/index.js +1 -1
  126. package/dist/views/settings/notifications/index.cjs +1 -1
  127. package/dist/views/settings/notifications/index.js +1 -1
  128. package/dist/views/templates/categories/index.cjs +1 -1
  129. package/dist/views/templates/categories/index.js +1 -1
  130. package/dist/views/templates/designer/index.cjs +6 -6
  131. package/dist/views/templates/designer/index.cjs.map +1 -1
  132. package/dist/views/templates/designer/index.js +758 -754
  133. package/dist/views/templates/designer/index.js.map +1 -1
  134. package/dist/views/templates/index.cjs +1 -1
  135. package/dist/views/templates/index.js +2 -2
  136. package/dist/views/templates/versions/index.cjs +1 -1
  137. package/dist/views/templates/versions/index.cjs.map +1 -1
  138. package/dist/views/templates/versions/index.js +47 -43
  139. package/dist/views/templates/versions/index.js.map +1 -1
  140. package/package.json +3 -3
  141. package/dist/chunks/app-navigation-BRRFCkxZ.cjs +0 -2
  142. package/dist/chunks/app-navigation-BRRFCkxZ.cjs.map +0 -1
  143. package/dist/chunks/app-navigation-rxhpHCch.js +0 -262
  144. package/dist/chunks/app-navigation-rxhpHCch.js.map +0 -1
  145. package/dist/chunks/approval-instance-list-page-2vUWc5-c.cjs +0 -2
  146. package/dist/chunks/approval-instance-list-page-2vUWc5-c.cjs.map +0 -1
  147. package/dist/chunks/approval-instance-list-page-BgE4vQw8.js.map +0 -1
  148. package/dist/chunks/builder-B8X-m6C5.cjs +0 -3
  149. package/dist/chunks/builder-B8X-m6C5.cjs.map +0 -1
  150. package/dist/chunks/builder-Du_0apkh.js.map +0 -1
  151. package/dist/chunks/categories-DG4k7S8V.js +0 -383
  152. package/dist/chunks/categories-DG4k7S8V.js.map +0 -1
  153. package/dist/chunks/categories-DshBQG33.cjs +0 -2
  154. package/dist/chunks/categories-DshBQG33.cjs.map +0 -1
  155. package/dist/chunks/dashboard-page-CTBwpu_D.js +0 -114
  156. package/dist/chunks/dashboard-page-CTBwpu_D.js.map +0 -1
  157. package/dist/chunks/dashboard-page-DcDiWQp2.cjs +0 -2
  158. package/dist/chunks/dashboard-page-DcDiWQp2.cjs.map +0 -1
  159. package/dist/chunks/delegations-BAZQbElH.js +0 -642
  160. package/dist/chunks/delegations-BAZQbElH.js.map +0 -1
  161. package/dist/chunks/delegations-DzrckrPp.js +0 -569
  162. package/dist/chunks/delegations-DzrckrPp.js.map +0 -1
  163. package/dist/chunks/delegations-Z8hTajLj.cjs +0 -2
  164. package/dist/chunks/delegations-Z8hTajLj.cjs.map +0 -1
  165. package/dist/chunks/delegations-hb9JoVZe.cjs +0 -2
  166. package/dist/chunks/delegations-hb9JoVZe.cjs.map +0 -1
  167. package/dist/chunks/detail-DilI0PPe.js +0 -1519
  168. package/dist/chunks/detail-DilI0PPe.js.map +0 -1
  169. package/dist/chunks/detail-DuRg3Y7b.cjs +0 -2
  170. package/dist/chunks/detail-DuRg3Y7b.cjs.map +0 -1
  171. package/dist/chunks/notifications-B2Lk3grg.js +0 -194
  172. package/dist/chunks/notifications-B2Lk3grg.js.map +0 -1
  173. package/dist/chunks/notifications-C8ADhnxF.cjs +0 -2
  174. package/dist/chunks/notifications-C8ADhnxF.cjs.map +0 -1
  175. package/dist/chunks/orgs-CGv3VNDR.cjs +0 -2
  176. package/dist/chunks/orgs-CGv3VNDR.cjs.map +0 -1
  177. package/dist/chunks/orgs-c29y74w2.js.map +0 -1
  178. package/dist/chunks/templates-Cd0WFheA.cjs +0 -2
  179. package/dist/chunks/templates-Cd0WFheA.cjs.map +0 -1
  180. package/dist/chunks/templates-Dn9QHFSy.js.map +0 -1
  181. package/dist/chunks/users-B-trMu0E.cjs +0 -2
  182. package/dist/chunks/users-B-trMu0E.cjs.map +0 -1
  183. package/dist/chunks/users-itVXXRj7.js +0 -215
  184. package/dist/chunks/users-itVXXRj7.js.map +0 -1
@@ -0,0 +1,573 @@
1
+ "use client";
2
+ import { n as e } from "./auth-provider-Bnox5gsx.js";
3
+ import { t } from "./format-date-time-CB-LxzqT.js";
4
+ import { t as n } from "./app-navigation-BSkMsEhy.js";
5
+ import { r } from "./routes-config-dxahImVe.js";
6
+ import { t as i } from "./bpm-form-field-Cao0rMol.js";
7
+ import { useCallback as a, useEffect as o, useMemo as s, useState as c } from "react";
8
+ import { AutoComplete as l, Badge as u, Button as ee, DateTimePicker as d, Filter as te, FilterArea as ne, FilterLine as re, FormField as ie, Modal as ae, PageHeader as oe, Section as se, SectionGroup as ce, Select as f, Tab as le, TabItem as ue, Table as de, Tooltip as p, Typography as m } from "@mezzanine-ui/react";
9
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
10
+ import { createDelegationRule as fe, listDelegationRulesPage as pe, revokeDelegationRule as me, searchMembers as he } from "@rytass/bpm-core-client/workflow";
11
+ import { PlusIcon as ge } from "@mezzanine-ui/icons";
12
+ import _e from "@mezzanine-ui/react/ContentHeader";
13
+ import { FormFieldLayout as ve } from "@mezzanine-ui/core/form";
14
+ import { listApprovalTemplates as ye } from "@rytass/bpm-core-client/template";
15
+ import '../delegations2.css';var _ = {
16
+ delegationFilterArea: "bpm_delegationFilterArea_hAA4C",
17
+ delegationModalFields: "bpm_delegationModalFields_1aOVW",
18
+ memberNameWithTooltip: "bpm_memberNameWithTooltip_6Mojc"
19
+ }, be = ve.HORIZONTAL, xe = [
20
+ 10,
21
+ 20,
22
+ 50
23
+ ], Se = [
24
+ {
25
+ key: "ALL",
26
+ label: "全部"
27
+ },
28
+ {
29
+ key: "ACTIVE",
30
+ label: "啟用中"
31
+ },
32
+ {
33
+ key: "REVOKED",
34
+ label: "已撤銷"
35
+ },
36
+ {
37
+ key: "EXPIRED",
38
+ label: "已過期"
39
+ }
40
+ ], v = [
41
+ {
42
+ id: "ALL_SCOPES",
43
+ name: "全部範圍",
44
+ scopeType: null
45
+ },
46
+ {
47
+ id: "ALL",
48
+ name: "全部簽核",
49
+ scopeType: "ALL"
50
+ },
51
+ {
52
+ id: "TEMPLATE_LIST",
53
+ name: "指定模板",
54
+ scopeType: "TEMPLATE_LIST"
55
+ }
56
+ ], y = [{
57
+ id: "ALL",
58
+ name: "全部簽核"
59
+ }, {
60
+ id: "TEMPLATE_LIST",
61
+ name: "指定模板"
62
+ }];
63
+ function b({ activeHref: u } = {}) {
64
+ let p = r(), be = u ?? p.delegations(), { member: b } = e(), S = b?.memberId ?? null, [C, T] = c(null), [O, k] = c(""), [A, M] = c(null), [Pe, N] = c(!0), [Fe, P] = c(!1), [F, I] = c([]), [Ie, L] = c(!1), [R, z] = c(1), [B, Le] = c(10), [V, Re] = c("ALL"), [ze, Be] = c(0), [H, Ve] = c([]), [U, W] = c(!1), [G, He] = c(v[0]), [K, Ue] = c([]), [We, Ge] = c(y[0]), [q, Ke] = c(""), [qe, Je] = c(!1), [Ye, J] = c([]), Y = a(async () => {
65
+ if (!S) {
66
+ N(!1);
67
+ return;
68
+ }
69
+ N(!0), M(null);
70
+ try {
71
+ let [e, t] = await Promise.all([pe({
72
+ includeInactive: !0,
73
+ page: R,
74
+ pageSize: B,
75
+ principalMemberId: S,
76
+ scopeType: G.scopeType,
77
+ status: V === "ALL" ? null : V
78
+ }), he("")]);
79
+ Ve(e.rules), Be(e.totalCount), I(t.map(x));
80
+ } catch (e) {
81
+ M(j(e));
82
+ } finally {
83
+ N(!1);
84
+ }
85
+ }, [
86
+ S,
87
+ R,
88
+ B,
89
+ V,
90
+ G
91
+ ]);
92
+ o(() => {
93
+ Y();
94
+ }, [Y]);
95
+ let X = s(() => new Map(F.map((e) => [e.id, e])), [F]), Xe = s(() => H.map((e) => ({
96
+ ...e,
97
+ agentEmail: X.get(e.agentMemberId)?.email ?? null,
98
+ agentName: X.get(e.agentMemberId)?.displayName ?? e.agentMemberId,
99
+ key: e.id,
100
+ scopeLabel: ke(e)
101
+ })), [X, H]), Z = y.find((e) => e.id === We.id) ?? y[0], Ze = s(() => [
102
+ {
103
+ key: "agent",
104
+ render: (e) => /* @__PURE__ */ h(we, {
105
+ email: e.agentEmail,
106
+ name: e.agentName
107
+ }),
108
+ title: "代理人",
109
+ width: 220
110
+ },
111
+ {
112
+ dataIndex: "scopeLabel",
113
+ key: "scope",
114
+ title: "代理範圍",
115
+ width: 220
116
+ },
117
+ {
118
+ key: "status",
119
+ render: (e) => /* @__PURE__ */ h(je, { status: e.status }),
120
+ title: "狀態",
121
+ width: 120
122
+ },
123
+ {
124
+ key: "startAt",
125
+ render: (e) => /* @__PURE__ */ h(m, {
126
+ component: "span",
127
+ variant: "body",
128
+ children: t(e.startAt)
129
+ }),
130
+ title: "開始時間",
131
+ width: 220
132
+ },
133
+ {
134
+ key: "endAt",
135
+ render: (e) => /* @__PURE__ */ h(m, {
136
+ component: "span",
137
+ variant: "body",
138
+ children: e.endAt ? t(e.endAt) : "-"
139
+ }),
140
+ title: "結束時間",
141
+ width: 220
142
+ }
143
+ ], []), Qe = a(async (e) => {
144
+ if (S) {
145
+ M(null);
146
+ try {
147
+ await me({
148
+ id: e,
149
+ revokedByMemberId: S
150
+ }), await Y();
151
+ } catch (e) {
152
+ M(j(e));
153
+ }
154
+ }
155
+ }, [S, Y]), $e = s(() => ({
156
+ render: (e) => e.status === "ACTIVE" ? [{
157
+ name: "撤銷",
158
+ onClick: () => void Qe(e.id)
159
+ }] : [],
160
+ variant: "destructive-secondary",
161
+ width: 88
162
+ }), [Qe]);
163
+ async function et(e) {
164
+ P(!0);
165
+ try {
166
+ I((await he(e)).map(x));
167
+ } catch (e) {
168
+ M(j(e));
169
+ } finally {
170
+ P(!1);
171
+ }
172
+ }
173
+ async function Q(e, t = K) {
174
+ Je(!0);
175
+ try {
176
+ J(w(t, De((await ye()).map(Te), e)));
177
+ } catch (e) {
178
+ M(j(e));
179
+ } finally {
180
+ Je(!1);
181
+ }
182
+ }
183
+ function tt() {
184
+ T(null), k(""), Ue([]), Ge(y[0]), Ke(""), J([]), Q("", []), L(!0);
185
+ }
186
+ function $() {
187
+ U || L(!1);
188
+ }
189
+ async function nt() {
190
+ if (S) {
191
+ if (!C) {
192
+ M("請選擇代理人");
193
+ return;
194
+ }
195
+ if (C.id === S) {
196
+ M("代理人不可設定為自己");
197
+ return;
198
+ }
199
+ if (Z.id === "TEMPLATE_LIST" && K.length < 1) {
200
+ M("請選擇至少一個簽核模板");
201
+ return;
202
+ }
203
+ if (Ne(q, O)) {
204
+ M("結束時間必須晚於起始時間");
205
+ return;
206
+ }
207
+ W(!0), M(null);
208
+ try {
209
+ await fe({
210
+ agentMemberId: C.id,
211
+ createdByMemberId: S,
212
+ endAt: O || null,
213
+ principalMemberId: S,
214
+ priority: 100,
215
+ requiresConfirmation: !1,
216
+ scopeConditionCel: null,
217
+ scopeTemplateIds: Z.id === "TEMPLATE_LIST" ? K.map((e) => e.id) : [],
218
+ scopeType: Z.id,
219
+ startAt: q || null
220
+ }), L(!1), R === 1 ? await Y() : z(1);
221
+ } catch (e) {
222
+ M(j(e));
223
+ } finally {
224
+ W(!1);
225
+ }
226
+ }
227
+ }
228
+ return /* @__PURE__ */ g(n, {
229
+ activeHref: be,
230
+ children: [
231
+ /* @__PURE__ */ h(oe, { children: /* @__PURE__ */ h(_e, {
232
+ description: "設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。",
233
+ title: "我的代理",
234
+ children: /* @__PURE__ */ h(ee, {
235
+ icon: ge,
236
+ iconType: "leading",
237
+ onClick: tt,
238
+ variant: "base-primary",
239
+ children: "建立代理"
240
+ })
241
+ }) }),
242
+ /* @__PURE__ */ h(ce, { children: /* @__PURE__ */ g(se, {
243
+ filterArea: /* @__PURE__ */ h(ne, {
244
+ className: _.delegationFilterArea,
245
+ size: "sub",
246
+ children: /* @__PURE__ */ h(re, { children: /* @__PURE__ */ h(te, {
247
+ span: 2,
248
+ children: /* @__PURE__ */ h(ie, {
249
+ fullWidth: !0,
250
+ layout: ve.VERTICAL,
251
+ name: "scopeFilterType",
252
+ children: /* @__PURE__ */ h(f, {
253
+ clearable: !1,
254
+ fullWidth: !0,
255
+ onChange: (e) => {
256
+ He(Oe(e)), z(1);
257
+ },
258
+ options: [...v],
259
+ placeholder: "代理範圍",
260
+ size: "sub",
261
+ value: G
262
+ })
263
+ })
264
+ }) })
265
+ }),
266
+ tab: /* @__PURE__ */ h(le, {
267
+ activeKey: V,
268
+ onChange: (e) => {
269
+ Re(Me(e)), z(1);
270
+ },
271
+ children: Se.map((e) => /* @__PURE__ */ h(ue, { children: e.label }, e.key))
272
+ }),
273
+ children: [A ? /* @__PURE__ */ h(m, {
274
+ color: "text-error",
275
+ variant: "body",
276
+ children: A
277
+ }) : null, /* @__PURE__ */ h(de, {
278
+ actions: $e,
279
+ columns: Ze,
280
+ dataSource: Xe,
281
+ fullWidth: !0,
282
+ loading: Pe,
283
+ pagination: {
284
+ current: R,
285
+ onChange: (e) => {
286
+ z(e);
287
+ },
288
+ onChangePageSize: (e) => {
289
+ z(1), Le(e);
290
+ },
291
+ pageSize: B,
292
+ pageSizeLabel: "每頁筆數",
293
+ pageSizeOptions: xe,
294
+ renderResultSummary: (e, t, n) => `顯示 ${e}-${t} 筆,共 ${n} 筆`,
295
+ showPageSizeOptions: !0,
296
+ total: ze
297
+ }
298
+ })]
299
+ }) }),
300
+ /* @__PURE__ */ h(ae, {
301
+ cancelText: "取消",
302
+ confirmButtonProps: { disabled: !C },
303
+ confirmText: "建立代理",
304
+ loading: U,
305
+ modalType: "standard",
306
+ onCancel: $,
307
+ onClose: $,
308
+ onConfirm: () => void nt(),
309
+ open: Ie,
310
+ showModalFooter: !0,
311
+ showModalHeader: !0,
312
+ size: "regular",
313
+ supportingText: "代理生效後,後續建立的待簽任務會依範圍自動指派給代理人。",
314
+ title: "建立個人代理",
315
+ children: /* @__PURE__ */ g("div", {
316
+ className: _.delegationModalFields,
317
+ children: [
318
+ /* @__PURE__ */ h(Ce, {
319
+ label: "代理人",
320
+ loading: Fe,
321
+ name: "agentMemberId",
322
+ onChange: T,
323
+ onSearch: et,
324
+ options: F,
325
+ value: C
326
+ }),
327
+ /* @__PURE__ */ h(i, {
328
+ label: "代理範圍",
329
+ name: "scopeType",
330
+ required: !0,
331
+ children: /* @__PURE__ */ h(f, {
332
+ clearable: !1,
333
+ fullWidth: !0,
334
+ onChange: (e) => Ge(Ae(e)),
335
+ options: [...y],
336
+ placeholder: "選擇代理範圍",
337
+ value: Z
338
+ })
339
+ }),
340
+ Z.id === "TEMPLATE_LIST" ? /* @__PURE__ */ h(i, {
341
+ label: "簽核模板",
342
+ name: "scopeTemplateIds",
343
+ required: !0,
344
+ children: /* @__PURE__ */ h(l, {
345
+ asyncData: !0,
346
+ disabledOptionsFilter: !0,
347
+ emptyText: "沒有符合的模板",
348
+ inputProps: {
349
+ autoCapitalize: "none",
350
+ autoCorrect: "off",
351
+ name: "scopeTemplateIds",
352
+ spellCheck: !1
353
+ },
354
+ loading: qe,
355
+ loadingText: "搜尋模板中...",
356
+ mode: "multiple",
357
+ onChange: (e) => {
358
+ let t = Ee(e);
359
+ Ue(t), J((e) => w(t, e));
360
+ },
361
+ onSearch: Q,
362
+ onVisibilityChange: (e) => {
363
+ e && Q("");
364
+ },
365
+ options: [...Ye],
366
+ overflowStrategy: "wrap",
367
+ placeholder: "搜尋並選取簽核模板",
368
+ searchDebounceTime: 300,
369
+ value: [...K]
370
+ })
371
+ }) : null,
372
+ /* @__PURE__ */ h(i, {
373
+ label: "起始時間",
374
+ name: "startAt",
375
+ children: /* @__PURE__ */ h(d, {
376
+ formatDate: "YYYY-MM-DD",
377
+ formatTime: "HH:mm",
378
+ fullWidth: !0,
379
+ hideSecond: !0,
380
+ onChange: (e) => Ke(D(e)),
381
+ placeholderLeft: "留空立即生效",
382
+ placeholderRight: "選擇時間",
383
+ value: E(q)
384
+ })
385
+ }),
386
+ /* @__PURE__ */ h(i, {
387
+ label: "結束時間",
388
+ name: "endAt",
389
+ children: /* @__PURE__ */ h(d, {
390
+ formatDate: "YYYY-MM-DD",
391
+ formatTime: "HH:mm",
392
+ fullWidth: !0,
393
+ hideSecond: !0,
394
+ onChange: (e) => k(D(e)),
395
+ placeholderLeft: "可留空",
396
+ placeholderRight: "選擇時間",
397
+ value: E(O)
398
+ })
399
+ })
400
+ ]
401
+ })
402
+ })
403
+ ]
404
+ });
405
+ }
406
+ function Ce({ label: e, loading: t, name: n, onChange: r, onSearch: a, options: o, value: s }) {
407
+ return /* @__PURE__ */ h(i, {
408
+ label: e,
409
+ layout: be,
410
+ name: n,
411
+ required: !0,
412
+ children: /* @__PURE__ */ h(l, {
413
+ asyncData: !0,
414
+ disabledOptionsFilter: !0,
415
+ emptyText: "沒有符合的成員",
416
+ inputProps: {
417
+ autoCapitalize: "none",
418
+ autoCorrect: "off",
419
+ name: n,
420
+ spellCheck: !1
421
+ },
422
+ loading: t,
423
+ loadingText: "搜尋成員中...",
424
+ mode: "single",
425
+ onChange: (e) => r(S(e)),
426
+ onSearch: a,
427
+ onSearchTextChange: (e) => r(C(e, o)),
428
+ onVisibilityChange: (e) => {
429
+ e && a("");
430
+ },
431
+ options: [...o],
432
+ placeholder: "搜尋姓名或信箱",
433
+ searchDebounceTime: 300,
434
+ value: s
435
+ })
436
+ });
437
+ }
438
+ function we({ email: e, name: t }) {
439
+ return e ? /* @__PURE__ */ h(p, {
440
+ title: e,
441
+ children: ({ onMouseEnter: e, onMouseLeave: n, ref: r }) => /* @__PURE__ */ h("span", {
442
+ className: _.memberNameWithTooltip,
443
+ onMouseEnter: e,
444
+ onMouseLeave: n,
445
+ ref: r,
446
+ children: t
447
+ })
448
+ }) : /* @__PURE__ */ h("span", { children: t });
449
+ }
450
+ function x(e) {
451
+ return {
452
+ displayName: e.name,
453
+ email: e.email,
454
+ id: e.memberId,
455
+ name: `${e.name} (${e.email})`
456
+ };
457
+ }
458
+ function S(e) {
459
+ if (!M(e)) return null;
460
+ let t = e.displayName, n = e.email, r = e.id, i = e.name;
461
+ return typeof r == "string" && typeof i == "string" ? {
462
+ displayName: typeof t == "string" ? t : i,
463
+ email: typeof n == "string" ? n : null,
464
+ id: r,
465
+ name: i
466
+ } : null;
467
+ }
468
+ function C(e, t) {
469
+ let n = e.trim().toLocaleLowerCase();
470
+ if (!n) return null;
471
+ let r = t.filter((e) => [
472
+ e.id,
473
+ e.name,
474
+ e.email ?? ""
475
+ ].some((e) => e.toLocaleLowerCase().includes(n)));
476
+ return r.length === 1 ? r[0] ?? null : null;
477
+ }
478
+ function Te(e) {
479
+ return {
480
+ id: e.id,
481
+ name: e.name
482
+ };
483
+ }
484
+ function Ee(e) {
485
+ return e.flatMap((e) => {
486
+ if (!M(e)) return [];
487
+ let t = e.id, n = e.name;
488
+ return typeof t == "string" && typeof n == "string" ? [{
489
+ id: t,
490
+ name: n
491
+ }] : [];
492
+ });
493
+ }
494
+ function De(e, t) {
495
+ let n = t.trim().toLocaleLowerCase();
496
+ return n ? e.filter((e) => [e.id, e.name].some((e) => e.toLocaleLowerCase().includes(n))) : e;
497
+ }
498
+ function w(e, t) {
499
+ return [...e, ...t].reduce((e, t) => e.some((e) => e.id === t.id) ? e : [...e, t], []);
500
+ }
501
+ function Oe(e) {
502
+ if (!M(e)) return v[0];
503
+ let t = e.id;
504
+ return v.find((e) => e.id === t) ?? v[0];
505
+ }
506
+ function ke(e) {
507
+ return e.scopeType === "ALL" ? "全部簽核" : e.scopeType === "TEMPLATE_LIST" ? `指定模板:${e.scopeTemplateIds.length}` : e.scopeConditionCel ? `條件:${e.scopeConditionCel}` : "條件式";
508
+ }
509
+ function Ae(e) {
510
+ return !M(e) || !T(e.id) ? y[0] : y.find((t) => t.id === e.id) ?? y[0];
511
+ }
512
+ function T(e) {
513
+ return e === "ALL" || e === "TEMPLATE_LIST";
514
+ }
515
+ function je({ status: e }) {
516
+ return e === "ACTIVE" ? /* @__PURE__ */ h(u, {
517
+ size: "sub",
518
+ text: "啟用中",
519
+ variant: "dot-success"
520
+ }) : e === "REVOKED" ? /* @__PURE__ */ h(u, {
521
+ size: "sub",
522
+ text: "已撤銷",
523
+ variant: "dot-inactive"
524
+ }) : e === "EXPIRED" ? /* @__PURE__ */ h(u, {
525
+ size: "sub",
526
+ text: "已過期",
527
+ variant: "dot-warning"
528
+ }) : /* @__PURE__ */ h(u, {
529
+ size: "sub",
530
+ text: e,
531
+ variant: "dot-info"
532
+ });
533
+ }
534
+ function Me(e) {
535
+ return e === "ACTIVE" || e === "REVOKED" || e === "EXPIRED" ? e : "ALL";
536
+ }
537
+ function E(e) {
538
+ let t = e ? O(e) : null;
539
+ return t ? `${k(t)}T${A(t.getHours())}:${A(t.getMinutes())}` : void 0;
540
+ }
541
+ function D(e) {
542
+ let t = e ? O(e) : null;
543
+ return t ? t.toISOString() : "";
544
+ }
545
+ function Ne(e, t) {
546
+ if (!e || !t) return !1;
547
+ let n = O(e), r = O(t);
548
+ return !!n && !!r && r.getTime() <= n.getTime();
549
+ }
550
+ function O(e) {
551
+ if (e.endsWith("Z") || /[+-]\d{2}:\d{2}$/.test(e)) {
552
+ let t = new Date(e);
553
+ return Number.isNaN(t.getTime()) ? null : t;
554
+ }
555
+ let [t = "", n = "00:00"] = e.split("T"), [r = 0, i = 1, a = 1] = t.split("-").map(Number), [o = 0, s = 0] = n.split(":").map(Number), c = new Date(r, i - 1, a, o, s);
556
+ return Number.isNaN(c.getTime()) ? null : c;
557
+ }
558
+ function k(e) {
559
+ return `${e.getFullYear()}-${A(e.getMonth() + 1)}-${A(e.getDate())}`;
560
+ }
561
+ function A(e) {
562
+ return String(e).padStart(2, "0");
563
+ }
564
+ function j(e) {
565
+ return e instanceof Error ? e.message : "發生未知錯誤";
566
+ }
567
+ function M(e) {
568
+ return typeof e == "object" && !!e;
569
+ }
570
+ //#endregion
571
+ export { b as t };
572
+
573
+ //# sourceMappingURL=delegations-dKodb0WW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegations-dKodb0WW.js","names":[],"sources":["../../src/views/delegations/delegations.module.scss","../../src/views/delegations/DelegationsView.tsx"],"sourcesContent":[".delegationFilterArea {\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-form-field__label-area) {\n display: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n}\n\n.delegationModalFields {\n display: grid;\n gap: 12px;\n width: 100%;\n\n :global(.mzn-form-field--horizontal) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label-area) {\n flex: 0 0 112px;\n width: 112px;\n min-width: 112px;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label) {\n flex-wrap: nowrap;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__data-entry) {\n flex: 1 1 auto;\n align-items: stretch;\n min-width: 0;\n max-width: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-autocomplete) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-picker),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n\n :global(.mzn-select-trigger__input) {\n width: 100%;\n min-width: 0 !important;\n text-overflow: ellipsis;\n }\n}\n\n.memberNameWithTooltip {\n cursor: help;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n","'use client';\n\nimport {\n Key,\n ReactElement,\n RefCallback,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Badge,\n Button,\n DateTimePicker,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Tooltip,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { BPMFormField } from '../../components/bpm-form-field';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { AppLayout } from '../../components/app-navigation';\nimport { useAuth } from '../../lib/auth-provider';\nimport { useBPMRoutes } from '../../lib/routes-config';\nimport {\n DelegationRuleRecord,\n DelegationRuleStatus,\n DelegationScopeType,\n MemberProfileRecord,\n createDelegationRule,\n listDelegationRulesPage,\n revokeDelegationRule,\n searchMembers,\n} from '@rytass/bpm-core-client/workflow';\nimport {\n ApprovalTemplateRecord,\n listApprovalTemplates,\n} from '@rytass/bpm-core-client/template';\nimport styles from './delegations.module.scss';\n\ntype DelegationStatusTabKey = 'ALL' | DelegationRuleStatus;\n\ntype MemberOption = Readonly<{\n displayName: string;\n email: string | null;\n id: string;\n name: string;\n}>;\n\ntype ScopeOption = Readonly<{\n id: DelegationScopeType;\n name: string;\n}>;\n\ntype ScopeFilterOption = Readonly<{\n id: 'ALL_SCOPES' | DelegationScopeType;\n name: string;\n scopeType: DelegationScopeType | null;\n}>;\n\ntype TemplateOption = Readonly<{\n id: string;\n name: string;\n}>;\n\ntype DelegationRuleRow = Readonly<\n Record<string, unknown> &\n DelegationRuleRecord & {\n agentEmail: string | null;\n agentName: string;\n key: string;\n scopeLabel: string;\n }\n>;\n\nconst DELEGATION_MODAL_FIELD_LAYOUT = FormFieldLayout.HORIZONTAL;\nconst DELEGATION_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst DELEGATION_STATUS_TABS: readonly {\n readonly key: DelegationStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用中' },\n { key: 'REVOKED', label: '已撤銷' },\n { key: 'EXPIRED', label: '已過期' },\n];\nconst SCOPE_FILTER_OPTIONS: readonly ScopeFilterOption[] = [\n { id: 'ALL_SCOPES', name: '全部範圍', scopeType: null },\n { id: 'ALL', name: '全部簽核', scopeType: 'ALL' },\n { id: 'TEMPLATE_LIST', name: '指定模板', scopeType: 'TEMPLATE_LIST' },\n];\nconst SCOPE_OPTIONS: readonly ScopeOption[] = [\n { id: 'ALL', name: '全部簽核' },\n { id: 'TEMPLATE_LIST', name: '指定模板' },\n];\n\nexport interface DelegationsViewProps {\n readonly activeHref?: string;\n}\n\nexport function DelegationsView({\n activeHref,\n}: DelegationsViewProps = {}): ReactElement {\n const routes = useBPMRoutes();\n const resolvedActiveHref = activeHref ?? routes.delegations();\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [agentMember, setAgentMember] = useState<MemberOption | null>(null);\n const [endAt, setEndAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberLoading, setMemberLoading] = useState(false);\n const [memberOptions, setMemberOptions] = useState<readonly MemberOption[]>(\n [],\n );\n const [modalOpen, setModalOpen] = useState(false);\n const [rulePage, setRulePage] = useState(1);\n const [rulePageSize, setRulePageSize] = useState(10);\n const [ruleStatus, setRuleStatus] = useState<DelegationStatusTabKey>('ALL');\n const [ruleTotalCount, setRuleTotalCount] = useState(0);\n const [rules, setRules] = useState<readonly DelegationRuleRecord[]>([]);\n const [saving, setSaving] = useState(false);\n const [scopeFilterType, setScopeFilterType] = useState<ScopeFilterOption>(\n SCOPE_FILTER_OPTIONS[0],\n );\n const [scopeTemplates, setScopeTemplates] = useState<\n readonly TemplateOption[]\n >([]);\n const [scopeType, setScopeType] = useState<ScopeOption>(SCOPE_OPTIONS[0]);\n const [startAt, setStartAt] = useState('');\n const [templateLoading, setTemplateLoading] = useState(false);\n const [templateOptions, setTemplateOptions] = useState<\n readonly TemplateOption[]\n >([]);\n\n const refreshRules = useCallback(async (): Promise<void> => {\n if (!currentMemberId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const [rulePageResult, members] = await Promise.all([\n listDelegationRulesPage({\n includeInactive: true,\n page: rulePage,\n pageSize: rulePageSize,\n principalMemberId: currentMemberId,\n scopeType: scopeFilterType.scopeType,\n status: ruleStatus === 'ALL' ? null : ruleStatus,\n }),\n searchMembers(''),\n ]);\n\n setRules(rulePageResult.rules);\n setRuleTotalCount(rulePageResult.totalCount);\n setMemberOptions(members.map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [currentMemberId, rulePage, rulePageSize, ruleStatus, scopeFilterType]);\n\n useEffect((): void => {\n void refreshRules();\n }, [refreshRules]);\n\n const membersById = useMemo(\n (): ReadonlyMap<string, MemberOption> =>\n new Map(memberOptions.map((option) => [option.id, option])),\n [memberOptions],\n );\n const rows = useMemo(\n (): DelegationRuleRow[] =>\n rules.map((rule) => ({\n ...rule,\n agentEmail: membersById.get(rule.agentMemberId)?.email ?? null,\n agentName:\n membersById.get(rule.agentMemberId)?.displayName ??\n rule.agentMemberId,\n key: rule.id,\n scopeLabel: readScopeLabel(rule),\n })),\n [membersById, rules],\n );\n const selectedScopeType =\n SCOPE_OPTIONS.find((option) => option.id === scopeType.id) ??\n SCOPE_OPTIONS[0];\n const columns = useMemo(\n (): TableColumn<DelegationRuleRow>[] => [\n {\n key: 'agent',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.agentEmail}\n name={record.agentName}\n />\n ),\n title: '代理人',\n width: 220,\n },\n { dataIndex: 'scopeLabel', key: 'scope', title: '代理範圍', width: 220 },\n {\n key: 'status',\n render: (record: DelegationRuleRow): ReactElement => (\n <DelegationStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'startAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startAt)}\n </Typography>\n ),\n title: '開始時間',\n width: 220,\n },\n {\n key: 'endAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.endAt ? formatDateTime(record.endAt) : '-'}\n </Typography>\n ),\n title: '結束時間',\n width: 220,\n },\n ],\n [],\n );\n const handleRevoke = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) {\n return;\n }\n\n setError(null);\n\n try {\n await revokeDelegationRule({\n id,\n revokedByMemberId: currentMemberId,\n });\n await refreshRules();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [currentMemberId, refreshRules],\n );\n const tableActions = useMemo(\n (): TableActions<DelegationRuleRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<DelegationRuleRow>['render']> =>\n record.status === 'ACTIVE'\n ? [\n {\n name: '撤銷',\n onClick: (): void => void handleRevoke(record.id),\n },\n ]\n : [],\n variant: 'destructive-secondary',\n width: 88,\n }),\n [handleRevoke],\n );\n\n async function handleSearchMembers(searchText: string): Promise<void> {\n setMemberLoading(true);\n\n try {\n setMemberOptions((await searchMembers(searchText)).map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setMemberLoading(false);\n }\n }\n\n async function handleSearchTemplates(\n searchText: string,\n selectedOptions: readonly TemplateOption[] = scopeTemplates,\n ): Promise<void> {\n setTemplateLoading(true);\n\n try {\n const nextOptions = (await listApprovalTemplates()).map(\n readTemplateOption,\n );\n\n setTemplateOptions(\n mergeTemplateOptions(\n selectedOptions,\n filterTemplateOptions(nextOptions, searchText),\n ),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setTemplateLoading(false);\n }\n }\n\n function openCreateModal(): void {\n setAgentMember(null);\n setEndAt('');\n setScopeTemplates([]);\n setScopeType(SCOPE_OPTIONS[0]);\n setStartAt('');\n setTemplateOptions([]);\n void handleSearchTemplates('', []);\n setModalOpen(true);\n }\n\n function closeCreateModal(): void {\n if (saving) {\n return;\n }\n\n setModalOpen(false);\n }\n\n async function handleCreate(): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n if (!agentMember) {\n setError('請選擇代理人');\n return;\n }\n\n if (agentMember.id === currentMemberId) {\n setError('代理人不可設定為自己');\n return;\n }\n\n if (selectedScopeType.id === 'TEMPLATE_LIST' && scopeTemplates.length < 1) {\n setError('請選擇至少一個簽核模板');\n return;\n }\n\n if (isInvalidDelegationDateRange(startAt, endAt)) {\n setError('結束時間必須晚於起始時間');\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await createDelegationRule({\n agentMemberId: agentMember.id,\n createdByMemberId: currentMemberId,\n endAt: endAt || null,\n principalMemberId: currentMemberId,\n priority: 100,\n requiresConfirmation: false,\n scopeConditionCel: null,\n scopeTemplateIds:\n selectedScopeType.id === 'TEMPLATE_LIST'\n ? scopeTemplates.map((template) => template.id)\n : [],\n scopeType: selectedScopeType.id,\n startAt: startAt || null,\n });\n setModalOpen(false);\n\n if (rulePage === 1) {\n await refreshRules();\n } else {\n setRulePage(1);\n }\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <AppLayout activeHref={resolvedActiveHref}>\n <PageHeader>\n <ContentHeader\n description=\"設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。\"\n title=\"我的代理\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={openCreateModal}\n variant=\"base-primary\"\n >\n 建立代理\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.delegationFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"scopeFilterType\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setScopeFilterType(readScopeFilterOption(option));\n setRulePage(1);\n }}\n options={[...SCOPE_FILTER_OPTIONS]}\n placeholder=\"代理範圍\"\n size=\"sub\"\n value={scopeFilterType}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={ruleStatus}\n onChange={(activeKey): void => {\n setRuleStatus(readDelegationStatusTabKey(activeKey));\n setRulePage(1);\n }}\n >\n {DELEGATION_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: rulePage,\n onChange: (page): void => {\n setRulePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setRulePage(1);\n setRulePageSize(pageSize);\n },\n pageSize: rulePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: DELEGATION_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: ruleTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !agentMember,\n }}\n confirmText=\"建立代理\"\n loading={saving}\n modalType=\"standard\"\n onCancel={closeCreateModal}\n onClose={closeCreateModal}\n onConfirm={(): void => void handleCreate()}\n open={modalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"代理生效後,後續建立的待簽任務會依範圍自動指派給代理人。\"\n title=\"建立個人代理\"\n >\n <div className={styles.delegationModalFields}>\n <MemberAutoCompleteField\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentMemberId\"\n onChange={setAgentMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={agentMember}\n />\n <BPMFormField label=\"代理範圍\" name=\"scopeType\" required>\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setScopeType(readScopeOptionFromValue(option))\n }\n options={[...SCOPE_OPTIONS]}\n placeholder=\"選擇代理範圍\"\n value={selectedScopeType}\n />\n </BPMFormField>\n {selectedScopeType.id === 'TEMPLATE_LIST' ? (\n <BPMFormField label=\"簽核模板\" name=\"scopeTemplateIds\" required>\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的模板\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'scopeTemplateIds',\n spellCheck: false,\n }}\n loading={templateLoading}\n loadingText=\"搜尋模板中...\"\n mode=\"multiple\"\n onChange={(nextTemplates): void => {\n const selectedTemplates =\n readTemplateOptionsFromValue(nextTemplates);\n\n setScopeTemplates(selectedTemplates);\n setTemplateOptions((currentOptions) =>\n mergeTemplateOptions(selectedTemplates, currentOptions),\n );\n }}\n onSearch={handleSearchTemplates}\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearchTemplates('');\n }\n }}\n options={[...templateOptions]}\n overflowStrategy=\"wrap\"\n placeholder=\"搜尋並選取簽核模板\"\n searchDebounceTime={300}\n value={[...scopeTemplates]}\n />\n </BPMFormField>\n ) : null}\n <BPMFormField label=\"起始時間\" name=\"startAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setStartAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"留空立即生效\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(startAt)}\n />\n </BPMFormField>\n <BPMFormField label=\"結束時間\" name=\"endAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setEndAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"可留空\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(endAt)}\n />\n </BPMFormField>\n </div>\n </Modal>\n </AppLayout>\n );\n}\n\nfunction MemberAutoCompleteField({\n label,\n loading,\n name,\n onChange,\n onSearch,\n options,\n value,\n}: {\n readonly label: string;\n readonly loading: boolean;\n readonly name: string;\n readonly onChange: (option: MemberOption | null) => void;\n readonly onSearch: (searchText: string) => Promise<void>;\n readonly options: readonly MemberOption[];\n readonly value: MemberOption | null;\n}): ReactElement {\n return (\n <BPMFormField\n label={label}\n layout={DELEGATION_MODAL_FIELD_LAYOUT}\n name={name}\n required\n >\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的成員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name,\n spellCheck: false,\n }}\n loading={loading}\n loadingText=\"搜尋成員中...\"\n mode=\"single\"\n onChange={(option): void => onChange(readMemberOptionFromValue(option))}\n onSearch={onSearch}\n onSearchTextChange={(searchText): void =>\n onChange(readUniqueMemberOption(searchText, options))\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void onSearch('');\n }\n }}\n options={[...options]}\n placeholder=\"搜尋姓名或信箱\"\n searchDebounceTime={300}\n value={value}\n />\n </BPMFormField>\n );\n}\n\nfunction MemberNameWithEmailTooltip({\n email,\n name,\n}: {\n readonly email: string | null;\n readonly name: string;\n}): ReactElement {\n if (!email) {\n return <span>{name}</span>;\n }\n\n return (\n <Tooltip title={email}>\n {({ onMouseEnter, onMouseLeave, ref }): ReactElement => (\n <span\n className={styles.memberNameWithTooltip}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n ref={ref as RefCallback<HTMLSpanElement>}\n >\n {name}\n </span>\n )}\n </Tooltip>\n );\n}\n\nfunction readMemberOption(member: MemberProfileRecord): MemberOption {\n return {\n displayName: member.name,\n email: member.email,\n id: member.memberId,\n name: `${member.name} (${member.email})`,\n };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const displayName = value.displayName;\n const email = value.email;\n const id = value.id;\n const name = value.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? {\n displayName: typeof displayName === 'string' ? displayName : name,\n email: typeof email === 'string' ? email : null,\n id,\n name,\n }\n : null;\n}\n\nfunction readUniqueMemberOption(\n searchText: string,\n options: readonly MemberOption[],\n): MemberOption | null {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return null;\n }\n\n const matches = options.filter((option) =>\n [option.id, option.name, option.email ?? ''].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n\n return matches.length === 1 ? (matches[0] ?? null) : null;\n}\n\nfunction readTemplateOption(template: ApprovalTemplateRecord): TemplateOption {\n return {\n id: template.id,\n name: template.name,\n };\n}\n\nfunction readTemplateOptionsFromValue(\n value: readonly unknown[],\n): readonly TemplateOption[] {\n return value.flatMap((item): readonly TemplateOption[] => {\n if (!isRecord(item)) {\n return [];\n }\n\n const id = item.id;\n const name = item.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? [{ id, name }]\n : [];\n });\n}\n\nfunction filterTemplateOptions(\n options: readonly TemplateOption[],\n searchText: string,\n): readonly TemplateOption[] {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return options;\n }\n\n return options.filter((option) =>\n [option.id, option.name].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n}\n\nfunction mergeTemplateOptions(\n selectedOptions: readonly TemplateOption[],\n availableOptions: readonly TemplateOption[],\n): readonly TemplateOption[] {\n return [...selectedOptions, ...availableOptions].reduce<TemplateOption[]>(\n (options, option) =>\n options.some((currentOption) => currentOption.id === option.id)\n ? options\n : [...options, option],\n [],\n );\n}\n\nfunction readScopeFilterOption(value: unknown): ScopeFilterOption {\n if (!isRecord(value)) {\n return SCOPE_FILTER_OPTIONS[0];\n }\n\n const id = value.id;\n\n return (\n SCOPE_FILTER_OPTIONS.find((option) => option.id === id) ??\n SCOPE_FILTER_OPTIONS[0]\n );\n}\n\nfunction readScopeLabel(rule: DelegationRuleRecord): string {\n if (rule.scopeType === 'ALL') {\n return '全部簽核';\n }\n\n if (rule.scopeType === 'TEMPLATE_LIST') {\n return `指定模板:${rule.scopeTemplateIds.length}`;\n }\n\n return rule.scopeConditionCel ? `條件:${rule.scopeConditionCel}` : '條件式';\n}\n\nfunction readScopeOptionFromValue(value: unknown): ScopeOption {\n if (!isRecord(value) || !isSelectableDelegationScopeType(value.id)) {\n return SCOPE_OPTIONS[0];\n }\n\n return (\n SCOPE_OPTIONS.find((option) => option.id === value.id) ?? SCOPE_OPTIONS[0]\n );\n}\n\nfunction isSelectableDelegationScopeType(\n value: unknown,\n): value is ScopeOption['id'] {\n return value === 'ALL' || value === 'TEMPLATE_LIST';\n}\n\nfunction DelegationStatusBadge({\n status,\n}: {\n readonly status: DelegationRuleRecord['status'];\n}): ReactElement {\n if (status === 'ACTIVE') {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n if (status === 'REVOKED') {\n return <Badge size=\"sub\" text=\"已撤銷\" variant=\"dot-inactive\" />;\n }\n\n if (status === 'EXPIRED') {\n return <Badge size=\"sub\" text=\"已過期\" variant=\"dot-warning\" />;\n }\n\n return <Badge size=\"sub\" text={status} variant=\"dot-info\" />;\n}\n\nfunction readDelegationStatusTabKey(activeKey: Key): DelegationStatusTabKey {\n if (\n activeKey === 'ACTIVE' ||\n activeKey === 'REVOKED' ||\n activeKey === 'EXPIRED'\n ) {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readDelegationDateTimePickerValue(value: string): string | undefined {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date\n ? `${formatDateParts(date)}T${padDatePart(date.getHours())}:${padDatePart(\n date.getMinutes(),\n )}`\n : undefined;\n}\n\nfunction formatDelegationDateTimePickerValue(\n value: string | undefined,\n): string {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date ? date.toISOString() : '';\n}\n\nfunction isInvalidDelegationDateRange(startAt: string, endAt: string): boolean {\n if (!startAt || !endAt) {\n return false;\n }\n\n const startDate = parseDelegationDateTimeValue(startAt);\n const endDate = parseDelegationDateTimeValue(endAt);\n\n return !!startDate && !!endDate && endDate.getTime() <= startDate.getTime();\n}\n\nfunction parseDelegationDateTimeValue(value: string): Date | null {\n if (value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value)) {\n const parsedDate = new Date(value);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n }\n\n const [datePart = '', timePart = '00:00'] = value.split('T');\n const [year = 0, month = 1, day = 1] = datePart.split('-').map(Number);\n const [hour = 0, minute = 0] = timePart.split(':').map(Number);\n const parsedDate = new Date(year, month - 1, day, hour, minute);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n}\n\nfunction formatDateParts(date: Date): string {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(\n date.getDate(),\n )}`;\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}