@rytass/bpm-core-react 0.3.8 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/README.md +69 -4
  3. package/dist/chunks/approval-instance-list-page-BF2r5D2-.js +278 -0
  4. package/dist/chunks/approval-instance-list-page-BF2r5D2-.js.map +1 -0
  5. package/dist/chunks/approval-instance-list-page-C5ZKPHdA.cjs +2 -0
  6. package/dist/chunks/approval-instance-list-page-C5ZKPHdA.cjs.map +1 -0
  7. package/dist/chunks/auth-provider-4BeCw7cI.cjs +2 -0
  8. package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -0
  9. package/dist/chunks/auth-provider-B5oPmvk2.js +83 -0
  10. package/dist/chunks/auth-provider-B5oPmvk2.js.map +1 -0
  11. package/dist/chunks/{builder-D950gct_.js → builder-BLVnnpnP.js} +474 -478
  12. package/dist/chunks/builder-BLVnnpnP.js.map +1 -0
  13. package/dist/chunks/builder-DVE9zIKH.cjs +3 -0
  14. package/dist/chunks/builder-DVE9zIKH.cjs.map +1 -0
  15. package/dist/chunks/categories-B6QZKZRt.cjs +2 -0
  16. package/dist/chunks/categories-B6QZKZRt.cjs.map +1 -0
  17. package/dist/chunks/categories-DBPoSrsi.js +382 -0
  18. package/dist/chunks/categories-DBPoSrsi.js.map +1 -0
  19. package/dist/chunks/chunk-CMqjfN_6.cjs +1 -0
  20. package/dist/chunks/dashboard-page-CddG1MnK.cjs +2 -0
  21. package/dist/chunks/dashboard-page-CddG1MnK.cjs.map +1 -0
  22. package/dist/chunks/dashboard-page-Ib8srCMy.js +119 -0
  23. package/dist/chunks/dashboard-page-Ib8srCMy.js.map +1 -0
  24. package/dist/chunks/delegations-C2wLWsDQ.cjs +2 -0
  25. package/dist/chunks/delegations-C2wLWsDQ.cjs.map +1 -0
  26. package/dist/chunks/delegations-DDEk-WI6.cjs +2 -0
  27. package/dist/chunks/delegations-DDEk-WI6.cjs.map +1 -0
  28. package/dist/chunks/delegations-ZNtodFaD.js +568 -0
  29. package/dist/chunks/delegations-ZNtodFaD.js.map +1 -0
  30. package/dist/chunks/delegations-iVnRi3QE.js +641 -0
  31. package/dist/chunks/delegations-iVnRi3QE.js.map +1 -0
  32. package/dist/chunks/detail-Dcr5mM8g.cjs +2 -0
  33. package/dist/chunks/detail-Dcr5mM8g.cjs.map +1 -0
  34. package/dist/chunks/detail-u9DdLhDW.js +1518 -0
  35. package/dist/chunks/detail-u9DdLhDW.js.map +1 -0
  36. package/dist/chunks/format-date-time-XxBzF0F5.cjs +2 -0
  37. package/dist/chunks/{format-date-time-26_pFvv4.cjs.map → format-date-time-XxBzF0F5.cjs.map} +1 -1
  38. package/dist/chunks/login-9bCXyjbX.cjs +2 -0
  39. package/dist/chunks/{login-CQ9MfwcC.cjs.map → login-9bCXyjbX.cjs.map} +1 -1
  40. package/dist/chunks/{login-C20yVxbc.js → login-BKxpLibd.js} +3 -2
  41. package/dist/chunks/{login-C20yVxbc.js.map → login-BKxpLibd.js.map} +1 -1
  42. package/dist/chunks/notifications-BKs4--96.cjs +2 -0
  43. package/dist/chunks/notifications-BKs4--96.cjs.map +1 -0
  44. package/dist/chunks/notifications-CSulztkU.js +193 -0
  45. package/dist/chunks/notifications-CSulztkU.js.map +1 -0
  46. package/dist/chunks/orgs-BIiqzHvb.cjs +2 -0
  47. package/dist/chunks/orgs-BIiqzHvb.cjs.map +1 -0
  48. package/dist/chunks/orgs-Cc18umVt.js +1944 -0
  49. package/dist/chunks/orgs-Cc18umVt.js.map +1 -0
  50. package/dist/chunks/router-adapter--gYs13E8.cjs +2 -0
  51. package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -0
  52. package/dist/chunks/router-adapter-DftlFTOd.js +23 -0
  53. package/dist/chunks/router-adapter-DftlFTOd.js.map +1 -0
  54. package/dist/chunks/templates-D44FSB46.js +380 -0
  55. package/dist/chunks/templates-D44FSB46.js.map +1 -0
  56. package/dist/chunks/templates-w96t83N-.cjs +2 -0
  57. package/dist/chunks/templates-w96t83N-.cjs.map +1 -0
  58. package/dist/chunks/users-CUY139DF.js +214 -0
  59. package/dist/chunks/users-CUY139DF.js.map +1 -0
  60. package/dist/chunks/users-qghSMtLn.cjs +2 -0
  61. package/dist/chunks/users-qghSMtLn.cjs.map +1 -0
  62. package/dist/components/approval-instance-list-page.d.ts +1 -2
  63. package/dist/components/bpm-notification-bell-button.d.ts +22 -0
  64. package/dist/components/dashboard-page.d.ts +1 -4
  65. package/dist/index.cjs +1 -1
  66. package/dist/index.cjs.map +1 -1
  67. package/dist/index.css +1 -0
  68. package/dist/index.d.ts +3 -1
  69. package/dist/index.js +206 -97
  70. package/dist/index.js.map +1 -1
  71. package/dist/lib/notification-drawer-provider.d.ts +3 -2
  72. package/dist/lib/notification-unread-provider.d.ts +6 -5
  73. package/dist/lib/providers.d.ts +3 -2
  74. package/dist/lib/use-bpm-logout.d.ts +12 -0
  75. package/dist/lib/use-bpm-member.d.ts +11 -0
  76. package/dist/next/BPMNextProviders.d.ts +1 -1
  77. package/dist/next/index.cjs +1 -1
  78. package/dist/next/index.cjs.map +1 -1
  79. package/dist/next/index.js +13 -23
  80. package/dist/next/index.js.map +1 -1
  81. package/dist/pages/admin/delegations/index.cjs +1 -1
  82. package/dist/pages/admin/delegations/index.js +1 -1
  83. package/dist/pages/admin/orgs/index.cjs +1 -1
  84. package/dist/pages/admin/orgs/index.js +1 -1
  85. package/dist/pages/admin/users/index.cjs +1 -1
  86. package/dist/pages/admin/users/index.js +1 -1
  87. package/dist/pages/delegations/index.cjs +1 -1
  88. package/dist/pages/delegations/index.js +1 -1
  89. package/dist/pages/forms/builder/index.cjs +1 -1
  90. package/dist/pages/forms/builder/index.js +1 -1
  91. package/dist/pages/instances/detail/index.cjs +1 -1
  92. package/dist/pages/instances/detail/index.js +1 -1
  93. package/dist/pages/login/index.cjs +1 -1
  94. package/dist/pages/login/index.js +1 -1
  95. package/dist/pages/settings/notifications/index.cjs +1 -1
  96. package/dist/pages/settings/notifications/index.js +1 -1
  97. package/dist/pages/templates/categories/index.cjs +1 -1
  98. package/dist/pages/templates/categories/index.js +1 -1
  99. package/dist/pages/templates/index.cjs +1 -1
  100. package/dist/pages/templates/index.js +1 -1
  101. package/dist/views/admin/delegations/AdminDelegationsView.d.ts +1 -4
  102. package/dist/views/admin/delegations/index.cjs +1 -1
  103. package/dist/views/admin/delegations/index.js +1 -1
  104. package/dist/views/admin/index.cjs +1 -1
  105. package/dist/views/admin/index.js +3 -3
  106. package/dist/views/admin/orgs/AdminOrgsView.d.ts +1 -4
  107. package/dist/views/admin/orgs/index.cjs +1 -1
  108. package/dist/views/admin/orgs/index.js +1 -1
  109. package/dist/views/admin/users/AdminUsersView.d.ts +1 -4
  110. package/dist/views/admin/users/index.cjs +1 -1
  111. package/dist/views/admin/users/index.js +1 -1
  112. package/dist/views/cc/CcView.d.ts +1 -3
  113. package/dist/views/cc/index.cjs +1 -1
  114. package/dist/views/cc/index.cjs.map +1 -1
  115. package/dist/views/cc/index.js +2 -3
  116. package/dist/views/cc/index.js.map +1 -1
  117. package/dist/views/dashboard/DashboardView.d.ts +1 -3
  118. package/dist/views/dashboard/index.cjs +1 -1
  119. package/dist/views/dashboard/index.cjs.map +1 -1
  120. package/dist/views/dashboard/index.js +3 -3
  121. package/dist/views/dashboard/index.js.map +1 -1
  122. package/dist/views/delegations/DelegationsView.d.ts +1 -4
  123. package/dist/views/delegations/index.cjs +1 -1
  124. package/dist/views/delegations/index.js +1 -1
  125. package/dist/views/forms/FormsView.d.ts +1 -3
  126. package/dist/views/forms/builder/index.cjs +1 -1
  127. package/dist/views/forms/builder/index.js +1 -1
  128. package/dist/views/forms/index.cjs +1 -1
  129. package/dist/views/forms/index.cjs.map +1 -1
  130. package/dist/views/forms/index.js +95 -99
  131. package/dist/views/forms/index.js.map +1 -1
  132. package/dist/views/inbox/InboxView.d.ts +1 -3
  133. package/dist/views/inbox/index.cjs +1 -1
  134. package/dist/views/inbox/index.cjs.map +1 -1
  135. package/dist/views/inbox/index.js +91 -94
  136. package/dist/views/inbox/index.js.map +1 -1
  137. package/dist/views/instances/detail/index.cjs +1 -1
  138. package/dist/views/instances/detail/index.js +1 -1
  139. package/dist/views/instances/new/index.cjs +1 -1
  140. package/dist/views/instances/new/index.cjs.map +1 -1
  141. package/dist/views/instances/new/index.js +71 -77
  142. package/dist/views/instances/new/index.js.map +1 -1
  143. package/dist/views/login/index.cjs +1 -1
  144. package/dist/views/login/index.js +1 -1
  145. package/dist/views/root/RootView.d.ts +1 -3
  146. package/dist/views/search/SearchView.d.ts +1 -3
  147. package/dist/views/search/index.cjs +1 -1
  148. package/dist/views/search/index.cjs.map +1 -1
  149. package/dist/views/search/index.js +2 -3
  150. package/dist/views/search/index.js.map +1 -1
  151. package/dist/views/sent/SentView.d.ts +1 -3
  152. package/dist/views/sent/index.cjs +1 -1
  153. package/dist/views/sent/index.cjs.map +1 -1
  154. package/dist/views/sent/index.js +2 -3
  155. package/dist/views/sent/index.js.map +1 -1
  156. package/dist/views/settings/index.cjs +1 -1
  157. package/dist/views/settings/index.js +1 -1
  158. package/dist/views/settings/notifications/SettingsNotificationsView.d.ts +1 -4
  159. package/dist/views/settings/notifications/index.cjs +1 -1
  160. package/dist/views/settings/notifications/index.js +1 -1
  161. package/dist/views/templates/TemplatesView.d.ts +1 -4
  162. package/dist/views/templates/categories/TemplateCategoriesView.d.ts +1 -4
  163. package/dist/views/templates/categories/index.cjs +1 -1
  164. package/dist/views/templates/categories/index.js +1 -1
  165. package/dist/views/templates/designer/TemplateDesignerView.d.ts +1 -2
  166. package/dist/views/templates/designer/index.cjs +7 -7
  167. package/dist/views/templates/designer/index.cjs.map +1 -1
  168. package/dist/views/templates/designer/index.js +707 -711
  169. package/dist/views/templates/designer/index.js.map +1 -1
  170. package/dist/views/templates/index.cjs +1 -1
  171. package/dist/views/templates/index.js +2 -2
  172. package/dist/views/templates/versions/TemplateVersionsView.d.ts +1 -2
  173. package/dist/views/templates/versions/index.cjs +1 -1
  174. package/dist/views/templates/versions/index.cjs.map +1 -1
  175. package/dist/views/templates/versions/index.js +45 -49
  176. package/dist/views/templates/versions/index.js.map +1 -1
  177. package/package.json +2 -2
  178. package/dist/app-navigation.css +0 -1
  179. package/dist/chunks/app-navigation-BSkMsEhy.js +0 -268
  180. package/dist/chunks/app-navigation-BSkMsEhy.js.map +0 -1
  181. package/dist/chunks/app-navigation-KnlJCUp1.cjs +0 -2
  182. package/dist/chunks/app-navigation-KnlJCUp1.cjs.map +0 -1
  183. package/dist/chunks/approval-instance-list-page-CVXgE2K3.cjs +0 -2
  184. package/dist/chunks/approval-instance-list-page-CVXgE2K3.cjs.map +0 -1
  185. package/dist/chunks/approval-instance-list-page-CqNdoZqx.js +0 -282
  186. package/dist/chunks/approval-instance-list-page-CqNdoZqx.js.map +0 -1
  187. package/dist/chunks/auth-provider-BV8Iiwfb.cjs +0 -2
  188. package/dist/chunks/auth-provider-BV8Iiwfb.cjs.map +0 -1
  189. package/dist/chunks/auth-provider-Bnox5gsx.js +0 -98
  190. package/dist/chunks/auth-provider-Bnox5gsx.js.map +0 -1
  191. package/dist/chunks/builder-CMlJfQHE.cjs +0 -3
  192. package/dist/chunks/builder-CMlJfQHE.cjs.map +0 -1
  193. package/dist/chunks/builder-D950gct_.js.map +0 -1
  194. package/dist/chunks/categories-5yEM3p3N.cjs +0 -2
  195. package/dist/chunks/categories-5yEM3p3N.cjs.map +0 -1
  196. package/dist/chunks/categories-BIpOG451.js +0 -387
  197. package/dist/chunks/categories-BIpOG451.js.map +0 -1
  198. package/dist/chunks/dashboard-page-Bx1-Ys3e.js +0 -122
  199. package/dist/chunks/dashboard-page-Bx1-Ys3e.js.map +0 -1
  200. package/dist/chunks/dashboard-page-CQNRbMkJ.cjs +0 -2
  201. package/dist/chunks/dashboard-page-CQNRbMkJ.cjs.map +0 -1
  202. package/dist/chunks/delegations-B2j-wNEO.js +0 -646
  203. package/dist/chunks/delegations-B2j-wNEO.js.map +0 -1
  204. package/dist/chunks/delegations-CsB9ozLu.cjs +0 -2
  205. package/dist/chunks/delegations-CsB9ozLu.cjs.map +0 -1
  206. package/dist/chunks/delegations-CvtwTXNP.cjs +0 -2
  207. package/dist/chunks/delegations-CvtwTXNP.cjs.map +0 -1
  208. package/dist/chunks/delegations-dKodb0WW.js +0 -573
  209. package/dist/chunks/delegations-dKodb0WW.js.map +0 -1
  210. package/dist/chunks/detail-BcGAqJ_R.js +0 -1523
  211. package/dist/chunks/detail-BcGAqJ_R.js.map +0 -1
  212. package/dist/chunks/detail-CqjqLd65.cjs +0 -2
  213. package/dist/chunks/detail-CqjqLd65.cjs.map +0 -1
  214. package/dist/chunks/format-date-time-26_pFvv4.cjs +0 -2
  215. package/dist/chunks/login-CQ9MfwcC.cjs +0 -2
  216. package/dist/chunks/notifications-2swRqDPF.js +0 -198
  217. package/dist/chunks/notifications-2swRqDPF.js.map +0 -1
  218. package/dist/chunks/notifications-BaYDebFt.cjs +0 -2
  219. package/dist/chunks/notifications-BaYDebFt.cjs.map +0 -1
  220. package/dist/chunks/orgs-CuHxxd_n.js +0 -1949
  221. package/dist/chunks/orgs-CuHxxd_n.js.map +0 -1
  222. package/dist/chunks/orgs-YMiVLNvL.cjs +0 -2
  223. package/dist/chunks/orgs-YMiVLNvL.cjs.map +0 -1
  224. package/dist/chunks/templates-DTkbSgFY.cjs +0 -2
  225. package/dist/chunks/templates-DTkbSgFY.cjs.map +0 -1
  226. package/dist/chunks/templates-DoDWM68t.js +0 -384
  227. package/dist/chunks/templates-DoDWM68t.js.map +0 -1
  228. package/dist/chunks/users-3ySyUW4u.cjs +0 -2
  229. package/dist/chunks/users-3ySyUW4u.cjs.map +0 -1
  230. package/dist/chunks/users-sMfrSjRQ.js +0 -219
  231. package/dist/chunks/users-sMfrSjRQ.js.map +0 -1
  232. package/dist/components/app-navigation.d.ts +0 -41
@@ -0,0 +1,1944 @@
1
+ "use client";
2
+ import { a as e, i as t, n, o as r, r as i, t as a } from "./admin-pickers-DLlG_1du.js";
3
+ import { t as o } from "./bpm-form-field-Cao0rMol.js";
4
+ import { forwardRef as s, useCallback as c, useEffect as l, useImperativeHandle as u, useMemo as d, useRef as f, useState as p } from "react";
5
+ import { AutoComplete as m, Button as h, DatePicker as g, Filter as _, FilterArea as v, FilterLine as y, FormField as b, Input as x, Modal as S, PageHeader as C, Section as w, SectionGroup as T, Select as E, Tab as D, TabItem as O, Table as k, Typography as A } from "@mezzanine-ui/react";
6
+ import { resolveMembers as j } from "@rytass/bpm-core-client";
7
+ import { Fragment as M, jsx as N, jsxs as P } from "react/jsx-runtime";
8
+ import F from "@mezzanine-ui/react/ContentHeader";
9
+ import { FormFieldLayout as I } from "@mezzanine-ui/core/form";
10
+ import { CloseIcon as ee, EditIcon as L, PlusIcon as R, SaveIcon as te } from "@mezzanine-ui/icons";
11
+ import { commitOrgUnitTreeDraft as ne, createManagerResolution as re, createMembership as ie, createOrgUnit as ae, createPosition as oe, deleteManagerResolution as se, deleteMembership as ce, deleteOrgUnit as le, readOrganizationDashboard as ue, updateManagerResolution as de, updateMembership as fe, updateOrgUnit as pe, updatePosition as me } from "@rytass/bpm-core-client/organization";
12
+ import { Background as he, ConnectionMode as ge, Controls as _e, Handle as ve, MiniMap as ye, Position as be, ReactFlow as xe, applyNodeChanges as Se } from "@xyflow/react";
13
+ import * as Ce from "dagre";
14
+ import '../orgs.css';//#region src/lib/org-tree-draft.ts
15
+ function z(e) {
16
+ return new Map(e.map((e) => [e.id, e.parentId]));
17
+ }
18
+ function we({ orgUnitId: e, parentDraft: t, parentId: n }) {
19
+ let r = n === e ? e : n, i = Ee({
20
+ orgUnitId: e,
21
+ parentDraft: t,
22
+ parentId: r
23
+ });
24
+ if (i) return {
25
+ message: i,
26
+ parentDraft: t,
27
+ status: "INVALID"
28
+ };
29
+ if ((t.get(e) ?? null) === r) return {
30
+ message: "父子關係沒有變更。",
31
+ parentDraft: t,
32
+ status: "UNCHANGED"
33
+ };
34
+ let a = new Map(t);
35
+ return a.set(e, r), {
36
+ message: r ? "已暫存新的上層組織。" : "已暫存為根節點。",
37
+ parentDraft: a,
38
+ status: "UPDATED"
39
+ };
40
+ }
41
+ function Te({ orgUnits: e, parentDraft: t }) {
42
+ return e.map((e) => {
43
+ let n = t.get(e.id) ?? null;
44
+ return n === e.parentId ? null : {
45
+ orgUnitId: e.id,
46
+ parentId: n,
47
+ previousParentId: e.parentId
48
+ };
49
+ }).filter((e) => !!e);
50
+ }
51
+ function Ee({ orgUnitId: e, parentDraft: t, parentId: n }) {
52
+ return t.has(e) ? n ? t.has(n) ? n === e ? "組織不可成為自己的上層。" : De({
53
+ orgUnitId: e,
54
+ parentDraft: t,
55
+ parentId: n
56
+ }) ? "不可搬移到自己的下層組織。" : null : "找不到新的上層組織。" : null : "找不到要搬移的組織節點。";
57
+ }
58
+ function De({ orgUnitId: e, parentDraft: t, parentId: n }) {
59
+ let r = /* @__PURE__ */ new Set(), i = n;
60
+ for (; i;) {
61
+ if (i === e || r.has(i)) return !0;
62
+ r.add(i), i = t.get(i) ?? null;
63
+ }
64
+ return !1;
65
+ }
66
+ var B = {
67
+ orgTreeEditor: "bpm_orgTreeEditor_TMOtD",
68
+ orgTreeSummary: "bpm_orgTreeSummary_vpcV8",
69
+ orgTreeChangeList: "bpm_orgTreeChangeList_EzmOv",
70
+ orgTreeCanvas: "bpm_orgTreeCanvas_MeD7y",
71
+ orgTreeNode: "bpm_orgTreeNode_bN4FS",
72
+ orgTreeNodeRoot: "bpm_orgTreeNodeRoot_Hr2KD",
73
+ orgTreeNodeSelected: "bpm_orgTreeNodeSelected_eRwtL",
74
+ orgTreeNodeChanged: "bpm_orgTreeNodeChanged_qPJg0",
75
+ orgTreeNodeDeleted: "bpm_orgTreeNodeDeleted_Ab0cI",
76
+ orgTreeNodeHeader: "bpm_orgTreeNodeHeader_LEXl-",
77
+ orgTreeNodeBadge: "bpm_orgTreeNodeBadge_zLc7t",
78
+ orgTreeNodeActions: "bpm_orgTreeNodeActions_cMldI"
79
+ }, V = "__org-tree-root__", Oe = 232, ke = 118, Ae = 232, je = 86, Me = 320, Ne = {
80
+ COMPANY: "公司",
81
+ DEPARTMENT: "部門",
82
+ DIVISION: "事業群",
83
+ TEAM: "小組"
84
+ }, Pe = { orgUnit: Ie }, Fe = s(function({ onCreateChild: e, onCreateRoot: t, onEditOrgUnit: n, onSaveDraft: r, onStateChange: i, orgUnits: a }, o) {
85
+ let [s, f] = p(!1), [m, h] = p(null), [g, _] = p(null), [v, y] = p(() => z(a)), [b, x] = p([]), S = d(() => new Map(a.map((e) => [e.id, e])), [a]), C = d(() => Te({
86
+ orgUnits: a,
87
+ parentDraft: v
88
+ }), [a, v]), w = d(() => Le({
89
+ isEditing: s,
90
+ onCreateChild: (n) => {
91
+ n ? e(n) : t();
92
+ },
93
+ onEditOrgUnit: (e) => {
94
+ let t = S.get(e);
95
+ t && n(t);
96
+ },
97
+ orgUnits: a,
98
+ orgUnitsById: S,
99
+ parentDraft: v,
100
+ selectedOrgUnitId: g
101
+ }), [
102
+ s,
103
+ e,
104
+ t,
105
+ n,
106
+ a,
107
+ S,
108
+ v,
109
+ g
110
+ ]), T = C.length > 0;
111
+ u(o, () => ({
112
+ cancelEditing: M,
113
+ saveDraft: F,
114
+ startEditing: j
115
+ })), l(() => {
116
+ i({
117
+ hasDraftChanges: T,
118
+ isEditing: s
119
+ });
120
+ }, [
121
+ T,
122
+ s,
123
+ i
124
+ ]), l(() => {
125
+ y(z(a)), _(null), h(null), f(!1);
126
+ }, [a]), l(() => {
127
+ x(w.nodes);
128
+ }, [w.nodes]);
129
+ let E = c((e, t) => {
130
+ y((n) => {
131
+ let r = we({
132
+ orgUnitId: e,
133
+ parentDraft: n,
134
+ parentId: t
135
+ });
136
+ return h(r.message), r.parentDraft;
137
+ });
138
+ }, []), D = c((e) => {
139
+ if (!s || !e.target || !e.source) return;
140
+ let t = e.source === V ? null : e.source;
141
+ if (e.target === V) {
142
+ h("根節點不能搬移到其他節點下。");
143
+ return;
144
+ }
145
+ E(e.target, t);
146
+ }, [E, s]), O = c((e) => {
147
+ s && x((t) => Se(e, [...t]));
148
+ }, [s]), k = c((e, t, n) => {
149
+ if (!s || t.id === V) return;
150
+ let r = ze(e, t.id) ?? H(t, n);
151
+ if (r === void 0) {
152
+ h("拖曳到目標父節點附近,或從父節點拉線到子節點。");
153
+ return;
154
+ }
155
+ E(t.id, r === V ? null : r);
156
+ }, [E, s]);
157
+ function j() {
158
+ f(!0), y(z(a)), h("已進入編輯模式,拖曳節點或拉線只會更新前端草稿。");
159
+ }
160
+ function M() {
161
+ f(!1), y(z(a)), h("已取消草稿變更。");
162
+ }
163
+ async function F() {
164
+ if (!r) {
165
+ h("批次儲存 API 尚未接上,草稿仍保留在前端。");
166
+ return;
167
+ }
168
+ await r(C), f(!1), h("組織樹草稿已儲存。");
169
+ }
170
+ return /* @__PURE__ */ P("div", {
171
+ className: B.orgTreeEditor,
172
+ children: [/* @__PURE__ */ P("div", {
173
+ className: B.orgTreeSummary,
174
+ children: [/* @__PURE__ */ N(A, {
175
+ color: "text-neutral",
176
+ variant: "caption",
177
+ children: m ?? (T ? `目前有 ${C.length} 筆父子關係草稿變更。` : "目前沒有草稿變更。")
178
+ }), T ? /* @__PURE__ */ N("ul", {
179
+ className: B.orgTreeChangeList,
180
+ children: C.map((e) => /* @__PURE__ */ P("li", { children: [
181
+ U(e.orgUnitId, S),
182
+ ":",
183
+ U(e.previousParentId, S),
184
+ " -> ",
185
+ U(e.parentId, S)
186
+ ] }, e.orgUnitId))
187
+ }) : null]
188
+ }), /* @__PURE__ */ N("div", {
189
+ className: B.orgTreeCanvas,
190
+ children: /* @__PURE__ */ P(xe, {
191
+ connectionMode: ge.Strict,
192
+ edges: [...w.edges],
193
+ fitView: !0,
194
+ fitViewOptions: { padding: .18 },
195
+ isValidConnection: (e) => We({
196
+ source: e.source,
197
+ target: e.target
198
+ }, v),
199
+ maxZoom: 1.4,
200
+ minZoom: .25,
201
+ nodeTypes: Pe,
202
+ nodes: [...b],
203
+ nodesConnectable: s,
204
+ nodesDraggable: s,
205
+ onConnect: D,
206
+ onNodeClick: (e, t) => {
207
+ _(t.id === V ? null : t.id);
208
+ },
209
+ onNodeDoubleClick: (e, t) => {
210
+ if (t.id !== V) {
211
+ let e = S.get(t.id);
212
+ e && n(e);
213
+ }
214
+ },
215
+ onNodeDragStop: k,
216
+ onNodesChange: O,
217
+ onPaneClick: () => _(null),
218
+ panOnDrag: !0,
219
+ proOptions: { hideAttribution: !0 },
220
+ children: [
221
+ /* @__PURE__ */ N(he, {}),
222
+ /* @__PURE__ */ N(_e, {}),
223
+ /* @__PURE__ */ N(ye, {
224
+ pannable: !0,
225
+ zoomable: !0
226
+ })
227
+ ]
228
+ })
229
+ })]
230
+ });
231
+ });
232
+ function Ie({ data: e, selected: t }) {
233
+ return /* @__PURE__ */ P("div", {
234
+ className: [
235
+ B.orgTreeNode,
236
+ e.isSyntheticRoot ? B.orgTreeNodeRoot : "",
237
+ e.changed ? B.orgTreeNodeChanged : "",
238
+ e.deleted ? B.orgTreeNodeDeleted : "",
239
+ t ? B.orgTreeNodeSelected : ""
240
+ ].filter(Boolean).join(" "),
241
+ children: [
242
+ e.isSyntheticRoot ? null : /* @__PURE__ */ N(ve, {
243
+ id: "target",
244
+ isConnectable: e.isEditing,
245
+ position: be.Top,
246
+ type: "target"
247
+ }),
248
+ /* @__PURE__ */ N(ve, {
249
+ id: "source",
250
+ isConnectable: e.isEditing,
251
+ position: be.Bottom,
252
+ type: "source"
253
+ }),
254
+ /* @__PURE__ */ P("div", {
255
+ className: B.orgTreeNodeHeader,
256
+ children: [/* @__PURE__ */ N(A, {
257
+ component: "span",
258
+ ellipsis: !0,
259
+ title: e.name,
260
+ variant: "label-primary",
261
+ children: e.name
262
+ }), e.changed ? /* @__PURE__ */ N("span", {
263
+ className: B.orgTreeNodeBadge,
264
+ children: "草稿"
265
+ }) : null]
266
+ }),
267
+ /* @__PURE__ */ N(A, {
268
+ color: "text-neutral",
269
+ component: "span",
270
+ ellipsis: !0,
271
+ title: e.code,
272
+ variant: "caption",
273
+ children: e.isSyntheticRoot ? "根節點容器" : `${e.typeLabel} · ${e.code}`
274
+ }),
275
+ e.isSyntheticRoot ? null : /* @__PURE__ */ P(A, {
276
+ color: "text-neutral",
277
+ component: "span",
278
+ ellipsis: !0,
279
+ title: e.parentLabel,
280
+ variant: "caption",
281
+ children: ["上層:", e.parentLabel]
282
+ }),
283
+ /* @__PURE__ */ N("div", {
284
+ className: B.orgTreeNodeActions,
285
+ children: e.isSyntheticRoot ? /* @__PURE__ */ N(h, {
286
+ icon: R,
287
+ iconType: "leading",
288
+ onClick: () => e.onCreateChild(null),
289
+ size: "sub",
290
+ variant: "base-secondary",
291
+ children: "新增根節點"
292
+ }) : /* @__PURE__ */ P(M, { children: [/* @__PURE__ */ N(h, {
293
+ icon: L,
294
+ iconType: "leading",
295
+ onClick: () => {
296
+ e.orgUnitId && e.onEdit(e.orgUnitId);
297
+ },
298
+ size: "sub",
299
+ variant: "base-secondary",
300
+ children: "編輯"
301
+ }), /* @__PURE__ */ N(h, {
302
+ icon: R,
303
+ iconType: "leading",
304
+ onClick: () => e.onCreateChild(e.orgUnitId),
305
+ size: "sub",
306
+ variant: "base-secondary",
307
+ children: "新增子節點"
308
+ })] })
309
+ })
310
+ ]
311
+ });
312
+ }
313
+ function Le({ isEditing: e, onCreateChild: t, onEditOrgUnit: n, orgUnits: r, orgUnitsById: i, parentDraft: a, selectedOrgUnitId: o }) {
314
+ let s = new Ce.graphlib.Graph();
315
+ s.setDefaultEdgeLabel(() => ({})), s.setGraph({
316
+ marginx: 36,
317
+ marginy: 36,
318
+ nodesep: 44,
319
+ rankdir: "TB"
320
+ }), s.setNode(V, {
321
+ height: je,
322
+ width: Ae
323
+ }), r.forEach((e) => {
324
+ s.setNode(e.id, {
325
+ height: ke,
326
+ width: Oe
327
+ });
328
+ }), r.forEach((e) => {
329
+ let t = a.get(e.id) ?? null;
330
+ s.setEdge(t ?? V, e.id);
331
+ }), Ce.layout(s);
332
+ let c = Re({
333
+ data: {
334
+ changed: !1,
335
+ code: V,
336
+ deleted: !1,
337
+ isEditing: e,
338
+ isSyntheticRoot: !0,
339
+ name: "組織根節點",
340
+ onCreateChild: t,
341
+ onEdit: n,
342
+ orgUnitId: null,
343
+ parentLabel: "",
344
+ path: "",
345
+ typeLabel: ""
346
+ },
347
+ graph: s,
348
+ height: je,
349
+ id: V,
350
+ selected: o === null,
351
+ width: Ae
352
+ }), l = r.map((r) => {
353
+ let c = a.get(r.id) ?? null, l = U(c, i);
354
+ return Re({
355
+ data: {
356
+ changed: c !== r.parentId,
357
+ code: r.code,
358
+ deleted: !!r.deletedAt,
359
+ isEditing: e,
360
+ isSyntheticRoot: !1,
361
+ name: r.name,
362
+ onCreateChild: t,
363
+ onEdit: n,
364
+ orgUnitId: r.id,
365
+ parentLabel: l,
366
+ path: r.path,
367
+ typeLabel: Ge(r.type)
368
+ },
369
+ graph: s,
370
+ height: ke,
371
+ id: r.id,
372
+ selected: o === r.id,
373
+ width: Oe
374
+ });
375
+ });
376
+ return {
377
+ edges: r.map((t) => {
378
+ let n = a.get(t.id) ?? null, r = n !== t.parentId;
379
+ return {
380
+ animated: e && r,
381
+ data: {},
382
+ id: `org-tree-edge-${n ?? "root"}-${t.id}`,
383
+ source: n ?? V,
384
+ sourceHandle: "source",
385
+ style: r ? {
386
+ stroke: "var(--mzn-color-primary, #0057ff)",
387
+ strokeWidth: 2
388
+ } : void 0,
389
+ target: t.id,
390
+ targetHandle: "target",
391
+ type: "smoothstep"
392
+ };
393
+ }),
394
+ nodes: [c, ...l]
395
+ };
396
+ }
397
+ function Re({ data: e, graph: t, height: n, id: r, selected: i, width: a }) {
398
+ let o = t.node(r);
399
+ return {
400
+ data: e,
401
+ height: n,
402
+ id: r,
403
+ initialHeight: n,
404
+ initialWidth: a,
405
+ position: o ? {
406
+ x: o.x - a / 2,
407
+ y: o.y - n / 2
408
+ } : {
409
+ x: 0,
410
+ y: 0
411
+ },
412
+ selected: i,
413
+ sourcePosition: be.Bottom,
414
+ targetPosition: be.Top,
415
+ type: "orgUnit",
416
+ width: a
417
+ };
418
+ }
419
+ function H(e, t) {
420
+ let n = He(e);
421
+ return t.filter((t) => t.id !== e.id).map((e) => ({
422
+ distance: Ue(n, He(e)),
423
+ id: e.id
424
+ })).filter((e) => e.distance <= Me).sort((e, t) => e.distance - t.distance)[0]?.id;
425
+ }
426
+ function ze(e, t) {
427
+ let n = Be(e);
428
+ if (n) return Array.from(document.querySelectorAll(".react-flow__node[data-id]")).map((e) => {
429
+ let r = e.dataset.id;
430
+ if (!r || r === t) return null;
431
+ let i = e.getBoundingClientRect();
432
+ return {
433
+ distance: Ue(n, {
434
+ x: i.left + i.width / 2,
435
+ y: i.top + i.height / 2
436
+ }),
437
+ id: r
438
+ };
439
+ }).filter((e) => !!e).filter((e) => e.distance <= Me).sort((e, t) => e.distance - t.distance)[0]?.id;
440
+ }
441
+ function Be(e) {
442
+ return Ve(e) ? {
443
+ x: e.clientX,
444
+ y: e.clientY
445
+ } : null;
446
+ }
447
+ function Ve(e) {
448
+ return typeof e == "object" && !!e && "clientX" in e && "clientY" in e && typeof e.clientX == "number" && typeof e.clientY == "number";
449
+ }
450
+ function He(e) {
451
+ return {
452
+ x: e.position.x + (e.width ?? Oe) / 2,
453
+ y: e.position.y + (e.height ?? ke) / 2
454
+ };
455
+ }
456
+ function Ue(e, t) {
457
+ return Math.hypot(e.x - t.x, e.y - t.y);
458
+ }
459
+ function We(e, t) {
460
+ return !e.source || !e.target || e.target === V ? !1 : Ee({
461
+ orgUnitId: e.target,
462
+ parentDraft: t,
463
+ parentId: e.source === V ? null : e.source
464
+ }) === null;
465
+ }
466
+ function U(e, t) {
467
+ if (!e) return "根節點";
468
+ let n = t.get(e);
469
+ return n ? `${n.name} · ${n.code}` : "未知組織";
470
+ }
471
+ function Ge(e) {
472
+ return Ne[e.toUpperCase()] ?? "未知類型";
473
+ }
474
+ var W = {
475
+ tableIntroActions: "bpm_tableIntroActions_WO4XU",
476
+ modalFields: "bpm_modalFields_juyv6",
477
+ tableIntro: "bpm_tableIntro_u3hcm",
478
+ tableFrame: "bpm_tableFrame_IdbmB",
479
+ orgFilterArea: "bpm_orgFilterArea_Xjbbp",
480
+ membershipFilterArea: "bpm_membershipFilterArea_zob-Y",
481
+ scopeLabel: "bpm_scopeLabel_TLHMC"
482
+ }, Ke = {
483
+ hasDraftChanges: !1,
484
+ isEditing: !1
485
+ }, G = [
486
+ {
487
+ id: "COMPANY",
488
+ name: "公司"
489
+ },
490
+ {
491
+ id: "DIVISION",
492
+ name: "事業群"
493
+ },
494
+ {
495
+ id: "DEPARTMENT",
496
+ name: "部門"
497
+ },
498
+ {
499
+ id: "TEAM",
500
+ name: "小組"
501
+ }
502
+ ], qe = {
503
+ id: "ALL",
504
+ name: "全部類型"
505
+ }, Je = [qe, ...G], K = [
506
+ {
507
+ id: "MEMBER",
508
+ name: "指定會員"
509
+ },
510
+ {
511
+ id: "ORG_UNIT",
512
+ name: "指定組織"
513
+ },
514
+ {
515
+ id: "POSITION",
516
+ name: "指定職位"
517
+ }
518
+ ], Ye = {
519
+ id: "ALL",
520
+ name: "全部範圍"
521
+ }, Xe = [Ye, ...K], Ze = {
522
+ activeOnly: !1,
523
+ id: "ALL",
524
+ name: "全部狀態"
525
+ }, Qe = [Ze, {
526
+ activeOnly: !0,
527
+ id: "ACTIVE",
528
+ name: "目前有效"
529
+ }], q = [{
530
+ id: "true",
531
+ name: "主要歸屬",
532
+ value: !0
533
+ }, {
534
+ id: "false",
535
+ name: "一般歸屬",
536
+ value: !1
537
+ }], $e = [
538
+ 10,
539
+ 20,
540
+ 50
541
+ ], et = 1368, tt = 908, nt = 1292, rt = 1124;
542
+ function J() {
543
+ let [e, t] = p("ORG_UNITS"), [n, r] = p(null), [i, a] = p(null), [o, s] = p(null), [u, f] = p(!0), [m, h] = p(null), [g, _] = p(Ze), [v, y] = p(1), [b, x] = p(10), [E, k] = p(Ye), [I, ee] = p(0), [L, R] = p([]), [te, he] = p(null), [ge, _e] = p(null), [ve, ye] = p(null), [be, xe] = p(1), [Se, Ce] = p(10), [z, we] = p(null), [Te, Ee] = p(0), [De, B] = p(null), [V, Oe] = p(1), [ke, Ae] = p(10), [je, Me] = p(""), [Ne, Pe] = p(0), [Fe, Ie] = p(qe), [Le, Re] = p("TABLE"), [H, ze] = p([]), [Be, Ve] = p([]), [He, Ue] = p([]), [We, U] = p(null), [Ge, W] = p(1), [Ke, G] = p(10), [Je, K] = p(""), [Xe, Qe] = p(0), [q, $e] = p([]), [et, tt] = p([]), [nt, rt] = p([]), [J, Y] = p(!1);
544
+ l(() => {
545
+ n && a(n);
546
+ }, [n]);
547
+ let ct = n ?? i, lt = c(async () => {
548
+ f(!0), s(null);
549
+ try {
550
+ let e = await ue({
551
+ managerActiveOnly: g.activeOnly,
552
+ managerPage: v,
553
+ managerPageSize: b,
554
+ managerScopeType: E.id === "ALL" ? null : E.id,
555
+ membershipActiveOnly: te?.activeOnly ?? !1,
556
+ membershipOrgUnitId: ve?.id ?? null,
557
+ membershipPage: be,
558
+ membershipPageSize: Se,
559
+ membershipPositionId: z?.id ?? null,
560
+ orgUnitPage: V,
561
+ orgUnitPageSize: ke,
562
+ orgUnitSearchText: je,
563
+ orgUnitType: Fe.id === "ALL" ? null : Fe.id,
564
+ positionPage: Ge,
565
+ positionPageSize: Ke,
566
+ positionSearchText: Je
567
+ });
568
+ R(await j(ht(e.memberships, e.managerResolutions))), ze(e.orgUnits), Pe(e.orgUnitCount), Ve(e.filteredOrgUnits), $e(e.positions), Qe(e.positionCount), Ue(e.filteredPositions), Ee(e.membershipCount), rt(e.filteredMemberships), ee(e.managerResolutionCount), tt(e.filteredManagerResolutions);
569
+ } catch (e) {
570
+ s(Lt(e));
571
+ } finally {
572
+ f(!1);
573
+ }
574
+ }, [
575
+ g,
576
+ v,
577
+ b,
578
+ E,
579
+ te,
580
+ ve,
581
+ be,
582
+ Se,
583
+ z,
584
+ V,
585
+ ke,
586
+ je,
587
+ Fe,
588
+ Ge,
589
+ Ke,
590
+ Je
591
+ ]);
592
+ l(() => {
593
+ lt();
594
+ }, [lt]);
595
+ let X = d(() => new Map(H.map((e) => [e.id, e])), [H]), Z = d(() => new Map(q.map((e) => [e.id, e])), [q]), Q = d(() => new Map(L.map((e) => [e.memberId, e])), [L]), mt = d(() => Be.map((e) => ({
596
+ ...e,
597
+ key: e.id,
598
+ parentName: e.parentId ? vt(X.get(e.parentId)) : "根節點",
599
+ typeLabel: yt(e.type)
600
+ })), [Be, X]), St = d(() => He.map((e) => ({
601
+ ...e,
602
+ key: e.id
603
+ })), [He]), Ct = d(() => nt.map((e) => ({
604
+ ...e,
605
+ key: e.id,
606
+ memberName: _t(Q.get(e.memberId)),
607
+ orgUnitName: vt(X.get(e.orgUnitId)),
608
+ positionName: e.positionId ? bt(Z.get(e.positionId)) : "未指定"
609
+ })), [
610
+ Q,
611
+ nt,
612
+ X,
613
+ Z
614
+ ]), wt = d(() => et.map((e) => ({
615
+ ...e,
616
+ key: e.id,
617
+ managerName: _t(Q.get(e.managerMemberId)),
618
+ scopeLabel: gt(e, {
619
+ membersById: Q,
620
+ orgUnitsById: X,
621
+ positionsById: Z
622
+ })
623
+ })), [
624
+ et,
625
+ Q,
626
+ X,
627
+ Z
628
+ ]), Tt = d(() => ({
629
+ render: (e) => [{
630
+ name: "編輯",
631
+ onClick: () => B({
632
+ record: e,
633
+ type: "EDIT"
634
+ })
635
+ }, {
636
+ name: "停用",
637
+ onClick: () => r({
638
+ confirmText: "停用組織",
639
+ description: `停用「${e.name}」後,這個組織節點將不再出現在可用組織清單中。`,
640
+ id: e.id,
641
+ title: "停用組織節點",
642
+ type: "ORG_UNIT"
643
+ }),
644
+ variant: "destructive-secondary"
645
+ }],
646
+ variant: "base-secondary",
647
+ width: 128
648
+ }), []), Et = d(() => ({
649
+ render: (e) => [{
650
+ name: "編輯",
651
+ onClick: () => U({
652
+ record: e,
653
+ type: "EDIT"
654
+ })
655
+ }],
656
+ variant: "base-secondary",
657
+ width: 88
658
+ }), []), Dt = d(() => ({
659
+ render: (e) => [{
660
+ name: "編輯",
661
+ onClick: () => _e({
662
+ record: e,
663
+ type: "EDIT"
664
+ })
665
+ }, {
666
+ name: "刪除",
667
+ onClick: () => r({
668
+ confirmText: "刪除歸屬",
669
+ description: `刪除「${e.memberName}」在「${e.orgUnitName}」的會員歸屬。`,
670
+ id: e.id,
671
+ title: "刪除會員歸屬",
672
+ type: "MEMBERSHIP"
673
+ }),
674
+ variant: "destructive-secondary"
675
+ }],
676
+ variant: "base-secondary",
677
+ width: 128
678
+ }), []), Ot = d(() => ({
679
+ render: (e) => [{
680
+ name: "編輯",
681
+ onClick: () => h({
682
+ record: e,
683
+ type: "EDIT"
684
+ })
685
+ }, {
686
+ name: "刪除",
687
+ onClick: () => r({
688
+ confirmText: "刪除主管規則",
689
+ description: `刪除「${e.scopeLabel}」指派給「${e.managerName}」的主管解析規則。`,
690
+ id: e.id,
691
+ title: "刪除主管解析規則",
692
+ type: "MANAGER_RESOLUTION"
693
+ }),
694
+ variant: "destructive-secondary"
695
+ }],
696
+ variant: "base-secondary",
697
+ width: 128
698
+ }), []);
699
+ function kt(e) {
700
+ Oe(1), Me(e);
701
+ }
702
+ function At(e) {
703
+ Oe(1), Ie(e);
704
+ }
705
+ function jt(e) {
706
+ W(1), K(e);
707
+ }
708
+ function Mt(e) {
709
+ xe(1), he(e);
710
+ }
711
+ function $(e) {
712
+ xe(1), ye(e);
713
+ }
714
+ function Pt(e) {
715
+ xe(1), we(e);
716
+ }
717
+ function Ft(e) {
718
+ y(1), _(e);
719
+ }
720
+ function It(e) {
721
+ y(1), k(e);
722
+ }
723
+ function Rt() {
724
+ J || r(null);
725
+ }
726
+ async function zt() {
727
+ n && await Vt(async () => {
728
+ n.type === "ORG_UNIT" && await le(n.id), n.type === "MEMBERSHIP" && await ce(n.id), n.type === "MANAGER_RESOLUTION" && await se(n.id), r(null);
729
+ });
730
+ }
731
+ async function Bt(e) {
732
+ Y(!0), s(null);
733
+ try {
734
+ await ne({ moves: e.map((e) => ({
735
+ baseUpdatedAt: X.get(e.orgUnitId)?.updatedAt ?? "",
736
+ id: e.orgUnitId,
737
+ parentId: e.parentId
738
+ })) }), await lt();
739
+ } catch (e) {
740
+ throw s(Lt(e)), e;
741
+ } finally {
742
+ Y(!1);
743
+ }
744
+ }
745
+ async function Vt(e) {
746
+ Y(!0), s(null);
747
+ try {
748
+ await e(), await lt();
749
+ } catch (e) {
750
+ s(Lt(e));
751
+ } finally {
752
+ Y(!1);
753
+ }
754
+ }
755
+ return /* @__PURE__ */ P(M, { children: [
756
+ /* @__PURE__ */ N(C, { children: /* @__PURE__ */ N(F, {
757
+ description: "維護組織樹、職位、會員歸屬與簽核主管解析規則。",
758
+ title: "組織管理"
759
+ }) }),
760
+ /* @__PURE__ */ N(T, { children: /* @__PURE__ */ P(w, {
761
+ tab: /* @__PURE__ */ P(D, {
762
+ activeKey: e,
763
+ onChange: (e) => t(xt(e)),
764
+ children: [
765
+ /* @__PURE__ */ N(O, { children: "組織樹" }, "ORG_UNITS"),
766
+ /* @__PURE__ */ N(O, { children: "職位" }, "POSITIONS"),
767
+ /* @__PURE__ */ N(O, { children: "會員歸屬" }, "MEMBERSHIPS"),
768
+ /* @__PURE__ */ N(O, { children: "簽核主管" }, "MANAGERS")
769
+ ]
770
+ }),
771
+ children: [
772
+ o ? /* @__PURE__ */ N(A, {
773
+ color: "text-error",
774
+ variant: "body",
775
+ children: o
776
+ }) : null,
777
+ e === "ORG_UNITS" ? /* @__PURE__ */ N(it, {
778
+ actions: Tt,
779
+ loading: u,
780
+ onCreate: () => B({
781
+ parentId: null,
782
+ record: null,
783
+ type: "CREATE"
784
+ }),
785
+ onCreateChild: (e) => B({
786
+ parentId: e,
787
+ record: null,
788
+ type: "CREATE"
789
+ }),
790
+ onEditOrgUnit: (e) => B({
791
+ record: e,
792
+ type: "EDIT"
793
+ }),
794
+ onPageChange: Oe,
795
+ onSaveDraft: Bt,
796
+ onPageSizeChange: (e) => {
797
+ Oe(1), Ae(e);
798
+ },
799
+ onSearchTextChange: kt,
800
+ onTypeFilterChange: At,
801
+ orgUnits: H,
802
+ page: V,
803
+ pageSize: ke,
804
+ rows: mt,
805
+ searchText: je,
806
+ saving: J,
807
+ total: Ne,
808
+ typeFilter: Fe,
809
+ viewMode: Le,
810
+ onViewModeChange: Re
811
+ }) : null,
812
+ e === "POSITIONS" ? /* @__PURE__ */ N(at, {
813
+ actions: Et,
814
+ loading: u,
815
+ onCreate: () => U({
816
+ record: null,
817
+ type: "CREATE"
818
+ }),
819
+ onPageChange: W,
820
+ onPageSizeChange: (e) => {
821
+ W(1), G(e);
822
+ },
823
+ onSearchTextChange: jt,
824
+ page: Ge,
825
+ pageSize: Ke,
826
+ rows: St,
827
+ searchText: Je,
828
+ total: Xe
829
+ }) : null,
830
+ e === "MEMBERSHIPS" ? /* @__PURE__ */ N(ot, {
831
+ actions: Dt,
832
+ loading: u,
833
+ onCreate: () => _e({
834
+ record: null,
835
+ type: "CREATE"
836
+ }),
837
+ onActiveFilterChange: Mt,
838
+ onOrgUnitFilterChange: $,
839
+ onPageChange: xe,
840
+ onPageSizeChange: (e) => {
841
+ xe(1), Ce(e);
842
+ },
843
+ onPositionFilterChange: Pt,
844
+ orgUnitFilter: ve,
845
+ orgUnits: H,
846
+ page: be,
847
+ pageSize: Se,
848
+ positionFilter: z,
849
+ positions: q,
850
+ rows: Ct,
851
+ statusFilter: te,
852
+ total: Te
853
+ }) : null,
854
+ e === "MANAGERS" ? /* @__PURE__ */ N(st, {
855
+ actions: Ot,
856
+ loading: u,
857
+ onCreate: () => h({
858
+ record: null,
859
+ type: "CREATE"
860
+ }),
861
+ onActiveFilterChange: Ft,
862
+ onPageChange: y,
863
+ onPageSizeChange: (e) => {
864
+ y(1), x(e);
865
+ },
866
+ onScopeTypeFilterChange: It,
867
+ page: v,
868
+ pageSize: b,
869
+ rows: wt,
870
+ scopeTypeFilter: E,
871
+ statusFilter: g,
872
+ total: I
873
+ }) : null
874
+ ]
875
+ }) }),
876
+ /* @__PURE__ */ N(ut, {
877
+ modal: De,
878
+ onClose: () => B(null),
879
+ onSubmit: (e) => Vt(async () => {
880
+ De?.type === "EDIT" && De.record ? await pe({
881
+ ...e,
882
+ id: De.record.id,
883
+ metadataJson: null
884
+ }) : await ae({
885
+ code: e.code ?? "",
886
+ metadataJson: "{}",
887
+ name: e.name ?? "",
888
+ parentId: e.parentId,
889
+ type: e.type ?? "DEPARTMENT"
890
+ }), B(null);
891
+ }),
892
+ orgUnits: H,
893
+ saving: J
894
+ }),
895
+ /* @__PURE__ */ N(dt, {
896
+ modal: We,
897
+ onClose: () => U(null),
898
+ onSubmit: (e) => Vt(async () => {
899
+ We?.type === "EDIT" && We.record ? await me({
900
+ ...e,
901
+ id: We.record.id,
902
+ metadataJson: null
903
+ }) : await oe({
904
+ code: e.code ?? "",
905
+ level: e.level ?? 0,
906
+ metadataJson: "{}",
907
+ name: e.name ?? ""
908
+ }), U(null);
909
+ }),
910
+ saving: J
911
+ }),
912
+ /* @__PURE__ */ N(ft, {
913
+ membersById: Q,
914
+ modal: ge,
915
+ onClose: () => _e(null),
916
+ onSubmit: (e) => Vt(async () => {
917
+ ge?.type === "EDIT" && ge.record ? await fe({
918
+ ...e,
919
+ id: ge.record.id
920
+ }) : await ie({
921
+ effectiveFrom: e.effectiveFrom ?? Nt(),
922
+ effectiveTo: e.effectiveTo,
923
+ isPrimary: e.isPrimary ?? !1,
924
+ memberId: e.memberId ?? "",
925
+ orgUnitId: e.orgUnitId ?? "",
926
+ positionId: e.positionId
927
+ }), _e(null);
928
+ }),
929
+ orgUnits: H,
930
+ positions: q,
931
+ saving: J
932
+ }),
933
+ /* @__PURE__ */ N(pt, {
934
+ membersById: Q,
935
+ modal: m,
936
+ onClose: () => h(null),
937
+ onSubmit: (e) => Vt(async () => {
938
+ m?.type === "EDIT" && m.record ? await de({
939
+ ...e,
940
+ id: m.record.id
941
+ }) : await re({
942
+ effectiveFrom: e.effectiveFrom ?? Nt(),
943
+ effectiveTo: e.effectiveTo,
944
+ managerMemberId: e.managerMemberId ?? "",
945
+ priority: e.priority ?? 0,
946
+ scopeId: e.scopeId ?? "",
947
+ scopeType: e.scopeType ?? "MEMBER"
948
+ }), h(null);
949
+ }),
950
+ orgUnits: H,
951
+ positions: q,
952
+ saving: J
953
+ }),
954
+ /* @__PURE__ */ N(S, {
955
+ cancelText: "取消",
956
+ confirmButtonProps: { variant: "destructive-primary" },
957
+ confirmText: ct?.confirmText ?? "",
958
+ loading: J,
959
+ modalStatusType: "error",
960
+ modalType: "standard",
961
+ onCancel: Rt,
962
+ onClose: Rt,
963
+ onConfirm: () => void zt(),
964
+ open: !!n,
965
+ showModalFooter: !0,
966
+ showModalHeader: !0,
967
+ size: "regular",
968
+ supportingText: "此操作會立即套用,請確認後再繼續。",
969
+ title: ct?.title ?? "",
970
+ children: /* @__PURE__ */ N(A, {
971
+ color: "text-neutral",
972
+ variant: "body",
973
+ children: ct?.description ?? ""
974
+ })
975
+ })
976
+ ] });
977
+ }
978
+ function it({ actions: e, loading: t, onCreate: n, onCreateChild: r, onEditOrgUnit: i, onPageChange: a, onSaveDraft: o, onPageSizeChange: s, onSearchTextChange: c, onTypeFilterChange: u, onViewModeChange: m, orgUnits: g, page: S, pageSize: C, rows: w, searchText: T, saving: D, total: O, typeFilter: A, viewMode: j }) {
979
+ let F = f(null), [L, R] = p(Ke), te = j === "TABLE" ? "FLOW" : "TABLE", ne = j === "TABLE" ? "切換樹狀圖" : "切換表格", re = j === "FLOW", ie = ct({
980
+ isTreeMode: re,
981
+ isTreeEditing: L.isEditing
982
+ }), ae = lt({
983
+ isTreeMode: re,
984
+ isTreeEditing: L.isEditing
985
+ }), oe = X({
986
+ hasDraftChanges: L.hasDraftChanges,
987
+ isTreeEditing: L.isEditing,
988
+ isTreeMode: re,
989
+ loading: t,
990
+ saving: D
991
+ }), se = d(() => [
992
+ {
993
+ dataIndex: "code",
994
+ key: "code",
995
+ title: "代碼",
996
+ width: 180
997
+ },
998
+ {
999
+ dataIndex: "name",
1000
+ key: "name",
1001
+ title: "名稱",
1002
+ width: 240
1003
+ },
1004
+ {
1005
+ dataIndex: "typeLabel",
1006
+ key: "typeLabel",
1007
+ title: "類型",
1008
+ width: 120
1009
+ },
1010
+ {
1011
+ dataIndex: "parentName",
1012
+ key: "parentName",
1013
+ title: "上層",
1014
+ width: 280
1015
+ },
1016
+ {
1017
+ dataIndex: "path",
1018
+ key: "path",
1019
+ title: "Path",
1020
+ width: 420
1021
+ }
1022
+ ], []);
1023
+ return l(() => {
1024
+ j === "TABLE" && R(Ke);
1025
+ }, [j]), /* @__PURE__ */ P(M, { children: [/* @__PURE__ */ N(Z, {
1026
+ actionDisabled: oe,
1027
+ actionIcon: ae,
1028
+ actionLabel: ie,
1029
+ actions: /* @__PURE__ */ P(M, { children: [/* @__PURE__ */ N(h, {
1030
+ onClick: () => m(te),
1031
+ variant: "base-secondary",
1032
+ children: ne
1033
+ }), re && L.isEditing ? /* @__PURE__ */ N(h, {
1034
+ disabled: D,
1035
+ icon: ee,
1036
+ iconType: "leading",
1037
+ onClick: () => F.current?.cancelEditing(),
1038
+ variant: "base-secondary",
1039
+ children: "取消"
1040
+ }) : null] }),
1041
+ description: "組織節點使用 ltree path 維護階層,搬移節點會同步更新子節點 path。",
1042
+ onCreate: () => {
1043
+ if (!re) {
1044
+ n();
1045
+ return;
1046
+ }
1047
+ if (L.isEditing) {
1048
+ F.current?.saveDraft();
1049
+ return;
1050
+ }
1051
+ F.current?.startEditing();
1052
+ },
1053
+ title: "組織樹"
1054
+ }), j === "TABLE" ? /* @__PURE__ */ P(M, { children: [/* @__PURE__ */ N(v, {
1055
+ className: W.orgFilterArea,
1056
+ size: "sub",
1057
+ children: /* @__PURE__ */ P(y, { children: [/* @__PURE__ */ N(_, {
1058
+ span: 3,
1059
+ children: /* @__PURE__ */ N(b, {
1060
+ fullWidth: !0,
1061
+ layout: I.VERTICAL,
1062
+ name: "orgUnitSearchText",
1063
+ children: /* @__PURE__ */ N(x, {
1064
+ fullWidth: !0,
1065
+ onChange: (e) => c(e.target.value),
1066
+ placeholder: "搜尋組織名稱或代碼",
1067
+ size: "sub",
1068
+ value: T,
1069
+ variant: "base"
1070
+ })
1071
+ })
1072
+ }), /* @__PURE__ */ N(_, {
1073
+ span: 2,
1074
+ children: /* @__PURE__ */ N(b, {
1075
+ fullWidth: !0,
1076
+ layout: I.VERTICAL,
1077
+ name: "orgUnitTypeFilter",
1078
+ children: /* @__PURE__ */ N(E, {
1079
+ clearable: !1,
1080
+ fullWidth: !0,
1081
+ onChange: (e) => u(Ct(e)),
1082
+ options: [...Je],
1083
+ placeholder: "類型",
1084
+ size: "sub",
1085
+ value: A
1086
+ })
1087
+ })
1088
+ })] })
1089
+ }), /* @__PURE__ */ N("div", {
1090
+ className: W.tableFrame,
1091
+ children: /* @__PURE__ */ N(k, {
1092
+ actions: e,
1093
+ columns: se,
1094
+ dataSource: [...w],
1095
+ fullWidth: !0,
1096
+ loading: t,
1097
+ pagination: Y({
1098
+ onPageChange: a,
1099
+ onPageSizeChange: s,
1100
+ page: S,
1101
+ pageSize: C,
1102
+ total: O
1103
+ }),
1104
+ style: { minWidth: et }
1105
+ })
1106
+ })] }) : /* @__PURE__ */ N(Fe, {
1107
+ ref: F,
1108
+ onCreateChild: r,
1109
+ onCreateRoot: n,
1110
+ onEditOrgUnit: i,
1111
+ onSaveDraft: o,
1112
+ onStateChange: R,
1113
+ orgUnits: g,
1114
+ saving: D
1115
+ })] });
1116
+ }
1117
+ function at({ actions: e, loading: t, onCreate: n, onPageChange: r, onPageSizeChange: i, onSearchTextChange: a, page: o, pageSize: s, rows: c, searchText: l, total: u }) {
1118
+ let f = d(() => [
1119
+ {
1120
+ dataIndex: "code",
1121
+ key: "code",
1122
+ title: "代碼",
1123
+ width: 180
1124
+ },
1125
+ {
1126
+ dataIndex: "name",
1127
+ key: "name",
1128
+ title: "名稱",
1129
+ width: 280
1130
+ },
1131
+ {
1132
+ dataIndex: "level",
1133
+ key: "level",
1134
+ title: "職等",
1135
+ width: 96
1136
+ },
1137
+ {
1138
+ dataIndex: "updatedAt",
1139
+ key: "updatedAt",
1140
+ title: "更新時間",
1141
+ width: 220
1142
+ }
1143
+ ], []);
1144
+ return /* @__PURE__ */ P(M, { children: [
1145
+ /* @__PURE__ */ N(Z, {
1146
+ actionLabel: "新增職位",
1147
+ description: "職位提供會員歸屬與主管解析規則使用。",
1148
+ onCreate: n,
1149
+ title: "職位"
1150
+ }),
1151
+ /* @__PURE__ */ N(v, {
1152
+ className: W.orgFilterArea,
1153
+ size: "sub",
1154
+ children: /* @__PURE__ */ N(y, { children: /* @__PURE__ */ N(_, {
1155
+ span: 3,
1156
+ children: /* @__PURE__ */ N(b, {
1157
+ fullWidth: !0,
1158
+ layout: I.VERTICAL,
1159
+ name: "positionSearchText",
1160
+ children: /* @__PURE__ */ N(x, {
1161
+ fullWidth: !0,
1162
+ onChange: (e) => a(e.target.value),
1163
+ placeholder: "搜尋職位名稱或代碼",
1164
+ size: "sub",
1165
+ value: l,
1166
+ variant: "base"
1167
+ })
1168
+ })
1169
+ }) })
1170
+ }),
1171
+ /* @__PURE__ */ N("div", {
1172
+ className: W.tableFrame,
1173
+ children: /* @__PURE__ */ N(k, {
1174
+ actions: e,
1175
+ columns: f,
1176
+ dataSource: [...c],
1177
+ fullWidth: !0,
1178
+ loading: t,
1179
+ pagination: Y({
1180
+ onPageChange: r,
1181
+ onPageSizeChange: i,
1182
+ page: o,
1183
+ pageSize: s,
1184
+ total: u
1185
+ }),
1186
+ style: { minWidth: tt }
1187
+ })
1188
+ })
1189
+ ] });
1190
+ }
1191
+ function ot({ actions: t, loading: n, onCreate: i, onActiveFilterChange: a, onOrgUnitFilterChange: o, onPageChange: s, onPageSizeChange: c, onPositionFilterChange: l, orgUnitFilter: u, orgUnits: f, page: p, pageSize: h, positionFilter: g, positions: x, rows: S, statusFilter: C, total: w }) {
1192
+ let T = d(() => [
1193
+ {
1194
+ dataIndex: "memberName",
1195
+ key: "memberName",
1196
+ title: "會員",
1197
+ width: 280
1198
+ },
1199
+ {
1200
+ dataIndex: "orgUnitName",
1201
+ key: "orgUnitName",
1202
+ title: "組織",
1203
+ width: 280
1204
+ },
1205
+ {
1206
+ dataIndex: "positionName",
1207
+ key: "positionName",
1208
+ title: "職位",
1209
+ width: 220
1210
+ },
1211
+ {
1212
+ key: "isPrimary",
1213
+ render: (e) => e.isPrimary ? "主要" : "一般",
1214
+ title: "類型",
1215
+ width: 104
1216
+ },
1217
+ {
1218
+ dataIndex: "effectiveFrom",
1219
+ key: "effectiveFrom",
1220
+ title: "生效日",
1221
+ width: 140
1222
+ },
1223
+ {
1224
+ dataIndex: "effectiveTo",
1225
+ key: "effectiveTo",
1226
+ title: "結束日",
1227
+ width: 140
1228
+ }
1229
+ ], []), E = d(() => f.map(e), [f]), D = d(() => x.map(r), [x]);
1230
+ return /* @__PURE__ */ P(M, { children: [
1231
+ /* @__PURE__ */ N(Z, {
1232
+ actionLabel: "新增歸屬",
1233
+ description: "會員歸屬是 BPM 內部組織權限、主管解析與條件判斷的來源。",
1234
+ onCreate: i,
1235
+ title: "會員歸屬"
1236
+ }),
1237
+ /* @__PURE__ */ N(v, {
1238
+ className: [W.orgFilterArea, W.membershipFilterArea].join(" "),
1239
+ size: "sub",
1240
+ children: /* @__PURE__ */ P(y, { children: [
1241
+ /* @__PURE__ */ N(_, {
1242
+ span: 2,
1243
+ children: /* @__PURE__ */ N(b, {
1244
+ fullWidth: !0,
1245
+ layout: I.VERTICAL,
1246
+ name: "membershipOrgUnitFilter",
1247
+ children: /* @__PURE__ */ N(m, {
1248
+ disabledOptionsFilter: !0,
1249
+ emptyText: "沒有符合的組織",
1250
+ inputProps: {
1251
+ autoCapitalize: "none",
1252
+ autoCorrect: "off",
1253
+ name: "membershipOrgUnitFilter",
1254
+ spellCheck: !1
1255
+ },
1256
+ mode: "single",
1257
+ name: "membershipOrgUnitFilter",
1258
+ onChange: (e) => o(Ot(e)),
1259
+ options: [...E],
1260
+ placeholder: "全部組織",
1261
+ size: "sub",
1262
+ value: u
1263
+ })
1264
+ })
1265
+ }),
1266
+ /* @__PURE__ */ N(_, {
1267
+ span: 2,
1268
+ children: /* @__PURE__ */ N(b, {
1269
+ fullWidth: !0,
1270
+ layout: I.VERTICAL,
1271
+ name: "membershipPositionFilter",
1272
+ children: /* @__PURE__ */ N(m, {
1273
+ disabledOptionsFilter: !0,
1274
+ emptyText: "沒有符合的職位",
1275
+ inputProps: {
1276
+ autoCapitalize: "none",
1277
+ autoCorrect: "off",
1278
+ name: "membershipPositionFilter",
1279
+ spellCheck: !1
1280
+ },
1281
+ mode: "single",
1282
+ name: "membershipPositionFilter",
1283
+ onChange: (e) => l(kt(e)),
1284
+ options: [...D],
1285
+ placeholder: "全部職位",
1286
+ size: "sub",
1287
+ value: g
1288
+ })
1289
+ })
1290
+ }),
1291
+ /* @__PURE__ */ N(_, {
1292
+ span: 2,
1293
+ children: /* @__PURE__ */ N(b, {
1294
+ fullWidth: !0,
1295
+ layout: I.VERTICAL,
1296
+ name: "membershipStatusFilter",
1297
+ children: /* @__PURE__ */ N(m, {
1298
+ disabledOptionsFilter: !0,
1299
+ emptyText: "沒有符合的狀態",
1300
+ inputProps: {
1301
+ autoCapitalize: "none",
1302
+ autoCorrect: "off",
1303
+ name: "membershipStatusFilter",
1304
+ spellCheck: !1
1305
+ },
1306
+ mode: "single",
1307
+ name: "membershipStatusFilter",
1308
+ onChange: (e) => a(Dt(e)),
1309
+ options: [...Qe],
1310
+ placeholder: "全部狀態",
1311
+ size: "sub",
1312
+ value: C
1313
+ })
1314
+ })
1315
+ })
1316
+ ] })
1317
+ }),
1318
+ /* @__PURE__ */ N("div", {
1319
+ className: W.tableFrame,
1320
+ children: /* @__PURE__ */ N(k, {
1321
+ actions: t,
1322
+ columns: T,
1323
+ dataSource: [...S],
1324
+ fullWidth: !0,
1325
+ loading: n,
1326
+ pagination: Y({
1327
+ onPageChange: s,
1328
+ onPageSizeChange: c,
1329
+ page: p,
1330
+ pageSize: h,
1331
+ total: w
1332
+ }),
1333
+ style: { minWidth: nt }
1334
+ })
1335
+ })
1336
+ ] });
1337
+ }
1338
+ function st({ actions: e, loading: t, onCreate: n, onActiveFilterChange: r, onPageChange: i, onPageSizeChange: a, onScopeTypeFilterChange: o, page: s, pageSize: c, rows: l, scopeTypeFilter: u, statusFilter: f, total: p }) {
1339
+ let m = d(() => [
1340
+ {
1341
+ dataIndex: "scopeLabel",
1342
+ key: "scopeLabel",
1343
+ title: "套用範圍",
1344
+ width: 320
1345
+ },
1346
+ {
1347
+ dataIndex: "managerName",
1348
+ key: "managerName",
1349
+ title: "簽核主管",
1350
+ width: 300
1351
+ },
1352
+ {
1353
+ dataIndex: "priority",
1354
+ key: "priority",
1355
+ title: "優先序",
1356
+ width: 96
1357
+ },
1358
+ {
1359
+ dataIndex: "effectiveFrom",
1360
+ key: "effectiveFrom",
1361
+ title: "生效日",
1362
+ width: 140
1363
+ },
1364
+ {
1365
+ dataIndex: "effectiveTo",
1366
+ key: "effectiveTo",
1367
+ title: "結束日",
1368
+ width: 140
1369
+ }
1370
+ ], []);
1371
+ return /* @__PURE__ */ P(M, { children: [
1372
+ /* @__PURE__ */ N(Z, {
1373
+ actionLabel: "新增主管規則",
1374
+ description: "簽核主管規則獨立於組織樹 parent,解析優先序為會員、組織、職位。",
1375
+ onCreate: n,
1376
+ title: "簽核主管"
1377
+ }),
1378
+ /* @__PURE__ */ N(v, {
1379
+ className: W.orgFilterArea,
1380
+ size: "sub",
1381
+ children: /* @__PURE__ */ P(y, { children: [/* @__PURE__ */ N(_, {
1382
+ span: 3,
1383
+ children: /* @__PURE__ */ N(b, {
1384
+ fullWidth: !0,
1385
+ layout: I.VERTICAL,
1386
+ name: "managerScopeTypeFilter",
1387
+ children: /* @__PURE__ */ N(E, {
1388
+ clearable: !1,
1389
+ fullWidth: !0,
1390
+ onChange: (e) => o(Tt(e)),
1391
+ options: [...Xe],
1392
+ placeholder: "套用範圍",
1393
+ size: "sub",
1394
+ value: u
1395
+ })
1396
+ })
1397
+ }), /* @__PURE__ */ N(_, {
1398
+ span: 2,
1399
+ children: /* @__PURE__ */ N(b, {
1400
+ fullWidth: !0,
1401
+ layout: I.VERTICAL,
1402
+ name: "managerStatusFilter",
1403
+ children: /* @__PURE__ */ N(E, {
1404
+ clearable: !1,
1405
+ fullWidth: !0,
1406
+ onChange: (e) => r(Et(e)),
1407
+ options: [...Qe],
1408
+ placeholder: "狀態",
1409
+ size: "sub",
1410
+ value: f
1411
+ })
1412
+ })
1413
+ })] })
1414
+ }),
1415
+ /* @__PURE__ */ N("div", {
1416
+ className: W.tableFrame,
1417
+ children: /* @__PURE__ */ N(k, {
1418
+ actions: e,
1419
+ columns: m,
1420
+ dataSource: [...l],
1421
+ fullWidth: !0,
1422
+ loading: t,
1423
+ pagination: Y({
1424
+ onPageChange: i,
1425
+ onPageSizeChange: a,
1426
+ page: s,
1427
+ pageSize: c,
1428
+ total: p
1429
+ }),
1430
+ style: { minWidth: rt }
1431
+ })
1432
+ })
1433
+ ] });
1434
+ }
1435
+ function Y({ onPageChange: e, onPageSizeChange: t, page: n, pageSize: r, total: i }) {
1436
+ return {
1437
+ current: n,
1438
+ onChange: e,
1439
+ onChangePageSize: t,
1440
+ pageSize: r,
1441
+ pageSizeLabel: "每頁筆數",
1442
+ pageSizeOptions: [...$e],
1443
+ renderResultSummary: (e, t, n) => `顯示 ${e}-${t} 筆,共 ${n} 筆`,
1444
+ showPageSizeOptions: !0,
1445
+ total: i
1446
+ };
1447
+ }
1448
+ function ct({ isTreeEditing: e, isTreeMode: t }) {
1449
+ return t ? e ? "儲存" : "開始編輯" : "新增組織";
1450
+ }
1451
+ function lt({ isTreeEditing: e, isTreeMode: t }) {
1452
+ return t ? e ? te : L : R;
1453
+ }
1454
+ function X({ hasDraftChanges: e, isTreeEditing: t, isTreeMode: n, loading: r, saving: i }) {
1455
+ return n ? t ? !e || i : r : !1;
1456
+ }
1457
+ function Z({ actionDisabled: e = !1, actionIcon: t = R, actionLabel: n, actions: r, description: i, onCreate: a, title: o }) {
1458
+ return /* @__PURE__ */ P("div", {
1459
+ className: W.tableIntro,
1460
+ children: [/* @__PURE__ */ P("div", { children: [/* @__PURE__ */ N(A, {
1461
+ component: "h2",
1462
+ variant: "h3",
1463
+ children: o
1464
+ }), /* @__PURE__ */ N(A, {
1465
+ color: "text-neutral",
1466
+ variant: "body",
1467
+ children: i
1468
+ })] }), /* @__PURE__ */ P("div", {
1469
+ className: W.tableIntroActions,
1470
+ children: [r, /* @__PURE__ */ N(h, {
1471
+ disabled: e,
1472
+ icon: t,
1473
+ iconType: "leading",
1474
+ onClick: a,
1475
+ children: n
1476
+ })]
1477
+ })]
1478
+ });
1479
+ }
1480
+ function ut({ modal: t, onClose: r, onSubmit: i, orgUnits: a, saving: s }) {
1481
+ let [c, u] = p(""), [d, f] = p(""), [m, h] = p(null), [g, _] = p(G[2]);
1482
+ return l(() => {
1483
+ if (!t) return;
1484
+ let n = t.record, r = n?.parentId ?? t.parentId ?? null, i = r ? a.find((e) => e.id === r) ?? null : null;
1485
+ u(n?.code ?? ""), f(n?.name ?? ""), h(i ? e(i) : null), _(G.find((e) => e.id === n?.type) ?? G[2]);
1486
+ }, [t, a]), /* @__PURE__ */ N(S, {
1487
+ cancelText: "取消",
1488
+ confirmButtonProps: { disabled: !c || !d },
1489
+ confirmText: t?.type === "EDIT" ? "儲存" : "建立",
1490
+ loading: s,
1491
+ modalType: "standard",
1492
+ onCancel: r,
1493
+ onClose: r,
1494
+ onConfirm: () => void i({
1495
+ code: c,
1496
+ name: d,
1497
+ parentId: m?.id ?? null,
1498
+ type: g.id
1499
+ }),
1500
+ open: !!t,
1501
+ showModalFooter: !0,
1502
+ showModalHeader: !0,
1503
+ size: "regular",
1504
+ title: t?.type === "EDIT" ? "編輯組織" : "新增組織",
1505
+ children: /* @__PURE__ */ P("div", {
1506
+ className: W.modalFields,
1507
+ children: [
1508
+ /* @__PURE__ */ N(Q, {
1509
+ label: "代碼",
1510
+ name: "orgCode",
1511
+ onChange: u,
1512
+ placeholder: "例如 FIN-TW",
1513
+ value: c
1514
+ }),
1515
+ /* @__PURE__ */ N(Q, {
1516
+ label: "名稱",
1517
+ name: "orgName",
1518
+ onChange: f,
1519
+ placeholder: "例如 財務部",
1520
+ value: d
1521
+ }),
1522
+ /* @__PURE__ */ N(o, {
1523
+ label: "類型",
1524
+ name: "orgType",
1525
+ children: /* @__PURE__ */ N(E, {
1526
+ clearable: !1,
1527
+ fullWidth: !0,
1528
+ onChange: (e) => _(St(e)),
1529
+ options: [...G],
1530
+ placeholder: "選擇組織類型",
1531
+ value: g
1532
+ })
1533
+ }),
1534
+ /* @__PURE__ */ N(o, {
1535
+ label: "上層組織",
1536
+ name: "parentId",
1537
+ children: /* @__PURE__ */ N(n, {
1538
+ name: "parentId",
1539
+ onChange: h,
1540
+ orgUnits: a.filter((e) => e.id !== t?.record?.id),
1541
+ placeholder: "選擇上層組織",
1542
+ value: m
1543
+ })
1544
+ })
1545
+ ]
1546
+ })
1547
+ });
1548
+ }
1549
+ function dt({ modal: e, onClose: t, onSubmit: n, saving: r }) {
1550
+ let [i, a] = p(""), [o, s] = p("0"), [c, u] = p("");
1551
+ return l(() => {
1552
+ e && (a(e.record?.code ?? ""), s(String(e.record?.level ?? 0)), u(e.record?.name ?? ""));
1553
+ }, [e]), /* @__PURE__ */ N(S, {
1554
+ cancelText: "取消",
1555
+ confirmButtonProps: { disabled: !i || !c },
1556
+ confirmText: e?.type === "EDIT" ? "儲存" : "建立",
1557
+ loading: r,
1558
+ modalType: "standard",
1559
+ onCancel: t,
1560
+ onClose: t,
1561
+ onConfirm: () => void n({
1562
+ code: i,
1563
+ level: Number(o),
1564
+ name: c
1565
+ }),
1566
+ open: !!e,
1567
+ showModalFooter: !0,
1568
+ showModalHeader: !0,
1569
+ size: "regular",
1570
+ title: e?.type === "EDIT" ? "編輯職位" : "新增職位",
1571
+ children: /* @__PURE__ */ P("div", {
1572
+ className: W.modalFields,
1573
+ children: [
1574
+ /* @__PURE__ */ N(Q, {
1575
+ label: "代碼",
1576
+ name: "positionCode",
1577
+ onChange: a,
1578
+ placeholder: "例如 FIN-MGR",
1579
+ value: i
1580
+ }),
1581
+ /* @__PURE__ */ N(Q, {
1582
+ label: "名稱",
1583
+ name: "positionName",
1584
+ onChange: u,
1585
+ placeholder: "例如 財務主管",
1586
+ value: c
1587
+ }),
1588
+ /* @__PURE__ */ N(Q, {
1589
+ label: "職等",
1590
+ name: "positionLevel",
1591
+ onChange: s,
1592
+ placeholder: "例如 5",
1593
+ value: o
1594
+ })
1595
+ ]
1596
+ })
1597
+ });
1598
+ }
1599
+ function ft({ membersById: s, modal: c, onClose: u, onSubmit: d, orgUnits: f, positions: m, saving: h }) {
1600
+ let [g, _] = p(Nt()), [v, y] = p(""), [b, x] = p(q[1]), [C, w] = p(null), [T, D] = p(null), [O, k] = p(null);
1601
+ return l(() => {
1602
+ if (!c) return;
1603
+ let n = c.record, i = n ? s.get(n.memberId) : null;
1604
+ _(n?.effectiveFrom ?? Nt()), y(n?.effectiveTo ?? ""), x(q.find((e) => e.value === n?.isPrimary) ?? q[1]), w(i ? t(i) : null), D($(f.find((e) => e.id === n?.orgUnitId), e)), k($(m.find((e) => e.id === n?.positionId), r));
1605
+ }, [
1606
+ s,
1607
+ c,
1608
+ f,
1609
+ m
1610
+ ]), /* @__PURE__ */ N(S, {
1611
+ cancelText: "取消",
1612
+ confirmButtonProps: { disabled: !C || !T },
1613
+ confirmText: c?.type === "EDIT" ? "儲存" : "建立",
1614
+ loading: h,
1615
+ modalType: "standard",
1616
+ onCancel: u,
1617
+ onClose: u,
1618
+ onConfirm: () => void d({
1619
+ effectiveFrom: g,
1620
+ effectiveTo: v || null,
1621
+ isPrimary: b.value,
1622
+ memberId: C?.id ?? null,
1623
+ orgUnitId: T?.id ?? null,
1624
+ positionId: O?.id ?? null
1625
+ }),
1626
+ open: !!c,
1627
+ showModalFooter: !0,
1628
+ showModalHeader: !0,
1629
+ size: "regular",
1630
+ title: c?.type === "EDIT" ? "編輯會員歸屬" : "新增會員歸屬",
1631
+ children: /* @__PURE__ */ P("div", {
1632
+ className: W.modalFields,
1633
+ children: [
1634
+ /* @__PURE__ */ N(o, {
1635
+ label: "會員",
1636
+ name: "memberId",
1637
+ children: /* @__PURE__ */ N(a, {
1638
+ name: "memberId",
1639
+ onChange: w,
1640
+ placeholder: "搜尋會員姓名或信箱",
1641
+ value: C
1642
+ })
1643
+ }),
1644
+ /* @__PURE__ */ N(o, {
1645
+ label: "組織",
1646
+ name: "orgUnitId",
1647
+ children: /* @__PURE__ */ N(n, {
1648
+ name: "orgUnitId",
1649
+ onChange: D,
1650
+ orgUnits: f,
1651
+ placeholder: "選擇歸屬組織",
1652
+ value: T
1653
+ })
1654
+ }),
1655
+ /* @__PURE__ */ N(o, {
1656
+ label: "職位",
1657
+ name: "positionId",
1658
+ children: /* @__PURE__ */ N(i, {
1659
+ name: "positionId",
1660
+ onChange: k,
1661
+ placeholder: "選擇職位",
1662
+ positions: m,
1663
+ value: O
1664
+ })
1665
+ }),
1666
+ /* @__PURE__ */ N(o, {
1667
+ label: "歸屬類型",
1668
+ name: "isPrimary",
1669
+ children: /* @__PURE__ */ N(E, {
1670
+ clearable: !1,
1671
+ fullWidth: !0,
1672
+ onChange: (e) => x(At(e)),
1673
+ options: [...q],
1674
+ placeholder: "選擇歸屬類型",
1675
+ value: b
1676
+ })
1677
+ }),
1678
+ /* @__PURE__ */ N(mt, {
1679
+ label: "生效日",
1680
+ name: "membershipEffectiveFrom",
1681
+ onChange: _,
1682
+ placeholder: "YYYY-MM-DD",
1683
+ value: g
1684
+ }),
1685
+ /* @__PURE__ */ N(mt, {
1686
+ label: "結束日",
1687
+ name: "membershipEffectiveTo",
1688
+ onChange: y,
1689
+ placeholder: "YYYY-MM-DD,未設定代表無期限",
1690
+ value: v
1691
+ })
1692
+ ]
1693
+ })
1694
+ });
1695
+ }
1696
+ function pt({ membersById: s, modal: c, onClose: u, onSubmit: d, orgUnits: f, positions: m, saving: h }) {
1697
+ let [g, _] = p(Nt()), [v, y] = p(""), [b, x] = p(null), [C, w] = p("0"), [T, D] = p(null), [O, k] = p(null), [j, M] = p(null), [F, I] = p(K[0]);
1698
+ l(() => {
1699
+ if (!c) return;
1700
+ let n = c.record, i = K.find((e) => e.id === n?.scopeType) ?? K[0];
1701
+ _(n?.effectiveFrom ?? Nt()), y(n?.effectiveTo ?? ""), x($(n ? s.get(n.managerMemberId) : null, t)), w(String(n?.priority ?? 0)), D(i.id === "MEMBER" ? $(n ? s.get(n.scopeId) : null, t) : null), k(i.id === "ORG_UNIT" ? $(f.find((e) => e.id === n?.scopeId), e) : null), M(i.id === "POSITION" ? $(m.find((e) => e.id === n?.scopeId), r) : null), I(i);
1702
+ }, [
1703
+ s,
1704
+ c,
1705
+ f,
1706
+ m
1707
+ ]);
1708
+ let ee = F.id === "MEMBER" ? T?.id : F.id === "ORG_UNIT" ? O?.id : j?.id, L = !!(F.id === "MEMBER" && T?.id && b?.id && T.id === b.id);
1709
+ return /* @__PURE__ */ N(S, {
1710
+ cancelText: "取消",
1711
+ confirmButtonProps: { disabled: !b || !ee || L },
1712
+ confirmText: c?.type === "EDIT" ? "儲存" : "建立",
1713
+ loading: h,
1714
+ modalType: "standard",
1715
+ onCancel: u,
1716
+ onClose: u,
1717
+ onConfirm: () => void d({
1718
+ effectiveFrom: g,
1719
+ effectiveTo: v || null,
1720
+ managerMemberId: b?.id ?? null,
1721
+ priority: Number(C),
1722
+ scopeId: ee ?? null,
1723
+ scopeType: F.id
1724
+ }),
1725
+ open: !!c,
1726
+ showModalFooter: !0,
1727
+ showModalHeader: !0,
1728
+ size: "regular",
1729
+ title: c?.type === "EDIT" ? "編輯主管規則" : "新增主管規則",
1730
+ children: /* @__PURE__ */ P("div", {
1731
+ className: W.modalFields,
1732
+ children: [
1733
+ /* @__PURE__ */ N(o, {
1734
+ label: "套用範圍",
1735
+ name: "scopeType",
1736
+ children: /* @__PURE__ */ N(E, {
1737
+ clearable: !1,
1738
+ fullWidth: !0,
1739
+ onChange: (e) => I(wt(e)),
1740
+ options: [...K],
1741
+ placeholder: "選擇套用範圍",
1742
+ value: F
1743
+ })
1744
+ }),
1745
+ F.id === "MEMBER" ? /* @__PURE__ */ N(o, {
1746
+ label: "會員",
1747
+ name: "scopeMemberId",
1748
+ children: /* @__PURE__ */ N(a, {
1749
+ name: "scopeMemberId",
1750
+ onChange: D,
1751
+ placeholder: "搜尋套用會員",
1752
+ value: T
1753
+ })
1754
+ }) : null,
1755
+ F.id === "ORG_UNIT" ? /* @__PURE__ */ N(o, {
1756
+ label: "組織",
1757
+ name: "scopeOrgUnitId",
1758
+ children: /* @__PURE__ */ N(n, {
1759
+ name: "scopeOrgUnitId",
1760
+ onChange: k,
1761
+ orgUnits: f,
1762
+ placeholder: "選擇套用組織",
1763
+ value: O
1764
+ })
1765
+ }) : null,
1766
+ F.id === "POSITION" ? /* @__PURE__ */ N(o, {
1767
+ label: "職位",
1768
+ name: "scopePositionId",
1769
+ children: /* @__PURE__ */ N(i, {
1770
+ name: "scopePositionId",
1771
+ onChange: M,
1772
+ placeholder: "選擇套用職位",
1773
+ positions: m,
1774
+ value: j
1775
+ })
1776
+ }) : null,
1777
+ /* @__PURE__ */ N(o, {
1778
+ label: "簽核主管",
1779
+ name: "managerMemberId",
1780
+ children: /* @__PURE__ */ N(a, {
1781
+ name: "managerMemberId",
1782
+ onChange: x,
1783
+ placeholder: "搜尋簽核主管",
1784
+ value: b
1785
+ })
1786
+ }),
1787
+ L ? /* @__PURE__ */ N(A, {
1788
+ color: "text-error",
1789
+ variant: "caption",
1790
+ children: "簽核主管不可設定為套用會員本人。"
1791
+ }) : null,
1792
+ /* @__PURE__ */ N(Q, {
1793
+ label: "優先序",
1794
+ name: "managerPriority",
1795
+ onChange: w,
1796
+ placeholder: "例如 10",
1797
+ value: C
1798
+ }),
1799
+ /* @__PURE__ */ N(mt, {
1800
+ label: "生效日",
1801
+ name: "managerEffectiveFrom",
1802
+ onChange: _,
1803
+ placeholder: "YYYY-MM-DD",
1804
+ value: g
1805
+ }),
1806
+ /* @__PURE__ */ N(mt, {
1807
+ label: "結束日",
1808
+ name: "managerEffectiveTo",
1809
+ onChange: y,
1810
+ placeholder: "YYYY-MM-DD,未設定代表無期限",
1811
+ value: v
1812
+ })
1813
+ ]
1814
+ })
1815
+ });
1816
+ }
1817
+ function Q({ label: e, name: t, onChange: n, placeholder: r, value: i }) {
1818
+ return /* @__PURE__ */ N(o, {
1819
+ label: e,
1820
+ name: t,
1821
+ children: /* @__PURE__ */ N(x, {
1822
+ fullWidth: !0,
1823
+ name: t,
1824
+ onChange: (e) => n(e.target.value),
1825
+ placeholder: r,
1826
+ value: i
1827
+ })
1828
+ });
1829
+ }
1830
+ function mt({ label: e, name: t, onChange: n, placeholder: r, value: i }) {
1831
+ return /* @__PURE__ */ N(o, {
1832
+ label: e,
1833
+ name: t,
1834
+ children: /* @__PURE__ */ N(g, {
1835
+ format: "YYYY-MM-DD",
1836
+ fullWidth: !0,
1837
+ inputProps: { name: t },
1838
+ onChange: (e) => n(Pt(e)),
1839
+ placeholder: r,
1840
+ value: i.trim() ? i : void 0
1841
+ })
1842
+ });
1843
+ }
1844
+ function ht(e, t) {
1845
+ return [...new Set([
1846
+ ...e.map((e) => e.memberId),
1847
+ ...t.map((e) => e.managerMemberId),
1848
+ ...t.filter((e) => e.scopeType === "MEMBER").map((e) => e.scopeId)
1849
+ ])];
1850
+ }
1851
+ function gt(e, t) {
1852
+ return e.scopeType === "MEMBER" ? `會員:${_t(t.membersById.get(e.scopeId))}` : e.scopeType === "ORG_UNIT" ? `組織:${vt(t.orgUnitsById.get(e.scopeId))}` : `職位:${bt(t.positionsById.get(e.scopeId))}`;
1853
+ }
1854
+ function _t(e) {
1855
+ return e ? `${e.name} · ${e.email}` : "未知會員";
1856
+ }
1857
+ function vt(e) {
1858
+ return e ? `${e.name} · ${e.code}` : "未知組織";
1859
+ }
1860
+ function yt(e) {
1861
+ return G.find((t) => t.id.toLowerCase() === e.toLowerCase())?.name ?? "未知類型";
1862
+ }
1863
+ function bt(e) {
1864
+ return e ? `${e.name} · ${e.code}` : "未指定";
1865
+ }
1866
+ function xt(e) {
1867
+ return e === "MANAGERS" || e === "MEMBERSHIPS" || e === "POSITIONS" ? e : "ORG_UNITS";
1868
+ }
1869
+ function St(e) {
1870
+ let t = Mt(e) ? e : null;
1871
+ if (typeof t?.id == "string") {
1872
+ let e = t.id;
1873
+ return G.find((t) => t.id.toLowerCase() === e.toLowerCase()) ?? G[2];
1874
+ }
1875
+ return G[2];
1876
+ }
1877
+ function Ct(e) {
1878
+ let t = Mt(e) ? e : null;
1879
+ if (typeof t?.id == "string") {
1880
+ let e = t.id;
1881
+ return Je.find((t) => t.id.toLowerCase() === e.toLowerCase()) ?? qe;
1882
+ }
1883
+ return qe;
1884
+ }
1885
+ function wt(e) {
1886
+ return jt(e, K, K[0]);
1887
+ }
1888
+ function Tt(e) {
1889
+ return jt(e, Xe, Ye);
1890
+ }
1891
+ function Et(e) {
1892
+ return jt(e, Qe, Ze);
1893
+ }
1894
+ function Dt(e) {
1895
+ let t = Mt(e) ? e : null, n = typeof t?.id == "string" ? t.id : null;
1896
+ return Qe.find((e) => e.id === n) ?? null;
1897
+ }
1898
+ function Ot(e) {
1899
+ let t = Mt(e) ? e : null, n = typeof t?.id == "string" ? t.id : null, r = typeof t?.name == "string" ? t.name : null;
1900
+ return n && r ? {
1901
+ id: n,
1902
+ name: r
1903
+ } : null;
1904
+ }
1905
+ function kt(e) {
1906
+ let t = Mt(e) ? e : null, n = typeof t?.id == "string" ? t.id : null, r = typeof t?.name == "string" ? t.name : null;
1907
+ return n && r ? {
1908
+ id: n,
1909
+ name: r
1910
+ } : null;
1911
+ }
1912
+ function At(e) {
1913
+ return jt(e, q, q[1]);
1914
+ }
1915
+ function jt(e, t, n) {
1916
+ let r = Mt(e) ? e : null, i = typeof r?.id == "string" ? r.id : null;
1917
+ return t.find((e) => e.id === i) ?? n;
1918
+ }
1919
+ function Mt(e) {
1920
+ return typeof e == "object" && !!e && !Array.isArray(e);
1921
+ }
1922
+ function $(e, t) {
1923
+ return e ? t(e) : null;
1924
+ }
1925
+ function Nt() {
1926
+ return Ft(/* @__PURE__ */ new Date());
1927
+ }
1928
+ function Pt(e) {
1929
+ let t = e ? new Date(e) : null;
1930
+ return t && !Number.isNaN(t.getTime()) ? Ft(t) : "";
1931
+ }
1932
+ function Ft(e) {
1933
+ return `${e.getFullYear()}-${It(e.getMonth() + 1)}-${It(e.getDate())}`;
1934
+ }
1935
+ function It(e) {
1936
+ return String(e).padStart(2, "0");
1937
+ }
1938
+ function Lt(e) {
1939
+ return e instanceof Error ? e.message : "讀取組織資料失敗。";
1940
+ }
1941
+ //#endregion
1942
+ export { J as t };
1943
+
1944
+ //# sourceMappingURL=orgs-Cc18umVt.js.map