@rytass/bpm-core-react 0.3.8 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +154 -0
- package/README.md +69 -4
- package/dist/chunks/approval-instance-list-page-BF2r5D2-.js +278 -0
- package/dist/chunks/approval-instance-list-page-BF2r5D2-.js.map +1 -0
- package/dist/chunks/approval-instance-list-page-C5ZKPHdA.cjs +2 -0
- package/dist/chunks/approval-instance-list-page-C5ZKPHdA.cjs.map +1 -0
- package/dist/chunks/auth-provider-4BeCw7cI.cjs +2 -0
- package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -0
- package/dist/chunks/auth-provider-B5oPmvk2.js +83 -0
- package/dist/chunks/auth-provider-B5oPmvk2.js.map +1 -0
- package/dist/chunks/{builder-D950gct_.js → builder-BLVnnpnP.js} +474 -478
- package/dist/chunks/builder-BLVnnpnP.js.map +1 -0
- package/dist/chunks/builder-DVE9zIKH.cjs +3 -0
- package/dist/chunks/builder-DVE9zIKH.cjs.map +1 -0
- package/dist/chunks/categories-B6QZKZRt.cjs +2 -0
- package/dist/chunks/categories-B6QZKZRt.cjs.map +1 -0
- package/dist/chunks/categories-DBPoSrsi.js +382 -0
- package/dist/chunks/categories-DBPoSrsi.js.map +1 -0
- package/dist/chunks/chunk-CMqjfN_6.cjs +1 -0
- package/dist/chunks/dashboard-page-CddG1MnK.cjs +2 -0
- package/dist/chunks/dashboard-page-CddG1MnK.cjs.map +1 -0
- package/dist/chunks/dashboard-page-Ib8srCMy.js +119 -0
- package/dist/chunks/dashboard-page-Ib8srCMy.js.map +1 -0
- package/dist/chunks/delegations-C2wLWsDQ.cjs +2 -0
- package/dist/chunks/delegations-C2wLWsDQ.cjs.map +1 -0
- package/dist/chunks/delegations-DDEk-WI6.cjs +2 -0
- package/dist/chunks/delegations-DDEk-WI6.cjs.map +1 -0
- package/dist/chunks/delegations-ZNtodFaD.js +568 -0
- package/dist/chunks/delegations-ZNtodFaD.js.map +1 -0
- package/dist/chunks/delegations-iVnRi3QE.js +641 -0
- package/dist/chunks/delegations-iVnRi3QE.js.map +1 -0
- package/dist/chunks/detail-Dcr5mM8g.cjs +2 -0
- package/dist/chunks/detail-Dcr5mM8g.cjs.map +1 -0
- package/dist/chunks/detail-u9DdLhDW.js +1518 -0
- package/dist/chunks/detail-u9DdLhDW.js.map +1 -0
- package/dist/chunks/format-date-time-XxBzF0F5.cjs +2 -0
- package/dist/chunks/{format-date-time-26_pFvv4.cjs.map → format-date-time-XxBzF0F5.cjs.map} +1 -1
- package/dist/chunks/login-9bCXyjbX.cjs +2 -0
- package/dist/chunks/{login-CQ9MfwcC.cjs.map → login-9bCXyjbX.cjs.map} +1 -1
- package/dist/chunks/{login-C20yVxbc.js → login-BKxpLibd.js} +3 -2
- package/dist/chunks/{login-C20yVxbc.js.map → login-BKxpLibd.js.map} +1 -1
- package/dist/chunks/notifications-BKs4--96.cjs +2 -0
- package/dist/chunks/notifications-BKs4--96.cjs.map +1 -0
- package/dist/chunks/notifications-CSulztkU.js +193 -0
- package/dist/chunks/notifications-CSulztkU.js.map +1 -0
- package/dist/chunks/orgs-BIiqzHvb.cjs +2 -0
- package/dist/chunks/orgs-BIiqzHvb.cjs.map +1 -0
- package/dist/chunks/orgs-Cc18umVt.js +1944 -0
- package/dist/chunks/orgs-Cc18umVt.js.map +1 -0
- package/dist/chunks/router-adapter--gYs13E8.cjs +2 -0
- package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -0
- package/dist/chunks/router-adapter-DftlFTOd.js +23 -0
- package/dist/chunks/router-adapter-DftlFTOd.js.map +1 -0
- package/dist/chunks/templates-D44FSB46.js +380 -0
- package/dist/chunks/templates-D44FSB46.js.map +1 -0
- package/dist/chunks/templates-w96t83N-.cjs +2 -0
- package/dist/chunks/templates-w96t83N-.cjs.map +1 -0
- package/dist/chunks/users-CUY139DF.js +214 -0
- package/dist/chunks/users-CUY139DF.js.map +1 -0
- package/dist/chunks/users-qghSMtLn.cjs +2 -0
- package/dist/chunks/users-qghSMtLn.cjs.map +1 -0
- package/dist/components/approval-instance-list-page.d.ts +1 -2
- package/dist/components/bpm-notification-bell-button.d.ts +22 -0
- package/dist/components/dashboard-page.d.ts +1 -4
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +206 -97
- package/dist/index.js.map +1 -1
- package/dist/lib/notification-drawer-provider.d.ts +3 -2
- package/dist/lib/notification-unread-provider.d.ts +6 -5
- package/dist/lib/providers.d.ts +3 -2
- package/dist/lib/use-bpm-logout.d.ts +12 -0
- package/dist/lib/use-bpm-member.d.ts +11 -0
- package/dist/next/BPMNextProviders.d.ts +1 -1
- package/dist/next/index.cjs +1 -1
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.js +13 -23
- package/dist/next/index.js.map +1 -1
- package/dist/pages/admin/delegations/index.cjs +1 -1
- package/dist/pages/admin/delegations/index.js +1 -1
- package/dist/pages/admin/orgs/index.cjs +1 -1
- package/dist/pages/admin/orgs/index.js +1 -1
- package/dist/pages/admin/users/index.cjs +1 -1
- package/dist/pages/admin/users/index.js +1 -1
- package/dist/pages/delegations/index.cjs +1 -1
- package/dist/pages/delegations/index.js +1 -1
- package/dist/pages/forms/builder/index.cjs +1 -1
- package/dist/pages/forms/builder/index.js +1 -1
- package/dist/pages/instances/detail/index.cjs +1 -1
- package/dist/pages/instances/detail/index.js +1 -1
- package/dist/pages/login/index.cjs +1 -1
- package/dist/pages/login/index.js +1 -1
- package/dist/pages/settings/notifications/index.cjs +1 -1
- package/dist/pages/settings/notifications/index.js +1 -1
- package/dist/pages/templates/categories/index.cjs +1 -1
- package/dist/pages/templates/categories/index.js +1 -1
- package/dist/pages/templates/index.cjs +1 -1
- package/dist/pages/templates/index.js +1 -1
- package/dist/views/admin/delegations/AdminDelegationsView.d.ts +1 -4
- package/dist/views/admin/delegations/index.cjs +1 -1
- package/dist/views/admin/delegations/index.js +1 -1
- package/dist/views/admin/index.cjs +1 -1
- package/dist/views/admin/index.js +3 -3
- package/dist/views/admin/orgs/AdminOrgsView.d.ts +1 -4
- package/dist/views/admin/orgs/index.cjs +1 -1
- package/dist/views/admin/orgs/index.js +1 -1
- package/dist/views/admin/users/AdminUsersView.d.ts +1 -4
- package/dist/views/admin/users/index.cjs +1 -1
- package/dist/views/admin/users/index.js +1 -1
- package/dist/views/cc/CcView.d.ts +1 -3
- package/dist/views/cc/index.cjs +1 -1
- package/dist/views/cc/index.cjs.map +1 -1
- package/dist/views/cc/index.js +2 -3
- package/dist/views/cc/index.js.map +1 -1
- package/dist/views/dashboard/DashboardView.d.ts +1 -3
- package/dist/views/dashboard/index.cjs +1 -1
- package/dist/views/dashboard/index.cjs.map +1 -1
- package/dist/views/dashboard/index.js +3 -3
- package/dist/views/dashboard/index.js.map +1 -1
- package/dist/views/delegations/DelegationsView.d.ts +1 -4
- package/dist/views/delegations/index.cjs +1 -1
- package/dist/views/delegations/index.js +1 -1
- package/dist/views/forms/FormsView.d.ts +1 -3
- package/dist/views/forms/builder/index.cjs +1 -1
- package/dist/views/forms/builder/index.js +1 -1
- package/dist/views/forms/index.cjs +1 -1
- package/dist/views/forms/index.cjs.map +1 -1
- package/dist/views/forms/index.js +95 -99
- package/dist/views/forms/index.js.map +1 -1
- package/dist/views/inbox/InboxView.d.ts +1 -3
- package/dist/views/inbox/index.cjs +1 -1
- package/dist/views/inbox/index.cjs.map +1 -1
- package/dist/views/inbox/index.js +91 -94
- package/dist/views/inbox/index.js.map +1 -1
- package/dist/views/instances/detail/index.cjs +1 -1
- package/dist/views/instances/detail/index.js +1 -1
- package/dist/views/instances/new/index.cjs +1 -1
- package/dist/views/instances/new/index.cjs.map +1 -1
- package/dist/views/instances/new/index.js +71 -77
- package/dist/views/instances/new/index.js.map +1 -1
- package/dist/views/login/index.cjs +1 -1
- package/dist/views/login/index.js +1 -1
- package/dist/views/root/RootView.d.ts +1 -3
- package/dist/views/search/SearchView.d.ts +1 -3
- package/dist/views/search/index.cjs +1 -1
- package/dist/views/search/index.cjs.map +1 -1
- package/dist/views/search/index.js +2 -3
- package/dist/views/search/index.js.map +1 -1
- package/dist/views/sent/SentView.d.ts +1 -3
- package/dist/views/sent/index.cjs +1 -1
- package/dist/views/sent/index.cjs.map +1 -1
- package/dist/views/sent/index.js +2 -3
- package/dist/views/sent/index.js.map +1 -1
- package/dist/views/settings/index.cjs +1 -1
- package/dist/views/settings/index.js +1 -1
- package/dist/views/settings/notifications/SettingsNotificationsView.d.ts +1 -4
- package/dist/views/settings/notifications/index.cjs +1 -1
- package/dist/views/settings/notifications/index.js +1 -1
- package/dist/views/templates/TemplatesView.d.ts +1 -4
- package/dist/views/templates/categories/TemplateCategoriesView.d.ts +1 -4
- package/dist/views/templates/categories/index.cjs +1 -1
- package/dist/views/templates/categories/index.js +1 -1
- package/dist/views/templates/designer/TemplateDesignerView.d.ts +1 -2
- package/dist/views/templates/designer/index.cjs +7 -7
- package/dist/views/templates/designer/index.cjs.map +1 -1
- package/dist/views/templates/designer/index.js +707 -711
- package/dist/views/templates/designer/index.js.map +1 -1
- package/dist/views/templates/index.cjs +1 -1
- package/dist/views/templates/index.js +2 -2
- package/dist/views/templates/versions/TemplateVersionsView.d.ts +1 -2
- package/dist/views/templates/versions/index.cjs +1 -1
- package/dist/views/templates/versions/index.cjs.map +1 -1
- package/dist/views/templates/versions/index.js +45 -49
- package/dist/views/templates/versions/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/app-navigation.css +0 -1
- package/dist/chunks/app-navigation-BSkMsEhy.js +0 -268
- package/dist/chunks/app-navigation-BSkMsEhy.js.map +0 -1
- package/dist/chunks/app-navigation-KnlJCUp1.cjs +0 -2
- package/dist/chunks/app-navigation-KnlJCUp1.cjs.map +0 -1
- package/dist/chunks/approval-instance-list-page-CVXgE2K3.cjs +0 -2
- package/dist/chunks/approval-instance-list-page-CVXgE2K3.cjs.map +0 -1
- package/dist/chunks/approval-instance-list-page-CqNdoZqx.js +0 -282
- package/dist/chunks/approval-instance-list-page-CqNdoZqx.js.map +0 -1
- package/dist/chunks/auth-provider-BV8Iiwfb.cjs +0 -2
- package/dist/chunks/auth-provider-BV8Iiwfb.cjs.map +0 -1
- package/dist/chunks/auth-provider-Bnox5gsx.js +0 -98
- package/dist/chunks/auth-provider-Bnox5gsx.js.map +0 -1
- package/dist/chunks/builder-CMlJfQHE.cjs +0 -3
- package/dist/chunks/builder-CMlJfQHE.cjs.map +0 -1
- package/dist/chunks/builder-D950gct_.js.map +0 -1
- package/dist/chunks/categories-5yEM3p3N.cjs +0 -2
- package/dist/chunks/categories-5yEM3p3N.cjs.map +0 -1
- package/dist/chunks/categories-BIpOG451.js +0 -387
- package/dist/chunks/categories-BIpOG451.js.map +0 -1
- package/dist/chunks/dashboard-page-Bx1-Ys3e.js +0 -122
- package/dist/chunks/dashboard-page-Bx1-Ys3e.js.map +0 -1
- package/dist/chunks/dashboard-page-CQNRbMkJ.cjs +0 -2
- package/dist/chunks/dashboard-page-CQNRbMkJ.cjs.map +0 -1
- package/dist/chunks/delegations-B2j-wNEO.js +0 -646
- package/dist/chunks/delegations-B2j-wNEO.js.map +0 -1
- package/dist/chunks/delegations-CsB9ozLu.cjs +0 -2
- package/dist/chunks/delegations-CsB9ozLu.cjs.map +0 -1
- package/dist/chunks/delegations-CvtwTXNP.cjs +0 -2
- package/dist/chunks/delegations-CvtwTXNP.cjs.map +0 -1
- package/dist/chunks/delegations-dKodb0WW.js +0 -573
- package/dist/chunks/delegations-dKodb0WW.js.map +0 -1
- package/dist/chunks/detail-BcGAqJ_R.js +0 -1523
- package/dist/chunks/detail-BcGAqJ_R.js.map +0 -1
- package/dist/chunks/detail-CqjqLd65.cjs +0 -2
- package/dist/chunks/detail-CqjqLd65.cjs.map +0 -1
- package/dist/chunks/format-date-time-26_pFvv4.cjs +0 -2
- package/dist/chunks/login-CQ9MfwcC.cjs +0 -2
- package/dist/chunks/notifications-2swRqDPF.js +0 -198
- package/dist/chunks/notifications-2swRqDPF.js.map +0 -1
- package/dist/chunks/notifications-BaYDebFt.cjs +0 -2
- package/dist/chunks/notifications-BaYDebFt.cjs.map +0 -1
- package/dist/chunks/orgs-CuHxxd_n.js +0 -1949
- package/dist/chunks/orgs-CuHxxd_n.js.map +0 -1
- package/dist/chunks/orgs-YMiVLNvL.cjs +0 -2
- package/dist/chunks/orgs-YMiVLNvL.cjs.map +0 -1
- package/dist/chunks/templates-DTkbSgFY.cjs +0 -2
- package/dist/chunks/templates-DTkbSgFY.cjs.map +0 -1
- package/dist/chunks/templates-DoDWM68t.js +0 -384
- package/dist/chunks/templates-DoDWM68t.js.map +0 -1
- package/dist/chunks/users-3ySyUW4u.cjs +0 -2
- package/dist/chunks/users-3ySyUW4u.cjs.map +0 -1
- package/dist/chunks/users-sMfrSjRQ.js +0 -219
- package/dist/chunks/users-sMfrSjRQ.js.map +0 -1
- package/dist/components/app-navigation.d.ts +0 -41
|
@@ -1,573 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|