@rytass/bpm-core-react 0.3.8 → 0.4.0
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 +105 -0
- package/README.md +69 -4
- package/dist/chunks/approval-instance-list-page-BtEc8Cs3.js +278 -0
- package/dist/chunks/approval-instance-list-page-BtEc8Cs3.js.map +1 -0
- package/dist/chunks/approval-instance-list-page-UNIIgUZy.cjs +2 -0
- package/dist/chunks/approval-instance-list-page-UNIIgUZy.cjs.map +1 -0
- package/dist/chunks/auth-provider-D2P-qWmY.cjs +2 -0
- package/dist/chunks/auth-provider-D2P-qWmY.cjs.map +1 -0
- package/dist/chunks/auth-provider-TTO9eNZV.js +83 -0
- package/dist/chunks/auth-provider-TTO9eNZV.js.map +1 -0
- package/dist/chunks/{builder-D950gct_.js → builder-C3E-8OJu.js} +474 -478
- package/dist/chunks/builder-C3E-8OJu.js.map +1 -0
- package/dist/chunks/builder-f-Q_0NUs.cjs +3 -0
- package/dist/chunks/builder-f-Q_0NUs.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-CQRBJxze.js +119 -0
- package/dist/chunks/dashboard-page-CQRBJxze.js.map +1 -0
- package/dist/chunks/dashboard-page-DrDChhg1.cjs +2 -0
- package/dist/chunks/dashboard-page-DrDChhg1.cjs.map +1 -0
- package/dist/chunks/delegations-CFXaJrdX.cjs +2 -0
- package/dist/chunks/delegations-CFXaJrdX.cjs.map +1 -0
- package/dist/chunks/delegations-D5pPEWsP.js +641 -0
- package/dist/chunks/delegations-D5pPEWsP.js.map +1 -0
- package/dist/chunks/delegations-DwbYkNUg.cjs +2 -0
- package/dist/chunks/delegations-DwbYkNUg.cjs.map +1 -0
- package/dist/chunks/delegations-FTLaWo1Y.js +568 -0
- package/dist/chunks/delegations-FTLaWo1Y.js.map +1 -0
- package/dist/chunks/detail-B9JkYNHc.cjs +2 -0
- package/dist/chunks/detail-B9JkYNHc.cjs.map +1 -0
- package/dist/chunks/detail-CSxI04gB.js +1518 -0
- package/dist/chunks/detail-CSxI04gB.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-BfmfCclF.cjs +2 -0
- package/dist/chunks/{login-CQ9MfwcC.cjs.map → login-BfmfCclF.cjs.map} +1 -1
- package/dist/chunks/{login-C20yVxbc.js → login-xgI4wLHe.js} +3 -2
- package/dist/chunks/{login-C20yVxbc.js.map → login-xgI4wLHe.js.map} +1 -1
- package/dist/chunks/notifications-BoNa1BXD.js +193 -0
- package/dist/chunks/notifications-BoNa1BXD.js.map +1 -0
- package/dist/chunks/notifications-a-FCxV02.cjs +2 -0
- package/dist/chunks/notifications-a-FCxV02.cjs.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-BdHZXLS3.js +23 -0
- package/dist/chunks/router-adapter-BdHZXLS3.js.map +1 -0
- package/dist/chunks/router-adapter-BybHrCNP.cjs +2 -0
- package/dist/chunks/router-adapter-BybHrCNP.cjs.map +1 -0
- package/dist/chunks/templates-CL8bPvgn.cjs +2 -0
- package/dist/chunks/templates-CL8bPvgn.cjs.map +1 -0
- package/dist/chunks/templates-DNfDOPGm.js +380 -0
- package/dist/chunks/templates-DNfDOPGm.js.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/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
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { n as e } from "./auth-provider-TTO9eNZV.js";
|
|
3
|
+
import { useEffect as t, useState as n } from "react";
|
|
4
|
+
import { Filter as r, FilterArea as i, FilterLine as a, FormField as o, PageHeader as s, RadioGroup as c, Section as l, SectionGroup as u, Typography as d } from "@mezzanine-ui/react";
|
|
5
|
+
import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
6
|
+
import { readNotificationPreference as h, updateNotificationPreference as g } from "@rytass/bpm-core-client/workflow";
|
|
7
|
+
import _ from "@mezzanine-ui/react/ContentHeader";
|
|
8
|
+
import { FormFieldLayout as v } from "@mezzanine-ui/core/form";
|
|
9
|
+
import '../notifications.css';var y = {
|
|
10
|
+
preferenceFilter: "bpm_preferenceFilter_snhMa",
|
|
11
|
+
segmentFilterControl: "bpm_segmentFilterControl_piBnq",
|
|
12
|
+
segmentFilterLabel: "bpm_segmentFilterLabel_U0z8J"
|
|
13
|
+
}, b = [{
|
|
14
|
+
id: "INSTANT",
|
|
15
|
+
name: "即時通知"
|
|
16
|
+
}, {
|
|
17
|
+
id: "DAILY",
|
|
18
|
+
name: "每日摘要"
|
|
19
|
+
}], x = [{
|
|
20
|
+
id: "ON",
|
|
21
|
+
name: "開"
|
|
22
|
+
}, {
|
|
23
|
+
id: "OFF",
|
|
24
|
+
name: "關"
|
|
25
|
+
}], S = {
|
|
26
|
+
emailDigestMode: "INSTANT",
|
|
27
|
+
emailEnabled: !0,
|
|
28
|
+
inAppEnabled: !0,
|
|
29
|
+
memberId: "",
|
|
30
|
+
quietHoursEnd: null,
|
|
31
|
+
quietHoursStart: null,
|
|
32
|
+
updatedAt: ""
|
|
33
|
+
};
|
|
34
|
+
function C() {
|
|
35
|
+
let { member: C } = e(), k = C?.memberId ?? null, [A, j] = n(S), [M, N] = n(!0), [P, F] = n(!1), [I, L] = n(null);
|
|
36
|
+
t(() => {
|
|
37
|
+
k && (N(!0), L(null), h(k).then((e) => {
|
|
38
|
+
j(e);
|
|
39
|
+
}).catch((e) => {
|
|
40
|
+
L(O(e));
|
|
41
|
+
}).finally(() => {
|
|
42
|
+
N(!1);
|
|
43
|
+
}));
|
|
44
|
+
}, [k]);
|
|
45
|
+
async function R(e) {
|
|
46
|
+
if (!k || P) return;
|
|
47
|
+
let t = A;
|
|
48
|
+
j(e), F(!0);
|
|
49
|
+
try {
|
|
50
|
+
j(await g({
|
|
51
|
+
emailDigestMode: e.emailDigestMode,
|
|
52
|
+
emailEnabled: e.emailEnabled,
|
|
53
|
+
inAppEnabled: e.inAppEnabled,
|
|
54
|
+
memberId: k,
|
|
55
|
+
quietHoursEnd: e.quietHoursEnd,
|
|
56
|
+
quietHoursStart: e.quietHoursStart
|
|
57
|
+
}));
|
|
58
|
+
} catch (e) {
|
|
59
|
+
j(t), L(O(e));
|
|
60
|
+
} finally {
|
|
61
|
+
F(!1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
let z = M || P;
|
|
65
|
+
return /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(s, { children: /* @__PURE__ */ p(_, {
|
|
66
|
+
description: "調整站內通知、Email 通知與摘要頻率。",
|
|
67
|
+
title: "通知設定"
|
|
68
|
+
}) }), /* @__PURE__ */ p(u, { children: /* @__PURE__ */ p(l, {
|
|
69
|
+
filterArea: /* @__PURE__ */ p(i, {
|
|
70
|
+
className: y.preferenceFilter,
|
|
71
|
+
isDirty: !1,
|
|
72
|
+
children: /* @__PURE__ */ m(a, { children: [
|
|
73
|
+
/* @__PURE__ */ p(r, {
|
|
74
|
+
minWidth: 160,
|
|
75
|
+
span: 1,
|
|
76
|
+
children: /* @__PURE__ */ p(o, {
|
|
77
|
+
layout: v.VERTICAL,
|
|
78
|
+
name: "inAppEnabled",
|
|
79
|
+
style: w,
|
|
80
|
+
children: /* @__PURE__ */ m("div", {
|
|
81
|
+
className: y.segmentFilterControl,
|
|
82
|
+
children: [/* @__PURE__ */ p("span", {
|
|
83
|
+
className: y.segmentFilterLabel,
|
|
84
|
+
children: "站內通知"
|
|
85
|
+
}), /* @__PURE__ */ p(c, {
|
|
86
|
+
disabled: z,
|
|
87
|
+
name: "inAppEnabled",
|
|
88
|
+
onChange: (e) => {
|
|
89
|
+
R({
|
|
90
|
+
...A,
|
|
91
|
+
inAppEnabled: E(e.target.value)
|
|
92
|
+
});
|
|
93
|
+
},
|
|
94
|
+
options: [...x],
|
|
95
|
+
size: "sub",
|
|
96
|
+
type: "segment",
|
|
97
|
+
value: D(A.inAppEnabled)
|
|
98
|
+
})]
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
}),
|
|
102
|
+
/* @__PURE__ */ p(r, {
|
|
103
|
+
minWidth: 180,
|
|
104
|
+
span: 1,
|
|
105
|
+
children: /* @__PURE__ */ p(o, {
|
|
106
|
+
layout: v.VERTICAL,
|
|
107
|
+
name: "emailEnabled",
|
|
108
|
+
style: w,
|
|
109
|
+
children: /* @__PURE__ */ m("div", {
|
|
110
|
+
className: y.segmentFilterControl,
|
|
111
|
+
children: [/* @__PURE__ */ p("span", {
|
|
112
|
+
className: y.segmentFilterLabel,
|
|
113
|
+
children: "Email 通知"
|
|
114
|
+
}), /* @__PURE__ */ p(c, {
|
|
115
|
+
disabled: z,
|
|
116
|
+
name: "emailEnabled",
|
|
117
|
+
onChange: (e) => {
|
|
118
|
+
R({
|
|
119
|
+
...A,
|
|
120
|
+
emailEnabled: E(e.target.value)
|
|
121
|
+
});
|
|
122
|
+
},
|
|
123
|
+
options: [...x],
|
|
124
|
+
size: "sub",
|
|
125
|
+
type: "segment",
|
|
126
|
+
value: D(A.emailEnabled)
|
|
127
|
+
})]
|
|
128
|
+
})
|
|
129
|
+
})
|
|
130
|
+
}),
|
|
131
|
+
/* @__PURE__ */ p(r, {
|
|
132
|
+
minWidth: 280,
|
|
133
|
+
span: 2,
|
|
134
|
+
children: /* @__PURE__ */ p(o, {
|
|
135
|
+
fullWidth: !0,
|
|
136
|
+
layout: v.VERTICAL,
|
|
137
|
+
name: "emailDigestMode",
|
|
138
|
+
style: w,
|
|
139
|
+
children: /* @__PURE__ */ m("div", {
|
|
140
|
+
className: y.segmentFilterControl,
|
|
141
|
+
children: [/* @__PURE__ */ p("span", {
|
|
142
|
+
className: y.segmentFilterLabel,
|
|
143
|
+
children: "Email 頻率"
|
|
144
|
+
}), /* @__PURE__ */ p(c, {
|
|
145
|
+
disabled: z,
|
|
146
|
+
name: "emailDigestMode",
|
|
147
|
+
onChange: (e) => {
|
|
148
|
+
R({
|
|
149
|
+
...A,
|
|
150
|
+
emailDigestMode: T(e.target.value)
|
|
151
|
+
});
|
|
152
|
+
},
|
|
153
|
+
options: [...b],
|
|
154
|
+
size: "sub",
|
|
155
|
+
type: "segment",
|
|
156
|
+
value: A.emailDigestMode
|
|
157
|
+
})]
|
|
158
|
+
})
|
|
159
|
+
})
|
|
160
|
+
})
|
|
161
|
+
] })
|
|
162
|
+
}),
|
|
163
|
+
children: I ? /* @__PURE__ */ p(d, {
|
|
164
|
+
color: "text-error",
|
|
165
|
+
variant: "body",
|
|
166
|
+
children: I
|
|
167
|
+
}) : /* @__PURE__ */ p(d, {
|
|
168
|
+
color: "text-neutral",
|
|
169
|
+
variant: "body",
|
|
170
|
+
children: "偏好設定會立即生效。"
|
|
171
|
+
})
|
|
172
|
+
}) })] });
|
|
173
|
+
}
|
|
174
|
+
var w = {
|
|
175
|
+
minWidth: 0,
|
|
176
|
+
whiteSpace: "nowrap"
|
|
177
|
+
};
|
|
178
|
+
function T(e) {
|
|
179
|
+
return e === "DAILY" ? "DAILY" : "INSTANT";
|
|
180
|
+
}
|
|
181
|
+
function E(e) {
|
|
182
|
+
return e !== "OFF";
|
|
183
|
+
}
|
|
184
|
+
function D(e) {
|
|
185
|
+
return e ? "ON" : "OFF";
|
|
186
|
+
}
|
|
187
|
+
function O(e) {
|
|
188
|
+
return e instanceof Error ? e.message : "發生未知錯誤";
|
|
189
|
+
}
|
|
190
|
+
//#endregion
|
|
191
|
+
export { C as t };
|
|
192
|
+
|
|
193
|
+
//# sourceMappingURL=notifications-BoNa1BXD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications-BoNa1BXD.js","names":[],"sources":["../../src/views/settings/notifications/notification-settings.module.scss","../../src/views/settings/notifications/SettingsNotificationsView.tsx"],"sourcesContent":[".preferenceFilter {\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.segmentFilterControl {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n min-width: 0;\n white-space: nowrap;\n\n :global(.mzn-input-check-group--segmented) {\n align-self: flex-start;\n transform: translateY(-7px);\n }\n}\n\n.segmentFilterLabel {\n flex: 0 0 auto;\n color: var(--mzn-color-text-primary, #1f2937);\n font-size: 13px;\n line-height: 16px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n ReactElement,\n useEffect,\n useState,\n} from 'react';\nimport {\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n PageHeader,\n RadioGroup,\n Section,\n SectionGroup,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport { useAuth } from '../../../lib/auth-provider';\nimport {\n NotificationDigestMode,\n NotificationPreferenceRecord,\n readNotificationPreference,\n updateNotificationPreference,\n} from '@rytass/bpm-core-client/workflow';\nimport styles from './notification-settings.module.scss';\n\ninterface DigestOption {\n readonly id: NotificationDigestMode;\n readonly name: string;\n}\n\ntype EnabledSegmentValue = 'OFF' | 'ON';\n\ninterface EnabledSegmentOption {\n readonly id: EnabledSegmentValue;\n readonly name: string;\n}\n\nconst DIGEST_OPTIONS: readonly DigestOption[] = [\n { id: 'INSTANT', name: '即時通知' },\n { id: 'DAILY', name: '每日摘要' },\n];\n\nconst ENABLED_SEGMENT_OPTIONS: readonly EnabledSegmentOption[] = [\n { id: 'ON', name: '開' },\n { id: 'OFF', name: '關' },\n];\n\nconst DEFAULT_PREFERENCE: NotificationPreferenceRecord = {\n emailDigestMode: 'INSTANT',\n emailEnabled: true,\n inAppEnabled: true,\n memberId: '',\n quietHoursEnd: null,\n quietHoursStart: null,\n updatedAt: '',\n};\n\n\nexport function SettingsNotificationsView(): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [preference, setPreference] =\n useState<NotificationPreferenceRecord>(DEFAULT_PREFERENCE);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect((): void => {\n if (!currentMemberId) {\n return;\n }\n\n setLoading(true);\n setError(null);\n\n readNotificationPreference(currentMemberId)\n .then((nextPreference): void => {\n setPreference(nextPreference);\n })\n .catch((requestError: unknown): void => {\n setError(readErrorMessage(requestError));\n })\n .finally((): void => {\n setLoading(false);\n });\n }, [currentMemberId]);\n\n async function handlePreferenceChange(\n nextPreference: NotificationPreferenceRecord,\n ): Promise<void> {\n if (!currentMemberId || saving) {\n return;\n }\n\n const previousPreference = preference;\n setPreference(nextPreference);\n setSaving(true);\n\n try {\n setPreference(\n await updateNotificationPreference({\n emailDigestMode: nextPreference.emailDigestMode,\n emailEnabled: nextPreference.emailEnabled,\n inAppEnabled: nextPreference.inAppEnabled,\n memberId: currentMemberId,\n quietHoursEnd: nextPreference.quietHoursEnd,\n quietHoursStart: nextPreference.quietHoursStart,\n }),\n );\n } catch (requestError: unknown) {\n setPreference(previousPreference);\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n const controlsDisabled = loading || saving;\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"調整站內通知、Email 通知與摘要頻率。\"\n title=\"通知設定\"\n />\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.preferenceFilter} isDirty={false}>\n <FilterLine>\n <Filter minWidth={160} span={1}>\n <FormField\n layout={FormFieldLayout.VERTICAL}\n name=\"inAppEnabled\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n 站內通知\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"inAppEnabled\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n inAppEnabled: readEnabledSegmentValue(\n event.target.value,\n ),\n });\n }}\n options={[...ENABLED_SEGMENT_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={readEnabledSegmentValueId(\n preference.inAppEnabled,\n )}\n />\n </div>\n </FormField>\n </Filter>\n <Filter minWidth={180} span={1}>\n <FormField\n layout={FormFieldLayout.VERTICAL}\n name=\"emailEnabled\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n Email 通知\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"emailEnabled\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n emailEnabled: readEnabledSegmentValue(\n event.target.value,\n ),\n });\n }}\n options={[...ENABLED_SEGMENT_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={readEnabledSegmentValueId(\n preference.emailEnabled,\n )}\n />\n </div>\n </FormField>\n </Filter>\n <Filter minWidth={280} span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"emailDigestMode\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n Email 頻率\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"emailDigestMode\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n emailDigestMode: readDigestMode(\n event.target.value,\n ),\n });\n }}\n options={[...DIGEST_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={preference.emailDigestMode}\n />\n </div>\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 偏好設定會立即生效。\n </Typography>\n )}\n </Section>\n </SectionGroup>\n </>\n );\n}\n\nconst FILTER_FIELD_STYLE = {\n minWidth: 0,\n whiteSpace: 'nowrap',\n} satisfies CSSProperties;\n\nfunction readDigestMode(value: unknown): NotificationDigestMode {\n return value === 'DAILY' ? 'DAILY' : 'INSTANT';\n}\n\nfunction readEnabledSegmentValue(value: unknown): boolean {\n return value !== 'OFF';\n}\n\nfunction readEnabledSegmentValueId(enabled: boolean): EnabledSegmentValue {\n return enabled ? 'ON' : 'OFF';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";require('../notifications.css');const e=require("./chunk-CMqjfN_6.cjs"),t=require("./auth-provider-D2P-qWmY.cjs");let n=require("react"),r=require("@mezzanine-ui/react"),i=require("react/jsx-runtime"),a=require("@rytass/bpm-core-client/workflow"),o=require("@mezzanine-ui/react/ContentHeader");o=e.t(o,1);let s=require("@mezzanine-ui/core/form");var c={preferenceFilter:`bpm_preferenceFilter_snhMa`,segmentFilterControl:`bpm_segmentFilterControl_piBnq`,segmentFilterLabel:`bpm_segmentFilterLabel_U0z8J`},l=[{id:`INSTANT`,name:`即時通知`},{id:`DAILY`,name:`每日摘要`}],u=[{id:`ON`,name:`開`},{id:`OFF`,name:`關`}],d={emailDigestMode:`INSTANT`,emailEnabled:!0,inAppEnabled:!0,memberId:``,quietHoursEnd:null,quietHoursStart:null,updatedAt:``};function f(){let{member:e}=t.n(),f=e?.memberId??null,[v,y]=(0,n.useState)(d),[b,x]=(0,n.useState)(!0),[S,C]=(0,n.useState)(!1),[w,T]=(0,n.useState)(null);(0,n.useEffect)(()=>{f&&(x(!0),T(null),(0,a.readNotificationPreference)(f).then(e=>{y(e)}).catch(e=>{T(_(e))}).finally(()=>{x(!1)}))},[f]);async function E(e){if(!f||S)return;let t=v;y(e),C(!0);try{y(await(0,a.updateNotificationPreference)({emailDigestMode:e.emailDigestMode,emailEnabled:e.emailEnabled,inAppEnabled:e.inAppEnabled,memberId:f,quietHoursEnd:e.quietHoursEnd,quietHoursStart:e.quietHoursStart}))}catch(e){y(t),T(_(e))}finally{C(!1)}}let D=b||S;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.PageHeader,{children:(0,i.jsx)(o.default,{description:`調整站內通知、Email 通知與摘要頻率。`,title:`通知設定`})}),(0,i.jsx)(r.SectionGroup,{children:(0,i.jsx)(r.Section,{filterArea:(0,i.jsx)(r.FilterArea,{className:c.preferenceFilter,isDirty:!1,children:(0,i.jsxs)(r.FilterLine,{children:[(0,i.jsx)(r.Filter,{minWidth:160,span:1,children:(0,i.jsx)(r.FormField,{layout:s.FormFieldLayout.VERTICAL,name:`inAppEnabled`,style:p,children:(0,i.jsxs)(`div`,{className:c.segmentFilterControl,children:[(0,i.jsx)(`span`,{className:c.segmentFilterLabel,children:`站內通知`}),(0,i.jsx)(r.RadioGroup,{disabled:D,name:`inAppEnabled`,onChange:e=>{E({...v,inAppEnabled:h(e.target.value)})},options:[...u],size:`sub`,type:`segment`,value:g(v.inAppEnabled)})]})})}),(0,i.jsx)(r.Filter,{minWidth:180,span:1,children:(0,i.jsx)(r.FormField,{layout:s.FormFieldLayout.VERTICAL,name:`emailEnabled`,style:p,children:(0,i.jsxs)(`div`,{className:c.segmentFilterControl,children:[(0,i.jsx)(`span`,{className:c.segmentFilterLabel,children:`Email 通知`}),(0,i.jsx)(r.RadioGroup,{disabled:D,name:`emailEnabled`,onChange:e=>{E({...v,emailEnabled:h(e.target.value)})},options:[...u],size:`sub`,type:`segment`,value:g(v.emailEnabled)})]})})}),(0,i.jsx)(r.Filter,{minWidth:280,span:2,children:(0,i.jsx)(r.FormField,{fullWidth:!0,layout:s.FormFieldLayout.VERTICAL,name:`emailDigestMode`,style:p,children:(0,i.jsxs)(`div`,{className:c.segmentFilterControl,children:[(0,i.jsx)(`span`,{className:c.segmentFilterLabel,children:`Email 頻率`}),(0,i.jsx)(r.RadioGroup,{disabled:D,name:`emailDigestMode`,onChange:e=>{E({...v,emailDigestMode:m(e.target.value)})},options:[...l],size:`sub`,type:`segment`,value:v.emailDigestMode})]})})})]})}),children:w?(0,i.jsx)(r.Typography,{color:`text-error`,variant:`body`,children:w}):(0,i.jsx)(r.Typography,{color:`text-neutral`,variant:`body`,children:`偏好設定會立即生效。`})})})]})}var p={minWidth:0,whiteSpace:`nowrap`};function m(e){return e===`DAILY`?`DAILY`:`INSTANT`}function h(e){return e!==`OFF`}function g(e){return e?`ON`:`OFF`}function _(e){return e instanceof Error?e.message:`發生未知錯誤`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return f}});
|
|
2
|
+
//# sourceMappingURL=notifications-a-FCxV02.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications-a-FCxV02.cjs","names":[],"sources":["../../src/views/settings/notifications/notification-settings.module.scss","../../src/views/settings/notifications/SettingsNotificationsView.tsx"],"sourcesContent":[".preferenceFilter {\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.segmentFilterControl {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n min-width: 0;\n white-space: nowrap;\n\n :global(.mzn-input-check-group--segmented) {\n align-self: flex-start;\n transform: translateY(-7px);\n }\n}\n\n.segmentFilterLabel {\n flex: 0 0 auto;\n color: var(--mzn-color-text-primary, #1f2937);\n font-size: 13px;\n line-height: 16px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n ReactElement,\n useEffect,\n useState,\n} from 'react';\nimport {\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n PageHeader,\n RadioGroup,\n Section,\n SectionGroup,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport { useAuth } from '../../../lib/auth-provider';\nimport {\n NotificationDigestMode,\n NotificationPreferenceRecord,\n readNotificationPreference,\n updateNotificationPreference,\n} from '@rytass/bpm-core-client/workflow';\nimport styles from './notification-settings.module.scss';\n\ninterface DigestOption {\n readonly id: NotificationDigestMode;\n readonly name: string;\n}\n\ntype EnabledSegmentValue = 'OFF' | 'ON';\n\ninterface EnabledSegmentOption {\n readonly id: EnabledSegmentValue;\n readonly name: string;\n}\n\nconst DIGEST_OPTIONS: readonly DigestOption[] = [\n { id: 'INSTANT', name: '即時通知' },\n { id: 'DAILY', name: '每日摘要' },\n];\n\nconst ENABLED_SEGMENT_OPTIONS: readonly EnabledSegmentOption[] = [\n { id: 'ON', name: '開' },\n { id: 'OFF', name: '關' },\n];\n\nconst DEFAULT_PREFERENCE: NotificationPreferenceRecord = {\n emailDigestMode: 'INSTANT',\n emailEnabled: true,\n inAppEnabled: true,\n memberId: '',\n quietHoursEnd: null,\n quietHoursStart: null,\n updatedAt: '',\n};\n\n\nexport function SettingsNotificationsView(): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [preference, setPreference] =\n useState<NotificationPreferenceRecord>(DEFAULT_PREFERENCE);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect((): void => {\n if (!currentMemberId) {\n return;\n }\n\n setLoading(true);\n setError(null);\n\n readNotificationPreference(currentMemberId)\n .then((nextPreference): void => {\n setPreference(nextPreference);\n })\n .catch((requestError: unknown): void => {\n setError(readErrorMessage(requestError));\n })\n .finally((): void => {\n setLoading(false);\n });\n }, [currentMemberId]);\n\n async function handlePreferenceChange(\n nextPreference: NotificationPreferenceRecord,\n ): Promise<void> {\n if (!currentMemberId || saving) {\n return;\n }\n\n const previousPreference = preference;\n setPreference(nextPreference);\n setSaving(true);\n\n try {\n setPreference(\n await updateNotificationPreference({\n emailDigestMode: nextPreference.emailDigestMode,\n emailEnabled: nextPreference.emailEnabled,\n inAppEnabled: nextPreference.inAppEnabled,\n memberId: currentMemberId,\n quietHoursEnd: nextPreference.quietHoursEnd,\n quietHoursStart: nextPreference.quietHoursStart,\n }),\n );\n } catch (requestError: unknown) {\n setPreference(previousPreference);\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n const controlsDisabled = loading || saving;\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"調整站內通知、Email 通知與摘要頻率。\"\n title=\"通知設定\"\n />\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.preferenceFilter} isDirty={false}>\n <FilterLine>\n <Filter minWidth={160} span={1}>\n <FormField\n layout={FormFieldLayout.VERTICAL}\n name=\"inAppEnabled\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n 站內通知\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"inAppEnabled\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n inAppEnabled: readEnabledSegmentValue(\n event.target.value,\n ),\n });\n }}\n options={[...ENABLED_SEGMENT_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={readEnabledSegmentValueId(\n preference.inAppEnabled,\n )}\n />\n </div>\n </FormField>\n </Filter>\n <Filter minWidth={180} span={1}>\n <FormField\n layout={FormFieldLayout.VERTICAL}\n name=\"emailEnabled\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n Email 通知\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"emailEnabled\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n emailEnabled: readEnabledSegmentValue(\n event.target.value,\n ),\n });\n }}\n options={[...ENABLED_SEGMENT_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={readEnabledSegmentValueId(\n preference.emailEnabled,\n )}\n />\n </div>\n </FormField>\n </Filter>\n <Filter minWidth={280} span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"emailDigestMode\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n Email 頻率\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"emailDigestMode\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n emailDigestMode: readDigestMode(\n event.target.value,\n ),\n });\n }}\n options={[...DIGEST_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={preference.emailDigestMode}\n />\n </div>\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 偏好設定會立即生效。\n </Typography>\n )}\n </Section>\n </SectionGroup>\n </>\n );\n}\n\nconst FILTER_FIELD_STYLE = {\n minWidth: 0,\n whiteSpace: 'nowrap',\n} satisfies CSSProperties;\n\nfunction readDigestMode(value: unknown): NotificationDigestMode {\n return value === 'DAILY' ? 'DAILY' : 'INSTANT';\n}\n\nfunction readEnabledSegmentValue(value: unknown): boolean {\n return value !== 'OFF';\n}\n\nfunction readEnabledSegmentValueId(enabled: boolean): EnabledSegmentValue {\n return enabled ? 'ON' : 'OFF';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";require('../orgs.css');const e=require("./chunk-CMqjfN_6.cjs"),t=require("./admin-pickers-Btvij1at.cjs"),n=require("./bpm-form-field-Bc6k4ZEO.cjs");let r=require("react"),i=require("@mezzanine-ui/react"),a=require("@rytass/bpm-core-client"),o=require("react/jsx-runtime"),s=require("@mezzanine-ui/react/ContentHeader");s=e.t(s,1);let c=require("@mezzanine-ui/core/form"),l=require("@mezzanine-ui/icons"),u=require("@rytass/bpm-core-client/organization"),d=require("@xyflow/react"),f=require("dagre");f=e.t(f,1);function p(e){return new Map(e.map(e=>[e.id,e.parentId]))}function m({orgUnitId:e,parentDraft:t,parentId:n}){let r=n===e?e:n,i=g({orgUnitId:e,parentDraft:t,parentId:r});if(i)return{message:i,parentDraft:t,status:`INVALID`};if((t.get(e)??null)===r)return{message:`父子關係沒有變更。`,parentDraft:t,status:`UNCHANGED`};let a=new Map(t);return a.set(e,r),{message:r?`已暫存新的上層組織。`:`已暫存為根節點。`,parentDraft:a,status:`UPDATED`}}function h({orgUnits:e,parentDraft:t}){return e.map(e=>{let n=t.get(e.id)??null;return n===e.parentId?null:{orgUnitId:e.id,parentId:n,previousParentId:e.parentId}}).filter(e=>!!e)}function g({orgUnitId:e,parentDraft:t,parentId:n}){return t.has(e)?n?t.has(n)?n===e?`組織不可成為自己的上層。`:_({orgUnitId:e,parentDraft:t,parentId:n})?`不可搬移到自己的下層組織。`:null:`找不到新的上層組織。`:null:`找不到要搬移的組織節點。`}function _({orgUnitId:e,parentDraft:t,parentId:n}){let r=new Set,i=n;for(;i;){if(i===e||r.has(i))return!0;r.add(i),i=t.get(i)??null}return!1}var v={orgTreeEditor:`bpm_orgTreeEditor_TMOtD`,orgTreeSummary:`bpm_orgTreeSummary_vpcV8`,orgTreeChangeList:`bpm_orgTreeChangeList_EzmOv`,orgTreeCanvas:`bpm_orgTreeCanvas_MeD7y`,orgTreeNode:`bpm_orgTreeNode_bN4FS`,orgTreeNodeRoot:`bpm_orgTreeNodeRoot_Hr2KD`,orgTreeNodeSelected:`bpm_orgTreeNodeSelected_eRwtL`,orgTreeNodeChanged:`bpm_orgTreeNodeChanged_qPJg0`,orgTreeNodeDeleted:`bpm_orgTreeNodeDeleted_Ab0cI`,orgTreeNodeHeader:`bpm_orgTreeNodeHeader_LEXl-`,orgTreeNodeBadge:`bpm_orgTreeNodeBadge_zLc7t`,orgTreeNodeActions:`bpm_orgTreeNodeActions_cMldI`},y=`__org-tree-root__`,b=232,x=118,S=232,C=86,w=320,T={COMPANY:`公司`,DEPARTMENT:`部門`,DIVISION:`事業群`,TEAM:`小組`},E={orgUnit:O},D=(0,r.forwardRef)(function({onCreateChild:e,onCreateRoot:t,onEditOrgUnit:n,onSaveDraft:a,onStateChange:s,orgUnits:c},l){let[u,f]=(0,r.useState)(!1),[g,_]=(0,r.useState)(null),[b,x]=(0,r.useState)(null),[S,C]=(0,r.useState)(()=>p(c)),[w,T]=(0,r.useState)([]),D=(0,r.useMemo)(()=>new Map(c.map(e=>[e.id,e])),[c]),O=(0,r.useMemo)(()=>h({orgUnits:c,parentDraft:S}),[c,S]),k=(0,r.useMemo)(()=>ee({isEditing:u,onCreateChild:n=>{n?e(n):t()},onEditOrgUnit:e=>{let t=D.get(e);t&&n(t)},orgUnits:c,orgUnitsById:D,parentDraft:S,selectedOrgUnitId:b}),[u,e,t,n,c,D,S,b]),j=O.length>0;(0,r.useImperativeHandle)(l,()=>({cancelEditing:ie,saveDraft:L,startEditing:I})),(0,r.useEffect)(()=>{s({hasDraftChanges:j,isEditing:u})},[j,u,s]),(0,r.useEffect)(()=>{C(p(c)),x(null),_(null),f(!1)},[c]),(0,r.useEffect)(()=>{T(k.nodes)},[k.nodes]);let M=(0,r.useCallback)((e,t)=>{C(n=>{let r=m({orgUnitId:e,parentDraft:n,parentId:t});return _(r.message),r.parentDraft})},[]),ne=(0,r.useCallback)(e=>{if(!u||!e.target||!e.source)return;let t=e.source===y?null:e.source;if(e.target===y){_(`根節點不能搬移到其他節點下。`);return}M(e.target,t)},[M,u]),N=(0,r.useCallback)(e=>{u&&T(t=>(0,d.applyNodeChanges)(e,[...t]))},[u]),re=(0,r.useCallback)((e,t,n)=>{if(!u||t.id===y)return;let r=te(e,t.id)??A(t,n);if(r===void 0){_(`拖曳到目標父節點附近,或從父節點拉線到子節點。`);return}M(t.id,r===y?null:r)},[M,u]);function I(){f(!0),C(p(c)),_(`已進入編輯模式,拖曳節點或拉線只會更新前端草稿。`)}function ie(){f(!1),C(p(c)),_(`已取消草稿變更。`)}async function L(){if(!a){_(`批次儲存 API 尚未接上,草稿仍保留在前端。`);return}await a(O),f(!1),_(`組織樹草稿已儲存。`)}return(0,o.jsxs)(`div`,{className:v.orgTreeEditor,children:[(0,o.jsxs)(`div`,{className:v.orgTreeSummary,children:[(0,o.jsx)(i.Typography,{color:`text-neutral`,variant:`caption`,children:g??(j?`目前有 ${O.length} 筆父子關係草稿變更。`:`目前沒有草稿變更。`)}),j?(0,o.jsx)(`ul`,{className:v.orgTreeChangeList,children:O.map(e=>(0,o.jsxs)(`li`,{children:[F(e.orgUnitId,D),`:`,F(e.previousParentId,D),` -> `,F(e.parentId,D)]},e.orgUnitId))}):null]}),(0,o.jsx)(`div`,{className:v.orgTreeCanvas,children:(0,o.jsxs)(d.ReactFlow,{connectionMode:d.ConnectionMode.Strict,edges:[...k.edges],fitView:!0,fitViewOptions:{padding:.18},isValidConnection:e=>P({source:e.source,target:e.target},S),maxZoom:1.4,minZoom:.25,nodeTypes:E,nodes:[...w],nodesConnectable:u,nodesDraggable:u,onConnect:ne,onNodeClick:(e,t)=>{x(t.id===y?null:t.id)},onNodeDoubleClick:(e,t)=>{if(t.id!==y){let e=D.get(t.id);e&&n(e)}},onNodeDragStop:re,onNodesChange:N,onPaneClick:()=>x(null),panOnDrag:!0,proOptions:{hideAttribution:!0},children:[(0,o.jsx)(d.Background,{}),(0,o.jsx)(d.Controls,{}),(0,o.jsx)(d.MiniMap,{pannable:!0,zoomable:!0})]})})]})});function O({data:e,selected:t}){return(0,o.jsxs)(`div`,{className:[v.orgTreeNode,e.isSyntheticRoot?v.orgTreeNodeRoot:``,e.changed?v.orgTreeNodeChanged:``,e.deleted?v.orgTreeNodeDeleted:``,t?v.orgTreeNodeSelected:``].filter(Boolean).join(` `),children:[e.isSyntheticRoot?null:(0,o.jsx)(d.Handle,{id:`target`,isConnectable:e.isEditing,position:d.Position.Top,type:`target`}),(0,o.jsx)(d.Handle,{id:`source`,isConnectable:e.isEditing,position:d.Position.Bottom,type:`source`}),(0,o.jsxs)(`div`,{className:v.orgTreeNodeHeader,children:[(0,o.jsx)(i.Typography,{component:`span`,ellipsis:!0,title:e.name,variant:`label-primary`,children:e.name}),e.changed?(0,o.jsx)(`span`,{className:v.orgTreeNodeBadge,children:`草稿`}):null]}),(0,o.jsx)(i.Typography,{color:`text-neutral`,component:`span`,ellipsis:!0,title:e.code,variant:`caption`,children:e.isSyntheticRoot?`根節點容器`:`${e.typeLabel} · ${e.code}`}),e.isSyntheticRoot?null:(0,o.jsxs)(i.Typography,{color:`text-neutral`,component:`span`,ellipsis:!0,title:e.parentLabel,variant:`caption`,children:[`上層:`,e.parentLabel]}),(0,o.jsx)(`div`,{className:v.orgTreeNodeActions,children:e.isSyntheticRoot?(0,o.jsx)(i.Button,{icon:l.PlusIcon,iconType:`leading`,onClick:()=>e.onCreateChild(null),size:`sub`,variant:`base-secondary`,children:`新增根節點`}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.Button,{icon:l.EditIcon,iconType:`leading`,onClick:()=>{e.orgUnitId&&e.onEdit(e.orgUnitId)},size:`sub`,variant:`base-secondary`,children:`編輯`}),(0,o.jsx)(i.Button,{icon:l.PlusIcon,iconType:`leading`,onClick:()=>e.onCreateChild(e.orgUnitId),size:`sub`,variant:`base-secondary`,children:`新增子節點`})]})})]})}function ee({isEditing:e,onCreateChild:t,onEditOrgUnit:n,orgUnits:r,orgUnitsById:i,parentDraft:a,selectedOrgUnitId:o}){let s=new f.graphlib.Graph;s.setDefaultEdgeLabel(()=>({})),s.setGraph({marginx:36,marginy:36,nodesep:44,rankdir:`TB`}),s.setNode(y,{height:C,width:S}),r.forEach(e=>{s.setNode(e.id,{height:x,width:b})}),r.forEach(e=>{let t=a.get(e.id)??null;s.setEdge(t??y,e.id)}),f.layout(s);let c=k({data:{changed:!1,code:y,deleted:!1,isEditing:e,isSyntheticRoot:!0,name:`組織根節點`,onCreateChild:t,onEdit:n,orgUnitId:null,parentLabel:``,path:``,typeLabel:``},graph:s,height:C,id:y,selected:o===null,width:S}),l=r.map(r=>{let c=a.get(r.id)??null,l=F(c,i);return k({data:{changed:c!==r.parentId,code:r.code,deleted:!!r.deletedAt,isEditing:e,isSyntheticRoot:!1,name:r.name,onCreateChild:t,onEdit:n,orgUnitId:r.id,parentLabel:l,path:r.path,typeLabel:re(r.type)},graph:s,height:x,id:r.id,selected:o===r.id,width:b})});return{edges:r.map(t=>{let n=a.get(t.id)??null,r=n!==t.parentId;return{animated:e&&r,data:{},id:`org-tree-edge-${n??`root`}-${t.id}`,source:n??y,sourceHandle:`source`,style:r?{stroke:`var(--mzn-color-primary, #0057ff)`,strokeWidth:2}:void 0,target:t.id,targetHandle:`target`,type:`smoothstep`}}),nodes:[c,...l]}}function k({data:e,graph:t,height:n,id:r,selected:i,width:a}){let o=t.node(r);return{data:e,height:n,id:r,initialHeight:n,initialWidth:a,position:o?{x:o.x-a/2,y:o.y-n/2}:{x:0,y:0},selected:i,sourcePosition:d.Position.Bottom,targetPosition:d.Position.Top,type:`orgUnit`,width:a}}function A(e,t){let n=ne(e);return t.filter(t=>t.id!==e.id).map(e=>({distance:N(n,ne(e)),id:e.id})).filter(e=>e.distance<=w).sort((e,t)=>e.distance-t.distance)[0]?.id}function te(e,t){let n=j(e);if(n)return Array.from(document.querySelectorAll(`.react-flow__node[data-id]`)).map(e=>{let r=e.dataset.id;if(!r||r===t)return null;let i=e.getBoundingClientRect();return{distance:N(n,{x:i.left+i.width/2,y:i.top+i.height/2}),id:r}}).filter(e=>!!e).filter(e=>e.distance<=w).sort((e,t)=>e.distance-t.distance)[0]?.id}function j(e){return M(e)?{x:e.clientX,y:e.clientY}:null}function M(e){return typeof e==`object`&&!!e&&`clientX`in e&&`clientY`in e&&typeof e.clientX==`number`&&typeof e.clientY==`number`}function ne(e){return{x:e.position.x+(e.width??b)/2,y:e.position.y+(e.height??x)/2}}function N(e,t){return Math.hypot(e.x-t.x,e.y-t.y)}function P(e,t){return!e.source||!e.target||e.target===y?!1:g({orgUnitId:e.target,parentDraft:t,parentId:e.source===y?null:e.source})===null}function F(e,t){if(!e)return`根節點`;let n=t.get(e);return n?`${n.name} · ${n.code}`:`未知組織`}function re(e){return T[e.toUpperCase()]??`未知類型`}var I={tableIntroActions:`bpm_tableIntroActions_WO4XU`,modalFields:`bpm_modalFields_juyv6`,tableIntro:`bpm_tableIntro_u3hcm`,tableFrame:`bpm_tableFrame_IdbmB`,orgFilterArea:`bpm_orgFilterArea_Xjbbp`,membershipFilterArea:`bpm_membershipFilterArea_zob-Y`,scopeLabel:`bpm_scopeLabel_TLHMC`},ie={hasDraftChanges:!1,isEditing:!1},L=[{id:`COMPANY`,name:`公司`},{id:`DIVISION`,name:`事業群`},{id:`DEPARTMENT`,name:`部門`},{id:`TEAM`,name:`小組`}],ae={id:`ALL`,name:`全部類型`},oe=[ae,...L],R=[{id:`MEMBER`,name:`指定會員`},{id:`ORG_UNIT`,name:`指定組織`},{id:`POSITION`,name:`指定職位`}],se={id:`ALL`,name:`全部範圍`},z=[se,...R],ce={activeOnly:!1,id:`ALL`,name:`全部狀態`},B=[ce,{activeOnly:!0,id:`ACTIVE`,name:`目前有效`}],V=[{id:`true`,name:`主要歸屬`,value:!0},{id:`false`,name:`一般歸屬`,value:!1}],le=[10,20,50],ue=1368,de=908,fe=1292,pe=1124;function me(){let[e,t]=(0,r.useState)(`ORG_UNITS`),[n,c]=(0,r.useState)(null),[l,d]=(0,r.useState)(null),[f,p]=(0,r.useState)(null),[m,h]=(0,r.useState)(!0),[g,_]=(0,r.useState)(null),[v,y]=(0,r.useState)(ce),[b,x]=(0,r.useState)(1),[S,C]=(0,r.useState)(10),[w,T]=(0,r.useState)(se),[E,D]=(0,r.useState)(0),[O,ee]=(0,r.useState)([]),[k,A]=(0,r.useState)(null),[te,j]=(0,r.useState)(null),[M,ne]=(0,r.useState)(null),[N,P]=(0,r.useState)(1),[F,re]=(0,r.useState)(10),[I,ie]=(0,r.useState)(null),[L,oe]=(0,r.useState)(0),[R,z]=(0,r.useState)(null),[B,V]=(0,r.useState)(1),[le,ue]=(0,r.useState)(10),[de,fe]=(0,r.useState)(``),[pe,me]=(0,r.useState)(0),[H,ye]=(0,r.useState)(ae),[be,xe]=(0,r.useState)(`TABLE`),[U,W]=(0,r.useState)([]),[G,Ne]=(0,r.useState)([]),[Pe,Fe]=(0,r.useState)([]),[Ie,Le]=(0,r.useState)(null),[Re,ze]=(0,r.useState)(1),[Be,Ve]=(0,r.useState)(10),[K,q]=(0,r.useState)(``),[J,He]=(0,r.useState)(0),[X,Ue]=(0,r.useState)([]),[Ge,Ke]=(0,r.useState)([]),[qe,Je]=(0,r.useState)([]),[Z,Ye]=(0,r.useState)(!1);(0,r.useEffect)(()=>{n&&d(n)},[n]);let Xe=n??l,Ze=(0,r.useCallback)(async()=>{h(!0),p(null);try{let e=await(0,u.readOrganizationDashboard)({managerActiveOnly:v.activeOnly,managerPage:b,managerPageSize:S,managerScopeType:w.id===`ALL`?null:w.id,membershipActiveOnly:k?.activeOnly??!1,membershipOrgUnitId:M?.id??null,membershipPage:N,membershipPageSize:F,membershipPositionId:I?.id??null,orgUnitPage:B,orgUnitPageSize:le,orgUnitSearchText:de,orgUnitType:H.id===`ALL`?null:H.id,positionPage:Re,positionPageSize:Be,positionSearchText:K});ee(await(0,a.resolveMembers)(Ee(e.memberships,e.managerResolutions))),W(e.orgUnits),me(e.orgUnitCount),Ne(e.filteredOrgUnits),Ue(e.positions),He(e.positionCount),Fe(e.filteredPositions),oe(e.membershipCount),Je(e.filteredMemberships),D(e.managerResolutionCount),Ke(e.filteredManagerResolutions)}catch(e){p(We(e))}finally{h(!1)}},[v,b,S,w,k,M,N,F,I,B,le,de,H,Re,Be,K]);(0,r.useEffect)(()=>{Ze()},[Ze]);let Q=(0,r.useMemo)(()=>new Map(U.map(e=>[e.id,e])),[U]),Qe=(0,r.useMemo)(()=>new Map(X.map(e=>[e.id,e])),[X]),$=(0,r.useMemo)(()=>new Map(O.map(e=>[e.memberId,e])),[O]),$e=(0,r.useMemo)(()=>G.map(e=>({...e,key:e.id,parentName:e.parentId?ke(Q.get(e.parentId)):`根節點`,typeLabel:Ae(e.type)})),[G,Q]),et=(0,r.useMemo)(()=>Pe.map(e=>({...e,key:e.id})),[Pe]),tt=(0,r.useMemo)(()=>qe.map(e=>({...e,key:e.id,memberName:Oe($.get(e.memberId)),orgUnitName:ke(Q.get(e.orgUnitId)),positionName:e.positionId?je(Qe.get(e.positionId)):`未指定`})),[$,qe,Q,Qe]),nt=(0,r.useMemo)(()=>Ge.map(e=>({...e,key:e.id,managerName:Oe($.get(e.managerMemberId)),scopeLabel:De(e,{membersById:$,orgUnitsById:Q,positionsById:Qe})})),[Ge,$,Q,Qe]),rt=(0,r.useMemo)(()=>({render:e=>[{name:`編輯`,onClick:()=>z({record:e,type:`EDIT`})},{name:`停用`,onClick:()=>c({confirmText:`停用組織`,description:`停用「${e.name}」後,這個組織節點將不再出現在可用組織清單中。`,id:e.id,title:`停用組織節點`,type:`ORG_UNIT`}),variant:`destructive-secondary`}],variant:`base-secondary`,width:128}),[]),it=(0,r.useMemo)(()=>({render:e=>[{name:`編輯`,onClick:()=>Le({record:e,type:`EDIT`})}],variant:`base-secondary`,width:88}),[]),at=(0,r.useMemo)(()=>({render:e=>[{name:`編輯`,onClick:()=>j({record:e,type:`EDIT`})},{name:`刪除`,onClick:()=>c({confirmText:`刪除歸屬`,description:`刪除「${e.memberName}」在「${e.orgUnitName}」的會員歸屬。`,id:e.id,title:`刪除會員歸屬`,type:`MEMBERSHIP`}),variant:`destructive-secondary`}],variant:`base-secondary`,width:128}),[]),ot=(0,r.useMemo)(()=>({render:e=>[{name:`編輯`,onClick:()=>_({record:e,type:`EDIT`})},{name:`刪除`,onClick:()=>c({confirmText:`刪除主管規則`,description:`刪除「${e.scopeLabel}」指派給「${e.managerName}」的主管解析規則。`,id:e.id,title:`刪除主管解析規則`,type:`MANAGER_RESOLUTION`}),variant:`destructive-secondary`}],variant:`base-secondary`,width:128}),[]);function st(e){V(1),fe(e)}function ct(e){V(1),ye(e)}function lt(e){ze(1),q(e)}function ut(e){P(1),A(e)}function dt(e){P(1),ne(e)}function ft(e){P(1),ie(e)}function pt(e){x(1),y(e)}function mt(e){x(1),T(e)}function ht(){Z||c(null)}async function gt(){n&&await vt(async()=>{n.type===`ORG_UNIT`&&await(0,u.deleteOrgUnit)(n.id),n.type===`MEMBERSHIP`&&await(0,u.deleteMembership)(n.id),n.type===`MANAGER_RESOLUTION`&&await(0,u.deleteManagerResolution)(n.id),c(null)})}async function _t(e){Ye(!0),p(null);try{await(0,u.commitOrgUnitTreeDraft)({moves:e.map(e=>({baseUpdatedAt:Q.get(e.orgUnitId)?.updatedAt??``,id:e.orgUnitId,parentId:e.parentId}))}),await Ze()}catch(e){throw p(We(e)),e}finally{Ye(!1)}}async function vt(e){Ye(!0),p(null);try{await e(),await Ze()}catch(e){p(We(e))}finally{Ye(!1)}}return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.PageHeader,{children:(0,o.jsx)(s.default,{description:`維護組織樹、職位、會員歸屬與簽核主管解析規則。`,title:`組織管理`})}),(0,o.jsx)(i.SectionGroup,{children:(0,o.jsxs)(i.Section,{tab:(0,o.jsxs)(i.Tab,{activeKey:e,onChange:e=>t(Me(e)),children:[(0,o.jsx)(i.TabItem,{children:`組織樹`},`ORG_UNITS`),(0,o.jsx)(i.TabItem,{children:`職位`},`POSITIONS`),(0,o.jsx)(i.TabItem,{children:`會員歸屬`},`MEMBERSHIPS`),(0,o.jsx)(i.TabItem,{children:`簽核主管`},`MANAGERS`)]}),children:[f?(0,o.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:f}):null,e===`ORG_UNITS`?(0,o.jsx)(he,{actions:rt,loading:m,onCreate:()=>z({parentId:null,record:null,type:`CREATE`}),onCreateChild:e=>z({parentId:e,record:null,type:`CREATE`}),onEditOrgUnit:e=>z({record:e,type:`EDIT`}),onPageChange:V,onSaveDraft:_t,onPageSizeChange:e=>{V(1),ue(e)},onSearchTextChange:st,onTypeFilterChange:ct,orgUnits:U,page:B,pageSize:le,rows:$e,searchText:de,saving:Z,total:pe,typeFilter:H,viewMode:be,onViewModeChange:xe}):null,e===`POSITIONS`?(0,o.jsx)(ge,{actions:it,loading:m,onCreate:()=>Le({record:null,type:`CREATE`}),onPageChange:ze,onPageSizeChange:e=>{ze(1),Ve(e)},onSearchTextChange:lt,page:Re,pageSize:Be,rows:et,searchText:K,total:J}):null,e===`MEMBERSHIPS`?(0,o.jsx)(_e,{actions:at,loading:m,onCreate:()=>j({record:null,type:`CREATE`}),onActiveFilterChange:ut,onOrgUnitFilterChange:dt,onPageChange:P,onPageSizeChange:e=>{P(1),re(e)},onPositionFilterChange:ft,orgUnitFilter:M,orgUnits:U,page:N,pageSize:F,positionFilter:I,positions:X,rows:tt,statusFilter:k,total:L}):null,e===`MANAGERS`?(0,o.jsx)(ve,{actions:ot,loading:m,onCreate:()=>_({record:null,type:`CREATE`}),onActiveFilterChange:pt,onPageChange:x,onPageSizeChange:e=>{x(1),C(e)},onScopeTypeFilterChange:mt,page:b,pageSize:S,rows:nt,scopeTypeFilter:w,statusFilter:v,total:E}):null]})}),(0,o.jsx)(Se,{modal:R,onClose:()=>z(null),onSubmit:e=>vt(async()=>{R?.type===`EDIT`&&R.record?await(0,u.updateOrgUnit)({...e,id:R.record.id,metadataJson:null}):await(0,u.createOrgUnit)({code:e.code??``,metadataJson:`{}`,name:e.name??``,parentId:e.parentId,type:e.type??`DEPARTMENT`}),z(null)}),orgUnits:U,saving:Z}),(0,o.jsx)(Ce,{modal:Ie,onClose:()=>Le(null),onSubmit:e=>vt(async()=>{Ie?.type===`EDIT`&&Ie.record?await(0,u.updatePosition)({...e,id:Ie.record.id,metadataJson:null}):await(0,u.createPosition)({code:e.code??``,level:e.level??0,metadataJson:`{}`,name:e.name??``}),Le(null)}),saving:Z}),(0,o.jsx)(we,{membersById:$,modal:te,onClose:()=>j(null),onSubmit:e=>vt(async()=>{te?.type===`EDIT`&&te.record?await(0,u.updateMembership)({...e,id:te.record.id}):await(0,u.createMembership)({effectiveFrom:e.effectiveFrom??Y(),effectiveTo:e.effectiveTo,isPrimary:e.isPrimary??!1,memberId:e.memberId??``,orgUnitId:e.orgUnitId??``,positionId:e.positionId}),j(null)}),orgUnits:U,positions:X,saving:Z}),(0,o.jsx)(Te,{membersById:$,modal:g,onClose:()=>_(null),onSubmit:e=>vt(async()=>{g?.type===`EDIT`&&g.record?await(0,u.updateManagerResolution)({...e,id:g.record.id}):await(0,u.createManagerResolution)({effectiveFrom:e.effectiveFrom??Y(),effectiveTo:e.effectiveTo,managerMemberId:e.managerMemberId??``,priority:e.priority??0,scopeId:e.scopeId??``,scopeType:e.scopeType??`MEMBER`}),_(null)}),orgUnits:U,positions:X,saving:Z}),(0,o.jsx)(i.Modal,{cancelText:`取消`,confirmButtonProps:{variant:`destructive-primary`},confirmText:Xe?.confirmText??``,loading:Z,modalStatusType:`error`,modalType:`standard`,onCancel:ht,onClose:ht,onConfirm:()=>void gt(),open:!!n,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`此操作會立即套用,請確認後再繼續。`,title:Xe?.title??``,children:(0,o.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:Xe?.description??``})})]})}function he({actions:e,loading:t,onCreate:n,onCreateChild:a,onEditOrgUnit:s,onPageChange:u,onSaveDraft:d,onPageSizeChange:f,onSearchTextChange:p,onTypeFilterChange:m,onViewModeChange:h,orgUnits:g,page:_,pageSize:v,rows:y,searchText:b,saving:x,total:S,typeFilter:C,viewMode:w}){let T=(0,r.useRef)(null),[E,O]=(0,r.useState)(ie),ee=w===`TABLE`?`FLOW`:`TABLE`,k=w===`TABLE`?`切換樹狀圖`:`切換表格`,A=w===`FLOW`,te=ye({isTreeMode:A,isTreeEditing:E.isEditing}),j=be({isTreeMode:A,isTreeEditing:E.isEditing}),M=xe({hasDraftChanges:E.hasDraftChanges,isTreeEditing:E.isEditing,isTreeMode:A,loading:t,saving:x}),ne=(0,r.useMemo)(()=>[{dataIndex:`code`,key:`code`,title:`代碼`,width:180},{dataIndex:`name`,key:`name`,title:`名稱`,width:240},{dataIndex:`typeLabel`,key:`typeLabel`,title:`類型`,width:120},{dataIndex:`parentName`,key:`parentName`,title:`上層`,width:280},{dataIndex:`path`,key:`path`,title:`Path`,width:420}],[]);return(0,r.useEffect)(()=>{w===`TABLE`&&O(ie)},[w]),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(U,{actionDisabled:M,actionIcon:j,actionLabel:te,actions:(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.Button,{onClick:()=>h(ee),variant:`base-secondary`,children:k}),A&&E.isEditing?(0,o.jsx)(i.Button,{disabled:x,icon:l.CloseIcon,iconType:`leading`,onClick:()=>T.current?.cancelEditing(),variant:`base-secondary`,children:`取消`}):null]}),description:`組織節點使用 ltree path 維護階層,搬移節點會同步更新子節點 path。`,onCreate:()=>{if(!A){n();return}if(E.isEditing){T.current?.saveDraft();return}T.current?.startEditing()},title:`組織樹`}),w===`TABLE`?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.FilterArea,{className:I.orgFilterArea,size:`sub`,children:(0,o.jsxs)(i.FilterLine,{children:[(0,o.jsx)(i.Filter,{span:3,children:(0,o.jsx)(i.FormField,{fullWidth:!0,layout:c.FormFieldLayout.VERTICAL,name:`orgUnitSearchText`,children:(0,o.jsx)(i.Input,{fullWidth:!0,onChange:e=>p(e.target.value),placeholder:`搜尋組織名稱或代碼`,size:`sub`,value:b,variant:`base`})})}),(0,o.jsx)(i.Filter,{span:2,children:(0,o.jsx)(i.FormField,{fullWidth:!0,layout:c.FormFieldLayout.VERTICAL,name:`orgUnitTypeFilter`,children:(0,o.jsx)(i.Select,{clearable:!1,fullWidth:!0,onChange:e=>m(Pe(e)),options:[...oe],placeholder:`類型`,size:`sub`,value:C})})})]})}),(0,o.jsx)(`div`,{className:I.tableFrame,children:(0,o.jsx)(i.Table,{actions:e,columns:ne,dataSource:[...y],fullWidth:!0,loading:t,pagination:H({onPageChange:u,onPageSizeChange:f,page:_,pageSize:v,total:S}),style:{minWidth:ue}})})]}):(0,o.jsx)(D,{ref:T,onCreateChild:a,onCreateRoot:n,onEditOrgUnit:s,onSaveDraft:d,onStateChange:O,orgUnits:g,saving:x})]})}function ge({actions:e,loading:t,onCreate:n,onPageChange:a,onPageSizeChange:s,onSearchTextChange:l,page:u,pageSize:d,rows:f,searchText:p,total:m}){let h=(0,r.useMemo)(()=>[{dataIndex:`code`,key:`code`,title:`代碼`,width:180},{dataIndex:`name`,key:`name`,title:`名稱`,width:280},{dataIndex:`level`,key:`level`,title:`職等`,width:96},{dataIndex:`updatedAt`,key:`updatedAt`,title:`更新時間`,width:220}],[]);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(U,{actionLabel:`新增職位`,description:`職位提供會員歸屬與主管解析規則使用。`,onCreate:n,title:`職位`}),(0,o.jsx)(i.FilterArea,{className:I.orgFilterArea,size:`sub`,children:(0,o.jsx)(i.FilterLine,{children:(0,o.jsx)(i.Filter,{span:3,children:(0,o.jsx)(i.FormField,{fullWidth:!0,layout:c.FormFieldLayout.VERTICAL,name:`positionSearchText`,children:(0,o.jsx)(i.Input,{fullWidth:!0,onChange:e=>l(e.target.value),placeholder:`搜尋職位名稱或代碼`,size:`sub`,value:p,variant:`base`})})})})}),(0,o.jsx)(`div`,{className:I.tableFrame,children:(0,o.jsx)(i.Table,{actions:e,columns:h,dataSource:[...f],fullWidth:!0,loading:t,pagination:H({onPageChange:a,onPageSizeChange:s,page:u,pageSize:d,total:m}),style:{minWidth:de}})})]})}function _e({actions:e,loading:n,onCreate:a,onActiveFilterChange:s,onOrgUnitFilterChange:l,onPageChange:u,onPageSizeChange:d,onPositionFilterChange:f,orgUnitFilter:p,orgUnits:m,page:h,pageSize:g,positionFilter:_,positions:v,rows:y,statusFilter:b,total:x}){let S=(0,r.useMemo)(()=>[{dataIndex:`memberName`,key:`memberName`,title:`會員`,width:280},{dataIndex:`orgUnitName`,key:`orgUnitName`,title:`組織`,width:280},{dataIndex:`positionName`,key:`positionName`,title:`職位`,width:220},{key:`isPrimary`,render:e=>e.isPrimary?`主要`:`一般`,title:`類型`,width:104},{dataIndex:`effectiveFrom`,key:`effectiveFrom`,title:`生效日`,width:140},{dataIndex:`effectiveTo`,key:`effectiveTo`,title:`結束日`,width:140}],[]),C=(0,r.useMemo)(()=>m.map(t.a),[m]),w=(0,r.useMemo)(()=>v.map(t.o),[v]);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(U,{actionLabel:`新增歸屬`,description:`會員歸屬是 BPM 內部組織權限、主管解析與條件判斷的來源。`,onCreate:a,title:`會員歸屬`}),(0,o.jsx)(i.FilterArea,{className:[I.orgFilterArea,I.membershipFilterArea].join(` `),size:`sub`,children:(0,o.jsxs)(i.FilterLine,{children:[(0,o.jsx)(i.Filter,{span:2,children:(0,o.jsx)(i.FormField,{fullWidth:!0,layout:c.FormFieldLayout.VERTICAL,name:`membershipOrgUnitFilter`,children:(0,o.jsx)(i.AutoComplete,{disabledOptionsFilter:!0,emptyText:`沒有符合的組織`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`membershipOrgUnitFilter`,spellCheck:!1},mode:`single`,name:`membershipOrgUnitFilter`,onChange:e=>l(ze(e)),options:[...C],placeholder:`全部組織`,size:`sub`,value:p})})}),(0,o.jsx)(i.Filter,{span:2,children:(0,o.jsx)(i.FormField,{fullWidth:!0,layout:c.FormFieldLayout.VERTICAL,name:`membershipPositionFilter`,children:(0,o.jsx)(i.AutoComplete,{disabledOptionsFilter:!0,emptyText:`沒有符合的職位`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`membershipPositionFilter`,spellCheck:!1},mode:`single`,name:`membershipPositionFilter`,onChange:e=>f(Be(e)),options:[...w],placeholder:`全部職位`,size:`sub`,value:_})})}),(0,o.jsx)(i.Filter,{span:2,children:(0,o.jsx)(i.FormField,{fullWidth:!0,layout:c.FormFieldLayout.VERTICAL,name:`membershipStatusFilter`,children:(0,o.jsx)(i.AutoComplete,{disabledOptionsFilter:!0,emptyText:`沒有符合的狀態`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`membershipStatusFilter`,spellCheck:!1},mode:`single`,name:`membershipStatusFilter`,onChange:e=>s(Re(e)),options:[...B],placeholder:`全部狀態`,size:`sub`,value:b})})})]})}),(0,o.jsx)(`div`,{className:I.tableFrame,children:(0,o.jsx)(i.Table,{actions:e,columns:S,dataSource:[...y],fullWidth:!0,loading:n,pagination:H({onPageChange:u,onPageSizeChange:d,page:h,pageSize:g,total:x}),style:{minWidth:fe}})})]})}function ve({actions:e,loading:t,onCreate:n,onActiveFilterChange:a,onPageChange:s,onPageSizeChange:l,onScopeTypeFilterChange:u,page:d,pageSize:f,rows:p,scopeTypeFilter:m,statusFilter:h,total:g}){let _=(0,r.useMemo)(()=>[{dataIndex:`scopeLabel`,key:`scopeLabel`,title:`套用範圍`,width:320},{dataIndex:`managerName`,key:`managerName`,title:`簽核主管`,width:300},{dataIndex:`priority`,key:`priority`,title:`優先序`,width:96},{dataIndex:`effectiveFrom`,key:`effectiveFrom`,title:`生效日`,width:140},{dataIndex:`effectiveTo`,key:`effectiveTo`,title:`結束日`,width:140}],[]);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(U,{actionLabel:`新增主管規則`,description:`簽核主管規則獨立於組織樹 parent,解析優先序為會員、組織、職位。`,onCreate:n,title:`簽核主管`}),(0,o.jsx)(i.FilterArea,{className:I.orgFilterArea,size:`sub`,children:(0,o.jsxs)(i.FilterLine,{children:[(0,o.jsx)(i.Filter,{span:3,children:(0,o.jsx)(i.FormField,{fullWidth:!0,layout:c.FormFieldLayout.VERTICAL,name:`managerScopeTypeFilter`,children:(0,o.jsx)(i.Select,{clearable:!1,fullWidth:!0,onChange:e=>u(Ie(e)),options:[...z],placeholder:`套用範圍`,size:`sub`,value:m})})}),(0,o.jsx)(i.Filter,{span:2,children:(0,o.jsx)(i.FormField,{fullWidth:!0,layout:c.FormFieldLayout.VERTICAL,name:`managerStatusFilter`,children:(0,o.jsx)(i.Select,{clearable:!1,fullWidth:!0,onChange:e=>a(Le(e)),options:[...B],placeholder:`狀態`,size:`sub`,value:h})})})]})}),(0,o.jsx)(`div`,{className:I.tableFrame,children:(0,o.jsx)(i.Table,{actions:e,columns:_,dataSource:[...p],fullWidth:!0,loading:t,pagination:H({onPageChange:s,onPageSizeChange:l,page:d,pageSize:f,total:g}),style:{minWidth:pe}})})]})}function H({onPageChange:e,onPageSizeChange:t,page:n,pageSize:r,total:i}){return{current:n,onChange:e,onChangePageSize:t,pageSize:r,pageSizeLabel:`每頁筆數`,pageSizeOptions:[...le],renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:i}}function ye({isTreeEditing:e,isTreeMode:t}){return t?e?`儲存`:`開始編輯`:`新增組織`}function be({isTreeEditing:e,isTreeMode:t}){return t?e?l.SaveIcon:l.EditIcon:l.PlusIcon}function xe({hasDraftChanges:e,isTreeEditing:t,isTreeMode:n,loading:r,saving:i}){return n?t?!e||i:r:!1}function U({actionDisabled:e=!1,actionIcon:t=l.PlusIcon,actionLabel:n,actions:r,description:a,onCreate:s,title:c}){return(0,o.jsxs)(`div`,{className:I.tableIntro,children:[(0,o.jsxs)(`div`,{children:[(0,o.jsx)(i.Typography,{component:`h2`,variant:`h3`,children:c}),(0,o.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:a})]}),(0,o.jsxs)(`div`,{className:I.tableIntroActions,children:[r,(0,o.jsx)(i.Button,{disabled:e,icon:t,iconType:`leading`,onClick:s,children:n})]})]})}function Se({modal:e,onClose:a,onSubmit:s,orgUnits:c,saving:l}){let[u,d]=(0,r.useState)(``),[f,p]=(0,r.useState)(``),[m,h]=(0,r.useState)(null),[g,_]=(0,r.useState)(L[2]);return(0,r.useEffect)(()=>{if(!e)return;let n=e.record,r=n?.parentId??e.parentId??null,i=r?c.find(e=>e.id===r)??null:null;d(n?.code??``),p(n?.name??``),h(i?t.a(i):null),_(L.find(e=>e.id===n?.type)??L[2])},[e,c]),(0,o.jsx)(i.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!u||!f},confirmText:e?.type===`EDIT`?`儲存`:`建立`,loading:l,modalType:`standard`,onCancel:a,onClose:a,onConfirm:()=>void s({code:u,name:f,parentId:m?.id??null,type:g.id}),open:!!e,showModalFooter:!0,showModalHeader:!0,size:`regular`,title:e?.type===`EDIT`?`編輯組織`:`新增組織`,children:(0,o.jsxs)(`div`,{className:I.modalFields,children:[(0,o.jsx)(W,{label:`代碼`,name:`orgCode`,onChange:d,placeholder:`例如 FIN-TW`,value:u}),(0,o.jsx)(W,{label:`名稱`,name:`orgName`,onChange:p,placeholder:`例如 財務部`,value:f}),(0,o.jsx)(n.t,{label:`類型`,name:`orgType`,children:(0,o.jsx)(i.Select,{clearable:!1,fullWidth:!0,onChange:e=>_(Ne(e)),options:[...L],placeholder:`選擇組織類型`,value:g})}),(0,o.jsx)(n.t,{label:`上層組織`,name:`parentId`,children:(0,o.jsx)(t.n,{name:`parentId`,onChange:h,orgUnits:c.filter(t=>t.id!==e?.record?.id),placeholder:`選擇上層組織`,value:m})})]})})}function Ce({modal:e,onClose:t,onSubmit:n,saving:a}){let[s,c]=(0,r.useState)(``),[l,u]=(0,r.useState)(`0`),[d,f]=(0,r.useState)(``);return(0,r.useEffect)(()=>{e&&(c(e.record?.code??``),u(String(e.record?.level??0)),f(e.record?.name??``))},[e]),(0,o.jsx)(i.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!s||!d},confirmText:e?.type===`EDIT`?`儲存`:`建立`,loading:a,modalType:`standard`,onCancel:t,onClose:t,onConfirm:()=>void n({code:s,level:Number(l),name:d}),open:!!e,showModalFooter:!0,showModalHeader:!0,size:`regular`,title:e?.type===`EDIT`?`編輯職位`:`新增職位`,children:(0,o.jsxs)(`div`,{className:I.modalFields,children:[(0,o.jsx)(W,{label:`代碼`,name:`positionCode`,onChange:c,placeholder:`例如 FIN-MGR`,value:s}),(0,o.jsx)(W,{label:`名稱`,name:`positionName`,onChange:f,placeholder:`例如 財務主管`,value:d}),(0,o.jsx)(W,{label:`職等`,name:`positionLevel`,onChange:u,placeholder:`例如 5`,value:l})]})})}function we({membersById:e,modal:a,onClose:s,onSubmit:c,orgUnits:l,positions:u,saving:d}){let[f,p]=(0,r.useState)(Y()),[m,h]=(0,r.useState)(``),[g,_]=(0,r.useState)(V[1]),[v,y]=(0,r.useState)(null),[b,x]=(0,r.useState)(null),[S,C]=(0,r.useState)(null);return(0,r.useEffect)(()=>{if(!a)return;let n=a.record,r=n?e.get(n.memberId):null;p(n?.effectiveFrom??Y()),h(n?.effectiveTo??``),_(V.find(e=>e.value===n?.isPrimary)??V[1]),y(r?t.i(r):null),x(J(l.find(e=>e.id===n?.orgUnitId),t.a)),C(J(u.find(e=>e.id===n?.positionId),t.o))},[e,a,l,u]),(0,o.jsx)(i.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!v||!b},confirmText:a?.type===`EDIT`?`儲存`:`建立`,loading:d,modalType:`standard`,onCancel:s,onClose:s,onConfirm:()=>void c({effectiveFrom:f,effectiveTo:m||null,isPrimary:g.value,memberId:v?.id??null,orgUnitId:b?.id??null,positionId:S?.id??null}),open:!!a,showModalFooter:!0,showModalHeader:!0,size:`regular`,title:a?.type===`EDIT`?`編輯會員歸屬`:`新增會員歸屬`,children:(0,o.jsxs)(`div`,{className:I.modalFields,children:[(0,o.jsx)(n.t,{label:`會員`,name:`memberId`,children:(0,o.jsx)(t.t,{name:`memberId`,onChange:y,placeholder:`搜尋會員姓名或信箱`,value:v})}),(0,o.jsx)(n.t,{label:`組織`,name:`orgUnitId`,children:(0,o.jsx)(t.n,{name:`orgUnitId`,onChange:x,orgUnits:l,placeholder:`選擇歸屬組織`,value:b})}),(0,o.jsx)(n.t,{label:`職位`,name:`positionId`,children:(0,o.jsx)(t.r,{name:`positionId`,onChange:C,placeholder:`選擇職位`,positions:u,value:S})}),(0,o.jsx)(n.t,{label:`歸屬類型`,name:`isPrimary`,children:(0,o.jsx)(i.Select,{clearable:!1,fullWidth:!0,onChange:e=>_(Ve(e)),options:[...V],placeholder:`選擇歸屬類型`,value:g})}),(0,o.jsx)(G,{label:`生效日`,name:`membershipEffectiveFrom`,onChange:p,placeholder:`YYYY-MM-DD`,value:f}),(0,o.jsx)(G,{label:`結束日`,name:`membershipEffectiveTo`,onChange:h,placeholder:`YYYY-MM-DD,未設定代表無期限`,value:m})]})})}function Te({membersById:e,modal:a,onClose:s,onSubmit:c,orgUnits:l,positions:u,saving:d}){let[f,p]=(0,r.useState)(Y()),[m,h]=(0,r.useState)(``),[g,_]=(0,r.useState)(null),[v,y]=(0,r.useState)(`0`),[b,x]=(0,r.useState)(null),[S,C]=(0,r.useState)(null),[w,T]=(0,r.useState)(null),[E,D]=(0,r.useState)(R[0]);(0,r.useEffect)(()=>{if(!a)return;let n=a.record,r=R.find(e=>e.id===n?.scopeType)??R[0];p(n?.effectiveFrom??Y()),h(n?.effectiveTo??``),_(J(n?e.get(n.managerMemberId):null,t.i)),y(String(n?.priority??0)),x(r.id===`MEMBER`?J(n?e.get(n.scopeId):null,t.i):null),C(r.id===`ORG_UNIT`?J(l.find(e=>e.id===n?.scopeId),t.a):null),T(r.id===`POSITION`?J(u.find(e=>e.id===n?.scopeId),t.o):null),D(r)},[e,a,l,u]);let O=E.id===`MEMBER`?b?.id:E.id===`ORG_UNIT`?S?.id:w?.id,ee=!!(E.id===`MEMBER`&&b?.id&&g?.id&&b.id===g.id);return(0,o.jsx)(i.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!g||!O||ee},confirmText:a?.type===`EDIT`?`儲存`:`建立`,loading:d,modalType:`standard`,onCancel:s,onClose:s,onConfirm:()=>void c({effectiveFrom:f,effectiveTo:m||null,managerMemberId:g?.id??null,priority:Number(v),scopeId:O??null,scopeType:E.id}),open:!!a,showModalFooter:!0,showModalHeader:!0,size:`regular`,title:a?.type===`EDIT`?`編輯主管規則`:`新增主管規則`,children:(0,o.jsxs)(`div`,{className:I.modalFields,children:[(0,o.jsx)(n.t,{label:`套用範圍`,name:`scopeType`,children:(0,o.jsx)(i.Select,{clearable:!1,fullWidth:!0,onChange:e=>D(Fe(e)),options:[...R],placeholder:`選擇套用範圍`,value:E})}),E.id===`MEMBER`?(0,o.jsx)(n.t,{label:`會員`,name:`scopeMemberId`,children:(0,o.jsx)(t.t,{name:`scopeMemberId`,onChange:x,placeholder:`搜尋套用會員`,value:b})}):null,E.id===`ORG_UNIT`?(0,o.jsx)(n.t,{label:`組織`,name:`scopeOrgUnitId`,children:(0,o.jsx)(t.n,{name:`scopeOrgUnitId`,onChange:C,orgUnits:l,placeholder:`選擇套用組織`,value:S})}):null,E.id===`POSITION`?(0,o.jsx)(n.t,{label:`職位`,name:`scopePositionId`,children:(0,o.jsx)(t.r,{name:`scopePositionId`,onChange:T,placeholder:`選擇套用職位`,positions:u,value:w})}):null,(0,o.jsx)(n.t,{label:`簽核主管`,name:`managerMemberId`,children:(0,o.jsx)(t.t,{name:`managerMemberId`,onChange:_,placeholder:`搜尋簽核主管`,value:g})}),ee?(0,o.jsx)(i.Typography,{color:`text-error`,variant:`caption`,children:`簽核主管不可設定為套用會員本人。`}):null,(0,o.jsx)(W,{label:`優先序`,name:`managerPriority`,onChange:y,placeholder:`例如 10`,value:v}),(0,o.jsx)(G,{label:`生效日`,name:`managerEffectiveFrom`,onChange:p,placeholder:`YYYY-MM-DD`,value:f}),(0,o.jsx)(G,{label:`結束日`,name:`managerEffectiveTo`,onChange:h,placeholder:`YYYY-MM-DD,未設定代表無期限`,value:m})]})})}function W({label:e,name:t,onChange:r,placeholder:a,value:s}){return(0,o.jsx)(n.t,{label:e,name:t,children:(0,o.jsx)(i.Input,{fullWidth:!0,name:t,onChange:e=>r(e.target.value),placeholder:a,value:s})})}function G({label:e,name:t,onChange:r,placeholder:a,value:s}){return(0,o.jsx)(n.t,{label:e,name:t,children:(0,o.jsx)(i.DatePicker,{format:`YYYY-MM-DD`,fullWidth:!0,inputProps:{name:t},onChange:e=>r(He(e)),placeholder:a,value:s.trim()?s:void 0})})}function Ee(e,t){return[...new Set([...e.map(e=>e.memberId),...t.map(e=>e.managerMemberId),...t.filter(e=>e.scopeType===`MEMBER`).map(e=>e.scopeId)])]}function De(e,t){return e.scopeType===`MEMBER`?`會員:${Oe(t.membersById.get(e.scopeId))}`:e.scopeType===`ORG_UNIT`?`組織:${ke(t.orgUnitsById.get(e.scopeId))}`:`職位:${je(t.positionsById.get(e.scopeId))}`}function Oe(e){return e?`${e.name} · ${e.email}`:`未知會員`}function ke(e){return e?`${e.name} · ${e.code}`:`未知組織`}function Ae(e){return L.find(t=>t.id.toLowerCase()===e.toLowerCase())?.name??`未知類型`}function je(e){return e?`${e.name} · ${e.code}`:`未指定`}function Me(e){return e===`MANAGERS`||e===`MEMBERSHIPS`||e===`POSITIONS`?e:`ORG_UNITS`}function Ne(e){let t=q(e)?e:null;if(typeof t?.id==`string`){let e=t.id;return L.find(t=>t.id.toLowerCase()===e.toLowerCase())??L[2]}return L[2]}function Pe(e){let t=q(e)?e:null;if(typeof t?.id==`string`){let e=t.id;return oe.find(t=>t.id.toLowerCase()===e.toLowerCase())??ae}return ae}function Fe(e){return K(e,R,R[0])}function Ie(e){return K(e,z,se)}function Le(e){return K(e,B,ce)}function Re(e){let t=q(e)?e:null,n=typeof t?.id==`string`?t.id:null;return B.find(e=>e.id===n)??null}function ze(e){let t=q(e)?e:null,n=typeof t?.id==`string`?t.id:null,r=typeof t?.name==`string`?t.name:null;return n&&r?{id:n,name:r}:null}function Be(e){let t=q(e)?e:null,n=typeof t?.id==`string`?t.id:null,r=typeof t?.name==`string`?t.name:null;return n&&r?{id:n,name:r}:null}function Ve(e){return K(e,V,V[1])}function K(e,t,n){let r=q(e)?e:null,i=typeof r?.id==`string`?r.id:null;return t.find(e=>e.id===i)??n}function q(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function J(e,t){return e?t(e):null}function Y(){return X(new Date)}function He(e){let t=e?new Date(e):null;return t&&!Number.isNaN(t.getTime())?X(t):``}function X(e){return`${e.getFullYear()}-${Ue(e.getMonth()+1)}-${Ue(e.getDate())}`}function Ue(e){return String(e).padStart(2,`0`)}function We(e){return e instanceof Error?e.message:`讀取組織資料失敗。`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return me}});
|
|
2
|
+
//# sourceMappingURL=orgs-BIiqzHvb.cjs.map
|