@rytass/bpm-core-react 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/dist/chunks/app-navigation-BSkMsEhy.js +268 -0
  3. package/dist/chunks/app-navigation-BSkMsEhy.js.map +1 -0
  4. package/dist/chunks/app-navigation-KnlJCUp1.cjs +2 -0
  5. package/dist/chunks/app-navigation-KnlJCUp1.cjs.map +1 -0
  6. package/dist/chunks/approval-instance-list-page-CVXgE2K3.cjs +2 -0
  7. package/dist/chunks/approval-instance-list-page-CVXgE2K3.cjs.map +1 -0
  8. package/dist/chunks/{approval-instance-list-page-nmzMrj0b.js → approval-instance-list-page-CqNdoZqx.js} +73 -72
  9. package/dist/chunks/approval-instance-list-page-CqNdoZqx.js.map +1 -0
  10. package/dist/chunks/builder-CMlJfQHE.cjs +3 -0
  11. package/dist/chunks/builder-CMlJfQHE.cjs.map +1 -0
  12. package/dist/chunks/{builder-DqZskyXC.js → builder-D950gct_.js} +492 -491
  13. package/dist/chunks/builder-D950gct_.js.map +1 -0
  14. package/dist/chunks/categories-5yEM3p3N.cjs +2 -0
  15. package/dist/chunks/categories-5yEM3p3N.cjs.map +1 -0
  16. package/dist/chunks/{categories-DTEl182t.js → categories-BIpOG451.js} +115 -114
  17. package/dist/chunks/categories-BIpOG451.js.map +1 -0
  18. package/dist/chunks/dashboard-page-1K_jQXQk.cjs +2 -0
  19. package/dist/chunks/dashboard-page-1K_jQXQk.cjs.map +1 -0
  20. package/dist/chunks/dashboard-page-R_T2OEiE.js +122 -0
  21. package/dist/chunks/dashboard-page-R_T2OEiE.js.map +1 -0
  22. package/dist/chunks/{delegations-C5PzZ5Kn.js → delegations-B2j-wNEO.js} +193 -192
  23. package/dist/chunks/delegations-B2j-wNEO.js.map +1 -0
  24. package/dist/chunks/delegations-CsB9ozLu.cjs +2 -0
  25. package/dist/chunks/delegations-CsB9ozLu.cjs.map +1 -0
  26. package/dist/chunks/delegations-CvtwTXNP.cjs +2 -0
  27. package/dist/chunks/delegations-CvtwTXNP.cjs.map +1 -0
  28. package/dist/chunks/{delegations-C-ZrwzvU.js → delegations-dKodb0WW.js} +175 -174
  29. package/dist/chunks/delegations-dKodb0WW.js.map +1 -0
  30. package/dist/chunks/{detail-CfFyU5zC.js → detail-BcGAqJ_R.js} +465 -464
  31. package/dist/chunks/detail-BcGAqJ_R.js.map +1 -0
  32. package/dist/chunks/detail-CqjqLd65.cjs +2 -0
  33. package/dist/chunks/detail-CqjqLd65.cjs.map +1 -0
  34. package/dist/chunks/{format-date-time-isOa3e9q.cjs → format-date-time-26_pFvv4.cjs} +2 -2
  35. package/dist/chunks/{format-date-time-isOa3e9q.cjs.map → format-date-time-26_pFvv4.cjs.map} +1 -1
  36. package/dist/chunks/notifications-2swRqDPF.js +198 -0
  37. package/dist/chunks/notifications-2swRqDPF.js.map +1 -0
  38. package/dist/chunks/notifications-BaYDebFt.cjs +2 -0
  39. package/dist/chunks/notifications-BaYDebFt.cjs.map +1 -0
  40. package/dist/chunks/{orgs-xrdhb3hS.js → orgs-CuHxxd_n.js} +608 -607
  41. package/dist/chunks/orgs-CuHxxd_n.js.map +1 -0
  42. package/dist/chunks/orgs-YMiVLNvL.cjs +2 -0
  43. package/dist/chunks/orgs-YMiVLNvL.cjs.map +1 -0
  44. package/dist/chunks/routes-config-2aKbWq2H.cjs +2 -0
  45. package/dist/chunks/routes-config-2aKbWq2H.cjs.map +1 -0
  46. package/dist/chunks/routes-config-dxahImVe.js +43 -0
  47. package/dist/chunks/routes-config-dxahImVe.js.map +1 -0
  48. package/dist/chunks/templates-DTkbSgFY.cjs +2 -0
  49. package/dist/chunks/templates-DTkbSgFY.cjs.map +1 -0
  50. package/dist/chunks/templates-DoDWM68t.js +384 -0
  51. package/dist/chunks/templates-DoDWM68t.js.map +1 -0
  52. package/dist/chunks/users-3ySyUW4u.cjs +2 -0
  53. package/dist/chunks/users-3ySyUW4u.cjs.map +1 -0
  54. package/dist/chunks/{users-CY4-NK3j.js → users-sMfrSjRQ.js} +75 -74
  55. package/dist/chunks/users-sMfrSjRQ.js.map +1 -0
  56. package/dist/index.cjs +1 -1
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.d.ts +1 -0
  59. package/dist/index.js +101 -99
  60. package/dist/index.js.map +1 -1
  61. package/dist/lib/routes-config.d.ts +96 -0
  62. package/dist/next/index.cjs +1 -1
  63. package/dist/next/index.cjs.map +1 -1
  64. package/dist/next/index.d.ts +1 -0
  65. package/dist/next/index.js +22 -21
  66. package/dist/next/index.js.map +1 -1
  67. package/dist/pages/admin/delegations/index.cjs +1 -1
  68. package/dist/pages/admin/delegations/index.js +1 -1
  69. package/dist/pages/admin/orgs/index.cjs +1 -1
  70. package/dist/pages/admin/orgs/index.js +1 -1
  71. package/dist/pages/admin/users/index.cjs +1 -1
  72. package/dist/pages/admin/users/index.js +1 -1
  73. package/dist/pages/delegations/index.cjs +1 -1
  74. package/dist/pages/delegations/index.js +1 -1
  75. package/dist/pages/forms/builder/index.cjs +1 -1
  76. package/dist/pages/forms/builder/index.js +1 -1
  77. package/dist/pages/instances/detail/index.cjs +1 -1
  78. package/dist/pages/instances/detail/index.js +1 -1
  79. package/dist/pages/settings/notifications/index.cjs +1 -1
  80. package/dist/pages/settings/notifications/index.js +1 -1
  81. package/dist/pages/templates/categories/index.cjs +1 -1
  82. package/dist/pages/templates/categories/index.js +1 -1
  83. package/dist/pages/templates/index.cjs +1 -1
  84. package/dist/pages/templates/index.js +1 -1
  85. package/dist/views/admin/delegations/index.cjs +1 -1
  86. package/dist/views/admin/delegations/index.js +1 -1
  87. package/dist/views/admin/index.cjs +1 -1
  88. package/dist/views/admin/index.js +3 -3
  89. package/dist/views/admin/orgs/index.cjs +1 -1
  90. package/dist/views/admin/orgs/index.js +1 -1
  91. package/dist/views/admin/users/index.cjs +1 -1
  92. package/dist/views/admin/users/index.js +1 -1
  93. package/dist/views/cc/index.cjs +1 -1
  94. package/dist/views/cc/index.js +1 -1
  95. package/dist/views/dashboard/index.cjs +1 -1
  96. package/dist/views/dashboard/index.js +1 -1
  97. package/dist/views/delegations/index.cjs +1 -1
  98. package/dist/views/delegations/index.js +1 -1
  99. package/dist/views/forms/builder/index.cjs +1 -1
  100. package/dist/views/forms/builder/index.js +1 -1
  101. package/dist/views/forms/index.cjs +1 -1
  102. package/dist/views/forms/index.cjs.map +1 -1
  103. package/dist/views/forms/index.js +78 -77
  104. package/dist/views/forms/index.js.map +1 -1
  105. package/dist/views/inbox/index.cjs +1 -1
  106. package/dist/views/inbox/index.cjs.map +1 -1
  107. package/dist/views/inbox/index.js +106 -105
  108. package/dist/views/inbox/index.js.map +1 -1
  109. package/dist/views/instances/detail/index.cjs +1 -1
  110. package/dist/views/instances/detail/index.js +1 -1
  111. package/dist/views/instances/new/index.cjs +1 -1
  112. package/dist/views/instances/new/index.cjs.map +1 -1
  113. package/dist/views/instances/new/index.js +90 -89
  114. package/dist/views/instances/new/index.js.map +1 -1
  115. package/dist/views/search/index.cjs +1 -1
  116. package/dist/views/search/index.js +1 -1
  117. package/dist/views/sent/index.cjs +1 -1
  118. package/dist/views/sent/index.js +1 -1
  119. package/dist/views/settings/index.cjs +1 -1
  120. package/dist/views/settings/index.js +1 -1
  121. package/dist/views/settings/notifications/index.cjs +1 -1
  122. package/dist/views/settings/notifications/index.js +1 -1
  123. package/dist/views/templates/categories/index.cjs +1 -1
  124. package/dist/views/templates/categories/index.js +1 -1
  125. package/dist/views/templates/designer/index.cjs +6 -6
  126. package/dist/views/templates/designer/index.cjs.map +1 -1
  127. package/dist/views/templates/designer/index.js +589 -588
  128. package/dist/views/templates/designer/index.js.map +1 -1
  129. package/dist/views/templates/index.cjs +1 -1
  130. package/dist/views/templates/index.js +2 -2
  131. package/dist/views/templates/versions/index.cjs +1 -1
  132. package/dist/views/templates/versions/index.cjs.map +1 -1
  133. package/dist/views/templates/versions/index.js +44 -43
  134. package/dist/views/templates/versions/index.js.map +1 -1
  135. package/package.json +3 -3
  136. package/dist/chunks/app-navigation-C_mbz7jx.cjs +0 -2
  137. package/dist/chunks/app-navigation-C_mbz7jx.cjs.map +0 -1
  138. package/dist/chunks/app-navigation-uwbNEw9P.js +0 -262
  139. package/dist/chunks/app-navigation-uwbNEw9P.js.map +0 -1
  140. package/dist/chunks/approval-instance-list-page-Mo6wpDPb.cjs +0 -2
  141. package/dist/chunks/approval-instance-list-page-Mo6wpDPb.cjs.map +0 -1
  142. package/dist/chunks/approval-instance-list-page-nmzMrj0b.js.map +0 -1
  143. package/dist/chunks/builder-DPhAH381.cjs +0 -3
  144. package/dist/chunks/builder-DPhAH381.cjs.map +0 -1
  145. package/dist/chunks/builder-DqZskyXC.js.map +0 -1
  146. package/dist/chunks/categories-DEijUOnw.cjs +0 -2
  147. package/dist/chunks/categories-DEijUOnw.cjs.map +0 -1
  148. package/dist/chunks/categories-DTEl182t.js.map +0 -1
  149. package/dist/chunks/dashboard-page-DCmuB0Rw.cjs +0 -2
  150. package/dist/chunks/dashboard-page-DCmuB0Rw.cjs.map +0 -1
  151. package/dist/chunks/dashboard-page-Dx5PeEeN.js +0 -117
  152. package/dist/chunks/dashboard-page-Dx5PeEeN.js.map +0 -1
  153. package/dist/chunks/delegations-C-ZrwzvU.js.map +0 -1
  154. package/dist/chunks/delegations-C5PzZ5Kn.js.map +0 -1
  155. package/dist/chunks/delegations-DOGDvybX.cjs +0 -2
  156. package/dist/chunks/delegations-DOGDvybX.cjs.map +0 -1
  157. package/dist/chunks/delegations-DkDBWOQ7.cjs +0 -2
  158. package/dist/chunks/delegations-DkDBWOQ7.cjs.map +0 -1
  159. package/dist/chunks/detail-B2gcOPkd.cjs +0 -2
  160. package/dist/chunks/detail-B2gcOPkd.cjs.map +0 -1
  161. package/dist/chunks/detail-CfFyU5zC.js.map +0 -1
  162. package/dist/chunks/notifications-CPQ-nVar.cjs +0 -2
  163. package/dist/chunks/notifications-CPQ-nVar.cjs.map +0 -1
  164. package/dist/chunks/notifications-DweexUVy.js +0 -197
  165. package/dist/chunks/notifications-DweexUVy.js.map +0 -1
  166. package/dist/chunks/orgs-DgZ0DQ3-.cjs +0 -2
  167. package/dist/chunks/orgs-DgZ0DQ3-.cjs.map +0 -1
  168. package/dist/chunks/orgs-xrdhb3hS.js.map +0 -1
  169. package/dist/chunks/templates-PK_VYvcy.js +0 -383
  170. package/dist/chunks/templates-PK_VYvcy.js.map +0 -1
  171. package/dist/chunks/templates-x1OJZmsG.cjs +0 -2
  172. package/dist/chunks/templates-x1OJZmsG.cjs.map +0 -1
  173. package/dist/chunks/users-CY4-NK3j.js.map +0 -1
  174. package/dist/chunks/users-DHnu_056.cjs +0 -2
  175. package/dist/chunks/users-DHnu_056.cjs.map +0 -1
@@ -1,11 +1,12 @@
1
1
  "use client";
2
- import { t as e } from "./app-navigation-uwbNEw9P.js";
3
- import { useCallback as t, useEffect as n, useMemo as r, useState as i } from "react";
4
- import { BaseCard as a, Filter as o, FilterArea as s, FilterLine as c, FormField as l, Input as u, Modal as d, PageHeader as ee, Section as f, SectionGroup as p, Table as te, Typography as m } from "@mezzanine-ui/react";
5
- import { listMemberDirectoryPage as h, resolveMembers as ne } from "@rytass/bpm-core-client";
6
- import { jsx as g, jsxs as _ } from "react/jsx-runtime";
7
- import v from "@mezzanine-ui/react/ContentHeader";
8
- import { FormFieldLayout as y } from "@mezzanine-ui/core/form";
2
+ import { t as e } from "./app-navigation-BSkMsEhy.js";
3
+ import { r as t } from "./routes-config-dxahImVe.js";
4
+ import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
5
+ import { BaseCard as o, Filter as s, FilterArea as c, FilterLine as l, FormField as u, Input as ee, Modal as d, PageHeader as f, Section as p, SectionGroup as m, Table as h, Typography as g } from "@mezzanine-ui/react";
6
+ import { listMemberDirectoryPage as te, resolveMembers as _ } from "@rytass/bpm-core-client";
7
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
8
+ import ne from "@mezzanine-ui/react/ContentHeader";
9
+ import { FormFieldLayout as re } from "@mezzanine-ui/core/form";
9
10
  import { listMemberships as b, readOrganizationDashboard as x, readResolvedManager as S } from "@rytass/bpm-core-client/organization";
10
11
  import '../users.css';var C = {
11
12
  memberFilterArea: "bpm_memberFilterArea_9RB2k",
@@ -18,41 +19,41 @@ import '../users.css';var C = {
18
19
  20,
19
20
  50
20
21
  ];
21
- function T({ activeHref: a = "/admin/users" } = {}) {
22
- let [d, T] = i(null), [D, O] = i([]), [k, j] = i(null), [M, N] = i(null), [P, F] = i(null), [I, L] = i(!0), [R, z] = i(1), [B, V] = i(10), [H, U] = i(0), [W, G] = i([]), [K, q] = i([]), [J, Y] = i([]), [X, Z] = i(""), re = r(() => new Map(K.map((e) => [e.id, e])), [K]), ie = r(() => new Map(J.map((e) => [e.id, e])), [J]), Q = t(async () => {
23
- L(!0), F(null);
22
+ function T({ activeHref: o } = {}) {
23
+ let d = t(), T = o ?? d.adminUsers(), [D, O] = a(null), [k, j] = a([]), [M, N] = a(null), [P, F] = a(null), [I, L] = a(null), [R, z] = a(!0), [B, V] = a(1), [H, U] = a(10), [W, G] = a(0), [K, q] = a([]), [J, Y] = a([]), [X, ie] = a([]), [Z, ae] = a(""), oe = i(() => new Map(J.map((e) => [e.id, e])), [J]), se = i(() => new Map(X.map((e) => [e.id, e])), [X]), Q = n(async () => {
24
+ z(!0), L(null);
24
25
  try {
25
- let [e, t] = await Promise.all([h({
26
- page: R,
27
- pageSize: B,
28
- searchText: X
26
+ let [e, t] = await Promise.all([te({
27
+ page: B,
28
+ pageSize: H,
29
+ searchText: Z
29
30
  }), x()]);
30
- G(e.members), U(e.totalCount), q(t.orgUnits), Y(t.positions);
31
+ q(e.members), G(e.totalCount), Y(t.orgUnits), ie(t.positions);
31
32
  } catch (e) {
32
- F(A(e));
33
+ L(A(e));
33
34
  } finally {
34
- L(!1);
35
+ z(!1);
35
36
  }
36
37
  }, [
37
- R,
38
38
  B,
39
- X
39
+ H,
40
+ Z
40
41
  ]);
41
- n(() => {
42
+ r(() => {
42
43
  Q();
43
44
  }, [Q]);
44
- let ae = r(() => W.map((e) => ({
45
+ let ce = i(() => K.map((e) => ({
45
46
  ...e,
46
47
  key: e.memberId
47
- })), [W]), $ = t(async (e) => {
48
- T(e), j(null), F(null);
48
+ })), [K]), $ = n(async (e) => {
49
+ O(e), N(null), L(null);
49
50
  try {
50
51
  let [t, n] = await Promise.all([b({ memberId: e.memberId }), S(e.memberId)]);
51
- O(t), N(n), j((await ne(n.managerMemberId ? [n.managerMemberId] : []))[0] ?? null);
52
+ j(t), F(n), N((await _(n.managerMemberId ? [n.managerMemberId] : []))[0] ?? null);
52
53
  } catch (e) {
53
- F(A(e));
54
+ L(A(e));
54
55
  }
55
- }, []), oe = r(() => [{
56
+ }, []), le = i(() => [{
56
57
  dataIndex: "name",
57
58
  key: "name",
58
59
  title: "姓名",
@@ -62,7 +63,7 @@ function T({ activeHref: a = "/admin/users" } = {}) {
62
63
  key: "email",
63
64
  title: "信箱",
64
65
  width: 260
65
- }], []), se = r(() => ({
66
+ }], []), ue = i(() => ({
66
67
  render: () => [{
67
68
  name: "檢視",
68
69
  onClick: (e) => {
@@ -72,79 +73,79 @@ function T({ activeHref: a = "/admin/users" } = {}) {
72
73
  variant: "base-secondary",
73
74
  width: 88
74
75
  }), [$]);
75
- function ce() {
76
- T(null), j(null), O([]), N(null);
76
+ function de() {
77
+ O(null), N(null), j([]), F(null);
77
78
  }
78
- return /* @__PURE__ */ _(e, {
79
- activeHref: a,
79
+ return /* @__PURE__ */ y(e, {
80
+ activeHref: T,
80
81
  children: [
81
- /* @__PURE__ */ g(ee, { children: /* @__PURE__ */ g(v, {
82
+ /* @__PURE__ */ v(f, { children: /* @__PURE__ */ v(ne, {
82
83
  description: "會員資料由 host member resolver 提供,BPM 僅維護組織歸屬與主管解析。",
83
84
  title: "會員對照"
84
85
  }) }),
85
- /* @__PURE__ */ g(p, { children: /* @__PURE__ */ _(f, {
86
- filterArea: /* @__PURE__ */ g(s, {
86
+ /* @__PURE__ */ v(m, { children: /* @__PURE__ */ y(p, {
87
+ filterArea: /* @__PURE__ */ v(c, {
87
88
  className: C.memberFilterArea,
88
- children: /* @__PURE__ */ g(c, { children: /* @__PURE__ */ g(o, {
89
+ children: /* @__PURE__ */ v(l, { children: /* @__PURE__ */ v(s, {
89
90
  span: 3,
90
- children: /* @__PURE__ */ g(l, {
91
+ children: /* @__PURE__ */ v(u, {
91
92
  fullWidth: !0,
92
- layout: y.VERTICAL,
93
+ layout: re.VERTICAL,
93
94
  name: "memberSearchText",
94
- children: /* @__PURE__ */ g(u, {
95
+ children: /* @__PURE__ */ v(ee, {
95
96
  fullWidth: !0,
96
97
  onChange: (e) => {
97
- Z(e.target.value), z(1);
98
+ ae(e.target.value), V(1);
98
99
  },
99
100
  placeholder: "搜尋姓名或信箱",
100
101
  size: "sub",
101
- value: X,
102
+ value: Z,
102
103
  variant: "base"
103
104
  })
104
105
  })
105
106
  }) })
106
107
  }),
107
- children: [P ? /* @__PURE__ */ g(m, {
108
+ children: [I ? /* @__PURE__ */ v(g, {
108
109
  color: "text-error",
109
110
  variant: "body",
110
- children: P
111
- }) : null, /* @__PURE__ */ g(te, {
112
- actions: se,
113
- columns: oe,
114
- dataSource: ae,
111
+ children: I
112
+ }) : null, /* @__PURE__ */ v(h, {
113
+ actions: ue,
114
+ columns: le,
115
+ dataSource: ce,
115
116
  fullWidth: !0,
116
- loading: I,
117
+ loading: R,
117
118
  pagination: {
118
- current: R,
119
+ current: B,
119
120
  onChange: (e) => {
120
- z(e);
121
+ V(e);
121
122
  },
122
123
  onChangePageSize: (e) => {
123
- z(1), V(e);
124
+ V(1), U(e);
124
125
  },
125
- pageSize: B,
126
+ pageSize: H,
126
127
  pageSizeLabel: "每頁筆數",
127
128
  pageSizeOptions: w,
128
129
  renderResultSummary: (e, t, n) => `顯示 ${e}-${t} 筆,共 ${n} 筆`,
129
130
  showPageSizeOptions: !0,
130
- total: H
131
+ total: W
131
132
  }
132
133
  })]
133
134
  }) }),
134
- /* @__PURE__ */ g(E, {
135
- managerProfile: k,
136
- member: d,
137
- memberships: D,
138
- onClose: ce,
139
- orgUnitsById: re,
140
- positionsById: ie,
141
- resolvedManager: M
135
+ /* @__PURE__ */ v(E, {
136
+ managerProfile: M,
137
+ member: D,
138
+ memberships: k,
139
+ onClose: de,
140
+ orgUnitsById: oe,
141
+ positionsById: se,
142
+ resolvedManager: P
142
143
  })
143
144
  ]
144
145
  });
145
146
  }
146
- function E({ managerProfile: e, member: t, memberships: n, onClose: r, orgUnitsById: i, positionsById: o, resolvedManager: s }) {
147
- return /* @__PURE__ */ g(d, {
147
+ function E({ managerProfile: e, member: t, memberships: n, onClose: r, orgUnitsById: i, positionsById: a, resolvedManager: s }) {
148
+ return /* @__PURE__ */ v(d, {
148
149
  cancelText: "關閉",
149
150
  confirmText: "關閉",
150
151
  modalType: "standard",
@@ -156,42 +157,42 @@ function E({ managerProfile: e, member: t, memberships: n, onClose: r, orgUnitsB
156
157
  showModalHeader: !0,
157
158
  size: "regular",
158
159
  title: t?.name ?? "會員明細",
159
- children: t ? /* @__PURE__ */ _("div", {
160
+ children: t ? /* @__PURE__ */ y("div", {
160
161
  className: C.detailFields,
161
162
  children: [
162
- /* @__PURE__ */ g(a, {
163
+ /* @__PURE__ */ v(o, {
163
164
  title: "基本資料",
164
- children: /* @__PURE__ */ g("div", {
165
+ children: /* @__PURE__ */ v("div", {
165
166
  className: C.detailSection,
166
- children: /* @__PURE__ */ _(m, {
167
+ children: /* @__PURE__ */ y(g, {
167
168
  variant: "body",
168
169
  children: ["信箱:", t.email]
169
170
  })
170
171
  })
171
172
  }),
172
- /* @__PURE__ */ g(a, {
173
+ /* @__PURE__ */ v(o, {
173
174
  title: "BPM 組織歸屬",
174
- children: /* @__PURE__ */ g("div", {
175
+ children: /* @__PURE__ */ v("div", {
175
176
  className: C.membershipList,
176
- children: n.length ? n.map((e) => /* @__PURE__ */ _(m, {
177
+ children: n.length ? n.map((e) => /* @__PURE__ */ y(g, {
177
178
  variant: "body",
178
179
  children: [
179
180
  D(i.get(e.orgUnitId)),
180
181
  " / ",
181
- e.positionId ? O(o.get(e.positionId)) : "未指定職位",
182
+ e.positionId ? O(a.get(e.positionId)) : "未指定職位",
182
183
  " / ",
183
184
  e.isPrimary ? "主要" : "一般"
184
185
  ]
185
- }, e.id)) : /* @__PURE__ */ g(m, {
186
+ }, e.id)) : /* @__PURE__ */ v(g, {
186
187
  color: "text-neutral",
187
188
  variant: "body",
188
189
  children: "尚未建立 BPM 組織歸屬"
189
190
  })
190
191
  })
191
192
  }),
192
- /* @__PURE__ */ g(a, {
193
+ /* @__PURE__ */ v(o, {
193
194
  title: "主管解析",
194
- children: /* @__PURE__ */ g(m, {
195
+ children: /* @__PURE__ */ v(g, {
195
196
  variant: "body",
196
197
  children: s?.managerMemberId ? k(e) : "尚未解析到主管"
197
198
  })
@@ -215,4 +216,4 @@ function A(e) {
215
216
  //#endregion
216
217
  export { T as t };
217
218
 
218
- //# sourceMappingURL=users-CY4-NK3j.js.map
219
+ //# sourceMappingURL=users-sMfrSjRQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users-sMfrSjRQ.js","names":[],"sources":["../../src/views/admin/users/users.module.scss","../../src/views/admin/users/AdminUsersView.tsx"],"sourcesContent":[".memberFilterArea {\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 :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n}\n\n.header {\n display: grid;\n gap: 4px;\n padding: 24px 24px 0;\n}\n\n.detailFields {\n display: grid;\n gap: 16px;\n}\n\n.detailSection {\n display: grid;\n gap: 8px;\n}\n\n.membershipList {\n display: grid;\n gap: 8px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n BaseCard,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport styles from './users.module.scss';\nimport { useBPMRoutes } from '../../../lib/routes-config';\nimport { AppLayout } from '../../../components/app-navigation';\nimport {\n listMemberDirectoryPage,\n MemberProfileRecord,\n resolveMembers,\n} from '@rytass/bpm-core-client';\nimport {\n listMemberships,\n MembershipRecord,\n OrgUnitRecord,\n PositionRecord,\n readOrganizationDashboard,\n readResolvedManager,\n ResolvedManagerRecord,\n} from '@rytass/bpm-core-client/organization';\n\ntype MemberRow = Readonly<\n Record<string, unknown> &\n MemberProfileRecord & {\n key: string;\n }\n>;\n\nconst MEMBER_PAGE_SIZE_OPTIONS = [10, 20, 50];\n\nexport interface AdminUsersViewProps {\n readonly activeHref?: string;\n}\n\nexport function AdminUsersView({\n activeHref,\n}: AdminUsersViewProps = {}): ReactElement {\n const routes = useBPMRoutes();\n const resolvedActiveHref = activeHref ?? routes.adminUsers();\n const [detailMember, setDetailMember] = useState<MemberProfileRecord | null>(\n null,\n );\n const [detailMemberships, setDetailMemberships] = useState<\n readonly MembershipRecord[]\n >([]);\n const [detailManagerProfile, setDetailManagerProfile] =\n useState<MemberProfileRecord | null>(null);\n const [detailResolvedManager, setDetailResolvedManager] =\n useState<ResolvedManagerRecord | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberPage, setMemberPage] = useState(1);\n const [memberPageSize, setMemberPageSize] = useState(10);\n const [memberTotalCount, setMemberTotalCount] = useState(0);\n const [members, setMembers] = useState<readonly MemberProfileRecord[]>([]);\n const [orgUnits, setOrgUnits] = useState<readonly OrgUnitRecord[]>([]);\n const [positions, setPositions] = useState<readonly PositionRecord[]>([]);\n const [searchText, setSearchText] = useState('');\n\n const orgUnitsById = useMemo(\n (): ReadonlyMap<string, OrgUnitRecord> =>\n new Map(orgUnits.map((orgUnit) => [orgUnit.id, orgUnit])),\n [orgUnits],\n );\n const positionsById = useMemo(\n (): ReadonlyMap<string, PositionRecord> =>\n new Map(positions.map((position) => [position.id, position])),\n [positions],\n );\n\n const refreshMembers = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const [memberPageResult, organization] = await Promise.all([\n listMemberDirectoryPage({\n page: memberPage,\n pageSize: memberPageSize,\n searchText,\n }),\n readOrganizationDashboard(),\n ]);\n\n setMembers(memberPageResult.members);\n setMemberTotalCount(memberPageResult.totalCount);\n setOrgUnits(organization.orgUnits);\n setPositions(organization.positions);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [memberPage, memberPageSize, searchText]);\n\n useEffect((): void => {\n void refreshMembers();\n }, [refreshMembers]);\n\n const rows = useMemo(\n (): MemberRow[] =>\n members.map((member) => ({\n ...member,\n key: member.memberId,\n })),\n [members],\n );\n\n const openDetail = useCallback(\n async (member: MemberProfileRecord): Promise<void> => {\n setDetailMember(member);\n setDetailManagerProfile(null);\n setError(null);\n\n try {\n const [memberships, resolvedManager] = await Promise.all([\n listMemberships({ memberId: member.memberId }),\n readResolvedManager(member.memberId),\n ]);\n\n setDetailMemberships(memberships);\n setDetailResolvedManager(resolvedManager);\n setDetailManagerProfile(\n (\n await resolveMembers(\n resolvedManager.managerMemberId\n ? [resolvedManager.managerMemberId]\n : [],\n )\n )[0] ?? null,\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [],\n );\n\n const columns = useMemo(\n (): TableColumn<MemberRow>[] => [\n { dataIndex: 'name', key: 'name', title: '姓名', width: 160 },\n { dataIndex: 'email', key: 'email', title: '信箱', width: 260 },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<MemberRow> => ({\n render: (): ReturnType<TableActions<MemberRow>['render']> => [\n {\n name: '檢視',\n onClick: (record): void => {\n void openDetail(record);\n },\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [openDetail],\n );\n\n function closeDetail(): void {\n setDetailMember(null);\n setDetailManagerProfile(null);\n setDetailMemberships([]);\n setDetailResolvedManager(null);\n }\n\n return (\n <AppLayout activeHref={resolvedActiveHref}>\n <PageHeader>\n <ContentHeader\n description=\"會員資料由 host member resolver 提供,BPM 僅維護組織歸屬與主管解析。\"\n title=\"會員對照\"\n />\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.memberFilterArea}>\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"memberSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setSearchText(event.target.value);\n setMemberPage(1);\n }}\n placeholder=\"搜尋姓名或信箱\"\n size=\"sub\"\n value={searchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\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: memberPage,\n onChange: (page): void => {\n setMemberPage(page);\n },\n onChangePageSize: (pageSize): void => {\n setMemberPage(1);\n setMemberPageSize(pageSize);\n },\n pageSize: memberPageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: MEMBER_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: memberTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <MemberDetailModal\n managerProfile={detailManagerProfile}\n member={detailMember}\n memberships={detailMemberships}\n onClose={closeDetail}\n orgUnitsById={orgUnitsById}\n positionsById={positionsById}\n resolvedManager={detailResolvedManager}\n />\n </AppLayout>\n );\n}\n\nfunction MemberDetailModal({\n managerProfile,\n member,\n memberships,\n onClose,\n orgUnitsById,\n positionsById,\n resolvedManager,\n}: {\n readonly managerProfile: MemberProfileRecord | null;\n readonly member: MemberProfileRecord | null;\n readonly memberships: readonly MembershipRecord[];\n readonly onClose: () => void;\n readonly orgUnitsById: ReadonlyMap<string, OrgUnitRecord>;\n readonly positionsById: ReadonlyMap<string, PositionRecord>;\n readonly resolvedManager: ResolvedManagerRecord | null;\n}): ReactElement {\n return (\n <Modal\n cancelText=\"關閉\"\n confirmText=\"關閉\"\n modalType=\"standard\"\n onCancel={onClose}\n onClose={onClose}\n onConfirm={onClose}\n open={Boolean(member)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n title={member?.name ?? '會員明細'}\n >\n {member ? (\n <div className={styles.detailFields}>\n <BaseCard title=\"基本資料\">\n <div className={styles.detailSection}>\n <Typography variant=\"body\">信箱:{member.email}</Typography>\n </div>\n </BaseCard>\n <BaseCard title=\"BPM 組織歸屬\">\n <div className={styles.membershipList}>\n {memberships.length ? (\n memberships.map((membership) => (\n <Typography key={membership.id} variant=\"body\">\n {readOrgUnitLabel(orgUnitsById.get(membership.orgUnitId))}\n {' / '}\n {membership.positionId\n ? readPositionLabel(\n positionsById.get(membership.positionId),\n )\n : '未指定職位'}\n {' / '}\n {membership.isPrimary ? '主要' : '一般'}\n </Typography>\n ))\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 尚未建立 BPM 組織歸屬\n </Typography>\n )}\n </div>\n </BaseCard>\n <BaseCard title=\"主管解析\">\n <Typography variant=\"body\">\n {resolvedManager?.managerMemberId\n ? readMemberLabel(managerProfile)\n : '尚未解析到主管'}\n </Typography>\n </BaseCard>\n </div>\n ) : null}\n </Modal>\n );\n}\n\nfunction readOrgUnitLabel(orgUnit: OrgUnitRecord | undefined): string {\n return orgUnit ? `${orgUnit.name} · ${orgUnit.code}` : '未知組織';\n}\n\nfunction readPositionLabel(position: PositionRecord | undefined): string {\n return position ? `${position.name} · ${position.code}` : '未知職位';\n}\n\nfunction readMemberLabel(member: MemberProfileRecord | null): string {\n return member ? `${member.name} · ${member.email}` : '主管資料尚未載入';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '讀取會員資料失敗。';\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/app-navigation-C_mbz7jx.cjs"),t=require("./chunks/auth-provider-BV8Iiwfb.cjs"),n=require("./chunks/format-date-time-isOa3e9q.cjs"),r=require("./chunks/admin-pickers-Btvij1at.cjs"),i=require("./chunks/approval-instance-list-page-Mo6wpDPb.cjs"),a=require("./chunks/bpm-form-field-Bc6k4ZEO.cjs"),o=require("./chunks/dashboard-page-DCmuB0Rw.cjs");let s=require("react"),c=require("react/jsx-runtime"),l=require("@rytass/bpm-core-client/workflow"),u=require("@mezzanine-ui/react/moment"),d=require("@mezzanine-ui/react/Drawer");d=e.o(d,1);let f=require("@mezzanine-ui/react/NotificationCenter");f=e.o(f,1);var p=[`today`,`yesterday`,`past7Days`,`earlier`],m={earlier:`更早`,past7Days:`過去七天`,today:`今天`,yesterday:`昨天`},h=50;function g(){let n=t.a(),{member:r}=t.n(),{close:i,isOpen:a}=e.a(),{refreshUnreadCount:o}=e.r(),u=r?.memberId??null,[g,b]=(0,s.useState)([]),[x,S]=(0,s.useState)(0),[C,w]=(0,s.useState)(1),[T,E]=(0,s.useState)(!1),[D,O]=(0,s.useState)(!1),[k,A]=(0,s.useState)(null),[j,M]=(0,s.useState)(`all`),N=(0,s.useCallback)(async(e,t)=>{if(u){E(!0),A(null);try{let n=await(0,l.listNotifications)({includeRead:!0,page:e,pageSize:h,recipientMemberId:u});b(e=>t?[...e,...n.notifications]:n.notifications),S(n.totalCount),w(e),await o()}catch(e){A(y(e))}finally{E(!1)}}},[u,o]);(0,s.useEffect)(()=>{!a||!u||N(1,!1)},[a,u,N]);let P=(0,s.useCallback)(e=>{let t=e.target.value;(t===`all`||t===`read`||t===`unread`)&&M(t)},[]),F=(0,s.useCallback)(async()=>{if(!(!u||D)){O(!0),A(null);try{await(0,l.markAllNotificationsRead)({recipientMemberId:u}),await N(1,!1)}catch(e){A(y(e))}finally{O(!1)}}},[D,u,N]),I=(0,s.useCallback)(()=>{T||N(C+1,!0)},[T,N,C]),L=(0,s.useCallback)(async e=>{if(u)try{await(0,l.markNotificationRead)({id:e,readerMemberId:u}),await N(1,!1)}catch(e){A(y(e))}},[u,N]),R=(0,s.useCallback)(async e=>{if(!(!e.instanceId||!u))try{e.status!==`READ`&&(await(0,l.markNotificationRead)({id:e.id,readerMemberId:u}),await o()),i(),n.push(`/instances/${e.instanceId}`)}catch(e){A(y(e))}},[i,u,o,n]),z=(0,s.useMemo)(()=>g.filter(e=>j===`all`?!0:j===`read`?e.status===`READ`:e.status!==`READ`),[j,g]),B=(0,s.useMemo)(()=>{let e=new Date,t=p.reduce((e,t)=>(e[t]=[],e),{earlier:[],past7Days:[],today:[],yesterday:[]});return z.forEach(n=>{t[v(n.createdAt,e)].push(n)}),p.map(e=>[e,t[e]]).filter(([,e])=>e.length>0)},[z]),V=g.length<x;return u?(0,c.jsx)(d.default,{bottomGhostActionDisabled:D||T,bottomGhostActionLoading:D,bottomGhostActionText:`全部標為已讀`,bottomOnGhostActionClick:()=>{F()},bottomOnPrimaryActionClick:()=>{I()},bottomPrimaryActionDisabled:!V||T,bottomPrimaryActionLoading:T&&V,bottomPrimaryActionText:V?`載入更多`:`已顯示全部`,contentKey:`${j}:${g.length}`,filterAreaAllRadioLabel:`全部`,filterAreaOnRadioChange:P,filterAreaReadRadioLabel:`已讀`,filterAreaShow:!0,filterAreaUnreadRadioLabel:`未讀`,filterAreaValue:j,headerTitle:`通知中心`,isBottomDisplay:!0,isHeaderDisplay:!0,onClose:i,open:a,size:`medium`,children:(0,c.jsxs)(`div`,{role:`list`,children:[k?(0,c.jsx)(`p`,{role:`alert`,style:{color:`var(--mzn-color-text-error, #d92d20)`,padding:`12px 16px`},children:k}):null,B.length===0?(0,c.jsx)(`p`,{style:{color:`var(--mzn-color-text-secondary, #6b7280)`,padding:`24px 16px`,textAlign:`center`},children:T?`載入中…`:`目前沒有通知`}):null,B.map(([e,t],n)=>(0,c.jsx)(s.Fragment,{children:t.map((r,i)=>(0,c.jsx)(f.default,{appendTips:n===B.length-1&&i===t.length-1&&!V?`已顯示全部通知`:void 0,cancelButtonText:r.status===`READ`?void 0:`標為已讀`,description:r.body,onCancel:r.status===`READ`?void 0:()=>{L(r.id)},onConfirm:r.instanceId?()=>{R(r)}:void 0,confirmButtonText:r.instanceId?`查看案件`:void 0,prependTips:i===0?m[e]:void 0,reference:r.id,severity:_(r.type),showBadge:r.status!==`READ`,timeStamp:r.createdAt,title:r.title,type:`drawer`},r.id))},e))]})}):null}function _(e){return e===`SLA_OVERDUE`?`error`:e===`SLA_WARNING`?`warning`:e===`INSTANCE_COMPLETED`?`success`:`info`}function v(e,t){let n=new Date(e);if(Number.isNaN(n.getTime()))return`earlier`;let r=new Date(t.getFullYear(),t.getMonth(),t.getDate()),i=new Date(n.getFullYear(),n.getMonth(),n.getDate());if(i.getTime()===r.getTime())return`today`;let a=new Date(r);return a.setDate(a.getDate()-1),i.getTime()===a.getTime()?`yesterday`:(t.getTime()-n.getTime())/(1e3*60*60*24)<=7?`past7Days`:`earlier`}function y(e){return e instanceof Error?e.message:`發生未知錯誤`}function b({children:n,locale:r=u.CalendarLocale.ZH_TW,publicPaths:i,loginPath:a}){return(0,c.jsx)(u.CalendarConfigProviderMoment,{locale:r,children:(0,c.jsx)(t.t,{publicPaths:i,loginPath:a,children:(0,c.jsx)(e.n,{children:(0,c.jsxs)(e.i,{children:[n,(0,c.jsx)(g,{})]})})})})}exports.AppLayout=e.t,exports.ApprovalInstanceListPage=i.t,exports.AuthProvider=t.t,exports.BPMFormField=a.t,exports.DashboardPage=o.t,exports.MemberPicker=r.t,exports.NotificationDrawer=g,exports.NotificationDrawerProvider=e.i,exports.NotificationUnreadProvider=e.n,exports.OrgUnitPicker=r.n,exports.PositionPicker=r.r,exports.Providers=b,exports.RouterAdapterProvider=t.r,exports.defaultBrowserSearchParams=t.i,exports.formatDateTime=n.t,exports.readMemberOption=r.i,exports.readOrgUnitOption=r.a,exports.readPositionOption=r.o,exports.useAuth=t.n,exports.useNotificationDrawer=e.a,exports.useNotificationUnread=e.r,exports.useRouterAdapter=t.a;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/app-navigation-KnlJCUp1.cjs"),t=require("./chunks/auth-provider-BV8Iiwfb.cjs"),n=require("./chunks/format-date-time-26_pFvv4.cjs"),r=require("./chunks/routes-config-2aKbWq2H.cjs"),i=require("./chunks/admin-pickers-Btvij1at.cjs"),a=require("./chunks/approval-instance-list-page-CVXgE2K3.cjs"),o=require("./chunks/bpm-form-field-Bc6k4ZEO.cjs"),s=require("./chunks/dashboard-page-1K_jQXQk.cjs");let c=require("react"),l=require("react/jsx-runtime"),u=require("@rytass/bpm-core-client/workflow"),d=require("@mezzanine-ui/react/moment"),f=require("@mezzanine-ui/react/Drawer");f=e.o(f,1);let p=require("@mezzanine-ui/react/NotificationCenter");p=e.o(p,1);var m=[`today`,`yesterday`,`past7Days`,`earlier`],h={earlier:`更早`,past7Days:`過去七天`,today:`今天`,yesterday:`昨天`},g=50;function _(){let n=t.a(),i=r.r(),{member:a}=t.n(),{close:o,isOpen:s}=e.a(),{refreshUnreadCount:d}=e.r(),_=a?.memberId??null,[x,S]=(0,c.useState)([]),[C,w]=(0,c.useState)(0),[T,E]=(0,c.useState)(1),[D,O]=(0,c.useState)(!1),[k,A]=(0,c.useState)(!1),[j,M]=(0,c.useState)(null),[N,P]=(0,c.useState)(`all`),F=(0,c.useCallback)(async(e,t)=>{if(_){O(!0),M(null);try{let n=await(0,u.listNotifications)({includeRead:!0,page:e,pageSize:g,recipientMemberId:_});S(e=>t?[...e,...n.notifications]:n.notifications),w(n.totalCount),E(e),await d()}catch(e){M(b(e))}finally{O(!1)}}},[_,d]);(0,c.useEffect)(()=>{!s||!_||F(1,!1)},[s,_,F]);let I=(0,c.useCallback)(e=>{let t=e.target.value;(t===`all`||t===`read`||t===`unread`)&&P(t)},[]),L=(0,c.useCallback)(async()=>{if(!(!_||k)){A(!0),M(null);try{await(0,u.markAllNotificationsRead)({recipientMemberId:_}),await F(1,!1)}catch(e){M(b(e))}finally{A(!1)}}},[k,_,F]),R=(0,c.useCallback)(()=>{D||F(T+1,!0)},[D,F,T]),z=(0,c.useCallback)(async e=>{if(_)try{await(0,u.markNotificationRead)({id:e,readerMemberId:_}),await F(1,!1)}catch(e){M(b(e))}},[_,F]),B=(0,c.useCallback)(async e=>{if(!(!e.instanceId||!_))try{e.status!==`READ`&&(await(0,u.markNotificationRead)({id:e.id,readerMemberId:_}),await d()),o(),n.push(i.caseDetail(e.instanceId))}catch(e){M(b(e))}},[o,_,d,n,i]),V=(0,c.useMemo)(()=>x.filter(e=>N===`all`?!0:N===`read`?e.status===`READ`:e.status!==`READ`),[N,x]),H=(0,c.useMemo)(()=>{let e=new Date,t=m.reduce((e,t)=>(e[t]=[],e),{earlier:[],past7Days:[],today:[],yesterday:[]});return V.forEach(n=>{t[y(n.createdAt,e)].push(n)}),m.map(e=>[e,t[e]]).filter(([,e])=>e.length>0)},[V]),U=x.length<C;return _?(0,l.jsx)(f.default,{bottomGhostActionDisabled:k||D,bottomGhostActionLoading:k,bottomGhostActionText:`全部標為已讀`,bottomOnGhostActionClick:()=>{L()},bottomOnPrimaryActionClick:()=>{R()},bottomPrimaryActionDisabled:!U||D,bottomPrimaryActionLoading:D&&U,bottomPrimaryActionText:U?`載入更多`:`已顯示全部`,contentKey:`${N}:${x.length}`,filterAreaAllRadioLabel:`全部`,filterAreaOnRadioChange:I,filterAreaReadRadioLabel:`已讀`,filterAreaShow:!0,filterAreaUnreadRadioLabel:`未讀`,filterAreaValue:N,headerTitle:`通知中心`,isBottomDisplay:!0,isHeaderDisplay:!0,onClose:o,open:s,size:`medium`,children:(0,l.jsxs)(`div`,{role:`list`,children:[j?(0,l.jsx)(`p`,{role:`alert`,style:{color:`var(--mzn-color-text-error, #d92d20)`,padding:`12px 16px`},children:j}):null,H.length===0?(0,l.jsx)(`p`,{style:{color:`var(--mzn-color-text-secondary, #6b7280)`,padding:`24px 16px`,textAlign:`center`},children:D?`載入中…`:`目前沒有通知`}):null,H.map(([e,t],n)=>(0,l.jsx)(c.Fragment,{children:t.map((r,i)=>(0,l.jsx)(p.default,{appendTips:n===H.length-1&&i===t.length-1&&!U?`已顯示全部通知`:void 0,cancelButtonText:r.status===`READ`?void 0:`標為已讀`,description:r.body,onCancel:r.status===`READ`?void 0:()=>{z(r.id)},onConfirm:r.instanceId?()=>{B(r)}:void 0,confirmButtonText:r.instanceId?`查看案件`:void 0,prependTips:i===0?h[e]:void 0,reference:r.id,severity:v(r.type),showBadge:r.status!==`READ`,timeStamp:r.createdAt,title:r.title,type:`drawer`},r.id))},e))]})}):null}function v(e){return e===`SLA_OVERDUE`?`error`:e===`SLA_WARNING`?`warning`:e===`INSTANCE_COMPLETED`?`success`:`info`}function y(e,t){let n=new Date(e);if(Number.isNaN(n.getTime()))return`earlier`;let r=new Date(t.getFullYear(),t.getMonth(),t.getDate()),i=new Date(n.getFullYear(),n.getMonth(),n.getDate());if(i.getTime()===r.getTime())return`today`;let a=new Date(r);return a.setDate(a.getDate()-1),i.getTime()===a.getTime()?`yesterday`:(t.getTime()-n.getTime())/(1e3*60*60*24)<=7?`past7Days`:`earlier`}function b(e){return e instanceof Error?e.message:`發生未知錯誤`}function x({children:n,locale:r=d.CalendarLocale.ZH_TW,publicPaths:i,loginPath:a}){return(0,l.jsx)(d.CalendarConfigProviderMoment,{locale:r,children:(0,l.jsx)(t.t,{publicPaths:i,loginPath:a,children:(0,l.jsx)(e.n,{children:(0,l.jsxs)(e.i,{children:[n,(0,l.jsx)(_,{})]})})})})}exports.AppLayout=e.t,exports.ApprovalInstanceListPage=a.t,exports.AuthProvider=t.t,exports.BPMFormField=o.t,exports.BPMRoutesProvider=r.t,exports.DashboardPage=s.t,exports.MemberPicker=i.t,exports.NotificationDrawer=_,exports.NotificationDrawerProvider=e.i,exports.NotificationUnreadProvider=e.n,exports.OrgUnitPicker=i.n,exports.PositionPicker=i.r,exports.Providers=x,exports.RouterAdapterProvider=t.r,exports.createDefaultBPMRoutes=r.n,exports.defaultBrowserSearchParams=t.i,exports.formatDateTime=n.t,exports.readMemberOption=i.i,exports.readOrgUnitOption=i.a,exports.readPositionOption=i.o,exports.useAuth=t.n,exports.useBPMRoutes=r.r,exports.useNotificationDrawer=e.a,exports.useNotificationUnread=e.r,exports.useRouterAdapter=t.a;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/components/notification-drawer.tsx","../src/lib/providers.tsx"],"sourcesContent":["'use client';\n\nimport {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ChangeEvent,\n type ReactElement,\n} from 'react';\nimport Drawer from '@mezzanine-ui/react/Drawer';\nimport NotificationCenter from '@mezzanine-ui/react/NotificationCenter';\nimport type { NotificationSeverity } from '@mezzanine-ui/core/notification-center';\nimport {\n listNotifications,\n markAllNotificationsRead,\n markNotificationRead,\n type NotificationRecord,\n type NotificationType,\n} from '@rytass/bpm-core-client/workflow';\nimport { useAuth } from '../lib/auth-provider';\nimport { useNotificationDrawer } from '../lib/notification-drawer-provider';\nimport { useNotificationUnread } from '../lib/notification-unread-provider';\nimport { useRouterAdapter } from '../lib/router-adapter';\n\ntype FilterValue = 'all' | 'read' | 'unread';\n\ntype TimeGroup = 'today' | 'yesterday' | 'past7Days' | 'earlier';\n\nconst TIME_GROUP_ORDER: readonly TimeGroup[] = [\n 'today',\n 'yesterday',\n 'past7Days',\n 'earlier',\n];\n\nconst TIME_GROUP_LABEL: Readonly<Record<TimeGroup, string>> = {\n earlier: '更早',\n past7Days: '過去七天',\n today: '今天',\n yesterday: '昨天',\n};\n\nconst PAGE_SIZE = 50;\n\n/**\n * Right-side notification drawer mounted at the root by `<Providers>`.\n * Opens / closes via `useNotificationDrawer()`, polls\n * `listNotifications()` for the current member, supports filter\n * (`all` / `read` / `unread`), per-row mark-read, bulk mark-all-read, and\n * load-more pagination. Clicking a row with an `instanceId` navigates to\n * `/instances/<id>` via the host's router adapter.\n */\nexport function NotificationDrawer(): ReactElement | null {\n const router = useRouterAdapter();\n const { member } = useAuth();\n const { close, isOpen } = useNotificationDrawer();\n const { refreshUnreadCount } = useNotificationUnread();\n const currentMemberId = member?.memberId ?? null;\n const [rows, setRows] = useState<readonly NotificationRecord[]>([]);\n const [totalCount, setTotalCount] = useState(0);\n const [page, setPage] = useState(1);\n const [loading, setLoading] = useState(false);\n const [bulkLoading, setBulkLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [filter, setFilter] = useState<FilterValue>('all');\n\n const loadPage = useCallback(\n async (nextPage: number, append: boolean): Promise<void> => {\n if (!currentMemberId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await listNotifications({\n includeRead: true,\n page: nextPage,\n pageSize: PAGE_SIZE,\n recipientMemberId: currentMemberId,\n });\n setRows((current): readonly NotificationRecord[] =>\n append ? [...current, ...result.notifications] : result.notifications,\n );\n setTotalCount(result.totalCount);\n setPage(nextPage);\n await refreshUnreadCount();\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n } finally {\n setLoading(false);\n }\n },\n [currentMemberId, refreshUnreadCount],\n );\n\n useEffect((): void => {\n if (!isOpen || !currentMemberId) return;\n void loadPage(1, false);\n }, [isOpen, currentMemberId, loadPage]);\n\n const handleFilterChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>): void => {\n const next = event.target.value;\n if (next === 'all' || next === 'read' || next === 'unread') setFilter(next);\n },\n [],\n );\n\n const handleMarkAllRead = useCallback(async (): Promise<void> => {\n if (!currentMemberId || bulkLoading) return;\n setBulkLoading(true);\n setError(null);\n try {\n await markAllNotificationsRead({ recipientMemberId: currentMemberId });\n await loadPage(1, false);\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n } finally {\n setBulkLoading(false);\n }\n }, [bulkLoading, currentMemberId, loadPage]);\n\n const handleLoadMore = useCallback((): void => {\n if (loading) return;\n void loadPage(page + 1, true);\n }, [loading, loadPage, page]);\n\n const handleMarkRead = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) return;\n try {\n await markNotificationRead({ id, readerMemberId: currentMemberId });\n await loadPage(1, false);\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n }\n },\n [currentMemberId, loadPage],\n );\n\n const handleOpenInstance = useCallback(\n async (record: NotificationRecord): Promise<void> => {\n if (!record.instanceId || !currentMemberId) return;\n try {\n if (record.status !== 'READ') {\n await markNotificationRead({\n id: record.id,\n readerMemberId: currentMemberId,\n });\n await refreshUnreadCount();\n }\n close();\n router.push(`/instances/${record.instanceId}`);\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n }\n },\n [close, currentMemberId, refreshUnreadCount, router],\n );\n\n const filteredRows = useMemo(\n (): readonly NotificationRecord[] =>\n rows.filter((row): boolean => {\n if (filter === 'all') return true;\n if (filter === 'read') return row.status === 'READ';\n return row.status !== 'READ';\n }),\n [filter, rows],\n );\n\n const groupedRows = useMemo(\n (): ReadonlyArray<readonly [TimeGroup, readonly NotificationRecord[]]> => {\n const now = new Date();\n const buckets = TIME_GROUP_ORDER.reduce<\n Record<TimeGroup, NotificationRecord[]>\n >(\n (accumulator, group) => {\n accumulator[group] = [];\n return accumulator;\n },\n { earlier: [], past7Days: [], today: [], yesterday: [] },\n );\n filteredRows.forEach((row): void => {\n buckets[resolveTimeGroup(row.createdAt, now)].push(row);\n });\n return TIME_GROUP_ORDER.map(\n (group) => [group, buckets[group]] as const,\n ).filter(([, items]) => items.length > 0);\n },\n [filteredRows],\n );\n\n const hasMore = rows.length < totalCount;\n\n if (!currentMemberId) return null;\n\n return (\n <Drawer\n bottomGhostActionDisabled={bulkLoading || loading}\n bottomGhostActionLoading={bulkLoading}\n bottomGhostActionText=\"全部標為已讀\"\n bottomOnGhostActionClick={(): void => {\n void handleMarkAllRead();\n }}\n bottomOnPrimaryActionClick={(): void => {\n handleLoadMore();\n }}\n bottomPrimaryActionDisabled={!hasMore || loading}\n bottomPrimaryActionLoading={loading && hasMore}\n bottomPrimaryActionText={hasMore ? '載入更多' : '已顯示全部'}\n contentKey={`${filter}:${rows.length}`}\n filterAreaAllRadioLabel=\"全部\"\n filterAreaOnRadioChange={handleFilterChange}\n filterAreaReadRadioLabel=\"已讀\"\n filterAreaShow\n filterAreaUnreadRadioLabel=\"未讀\"\n filterAreaValue={filter}\n headerTitle=\"通知中心\"\n isBottomDisplay\n isHeaderDisplay\n onClose={close}\n open={isOpen}\n size=\"medium\"\n >\n <div role=\"list\">\n {error ? (\n <p\n role=\"alert\"\n style={{\n color: 'var(--mzn-color-text-error, #d92d20)',\n padding: '12px 16px',\n }}\n >\n {error}\n </p>\n ) : null}\n {groupedRows.length === 0 ? (\n <p\n style={{\n color: 'var(--mzn-color-text-secondary, #6b7280)',\n padding: '24px 16px',\n textAlign: 'center',\n }}\n >\n {loading ? '載入中…' : '目前沒有通知'}\n </p>\n ) : null}\n {groupedRows.map(([group, items], groupIndex) => (\n <Fragment key={group}>\n {items.map((record, itemIndex) => (\n <NotificationCenter\n appendTips={\n groupIndex === groupedRows.length - 1 &&\n itemIndex === items.length - 1 &&\n !hasMore\n ? '已顯示全部通知'\n : undefined\n }\n cancelButtonText={\n record.status !== 'READ' ? '標為已讀' : undefined\n }\n description={record.body}\n key={record.id}\n onCancel={\n record.status !== 'READ'\n ? (): void => {\n void handleMarkRead(record.id);\n }\n : undefined\n }\n onConfirm={\n record.instanceId\n ? (): void => {\n void handleOpenInstance(record);\n }\n : undefined\n }\n confirmButtonText={record.instanceId ? '查看案件' : undefined}\n prependTips={itemIndex === 0 ? TIME_GROUP_LABEL[group] : undefined}\n reference={record.id}\n severity={toSeverity(record.type)}\n showBadge={record.status !== 'READ'}\n timeStamp={record.createdAt}\n title={record.title}\n type=\"drawer\"\n />\n ))}\n </Fragment>\n ))}\n </div>\n </Drawer>\n );\n}\n\nfunction toSeverity(type: NotificationType): NotificationSeverity {\n if (type === 'SLA_OVERDUE') return 'error';\n if (type === 'SLA_WARNING') return 'warning';\n if (type === 'INSTANCE_COMPLETED') return 'success';\n return 'info';\n}\n\nfunction resolveTimeGroup(value: string, now: Date): TimeGroup {\n const notificationDate = new Date(value);\n if (Number.isNaN(notificationDate.getTime())) return 'earlier';\n const nowStartOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const notificationStartOfDay = new Date(\n notificationDate.getFullYear(),\n notificationDate.getMonth(),\n notificationDate.getDate(),\n );\n if (notificationStartOfDay.getTime() === nowStartOfDay.getTime()) return 'today';\n const yesterdayStartOfDay = new Date(nowStartOfDay);\n yesterdayStartOfDay.setDate(yesterdayStartOfDay.getDate() - 1);\n if (notificationStartOfDay.getTime() === yesterdayStartOfDay.getTime())\n return 'yesterday';\n const diffInDays =\n (now.getTime() - notificationDate.getTime()) / (1000 * 60 * 60 * 24);\n if (diffInDays <= 7) return 'past7Days';\n return 'earlier';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n","'use client';\n\nimport type { ReactElement, ReactNode } from 'react';\nimport {\n CalendarConfigProviderMoment,\n CalendarLocale,\n} from '@mezzanine-ui/react/moment';\nimport { AuthProvider } from './auth-provider';\nimport { NotificationDrawer } from '../components/notification-drawer';\nimport { NotificationDrawerProvider } from './notification-drawer-provider';\nimport { NotificationUnreadProvider } from './notification-unread-provider';\n\ninterface ProvidersProps {\n readonly children: ReactNode;\n /** Override Mezzanine calendar locale. Defaults to `CalendarLocale.ZH_TW`. */\n readonly locale?: CalendarLocale;\n /**\n * Public paths that should not trigger redirect to `/login` when there\n * is no session. Forwarded to `<AuthProvider>`. Defaults to `['/login']`.\n */\n readonly publicPaths?: readonly string[];\n /** Where to send unauthenticated users. Defaults to `'/login'`. */\n readonly loginPath?: string;\n}\n\n/**\n * One-stop BPM admin provider stack. Wires:\n *\n * - Mezzanine UI calendar locale (moment-based, `ZH_TW` by default)\n * - `<AuthProvider>` (BPM session via REST `/auth/*`)\n * - `<NotificationUnreadProvider>` (polls unread count)\n * - `<NotificationDrawerProvider>` (controls drawer open/close state)\n * - `<NotificationDrawer />` mounted at the root so the bell-icon button in\n * `<AppLayout />` can open it.\n *\n * Consumer hosts wrap this **inside** a `<RouterAdapterProvider>` (provided\n * by the `pages/*` subpath shims when consuming via Next.js, or wired by\n * hand for other frameworks).\n */\nexport function Providers({\n children,\n locale = CalendarLocale.ZH_TW,\n publicPaths,\n loginPath,\n}: ProvidersProps): ReactElement {\n return (\n <CalendarConfigProviderMoment locale={locale}>\n <AuthProvider publicPaths={publicPaths} loginPath={loginPath}>\n <NotificationUnreadProvider>\n <NotificationDrawerProvider>\n {children}\n <NotificationDrawer />\n </NotificationDrawerProvider>\n </NotificationUnreadProvider>\n </AuthProvider>\n </CalendarConfigProviderMoment>\n );\n}\n"],"mappings":"msBA8BA,IAAM,EAAyC,CAC7C,QACA,YACA,YACA,SACF,EAEM,EAAwD,CAC5D,QAAS,KACT,UAAW,OACX,MAAO,KACP,UAAW,IACb,EAEM,EAAY,GAUlB,SAAgB,GAA0C,CACxD,IAAM,EAAS,EAAA,EAAiB,EAC1B,CAAE,UAAW,EAAA,EAAQ,EACrB,CAAE,QAAO,UAAW,EAAA,EAAsB,EAC1C,CAAE,sBAAuB,EAAA,EAAsB,EAC/C,EAAkB,GAAQ,UAAY,KACtC,CAAC,EAAM,IAAA,EAAA,EAAA,UAAmD,CAAC,CAAC,EAC5D,CAAC,EAAY,IAAA,EAAA,EAAA,UAA0B,CAAC,EACxC,CAAC,EAAM,IAAA,EAAA,EAAA,UAAoB,CAAC,EAC5B,CAAC,EAAS,IAAA,EAAA,EAAA,UAAuB,EAAK,EACtC,CAAC,EAAa,IAAA,EAAA,EAAA,UAA2B,EAAK,EAC9C,CAAC,EAAO,IAAA,EAAA,EAAA,UAAoC,IAAI,EAChD,CAAC,EAAQ,IAAA,EAAA,EAAA,UAAmC,KAAK,EAEjD,GAAA,EAAA,EAAA,aACJ,MAAO,EAAkB,IAAmC,CACrD,KAEL,CADA,EAAW,EAAI,EACf,EAAS,IAAI,EACb,GAAI,CACF,IAAM,EAAS,MAAA,EAAA,EAAA,mBAAwB,CACrC,YAAa,GACb,KAAM,EACN,SAAU,EACV,kBAAmB,CACrB,CAAC,EACD,EAAS,GACP,EAAS,CAAC,GAAG,EAAS,GAAG,EAAO,aAAa,EAAI,EAAO,aAC1D,EACA,EAAc,EAAO,UAAU,EAC/B,EAAQ,CAAQ,EAChB,MAAM,EAAmB,CAC3B,OAAS,EAAY,CACnB,EAAS,EAAiB,CAAC,CAAC,CAC9B,QAAU,CACR,EAAW,EAAK,CAClB,CAlBa,CAmBf,EACA,CAAC,EAAiB,CAAkB,CACtC,GAEA,EAAA,EAAA,eAAsB,CAChB,CAAC,GAAU,CAAC,GAChB,EAAc,EAAG,EAAK,CACxB,EAAG,CAAC,EAAQ,EAAiB,CAAQ,CAAC,EAEtC,IAAM,GAAA,EAAA,EAAA,aACH,GAA+C,CAC9C,IAAM,EAAO,EAAM,OAAO,OACtB,IAAS,OAAS,IAAS,QAAU,IAAS,WAAU,EAAU,CAAI,CAC5E,EACA,CAAC,CACH,EAEM,GAAA,EAAA,EAAA,aAAgC,SAA2B,CAC3D,MAAC,GAAmB,GAExB,CADA,EAAe,EAAI,EACnB,EAAS,IAAI,EACb,GAAI,CACF,MAAA,EAAA,EAAA,0BAA+B,CAAE,kBAAmB,CAAgB,CAAC,EACrE,MAAM,EAAS,EAAG,EAAK,CACzB,OAAS,EAAY,CACnB,EAAS,EAAiB,CAAC,CAAC,CAC9B,QAAU,CACR,EAAe,EAAK,CACtB,CARa,CASf,EAAG,CAAC,EAAa,EAAiB,CAAQ,CAAC,EAErC,GAAA,EAAA,EAAA,iBAAyC,CACzC,GACJ,EAAc,EAAO,EAAG,EAAI,CAC9B,EAAG,CAAC,EAAS,EAAU,CAAI,CAAC,EAEtB,GAAA,EAAA,EAAA,aACJ,KAAO,IAA8B,CAC9B,KACL,GAAI,CACF,MAAA,EAAA,EAAA,sBAA2B,CAAE,KAAI,eAAgB,CAAgB,CAAC,EAClE,MAAM,EAAS,EAAG,EAAK,CACzB,OAAS,EAAY,CACnB,EAAS,EAAiB,CAAC,CAAC,CAC9B,CACF,EACA,CAAC,EAAiB,CAAQ,CAC5B,EAEM,GAAA,EAAA,EAAA,aACJ,KAAO,IAA8C,CAC/C,MAAC,EAAO,YAAc,CAAC,GAC3B,GAAI,CACE,EAAO,SAAW,SACpB,MAAA,EAAA,EAAA,sBAA2B,CACzB,GAAI,EAAO,GACX,eAAgB,CAClB,CAAC,EACD,MAAM,EAAmB,GAE3B,EAAM,EACN,EAAO,KAAK,cAAc,EAAO,YAAY,CAC/C,OAAS,EAAY,CACnB,EAAS,EAAiB,CAAC,CAAC,CAC9B,CACF,EACA,CAAC,EAAO,EAAiB,EAAoB,CAAM,CACrD,EAEM,GAAA,EAAA,EAAA,aAEF,EAAK,OAAQ,GACP,IAAW,MAAc,GACzB,IAAW,OAAe,EAAI,SAAW,OACtC,EAAI,SAAW,MACvB,EACH,CAAC,EAAQ,CAAI,CACf,EAEM,GAAA,EAAA,EAAA,aACsE,CACxE,IAAM,EAAM,IAAI,KACV,EAAU,EAAiB,QAG9B,EAAa,KACZ,EAAY,GAAS,CAAC,EACf,GAET,CAAE,QAAS,CAAC,EAAG,UAAW,CAAC,EAAG,MAAO,CAAC,EAAG,UAAW,CAAC,CAAE,CACzD,EAIA,OAHA,EAAa,QAAS,GAAc,CAClC,EAAQ,EAAiB,EAAI,UAAW,CAAG,GAAG,KAAK,CAAG,CACxD,CAAC,EACM,EAAiB,IACrB,GAAU,CAAC,EAAO,EAAQ,EAAM,CACnC,EAAE,QAAQ,EAAG,KAAW,EAAM,OAAS,CAAC,CAC1C,EACA,CAAC,CAAY,CACf,EAEM,EAAU,EAAK,OAAS,EAI9B,OAFK,GAGH,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,0BAA2B,GAAe,EAC1C,yBAA0B,EAC1B,sBAAsB,SACtB,6BAAsC,CACpC,EAAuB,CACzB,EACA,+BAAwC,CACtC,EAAe,CACjB,EACA,4BAA6B,CAAC,GAAW,EACzC,2BAA4B,GAAW,EACvC,wBAAyB,EAAU,OAAS,QAC5C,WAAY,GAAG,EAAO,GAAG,EAAK,SAC9B,wBAAwB,KACxB,wBAAyB,EACzB,yBAAyB,KACzB,eAAA,GACA,2BAA2B,KAC3B,gBAAiB,EACjB,YAAY,OACZ,gBAAA,GACA,gBAAA,GACA,QAAS,EACT,KAAM,EACN,KAAK,mBAEL,EAAA,EAAA,MAAC,MAAD,CAAK,KAAK,gBAAV,CACG,GACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAK,QACL,MAAO,CACL,MAAO,uCACP,QAAS,WACX,WAEC,CACA,CAAA,EACD,KACH,EAAY,SAAW,GACtB,EAAA,EAAA,KAAC,IAAD,CACE,MAAO,CACL,MAAO,2CACP,QAAS,YACT,UAAW,QACb,WAEC,EAAU,OAAS,QACnB,CAAA,EACD,KACH,EAAY,KAAK,CAAC,EAAO,GAAQ,KAChC,EAAA,EAAA,KAAC,EAAA,SAAD,CAAA,SACG,EAAM,KAAK,EAAQ,KAClB,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,WACE,IAAe,EAAY,OAAS,GACpC,IAAc,EAAM,OAAS,GAC7B,CAAC,EACG,UACA,IAAA,GAEN,iBACE,EAAO,SAAW,OAAkB,IAAA,GAAT,OAE7B,YAAa,EAAO,KAEpB,SACE,EAAO,SAAW,OAId,IAAA,OAHY,CACV,EAAoB,EAAO,EAAE,CAC/B,EAGN,UACE,EAAO,eACS,CACV,EAAwB,CAAM,CAChC,EACA,IAAA,GAEN,kBAAmB,EAAO,WAAa,OAAS,IAAA,GAChD,YAAa,IAAc,EAAI,EAAiB,GAAS,IAAA,GACzD,UAAW,EAAO,GAClB,SAAU,EAAW,EAAO,IAAI,EAChC,UAAW,EAAO,SAAW,OAC7B,UAAW,EAAO,UAClB,MAAO,EAAO,MACd,KAAK,QACN,EAvBM,EAAO,EAuBb,CACF,CACO,EAvCK,CAuCL,CACX,CACE,GACC,CAAA,EAhGmB,IAkG/B,CAEA,SAAS,EAAW,EAA8C,CAIhE,OAHI,IAAS,cAAsB,QAC/B,IAAS,cAAsB,UAC/B,IAAS,qBAA6B,UACnC,MACT,CAEA,SAAS,EAAiB,EAAe,EAAsB,CAC7D,IAAM,EAAmB,IAAI,KAAK,CAAK,EACvC,GAAI,OAAO,MAAM,EAAiB,QAAQ,CAAC,EAAG,MAAO,UACrD,IAAM,EAAgB,IAAI,KAAK,EAAI,YAAY,EAAG,EAAI,SAAS,EAAG,EAAI,QAAQ,CAAC,EACzE,EAAyB,IAAI,KACjC,EAAiB,YAAY,EAC7B,EAAiB,SAAS,EAC1B,EAAiB,QAAQ,CAC3B,EACA,GAAI,EAAuB,QAAQ,IAAM,EAAc,QAAQ,EAAG,MAAO,QACzE,IAAM,EAAsB,IAAI,KAAK,CAAa,EAOlD,OANA,EAAoB,QAAQ,EAAoB,QAAQ,EAAI,CAAC,EACzD,EAAuB,QAAQ,IAAM,EAAoB,QAAQ,EAC5D,aAEN,EAAI,QAAQ,EAAI,EAAiB,QAAQ,IAAM,IAAO,GAAK,GAAK,KACjD,EAAU,YACrB,SACT,CAEA,SAAS,EAAiB,EAAwB,CAChD,OAAO,aAAiB,MAAQ,EAAM,QAAU,QAClD,CC5RA,SAAgB,EAAU,CACxB,WACA,SAAS,EAAA,eAAe,MACxB,cACA,aAC+B,CAC/B,OACE,EAAA,EAAA,KAAC,EAAA,6BAAD,CAAsC,mBACpC,EAAA,EAAA,KAAC,EAAA,EAAD,CAA2B,cAAwB,sBACjD,EAAA,EAAA,KAAC,EAAA,EAAD,CAAA,UACE,EAAA,EAAA,MAAC,EAAA,EAAD,CAAA,SAAA,CACG,GACD,EAAA,EAAA,KAAC,EAAD,CAAqB,CAAA,CACK,CAAA,CAAA,CACF,CAAA,CAChB,CAAA,CACc,CAAA,CAElC"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/components/notification-drawer.tsx","../src/lib/providers.tsx"],"sourcesContent":["'use client';\n\nimport {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ChangeEvent,\n type ReactElement,\n} from 'react';\nimport Drawer from '@mezzanine-ui/react/Drawer';\nimport NotificationCenter from '@mezzanine-ui/react/NotificationCenter';\nimport type { NotificationSeverity } from '@mezzanine-ui/core/notification-center';\nimport {\n listNotifications,\n markAllNotificationsRead,\n markNotificationRead,\n type NotificationRecord,\n type NotificationType,\n} from '@rytass/bpm-core-client/workflow';\nimport { useAuth } from '../lib/auth-provider';\nimport { useNotificationDrawer } from '../lib/notification-drawer-provider';\nimport { useNotificationUnread } from '../lib/notification-unread-provider';\nimport { useRouterAdapter } from '../lib/router-adapter';\nimport { useBPMRoutes } from '../lib/routes-config';\n\ntype FilterValue = 'all' | 'read' | 'unread';\n\ntype TimeGroup = 'today' | 'yesterday' | 'past7Days' | 'earlier';\n\nconst TIME_GROUP_ORDER: readonly TimeGroup[] = [\n 'today',\n 'yesterday',\n 'past7Days',\n 'earlier',\n];\n\nconst TIME_GROUP_LABEL: Readonly<Record<TimeGroup, string>> = {\n earlier: '更早',\n past7Days: '過去七天',\n today: '今天',\n yesterday: '昨天',\n};\n\nconst PAGE_SIZE = 50;\n\n/**\n * Right-side notification drawer mounted at the root by `<Providers>`.\n * Opens / closes via `useNotificationDrawer()`, polls\n * `listNotifications()` for the current member, supports filter\n * (`all` / `read` / `unread`), per-row mark-read, bulk mark-all-read, and\n * load-more pagination. Clicking a row with an `instanceId` navigates to\n * `/instances/<id>` via the host's router adapter.\n */\nexport function NotificationDrawer(): ReactElement | null {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const { member } = useAuth();\n const { close, isOpen } = useNotificationDrawer();\n const { refreshUnreadCount } = useNotificationUnread();\n const currentMemberId = member?.memberId ?? null;\n const [rows, setRows] = useState<readonly NotificationRecord[]>([]);\n const [totalCount, setTotalCount] = useState(0);\n const [page, setPage] = useState(1);\n const [loading, setLoading] = useState(false);\n const [bulkLoading, setBulkLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [filter, setFilter] = useState<FilterValue>('all');\n\n const loadPage = useCallback(\n async (nextPage: number, append: boolean): Promise<void> => {\n if (!currentMemberId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await listNotifications({\n includeRead: true,\n page: nextPage,\n pageSize: PAGE_SIZE,\n recipientMemberId: currentMemberId,\n });\n setRows((current): readonly NotificationRecord[] =>\n append ? [...current, ...result.notifications] : result.notifications,\n );\n setTotalCount(result.totalCount);\n setPage(nextPage);\n await refreshUnreadCount();\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n } finally {\n setLoading(false);\n }\n },\n [currentMemberId, refreshUnreadCount],\n );\n\n useEffect((): void => {\n if (!isOpen || !currentMemberId) return;\n void loadPage(1, false);\n }, [isOpen, currentMemberId, loadPage]);\n\n const handleFilterChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>): void => {\n const next = event.target.value;\n if (next === 'all' || next === 'read' || next === 'unread') setFilter(next);\n },\n [],\n );\n\n const handleMarkAllRead = useCallback(async (): Promise<void> => {\n if (!currentMemberId || bulkLoading) return;\n setBulkLoading(true);\n setError(null);\n try {\n await markAllNotificationsRead({ recipientMemberId: currentMemberId });\n await loadPage(1, false);\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n } finally {\n setBulkLoading(false);\n }\n }, [bulkLoading, currentMemberId, loadPage]);\n\n const handleLoadMore = useCallback((): void => {\n if (loading) return;\n void loadPage(page + 1, true);\n }, [loading, loadPage, page]);\n\n const handleMarkRead = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) return;\n try {\n await markNotificationRead({ id, readerMemberId: currentMemberId });\n await loadPage(1, false);\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n }\n },\n [currentMemberId, loadPage],\n );\n\n const handleOpenInstance = useCallback(\n async (record: NotificationRecord): Promise<void> => {\n if (!record.instanceId || !currentMemberId) return;\n try {\n if (record.status !== 'READ') {\n await markNotificationRead({\n id: record.id,\n readerMemberId: currentMemberId,\n });\n await refreshUnreadCount();\n }\n close();\n router.push(routes.caseDetail(record.instanceId));\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n }\n },\n [close, currentMemberId, refreshUnreadCount, router, routes],\n );\n\n const filteredRows = useMemo(\n (): readonly NotificationRecord[] =>\n rows.filter((row): boolean => {\n if (filter === 'all') return true;\n if (filter === 'read') return row.status === 'READ';\n return row.status !== 'READ';\n }),\n [filter, rows],\n );\n\n const groupedRows = useMemo(\n (): ReadonlyArray<readonly [TimeGroup, readonly NotificationRecord[]]> => {\n const now = new Date();\n const buckets = TIME_GROUP_ORDER.reduce<\n Record<TimeGroup, NotificationRecord[]>\n >(\n (accumulator, group) => {\n accumulator[group] = [];\n return accumulator;\n },\n { earlier: [], past7Days: [], today: [], yesterday: [] },\n );\n filteredRows.forEach((row): void => {\n buckets[resolveTimeGroup(row.createdAt, now)].push(row);\n });\n return TIME_GROUP_ORDER.map(\n (group) => [group, buckets[group]] as const,\n ).filter(([, items]) => items.length > 0);\n },\n [filteredRows],\n );\n\n const hasMore = rows.length < totalCount;\n\n if (!currentMemberId) return null;\n\n return (\n <Drawer\n bottomGhostActionDisabled={bulkLoading || loading}\n bottomGhostActionLoading={bulkLoading}\n bottomGhostActionText=\"全部標為已讀\"\n bottomOnGhostActionClick={(): void => {\n void handleMarkAllRead();\n }}\n bottomOnPrimaryActionClick={(): void => {\n handleLoadMore();\n }}\n bottomPrimaryActionDisabled={!hasMore || loading}\n bottomPrimaryActionLoading={loading && hasMore}\n bottomPrimaryActionText={hasMore ? '載入更多' : '已顯示全部'}\n contentKey={`${filter}:${rows.length}`}\n filterAreaAllRadioLabel=\"全部\"\n filterAreaOnRadioChange={handleFilterChange}\n filterAreaReadRadioLabel=\"已讀\"\n filterAreaShow\n filterAreaUnreadRadioLabel=\"未讀\"\n filterAreaValue={filter}\n headerTitle=\"通知中心\"\n isBottomDisplay\n isHeaderDisplay\n onClose={close}\n open={isOpen}\n size=\"medium\"\n >\n <div role=\"list\">\n {error ? (\n <p\n role=\"alert\"\n style={{\n color: 'var(--mzn-color-text-error, #d92d20)',\n padding: '12px 16px',\n }}\n >\n {error}\n </p>\n ) : null}\n {groupedRows.length === 0 ? (\n <p\n style={{\n color: 'var(--mzn-color-text-secondary, #6b7280)',\n padding: '24px 16px',\n textAlign: 'center',\n }}\n >\n {loading ? '載入中…' : '目前沒有通知'}\n </p>\n ) : null}\n {groupedRows.map(([group, items], groupIndex) => (\n <Fragment key={group}>\n {items.map((record, itemIndex) => (\n <NotificationCenter\n appendTips={\n groupIndex === groupedRows.length - 1 &&\n itemIndex === items.length - 1 &&\n !hasMore\n ? '已顯示全部通知'\n : undefined\n }\n cancelButtonText={\n record.status !== 'READ' ? '標為已讀' : undefined\n }\n description={record.body}\n key={record.id}\n onCancel={\n record.status !== 'READ'\n ? (): void => {\n void handleMarkRead(record.id);\n }\n : undefined\n }\n onConfirm={\n record.instanceId\n ? (): void => {\n void handleOpenInstance(record);\n }\n : undefined\n }\n confirmButtonText={record.instanceId ? '查看案件' : undefined}\n prependTips={itemIndex === 0 ? TIME_GROUP_LABEL[group] : undefined}\n reference={record.id}\n severity={toSeverity(record.type)}\n showBadge={record.status !== 'READ'}\n timeStamp={record.createdAt}\n title={record.title}\n type=\"drawer\"\n />\n ))}\n </Fragment>\n ))}\n </div>\n </Drawer>\n );\n}\n\nfunction toSeverity(type: NotificationType): NotificationSeverity {\n if (type === 'SLA_OVERDUE') return 'error';\n if (type === 'SLA_WARNING') return 'warning';\n if (type === 'INSTANCE_COMPLETED') return 'success';\n return 'info';\n}\n\nfunction resolveTimeGroup(value: string, now: Date): TimeGroup {\n const notificationDate = new Date(value);\n if (Number.isNaN(notificationDate.getTime())) return 'earlier';\n const nowStartOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const notificationStartOfDay = new Date(\n notificationDate.getFullYear(),\n notificationDate.getMonth(),\n notificationDate.getDate(),\n );\n if (notificationStartOfDay.getTime() === nowStartOfDay.getTime()) return 'today';\n const yesterdayStartOfDay = new Date(nowStartOfDay);\n yesterdayStartOfDay.setDate(yesterdayStartOfDay.getDate() - 1);\n if (notificationStartOfDay.getTime() === yesterdayStartOfDay.getTime())\n return 'yesterday';\n const diffInDays =\n (now.getTime() - notificationDate.getTime()) / (1000 * 60 * 60 * 24);\n if (diffInDays <= 7) return 'past7Days';\n return 'earlier';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n","'use client';\n\nimport type { ReactElement, ReactNode } from 'react';\nimport {\n CalendarConfigProviderMoment,\n CalendarLocale,\n} from '@mezzanine-ui/react/moment';\nimport { AuthProvider } from './auth-provider';\nimport { NotificationDrawer } from '../components/notification-drawer';\nimport { NotificationDrawerProvider } from './notification-drawer-provider';\nimport { NotificationUnreadProvider } from './notification-unread-provider';\n\ninterface ProvidersProps {\n readonly children: ReactNode;\n /** Override Mezzanine calendar locale. Defaults to `CalendarLocale.ZH_TW`. */\n readonly locale?: CalendarLocale;\n /**\n * Public paths that should not trigger redirect to `/login` when there\n * is no session. Forwarded to `<AuthProvider>`. Defaults to `['/login']`.\n */\n readonly publicPaths?: readonly string[];\n /** Where to send unauthenticated users. Defaults to `'/login'`. */\n readonly loginPath?: string;\n}\n\n/**\n * One-stop BPM admin provider stack. Wires:\n *\n * - Mezzanine UI calendar locale (moment-based, `ZH_TW` by default)\n * - `<AuthProvider>` (BPM session via REST `/auth/*`)\n * - `<NotificationUnreadProvider>` (polls unread count)\n * - `<NotificationDrawerProvider>` (controls drawer open/close state)\n * - `<NotificationDrawer />` mounted at the root so the bell-icon button in\n * `<AppLayout />` can open it.\n *\n * Consumer hosts wrap this **inside** a `<RouterAdapterProvider>` (provided\n * by the `pages/*` subpath shims when consuming via Next.js, or wired by\n * hand for other frameworks).\n */\nexport function Providers({\n children,\n locale = CalendarLocale.ZH_TW,\n publicPaths,\n loginPath,\n}: ProvidersProps): ReactElement {\n return (\n <CalendarConfigProviderMoment locale={locale}>\n <AuthProvider publicPaths={publicPaths} loginPath={loginPath}>\n <NotificationUnreadProvider>\n <NotificationDrawerProvider>\n {children}\n <NotificationDrawer />\n </NotificationDrawerProvider>\n </NotificationUnreadProvider>\n </AuthProvider>\n </CalendarConfigProviderMoment>\n );\n}\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export * from './lib/notification-drawer-provider';
4
4
  export * from './lib/notification-unread-provider';
5
5
  export * from './lib/providers';
6
6
  export * from './lib/router-adapter';
7
+ export * from './lib/routes-config';
7
8
  export * from './components/admin-pickers';
8
9
  export * from './components/app-navigation';
9
10
  export * from './components/approval-instance-list-page';