@rytass/bpm-core-react 0.2.0 → 0.3.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 (437) hide show
  1. package/README.md +13 -1
  2. package/dist/chunks/app-navigation-C_mbz7jx.cjs +2 -0
  3. package/dist/chunks/app-navigation-C_mbz7jx.cjs.map +1 -0
  4. package/dist/chunks/{app-navigation-CATITRM7.js → app-navigation-uwbNEw9P.js} +66 -67
  5. package/dist/chunks/app-navigation-uwbNEw9P.js.map +1 -0
  6. package/dist/chunks/approval-instance-list-page-Mo6wpDPb.cjs +2 -0
  7. package/dist/chunks/approval-instance-list-page-Mo6wpDPb.cjs.map +1 -0
  8. package/dist/chunks/approval-instance-list-page-nmzMrj0b.js +281 -0
  9. package/dist/chunks/approval-instance-list-page-nmzMrj0b.js.map +1 -0
  10. package/dist/chunks/auth-provider-BV8Iiwfb.cjs +2 -0
  11. package/dist/chunks/auth-provider-BV8Iiwfb.cjs.map +1 -0
  12. package/dist/chunks/auth-provider-Bnox5gsx.js +98 -0
  13. package/dist/chunks/auth-provider-Bnox5gsx.js.map +1 -0
  14. package/dist/chunks/builder-DPhAH381.cjs +3 -0
  15. package/dist/chunks/builder-DPhAH381.cjs.map +1 -0
  16. package/dist/chunks/{FormBuilderView-CvChAvgD.js → builder-DqZskyXC.js} +334 -331
  17. package/dist/chunks/builder-DqZskyXC.js.map +1 -0
  18. package/dist/chunks/categories-DEijUOnw.cjs +2 -0
  19. package/dist/chunks/categories-DEijUOnw.cjs.map +1 -0
  20. package/dist/chunks/categories-DTEl182t.js +386 -0
  21. package/dist/chunks/categories-DTEl182t.js.map +1 -0
  22. package/dist/chunks/dashboard-page-DCmuB0Rw.cjs +2 -0
  23. package/dist/chunks/dashboard-page-DCmuB0Rw.cjs.map +1 -0
  24. package/dist/chunks/dashboard-page-Dx5PeEeN.js +117 -0
  25. package/dist/chunks/dashboard-page-Dx5PeEeN.js.map +1 -0
  26. package/dist/chunks/delegations-C-ZrwzvU.js +572 -0
  27. package/dist/chunks/delegations-C-ZrwzvU.js.map +1 -0
  28. package/dist/chunks/delegations-C5PzZ5Kn.js +645 -0
  29. package/dist/chunks/delegations-C5PzZ5Kn.js.map +1 -0
  30. package/dist/chunks/delegations-DOGDvybX.cjs +2 -0
  31. package/dist/chunks/delegations-DOGDvybX.cjs.map +1 -0
  32. package/dist/chunks/delegations-DkDBWOQ7.cjs +2 -0
  33. package/dist/chunks/delegations-DkDBWOQ7.cjs.map +1 -0
  34. package/dist/chunks/detail-B2gcOPkd.cjs +2 -0
  35. package/dist/chunks/detail-B2gcOPkd.cjs.map +1 -0
  36. package/dist/chunks/{InstanceDetailView-C-A-LOCG.js → detail-CfFyU5zC.js} +670 -667
  37. package/dist/chunks/detail-CfFyU5zC.js.map +1 -0
  38. package/dist/chunks/{format-date-time-BQyH5U8z.cjs → format-date-time-isOa3e9q.cjs} +2 -2
  39. package/dist/chunks/{format-date-time-BQyH5U8z.cjs.map → format-date-time-isOa3e9q.cjs.map} +1 -1
  40. package/dist/chunks/{LoginView-a1iu3cfc.js → login-C20yVxbc.js} +9 -9
  41. package/dist/chunks/login-C20yVxbc.js.map +1 -0
  42. package/dist/chunks/login-CQ9MfwcC.cjs +2 -0
  43. package/dist/chunks/login-CQ9MfwcC.cjs.map +1 -0
  44. package/dist/chunks/notifications-CPQ-nVar.cjs +2 -0
  45. package/dist/chunks/notifications-CPQ-nVar.cjs.map +1 -0
  46. package/dist/chunks/notifications-DweexUVy.js +197 -0
  47. package/dist/chunks/notifications-DweexUVy.js.map +1 -0
  48. package/dist/chunks/orgs-DgZ0DQ3-.cjs +2 -0
  49. package/dist/chunks/orgs-DgZ0DQ3-.cjs.map +1 -0
  50. package/dist/chunks/{AdminOrgsView-DZaVAbaQ.js → orgs-xrdhb3hS.js} +669 -666
  51. package/dist/chunks/orgs-xrdhb3hS.js.map +1 -0
  52. package/dist/chunks/templates-PK_VYvcy.js +383 -0
  53. package/dist/chunks/templates-PK_VYvcy.js.map +1 -0
  54. package/dist/chunks/templates-x1OJZmsG.cjs +2 -0
  55. package/dist/chunks/templates-x1OJZmsG.cjs.map +1 -0
  56. package/dist/chunks/users-CY4-NK3j.js +218 -0
  57. package/dist/chunks/users-CY4-NK3j.js.map +1 -0
  58. package/dist/chunks/users-DHnu_056.cjs +2 -0
  59. package/dist/chunks/users-DHnu_056.cjs.map +1 -0
  60. package/dist/components/app-navigation.d.ts +17 -10
  61. package/dist/index.cjs +1 -1
  62. package/dist/index.cjs.map +1 -1
  63. package/dist/index.js +12 -13
  64. package/dist/index.js.map +1 -1
  65. package/dist/lib/notification-drawer-provider.d.ts +1 -1
  66. package/dist/lib/notification-unread-provider.d.ts +1 -1
  67. package/dist/lib/providers.d.ts +1 -1
  68. package/dist/next/BPMNextProviders.d.ts +6 -0
  69. package/dist/next/index.cjs +2 -0
  70. package/dist/next/index.cjs.map +1 -0
  71. package/dist/next/index.d.ts +1 -0
  72. package/dist/next/index.js +33 -0
  73. package/dist/next/index.js.map +1 -0
  74. package/dist/pages/admin/delegations/index.cjs +1 -1
  75. package/dist/pages/admin/delegations/index.cjs.map +1 -1
  76. package/dist/pages/admin/delegations/index.js +1 -1
  77. package/dist/pages/admin/delegations/index.js.map +1 -1
  78. package/dist/pages/admin/orgs/index.cjs +1 -1
  79. package/dist/pages/admin/orgs/index.cjs.map +1 -1
  80. package/dist/pages/admin/orgs/index.js +1 -1
  81. package/dist/pages/admin/orgs/index.js.map +1 -1
  82. package/dist/pages/admin/users/index.cjs +1 -1
  83. package/dist/pages/admin/users/index.cjs.map +1 -1
  84. package/dist/pages/admin/users/index.js +1 -1
  85. package/dist/pages/admin/users/index.js.map +1 -1
  86. package/dist/pages/cc/index.cjs +1 -1
  87. package/dist/pages/cc/index.cjs.map +1 -1
  88. package/dist/pages/cc/index.js +1 -1
  89. package/dist/pages/cc/index.js.map +1 -1
  90. package/dist/pages/dashboard/index.cjs +1 -1
  91. package/dist/pages/dashboard/index.cjs.map +1 -1
  92. package/dist/pages/dashboard/index.js +1 -1
  93. package/dist/pages/dashboard/index.js.map +1 -1
  94. package/dist/pages/delegations/index.cjs +1 -1
  95. package/dist/pages/delegations/index.cjs.map +1 -1
  96. package/dist/pages/delegations/index.js +1 -1
  97. package/dist/pages/delegations/index.js.map +1 -1
  98. package/dist/pages/forms/builder/index.cjs +1 -1
  99. package/dist/pages/forms/builder/index.cjs.map +1 -1
  100. package/dist/pages/forms/builder/index.d.ts +5 -7
  101. package/dist/pages/forms/builder/index.js +1 -1
  102. package/dist/pages/forms/builder/index.js.map +1 -1
  103. package/dist/pages/forms/index.cjs +1 -1
  104. package/dist/pages/forms/index.cjs.map +1 -1
  105. package/dist/pages/forms/index.js +1 -1
  106. package/dist/pages/forms/index.js.map +1 -1
  107. package/dist/pages/inbox/index.cjs +1 -1
  108. package/dist/pages/inbox/index.cjs.map +1 -1
  109. package/dist/pages/inbox/index.js +1 -1
  110. package/dist/pages/inbox/index.js.map +1 -1
  111. package/dist/pages/instances/detail/index.cjs +1 -1
  112. package/dist/pages/instances/detail/index.cjs.map +1 -1
  113. package/dist/pages/instances/detail/index.d.ts +1 -1
  114. package/dist/pages/instances/detail/index.js +1 -1
  115. package/dist/pages/instances/detail/index.js.map +1 -1
  116. package/dist/pages/instances/new/index.cjs +1 -1
  117. package/dist/pages/instances/new/index.cjs.map +1 -1
  118. package/dist/pages/instances/new/index.d.ts +5 -1
  119. package/dist/pages/instances/new/index.js +4 -3
  120. package/dist/pages/instances/new/index.js.map +1 -1
  121. package/dist/pages/login/index.cjs +1 -1
  122. package/dist/pages/login/index.cjs.map +1 -1
  123. package/dist/pages/login/index.d.ts +5 -1
  124. package/dist/pages/login/index.js +4 -3
  125. package/dist/pages/login/index.js.map +1 -1
  126. package/dist/pages/root/index.cjs +1 -1
  127. package/dist/pages/root/index.cjs.map +1 -1
  128. package/dist/pages/root/index.d.ts +7 -5
  129. package/dist/pages/root/index.js +5 -6
  130. package/dist/pages/root/index.js.map +1 -1
  131. package/dist/pages/search/index.cjs +1 -1
  132. package/dist/pages/search/index.cjs.map +1 -1
  133. package/dist/pages/search/index.js +1 -1
  134. package/dist/pages/search/index.js.map +1 -1
  135. package/dist/pages/sent/index.cjs +1 -1
  136. package/dist/pages/sent/index.cjs.map +1 -1
  137. package/dist/pages/sent/index.js +1 -1
  138. package/dist/pages/sent/index.js.map +1 -1
  139. package/dist/pages/settings/notifications/index.cjs +1 -1
  140. package/dist/pages/settings/notifications/index.cjs.map +1 -1
  141. package/dist/pages/settings/notifications/index.js +1 -1
  142. package/dist/pages/settings/notifications/index.js.map +1 -1
  143. package/dist/pages/templates/categories/index.cjs +1 -1
  144. package/dist/pages/templates/categories/index.cjs.map +1 -1
  145. package/dist/pages/templates/categories/index.js +1 -1
  146. package/dist/pages/templates/categories/index.js.map +1 -1
  147. package/dist/pages/templates/designer/index.cjs +1 -1
  148. package/dist/pages/templates/designer/index.cjs.map +1 -1
  149. package/dist/pages/templates/designer/index.d.ts +2 -4
  150. package/dist/pages/templates/designer/index.js +1 -1
  151. package/dist/pages/templates/designer/index.js.map +1 -1
  152. package/dist/pages/templates/index.cjs +1 -1
  153. package/dist/pages/templates/index.cjs.map +1 -1
  154. package/dist/pages/templates/index.js +1 -1
  155. package/dist/pages/templates/index.js.map +1 -1
  156. package/dist/pages/templates/versions/index.cjs +1 -1
  157. package/dist/pages/templates/versions/index.cjs.map +1 -1
  158. package/dist/pages/templates/versions/index.d.ts +2 -4
  159. package/dist/pages/templates/versions/index.js +1 -1
  160. package/dist/pages/templates/versions/index.js.map +1 -1
  161. package/dist/views/admin/delegations/index.cjs +1 -1
  162. package/dist/views/admin/delegations/index.js +1 -1
  163. package/dist/views/admin/index.cjs +1 -0
  164. package/dist/views/admin/index.d.ts +3 -0
  165. package/dist/views/admin/index.js +4 -0
  166. package/dist/views/admin/orgs/index.cjs +1 -1
  167. package/dist/views/admin/orgs/index.js +1 -1
  168. package/dist/views/admin/users/index.cjs +1 -1
  169. package/dist/views/admin/users/index.js +1 -1
  170. package/dist/views/cc/index.cjs +2 -1
  171. package/dist/views/cc/index.cjs.map +1 -0
  172. package/dist/views/cc/index.js +19 -2
  173. package/dist/views/cc/index.js.map +1 -0
  174. package/dist/views/dashboard/index.cjs +2 -1
  175. package/dist/views/dashboard/index.cjs.map +1 -0
  176. package/dist/views/dashboard/index.js +11 -2
  177. package/dist/views/dashboard/index.js.map +1 -0
  178. package/dist/views/delegations/index.cjs +1 -1
  179. package/dist/views/delegations/index.js +1 -1
  180. package/dist/views/forms/builder/index.cjs +1 -1
  181. package/dist/views/forms/builder/index.js +1 -1
  182. package/dist/views/forms/index.cjs +2 -1
  183. package/dist/views/forms/index.cjs.map +1 -0
  184. package/dist/views/forms/index.d.ts +1 -0
  185. package/dist/views/forms/index.js +189 -2
  186. package/dist/views/forms/index.js.map +1 -0
  187. package/dist/views/inbox/index.cjs +2 -1
  188. package/dist/views/inbox/index.cjs.map +1 -0
  189. package/dist/views/inbox/index.js +293 -2
  190. package/dist/views/inbox/index.js.map +1 -0
  191. package/dist/views/instances/detail/index.cjs +1 -1
  192. package/dist/views/instances/detail/index.js +1 -1
  193. package/dist/views/instances/index.cjs +1 -0
  194. package/dist/views/instances/index.d.ts +1 -0
  195. package/dist/views/instances/index.js +2 -0
  196. package/dist/views/instances/new/InstanceNewView.d.ts +3 -3
  197. package/dist/views/instances/new/index.cjs +2 -1
  198. package/dist/views/instances/new/index.cjs.map +1 -0
  199. package/dist/views/instances/new/index.js +195 -2
  200. package/dist/views/instances/new/index.js.map +1 -0
  201. package/dist/views/login/index.cjs +1 -1
  202. package/dist/views/login/index.js +1 -1
  203. package/dist/views/search/index.cjs +2 -1
  204. package/dist/views/search/index.cjs.map +1 -0
  205. package/dist/views/search/index.js +19 -2
  206. package/dist/views/search/index.js.map +1 -0
  207. package/dist/views/sent/index.cjs +2 -1
  208. package/dist/views/sent/index.cjs.map +1 -0
  209. package/dist/views/sent/index.js +19 -2
  210. package/dist/views/sent/index.js.map +1 -0
  211. package/dist/views/settings/index.cjs +1 -0
  212. package/dist/views/settings/index.d.ts +1 -0
  213. package/dist/views/settings/index.js +2 -0
  214. package/dist/views/settings/notifications/index.cjs +1 -1
  215. package/dist/views/settings/notifications/index.js +1 -1
  216. package/dist/views/templates/categories/index.cjs +1 -1
  217. package/dist/views/templates/categories/index.js +1 -1
  218. package/dist/views/templates/designer/index.cjs +51 -1
  219. package/dist/views/templates/designer/index.cjs.map +1 -0
  220. package/dist/views/templates/designer/index.js +2275 -2
  221. package/dist/views/templates/designer/index.js.map +1 -0
  222. package/dist/views/templates/index.cjs +1 -1
  223. package/dist/views/templates/index.d.ts +2 -0
  224. package/dist/views/templates/index.js +4 -2
  225. package/dist/views/templates/versions/index.cjs +2 -1
  226. package/dist/views/templates/versions/index.cjs.map +1 -0
  227. package/dist/views/templates/versions/index.js +113 -2
  228. package/dist/views/templates/versions/index.js.map +1 -0
  229. package/dist/views/workflow/index.cjs +1 -0
  230. package/dist/views/workflow/index.d.ts +4 -0
  231. package/dist/views/workflow/index.js +5 -0
  232. package/package.json +28 -3
  233. package/dist/chunks/AdminDelegationsView-CqNmlVWx.cjs +0 -2
  234. package/dist/chunks/AdminDelegationsView-CqNmlVWx.cjs.map +0 -1
  235. package/dist/chunks/AdminDelegationsView-DydMZ9ED.js +0 -642
  236. package/dist/chunks/AdminDelegationsView-DydMZ9ED.js.map +0 -1
  237. package/dist/chunks/AdminOrgsView-DZaVAbaQ.js.map +0 -1
  238. package/dist/chunks/AdminOrgsView-bSsIyMvk.cjs +0 -2
  239. package/dist/chunks/AdminOrgsView-bSsIyMvk.cjs.map +0 -1
  240. package/dist/chunks/AdminUsersView-C0oO05Br.js +0 -215
  241. package/dist/chunks/AdminUsersView-C0oO05Br.js.map +0 -1
  242. package/dist/chunks/AdminUsersView-DlArLlIr.cjs +0 -2
  243. package/dist/chunks/AdminUsersView-DlArLlIr.cjs.map +0 -1
  244. package/dist/chunks/CcView-BsVsya5F.cjs +0 -2
  245. package/dist/chunks/CcView-BsVsya5F.cjs.map +0 -1
  246. package/dist/chunks/CcView-Bv0GzA5C.js +0 -19
  247. package/dist/chunks/CcView-Bv0GzA5C.js.map +0 -1
  248. package/dist/chunks/DashboardView-Dk1ZQmmk.js +0 -11
  249. package/dist/chunks/DashboardView-Dk1ZQmmk.js.map +0 -1
  250. package/dist/chunks/DashboardView-_0zh-rxT.cjs +0 -2
  251. package/dist/chunks/DashboardView-_0zh-rxT.cjs.map +0 -1
  252. package/dist/chunks/DelegationsView-DQUqOUV5.js +0 -569
  253. package/dist/chunks/DelegationsView-DQUqOUV5.js.map +0 -1
  254. package/dist/chunks/DelegationsView-pKeFV2LN.cjs +0 -2
  255. package/dist/chunks/DelegationsView-pKeFV2LN.cjs.map +0 -1
  256. package/dist/chunks/FormBuilderView-BKtyW55e.cjs +0 -3
  257. package/dist/chunks/FormBuilderView-BKtyW55e.cjs.map +0 -1
  258. package/dist/chunks/FormBuilderView-CvChAvgD.js.map +0 -1
  259. package/dist/chunks/FormsView-DYEuik8W.js +0 -185
  260. package/dist/chunks/FormsView-DYEuik8W.js.map +0 -1
  261. package/dist/chunks/FormsView-RjJEkIfZ.cjs +0 -2
  262. package/dist/chunks/FormsView-RjJEkIfZ.cjs.map +0 -1
  263. package/dist/chunks/InboxView-DDWwmWhA.cjs +0 -2
  264. package/dist/chunks/InboxView-DDWwmWhA.cjs.map +0 -1
  265. package/dist/chunks/InboxView-YSoyrYLk.js +0 -291
  266. package/dist/chunks/InboxView-YSoyrYLk.js.map +0 -1
  267. package/dist/chunks/InstanceDetailView-C-A-LOCG.js.map +0 -1
  268. package/dist/chunks/InstanceDetailView-l_kNDCz2.cjs +0 -2
  269. package/dist/chunks/InstanceDetailView-l_kNDCz2.cjs.map +0 -1
  270. package/dist/chunks/InstanceNewView-B5hz-FWd.js +0 -190
  271. package/dist/chunks/InstanceNewView-B5hz-FWd.js.map +0 -1
  272. package/dist/chunks/InstanceNewView-CdCsxQIu.cjs +0 -2
  273. package/dist/chunks/InstanceNewView-CdCsxQIu.cjs.map +0 -1
  274. package/dist/chunks/LoginView-BED07v-7.cjs +0 -2
  275. package/dist/chunks/LoginView-BED07v-7.cjs.map +0 -1
  276. package/dist/chunks/LoginView-a1iu3cfc.js.map +0 -1
  277. package/dist/chunks/RootClientView-rXJt4TDd.cjs +0 -2
  278. package/dist/chunks/RootClientView-rXJt4TDd.cjs.map +0 -1
  279. package/dist/chunks/RootClientView-wAkXUEZw.js +0 -34
  280. package/dist/chunks/RootClientView-wAkXUEZw.js.map +0 -1
  281. package/dist/chunks/SearchView-CgXPssgE.cjs +0 -2
  282. package/dist/chunks/SearchView-CgXPssgE.cjs.map +0 -1
  283. package/dist/chunks/SearchView-WXMbZwRw.js +0 -19
  284. package/dist/chunks/SearchView-WXMbZwRw.js.map +0 -1
  285. package/dist/chunks/SentView-BTDoFBrG.cjs +0 -2
  286. package/dist/chunks/SentView-BTDoFBrG.cjs.map +0 -1
  287. package/dist/chunks/SentView-CdOL92Rq.js +0 -19
  288. package/dist/chunks/SentView-CdOL92Rq.js.map +0 -1
  289. package/dist/chunks/SettingsNotificationsView-B6F6fa7U.js +0 -194
  290. package/dist/chunks/SettingsNotificationsView-B6F6fa7U.js.map +0 -1
  291. package/dist/chunks/SettingsNotificationsView-Bnz0CmoJ.cjs +0 -2
  292. package/dist/chunks/SettingsNotificationsView-Bnz0CmoJ.cjs.map +0 -1
  293. package/dist/chunks/TemplateCategoriesView-CgZciaSd.js +0 -382
  294. package/dist/chunks/TemplateCategoriesView-CgZciaSd.js.map +0 -1
  295. package/dist/chunks/TemplateCategoriesView-U0stGUBc.cjs +0 -2
  296. package/dist/chunks/TemplateCategoriesView-U0stGUBc.cjs.map +0 -1
  297. package/dist/chunks/TemplateDesignerView-A38DyYD4.cjs +0 -51
  298. package/dist/chunks/TemplateDesignerView-A38DyYD4.cjs.map +0 -1
  299. package/dist/chunks/TemplateDesignerView-Dffx-VZ-.js +0 -2272
  300. package/dist/chunks/TemplateDesignerView-Dffx-VZ-.js.map +0 -1
  301. package/dist/chunks/TemplateVersionsView-6sVQbBem.js +0 -110
  302. package/dist/chunks/TemplateVersionsView-6sVQbBem.js.map +0 -1
  303. package/dist/chunks/TemplateVersionsView-CMqw3ieU.cjs +0 -2
  304. package/dist/chunks/TemplateVersionsView-CMqw3ieU.cjs.map +0 -1
  305. package/dist/chunks/TemplatesView-BLj9f-XI.js +0 -380
  306. package/dist/chunks/TemplatesView-BLj9f-XI.js.map +0 -1
  307. package/dist/chunks/TemplatesView-DIOQTUUl.cjs +0 -2
  308. package/dist/chunks/TemplatesView-DIOQTUUl.cjs.map +0 -1
  309. package/dist/chunks/app-navigation-CATITRM7.js.map +0 -1
  310. package/dist/chunks/app-navigation-DAC5gFbG.cjs +0 -2
  311. package/dist/chunks/app-navigation-DAC5gFbG.cjs.map +0 -1
  312. package/dist/chunks/approval-instance-list-page-B6vAGvOb.js +0 -278
  313. package/dist/chunks/approval-instance-list-page-B6vAGvOb.js.map +0 -1
  314. package/dist/chunks/approval-instance-list-page-DIAmwhvl.cjs +0 -2
  315. package/dist/chunks/approval-instance-list-page-DIAmwhvl.cjs.map +0 -1
  316. package/dist/chunks/auth-provider-D2P-qWmY.cjs +0 -2
  317. package/dist/chunks/auth-provider-D2P-qWmY.cjs.map +0 -1
  318. package/dist/chunks/auth-provider-TTO9eNZV.js +0 -83
  319. package/dist/chunks/auth-provider-TTO9eNZV.js.map +0 -1
  320. package/dist/chunks/dashboard-page-BsW8t104.js +0 -115
  321. package/dist/chunks/dashboard-page-BsW8t104.js.map +0 -1
  322. package/dist/chunks/dashboard-page-udYhnyMW.cjs +0 -2
  323. package/dist/chunks/dashboard-page-udYhnyMW.cjs.map +0 -1
  324. package/dist/chunks/router-adapter-BdHZXLS3.js +0 -23
  325. package/dist/chunks/router-adapter-BdHZXLS3.js.map +0 -1
  326. package/dist/chunks/router-adapter-BybHrCNP.cjs +0 -2
  327. package/dist/chunks/router-adapter-BybHrCNP.cjs.map +0 -1
  328. package/dist/chunks/templates.module-B5bg_goX.js +0 -8
  329. package/dist/chunks/templates.module-B5bg_goX.js.map +0 -1
  330. package/dist/chunks/templates.module-ClRnQQX4.cjs +0 -2
  331. package/dist/chunks/templates.module-ClRnQQX4.cjs.map +0 -1
  332. package/dist/pages/admin/delegations/AdminDelegationsClientView.cjs +0 -2
  333. package/dist/pages/admin/delegations/AdminDelegationsClientView.cjs.map +0 -1
  334. package/dist/pages/admin/delegations/AdminDelegationsClientView.d.ts +0 -3
  335. package/dist/pages/admin/delegations/AdminDelegationsClientView.js +0 -28
  336. package/dist/pages/admin/delegations/AdminDelegationsClientView.js.map +0 -1
  337. package/dist/pages/admin/orgs/AdminOrgsClientView.cjs +0 -2
  338. package/dist/pages/admin/orgs/AdminOrgsClientView.cjs.map +0 -1
  339. package/dist/pages/admin/orgs/AdminOrgsClientView.d.ts +0 -3
  340. package/dist/pages/admin/orgs/AdminOrgsClientView.js +0 -28
  341. package/dist/pages/admin/orgs/AdminOrgsClientView.js.map +0 -1
  342. package/dist/pages/admin/users/AdminUsersClientView.cjs +0 -2
  343. package/dist/pages/admin/users/AdminUsersClientView.cjs.map +0 -1
  344. package/dist/pages/admin/users/AdminUsersClientView.d.ts +0 -3
  345. package/dist/pages/admin/users/AdminUsersClientView.js +0 -28
  346. package/dist/pages/admin/users/AdminUsersClientView.js.map +0 -1
  347. package/dist/pages/cc/CcClientView.cjs +0 -2
  348. package/dist/pages/cc/CcClientView.cjs.map +0 -1
  349. package/dist/pages/cc/CcClientView.d.ts +0 -7
  350. package/dist/pages/cc/CcClientView.js +0 -28
  351. package/dist/pages/cc/CcClientView.js.map +0 -1
  352. package/dist/pages/dashboard/DashboardClientView.cjs +0 -2
  353. package/dist/pages/dashboard/DashboardClientView.cjs.map +0 -1
  354. package/dist/pages/dashboard/DashboardClientView.d.ts +0 -9
  355. package/dist/pages/dashboard/DashboardClientView.js +0 -28
  356. package/dist/pages/dashboard/DashboardClientView.js.map +0 -1
  357. package/dist/pages/delegations/DelegationsClientView.cjs +0 -2
  358. package/dist/pages/delegations/DelegationsClientView.cjs.map +0 -1
  359. package/dist/pages/delegations/DelegationsClientView.d.ts +0 -3
  360. package/dist/pages/delegations/DelegationsClientView.js +0 -28
  361. package/dist/pages/delegations/DelegationsClientView.js.map +0 -1
  362. package/dist/pages/forms/FormsClientView.cjs +0 -2
  363. package/dist/pages/forms/FormsClientView.cjs.map +0 -1
  364. package/dist/pages/forms/FormsClientView.d.ts +0 -10
  365. package/dist/pages/forms/FormsClientView.js +0 -28
  366. package/dist/pages/forms/FormsClientView.js.map +0 -1
  367. package/dist/pages/forms/builder/FormBuilderClientView.cjs +0 -2
  368. package/dist/pages/forms/builder/FormBuilderClientView.cjs.map +0 -1
  369. package/dist/pages/forms/builder/FormBuilderClientView.d.ts +0 -11
  370. package/dist/pages/forms/builder/FormBuilderClientView.js +0 -28
  371. package/dist/pages/forms/builder/FormBuilderClientView.js.map +0 -1
  372. package/dist/pages/inbox/InboxClientView.cjs +0 -2
  373. package/dist/pages/inbox/InboxClientView.cjs.map +0 -1
  374. package/dist/pages/inbox/InboxClientView.d.ts +0 -9
  375. package/dist/pages/inbox/InboxClientView.js +0 -28
  376. package/dist/pages/inbox/InboxClientView.js.map +0 -1
  377. package/dist/pages/instances/detail/InstanceDetailClientView.cjs +0 -2
  378. package/dist/pages/instances/detail/InstanceDetailClientView.cjs.map +0 -1
  379. package/dist/pages/instances/detail/InstanceDetailClientView.d.ts +0 -9
  380. package/dist/pages/instances/detail/InstanceDetailClientView.js +0 -28
  381. package/dist/pages/instances/detail/InstanceDetailClientView.js.map +0 -1
  382. package/dist/pages/instances/new/InstanceNewClientView.cjs +0 -2
  383. package/dist/pages/instances/new/InstanceNewClientView.cjs.map +0 -1
  384. package/dist/pages/instances/new/InstanceNewClientView.d.ts +0 -8
  385. package/dist/pages/instances/new/InstanceNewClientView.js +0 -28
  386. package/dist/pages/instances/new/InstanceNewClientView.js.map +0 -1
  387. package/dist/pages/login/LoginClientView.cjs +0 -2
  388. package/dist/pages/login/LoginClientView.cjs.map +0 -1
  389. package/dist/pages/login/LoginClientView.d.ts +0 -11
  390. package/dist/pages/login/LoginClientView.js +0 -29
  391. package/dist/pages/login/LoginClientView.js.map +0 -1
  392. package/dist/pages/root/RootClientView.cjs +0 -1
  393. package/dist/pages/root/RootClientView.d.ts +0 -8
  394. package/dist/pages/root/RootClientView.js +0 -2
  395. package/dist/pages/search/SearchClientView.cjs +0 -2
  396. package/dist/pages/search/SearchClientView.cjs.map +0 -1
  397. package/dist/pages/search/SearchClientView.d.ts +0 -7
  398. package/dist/pages/search/SearchClientView.js +0 -28
  399. package/dist/pages/search/SearchClientView.js.map +0 -1
  400. package/dist/pages/sent/SentClientView.cjs +0 -2
  401. package/dist/pages/sent/SentClientView.cjs.map +0 -1
  402. package/dist/pages/sent/SentClientView.d.ts +0 -7
  403. package/dist/pages/sent/SentClientView.js +0 -28
  404. package/dist/pages/sent/SentClientView.js.map +0 -1
  405. package/dist/pages/settings/notifications/SettingsNotificationsClientView.cjs +0 -2
  406. package/dist/pages/settings/notifications/SettingsNotificationsClientView.cjs.map +0 -1
  407. package/dist/pages/settings/notifications/SettingsNotificationsClientView.d.ts +0 -3
  408. package/dist/pages/settings/notifications/SettingsNotificationsClientView.js +0 -28
  409. package/dist/pages/settings/notifications/SettingsNotificationsClientView.js.map +0 -1
  410. package/dist/pages/templates/TemplatesClientView.cjs +0 -2
  411. package/dist/pages/templates/TemplatesClientView.cjs.map +0 -1
  412. package/dist/pages/templates/TemplatesClientView.d.ts +0 -3
  413. package/dist/pages/templates/TemplatesClientView.js +0 -28
  414. package/dist/pages/templates/TemplatesClientView.js.map +0 -1
  415. package/dist/pages/templates/categories/TemplateCategoriesClientView.cjs +0 -2
  416. package/dist/pages/templates/categories/TemplateCategoriesClientView.cjs.map +0 -1
  417. package/dist/pages/templates/categories/TemplateCategoriesClientView.d.ts +0 -3
  418. package/dist/pages/templates/categories/TemplateCategoriesClientView.js +0 -28
  419. package/dist/pages/templates/categories/TemplateCategoriesClientView.js.map +0 -1
  420. package/dist/pages/templates/designer/TemplateDesignerClientView.cjs +0 -2
  421. package/dist/pages/templates/designer/TemplateDesignerClientView.cjs.map +0 -1
  422. package/dist/pages/templates/designer/TemplateDesignerClientView.d.ts +0 -3
  423. package/dist/pages/templates/designer/TemplateDesignerClientView.js +0 -28
  424. package/dist/pages/templates/designer/TemplateDesignerClientView.js.map +0 -1
  425. package/dist/pages/templates/versions/TemplateVersionsClientView.cjs +0 -2
  426. package/dist/pages/templates/versions/TemplateVersionsClientView.cjs.map +0 -1
  427. package/dist/pages/templates/versions/TemplateVersionsClientView.d.ts +0 -3
  428. package/dist/pages/templates/versions/TemplateVersionsClientView.js +0 -28
  429. package/dist/pages/templates/versions/TemplateVersionsClientView.js.map +0 -1
  430. /package/dist/{templates.css → categories.css} +0 -0
  431. /package/dist/{AdminDelegationsView.css → delegations.css} +0 -0
  432. /package/dist/{DelegationsView.css → delegations2.css} +0 -0
  433. /package/dist/{InstanceDetailView.css → detail.css} +0 -0
  434. /package/dist/{LoginView.css → login.css} +0 -0
  435. /package/dist/{SettingsNotificationsView.css → notifications.css} +0 -0
  436. /package/dist/{AdminOrgsView.css → orgs.css} +0 -0
  437. /package/dist/{AdminUsersView.css → users.css} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminOrgsView-bSsIyMvk.cjs","names":[],"sources":["../../src/lib/org-tree-draft.ts","../../src/components/org-unit-tree-draft-editor.module.scss","../../src/components/org-unit-tree-draft-editor.tsx","../../src/views/admin/orgs/orgs.module.scss","../../src/views/admin/orgs/AdminOrgsView.tsx"],"sourcesContent":["import type { OrgUnitRecord } from '@rytass/bpm-core-client/organization';\n\nexport type OrgUnitParentDraftMap = ReadonlyMap<string, string | null>;\n\nexport type OrgUnitHierarchyDraftChange = Readonly<{\n orgUnitId: string;\n parentId: string | null;\n previousParentId: string | null;\n}>;\n\nexport type OrgUnitParentAssignmentResult = Readonly<{\n message: string;\n parentDraft: OrgUnitParentDraftMap;\n status: 'INVALID' | 'UNCHANGED' | 'UPDATED';\n}>;\n\nexport function createOrgUnitParentDraftMap(\n orgUnits: readonly OrgUnitRecord[],\n): OrgUnitParentDraftMap {\n return new Map(\n orgUnits.map((orgUnit): readonly [string, string | null] => [\n orgUnit.id,\n orgUnit.parentId,\n ]),\n );\n}\n\nexport function assignOrgUnitDraftParent({\n orgUnitId,\n parentDraft,\n parentId,\n}: {\n readonly orgUnitId: string;\n readonly parentDraft: OrgUnitParentDraftMap;\n readonly parentId: string | null;\n}): OrgUnitParentAssignmentResult {\n const normalizedParentId = parentId === orgUnitId ? orgUnitId : parentId;\n const validationMessage = readOrgUnitParentValidationMessage({\n orgUnitId,\n parentDraft,\n parentId: normalizedParentId,\n });\n\n if (validationMessage) {\n return {\n message: validationMessage,\n parentDraft,\n status: 'INVALID',\n };\n }\n\n if ((parentDraft.get(orgUnitId) ?? null) === normalizedParentId) {\n return {\n message: '父子關係沒有變更。',\n parentDraft,\n status: 'UNCHANGED',\n };\n }\n\n const nextDraft = new Map(parentDraft);\n nextDraft.set(orgUnitId, normalizedParentId);\n\n return {\n message: normalizedParentId ? '已暫存新的上層組織。' : '已暫存為根節點。',\n parentDraft: nextDraft,\n status: 'UPDATED',\n };\n}\n\nexport function readOrgUnitHierarchyDraftChanges({\n orgUnits,\n parentDraft,\n}: {\n readonly orgUnits: readonly OrgUnitRecord[];\n readonly parentDraft: OrgUnitParentDraftMap;\n}): readonly OrgUnitHierarchyDraftChange[] {\n return orgUnits\n .map((orgUnit): OrgUnitHierarchyDraftChange | null => {\n const parentId = parentDraft.get(orgUnit.id) ?? null;\n\n return parentId === orgUnit.parentId\n ? null\n : {\n orgUnitId: orgUnit.id,\n parentId,\n previousParentId: orgUnit.parentId,\n };\n })\n .filter((change): change is OrgUnitHierarchyDraftChange => Boolean(change));\n}\n\nexport function readOrgUnitParentValidationMessage({\n orgUnitId,\n parentDraft,\n parentId,\n}: {\n readonly orgUnitId: string;\n readonly parentDraft: OrgUnitParentDraftMap;\n readonly parentId: string | null;\n}): string | null {\n if (!parentDraft.has(orgUnitId)) {\n return '找不到要搬移的組織節點。';\n }\n\n if (!parentId) {\n return null;\n }\n\n if (!parentDraft.has(parentId)) {\n return '找不到新的上層組織。';\n }\n\n if (parentId === orgUnitId) {\n return '組織不可成為自己的上層。';\n }\n\n return createsOrgUnitParentCycle({ orgUnitId, parentDraft, parentId })\n ? '不可搬移到自己的下層組織。'\n : null;\n}\n\nfunction createsOrgUnitParentCycle({\n orgUnitId,\n parentDraft,\n parentId,\n}: {\n readonly orgUnitId: string;\n readonly parentDraft: OrgUnitParentDraftMap;\n readonly parentId: string;\n}): boolean {\n const visitedIds = new Set<string>();\n let currentParentId: string | null = parentId;\n\n while (currentParentId) {\n if (currentParentId === orgUnitId || visitedIds.has(currentParentId)) {\n return true;\n }\n\n visitedIds.add(currentParentId);\n currentParentId = parentDraft.get(currentParentId) ?? null;\n }\n\n return false;\n}\n",".orgTreeEditor {\n display: grid;\n gap: 12px;\n min-width: 0;\n}\n\n.orgTreeSummary {\n display: grid;\n gap: 6px;\n min-width: 0;\n padding: 10px 12px;\n border: 1px solid var(--mzn-color-border, #d9dce1);\n border-radius: 8px;\n background: var(--mzn-color-bg, #fff);\n}\n\n.orgTreeChangeList {\n display: grid;\n gap: 4px;\n max-height: 128px;\n margin: 0;\n padding-left: 18px;\n overflow: auto;\n color: var(--mzn-color-text-neutral, #5f6673);\n font-size: 13px;\n}\n\n.orgTreeCanvas {\n width: 100%;\n height: min(720px, calc(100vh - 300px));\n min-height: 520px;\n overflow: hidden;\n border: 1px solid var(--mzn-color-border, #d9dce1);\n border-radius: 8px;\n background: #f7f9fc;\n}\n\n.orgTreeNode {\n display: grid;\n gap: 6px;\n width: 232px;\n min-height: 118px;\n padding: 12px;\n border: 1px solid var(--mzn-color-border, #d9dce1);\n border-radius: 8px;\n background: #fff;\n box-shadow: 0 4px 12px rgb(20 28 44 / 8%);\n}\n\n.orgTreeNodeRoot {\n min-height: 86px;\n border-style: dashed;\n background: #eef4ff;\n}\n\n.orgTreeNodeSelected {\n border-color: var(--mzn-color-primary, #0057ff);\n box-shadow: 0 0 0 3px rgb(0 87 255 / 14%);\n}\n\n.orgTreeNodeChanged {\n border-color: var(--mzn-color-primary, #0057ff);\n}\n\n.orgTreeNodeDeleted {\n opacity: 0.58;\n}\n\n.orgTreeNodeHeader {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 8px;\n min-width: 0;\n}\n\n.orgTreeNodeHeader > :global(.mzn-typography) {\n min-width: 0;\n}\n\n.orgTreeNodeBadge {\n flex: 0 0 auto;\n padding: 2px 6px;\n border-radius: 999px;\n background: #e4f0ff;\n color: var(--mzn-color-primary, #0057ff);\n font-size: 12px;\n line-height: 18px;\n}\n\n.orgTreeNodeActions {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding-top: 2px;\n}\n","'use client';\n\nimport {\n ReactElement,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react';\nimport {\n Background,\n Connection,\n ConnectionMode,\n Controls,\n Edge,\n Handle,\n MiniMap,\n Node,\n NodeProps,\n NodeTypes,\n OnNodeDrag,\n OnNodesChange,\n Position,\n ReactFlow,\n applyNodeChanges,\n} from '@xyflow/react';\nimport * as dagre from 'dagre';\nimport { Button, Typography } from '@mezzanine-ui/react';\nimport { EditIcon, PlusIcon } from '@mezzanine-ui/icons';\nimport type { OrgUnitRecord, OrgUnitType } from '@rytass/bpm-core-client/organization';\nimport {\n OrgUnitHierarchyDraftChange,\n OrgUnitParentDraftMap,\n assignOrgUnitDraftParent,\n createOrgUnitParentDraftMap,\n readOrgUnitHierarchyDraftChanges,\n readOrgUnitParentValidationMessage,\n} from '../lib/org-tree-draft';\nimport styles from './org-unit-tree-draft-editor.module.scss';\n\ntype OrgUnitTreeFlowData = Readonly<{\n changed: boolean;\n code: string;\n deleted: boolean;\n isEditing: boolean;\n isSyntheticRoot: boolean;\n name: string;\n onCreateChild: (parentId: string | null) => void;\n onEdit: (orgUnitId: string) => void;\n orgUnitId: string | null;\n parentLabel: string;\n path: string;\n typeLabel: string;\n}>;\n\ntype OrgUnitTreeNode = Node<OrgUnitTreeFlowData, 'orgUnit'>;\ntype OrgUnitTreeEdge = Edge<Record<string, never>>;\n\nexport type OrgUnitTreeDraftEditorHandle = Readonly<{\n cancelEditing: () => void;\n saveDraft: () => Promise<void>;\n startEditing: () => void;\n}>;\n\nexport type OrgUnitTreeDraftEditorState = Readonly<{\n hasDraftChanges: boolean;\n isEditing: boolean;\n}>;\n\ntype OrgUnitTreeDraftEditorProps = Readonly<{\n onCreateChild: (parentId: string) => void;\n onCreateRoot: () => void;\n onEditOrgUnit: (orgUnit: OrgUnitRecord) => void;\n onSaveDraft?: (\n changes: readonly OrgUnitHierarchyDraftChange[],\n ) => Promise<void>;\n onStateChange: (state: OrgUnitTreeDraftEditorState) => void;\n orgUnits: readonly OrgUnitRecord[];\n saving: boolean;\n}>;\n\nconst ORG_TREE_ROOT_ID = '__org-tree-root__';\nconst ORG_TREE_NODE_WIDTH = 232;\nconst ORG_TREE_NODE_HEIGHT = 118;\nconst ORG_TREE_ROOT_WIDTH = 232;\nconst ORG_TREE_ROOT_HEIGHT = 86;\nconst ORG_TREE_DROP_DISTANCE = 320;\n\nconst ORG_UNIT_TYPE_LABELS: Readonly<Record<Uppercase<OrgUnitType>, string>> = {\n COMPANY: '公司',\n DEPARTMENT: '部門',\n DIVISION: '事業群',\n TEAM: '小組',\n};\n\nconst orgUnitTreeNodeTypes: NodeTypes = {\n orgUnit: OrgUnitTreeNodeCard,\n};\n\nexport const OrgUnitTreeDraftEditor = forwardRef<\n OrgUnitTreeDraftEditorHandle,\n OrgUnitTreeDraftEditorProps\n>(function OrgUnitTreeDraftEditor(\n {\n onCreateChild,\n onCreateRoot,\n onEditOrgUnit,\n onSaveDraft,\n onStateChange,\n orgUnits,\n },\n ref,\n): ReactElement {\n const [isEditing, setIsEditing] = useState(false);\n const [draftMessage, setDraftMessage] = useState<string | null>(null);\n const [selectedOrgUnitId, setSelectedOrgUnitId] = useState<string | null>(\n null,\n );\n const [parentDraft, setParentDraft] = useState<OrgUnitParentDraftMap>(() =>\n createOrgUnitParentDraftMap(orgUnits),\n );\n const [flowNodes, setFlowNodes] = useState<readonly OrgUnitTreeNode[]>([]);\n\n const orgUnitsById = useMemo(\n (): ReadonlyMap<string, OrgUnitRecord> =>\n new Map(orgUnits.map((orgUnit) => [orgUnit.id, orgUnit])),\n [orgUnits],\n );\n const draftChanges = useMemo(\n (): readonly OrgUnitHierarchyDraftChange[] =>\n readOrgUnitHierarchyDraftChanges({ orgUnits, parentDraft }),\n [orgUnits, parentDraft],\n );\n const flowElements = useMemo(\n (): Readonly<{\n edges: readonly OrgUnitTreeEdge[];\n nodes: readonly OrgUnitTreeNode[];\n }> =>\n createOrgUnitTreeFlowElements({\n isEditing,\n onCreateChild: (parentId): void => {\n if (parentId) {\n onCreateChild(parentId);\n } else {\n onCreateRoot();\n }\n },\n onEditOrgUnit: (orgUnitId): void => {\n const orgUnit = orgUnitsById.get(orgUnitId);\n\n if (orgUnit) {\n onEditOrgUnit(orgUnit);\n }\n },\n orgUnits,\n orgUnitsById,\n parentDraft,\n selectedOrgUnitId,\n }),\n [\n isEditing,\n onCreateChild,\n onCreateRoot,\n onEditOrgUnit,\n orgUnits,\n orgUnitsById,\n parentDraft,\n selectedOrgUnitId,\n ],\n );\n const hasDraftChanges = draftChanges.length > 0;\n\n useImperativeHandle(\n ref,\n (): OrgUnitTreeDraftEditorHandle => ({\n cancelEditing,\n saveDraft,\n startEditing,\n }),\n );\n\n useEffect((): void => {\n onStateChange({ hasDraftChanges, isEditing });\n }, [hasDraftChanges, isEditing, onStateChange]);\n\n useEffect((): void => {\n setParentDraft(createOrgUnitParentDraftMap(orgUnits));\n setSelectedOrgUnitId(null);\n setDraftMessage(null);\n setIsEditing(false);\n }, [orgUnits]);\n\n useEffect((): void => {\n setFlowNodes(flowElements.nodes);\n }, [flowElements.nodes]);\n\n const assignDraftParent = useCallback(\n (orgUnitId: string, parentId: string | null): void => {\n setParentDraft((currentDraft) => {\n const result = assignOrgUnitDraftParent({\n orgUnitId,\n parentDraft: currentDraft,\n parentId,\n });\n\n setDraftMessage(result.message);\n\n return result.parentDraft;\n });\n },\n [],\n );\n\n const handleConnect = useCallback(\n (connection: Connection): void => {\n if (!isEditing || !connection.target || !connection.source) {\n return;\n }\n\n const nextParentId =\n connection.source === ORG_TREE_ROOT_ID ? null : connection.source;\n\n if (connection.target === ORG_TREE_ROOT_ID) {\n setDraftMessage('根節點不能搬移到其他節點下。');\n return;\n }\n\n assignDraftParent(connection.target, nextParentId);\n },\n [assignDraftParent, isEditing],\n );\n\n const handleNodeChanges = useCallback<OnNodesChange<OrgUnitTreeNode>>(\n (changes): void => {\n if (!isEditing) {\n return;\n }\n\n setFlowNodes((currentNodes) =>\n applyNodeChanges(changes, [...currentNodes]),\n );\n },\n [isEditing],\n );\n\n const handleNodeDragStop = useCallback<OnNodeDrag<OrgUnitTreeNode>>(\n (event, node, nodes): void => {\n if (!isEditing || node.id === ORG_TREE_ROOT_ID) {\n return;\n }\n\n const nearestParent =\n readNearestParentNodeIdFromPointer(event, node.id) ??\n readNearestParentNodeId(node, nodes);\n\n if (nearestParent === undefined) {\n setDraftMessage('拖曳到目標父節點附近,或從父節點拉線到子節點。');\n return;\n }\n\n assignDraftParent(\n node.id,\n nearestParent === ORG_TREE_ROOT_ID ? null : nearestParent,\n );\n },\n [assignDraftParent, isEditing],\n );\n\n function startEditing(): void {\n setIsEditing(true);\n setParentDraft(createOrgUnitParentDraftMap(orgUnits));\n setDraftMessage('已進入編輯模式,拖曳節點或拉線只會更新前端草稿。');\n }\n\n function cancelEditing(): void {\n setIsEditing(false);\n setParentDraft(createOrgUnitParentDraftMap(orgUnits));\n setDraftMessage('已取消草稿變更。');\n }\n\n async function saveDraft(): Promise<void> {\n if (!onSaveDraft) {\n setDraftMessage('批次儲存 API 尚未接上,草稿仍保留在前端。');\n return;\n }\n\n await onSaveDraft(draftChanges);\n setIsEditing(false);\n setDraftMessage('組織樹草稿已儲存。');\n }\n\n return (\n <div className={styles.orgTreeEditor}>\n <div className={styles.orgTreeSummary}>\n <Typography color=\"text-neutral\" variant=\"caption\">\n {draftMessage ??\n (hasDraftChanges\n ? `目前有 ${draftChanges.length} 筆父子關係草稿變更。`\n : '目前沒有草稿變更。')}\n </Typography>\n {hasDraftChanges ? (\n <ul className={styles.orgTreeChangeList}>\n {draftChanges.map((change) => (\n <li key={change.orgUnitId}>\n {readOrgUnitName(change.orgUnitId, orgUnitsById)}\n {':'}\n {readOrgUnitName(change.previousParentId, orgUnitsById)}\n {' -> '}\n {readOrgUnitName(change.parentId, orgUnitsById)}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n <div className={styles.orgTreeCanvas}>\n <ReactFlow\n connectionMode={ConnectionMode.Strict}\n edges={[...flowElements.edges]}\n fitView\n fitViewOptions={{ padding: 0.18 }}\n isValidConnection={(connection): boolean =>\n isOrgTreeConnectionValid(\n { source: connection.source, target: connection.target },\n parentDraft,\n )\n }\n maxZoom={1.4}\n minZoom={0.25}\n nodeTypes={orgUnitTreeNodeTypes}\n nodes={[...flowNodes]}\n nodesConnectable={isEditing}\n nodesDraggable={isEditing}\n onConnect={handleConnect}\n onNodeClick={(_, node): void => {\n setSelectedOrgUnitId(node.id === ORG_TREE_ROOT_ID ? null : node.id);\n }}\n onNodeDoubleClick={(_, node): void => {\n if (node.id !== ORG_TREE_ROOT_ID) {\n const orgUnit = orgUnitsById.get(node.id);\n\n if (orgUnit) {\n onEditOrgUnit(orgUnit);\n }\n }\n }}\n onNodeDragStop={handleNodeDragStop}\n onNodesChange={handleNodeChanges}\n onPaneClick={(): void => setSelectedOrgUnitId(null)}\n panOnDrag\n proOptions={{ hideAttribution: true }}\n >\n <Background />\n <Controls />\n <MiniMap pannable zoomable />\n </ReactFlow>\n </div>\n </div>\n );\n});\n\nfunction OrgUnitTreeNodeCard({\n data,\n selected,\n}: NodeProps<OrgUnitTreeNode>): ReactElement {\n return (\n <div\n className={[\n styles.orgTreeNode,\n data.isSyntheticRoot ? styles.orgTreeNodeRoot : '',\n data.changed ? styles.orgTreeNodeChanged : '',\n data.deleted ? styles.orgTreeNodeDeleted : '',\n selected ? styles.orgTreeNodeSelected : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {data.isSyntheticRoot ? null : (\n <Handle\n id=\"target\"\n isConnectable={data.isEditing}\n position={Position.Top}\n type=\"target\"\n />\n )}\n <Handle\n id=\"source\"\n isConnectable={data.isEditing}\n position={Position.Bottom}\n type=\"source\"\n />\n <div className={styles.orgTreeNodeHeader}>\n <Typography\n component=\"span\"\n ellipsis\n title={data.name}\n variant=\"label-primary\"\n >\n {data.name}\n </Typography>\n {data.changed ? (\n <span className={styles.orgTreeNodeBadge}>草稿</span>\n ) : null}\n </div>\n <Typography\n color=\"text-neutral\"\n component=\"span\"\n ellipsis\n title={data.code}\n variant=\"caption\"\n >\n {data.isSyntheticRoot\n ? '根節點容器'\n : `${data.typeLabel} · ${data.code}`}\n </Typography>\n {data.isSyntheticRoot ? null : (\n <Typography\n color=\"text-neutral\"\n component=\"span\"\n ellipsis\n title={data.parentLabel}\n variant=\"caption\"\n >\n 上層:{data.parentLabel}\n </Typography>\n )}\n <div className={styles.orgTreeNodeActions}>\n {data.isSyntheticRoot ? (\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => data.onCreateChild(null)}\n size=\"sub\"\n variant=\"base-secondary\"\n >\n 新增根節點\n </Button>\n ) : (\n <>\n <Button\n icon={EditIcon}\n iconType=\"leading\"\n onClick={(): void => {\n if (data.orgUnitId) {\n data.onEdit(data.orgUnitId);\n }\n }}\n size=\"sub\"\n variant=\"base-secondary\"\n >\n 編輯\n </Button>\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => data.onCreateChild(data.orgUnitId)}\n size=\"sub\"\n variant=\"base-secondary\"\n >\n 新增子節點\n </Button>\n </>\n )}\n </div>\n </div>\n );\n}\n\nfunction createOrgUnitTreeFlowElements({\n isEditing,\n onCreateChild,\n onEditOrgUnit,\n orgUnits,\n orgUnitsById,\n parentDraft,\n selectedOrgUnitId,\n}: {\n readonly isEditing: boolean;\n readonly onCreateChild: (parentId: string | null) => void;\n readonly onEditOrgUnit: (orgUnitId: string) => void;\n readonly orgUnits: readonly OrgUnitRecord[];\n readonly orgUnitsById: ReadonlyMap<string, OrgUnitRecord>;\n readonly parentDraft: OrgUnitParentDraftMap;\n readonly selectedOrgUnitId: string | null;\n}): Readonly<{\n edges: readonly OrgUnitTreeEdge[];\n nodes: readonly OrgUnitTreeNode[];\n}> {\n const graph = new dagre.graphlib.Graph();\n graph.setDefaultEdgeLabel(() => ({}));\n graph.setGraph({ marginx: 36, marginy: 36, nodesep: 44, rankdir: 'TB' });\n graph.setNode(ORG_TREE_ROOT_ID, {\n height: ORG_TREE_ROOT_HEIGHT,\n width: ORG_TREE_ROOT_WIDTH,\n });\n orgUnits.forEach((orgUnit): void => {\n graph.setNode(orgUnit.id, {\n height: ORG_TREE_NODE_HEIGHT,\n width: ORG_TREE_NODE_WIDTH,\n });\n });\n orgUnits.forEach((orgUnit): void => {\n const parentId = parentDraft.get(orgUnit.id) ?? null;\n graph.setEdge(parentId ?? ORG_TREE_ROOT_ID, orgUnit.id);\n });\n dagre.layout(graph);\n\n const rootNode = createOrgUnitTreeNode({\n data: {\n changed: false,\n code: ORG_TREE_ROOT_ID,\n deleted: false,\n isEditing,\n isSyntheticRoot: true,\n name: '組織根節點',\n onCreateChild,\n onEdit: onEditOrgUnit,\n orgUnitId: null,\n parentLabel: '',\n path: '',\n typeLabel: '',\n },\n graph,\n height: ORG_TREE_ROOT_HEIGHT,\n id: ORG_TREE_ROOT_ID,\n selected: selectedOrgUnitId === null,\n width: ORG_TREE_ROOT_WIDTH,\n });\n const orgNodes = orgUnits.map((orgUnit): OrgUnitTreeNode => {\n const parentId = parentDraft.get(orgUnit.id) ?? null;\n const parentLabel = readOrgUnitName(parentId, orgUnitsById);\n\n return createOrgUnitTreeNode({\n data: {\n changed: parentId !== orgUnit.parentId,\n code: orgUnit.code,\n deleted: Boolean(orgUnit.deletedAt),\n isEditing,\n isSyntheticRoot: false,\n name: orgUnit.name,\n onCreateChild,\n onEdit: onEditOrgUnit,\n orgUnitId: orgUnit.id,\n parentLabel,\n path: orgUnit.path,\n typeLabel: readOrgUnitTypeLabel(orgUnit.type),\n },\n graph,\n height: ORG_TREE_NODE_HEIGHT,\n id: orgUnit.id,\n selected: selectedOrgUnitId === orgUnit.id,\n width: ORG_TREE_NODE_WIDTH,\n });\n });\n const edges = orgUnits.map((orgUnit): OrgUnitTreeEdge => {\n const parentId = parentDraft.get(orgUnit.id) ?? null;\n const changed = parentId !== orgUnit.parentId;\n\n return {\n animated: isEditing && changed,\n data: {},\n id: `org-tree-edge-${parentId ?? 'root'}-${orgUnit.id}`,\n source: parentId ?? ORG_TREE_ROOT_ID,\n sourceHandle: 'source',\n style: changed\n ? { stroke: 'var(--mzn-color-primary, #0057ff)', strokeWidth: 2 }\n : undefined,\n target: orgUnit.id,\n targetHandle: 'target',\n type: 'smoothstep',\n };\n });\n\n return {\n edges,\n nodes: [rootNode, ...orgNodes],\n };\n}\n\nfunction createOrgUnitTreeNode({\n data,\n graph,\n height,\n id,\n selected,\n width,\n}: {\n readonly data: OrgUnitTreeFlowData;\n readonly graph: dagre.graphlib.Graph;\n readonly height: number;\n readonly id: string;\n readonly selected: boolean;\n readonly width: number;\n}): OrgUnitTreeNode {\n const positionedNode = graph.node(id) as\n | Readonly<{ x: number; y: number }>\n | undefined;\n\n return {\n data,\n height,\n id,\n initialHeight: height,\n initialWidth: width,\n position: positionedNode\n ? {\n x: positionedNode.x - width / 2,\n y: positionedNode.y - height / 2,\n }\n : { x: 0, y: 0 },\n selected,\n sourcePosition: Position.Bottom,\n targetPosition: Position.Top,\n type: 'orgUnit',\n width,\n };\n}\n\nfunction readNearestParentNodeId(\n draggedNode: OrgUnitTreeNode,\n nodes: readonly OrgUnitTreeNode[],\n): string | undefined {\n const draggedCenter = readNodeCenter(draggedNode);\n const candidates = nodes\n .filter((node) => node.id !== draggedNode.id)\n .map(\n (node): Readonly<{ distance: number; id: string }> => ({\n distance: readDistance(draggedCenter, readNodeCenter(node)),\n id: node.id,\n }),\n )\n .filter((candidate) => candidate.distance <= ORG_TREE_DROP_DISTANCE)\n .sort((left, right) => left.distance - right.distance);\n\n return candidates[0]?.id;\n}\n\nfunction readNearestParentNodeIdFromPointer(\n event: unknown,\n draggedNodeId: string,\n): string | undefined {\n const point = readPointerPoint(event);\n\n if (!point) {\n return undefined;\n }\n\n const candidates = Array.from(\n document.querySelectorAll<HTMLElement>('.react-flow__node[data-id]'),\n )\n .map((element): Readonly<{ distance: number; id: string }> | null => {\n const id = element.dataset['id'];\n\n if (!id || id === draggedNodeId) {\n return null;\n }\n\n const rect = element.getBoundingClientRect();\n const center = {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n };\n\n return {\n distance: readDistance(point, center),\n id,\n };\n })\n .filter(\n (\n candidate,\n ): candidate is Readonly<{ distance: number; id: string }> =>\n Boolean(candidate),\n )\n .filter((candidate) => candidate.distance <= ORG_TREE_DROP_DISTANCE)\n .sort((left, right) => left.distance - right.distance);\n\n return candidates[0]?.id;\n}\n\nfunction readPointerPoint(\n event: unknown,\n): Readonly<{ x: number; y: number }> | null {\n if (!isPointerEventLike(event)) {\n return null;\n }\n\n return { x: event.clientX, y: event.clientY };\n}\n\nfunction isPointerEventLike(\n event: unknown,\n): event is Readonly<{ clientX: number; clientY: number }> {\n return (\n typeof event === 'object' &&\n event !== null &&\n 'clientX' in event &&\n 'clientY' in event &&\n typeof event.clientX === 'number' &&\n typeof event.clientY === 'number'\n );\n}\n\nfunction readNodeCenter(\n node: OrgUnitTreeNode,\n): Readonly<{ x: number; y: number }> {\n return {\n x: node.position.x + (node.width ?? ORG_TREE_NODE_WIDTH) / 2,\n y: node.position.y + (node.height ?? ORG_TREE_NODE_HEIGHT) / 2,\n };\n}\n\nfunction readDistance(\n source: Readonly<{ x: number; y: number }>,\n target: Readonly<{ x: number; y: number }>,\n): number {\n return Math.hypot(source.x - target.x, source.y - target.y);\n}\n\nfunction isOrgTreeConnectionValid(\n connection: Readonly<{ source: string | null; target: string | null }>,\n parentDraft: OrgUnitParentDraftMap,\n): boolean {\n if (!connection.source || !connection.target) {\n return false;\n }\n\n if (connection.target === ORG_TREE_ROOT_ID) {\n return false;\n }\n\n return (\n readOrgUnitParentValidationMessage({\n orgUnitId: connection.target,\n parentDraft,\n parentId:\n connection.source === ORG_TREE_ROOT_ID ? null : connection.source,\n }) === null\n );\n}\n\nfunction readOrgUnitName(\n orgUnitId: string | null,\n orgUnitsById: ReadonlyMap<string, OrgUnitRecord>,\n): string {\n if (!orgUnitId) {\n return '根節點';\n }\n\n const orgUnit = orgUnitsById.get(orgUnitId);\n\n return orgUnit ? `${orgUnit.name} · ${orgUnit.code}` : '未知組織';\n}\n\nfunction readOrgUnitTypeLabel(type: OrgUnitType): string {\n const normalizedType = type.toUpperCase() as Uppercase<OrgUnitType>;\n\n return ORG_UNIT_TYPE_LABELS[normalizedType] ?? '未知類型';\n}\n",".tableIntroActions {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n flex: 0 0 auto;\n max-width: 100%;\n}\n\n.tableIntroActions > :global(.mzn-button) {\n flex: 0 0 auto;\n}\n\n.modalFields {\n display: grid;\n gap: 12px;\n width: 100%;\n\n :global(.mzn-form-field--horizontal) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label-area) {\n flex: 0 0 120px;\n width: 120px;\n min-width: 120px;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label) {\n flex-wrap: nowrap;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__data-entry) {\n flex: 1 1 auto;\n align-items: stretch;\n min-width: 0;\n max-width: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-auto-complete) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-picker),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n\n :global(.mzn-select-trigger__input) {\n width: 100%;\n min-width: 0 !important;\n text-overflow: ellipsis;\n }\n}\n\n.tableIntro {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n min-width: 0;\n max-width: 100%;\n margin-bottom: 12px;\n}\n\n.tableIntro > div {\n min-width: 0;\n}\n\n.tableIntro > div > * {\n overflow-wrap: anywhere;\n}\n\n.tableFrame {\n width: 100%;\n min-width: 0;\n max-width: 100%;\n overflow-x: auto;\n}\n\n.orgFilterArea {\n margin-bottom: 12px;\n\n :global(.mzn-filter-line),\n :global(.mzn-filter-area__line) {\n flex-wrap: nowrap;\n }\n\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-form-field__label-area) {\n display: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n}\n\n.membershipFilterArea {\n overflow-x: auto;\n\n :global(.mzn-filter-line),\n :global(.mzn-filter-area__line) {\n align-items: center;\n flex-wrap: nowrap !important;\n min-width: 760px;\n }\n\n :global(.mzn-filter),\n :global(.mzn-filter-area__filter) {\n flex: 1 1 0;\n min-width: 0;\n }\n\n :global(.mzn-filter:nth-child(3)),\n :global(.mzn-filter-area__filter:nth-child(3)) {\n flex: 0 0 180px;\n }\n\n :global(.mzn-autocomplete) {\n width: 100%;\n min-width: 0;\n }\n}\n\n.scopeLabel {\n display: inline-flex;\n align-items: center;\n min-height: 24px;\n}\n\n@media (max-width: 960px) {\n .tableIntro {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .tableIntroActions {\n justify-content: flex-start;\n }\n\n .tableIntroActions {\n flex-wrap: wrap;\n }\n\n .orgFilterArea {\n :global(.mzn-filter-line),\n :global(.mzn-filter-area__line) {\n flex-wrap: wrap;\n }\n }\n\n .membershipFilterArea {\n :global(.mzn-filter-line),\n :global(.mzn-filter-area__line) {\n align-items: stretch;\n flex-wrap: nowrap !important;\n }\n\n :global(.mzn-form-field--horizontal) {\n align-items: center;\n }\n }\n}\n","'use client';\n\nimport {\n ChangeEvent,\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Button,\n DatePicker,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Layout,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\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 {\n CloseIcon,\n EditIcon,\n PlusIcon,\n SaveIcon,\n} from '@mezzanine-ui/icons';\nimport type { IconDefinition } from '@mezzanine-ui/icons';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport {\n MemberOption,\n OrgUnitPicker,\n OrgUnitOption,\n PositionOption,\n PositionPicker,\n MemberPicker,\n readMemberOption,\n readOrgUnitOption,\n readPositionOption,\n} from '../../../components/admin-pickers';\nimport {\n commitOrgUnitTreeDraft,\n createManagerResolution,\n createMembership,\n createOrgUnit,\n createPosition,\n deleteManagerResolution,\n deleteMembership,\n deleteOrgUnit,\n ManagerResolutionRecord,\n ManagerResolutionScopeType,\n MembershipRecord,\n OrgUnitRecord,\n OrgUnitType,\n PositionRecord,\n readOrganizationDashboard,\n updateManagerResolution,\n updateMembership,\n updateOrgUnit,\n updatePosition,\n} from '@rytass/bpm-core-client/organization';\nimport { MemberProfileRecord, resolveMembers } from '@rytass/bpm-core-client';\nimport {\n OrgUnitTreeDraftEditor,\n OrgUnitTreeDraftEditorHandle,\n OrgUnitTreeDraftEditorState,\n} from '../../../components/org-unit-tree-draft-editor';\nimport type { OrgUnitHierarchyDraftChange } from '../../../lib/org-tree-draft';\nimport styles from './orgs.module.scss';\nimport { AppNavigation } from '../../../components/app-navigation';\n\ntype AdminOrgTab = 'MANAGERS' | 'MEMBERSHIPS' | 'ORG_UNITS' | 'POSITIONS';\ntype OrgUnitViewMode = 'FLOW' | 'TABLE';\n\nconst INITIAL_ORG_TREE_EDITOR_STATE: OrgUnitTreeDraftEditorState = {\n hasDraftChanges: false,\n isEditing: false,\n};\n\ntype OrgUnitRow = Readonly<\n Record<string, unknown> &\n OrgUnitRecord & {\n key: string;\n parentName: string;\n typeLabel: string;\n }\n>;\n\ntype PositionRow = Readonly<\n Record<string, unknown> &\n PositionRecord & {\n key: string;\n }\n>;\n\ntype MembershipRow = Readonly<\n Record<string, unknown> &\n MembershipRecord & {\n key: string;\n memberName: string;\n orgUnitName: string;\n positionName: string;\n }\n>;\n\ntype ManagerResolutionRow = Readonly<\n Record<string, unknown> &\n ManagerResolutionRecord & {\n key: string;\n managerName: string;\n scopeLabel: string;\n }\n>;\n\ntype OrgModalState = Readonly<{\n parentId?: string | null;\n record: OrgUnitRecord | null;\n type: 'CREATE' | 'EDIT';\n}>;\n\ntype PositionModalState = Readonly<{\n record: PositionRecord | null;\n type: 'CREATE' | 'EDIT';\n}>;\n\ntype MembershipModalState = Readonly<{\n record: MembershipRecord | null;\n type: 'CREATE' | 'EDIT';\n}>;\n\ntype ManagerModalState = Readonly<{\n record: ManagerResolutionRecord | null;\n type: 'CREATE' | 'EDIT';\n}>;\n\ntype DeleteConfirmationState = Readonly<{\n confirmText: string;\n description: string;\n id: string;\n title: string;\n type: 'MANAGER_RESOLUTION' | 'MEMBERSHIP' | 'ORG_UNIT';\n}>;\n\ntype OrgUnitTypeOption = Readonly<{\n id: OrgUnitType;\n name: string;\n}>;\n\ntype OrgUnitTypeFilterOption = Readonly<{\n id: 'ALL' | OrgUnitType;\n name: string;\n}>;\n\ntype ScopeTypeOption = Readonly<{\n id: ManagerResolutionScopeType;\n name: string;\n}>;\n\ntype ScopeTypeFilterOption = Readonly<{\n id: 'ALL' | ManagerResolutionScopeType;\n name: string;\n}>;\n\ntype ActiveFilterOption = Readonly<{\n activeOnly: boolean;\n id: 'ACTIVE' | 'ALL';\n name: string;\n}>;\n\ntype PrimaryOption = Readonly<{\n id: 'false' | 'true';\n name: string;\n value: boolean;\n}>;\n\ntype TablePaginationState = Readonly<{\n onPageChange: (page: number) => void;\n onPageSizeChange: (pageSize: number) => void;\n page: number;\n pageSize: number;\n total: number;\n}>;\n\nconst ORG_UNIT_TYPES: readonly OrgUnitTypeOption[] = [\n { id: 'COMPANY', name: '公司' },\n { id: 'DIVISION', name: '事業群' },\n { id: 'DEPARTMENT', name: '部門' },\n { id: 'TEAM', name: '小組' },\n];\nconst ALL_ORG_UNIT_TYPE_FILTER: OrgUnitTypeFilterOption = {\n id: 'ALL',\n name: '全部類型',\n};\nconst ORG_UNIT_TYPE_FILTER_OPTIONS: readonly OrgUnitTypeFilterOption[] = [\n ALL_ORG_UNIT_TYPE_FILTER,\n ...ORG_UNIT_TYPES,\n];\n\nconst SCOPE_TYPES: readonly ScopeTypeOption[] = [\n { id: 'MEMBER', name: '指定會員' },\n { id: 'ORG_UNIT', name: '指定組織' },\n { id: 'POSITION', name: '指定職位' },\n];\nconst ALL_SCOPE_TYPE_FILTER: ScopeTypeFilterOption = {\n id: 'ALL',\n name: '全部範圍',\n};\nconst SCOPE_TYPE_FILTER_OPTIONS: readonly ScopeTypeFilterOption[] = [\n ALL_SCOPE_TYPE_FILTER,\n ...SCOPE_TYPES,\n];\nconst ALL_ACTIVE_FILTER: ActiveFilterOption = {\n activeOnly: false,\n id: 'ALL',\n name: '全部狀態',\n};\nconst ACTIVE_FILTER_OPTIONS: readonly ActiveFilterOption[] = [\n ALL_ACTIVE_FILTER,\n { activeOnly: true, id: 'ACTIVE', name: '目前有效' },\n];\n\nconst PRIMARY_OPTIONS: readonly PrimaryOption[] = [\n { id: 'true', name: '主要歸屬', value: true },\n { id: 'false', name: '一般歸屬', value: false },\n];\nconst ORGANIZATION_TABLE_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst ORG_UNIT_TABLE_MIN_WIDTH = 1368;\nconst POSITION_TABLE_MIN_WIDTH = 908;\nconst MEMBERSHIP_TABLE_MIN_WIDTH = 1292;\nconst MANAGER_TABLE_MIN_WIDTH = 1124;\n\nexport interface AdminOrgsViewProps {\n readonly activeHref?: string;\n}\n\nexport function AdminOrgsView({\n activeHref = '/admin/orgs',\n}: AdminOrgsViewProps = {}): ReactElement {\n const [activeTab, setActiveTab] = useState<AdminOrgTab>('ORG_UNITS');\n const [deleteConfirmation, setDeleteConfirmation] =\n useState<DeleteConfirmationState | null>(null);\n const [lastDeleteConfirmation, setLastDeleteConfirmation] =\n useState<DeleteConfirmationState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [managerModal, setManagerModal] = useState<ManagerModalState | null>(\n null,\n );\n const [managerActiveFilter, setManagerActiveFilter] =\n useState<ActiveFilterOption>(ALL_ACTIVE_FILTER);\n const [managerPage, setManagerPage] = useState(1);\n const [managerPageSize, setManagerPageSize] = useState(10);\n const [managerScopeTypeFilter, setManagerScopeTypeFilter] =\n useState<ScopeTypeFilterOption>(ALL_SCOPE_TYPE_FILTER);\n const [managerTotalCount, setManagerTotalCount] = useState(0);\n const [memberProfiles, setMemberProfiles] = useState<\n readonly MemberProfileRecord[]\n >([]);\n const [membershipActiveFilter, setMembershipActiveFilter] =\n useState<ActiveFilterOption | null>(null);\n const [membershipModal, setMembershipModal] =\n useState<MembershipModalState | null>(null);\n const [membershipOrgUnitFilter, setMembershipOrgUnitFilter] =\n useState<OrgUnitOption | null>(null);\n const [membershipPage, setMembershipPage] = useState(1);\n const [membershipPageSize, setMembershipPageSize] = useState(10);\n const [membershipPositionFilter, setMembershipPositionFilter] =\n useState<PositionOption | null>(null);\n const [membershipTotalCount, setMembershipTotalCount] = useState(0);\n const [orgModal, setOrgModal] = useState<OrgModalState | null>(null);\n const [orgUnitPage, setOrgUnitPage] = useState(1);\n const [orgUnitPageSize, setOrgUnitPageSize] = useState(10);\n const [orgUnitSearchText, setOrgUnitSearchText] = useState('');\n const [orgUnitTotalCount, setOrgUnitTotalCount] = useState(0);\n const [orgUnitTypeFilter, setOrgUnitTypeFilter] =\n useState<OrgUnitTypeFilterOption>(ALL_ORG_UNIT_TYPE_FILTER);\n const [orgUnitViewMode, setOrgUnitViewMode] =\n useState<OrgUnitViewMode>('TABLE');\n const [orgUnits, setOrgUnits] = useState<readonly OrgUnitRecord[]>([]);\n const [visibleOrgUnits, setVisibleOrgUnits] = useState<\n readonly OrgUnitRecord[]\n >([]);\n const [visiblePositions, setVisiblePositions] = useState<\n readonly PositionRecord[]\n >([]);\n const [positionModal, setPositionModal] = useState<PositionModalState | null>(\n null,\n );\n const [positionPage, setPositionPage] = useState(1);\n const [positionPageSize, setPositionPageSize] = useState(10);\n const [positionSearchText, setPositionSearchText] = useState('');\n const [positionTotalCount, setPositionTotalCount] = useState(0);\n const [positions, setPositions] = useState<readonly PositionRecord[]>([]);\n const [visibleManagerResolutions, setVisibleManagerResolutions] = useState<\n readonly ManagerResolutionRecord[]\n >([]);\n const [visibleMemberships, setVisibleMemberships] = useState<\n readonly MembershipRecord[]\n >([]);\n const [saving, setSaving] = useState(false);\n\n useEffect((): void => {\n if (deleteConfirmation) {\n setLastDeleteConfirmation(deleteConfirmation);\n }\n }, [deleteConfirmation]);\n\n const visibleDeleteConfirmation =\n deleteConfirmation ?? lastDeleteConfirmation;\n\n const refreshOrganization = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const dashboard = await readOrganizationDashboard({\n managerActiveOnly: managerActiveFilter.activeOnly,\n managerPage,\n managerPageSize,\n managerScopeType:\n managerScopeTypeFilter.id === 'ALL'\n ? null\n : managerScopeTypeFilter.id,\n membershipActiveOnly: membershipActiveFilter?.activeOnly ?? false,\n membershipOrgUnitId: membershipOrgUnitFilter?.id ?? null,\n membershipPage,\n membershipPageSize,\n membershipPositionId: membershipPositionFilter?.id ?? null,\n orgUnitPage,\n orgUnitPageSize,\n orgUnitSearchText,\n orgUnitType:\n orgUnitTypeFilter.id === 'ALL' ? null : orgUnitTypeFilter.id,\n positionPage,\n positionPageSize,\n positionSearchText,\n });\n const memberIds = readReferencedMemberIds(\n dashboard.memberships,\n dashboard.managerResolutions,\n );\n const profiles = await resolveMembers(memberIds);\n\n setMemberProfiles(profiles);\n setOrgUnits(dashboard.orgUnits);\n setOrgUnitTotalCount(dashboard.orgUnitCount);\n setVisibleOrgUnits(dashboard.filteredOrgUnits);\n setPositions(dashboard.positions);\n setPositionTotalCount(dashboard.positionCount);\n setVisiblePositions(dashboard.filteredPositions);\n setMembershipTotalCount(dashboard.membershipCount);\n setVisibleMemberships(dashboard.filteredMemberships);\n setManagerTotalCount(dashboard.managerResolutionCount);\n setVisibleManagerResolutions(dashboard.filteredManagerResolutions);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [\n managerActiveFilter,\n managerPage,\n managerPageSize,\n managerScopeTypeFilter,\n membershipActiveFilter,\n membershipOrgUnitFilter,\n membershipPage,\n membershipPageSize,\n membershipPositionFilter,\n orgUnitPage,\n orgUnitPageSize,\n orgUnitSearchText,\n orgUnitTypeFilter,\n positionPage,\n positionPageSize,\n positionSearchText,\n ]);\n\n useEffect((): void => {\n void refreshOrganization();\n }, [refreshOrganization]);\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 const membersById = useMemo(\n (): ReadonlyMap<string, MemberProfileRecord> =>\n new Map(memberProfiles.map((member) => [member.memberId, member])),\n [memberProfiles],\n );\n\n const orgRows = useMemo(\n (): OrgUnitRow[] =>\n visibleOrgUnits.map((orgUnit) => ({\n ...orgUnit,\n key: orgUnit.id,\n parentName: orgUnit.parentId\n ? readOrgUnitLabel(orgUnitsById.get(orgUnit.parentId))\n : '根節點',\n typeLabel: readOrgUnitTypeLabel(orgUnit.type),\n })),\n [visibleOrgUnits, orgUnitsById],\n );\n const positionRows = useMemo(\n (): PositionRow[] =>\n visiblePositions.map((position) => ({\n ...position,\n key: position.id,\n })),\n [visiblePositions],\n );\n const membershipRows = useMemo(\n (): MembershipRow[] =>\n visibleMemberships.map((membership) => ({\n ...membership,\n key: membership.id,\n memberName: readMemberLabel(membersById.get(membership.memberId)),\n orgUnitName: readOrgUnitLabel(orgUnitsById.get(membership.orgUnitId)),\n positionName: membership.positionId\n ? readPositionLabel(positionsById.get(membership.positionId))\n : '未指定',\n })),\n [membersById, visibleMemberships, orgUnitsById, positionsById],\n );\n const managerRows = useMemo(\n (): ManagerResolutionRow[] =>\n visibleManagerResolutions.map((resolution) => ({\n ...resolution,\n key: resolution.id,\n managerName: readMemberLabel(\n membersById.get(resolution.managerMemberId),\n ),\n scopeLabel: readScopeLabel(resolution, {\n membersById,\n orgUnitsById,\n positionsById,\n }),\n })),\n [visibleManagerResolutions, membersById, orgUnitsById, positionsById],\n );\n\n const orgActions = useMemo(\n (): TableActions<OrgUnitRow> => ({\n render: (record): ReturnType<TableActions<OrgUnitRow>['render']> => [\n {\n name: '編輯',\n onClick: (): void => setOrgModal({ record, type: 'EDIT' }),\n },\n {\n name: '停用',\n onClick: (): void =>\n setDeleteConfirmation({\n confirmText: '停用組織',\n description: `停用「${record.name}」後,這個組織節點將不再出現在可用組織清單中。`,\n id: record.id,\n title: '停用組織節點',\n type: 'ORG_UNIT',\n }),\n variant: 'destructive-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 128,\n }),\n [],\n );\n const positionActions = useMemo(\n (): TableActions<PositionRow> => ({\n render: (record): ReturnType<TableActions<PositionRow>['render']> => [\n {\n name: '編輯',\n onClick: (): void => setPositionModal({ record, type: 'EDIT' }),\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [],\n );\n const membershipActions = useMemo(\n (): TableActions<MembershipRow> => ({\n render: (record): ReturnType<TableActions<MembershipRow>['render']> => [\n {\n name: '編輯',\n onClick: (): void => setMembershipModal({ record, type: 'EDIT' }),\n },\n {\n name: '刪除',\n onClick: (): void =>\n setDeleteConfirmation({\n confirmText: '刪除歸屬',\n description: `刪除「${record.memberName}」在「${record.orgUnitName}」的會員歸屬。`,\n id: record.id,\n title: '刪除會員歸屬',\n type: 'MEMBERSHIP',\n }),\n variant: 'destructive-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 128,\n }),\n [],\n );\n const managerActions = useMemo(\n (): TableActions<ManagerResolutionRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<ManagerResolutionRow>['render']> => [\n {\n name: '編輯',\n onClick: (): void => setManagerModal({ record, type: 'EDIT' }),\n },\n {\n name: '刪除',\n onClick: (): void =>\n setDeleteConfirmation({\n confirmText: '刪除主管規則',\n description: `刪除「${record.scopeLabel}」指派給「${record.managerName}」的主管解析規則。`,\n id: record.id,\n title: '刪除主管解析規則',\n type: 'MANAGER_RESOLUTION',\n }),\n variant: 'destructive-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 128,\n }),\n [],\n );\n\n function updateOrgUnitSearchText(value: string): void {\n setOrgUnitPage(1);\n setOrgUnitSearchText(value);\n }\n\n function updateOrgUnitTypeFilter(value: OrgUnitTypeFilterOption): void {\n setOrgUnitPage(1);\n setOrgUnitTypeFilter(value);\n }\n\n function updatePositionSearchText(value: string): void {\n setPositionPage(1);\n setPositionSearchText(value);\n }\n\n function updateMembershipActiveFilter(value: ActiveFilterOption | null): void {\n setMembershipPage(1);\n setMembershipActiveFilter(value);\n }\n\n function updateMembershipOrgUnitFilter(value: OrgUnitOption | null): void {\n setMembershipPage(1);\n setMembershipOrgUnitFilter(value);\n }\n\n function updateMembershipPositionFilter(value: PositionOption | null): void {\n setMembershipPage(1);\n setMembershipPositionFilter(value);\n }\n\n function updateManagerActiveFilter(value: ActiveFilterOption): void {\n setManagerPage(1);\n setManagerActiveFilter(value);\n }\n\n function updateManagerScopeTypeFilter(value: ScopeTypeFilterOption): void {\n setManagerPage(1);\n setManagerScopeTypeFilter(value);\n }\n\n function closeDeleteConfirmation(): void {\n if (saving) {\n return;\n }\n\n setDeleteConfirmation(null);\n }\n\n async function handleConfirmDelete(): Promise<void> {\n if (!deleteConfirmation) {\n return;\n }\n\n await runMutation(async (): Promise<void> => {\n if (deleteConfirmation.type === 'ORG_UNIT') {\n await deleteOrgUnit(deleteConfirmation.id);\n }\n\n if (deleteConfirmation.type === 'MEMBERSHIP') {\n await deleteMembership(deleteConfirmation.id);\n }\n\n if (deleteConfirmation.type === 'MANAGER_RESOLUTION') {\n await deleteManagerResolution(deleteConfirmation.id);\n }\n\n setDeleteConfirmation(null);\n });\n }\n\n async function saveOrgUnitTreeDraft(\n changes: readonly OrgUnitHierarchyDraftChange[],\n ): Promise<void> {\n setSaving(true);\n setError(null);\n\n try {\n await commitOrgUnitTreeDraft({\n moves: changes.map((change) => {\n const orgUnit = orgUnitsById.get(change.orgUnitId);\n\n return {\n baseUpdatedAt: orgUnit?.updatedAt ?? '',\n id: change.orgUnitId,\n parentId: change.parentId,\n };\n }),\n });\n await refreshOrganization();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n throw requestError;\n } finally {\n setSaving(false);\n }\n }\n\n async function runMutation(mutation: () => Promise<void>): Promise<void> {\n setSaving(true);\n setError(null);\n\n try {\n await mutation();\n await refreshOrganization();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Layout>\n <AppNavigation activeHref={activeHref} />\n\n <Layout.Main>\n <PageHeader>\n <ContentHeader\n description=\"維護組織樹、職位、會員歸屬與簽核主管解析規則。\"\n title=\"組織管理\"\n />\n </PageHeader>\n\n <SectionGroup>\n <Section\n tab={\n <Tab\n activeKey={activeTab}\n onChange={(key): void => setActiveTab(readAdminOrgTab(key))}\n >\n <TabItem key=\"ORG_UNITS\">組織樹</TabItem>\n <TabItem key=\"POSITIONS\">職位</TabItem>\n <TabItem key=\"MEMBERSHIPS\">會員歸屬</TabItem>\n <TabItem key=\"MANAGERS\">簽核主管</TabItem>\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n {activeTab === 'ORG_UNITS' ? (\n <OrgUnitPanel\n actions={orgActions}\n loading={loading}\n onCreate={(): void =>\n setOrgModal({ parentId: null, record: null, type: 'CREATE' })\n }\n onCreateChild={(parentId): void =>\n setOrgModal({ parentId, record: null, type: 'CREATE' })\n }\n onEditOrgUnit={(record): void =>\n setOrgModal({ record, type: 'EDIT' })\n }\n onPageChange={setOrgUnitPage}\n onSaveDraft={saveOrgUnitTreeDraft}\n onPageSizeChange={(pageSize): void => {\n setOrgUnitPage(1);\n setOrgUnitPageSize(pageSize);\n }}\n onSearchTextChange={updateOrgUnitSearchText}\n onTypeFilterChange={updateOrgUnitTypeFilter}\n orgUnits={orgUnits}\n page={orgUnitPage}\n pageSize={orgUnitPageSize}\n rows={orgRows}\n searchText={orgUnitSearchText}\n saving={saving}\n total={orgUnitTotalCount}\n typeFilter={orgUnitTypeFilter}\n viewMode={orgUnitViewMode}\n onViewModeChange={setOrgUnitViewMode}\n />\n ) : null}\n {activeTab === 'POSITIONS' ? (\n <PositionPanel\n actions={positionActions}\n loading={loading}\n onCreate={(): void =>\n setPositionModal({ record: null, type: 'CREATE' })\n }\n onPageChange={setPositionPage}\n onPageSizeChange={(pageSize): void => {\n setPositionPage(1);\n setPositionPageSize(pageSize);\n }}\n onSearchTextChange={updatePositionSearchText}\n page={positionPage}\n pageSize={positionPageSize}\n rows={positionRows}\n searchText={positionSearchText}\n total={positionTotalCount}\n />\n ) : null}\n {activeTab === 'MEMBERSHIPS' ? (\n <MembershipPanel\n actions={membershipActions}\n loading={loading}\n onCreate={(): void =>\n setMembershipModal({ record: null, type: 'CREATE' })\n }\n onActiveFilterChange={updateMembershipActiveFilter}\n onOrgUnitFilterChange={updateMembershipOrgUnitFilter}\n onPageChange={setMembershipPage}\n onPageSizeChange={(pageSize): void => {\n setMembershipPage(1);\n setMembershipPageSize(pageSize);\n }}\n onPositionFilterChange={updateMembershipPositionFilter}\n orgUnitFilter={membershipOrgUnitFilter}\n orgUnits={orgUnits}\n page={membershipPage}\n pageSize={membershipPageSize}\n positionFilter={membershipPositionFilter}\n positions={positions}\n rows={membershipRows}\n statusFilter={membershipActiveFilter}\n total={membershipTotalCount}\n />\n ) : null}\n {activeTab === 'MANAGERS' ? (\n <ManagerPanel\n actions={managerActions}\n loading={loading}\n onCreate={(): void =>\n setManagerModal({ record: null, type: 'CREATE' })\n }\n onActiveFilterChange={updateManagerActiveFilter}\n onPageChange={setManagerPage}\n onPageSizeChange={(pageSize): void => {\n setManagerPage(1);\n setManagerPageSize(pageSize);\n }}\n onScopeTypeFilterChange={updateManagerScopeTypeFilter}\n page={managerPage}\n pageSize={managerPageSize}\n rows={managerRows}\n scopeTypeFilter={managerScopeTypeFilter}\n statusFilter={managerActiveFilter}\n total={managerTotalCount}\n />\n ) : null}\n </Section>\n </SectionGroup>\n\n <OrgUnitModal\n modal={orgModal}\n onClose={(): void => setOrgModal(null)}\n onSubmit={(input): Promise<void> =>\n runMutation(async (): Promise<void> => {\n if (orgModal?.type === 'EDIT' && orgModal.record) {\n await updateOrgUnit({\n ...input,\n id: orgModal.record.id,\n metadataJson: null,\n });\n } else {\n await createOrgUnit({\n code: input.code ?? '',\n metadataJson: '{}',\n name: input.name ?? '',\n parentId: input.parentId,\n type: input.type ?? 'DEPARTMENT',\n });\n }\n setOrgModal(null);\n })\n }\n orgUnits={orgUnits}\n saving={saving}\n />\n <PositionModal\n modal={positionModal}\n onClose={(): void => setPositionModal(null)}\n onSubmit={(input): Promise<void> =>\n runMutation(async (): Promise<void> => {\n if (positionModal?.type === 'EDIT' && positionModal.record) {\n await updatePosition({\n ...input,\n id: positionModal.record.id,\n metadataJson: null,\n });\n } else {\n await createPosition({\n code: input.code ?? '',\n level: input.level ?? 0,\n metadataJson: '{}',\n name: input.name ?? '',\n });\n }\n setPositionModal(null);\n })\n }\n saving={saving}\n />\n <MembershipModal\n membersById={membersById}\n modal={membershipModal}\n onClose={(): void => setMembershipModal(null)}\n onSubmit={(input): Promise<void> =>\n runMutation(async (): Promise<void> => {\n if (membershipModal?.type === 'EDIT' && membershipModal.record) {\n await updateMembership({\n ...input,\n id: membershipModal.record.id,\n });\n } else {\n await createMembership({\n effectiveFrom: input.effectiveFrom ?? today(),\n effectiveTo: input.effectiveTo,\n isPrimary: input.isPrimary ?? false,\n memberId: input.memberId ?? '',\n orgUnitId: input.orgUnitId ?? '',\n positionId: input.positionId,\n });\n }\n setMembershipModal(null);\n })\n }\n orgUnits={orgUnits}\n positions={positions}\n saving={saving}\n />\n <ManagerResolutionModal\n membersById={membersById}\n modal={managerModal}\n onClose={(): void => setManagerModal(null)}\n onSubmit={(input): Promise<void> =>\n runMutation(async (): Promise<void> => {\n if (managerModal?.type === 'EDIT' && managerModal.record) {\n await updateManagerResolution({\n ...input,\n id: managerModal.record.id,\n });\n } else {\n await createManagerResolution({\n effectiveFrom: input.effectiveFrom ?? today(),\n effectiveTo: input.effectiveTo,\n managerMemberId: input.managerMemberId ?? '',\n priority: input.priority ?? 0,\n scopeId: input.scopeId ?? '',\n scopeType: input.scopeType ?? 'MEMBER',\n });\n }\n setManagerModal(null);\n })\n }\n orgUnits={orgUnits}\n positions={positions}\n saving={saving}\n />\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{ variant: 'destructive-primary' }}\n confirmText={visibleDeleteConfirmation?.confirmText ?? ''}\n loading={saving}\n modalStatusType=\"error\"\n modalType=\"standard\"\n onCancel={closeDeleteConfirmation}\n onClose={closeDeleteConfirmation}\n onConfirm={(): void => void handleConfirmDelete()}\n open={Boolean(deleteConfirmation)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"此操作會立即套用,請確認後再繼續。\"\n title={visibleDeleteConfirmation?.title ?? ''}\n >\n <Typography color=\"text-neutral\" variant=\"body\">\n {visibleDeleteConfirmation?.description ?? ''}\n </Typography>\n </Modal>\n </Layout.Main>\n </Layout>\n );\n}\n\nfunction OrgUnitPanel({\n actions,\n loading,\n onCreate,\n onCreateChild,\n onEditOrgUnit,\n onPageChange,\n onSaveDraft,\n onPageSizeChange,\n onSearchTextChange,\n onTypeFilterChange,\n onViewModeChange,\n orgUnits,\n page,\n pageSize,\n rows,\n searchText,\n saving,\n total,\n typeFilter,\n viewMode,\n}: {\n readonly actions: TableActions<OrgUnitRow>;\n readonly loading: boolean;\n readonly onCreate: () => void;\n readonly onCreateChild: (parentId: string) => void;\n readonly onEditOrgUnit: (record: OrgUnitRecord) => void;\n readonly onPageChange: (page: number) => void;\n readonly onSaveDraft: (\n changes: readonly OrgUnitHierarchyDraftChange[],\n ) => Promise<void>;\n readonly onPageSizeChange: (pageSize: number) => void;\n readonly onSearchTextChange: (value: string) => void;\n readonly onTypeFilterChange: (value: OrgUnitTypeFilterOption) => void;\n readonly onViewModeChange: (mode: OrgUnitViewMode) => void;\n readonly orgUnits: readonly OrgUnitRecord[];\n readonly page: number;\n readonly pageSize: number;\n readonly rows: readonly OrgUnitRow[];\n readonly searchText: string;\n readonly saving: boolean;\n readonly total: number;\n readonly typeFilter: OrgUnitTypeFilterOption;\n readonly viewMode: OrgUnitViewMode;\n}): ReactElement {\n const treeEditorRef = useRef<OrgUnitTreeDraftEditorHandle | null>(null);\n const [treeEditorState, setTreeEditorState] =\n useState<OrgUnitTreeDraftEditorState>(INITIAL_ORG_TREE_EDITOR_STATE);\n const nextViewMode: OrgUnitViewMode = viewMode === 'TABLE' ? 'FLOW' : 'TABLE';\n const viewModeToggleLabel = viewMode === 'TABLE' ? '切換樹狀圖' : '切換表格';\n const isTreeMode = viewMode === 'FLOW';\n const primaryActionLabel = readOrgUnitPrimaryActionLabel({\n isTreeMode,\n isTreeEditing: treeEditorState.isEditing,\n });\n const primaryActionIcon = readOrgUnitPrimaryActionIcon({\n isTreeMode,\n isTreeEditing: treeEditorState.isEditing,\n });\n const primaryActionDisabled = readOrgUnitPrimaryActionDisabled({\n hasDraftChanges: treeEditorState.hasDraftChanges,\n isTreeEditing: treeEditorState.isEditing,\n isTreeMode,\n loading,\n saving,\n });\n const columns = useMemo(\n (): TableColumn<OrgUnitRow>[] => [\n { dataIndex: 'code', key: 'code', title: '代碼', width: 180 },\n { dataIndex: 'name', key: 'name', title: '名稱', width: 240 },\n { dataIndex: 'typeLabel', key: 'typeLabel', title: '類型', width: 120 },\n { dataIndex: 'parentName', key: 'parentName', title: '上層', width: 280 },\n { dataIndex: 'path', key: 'path', title: 'Path', width: 420 },\n ],\n [],\n );\n\n useEffect((): void => {\n if (viewMode === 'TABLE') {\n setTreeEditorState(INITIAL_ORG_TREE_EDITOR_STATE);\n }\n }, [viewMode]);\n\n return (\n <>\n <PanelIntro\n actionDisabled={primaryActionDisabled}\n actionIcon={primaryActionIcon}\n actionLabel={primaryActionLabel}\n actions={\n <>\n <Button\n onClick={(): void => onViewModeChange(nextViewMode)}\n variant=\"base-secondary\"\n >\n {viewModeToggleLabel}\n </Button>\n {isTreeMode && treeEditorState.isEditing ? (\n <Button\n disabled={saving}\n icon={CloseIcon}\n iconType=\"leading\"\n onClick={(): void => treeEditorRef.current?.cancelEditing()}\n variant=\"base-secondary\"\n >\n 取消\n </Button>\n ) : null}\n </>\n }\n description=\"組織節點使用 ltree path 維護階層,搬移節點會同步更新子節點 path。\"\n onCreate={(): void => {\n if (!isTreeMode) {\n onCreate();\n return;\n }\n\n if (treeEditorState.isEditing) {\n void treeEditorRef.current?.saveDraft();\n return;\n }\n\n treeEditorRef.current?.startEditing();\n }}\n title=\"組織樹\"\n />\n {viewMode === 'TABLE' ? (\n <>\n <FilterArea className={styles.orgFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"orgUnitSearchText\"\n >\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onSearchTextChange(event.target.value)\n }\n placeholder=\"搜尋組織名稱或代碼\"\n size=\"sub\"\n value={searchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"orgUnitTypeFilter\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n onTypeFilterChange(readOrgUnitTypeFilterOption(option))\n }\n options={[...ORG_UNIT_TYPE_FILTER_OPTIONS]}\n placeholder=\"類型\"\n size=\"sub\"\n value={typeFilter}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n <div className={styles.tableFrame}>\n <Table\n actions={actions}\n columns={columns}\n dataSource={[...rows]}\n fullWidth\n loading={loading}\n pagination={createTablePagination({\n onPageChange,\n onPageSizeChange,\n page,\n pageSize,\n total,\n })}\n style={{ minWidth: ORG_UNIT_TABLE_MIN_WIDTH }}\n />\n </div>\n </>\n ) : (\n <OrgUnitTreeDraftEditor\n ref={treeEditorRef}\n onCreateChild={onCreateChild}\n onCreateRoot={onCreate}\n onEditOrgUnit={onEditOrgUnit}\n onSaveDraft={onSaveDraft}\n onStateChange={setTreeEditorState}\n orgUnits={orgUnits}\n saving={saving}\n />\n )}\n </>\n );\n}\n\nfunction PositionPanel({\n actions,\n loading,\n onCreate,\n onPageChange,\n onPageSizeChange,\n onSearchTextChange,\n page,\n pageSize,\n rows,\n searchText,\n total,\n}: {\n readonly actions: TableActions<PositionRow>;\n readonly loading: boolean;\n readonly onCreate: () => void;\n readonly onPageChange: (page: number) => void;\n readonly onPageSizeChange: (pageSize: number) => void;\n readonly onSearchTextChange: (value: string) => void;\n readonly page: number;\n readonly pageSize: number;\n readonly rows: readonly PositionRow[];\n readonly searchText: string;\n readonly total: number;\n}): ReactElement {\n const columns = useMemo(\n (): TableColumn<PositionRow>[] => [\n { dataIndex: 'code', key: 'code', title: '代碼', width: 180 },\n { dataIndex: 'name', key: 'name', title: '名稱', width: 280 },\n { dataIndex: 'level', key: 'level', title: '職等', width: 96 },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n\n return (\n <>\n <PanelIntro\n actionLabel=\"新增職位\"\n description=\"職位提供會員歸屬與主管解析規則使用。\"\n onCreate={onCreate}\n title=\"職位\"\n />\n <FilterArea className={styles.orgFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"positionSearchText\"\n >\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onSearchTextChange(event.target.value)\n }\n placeholder=\"搜尋職位名稱或代碼\"\n size=\"sub\"\n value={searchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n <div className={styles.tableFrame}>\n <Table\n actions={actions}\n columns={columns}\n dataSource={[...rows]}\n fullWidth\n loading={loading}\n pagination={createTablePagination({\n onPageChange,\n onPageSizeChange,\n page,\n pageSize,\n total,\n })}\n style={{ minWidth: POSITION_TABLE_MIN_WIDTH }}\n />\n </div>\n </>\n );\n}\n\nfunction MembershipPanel({\n actions,\n loading,\n onCreate,\n onActiveFilterChange,\n onOrgUnitFilterChange,\n onPageChange,\n onPageSizeChange,\n onPositionFilterChange,\n orgUnitFilter,\n orgUnits,\n page,\n pageSize,\n positionFilter,\n positions,\n rows,\n statusFilter,\n total,\n}: {\n readonly actions: TableActions<MembershipRow>;\n readonly loading: boolean;\n readonly onCreate: () => void;\n readonly onActiveFilterChange: (value: ActiveFilterOption | null) => void;\n readonly onOrgUnitFilterChange: (value: OrgUnitOption | null) => void;\n readonly onPageChange: (page: number) => void;\n readonly onPageSizeChange: (pageSize: number) => void;\n readonly onPositionFilterChange: (value: PositionOption | null) => void;\n readonly orgUnitFilter: OrgUnitOption | null;\n readonly orgUnits: readonly OrgUnitRecord[];\n readonly page: number;\n readonly pageSize: number;\n readonly positionFilter: PositionOption | null;\n readonly positions: readonly PositionRecord[];\n readonly rows: readonly MembershipRow[];\n readonly statusFilter: ActiveFilterOption | null;\n readonly total: number;\n}): ReactElement {\n const columns = useMemo(\n (): TableColumn<MembershipRow>[] => [\n { dataIndex: 'memberName', key: 'memberName', title: '會員', width: 280 },\n {\n dataIndex: 'orgUnitName',\n key: 'orgUnitName',\n title: '組織',\n width: 280,\n },\n {\n dataIndex: 'positionName',\n key: 'positionName',\n title: '職位',\n width: 220,\n },\n {\n key: 'isPrimary',\n render: (record: MembershipRow): string =>\n record.isPrimary ? '主要' : '一般',\n title: '類型',\n width: 104,\n },\n {\n dataIndex: 'effectiveFrom',\n key: 'effectiveFrom',\n title: '生效日',\n width: 140,\n },\n {\n dataIndex: 'effectiveTo',\n key: 'effectiveTo',\n title: '結束日',\n width: 140,\n },\n ],\n [],\n );\n const orgUnitOptions = useMemo(\n (): readonly OrgUnitOption[] => orgUnits.map(readOrgUnitOption),\n [orgUnits],\n );\n const positionOptions = useMemo(\n (): readonly PositionOption[] => positions.map(readPositionOption),\n [positions],\n );\n\n return (\n <>\n <PanelIntro\n actionLabel=\"新增歸屬\"\n description=\"會員歸屬是 BPM 內部組織權限、主管解析與條件判斷的來源。\"\n onCreate={onCreate}\n title=\"會員歸屬\"\n />\n <FilterArea\n className={[styles.orgFilterArea, styles.membershipFilterArea].join(\n ' ',\n )}\n size=\"sub\"\n >\n <FilterLine>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"membershipOrgUnitFilter\"\n >\n <AutoComplete\n disabledOptionsFilter\n emptyText=\"沒有符合的組織\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'membershipOrgUnitFilter',\n spellCheck: false,\n }}\n mode=\"single\"\n name=\"membershipOrgUnitFilter\"\n onChange={(option): void =>\n onOrgUnitFilterChange(readOrgUnitOptionFromValue(option))\n }\n options={[...orgUnitOptions]}\n placeholder=\"全部組織\"\n size=\"sub\"\n value={orgUnitFilter}\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"membershipPositionFilter\"\n >\n <AutoComplete\n disabledOptionsFilter\n emptyText=\"沒有符合的職位\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'membershipPositionFilter',\n spellCheck: false,\n }}\n mode=\"single\"\n name=\"membershipPositionFilter\"\n onChange={(option): void =>\n onPositionFilterChange(readPositionOptionFromValue(option))\n }\n options={[...positionOptions]}\n placeholder=\"全部職位\"\n size=\"sub\"\n value={positionFilter}\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"membershipStatusFilter\"\n >\n <AutoComplete\n disabledOptionsFilter\n emptyText=\"沒有符合的狀態\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'membershipStatusFilter',\n spellCheck: false,\n }}\n mode=\"single\"\n name=\"membershipStatusFilter\"\n onChange={(option): void =>\n onActiveFilterChange(readNullableActiveFilterOption(option))\n }\n options={[...ACTIVE_FILTER_OPTIONS]}\n placeholder=\"全部狀態\"\n size=\"sub\"\n value={statusFilter}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n <div className={styles.tableFrame}>\n <Table\n actions={actions}\n columns={columns}\n dataSource={[...rows]}\n fullWidth\n loading={loading}\n pagination={createTablePagination({\n onPageChange,\n onPageSizeChange,\n page,\n pageSize,\n total,\n })}\n style={{ minWidth: MEMBERSHIP_TABLE_MIN_WIDTH }}\n />\n </div>\n </>\n );\n}\n\nfunction ManagerPanel({\n actions,\n loading,\n onCreate,\n onActiveFilterChange,\n onPageChange,\n onPageSizeChange,\n onScopeTypeFilterChange,\n page,\n pageSize,\n rows,\n scopeTypeFilter,\n statusFilter,\n total,\n}: {\n readonly actions: TableActions<ManagerResolutionRow>;\n readonly loading: boolean;\n readonly onCreate: () => void;\n readonly onActiveFilterChange: (value: ActiveFilterOption) => void;\n readonly onPageChange: (page: number) => void;\n readonly onPageSizeChange: (pageSize: number) => void;\n readonly onScopeTypeFilterChange: (value: ScopeTypeFilterOption) => void;\n readonly page: number;\n readonly pageSize: number;\n readonly rows: readonly ManagerResolutionRow[];\n readonly scopeTypeFilter: ScopeTypeFilterOption;\n readonly statusFilter: ActiveFilterOption;\n readonly total: number;\n}): ReactElement {\n const columns = useMemo(\n (): TableColumn<ManagerResolutionRow>[] => [\n {\n dataIndex: 'scopeLabel',\n key: 'scopeLabel',\n title: '套用範圍',\n width: 320,\n },\n {\n dataIndex: 'managerName',\n key: 'managerName',\n title: '簽核主管',\n width: 300,\n },\n { dataIndex: 'priority', key: 'priority', title: '優先序', width: 96 },\n {\n dataIndex: 'effectiveFrom',\n key: 'effectiveFrom',\n title: '生效日',\n width: 140,\n },\n {\n dataIndex: 'effectiveTo',\n key: 'effectiveTo',\n title: '結束日',\n width: 140,\n },\n ],\n [],\n );\n\n return (\n <>\n <PanelIntro\n actionLabel=\"新增主管規則\"\n description=\"簽核主管規則獨立於組織樹 parent,解析優先序為會員、組織、職位。\"\n onCreate={onCreate}\n title=\"簽核主管\"\n />\n <FilterArea className={styles.orgFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"managerScopeTypeFilter\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n onScopeTypeFilterChange(readScopeTypeFilterOption(option))\n }\n options={[...SCOPE_TYPE_FILTER_OPTIONS]}\n placeholder=\"套用範圍\"\n size=\"sub\"\n value={scopeTypeFilter}\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"managerStatusFilter\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n onActiveFilterChange(readActiveFilterOption(option))\n }\n options={[...ACTIVE_FILTER_OPTIONS]}\n placeholder=\"狀態\"\n size=\"sub\"\n value={statusFilter}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n <div className={styles.tableFrame}>\n <Table\n actions={actions}\n columns={columns}\n dataSource={[...rows]}\n fullWidth\n loading={loading}\n pagination={createTablePagination({\n onPageChange,\n onPageSizeChange,\n page,\n pageSize,\n total,\n })}\n style={{ minWidth: MANAGER_TABLE_MIN_WIDTH }}\n />\n </div>\n </>\n );\n}\n\nfunction createTablePagination({\n onPageChange,\n onPageSizeChange,\n page,\n pageSize,\n total,\n}: TablePaginationState): {\n current: number;\n onChange: (page: number) => void;\n onChangePageSize: (pageSize: number) => void;\n pageSize: number;\n pageSizeLabel: string;\n pageSizeOptions: number[];\n renderResultSummary: (from: number, to: number, total: number) => string;\n showPageSizeOptions: true;\n total: number;\n} {\n return {\n current: page,\n onChange: onPageChange,\n onChangePageSize: onPageSizeChange,\n pageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: [...ORGANIZATION_TABLE_PAGE_SIZE_OPTIONS],\n renderResultSummary: (from, to, resultTotal): string =>\n `顯示 ${from}-${to} 筆,共 ${resultTotal} 筆`,\n showPageSizeOptions: true,\n total,\n };\n}\n\nfunction readOrgUnitPrimaryActionLabel({\n isTreeEditing,\n isTreeMode,\n}: {\n readonly isTreeEditing: boolean;\n readonly isTreeMode: boolean;\n}): string {\n if (!isTreeMode) {\n return '新增組織';\n }\n\n return isTreeEditing ? '儲存' : '開始編輯';\n}\n\nfunction readOrgUnitPrimaryActionIcon({\n isTreeEditing,\n isTreeMode,\n}: {\n readonly isTreeEditing: boolean;\n readonly isTreeMode: boolean;\n}): IconDefinition {\n if (!isTreeMode) {\n return PlusIcon;\n }\n\n return isTreeEditing ? SaveIcon : EditIcon;\n}\n\nfunction readOrgUnitPrimaryActionDisabled({\n hasDraftChanges,\n isTreeEditing,\n isTreeMode,\n loading,\n saving,\n}: {\n readonly hasDraftChanges: boolean;\n readonly isTreeEditing: boolean;\n readonly isTreeMode: boolean;\n readonly loading: boolean;\n readonly saving: boolean;\n}): boolean {\n if (!isTreeMode) {\n return false;\n }\n\n if (!isTreeEditing) {\n return loading;\n }\n\n return !hasDraftChanges || saving;\n}\n\nfunction PanelIntro({\n actionDisabled = false,\n actionIcon = PlusIcon,\n actionLabel,\n actions,\n description,\n onCreate,\n title,\n}: {\n readonly actionDisabled?: boolean;\n readonly actionIcon?: IconDefinition;\n readonly actionLabel: string;\n readonly actions?: ReactElement;\n readonly description: string;\n readonly onCreate: () => void;\n readonly title: string;\n}): ReactElement {\n return (\n <div className={styles.tableIntro}>\n <div>\n <Typography component=\"h2\" variant=\"h3\">\n {title}\n </Typography>\n <Typography color=\"text-neutral\" variant=\"body\">\n {description}\n </Typography>\n </div>\n <div className={styles.tableIntroActions}>\n {actions}\n <Button\n disabled={actionDisabled}\n icon={actionIcon}\n iconType=\"leading\"\n onClick={onCreate}\n >\n {actionLabel}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction OrgUnitModal({\n modal,\n onClose,\n onSubmit,\n orgUnits,\n saving,\n}: {\n readonly modal: OrgModalState | null;\n readonly onClose: () => void;\n readonly onSubmit: (input: {\n readonly code: string | null;\n readonly name: string | null;\n readonly parentId: string | null;\n readonly type: OrgUnitType | null;\n }) => Promise<void>;\n readonly orgUnits: readonly OrgUnitRecord[];\n readonly saving: boolean;\n}): ReactElement {\n const [code, setCode] = useState('');\n const [name, setName] = useState('');\n const [parent, setParent] = useState<OrgUnitOption | null>(null);\n const [type, setType] = useState<OrgUnitTypeOption>(ORG_UNIT_TYPES[2]);\n\n useEffect((): void => {\n if (!modal) {\n return;\n }\n\n const record = modal.record;\n const parentId = record?.parentId ?? modal.parentId ?? null;\n const parentOrgUnit = parentId\n ? (orgUnits.find((orgUnit) => orgUnit.id === parentId) ?? null)\n : null;\n\n setCode(record?.code ?? '');\n setName(record?.name ?? '');\n setParent(parentOrgUnit ? readOrgUnitOption(parentOrgUnit) : null);\n setType(\n ORG_UNIT_TYPES.find((option) => option.id === record?.type) ??\n ORG_UNIT_TYPES[2],\n );\n }, [modal, orgUnits]);\n\n return (\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{ disabled: !code || !name }}\n confirmText={modal?.type === 'EDIT' ? '儲存' : '建立'}\n loading={saving}\n modalType=\"standard\"\n onCancel={onClose}\n onClose={onClose}\n onConfirm={(): void =>\n void onSubmit({\n code,\n name,\n parentId: parent?.id ?? null,\n type: type.id,\n })\n }\n open={Boolean(modal)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n title={modal?.type === 'EDIT' ? '編輯組織' : '新增組織'}\n >\n <div className={styles.modalFields}>\n <OrgModalTextField\n label=\"代碼\"\n name=\"orgCode\"\n onChange={setCode}\n placeholder=\"例如 FIN-TW\"\n value={code}\n />\n <OrgModalTextField\n label=\"名稱\"\n name=\"orgName\"\n onChange={setName}\n placeholder=\"例如 財務部\"\n value={name}\n />\n <BPMFormField label=\"類型\" name=\"orgType\">\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => setType(readOrgUnitTypeOption(option))}\n options={[...ORG_UNIT_TYPES]}\n placeholder=\"選擇組織類型\"\n value={type}\n />\n </BPMFormField>\n <BPMFormField label=\"上層組織\" name=\"parentId\">\n <OrgUnitPicker\n name=\"parentId\"\n onChange={setParent}\n orgUnits={orgUnits.filter(\n (orgUnit) => orgUnit.id !== modal?.record?.id,\n )}\n placeholder=\"選擇上層組織\"\n value={parent}\n />\n </BPMFormField>\n </div>\n </Modal>\n );\n}\n\nfunction PositionModal({\n modal,\n onClose,\n onSubmit,\n saving,\n}: {\n readonly modal: PositionModalState | null;\n readonly onClose: () => void;\n readonly onSubmit: (input: {\n readonly code: string | null;\n readonly level: number | null;\n readonly name: string | null;\n }) => Promise<void>;\n readonly saving: boolean;\n}): ReactElement {\n const [code, setCode] = useState('');\n const [level, setLevel] = useState('0');\n const [name, setName] = useState('');\n\n useEffect((): void => {\n if (!modal) {\n return;\n }\n\n setCode(modal.record?.code ?? '');\n setLevel(String(modal.record?.level ?? 0));\n setName(modal.record?.name ?? '');\n }, [modal]);\n\n return (\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{ disabled: !code || !name }}\n confirmText={modal?.type === 'EDIT' ? '儲存' : '建立'}\n loading={saving}\n modalType=\"standard\"\n onCancel={onClose}\n onClose={onClose}\n onConfirm={(): void =>\n void onSubmit({\n code,\n level: Number(level),\n name,\n })\n }\n open={Boolean(modal)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n title={modal?.type === 'EDIT' ? '編輯職位' : '新增職位'}\n >\n <div className={styles.modalFields}>\n <OrgModalTextField\n label=\"代碼\"\n name=\"positionCode\"\n onChange={setCode}\n placeholder=\"例如 FIN-MGR\"\n value={code}\n />\n <OrgModalTextField\n label=\"名稱\"\n name=\"positionName\"\n onChange={setName}\n placeholder=\"例如 財務主管\"\n value={name}\n />\n <OrgModalTextField\n label=\"職等\"\n name=\"positionLevel\"\n onChange={setLevel}\n placeholder=\"例如 5\"\n value={level}\n />\n </div>\n </Modal>\n );\n}\n\nfunction MembershipModal({\n membersById,\n modal,\n onClose,\n onSubmit,\n orgUnits,\n positions,\n saving,\n}: {\n readonly membersById: ReadonlyMap<string, MemberProfileRecord>;\n readonly modal: MembershipModalState | null;\n readonly onClose: () => void;\n readonly onSubmit: (input: {\n readonly effectiveFrom: string | null;\n readonly effectiveTo: string | null;\n readonly isPrimary: boolean | null;\n readonly memberId: string | null;\n readonly orgUnitId: string | null;\n readonly positionId: string | null;\n }) => Promise<void>;\n readonly orgUnits: readonly OrgUnitRecord[];\n readonly positions: readonly PositionRecord[];\n readonly saving: boolean;\n}): ReactElement {\n const [effectiveFrom, setEffectiveFrom] = useState(today());\n const [effectiveTo, setEffectiveTo] = useState('');\n const [isPrimary, setIsPrimary] = useState<PrimaryOption>(PRIMARY_OPTIONS[1]);\n const [member, setMember] = useState<MemberOption | null>(null);\n const [orgUnit, setOrgUnit] = useState<OrgUnitOption | null>(null);\n const [position, setPosition] = useState<PositionOption | null>(null);\n\n useEffect((): void => {\n if (!modal) {\n return;\n }\n\n const record = modal.record;\n const profile = record ? membersById.get(record.memberId) : null;\n\n setEffectiveFrom(record?.effectiveFrom ?? today());\n setEffectiveTo(record?.effectiveTo ?? '');\n setIsPrimary(\n PRIMARY_OPTIONS.find((option) => option.value === record?.isPrimary) ??\n PRIMARY_OPTIONS[1],\n );\n setMember(profile ? readMemberOption(profile) : null);\n setOrgUnit(\n readNullableOption(\n orgUnits.find((candidate) => candidate.id === record?.orgUnitId),\n readOrgUnitOption,\n ),\n );\n setPosition(\n readNullableOption(\n positions.find((candidate) => candidate.id === record?.positionId),\n readPositionOption,\n ),\n );\n }, [membersById, modal, orgUnits, positions]);\n\n return (\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{ disabled: !member || !orgUnit }}\n confirmText={modal?.type === 'EDIT' ? '儲存' : '建立'}\n loading={saving}\n modalType=\"standard\"\n onCancel={onClose}\n onClose={onClose}\n onConfirm={(): void =>\n void onSubmit({\n effectiveFrom,\n effectiveTo: effectiveTo || null,\n isPrimary: isPrimary.value,\n memberId: member?.id ?? null,\n orgUnitId: orgUnit?.id ?? null,\n positionId: position?.id ?? null,\n })\n }\n open={Boolean(modal)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n title={modal?.type === 'EDIT' ? '編輯會員歸屬' : '新增會員歸屬'}\n >\n <div className={styles.modalFields}>\n <BPMFormField label=\"會員\" name=\"memberId\">\n <MemberPicker\n name=\"memberId\"\n onChange={setMember}\n placeholder=\"搜尋會員姓名或信箱\"\n value={member}\n />\n </BPMFormField>\n <BPMFormField label=\"組織\" name=\"orgUnitId\">\n <OrgUnitPicker\n name=\"orgUnitId\"\n onChange={setOrgUnit}\n orgUnits={orgUnits}\n placeholder=\"選擇歸屬組織\"\n value={orgUnit}\n />\n </BPMFormField>\n <BPMFormField label=\"職位\" name=\"positionId\">\n <PositionPicker\n name=\"positionId\"\n onChange={setPosition}\n placeholder=\"選擇職位\"\n positions={positions}\n value={position}\n />\n </BPMFormField>\n <BPMFormField label=\"歸屬類型\" name=\"isPrimary\">\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => setIsPrimary(readPrimaryOption(option))}\n options={[...PRIMARY_OPTIONS]}\n placeholder=\"選擇歸屬類型\"\n value={isPrimary}\n />\n </BPMFormField>\n <DateField\n label=\"生效日\"\n name=\"membershipEffectiveFrom\"\n onChange={setEffectiveFrom}\n placeholder=\"YYYY-MM-DD\"\n value={effectiveFrom}\n />\n <DateField\n label=\"結束日\"\n name=\"membershipEffectiveTo\"\n onChange={setEffectiveTo}\n placeholder=\"YYYY-MM-DD,未設定代表無期限\"\n value={effectiveTo}\n />\n </div>\n </Modal>\n );\n}\n\nfunction ManagerResolutionModal({\n membersById,\n modal,\n onClose,\n onSubmit,\n orgUnits,\n positions,\n saving,\n}: {\n readonly membersById: ReadonlyMap<string, MemberProfileRecord>;\n readonly modal: ManagerModalState | null;\n readonly onClose: () => void;\n readonly onSubmit: (input: {\n readonly effectiveFrom: string | null;\n readonly effectiveTo: string | null;\n readonly managerMemberId: string | null;\n readonly priority: number | null;\n readonly scopeId: string | null;\n readonly scopeType: ManagerResolutionScopeType | null;\n }) => Promise<void>;\n readonly orgUnits: readonly OrgUnitRecord[];\n readonly positions: readonly PositionRecord[];\n readonly saving: boolean;\n}): ReactElement {\n const [effectiveFrom, setEffectiveFrom] = useState(today());\n const [effectiveTo, setEffectiveTo] = useState('');\n const [manager, setManager] = useState<MemberOption | null>(null);\n const [priority, setPriority] = useState('0');\n const [scopeMember, setScopeMember] = useState<MemberOption | null>(null);\n const [scopeOrgUnit, setScopeOrgUnit] = useState<OrgUnitOption | null>(null);\n const [scopePosition, setScopePosition] = useState<PositionOption | null>(\n null,\n );\n const [scopeType, setScopeType] = useState<ScopeTypeOption>(SCOPE_TYPES[0]);\n\n useEffect((): void => {\n if (!modal) {\n return;\n }\n\n const record = modal.record;\n const nextScopeType =\n SCOPE_TYPES.find((option) => option.id === record?.scopeType) ??\n SCOPE_TYPES[0];\n\n setEffectiveFrom(record?.effectiveFrom ?? today());\n setEffectiveTo(record?.effectiveTo ?? '');\n setManager(\n readNullableOption(\n record ? membersById.get(record.managerMemberId) : null,\n readMemberOption,\n ),\n );\n setPriority(String(record?.priority ?? 0));\n setScopeMember(\n nextScopeType.id === 'MEMBER'\n ? readNullableOption(\n record ? membersById.get(record.scopeId) : null,\n readMemberOption,\n )\n : null,\n );\n setScopeOrgUnit(\n nextScopeType.id === 'ORG_UNIT'\n ? readNullableOption(\n orgUnits.find((candidate) => candidate.id === record?.scopeId),\n readOrgUnitOption,\n )\n : null,\n );\n setScopePosition(\n nextScopeType.id === 'POSITION'\n ? readNullableOption(\n positions.find((candidate) => candidate.id === record?.scopeId),\n readPositionOption,\n )\n : null,\n );\n setScopeType(nextScopeType);\n }, [membersById, modal, orgUnits, positions]);\n\n const scopeId =\n scopeType.id === 'MEMBER'\n ? scopeMember?.id\n : scopeType.id === 'ORG_UNIT'\n ? scopeOrgUnit?.id\n : scopePosition?.id;\n const isSelfManagerResolution = Boolean(\n scopeType.id === 'MEMBER' &&\n scopeMember?.id &&\n manager?.id &&\n scopeMember.id === manager.id,\n );\n\n return (\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !manager || !scopeId || isSelfManagerResolution,\n }}\n confirmText={modal?.type === 'EDIT' ? '儲存' : '建立'}\n loading={saving}\n modalType=\"standard\"\n onCancel={onClose}\n onClose={onClose}\n onConfirm={(): void =>\n void onSubmit({\n effectiveFrom,\n effectiveTo: effectiveTo || null,\n managerMemberId: manager?.id ?? null,\n priority: Number(priority),\n scopeId: scopeId ?? null,\n scopeType: scopeType.id,\n })\n }\n open={Boolean(modal)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n title={modal?.type === 'EDIT' ? '編輯主管規則' : '新增主管規則'}\n >\n <div className={styles.modalFields}>\n <BPMFormField label=\"套用範圍\" name=\"scopeType\">\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setScopeType(readScopeTypeOption(option))\n }\n options={[...SCOPE_TYPES]}\n placeholder=\"選擇套用範圍\"\n value={scopeType}\n />\n </BPMFormField>\n {scopeType.id === 'MEMBER' ? (\n <BPMFormField label=\"會員\" name=\"scopeMemberId\">\n <MemberPicker\n name=\"scopeMemberId\"\n onChange={setScopeMember}\n placeholder=\"搜尋套用會員\"\n value={scopeMember}\n />\n </BPMFormField>\n ) : null}\n {scopeType.id === 'ORG_UNIT' ? (\n <BPMFormField label=\"組織\" name=\"scopeOrgUnitId\">\n <OrgUnitPicker\n name=\"scopeOrgUnitId\"\n onChange={setScopeOrgUnit}\n orgUnits={orgUnits}\n placeholder=\"選擇套用組織\"\n value={scopeOrgUnit}\n />\n </BPMFormField>\n ) : null}\n {scopeType.id === 'POSITION' ? (\n <BPMFormField label=\"職位\" name=\"scopePositionId\">\n <PositionPicker\n name=\"scopePositionId\"\n onChange={setScopePosition}\n placeholder=\"選擇套用職位\"\n positions={positions}\n value={scopePosition}\n />\n </BPMFormField>\n ) : null}\n <BPMFormField label=\"簽核主管\" name=\"managerMemberId\">\n <MemberPicker\n name=\"managerMemberId\"\n onChange={setManager}\n placeholder=\"搜尋簽核主管\"\n value={manager}\n />\n </BPMFormField>\n {isSelfManagerResolution ? (\n <Typography color=\"text-error\" variant=\"caption\">\n 簽核主管不可設定為套用會員本人。\n </Typography>\n ) : null}\n <OrgModalTextField\n label=\"優先序\"\n name=\"managerPriority\"\n onChange={setPriority}\n placeholder=\"例如 10\"\n value={priority}\n />\n <DateField\n label=\"生效日\"\n name=\"managerEffectiveFrom\"\n onChange={setEffectiveFrom}\n placeholder=\"YYYY-MM-DD\"\n value={effectiveFrom}\n />\n <DateField\n label=\"結束日\"\n name=\"managerEffectiveTo\"\n onChange={setEffectiveTo}\n placeholder=\"YYYY-MM-DD,未設定代表無期限\"\n value={effectiveTo}\n />\n </div>\n </Modal>\n );\n}\n\nfunction OrgModalTextField({\n label,\n name,\n onChange,\n placeholder,\n value,\n}: {\n readonly label: string;\n readonly name: string;\n readonly onChange: (value: string) => void;\n readonly placeholder: string;\n readonly value: string;\n}): ReactElement {\n return (\n <BPMFormField label={label} name={name}>\n <Input\n fullWidth\n name={name}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(event.target.value)\n }\n placeholder={placeholder}\n value={value}\n />\n </BPMFormField>\n );\n}\n\nfunction DateField({\n label,\n name,\n onChange,\n placeholder,\n value,\n}: {\n readonly label: string;\n readonly name: string;\n readonly onChange: (value: string) => void;\n readonly placeholder: string;\n readonly value: string;\n}): ReactElement {\n return (\n <BPMFormField label={label} name={name}>\n <DatePicker\n format=\"YYYY-MM-DD\"\n fullWidth\n inputProps={{ name }}\n onChange={(nextValue): void => onChange(formatDateOnly(nextValue))}\n placeholder={placeholder}\n value={value.trim() ? value : undefined}\n />\n </BPMFormField>\n );\n}\n\nfunction readReferencedMemberIds(\n memberships: readonly MembershipRecord[],\n managerResolutions: readonly ManagerResolutionRecord[],\n): readonly string[] {\n return [\n ...new Set([\n ...memberships.map((membership) => membership.memberId),\n ...managerResolutions.map((resolution) => resolution.managerMemberId),\n ...managerResolutions\n .filter((resolution) => resolution.scopeType === 'MEMBER')\n .map((resolution) => resolution.scopeId),\n ]),\n ];\n}\n\nfunction readScopeLabel(\n resolution: ManagerResolutionRecord,\n lookup: {\n readonly membersById: ReadonlyMap<string, MemberProfileRecord>;\n readonly orgUnitsById: ReadonlyMap<string, OrgUnitRecord>;\n readonly positionsById: ReadonlyMap<string, PositionRecord>;\n },\n): string {\n if (resolution.scopeType === 'MEMBER') {\n return `會員:${readMemberLabel(lookup.membersById.get(resolution.scopeId))}`;\n }\n\n if (resolution.scopeType === 'ORG_UNIT') {\n return `組織:${readOrgUnitLabel(lookup.orgUnitsById.get(resolution.scopeId))}`;\n }\n\n return `職位:${readPositionLabel(lookup.positionsById.get(resolution.scopeId))}`;\n}\n\nfunction readMemberLabel(member: MemberProfileRecord | undefined): string {\n return member ? `${member.name} · ${member.email}` : '未知會員';\n}\n\nfunction readOrgUnitLabel(orgUnit: OrgUnitRecord | undefined): string {\n return orgUnit ? `${orgUnit.name} · ${orgUnit.code}` : '未知組織';\n}\n\nfunction readOrgUnitTypeLabel(type: OrgUnitType): string {\n return (\n ORG_UNIT_TYPES.find(\n (option) => option.id.toLowerCase() === type.toLowerCase(),\n )?.name ?? '未知類型'\n );\n}\n\nfunction readPositionLabel(position: PositionRecord | undefined): string {\n return position ? `${position.name} · ${position.code}` : '未指定';\n}\n\nfunction readAdminOrgTab(value: unknown): AdminOrgTab {\n return value === 'MANAGERS' ||\n value === 'MEMBERSHIPS' ||\n value === 'POSITIONS'\n ? value\n : 'ORG_UNITS';\n}\n\nfunction readOrgUnitTypeOption(value: unknown): OrgUnitTypeOption {\n const record = isRecord(value) ? value : null;\n\n if (typeof record?.id === 'string') {\n const id = record.id;\n\n return (\n ORG_UNIT_TYPES.find(\n (option) => option.id.toLowerCase() === id.toLowerCase(),\n ) ?? ORG_UNIT_TYPES[2]\n );\n }\n\n return ORG_UNIT_TYPES[2];\n}\n\nfunction readOrgUnitTypeFilterOption(value: unknown): OrgUnitTypeFilterOption {\n const record = isRecord(value) ? value : null;\n\n if (typeof record?.id === 'string') {\n const id = record.id;\n\n return (\n ORG_UNIT_TYPE_FILTER_OPTIONS.find(\n (option) => option.id.toLowerCase() === id.toLowerCase(),\n ) ?? ALL_ORG_UNIT_TYPE_FILTER\n );\n }\n\n return ALL_ORG_UNIT_TYPE_FILTER;\n}\n\nfunction readScopeTypeOption(value: unknown): ScopeTypeOption {\n return readOption(value, SCOPE_TYPES, SCOPE_TYPES[0]);\n}\n\nfunction readScopeTypeFilterOption(value: unknown): ScopeTypeFilterOption {\n return readOption(value, SCOPE_TYPE_FILTER_OPTIONS, ALL_SCOPE_TYPE_FILTER);\n}\n\nfunction readActiveFilterOption(value: unknown): ActiveFilterOption {\n return readOption(value, ACTIVE_FILTER_OPTIONS, ALL_ACTIVE_FILTER);\n}\n\nfunction readNullableActiveFilterOption(\n value: unknown,\n): ActiveFilterOption | null {\n const record = isRecord(value) ? value : null;\n const id = typeof record?.id === 'string' ? record.id : null;\n\n return ACTIVE_FILTER_OPTIONS.find((option) => option.id === id) ?? null;\n}\n\nfunction readOrgUnitOptionFromValue(value: unknown): OrgUnitOption | null {\n const record = isRecord(value) ? value : null;\n const id = typeof record?.id === 'string' ? record.id : null;\n const name = typeof record?.name === 'string' ? record.name : null;\n\n return id && name ? { id, name } : null;\n}\n\nfunction readPositionOptionFromValue(value: unknown): PositionOption | null {\n const record = isRecord(value) ? value : null;\n const id = typeof record?.id === 'string' ? record.id : null;\n const name = typeof record?.name === 'string' ? record.name : null;\n\n return id && name ? { id, name } : null;\n}\n\nfunction readPrimaryOption(value: unknown): PrimaryOption {\n return readOption(value, PRIMARY_OPTIONS, PRIMARY_OPTIONS[1]);\n}\n\nfunction readOption<TOption extends { readonly id: string }>(\n value: unknown,\n options: readonly TOption[],\n fallback: TOption,\n): TOption {\n const record = isRecord(value) ? value : null;\n const id = typeof record?.id === 'string' ? record.id : null;\n\n return options.find((option) => option.id === id) ?? fallback;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readNullableOption<TValue, TOption>(\n value: TValue | null | undefined,\n mapper: (value: TValue) => TOption,\n): TOption | null {\n return value ? mapper(value) : null;\n}\n\nfunction today(): string {\n return formatDateParts(new Date());\n}\n\nfunction formatDateOnly(value: string | undefined): string {\n const date = value ? new Date(value) : null;\n\n return date && !Number.isNaN(date.getTime()) ? formatDateParts(date) : '';\n}\n\nfunction formatDateParts(date: Date): string {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(\n date.getDate(),\n )}`;\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '讀取組織資料失敗。';\n}\n"],"mappings":"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"}
@@ -1,215 +0,0 @@
1
- "use client";
2
- import { t as e } from "./app-navigation-CATITRM7.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 ee, Layout as u, Modal as d, PageHeader as te, Section as f, SectionGroup as p, Table as m, Typography as h } from "@mezzanine-ui/react";
5
- import { listMemberDirectoryPage as g, resolveMembers as _ } from "@rytass/bpm-core-client";
6
- import { jsx as v, jsxs as y } from "react/jsx-runtime";
7
- import ne from "@mezzanine-ui/react/ContentHeader";
8
- import { FormFieldLayout as b } from "@mezzanine-ui/core/form";
9
- import { listMemberships as x, readOrganizationDashboard as S, readResolvedManager as C } from "@rytass/bpm-core-client/organization";
10
- import '../AdminUsersView.css';var w = {
11
- memberFilterArea: "bpm_memberFilterArea_9RB2k",
12
- header: "bpm_header_sIEtg",
13
- detailFields: "bpm_detailFields_TyKNL",
14
- detailSection: "bpm_detailSection_-iLjy",
15
- membershipList: "bpm_membershipList_5n9iq"
16
- }, T = [
17
- 10,
18
- 20,
19
- 50
20
- ];
21
- function E({ activeHref: a = "/admin/users" } = {}) {
22
- let [d, E] = i(null), [O, k] = i([]), [A, M] = i(null), [N, P] = i(null), [F, I] = i(null), [L, R] = i(!0), [z, B] = i(1), [V, H] = i(10), [U, W] = i(0), [G, K] = i([]), [q, J] = i([]), [Y, X] = i([]), [Z, re] = i(""), ie = r(() => new Map(q.map((e) => [e.id, e])), [q]), ae = r(() => new Map(Y.map((e) => [e.id, e])), [Y]), Q = t(async () => {
23
- R(!0), I(null);
24
- try {
25
- let [e, t] = await Promise.all([g({
26
- page: z,
27
- pageSize: V,
28
- searchText: Z
29
- }), S()]);
30
- K(e.members), W(e.totalCount), J(t.orgUnits), X(t.positions);
31
- } catch (e) {
32
- I(j(e));
33
- } finally {
34
- R(!1);
35
- }
36
- }, [
37
- z,
38
- V,
39
- Z
40
- ]);
41
- n(() => {
42
- Q();
43
- }, [Q]);
44
- let oe = r(() => G.map((e) => ({
45
- ...e,
46
- key: e.memberId
47
- })), [G]), $ = t(async (e) => {
48
- E(e), M(null), I(null);
49
- try {
50
- let [t, n] = await Promise.all([x({ memberId: e.memberId }), C(e.memberId)]);
51
- k(t), P(n), M((await _(n.managerMemberId ? [n.managerMemberId] : []))[0] ?? null);
52
- } catch (e) {
53
- I(j(e));
54
- }
55
- }, []), se = r(() => [{
56
- dataIndex: "name",
57
- key: "name",
58
- title: "姓名",
59
- width: 160
60
- }, {
61
- dataIndex: "email",
62
- key: "email",
63
- title: "信箱",
64
- width: 260
65
- }], []), ce = r(() => ({
66
- render: () => [{
67
- name: "檢視",
68
- onClick: (e) => {
69
- $(e);
70
- }
71
- }],
72
- variant: "base-secondary",
73
- width: 88
74
- }), [$]);
75
- function le() {
76
- E(null), M(null), k([]), P(null);
77
- }
78
- return /* @__PURE__ */ y(u, { children: [/* @__PURE__ */ v(e, { activeHref: a }), /* @__PURE__ */ y(u.Main, { children: [
79
- /* @__PURE__ */ v(te, { children: /* @__PURE__ */ v(ne, {
80
- description: "會員資料由 host member resolver 提供,BPM 僅維護組織歸屬與主管解析。",
81
- title: "會員對照"
82
- }) }),
83
- /* @__PURE__ */ v(p, { children: /* @__PURE__ */ y(f, {
84
- filterArea: /* @__PURE__ */ v(s, {
85
- className: w.memberFilterArea,
86
- children: /* @__PURE__ */ v(c, { children: /* @__PURE__ */ v(o, {
87
- span: 3,
88
- children: /* @__PURE__ */ v(l, {
89
- fullWidth: !0,
90
- layout: b.VERTICAL,
91
- name: "memberSearchText",
92
- children: /* @__PURE__ */ v(ee, {
93
- fullWidth: !0,
94
- onChange: (e) => {
95
- re(e.target.value), B(1);
96
- },
97
- placeholder: "搜尋姓名或信箱",
98
- size: "sub",
99
- value: Z,
100
- variant: "base"
101
- })
102
- })
103
- }) })
104
- }),
105
- children: [F ? /* @__PURE__ */ v(h, {
106
- color: "text-error",
107
- variant: "body",
108
- children: F
109
- }) : null, /* @__PURE__ */ v(m, {
110
- actions: ce,
111
- columns: se,
112
- dataSource: oe,
113
- fullWidth: !0,
114
- loading: L,
115
- pagination: {
116
- current: z,
117
- onChange: (e) => {
118
- B(e);
119
- },
120
- onChangePageSize: (e) => {
121
- B(1), H(e);
122
- },
123
- pageSize: V,
124
- pageSizeLabel: "每頁筆數",
125
- pageSizeOptions: T,
126
- renderResultSummary: (e, t, n) => `顯示 ${e}-${t} 筆,共 ${n} 筆`,
127
- showPageSizeOptions: !0,
128
- total: U
129
- }
130
- })]
131
- }) }),
132
- /* @__PURE__ */ v(D, {
133
- managerProfile: A,
134
- member: d,
135
- memberships: O,
136
- onClose: le,
137
- orgUnitsById: ie,
138
- positionsById: ae,
139
- resolvedManager: N
140
- })
141
- ] })] });
142
- }
143
- function D({ managerProfile: e, member: t, memberships: n, onClose: r, orgUnitsById: i, positionsById: o, resolvedManager: s }) {
144
- return /* @__PURE__ */ v(d, {
145
- cancelText: "關閉",
146
- confirmText: "關閉",
147
- modalType: "standard",
148
- onCancel: r,
149
- onClose: r,
150
- onConfirm: r,
151
- open: !!t,
152
- showModalFooter: !0,
153
- showModalHeader: !0,
154
- size: "regular",
155
- title: t?.name ?? "會員明細",
156
- children: t ? /* @__PURE__ */ y("div", {
157
- className: w.detailFields,
158
- children: [
159
- /* @__PURE__ */ v(a, {
160
- title: "基本資料",
161
- children: /* @__PURE__ */ v("div", {
162
- className: w.detailSection,
163
- children: /* @__PURE__ */ y(h, {
164
- variant: "body",
165
- children: ["信箱:", t.email]
166
- })
167
- })
168
- }),
169
- /* @__PURE__ */ v(a, {
170
- title: "BPM 組織歸屬",
171
- children: /* @__PURE__ */ v("div", {
172
- className: w.membershipList,
173
- children: n.length ? n.map((e) => /* @__PURE__ */ y(h, {
174
- variant: "body",
175
- children: [
176
- O(i.get(e.orgUnitId)),
177
- " / ",
178
- e.positionId ? k(o.get(e.positionId)) : "未指定職位",
179
- " / ",
180
- e.isPrimary ? "主要" : "一般"
181
- ]
182
- }, e.id)) : /* @__PURE__ */ v(h, {
183
- color: "text-neutral",
184
- variant: "body",
185
- children: "尚未建立 BPM 組織歸屬"
186
- })
187
- })
188
- }),
189
- /* @__PURE__ */ v(a, {
190
- title: "主管解析",
191
- children: /* @__PURE__ */ v(h, {
192
- variant: "body",
193
- children: s?.managerMemberId ? A(e) : "尚未解析到主管"
194
- })
195
- })
196
- ]
197
- }) : null
198
- });
199
- }
200
- function O(e) {
201
- return e ? `${e.name} · ${e.code}` : "未知組織";
202
- }
203
- function k(e) {
204
- return e ? `${e.name} · ${e.code}` : "未知職位";
205
- }
206
- function A(e) {
207
- return e ? `${e.name} · ${e.email}` : "主管資料尚未載入";
208
- }
209
- function j(e) {
210
- return e instanceof Error ? e.message : "讀取會員資料失敗。";
211
- }
212
- //#endregion
213
- export { E as t };
214
-
215
- //# sourceMappingURL=AdminUsersView-C0oO05Br.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminUsersView-C0oO05Br.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 Layout,\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 { AppNavigation } 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 = '/admin/users',\n}: AdminUsersViewProps = {}): ReactElement {\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 <Layout>\n <AppNavigation activeHref={activeHref} />\n\n <Layout.Main>\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 </Layout.Main>\n </Layout>\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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"}
@@ -1,2 +0,0 @@
1
- "use client";require('../AdminUsersView.css');const e=require("./app-navigation-DAC5gFbG.cjs");let t=require("react"),n=require("@mezzanine-ui/react"),r=require("@rytass/bpm-core-client"),i=require("react/jsx-runtime"),a=require("@mezzanine-ui/react/ContentHeader");a=e.o(a,1);let o=require("@mezzanine-ui/core/form"),s=require("@rytass/bpm-core-client/organization");var c={memberFilterArea:`bpm_memberFilterArea_9RB2k`,header:`bpm_header_sIEtg`,detailFields:`bpm_detailFields_TyKNL`,detailSection:`bpm_detailSection_-iLjy`,membershipList:`bpm_membershipList_5n9iq`},l=[10,20,50];function u({activeHref:u=`/admin/users`}={}){let[f,p]=(0,t.useState)(null),[m,g]=(0,t.useState)([]),[_,v]=(0,t.useState)(null),[y,b]=(0,t.useState)(null),[x,S]=(0,t.useState)(null),[C,w]=(0,t.useState)(!0),[T,E]=(0,t.useState)(1),[D,O]=(0,t.useState)(10),[k,A]=(0,t.useState)(0),[j,M]=(0,t.useState)([]),[N,P]=(0,t.useState)([]),[F,I]=(0,t.useState)([]),[L,R]=(0,t.useState)(``),z=(0,t.useMemo)(()=>new Map(N.map(e=>[e.id,e])),[N]),B=(0,t.useMemo)(()=>new Map(F.map(e=>[e.id,e])),[F]),V=(0,t.useCallback)(async()=>{w(!0),S(null);try{let[e,t]=await Promise.all([(0,r.listMemberDirectoryPage)({page:T,pageSize:D,searchText:L}),(0,s.readOrganizationDashboard)()]);M(e.members),A(e.totalCount),P(t.orgUnits),I(t.positions)}catch(e){S(h(e))}finally{w(!1)}},[T,D,L]);(0,t.useEffect)(()=>{V()},[V]);let H=(0,t.useMemo)(()=>j.map(e=>({...e,key:e.memberId})),[j]),U=(0,t.useCallback)(async e=>{p(e),v(null),S(null);try{let[t,n]=await Promise.all([(0,s.listMemberships)({memberId:e.memberId}),(0,s.readResolvedManager)(e.memberId)]);g(t),b(n),v((await(0,r.resolveMembers)(n.managerMemberId?[n.managerMemberId]:[]))[0]??null)}catch(e){S(h(e))}},[]),W=(0,t.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`姓名`,width:160},{dataIndex:`email`,key:`email`,title:`信箱`,width:260}],[]),G=(0,t.useMemo)(()=>({render:()=>[{name:`檢視`,onClick:e=>{U(e)}}],variant:`base-secondary`,width:88}),[U]);function K(){p(null),v(null),g([]),b(null)}return(0,i.jsxs)(n.Layout,{children:[(0,i.jsx)(e.t,{activeHref:u}),(0,i.jsxs)(n.Layout.Main,{children:[(0,i.jsx)(n.PageHeader,{children:(0,i.jsx)(a.default,{description:`會員資料由 host member resolver 提供,BPM 僅維護組織歸屬與主管解析。`,title:`會員對照`})}),(0,i.jsx)(n.SectionGroup,{children:(0,i.jsxs)(n.Section,{filterArea:(0,i.jsx)(n.FilterArea,{className:c.memberFilterArea,children:(0,i.jsx)(n.FilterLine,{children:(0,i.jsx)(n.Filter,{span:3,children:(0,i.jsx)(n.FormField,{fullWidth:!0,layout:o.FormFieldLayout.VERTICAL,name:`memberSearchText`,children:(0,i.jsx)(n.Input,{fullWidth:!0,onChange:e=>{R(e.target.value),E(1)},placeholder:`搜尋姓名或信箱`,size:`sub`,value:L,variant:`base`})})})})}),children:[x?(0,i.jsx)(n.Typography,{color:`text-error`,variant:`body`,children:x}):null,(0,i.jsx)(n.Table,{actions:G,columns:W,dataSource:H,fullWidth:!0,loading:C,pagination:{current:T,onChange:e=>{E(e)},onChangePageSize:e=>{E(1),O(e)},pageSize:D,pageSizeLabel:`每頁筆數`,pageSizeOptions:l,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:k}})]})}),(0,i.jsx)(d,{managerProfile:_,member:f,memberships:m,onClose:K,orgUnitsById:z,positionsById:B,resolvedManager:y})]})]})}function d({managerProfile:e,member:t,memberships:r,onClose:a,orgUnitsById:o,positionsById:s,resolvedManager:l}){return(0,i.jsx)(n.Modal,{cancelText:`關閉`,confirmText:`關閉`,modalType:`standard`,onCancel:a,onClose:a,onConfirm:a,open:!!t,showModalFooter:!0,showModalHeader:!0,size:`regular`,title:t?.name??`會員明細`,children:t?(0,i.jsxs)(`div`,{className:c.detailFields,children:[(0,i.jsx)(n.BaseCard,{title:`基本資料`,children:(0,i.jsx)(`div`,{className:c.detailSection,children:(0,i.jsxs)(n.Typography,{variant:`body`,children:[`信箱:`,t.email]})})}),(0,i.jsx)(n.BaseCard,{title:`BPM 組織歸屬`,children:(0,i.jsx)(`div`,{className:c.membershipList,children:r.length?r.map(e=>(0,i.jsxs)(n.Typography,{variant:`body`,children:[f(o.get(e.orgUnitId)),` / `,e.positionId?p(s.get(e.positionId)):`未指定職位`,` / `,e.isPrimary?`主要`:`一般`]},e.id)):(0,i.jsx)(n.Typography,{color:`text-neutral`,variant:`body`,children:`尚未建立 BPM 組織歸屬`})})}),(0,i.jsx)(n.BaseCard,{title:`主管解析`,children:(0,i.jsx)(n.Typography,{variant:`body`,children:l?.managerMemberId?m(e):`尚未解析到主管`})})]}):null})}function f(e){return e?`${e.name} · ${e.code}`:`未知組織`}function p(e){return e?`${e.name} · ${e.code}`:`未知職位`}function m(e){return e?`${e.name} · ${e.email}`:`主管資料尚未載入`}function h(e){return e instanceof Error?e.message:`讀取會員資料失敗。`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
2
- //# sourceMappingURL=AdminUsersView-DlArLlIr.cjs.map