@rytass/bpm-core-react 0.17.9 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +61 -0
- package/README.md +8 -0
- package/dist/chunks/FormBuilderView-CHaAQL5v.cjs +3 -0
- package/dist/chunks/FormBuilderView-CHaAQL5v.cjs.map +1 -0
- package/dist/chunks/{FormBuilderView-ClLnQ1e_.js → FormBuilderView-vQfVc08Z.js} +493 -437
- package/dist/chunks/FormBuilderView-vQfVc08Z.js.map +1 -0
- package/dist/chunks/{FormRendererView-BsTwZkqU.js → FormRendererView-CTLlG13b.js} +300 -189
- package/dist/chunks/FormRendererView-CTLlG13b.js.map +1 -0
- package/dist/chunks/FormRendererView-ChmM_4Yc.cjs +4 -0
- package/dist/chunks/FormRendererView-ChmM_4Yc.cjs.map +1 -0
- package/dist/chunks/admin-pickers-BjbkBpSJ.cjs +2 -0
- package/dist/chunks/admin-pickers-BjbkBpSJ.cjs.map +1 -0
- package/dist/chunks/{admin-pickers-Djq3h-UR.js → admin-pickers-DfGxsjpp.js} +42 -42
- package/dist/chunks/admin-pickers-DfGxsjpp.js.map +1 -0
- package/dist/chunks/{approval-instance-list-page-CPXMP3PL.js → approval-instance-list-page-BnI4t5mD.js} +7 -8
- package/dist/chunks/{approval-instance-list-page-CPXMP3PL.js.map → approval-instance-list-page-BnI4t5mD.js.map} +1 -1
- package/dist/chunks/{approval-instance-list-page-ax0pm8bt.cjs → approval-instance-list-page-fqvmkBlg.cjs} +2 -2
- package/dist/chunks/{approval-instance-list-page-ax0pm8bt.cjs.map → approval-instance-list-page-fqvmkBlg.cjs.map} +1 -1
- package/dist/chunks/approver-filled-form-B4zPg9kz.cjs +2 -0
- package/dist/chunks/approver-filled-form-B4zPg9kz.cjs.map +1 -0
- package/dist/chunks/approver-filled-form-Bgazhbvd.js +112 -0
- package/dist/chunks/approver-filled-form-Bgazhbvd.js.map +1 -0
- package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -1
- package/dist/chunks/{auth-provider-B5oPmvk2.js → auth-provider-C2b-5mGt.js} +2 -3
- package/dist/chunks/{auth-provider-B5oPmvk2.js.map → auth-provider-C2b-5mGt.js.map} +1 -1
- package/dist/chunks/{bpm-form-field-Cao0rMol.js → bpm-form-field-9B-Det0u.js} +2 -3
- package/dist/chunks/{bpm-form-field-Cao0rMol.js.map → bpm-form-field-9B-Det0u.js.map} +1 -1
- package/dist/chunks/bpm-form-field-Bc6k4ZEO.cjs.map +1 -1
- package/dist/chunks/{categories-riC33J_j.js → categories-BAdxjNSA.js} +14 -15
- package/dist/chunks/{categories-riC33J_j.js.map → categories-BAdxjNSA.js.map} +1 -1
- package/dist/chunks/{categories-AxxhqjLZ.cjs → categories-DQUtVEiV.cjs} +2 -2
- package/dist/chunks/{categories-AxxhqjLZ.cjs.map → categories-DQUtVEiV.cjs.map} +1 -1
- package/dist/chunks/{compose-jnvnnVfN.js → compose-D9ipJpF_.js} +131 -148
- package/dist/chunks/compose-D9ipJpF_.js.map +1 -0
- package/dist/chunks/compose-DtfX8DQ9.cjs +2 -0
- package/dist/chunks/compose-DtfX8DQ9.cjs.map +1 -0
- package/dist/chunks/{dashboard-page-DdBvV6YI.js → dashboard-page-BoqNhjT_.js} +5 -6
- package/dist/chunks/{dashboard-page-DdBvV6YI.js.map → dashboard-page-BoqNhjT_.js.map} +1 -1
- package/dist/chunks/{dashboard-page-BWQBSGDq.cjs → dashboard-page-D7YJ3udk.cjs} +2 -2
- package/dist/chunks/{dashboard-page-BWQBSGDq.cjs.map → dashboard-page-D7YJ3udk.cjs.map} +1 -1
- package/dist/chunks/{delegations-MxF3uJGW.js → delegations-BfhCDz5e.js} +15 -16
- package/dist/chunks/{delegations-MxF3uJGW.js.map → delegations-BfhCDz5e.js.map} +1 -1
- package/dist/chunks/{delegations-Ckf03icM.cjs → delegations-BmFGcuhA.cjs} +2 -2
- package/dist/chunks/{delegations-Ckf03icM.cjs.map → delegations-BmFGcuhA.cjs.map} +1 -1
- package/dist/chunks/{delegations-V9HIe3_P.cjs → delegations-CcS0SHbf.cjs} +2 -2
- package/dist/chunks/{delegations-V9HIe3_P.cjs.map → delegations-CcS0SHbf.cjs.map} +1 -1
- package/dist/chunks/{delegations-xUt1tj8d.js → delegations-DBh5TT6G.js} +16 -17
- package/dist/chunks/{delegations-xUt1tj8d.js.map → delegations-DBh5TT6G.js.map} +1 -1
- package/dist/chunks/designer-Df79YzUn.cjs +65 -0
- package/dist/chunks/designer-Df79YzUn.cjs.map +1 -0
- package/dist/chunks/{designer-B8Gvew_k.js → designer-ubnZbP-A.js} +1779 -1360
- package/dist/chunks/designer-ubnZbP-A.js.map +1 -0
- package/dist/chunks/detail-BBC9kqXd.cjs +5 -0
- package/dist/chunks/detail-BBC9kqXd.cjs.map +1 -0
- package/dist/chunks/detail-C6XKZjlF.js +2665 -0
- package/dist/chunks/detail-C6XKZjlF.js.map +1 -0
- package/dist/chunks/{format-date-time-CB-LxzqT.js → format-date-time-B0LdmWg4.js} +2 -3
- package/dist/chunks/{format-date-time-CB-LxzqT.js.map → format-date-time-B0LdmWg4.js.map} +1 -1
- package/dist/chunks/format-date-time-D-cx5M8z.cjs.map +1 -1
- package/dist/chunks/{format-member-label-DudVI55w.js → format-member-label-C73FuP-d.js} +2 -3
- package/dist/chunks/{format-member-label-DudVI55w.js.map → format-member-label-C73FuP-d.js.map} +1 -1
- package/dist/chunks/format-member-label-t7ANTF62.cjs.map +1 -1
- package/dist/chunks/language-provider-Bdnx3Gxl.cjs.map +1 -1
- package/dist/chunks/{language-provider-B3cEbLe4.js → language-provider-phkWOapf.js} +2 -3
- package/dist/chunks/{language-provider-B3cEbLe4.js.map → language-provider-phkWOapf.js.map} +1 -1
- package/dist/chunks/{login-C6qlTC6F.js → login-D6cc3bo7.js} +4 -5
- package/dist/chunks/{login-C6qlTC6F.js.map → login-D6cc3bo7.js.map} +1 -1
- package/dist/chunks/{login-AtVxZBsC.cjs → login-uvVcltrS.cjs} +2 -2
- package/dist/chunks/{login-AtVxZBsC.cjs.map → login-uvVcltrS.cjs.map} +1 -1
- package/dist/chunks/notifications-Bc4mgSds.cjs.map +1 -1
- package/dist/chunks/{notifications-DJ5wzCye.js → notifications-Cvme5Qbl.js} +2 -3
- package/dist/chunks/{notifications-DJ5wzCye.js.map → notifications-Cvme5Qbl.js.map} +1 -1
- package/dist/chunks/orgs-B_2J2tLX.cjs +2 -0
- package/dist/chunks/{orgs-BeeDDWL1.cjs.map → orgs-B_2J2tLX.cjs.map} +1 -1
- package/dist/chunks/{orgs-8hje_l2n.js → orgs-DqxMds26.js} +48 -49
- package/dist/chunks/{orgs-8hje_l2n.js.map → orgs-DqxMds26.js.map} +1 -1
- package/dist/chunks/{providers-B_d5tbCL.js → providers-BbCs23sk.js} +21 -25
- package/dist/chunks/{providers-B_d5tbCL.js.map → providers-BbCs23sk.js.map} +1 -1
- package/dist/chunks/{providers-chuJvMgv.cjs → providers-D_KAgOOu.cjs} +2 -2
- package/dist/chunks/{providers-chuJvMgv.cjs.map → providers-D_KAgOOu.cjs.map} +1 -1
- package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -1
- package/dist/chunks/{router-adapter-DftlFTOd.js → router-adapter-CkxCyzf5.js} +2 -3
- package/dist/chunks/{router-adapter-DftlFTOd.js.map → router-adapter-CkxCyzf5.js.map} +1 -1
- package/dist/chunks/{routes-config-yZbESPlw.js → routes-config-BcNaWJWJ.js} +2 -3
- package/dist/chunks/{routes-config-yZbESPlw.js.map → routes-config-BcNaWJWJ.js.map} +1 -1
- package/dist/chunks/routes-config-C1j_vFKo.cjs.map +1 -1
- package/dist/chunks/task-decision-3d17ZvZE.js +29 -0
- package/dist/chunks/task-decision-3d17ZvZE.js.map +1 -0
- package/dist/chunks/task-decision-CqZ4WQOC.cjs +2 -0
- package/dist/chunks/task-decision-CqZ4WQOC.cjs.map +1 -0
- package/dist/chunks/{use-bpm-member-D57LKe_u.js → use-bpm-member-BPzcNU1g.js} +3 -4
- package/dist/chunks/{use-bpm-member-D57LKe_u.js.map → use-bpm-member-BPzcNU1g.js.map} +1 -1
- package/dist/chunks/use-bpm-member-DpNAQtNC.cjs.map +1 -1
- package/dist/chunks/{users-Pl6hY5Y5.js → users-BBtiZ9QQ.js} +22 -25
- package/dist/chunks/{users-Pl6hY5Y5.js.map → users-BBtiZ9QQ.js.map} +1 -1
- package/dist/chunks/{users-O2L_M3BK.cjs → users-EqSzDhuj.cjs} +2 -2
- package/dist/chunks/{users-O2L_M3BK.cjs.map → users-EqSzDhuj.cjs.map} +1 -1
- package/dist/components/admin-picker-options.d.cts +11 -0
- package/dist/components/admin-picker-options.d.ts +11 -0
- package/dist/components/admin-pickers.d.cts +2 -11
- package/dist/components/admin-pickers.d.ts +2 -11
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +17 -19
- package/dist/index.js.map +1 -1
- package/dist/lib/task-decision.d.cts +16 -0
- package/dist/lib/task-decision.d.ts +16 -0
- package/dist/lib/use-org-unit-names.d.cts +10 -0
- package/dist/lib/use-org-unit-names.d.ts +10 -0
- package/dist/next/index.cjs +1 -1
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.js +7 -8
- package/dist/next/index.js.map +1 -1
- package/dist/next/workflow-chat-route.cjs +19 -1
- package/dist/next/workflow-chat-route.cjs.map +1 -1
- package/dist/next/workflow-chat-route.js +2 -3
- package/dist/next/workflow-chat-route.js.map +1 -1
- package/dist/pages/admin/delegations/index.cjs +1 -1
- package/dist/pages/admin/delegations/index.cjs.map +1 -1
- package/dist/pages/admin/delegations/index.js +2 -3
- package/dist/pages/admin/orgs/index.cjs +1 -1
- package/dist/pages/admin/orgs/index.cjs.map +1 -1
- package/dist/pages/admin/orgs/index.js +2 -3
- package/dist/pages/admin/users/index.cjs +1 -1
- package/dist/pages/admin/users/index.cjs.map +1 -1
- package/dist/pages/admin/users/index.js +2 -3
- package/dist/pages/admin/webhook-endpoints/index.cjs.map +1 -1
- package/dist/pages/admin/webhook-endpoints/index.js +1 -2
- package/dist/pages/cc/index.cjs.map +1 -1
- package/dist/pages/cc/index.js +1 -2
- package/dist/pages/dashboard/index.cjs.map +1 -1
- package/dist/pages/dashboard/index.js +1 -2
- package/dist/pages/delegations/index.cjs +1 -1
- package/dist/pages/delegations/index.cjs.map +1 -1
- package/dist/pages/delegations/index.js +2 -3
- package/dist/pages/inbox/index.cjs.map +1 -1
- package/dist/pages/inbox/index.js +1 -2
- package/dist/pages/instances/detail/index.cjs +1 -1
- package/dist/pages/instances/detail/index.cjs.map +1 -1
- package/dist/pages/instances/detail/index.js +2 -3
- package/dist/pages/instances/new/index.cjs.map +1 -1
- package/dist/pages/instances/new/index.js +1 -2
- package/dist/pages/login/index.cjs +1 -1
- package/dist/pages/login/index.cjs.map +1 -1
- package/dist/pages/login/index.js +2 -3
- package/dist/pages/root/index.cjs.map +1 -1
- package/dist/pages/root/index.js +1 -2
- package/dist/pages/search/index.cjs.map +1 -1
- package/dist/pages/search/index.js +1 -2
- package/dist/pages/sent/index.cjs.map +1 -1
- package/dist/pages/sent/index.js +1 -2
- package/dist/pages/settings/notifications/index.cjs.map +1 -1
- package/dist/pages/settings/notifications/index.js +2 -3
- package/dist/pages/templates/categories/index.cjs +1 -1
- package/dist/pages/templates/categories/index.cjs.map +1 -1
- package/dist/pages/templates/categories/index.js +2 -3
- package/dist/pages/templates/compose/index.cjs +1 -1
- package/dist/pages/templates/compose/index.cjs.map +1 -1
- package/dist/pages/templates/compose/index.js +2 -3
- package/dist/pages/templates/designer/index.cjs +1 -1
- package/dist/pages/templates/designer/index.cjs.map +1 -1
- package/dist/pages/templates/designer/index.js +2 -3
- package/dist/pages/templates/index.cjs.map +1 -1
- package/dist/pages/templates/index.js +1 -2
- package/dist/pages/templates/versions/index.cjs.map +1 -1
- package/dist/pages/templates/versions/index.js +1 -2
- package/dist/views/admin/delegations/index.cjs +1 -1
- package/dist/views/admin/delegations/index.js +1 -1
- package/dist/views/admin/index.cjs +1 -1
- package/dist/views/admin/index.js +3 -3
- package/dist/views/admin/orgs/index.cjs +1 -1
- package/dist/views/admin/orgs/index.js +1 -1
- package/dist/views/admin/users/index.cjs +1 -1
- package/dist/views/admin/users/index.js +1 -1
- package/dist/views/admin/webhook-endpoints/index.cjs +1 -1
- package/dist/views/admin/webhook-endpoints/index.cjs.map +1 -1
- package/dist/views/admin/webhook-endpoints/index.js +52 -53
- package/dist/views/admin/webhook-endpoints/index.js.map +1 -1
- package/dist/views/cc/index.cjs +1 -1
- package/dist/views/cc/index.cjs.map +1 -1
- package/dist/views/cc/index.js +2 -3
- package/dist/views/dashboard/index.cjs +1 -1
- package/dist/views/dashboard/index.cjs.map +1 -1
- package/dist/views/dashboard/index.js +2 -3
- package/dist/views/delegations/index.cjs +1 -1
- package/dist/views/delegations/index.js +1 -1
- package/dist/views/forms/builder/index.cjs +1 -1
- package/dist/views/forms/builder/index.js +1 -1
- package/dist/views/forms/renderer/index.cjs +1 -1
- package/dist/views/forms/renderer/index.js +1 -1
- package/dist/views/forms/renderer/org-unit-field-options.d.cts +44 -0
- package/dist/views/forms/renderer/org-unit-field-options.d.ts +44 -0
- package/dist/views/forms/renderer/org-unit-field.d.cts +23 -0
- package/dist/views/forms/renderer/org-unit-field.d.ts +23 -0
- package/dist/views/inbox/index.cjs +1 -1
- package/dist/views/inbox/index.cjs.map +1 -1
- package/dist/views/inbox/index.js +133 -137
- package/dist/views/inbox/index.js.map +1 -1
- package/dist/views/instances/approver-filled-form.d.cts +9 -2
- package/dist/views/instances/approver-filled-form.d.ts +9 -2
- package/dist/views/instances/detail/index.cjs +1 -1
- package/dist/views/instances/detail/index.js +1 -1
- package/dist/views/instances/detail/sections/InstanceHistorySection.d.cts +8 -1
- package/dist/views/instances/detail/sections/InstanceHistorySection.d.ts +8 -1
- package/dist/views/instances/detail/sections/container-helpers.d.cts +0 -1
- package/dist/views/instances/detail/sections/container-helpers.d.ts +0 -1
- package/dist/views/instances/detail/sections/shared.d.cts +2 -2
- package/dist/views/instances/detail/sections/shared.d.ts +2 -2
- package/dist/views/instances/new/index.cjs +1 -1
- package/dist/views/instances/new/index.cjs.map +1 -1
- package/dist/views/instances/new/index.js +24 -21
- package/dist/views/instances/new/index.js.map +1 -1
- package/dist/views/login/index.cjs +1 -1
- package/dist/views/login/index.js +1 -1
- package/dist/views/search/index.cjs +1 -1
- package/dist/views/search/index.cjs.map +1 -1
- package/dist/views/search/index.js +2 -3
- package/dist/views/sent/index.cjs +1 -1
- package/dist/views/sent/index.cjs.map +1 -1
- package/dist/views/sent/index.js +2 -3
- package/dist/views/settings/index.js +1 -1
- package/dist/views/settings/notifications/index.js +1 -1
- package/dist/views/templates/categories/index.cjs +1 -1
- package/dist/views/templates/categories/index.js +1 -1
- package/dist/views/templates/compose/index.cjs +1 -1
- package/dist/views/templates/compose/index.js +1 -1
- package/dist/views/templates/designer/approver-resolver-model.d.cts +211 -0
- package/dist/views/templates/designer/approver-resolver-model.d.ts +211 -0
- package/dist/views/templates/designer/dry-run-assignee-label.d.cts +2 -0
- package/dist/views/templates/designer/dry-run-assignee-label.d.ts +2 -0
- package/dist/views/templates/designer/dry-run-sample-data.d.cts +6 -0
- package/dist/views/templates/designer/dry-run-sample-data.d.ts +6 -0
- package/dist/views/templates/designer/dynamic-form-resolver-options.d.cts +25 -0
- package/dist/views/templates/designer/dynamic-form-resolver-options.d.ts +25 -0
- package/dist/views/templates/designer/index.cjs +1 -1
- package/dist/views/templates/designer/index.js +1 -1
- package/dist/views/templates/designer/node-actor-resolver-options.d.cts +38 -0
- package/dist/views/templates/designer/node-actor-resolver-options.d.ts +38 -0
- package/dist/views/templates/index.cjs +1 -1
- package/dist/views/templates/index.cjs.map +1 -1
- package/dist/views/templates/index.js +50 -51
- package/dist/views/templates/index.js.map +1 -1
- package/dist/views/templates/versions/index.cjs +1 -1
- package/dist/views/templates/versions/index.cjs.map +1 -1
- package/dist/views/templates/versions/index.js +7 -8
- package/dist/views/templates/versions/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunks/FormBuilderView-CUOyS07f.cjs +0 -3
- package/dist/chunks/FormBuilderView-CUOyS07f.cjs.map +0 -1
- package/dist/chunks/FormBuilderView-ClLnQ1e_.js.map +0 -1
- package/dist/chunks/FormRendererView-BsTwZkqU.js.map +0 -1
- package/dist/chunks/FormRendererView-GpsE03np.cjs +0 -4
- package/dist/chunks/FormRendererView-GpsE03np.cjs.map +0 -1
- package/dist/chunks/admin-pickers-BRHk3qKq.cjs +0 -2
- package/dist/chunks/admin-pickers-BRHk3qKq.cjs.map +0 -1
- package/dist/chunks/admin-pickers-Djq3h-UR.js.map +0 -1
- package/dist/chunks/approver-filled-form-D1DmqDVP.cjs +0 -2
- package/dist/chunks/approver-filled-form-D1DmqDVP.cjs.map +0 -1
- package/dist/chunks/approver-filled-form-DuQGPtNB.js +0 -95
- package/dist/chunks/approver-filled-form-DuQGPtNB.js.map +0 -1
- package/dist/chunks/compose-Cock_B2Q.cjs +0 -2
- package/dist/chunks/compose-Cock_B2Q.cjs.map +0 -1
- package/dist/chunks/compose-jnvnnVfN.js.map +0 -1
- package/dist/chunks/designer-B8Gvew_k.js.map +0 -1
- package/dist/chunks/designer-CAEFV1ve.cjs +0 -65
- package/dist/chunks/designer-CAEFV1ve.cjs.map +0 -1
- package/dist/chunks/detail-CExpbazF.js +0 -2629
- package/dist/chunks/detail-CExpbazF.js.map +0 -1
- package/dist/chunks/detail-DIY-L4i-.cjs +0 -2
- package/dist/chunks/detail-DIY-L4i-.cjs.map +0 -1
- package/dist/chunks/orgs-BeeDDWL1.cjs +0 -2
- package/dist/chunks/task-node-label-BF6UllxP.cjs +0 -2
- package/dist/chunks/task-node-label-BF6UllxP.cjs.map +0 -1
- package/dist/chunks/task-node-label-CWZgOBj0.js +0 -9
- package/dist/chunks/task-node-label-CWZgOBj0.js.map +0 -1
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as e } from "../../chunks/dashboard-page-
|
|
2
|
+
import { t as e } from "../../chunks/dashboard-page-BoqNhjT_.js";
|
|
3
3
|
import { jsx as t } from "react/jsx-runtime";
|
|
4
|
-
|
|
4
|
+
// src/views/dashboard/DashboardView.tsx
|
|
5
5
|
function n() {
|
|
6
6
|
return /* @__PURE__ */ t(e, {});
|
|
7
7
|
}
|
|
8
|
-
//#endregion
|
|
9
8
|
export { n as DashboardView };
|
|
10
9
|
|
|
11
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/delegations-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/delegations-BmFGcuhA.cjs");exports.DelegationsView=e.t;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { t as DelegationsView } from "../../chunks/delegations-
|
|
1
|
+
export { t as DelegationsView } from "../../chunks/delegations-BfhCDz5e.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/FormBuilderView-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/FormBuilderView-CHaAQL5v.cjs");exports.FormBuilderView=e.t;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { t as FormBuilderView } from "../../../chunks/FormBuilderView-
|
|
1
|
+
export { t as FormBuilderView } from "../../../chunks/FormBuilderView-vQfVc08Z.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/FormRendererView-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/FormRendererView-ChmM_4Yc.cjs");exports.FormRenderer=e.t,exports.FormRendererView=e.t,exports.isFormDataSourceFieldSubmissionBlocked=e.a,exports.readFormDataSourceFieldStatusMessage=e.o,exports.readFormDataSourceSubmissionBlockMessage=e.s,exports.useFormDataSourceField=e.c;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { t as FormRenderer, t as FormRendererView,
|
|
1
|
+
export { t as FormRenderer, t as FormRendererView, a as isFormDataSourceFieldSubmissionBlocked, o as readFormDataSourceFieldStatusMessage, s as readFormDataSourceSubmissionBlockMessage, c as useFormDataSourceField } from "../../../chunks/FormRendererView-CTLlG13b.js";
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { FormFieldValue } from '@rytass/bpm-core-shared/form';
|
|
2
|
+
import { OrgUnitOptionRecord } from '@rytass/bpm-core-client/organization';
|
|
3
|
+
/**
|
|
4
|
+
* One pickable organization unit, shaped for Mezzanine `AutoComplete` (`id` +
|
|
5
|
+
* `name`). `unresolved` marks a placeholder written while the stored id has no
|
|
6
|
+
* name yet (the id itself is shown) or when the server cannot give one
|
|
7
|
+
* (「未知組織」), so a real name arriving later replaces the placeholder.
|
|
8
|
+
*/
|
|
9
|
+
export type OrgUnitFieldOption = Readonly<{
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
unresolved?: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
export declare const UNKNOWN_ORG_UNIT_NAME = "\u672A\u77E5\u7D44\u7E54";
|
|
15
|
+
export declare const DELETED_ORG_UNIT_SUFFIX = "\uFF08\u5DF2\u522A\u9664\uFF09";
|
|
16
|
+
export declare function readOrgUnitFieldOption(record: OrgUnitOptionRecord): OrgUnitFieldOption;
|
|
17
|
+
/** The id stands in for the name until the lookup comes back. */
|
|
18
|
+
export declare function readPendingOrgUnitFieldOption(orgUnitId: string): OrgUnitFieldOption;
|
|
19
|
+
export declare function readUnknownOrgUnitFieldOption(orgUnitId: string): OrgUnitFieldOption;
|
|
20
|
+
/**
|
|
21
|
+
* The stored value as an option. An id nobody has named yet shows as itself;
|
|
22
|
+
* one the server could not name shows as 「未知組織」 (it is in `knownOptions` as
|
|
23
|
+
* a placeholder), so the filler can still see and replace it.
|
|
24
|
+
*/
|
|
25
|
+
export declare function readSelectedOrgUnitFieldOption(value: FormFieldValue | undefined, knownOptions: readonly OrgUnitFieldOption[]): OrgUnitFieldOption | null;
|
|
26
|
+
/**
|
|
27
|
+
* The stored id that no known option covers yet, or `null`. An id the server
|
|
28
|
+
* could not name is covered by its 「未知組織」 placeholder, so it is not asked
|
|
29
|
+
* for again.
|
|
30
|
+
*/
|
|
31
|
+
export declare function readUnresolvedOrgUnitId(value: FormFieldValue | undefined, knownOptions: readonly OrgUnitFieldOption[]): string | null;
|
|
32
|
+
/**
|
|
33
|
+
* Adds `nextOptions` to `currentOptions`. A named option replaces an unresolved
|
|
34
|
+
* placeholder with the same id, compared without regard to case like every
|
|
35
|
+
* other id match here; otherwise the first one seen wins. Returns
|
|
36
|
+
* `currentOptions` itself when nothing changed, so state setters can bail out
|
|
37
|
+
* of a re-render.
|
|
38
|
+
*/
|
|
39
|
+
export declare function mergeOrgUnitFieldOptions(currentOptions: readonly OrgUnitFieldOption[], nextOptions: readonly OrgUnitFieldOption[]): readonly OrgUnitFieldOption[];
|
|
40
|
+
/**
|
|
41
|
+
* What a picker change writes back. Nothing picked is `undefined`, the same as
|
|
42
|
+
* every other optional field.
|
|
43
|
+
*/
|
|
44
|
+
export declare function readOrgUnitFieldValue(selected: OrgUnitFieldOption | null): FormFieldValue | undefined;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { FormFieldValue } from '@rytass/bpm-core-shared/form';
|
|
2
|
+
import { OrgUnitOptionRecord } from '@rytass/bpm-core-client/organization';
|
|
3
|
+
/**
|
|
4
|
+
* One pickable organization unit, shaped for Mezzanine `AutoComplete` (`id` +
|
|
5
|
+
* `name`). `unresolved` marks a placeholder written while the stored id has no
|
|
6
|
+
* name yet (the id itself is shown) or when the server cannot give one
|
|
7
|
+
* (「未知組織」), so a real name arriving later replaces the placeholder.
|
|
8
|
+
*/
|
|
9
|
+
export type OrgUnitFieldOption = Readonly<{
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
unresolved?: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
export declare const UNKNOWN_ORG_UNIT_NAME = "\u672A\u77E5\u7D44\u7E54";
|
|
15
|
+
export declare const DELETED_ORG_UNIT_SUFFIX = "\uFF08\u5DF2\u522A\u9664\uFF09";
|
|
16
|
+
export declare function readOrgUnitFieldOption(record: OrgUnitOptionRecord): OrgUnitFieldOption;
|
|
17
|
+
/** The id stands in for the name until the lookup comes back. */
|
|
18
|
+
export declare function readPendingOrgUnitFieldOption(orgUnitId: string): OrgUnitFieldOption;
|
|
19
|
+
export declare function readUnknownOrgUnitFieldOption(orgUnitId: string): OrgUnitFieldOption;
|
|
20
|
+
/**
|
|
21
|
+
* The stored value as an option. An id nobody has named yet shows as itself;
|
|
22
|
+
* one the server could not name shows as 「未知組織」 (it is in `knownOptions` as
|
|
23
|
+
* a placeholder), so the filler can still see and replace it.
|
|
24
|
+
*/
|
|
25
|
+
export declare function readSelectedOrgUnitFieldOption(value: FormFieldValue | undefined, knownOptions: readonly OrgUnitFieldOption[]): OrgUnitFieldOption | null;
|
|
26
|
+
/**
|
|
27
|
+
* The stored id that no known option covers yet, or `null`. An id the server
|
|
28
|
+
* could not name is covered by its 「未知組織」 placeholder, so it is not asked
|
|
29
|
+
* for again.
|
|
30
|
+
*/
|
|
31
|
+
export declare function readUnresolvedOrgUnitId(value: FormFieldValue | undefined, knownOptions: readonly OrgUnitFieldOption[]): string | null;
|
|
32
|
+
/**
|
|
33
|
+
* Adds `nextOptions` to `currentOptions`. A named option replaces an unresolved
|
|
34
|
+
* placeholder with the same id, compared without regard to case like every
|
|
35
|
+
* other id match here; otherwise the first one seen wins. Returns
|
|
36
|
+
* `currentOptions` itself when nothing changed, so state setters can bail out
|
|
37
|
+
* of a re-render.
|
|
38
|
+
*/
|
|
39
|
+
export declare function mergeOrgUnitFieldOptions(currentOptions: readonly OrgUnitFieldOption[], nextOptions: readonly OrgUnitFieldOption[]): readonly OrgUnitFieldOption[];
|
|
40
|
+
/**
|
|
41
|
+
* What a picker change writes back. Nothing picked is `undefined`, the same as
|
|
42
|
+
* every other optional field.
|
|
43
|
+
*/
|
|
44
|
+
export declare function readOrgUnitFieldValue(selected: OrgUnitFieldOption | null): FormFieldValue | undefined;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { FormFieldValue } from '@rytass/bpm-core-shared/form';
|
|
3
|
+
export interface OrgUnitFieldControlProps {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly onChange: (value: FormFieldValue | undefined) => void;
|
|
6
|
+
readonly placeholder?: string;
|
|
7
|
+
readonly readonly: boolean;
|
|
8
|
+
readonly size?: 'main' | 'sub';
|
|
9
|
+
readonly value: FormFieldValue | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare const ORG_UNIT_SEARCH_FAILED_TEXT = "\u641C\u5C0B\u7D44\u7E54\u5931\u6557\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66\u3002";
|
|
12
|
+
/**
|
|
13
|
+
* 組織選擇 picker. The stored value is one organization unit id. Searching and
|
|
14
|
+
* name lookup use the picker queries open to any signed-in member
|
|
15
|
+
* (`searchOrgUnitOptions` / `resolveOrgUnitOptions`), not the designer-only
|
|
16
|
+
* organization directory.
|
|
17
|
+
*
|
|
18
|
+
* A stored id shows as itself until its name comes back, then as the name
|
|
19
|
+
* (「(已刪除)」 after it for a retired unit). An id the server cannot name
|
|
20
|
+
* — unknown, or the lookup failed — shows as 「未知組織」 and is not asked for
|
|
21
|
+
* again unless a later search returns the unit.
|
|
22
|
+
*/
|
|
23
|
+
export declare function OrgUnitFieldControl({ name, onChange, placeholder, readonly, size, value, }: OrgUnitFieldControlProps): ReactElement;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { FormFieldValue } from '@rytass/bpm-core-shared/form';
|
|
3
|
+
export interface OrgUnitFieldControlProps {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly onChange: (value: FormFieldValue | undefined) => void;
|
|
6
|
+
readonly placeholder?: string;
|
|
7
|
+
readonly readonly: boolean;
|
|
8
|
+
readonly size?: 'main' | 'sub';
|
|
9
|
+
readonly value: FormFieldValue | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare const ORG_UNIT_SEARCH_FAILED_TEXT = "\u641C\u5C0B\u7D44\u7E54\u5931\u6557\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66\u3002";
|
|
12
|
+
/**
|
|
13
|
+
* 組織選擇 picker. The stored value is one organization unit id. Searching and
|
|
14
|
+
* name lookup use the picker queries open to any signed-in member
|
|
15
|
+
* (`searchOrgUnitOptions` / `resolveOrgUnitOptions`), not the designer-only
|
|
16
|
+
* organization directory.
|
|
17
|
+
*
|
|
18
|
+
* A stored id shows as itself until its name comes back, then as the name
|
|
19
|
+
* (「(已刪除)」 after it for a retired unit). An id the server cannot name
|
|
20
|
+
* — unknown, or the lookup failed — shows as 「未知組織」 and is not asked for
|
|
21
|
+
* again unless a later search returns the unit.
|
|
22
|
+
*/
|
|
23
|
+
export declare function OrgUnitFieldControl({ name, onChange, placeholder, readonly, size, value, }: OrgUnitFieldControlProps): ReactElement;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/rolldown-runtime-BocRIvOZ.cjs"),t=require("../../chunks/
|
|
1
|
+
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/rolldown-runtime-BocRIvOZ.cjs"),t=require("../../chunks/format-date-time-D-cx5M8z.cjs"),n=require("../../chunks/auth-provider-4BeCw7cI.cjs"),r=require("../../chunks/task-decision-CqZ4WQOC.cjs"),i=require("../../chunks/router-adapter--gYs13E8.cjs"),a=require("../../chunks/routes-config-C1j_vFKo.cjs");let o=require("react"),s=require("@mezzanine-ui/react"),c=require("react/jsx-runtime"),l=require("@rytass/bpm-core-client/workflow"),u=require("@mezzanine-ui/react/ContentHeader");u=e.t(u,1);let d=require("@mezzanine-ui/icons");var f=100,p={display:`grid`,gap:`var(--mzn-spacing-gap-base)`,marginBottom:`var(--mzn-spacing-padding-vertical-spacious)`};function m(){let e=i.r(),r=a.r(),{member:f}=n.n(),m=f?.memberId??null,[_,b]=(0,o.useState)(`pending`),[x,S]=(0,o.useState)(null),[C,T]=(0,o.useState)([]),[D,k]=(0,o.useState)(!0),[A,j]=(0,o.useState)([]),[M,P]=(0,o.useState)([]),[F,I]=(0,o.useState)(!1);(0,o.useEffect)(()=>{m&&G()},[m]);let L=(0,o.useMemo)(()=>[{dataIndex:`caseTitle`,key:`caseTitle`,title:`案件`,width:280},{dataIndex:`nodeText`,key:`nodeText`,title:`節點`,width:180},{dataIndex:`statusLabel`,key:`statusLabel`,title:`狀態`,width:120},{key:`fill`,render:e=>e.hasFillableFields?(0,c.jsx)(s.Badge,{size:`sub`,text:`需補填`,variant:`dot-warning`}):null,title:`補填`,width:120},{key:`slaDueAt`,render:e=>(0,c.jsx)(s.Typography,{color:e.slaStatusColor,component:`span`,variant:`body`,children:e.slaStatusText}),title:`SLA`,width:180},{key:`createdAt`,render:e=>(0,c.jsx)(s.Typography,{component:`span`,variant:`body`,children:t.t(e.createdAt)}),title:`建立時間`,width:220}],[]),R=(0,o.useMemo)(()=>({render:t=>[{name:`處理`,onClick:()=>e.push(r.caseDetail(t.instanceId))}],variant:`base-secondary`,width:88}),[e,r]),z=(0,o.useMemo)(()=>[{dataIndex:`caseTitle`,key:`caseTitle`,title:`案件`,width:280},{key:`startedAt`,render:e=>(0,c.jsx)(s.Typography,{component:`span`,variant:`body`,children:t.t(e.startedAt)}),title:`發起時間`,width:220}],[]),B=(0,o.useMemo)(()=>({render:t=>[{name:`重新送出`,onClick:()=>e.push(r.caseDetail(t.id))}],variant:`base-secondary`,width:120}),[e,r]),V=(0,o.useMemo)(()=>[{dataIndex:`caseTitle`,key:`caseTitle`,title:`案件`,width:280},{dataIndex:`nodeText`,key:`nodeText`,title:`節點`,width:180},{key:`decisionLabel`,render:e=>(0,c.jsx)(s.Typography,{color:w(e.decisionAction),component:`span`,variant:`body`,children:e.decisionLabel}),title:`決議`,width:120},{key:`decisionComment`,render:e=>(0,c.jsx)(s.Typography,{component:`span`,variant:`body`,children:e.decisionCommentText}),title:`意見`,width:240},{key:`instanceStateLabel`,render:e=>(0,c.jsx)(s.Typography,{color:E(e.instanceState),component:`span`,variant:`body`,children:e.instanceStateLabel}),title:`流程狀態`,width:140},{key:`decidedAt`,render:e=>(0,c.jsx)(s.Typography,{component:`span`,variant:`body`,children:O(e.decidedAt)}),title:`簽核時間`,width:220}],[]),H=(0,o.useMemo)(()=>({render:t=>[{name:`查看`,onClick:()=>e.push(r.caseDetail(t.instanceId))}],variant:`base-secondary`,width:88}),[e,r]),U=(0,o.useMemo)(()=>C.filter(e=>e.instanceState===`RUNNING`),[C]);function W(e){b(e===`history`||e===`pending`||e===`tracking`?e:`pending`)}async function G(){k(!0),S(null);try{if(!m){j([]),T([]),P([]),I(!1);return}let[e,t,n]=await Promise.all([(0,l.listInboxTasks)(m),(0,l.listApprovalHistoryTasks)(m),g(m)]),[r,i]=await Promise.all([v(e),y(t,m)]);j(r),T(i),P(n?.rows??[]),I(n?.truncated??!1)}catch(e){S(N(e))}finally{k(!1)}}return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.PageHeader,{children:(0,c.jsx)(u.default,{description:`目前以 ${f?.name??m??`目前登入會員`} 查詢待處理與歷史簽核任務。`,title:`我的待簽`,children:(0,c.jsx)(s.Button,{icon:d.PlusIcon,iconType:`leading`,onClick:()=>e.push(r.caseNew()),variant:`base-primary`,children:`發起簽核`})})}),(0,c.jsx)(s.SectionGroup,{children:(0,c.jsxs)(s.Section,{children:[x?(0,c.jsx)(s.Typography,{color:`text-error`,variant:`body`,children:x}):null,(0,c.jsxs)(s.Tab,{activeKey:_,onChange:W,size:`sub`,children:[(0,c.jsx)(s.TabItem,{badgeCount:D?void 0:A.length,children:`待簽核`},`pending`),(0,c.jsx)(s.TabItem,{badgeCount:D?void 0:U.length,children:`已處理未結束`},`tracking`),(0,c.jsx)(s.TabItem,{children:`歷史簽核記錄`},`history`)]}),_===`pending`&&(M.length>0||F)?(0,c.jsxs)(`div`,{"data-returned-instances":``,style:p,children:[M.length>0?(0,c.jsx)(s.Typography,{component:`h2`,variant:`label-primary`,children:`被退回待重送`}):null,(0,c.jsx)(s.Typography,{color:`text-neutral`,variant:`caption`,children:h(M.length>0,F)}),M.length>0?(0,c.jsx)(s.Table,{actions:B,columns:z,dataSource:[...M],fullWidth:!0}):null]}):null,_===`pending`?(0,c.jsx)(s.Table,{actions:R,columns:L,dataSource:A,fullWidth:!0,loading:D}):null,_===`tracking`?(0,c.jsx)(s.Table,{actions:H,columns:V,dataSource:U,fullWidth:!0,loading:D}):null,_===`history`?(0,c.jsx)(s.Table,{actions:H,columns:V,dataSource:C,fullWidth:!0,loading:D}):null]})})]})}function h(e,t){return e?t?`你發起的案件被退回,請修改後重新送出。可能還有其他被退回的案件,請到「我發起的」查看。`:`你發起的案件被退回,請修改後重新送出。`:`前 ${f} 筆被退回的案件中沒有你發起的,可能還有其他被退回的案件,請到「我發起的」查看。`}async function g(e){try{let t=await(0,l.listApprovalInstancesPage)({page:1,pageSize:f,searchText:null,state:`RETURNED`,templateId:null,view:`SENT`});return{rows:_(t.instances,e),truncated:t.totalCount>t.instances.length}}catch{return null}}function _(e,t){return e.filter(e=>e.initiatorMemberId===t).map(e=>({caseTitle:(0,l.readApprovalInstanceCaseTitle)(e),id:e.id,key:e.id,startedAt:e.startedAt}))}async function v(e){let t=await b(e);return e.map((e,n)=>({...e,caseTitle:x(e,t[n]??null),key:e.id,nodeText:r.o(e),slaStatusColor:A(e.slaDueAt),slaStatusText:k(e.slaDueAt),statusLabel:M(e.status)}))}async function y(e,t){let[n,i]=await Promise.all([Promise.all(e.map(e=>(0,l.listTaskDecisions)(e.id))),b(e)]);return e.map((e,a)=>{let o=n[a]??[],s=S(o,t),c=i[a]??null;return{...e,caseTitle:x(e,c),decisionAction:s?.action??null,decisionComment:s?.comment??null,decisionCommentText:D(s?.comment??null),decisionLabel:C(s?.action??null),decidedAt:s?.decidedAt??(o.length===0?e.completedAt:null),instanceState:c?.state??null,instanceStateLabel:T(c?.state??null),key:e.id,nodeText:r.o(e)}})}async function b(e){return Promise.all(e.map(async e=>{try{return(await(0,l.readApprovalInstance)(e.instanceId)).instance}catch{return null}}))}function x(e,t){return t?(0,l.readApprovalInstanceCaseTitle)(t):e.instanceId}function S(e,t){return r.i(e.filter(e=>e.decidedByMemberId===t))}function C(e){return e===`APPROVED`?`同意`:e===`REJECTED`?`拒絕`:e===`RETURNED`?`退回`:e===`TRANSFERRED`?`轉派`:`未記錄`}function w(e){return e===`APPROVED`?`text-success`:e===`REJECTED`||e===`RETURNED`?`text-error`:`text-neutral`}function T(e){return e===`RUNNING`?`進行中`:e===`APPROVED`?`已通過`:e===`REJECTED`?`已拒絕`:e===`RETURNED`?`已退回`:e===`CANCELLED`?`已取消`:e===`EXPIRED`?`已逾期`:e===`DRAFT`?`草稿`:`-`}function E(e){return e===`APPROVED`?`text-success`:e===`REJECTED`||e===`CANCELLED`||e===`EXPIRED`?`text-error`:`text-neutral`}function D(e){return(e?.trim()??``)||`-`}function O(e){return t.t(e)}function k(e){if(!e)return`-`;let t=new Date(e).getTime(),n=Date.now(),r=j(Math.abs(t-n));return t<n?`已逾期 ${r}`:`剩餘 ${r}`}function A(e){return e?new Date(e).getTime()<Date.now()?`text-error`:`text-success`:`text-neutral`}function j(e){let t=Math.max(1,Math.ceil(e/6e4)),n=Math.floor(t/1440),r=Math.floor(t%1440/60),i=t%60;return n>0?`${n}天 ${r}小時`:r>0?`${r}小時 ${i}分鐘`:`${i}分鐘`}function M(e){return e===`PENDING`?`待處理`:e===`IN_PROGRESS`?`處理中`:e===`COMPLETED`?`已完成`:e===`TRANSFERRED`?`已轉派`:e===`CANCELLED`?`已取消`:e}function N(e){return e instanceof Error?e.message:`發生未知錯誤`}exports.InboxView=m;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["useRouterAdapter","useBPMRoutes","useAuth","useState","useMemo","Badge","Typography","formatDateTime","listInboxTasks","listApprovalHistoryTasks","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","Tab","TabItem","Table","listApprovalInstancesPage","readApprovalInstanceCaseTitle","readTaskNodeText","listTaskDecisions","readApprovalInstance","require_rolldown_runtime","require_router_adapter","require_auth_provider","require_format_date_time","require_routes_config","require_task_node_label","react","_mezzanine_ui_react","react_jsx_runtime","_rytass_bpm_core_client_workflow","_mezzanine_ui_react_ContentHeader","_mezzanine_ui_icons","RETURNED_INSTANCE_PAGE_SIZE","RETURNED_SECTION_STYLE","InboxView","router","routes","currentMemberId","member","activeTab","setActiveTab","error","setError","historyRows","setHistoryRows","loading","setLoading","pendingRows","setPendingRows","returnedRows","setReturnedRows","returnedTruncated","setReturnedTruncated","refreshTasks","pendingColumns","record","pendingTableActions","returnedColumns","returnedTableActions","historyColumns","readTaskDecisionColor","readInstanceStateColor","formatHistoryDateTime","historyTableActions","trackingRows","row","handleTabChange","activeKey","nextPendingTasks","nextHistoryTasks","returned","readReturnedInstances","nextPendingRows","nextHistoryRows","readInboxTaskRows","readApprovalHistoryRows","requestError","readErrorMessage","readReturnedSectionHint","hasRows","truncated","page","readReturnedInstanceRows","instances","instance","readTaskInstances","tasks","task","readTaskCaseTitle","index","readSlaStatusColor","readSlaStatusText","readTaskStatusLabel","decisionLists","decision","readLatestTaskDecision","readDecisionCommentText","readTaskDecisionLabel","readInstanceStateLabel","decisions","compareTaskDecisionDesc","right","left","action","state","comment","value","dueAt","now","label","formatDuration","totalMinutes","days","hours","minutes","status"],"sources":["../../../src/views/inbox/InboxView.tsx"],"sourcesContent":["'use client';\n\nimport {\n type CSSProperties,\n type Key,\n ReactElement,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n Badge,\n Button,\n PageHeader,\n Section,\n SectionGroup,\n Tab,\n TabItem,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport {\n ApprovalInstanceRecord,\n type ApprovalInstancesPageResult,\n listApprovalHistoryTasks,\n listApprovalInstancesPage,\n listInboxTasks,\n listTaskDecisions,\n readApprovalInstance,\n readApprovalInstanceCaseTitle,\n TaskDecisionRecord,\n TaskRecord,\n} from '@rytass/bpm-core-client/workflow';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useAuth } from '../../lib/auth-provider';\nimport { readTaskNodeText } from '../../lib/task-node-label';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\n\ntype InboxTabKey = 'history' | 'pending' | 'tracking';\n\ntype InboxTaskRow = Readonly<\n Record<string, unknown> &\n TaskRecord & {\n caseTitle: string;\n key: string;\n nodeText: string;\n slaStatusColor: 'text-error' | 'text-neutral' | 'text-success';\n slaStatusText: string;\n statusLabel: string;\n }\n>;\n\ntype ReturnedInstanceRow = Readonly<{\n caseTitle: string;\n id: string;\n key: string;\n startedAt: string | null;\n}>;\n\n/** The server caps a page at 100; more than that is left to 我發起的. */\nconst RETURNED_INSTANCE_PAGE_SIZE = 100;\n\nconst RETURNED_SECTION_STYLE: CSSProperties = {\n display: 'grid',\n gap: 'var(--mzn-spacing-gap-base)',\n marginBottom: 'var(--mzn-spacing-padding-vertical-spacious)',\n};\n\ntype ApprovalHistoryRow = Readonly<\n Record<string, unknown> &\n TaskRecord & {\n caseTitle: string;\n decisionAction: TaskDecisionRecord['action'] | null;\n decisionComment: string | null;\n decisionCommentText: string;\n decisionLabel: string;\n decidedAt: string | null;\n instanceState: ApprovalInstanceRecord['state'] | null;\n instanceStateLabel: string;\n key: string;\n nodeText: string;\n }\n>;\n\n\n/**\n * Framework-agnostic view for the BPM \"我的待簽\" inbox. Mechanical port of\n * `apps/client/src/app/inbox/page.tsx` — renders pending tasks, tracking,\n * and history tabs.\n */\nexport function InboxView(): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [activeTab, setActiveTab] = useState<InboxTabKey>('pending');\n const [error, setError] = useState<string | null>(null);\n const [historyRows, setHistoryRows] = useState<ApprovalHistoryRow[]>([]);\n const [loading, setLoading] = useState(true);\n const [pendingRows, setPendingRows] = useState<InboxTaskRow[]>([]);\n const [returnedRows, setReturnedRows] = useState<\n readonly ReturnedInstanceRow[]\n >([]);\n const [returnedTruncated, setReturnedTruncated] = useState(false);\n\n useEffect((): void => {\n if (!currentMemberId) {\n return;\n }\n\n void refreshTasks();\n }, [currentMemberId]);\n\n const pendingColumns = useMemo(\n (): TableColumn<InboxTaskRow>[] => [\n { dataIndex: 'caseTitle', key: 'caseTitle', title: '案件', width: 280 },\n { dataIndex: 'nodeText', key: 'nodeText', title: '節點', width: 180 },\n {\n dataIndex: 'statusLabel',\n key: 'statusLabel',\n title: '狀態',\n width: 120,\n },\n {\n key: 'fill',\n // Approving one of these needs the case page, where the fill is entered.\n render: (record: InboxTaskRow): ReactElement | null =>\n record.hasFillableFields ? (\n <Badge size=\"sub\" text=\"需補填\" variant=\"dot-warning\" />\n ) : null,\n title: '補填',\n width: 120,\n },\n {\n key: 'slaDueAt',\n render: (record: InboxTaskRow): ReactElement => (\n <Typography\n color={record.slaStatusColor}\n component=\"span\"\n variant=\"body\"\n >\n {record.slaStatusText}\n </Typography>\n ),\n title: 'SLA',\n width: 180,\n },\n {\n key: 'createdAt',\n render: (record: InboxTaskRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.createdAt)}\n </Typography>\n ),\n title: '建立時間',\n width: 220,\n },\n ],\n [],\n );\n const pendingTableActions = useMemo(\n (): TableActions<InboxTaskRow> => ({\n render: (record): ReturnType<TableActions<InboxTaskRow>['render']> => [\n {\n name: '處理',\n onClick: (): void => router.push(routes.caseDetail(record.instanceId)),\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [router, routes],\n );\n const returnedColumns = useMemo(\n (): TableColumn<ReturnedInstanceRow>[] => [\n { dataIndex: 'caseTitle', key: 'caseTitle', title: '案件', width: 280 },\n {\n key: 'startedAt',\n render: (record: ReturnedInstanceRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startedAt)}\n </Typography>\n ),\n title: '發起時間',\n width: 220,\n },\n ],\n [],\n );\n const returnedTableActions = useMemo(\n (): TableActions<ReturnedInstanceRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<ReturnedInstanceRow>['render']> => [\n {\n name: '重新送出',\n onClick: (): void => router.push(routes.caseDetail(record.id)),\n },\n ],\n variant: 'base-secondary',\n width: 120,\n }),\n [router, routes],\n );\n const historyColumns = useMemo(\n (): TableColumn<ApprovalHistoryRow>[] => [\n { dataIndex: 'caseTitle', key: 'caseTitle', title: '案件', width: 280 },\n { dataIndex: 'nodeText', key: 'nodeText', title: '節點', width: 180 },\n {\n key: 'decisionLabel',\n render: (record: ApprovalHistoryRow): ReactElement => (\n <Typography\n color={readTaskDecisionColor(record.decisionAction)}\n component=\"span\"\n variant=\"body\"\n >\n {record.decisionLabel}\n </Typography>\n ),\n title: '決議',\n width: 120,\n },\n {\n key: 'decisionComment',\n render: (record: ApprovalHistoryRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.decisionCommentText}\n </Typography>\n ),\n title: '意見',\n width: 240,\n },\n {\n key: 'instanceStateLabel',\n render: (record: ApprovalHistoryRow): ReactElement => (\n <Typography\n color={readInstanceStateColor(record.instanceState)}\n component=\"span\"\n variant=\"body\"\n >\n {record.instanceStateLabel}\n </Typography>\n ),\n title: '流程狀態',\n width: 140,\n },\n {\n key: 'decidedAt',\n render: (record: ApprovalHistoryRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatHistoryDateTime(record.decidedAt)}\n </Typography>\n ),\n title: '簽核時間',\n width: 220,\n },\n ],\n [],\n );\n const historyTableActions = useMemo(\n (): TableActions<ApprovalHistoryRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<ApprovalHistoryRow>['render']> => [\n {\n name: '查看',\n onClick: (): void => router.push(routes.caseDetail(record.instanceId)),\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [router, routes],\n );\n const trackingRows = useMemo(\n (): ApprovalHistoryRow[] =>\n historyRows.filter((row) => row.instanceState === 'RUNNING'),\n [historyRows],\n );\n\n function handleTabChange(activeKey: Key): void {\n if (\n activeKey === 'history' ||\n activeKey === 'pending' ||\n activeKey === 'tracking'\n ) {\n setActiveTab(activeKey);\n return;\n }\n\n setActiveTab('pending');\n }\n\n async function refreshTasks(): Promise<void> {\n setLoading(true);\n setError(null);\n\n try {\n if (!currentMemberId) {\n setPendingRows([]);\n setHistoryRows([]);\n setReturnedRows([]);\n setReturnedTruncated(false);\n return;\n }\n\n const [nextPendingTasks, nextHistoryTasks, returned] =\n await Promise.all([\n listInboxTasks(currentMemberId),\n listApprovalHistoryTasks(currentMemberId),\n readReturnedInstances(currentMemberId),\n ]);\n const [nextPendingRows, nextHistoryRows] = await Promise.all([\n readInboxTaskRows(nextPendingTasks),\n readApprovalHistoryRows(nextHistoryTasks),\n ]);\n\n setPendingRows(nextPendingRows);\n setHistoryRows(nextHistoryRows);\n setReturnedRows(returned?.rows ?? []);\n setReturnedTruncated(returned?.truncated ?? false);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description={`目前以 ${member?.name ?? currentMemberId ?? '目前登入會員'} 查詢待處理與歷史簽核任務。`}\n title=\"我的待簽\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => router.push(routes.caseNew())}\n variant=\"base-primary\"\n >\n 發起簽核\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Tab activeKey={activeTab} onChange={handleTabChange} size=\"sub\">\n <TabItem\n badgeCount={loading ? undefined : pendingRows.length}\n key=\"pending\"\n >\n 待簽核\n </TabItem>\n <TabItem\n badgeCount={loading ? undefined : trackingRows.length}\n key=\"tracking\"\n >\n 已處理未結束\n </TabItem>\n <TabItem key=\"history\">歷史簽核記錄</TabItem>\n </Tab>\n\n {/* A truncated page with none of the member's own cases still\n points to 我發起的: theirs may sit past the first page. */}\n {activeTab === 'pending' &&\n (returnedRows.length > 0 || returnedTruncated) ? (\n <div data-returned-instances=\"\" style={RETURNED_SECTION_STYLE}>\n {/* Without rows there is nothing here to resubmit, only the\n pointer to 我發起的. */}\n {returnedRows.length > 0 ? (\n <Typography component=\"h2\" variant=\"label-primary\">\n 被退回待重送\n </Typography>\n ) : null}\n <Typography color=\"text-neutral\" variant=\"caption\">\n {readReturnedSectionHint(\n returnedRows.length > 0,\n returnedTruncated,\n )}\n </Typography>\n {returnedRows.length > 0 ? (\n <Table\n actions={returnedTableActions}\n columns={returnedColumns}\n dataSource={[...returnedRows]}\n fullWidth\n />\n ) : null}\n </div>\n ) : null}\n {activeTab === 'pending' ? (\n <Table\n actions={pendingTableActions}\n columns={pendingColumns}\n dataSource={pendingRows}\n fullWidth\n loading={loading}\n />\n ) : null}\n {activeTab === 'tracking' ? (\n <Table\n actions={historyTableActions}\n columns={historyColumns}\n dataSource={trackingRows}\n fullWidth\n loading={loading}\n />\n ) : null}\n {activeTab === 'history' ? (\n <Table\n actions={historyTableActions}\n columns={historyColumns}\n dataSource={historyRows}\n fullWidth\n loading={loading}\n />\n ) : null}\n </Section>\n </SectionGroup>\n </>\n );\n}\n\nfunction readReturnedSectionHint(\n hasRows: boolean,\n truncated: boolean,\n): string {\n if (!hasRows) {\n return `前 ${RETURNED_INSTANCE_PAGE_SIZE} 筆被退回的案件中沒有你發起的,可能還有其他被退回的案件,請到「我發起的」查看。`;\n }\n\n return truncated\n ? '你發起的案件被退回,請修改後重新送出。可能還有其他被退回的案件,請到「我發起的」查看。'\n : '你發起的案件被退回,請修改後重新送出。';\n}\n\n/**\n * Returned cases are a side list: a failure here, in the request or in reading\n * its rows, hides that section instead of taking the pending and history tasks\n * down with it.\n */\nasync function readReturnedInstances(\n currentMemberId: string,\n): Promise<Readonly<{\n rows: readonly ReturnedInstanceRow[];\n truncated: boolean;\n}> | null> {\n try {\n // SENT also lists cases filed on someone else's behalf; only the\n // initiator may resubmit, so those are filtered out here.\n const page: ApprovalInstancesPageResult = await listApprovalInstancesPage({\n page: 1,\n pageSize: RETURNED_INSTANCE_PAGE_SIZE,\n searchText: null,\n state: 'RETURNED',\n templateId: null,\n view: 'SENT',\n });\n\n return {\n rows: readReturnedInstanceRows(page.instances, currentMemberId),\n // The total includes cases filed for someone else, so compare it with\n // what this page fetched rather than with the rows kept.\n truncated: page.totalCount > page.instances.length,\n };\n } catch {\n return null;\n }\n}\n\nfunction readReturnedInstanceRows(\n instances: readonly ApprovalInstanceRecord[],\n currentMemberId: string,\n): readonly ReturnedInstanceRow[] {\n return instances\n .filter(\n (instance): boolean => instance.initiatorMemberId === currentMemberId,\n )\n .map(\n (instance): ReturnedInstanceRow => ({\n caseTitle: readApprovalInstanceCaseTitle(instance),\n id: instance.id,\n key: instance.id,\n startedAt: instance.startedAt,\n }),\n );\n}\n\nasync function readInboxTaskRows(\n tasks: readonly TaskRecord[],\n): Promise<InboxTaskRow[]> {\n const instances = await readTaskInstances(tasks);\n\n return tasks.map(\n (task, index): InboxTaskRow => ({\n ...task,\n caseTitle: readTaskCaseTitle(task, instances[index] ?? null),\n key: task.id,\n nodeText: readTaskNodeText(task),\n slaStatusColor: readSlaStatusColor(task.slaDueAt),\n slaStatusText: readSlaStatusText(task.slaDueAt),\n statusLabel: readTaskStatusLabel(task.status),\n }),\n );\n}\n\nasync function readApprovalHistoryRows(\n tasks: readonly TaskRecord[],\n): Promise<ApprovalHistoryRow[]> {\n const [decisionLists, instances] = await Promise.all([\n Promise.all(tasks.map((task) => listTaskDecisions(task.id))),\n readTaskInstances(tasks),\n ]);\n\n return tasks.map((task, index): ApprovalHistoryRow => {\n const decision = readLatestTaskDecision(decisionLists[index] ?? []);\n const instance = instances[index] ?? null;\n\n return {\n ...task,\n caseTitle: readTaskCaseTitle(task, instance),\n decisionAction: decision?.action ?? null,\n decisionComment: decision?.comment ?? null,\n decisionCommentText: readDecisionCommentText(decision?.comment ?? null),\n decisionLabel: readTaskDecisionLabel(decision?.action ?? null),\n decidedAt: decision?.decidedAt ?? task.completedAt,\n instanceState: instance?.state ?? null,\n instanceStateLabel: readInstanceStateLabel(instance?.state ?? null),\n key: task.id,\n nodeText: readTaskNodeText(task),\n };\n });\n}\n\nasync function readTaskInstances(\n tasks: readonly TaskRecord[],\n): Promise<readonly (ApprovalInstanceRecord | null)[]> {\n return Promise.all(\n tasks.map(async (task): Promise<ApprovalInstanceRecord | null> => {\n try {\n return (await readApprovalInstance(task.instanceId)).instance;\n } catch {\n return null;\n }\n }),\n );\n}\n\nfunction readTaskCaseTitle(\n task: TaskRecord,\n instance: ApprovalInstanceRecord | null,\n): string {\n return instance ? readApprovalInstanceCaseTitle(instance) : task.instanceId;\n}\n\nfunction readLatestTaskDecision(\n decisions: readonly TaskDecisionRecord[],\n): TaskDecisionRecord | null {\n return [...decisions].sort(compareTaskDecisionDesc)[0] ?? null;\n}\n\nfunction compareTaskDecisionDesc(\n left: TaskDecisionRecord,\n right: TaskDecisionRecord,\n): number {\n return (\n new Date(right.decidedAt).getTime() - new Date(left.decidedAt).getTime()\n );\n}\n\nfunction readTaskDecisionLabel(\n action: TaskDecisionRecord['action'] | null,\n): string {\n if (action === 'APPROVED') {\n return '同意';\n }\n\n if (action === 'REJECTED') {\n return '拒絕';\n }\n\n if (action === 'RETURNED') {\n return '退回';\n }\n\n if (action === 'TRANSFERRED') {\n return '轉派';\n }\n\n return '未記錄';\n}\n\nfunction readTaskDecisionColor(\n action: TaskDecisionRecord['action'] | null,\n): 'text-error' | 'text-neutral' | 'text-success' {\n if (action === 'APPROVED') {\n return 'text-success';\n }\n\n if (action === 'REJECTED' || action === 'RETURNED') {\n return 'text-error';\n }\n\n return 'text-neutral';\n}\n\nfunction readInstanceStateLabel(\n state: ApprovalInstanceRecord['state'] | null,\n): string {\n if (state === 'RUNNING') {\n return '進行中';\n }\n\n if (state === 'APPROVED') {\n return '已通過';\n }\n\n if (state === 'REJECTED') {\n return '已拒絕';\n }\n\n if (state === 'RETURNED') {\n return '已退回';\n }\n\n if (state === 'CANCELLED') {\n return '已取消';\n }\n\n if (state === 'EXPIRED') {\n return '已逾期';\n }\n\n if (state === 'DRAFT') {\n return '草稿';\n }\n\n return '-';\n}\n\nfunction readInstanceStateColor(\n state: ApprovalInstanceRecord['state'] | null,\n): 'text-error' | 'text-neutral' | 'text-success' {\n if (state === 'APPROVED') {\n return 'text-success';\n }\n\n if (state === 'REJECTED' || state === 'CANCELLED' || state === 'EXPIRED') {\n return 'text-error';\n }\n\n return 'text-neutral';\n}\n\nfunction readDecisionCommentText(comment: string | null): string {\n const trimmedComment = comment?.trim() ?? '';\n\n return trimmedComment || '-';\n}\n\nfunction formatHistoryDateTime(value: string | null): string {\n return formatDateTime(value);\n}\n\nfunction readSlaStatusText(value: string | null): string {\n if (!value) {\n return '-';\n }\n\n const dueAt = new Date(value).getTime();\n const now = Date.now();\n const diffMs = Math.abs(dueAt - now);\n const label = formatDuration(diffMs);\n\n return dueAt < now ? `已逾期 ${label}` : `剩餘 ${label}`;\n}\n\nfunction readSlaStatusColor(\n value: string | null,\n): 'text-error' | 'text-neutral' | 'text-success' {\n if (!value) {\n return 'text-neutral';\n }\n\n return new Date(value).getTime() < Date.now() ? 'text-error' : 'text-success';\n}\n\nfunction formatDuration(value: number): string {\n const totalMinutes = Math.max(1, Math.ceil(value / 60_000));\n const days = Math.floor(totalMinutes / 1440);\n const hours = Math.floor((totalMinutes % 1440) / 60);\n const minutes = totalMinutes % 60;\n\n if (days > 0) {\n return `${days}天 ${hours}小時`;\n }\n\n if (hours > 0) {\n return `${hours}小時 ${minutes}分鐘`;\n }\n\n return `${minutes}分鐘`;\n}\n\nfunction readTaskStatusLabel(status: TaskRecord['status']): string {\n if (status === 'PENDING') {\n return '待處理';\n }\n\n if (status === 'IN_PROGRESS') {\n return '處理中';\n }\n\n if (status === 'COMPLETED') {\n return '已完成';\n }\n\n if (status === 'TRANSFERRED') {\n return '已轉派';\n }\n\n if (status === 'CANCELLED') {\n return '已取消';\n }\n\n return status;\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["useRouterAdapter","useBPMRoutes","useAuth","useState","useMemo","Badge","Typography","formatDateTime","listInboxTasks","listApprovalHistoryTasks","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","Tab","TabItem","Table","listApprovalInstancesPage","readApprovalInstanceCaseTitle","readTaskNodeText","listTaskDecisions","readApprovalInstance","readLatestTaskDecision","require_rolldown_runtime","require_format_date_time","require_auth_provider","require_task_decision","require_router_adapter","require_routes_config","react","_mezzanine_ui_react","react_jsx_runtime","_rytass_bpm_core_client_workflow","_mezzanine_ui_react_ContentHeader","_mezzanine_ui_icons","RETURNED_INSTANCE_PAGE_SIZE","RETURNED_SECTION_STYLE","InboxView","router","routes","currentMemberId","member","activeTab","setActiveTab","error","setError","historyRows","setHistoryRows","loading","setLoading","pendingRows","setPendingRows","returnedRows","setReturnedRows","returnedTruncated","setReturnedTruncated","refreshTasks","pendingColumns","record","pendingTableActions","returnedColumns","returnedTableActions","historyColumns","readTaskDecisionColor","readInstanceStateColor","formatHistoryDateTime","historyTableActions","trackingRows","row","handleTabChange","activeKey","nextPendingTasks","nextHistoryTasks","returned","readReturnedInstances","nextPendingRows","nextHistoryRows","readInboxTaskRows","readApprovalHistoryRows","requestError","readErrorMessage","readReturnedSectionHint","hasRows","truncated","page","readReturnedInstanceRows","instances","instance","readTaskInstances","tasks","task","readTaskCaseTitle","index","readSlaStatusColor","readSlaStatusText","readTaskStatusLabel","decisionLists","decisions","decision","readLatestOwnTaskDecision","readDecisionCommentText","readTaskDecisionLabel","readInstanceStateLabel","action","state","comment","value","dueAt","now","label","formatDuration","totalMinutes","days","hours","minutes","status"],"sources":["../../../src/views/inbox/InboxView.tsx"],"sourcesContent":["'use client';\n\nimport {\n type CSSProperties,\n type Key,\n ReactElement,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n Badge,\n Button,\n PageHeader,\n Section,\n SectionGroup,\n Tab,\n TabItem,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport {\n ApprovalInstanceRecord,\n type ApprovalInstancesPageResult,\n listApprovalHistoryTasks,\n listApprovalInstancesPage,\n listInboxTasks,\n listTaskDecisions,\n readApprovalInstance,\n readApprovalInstanceCaseTitle,\n TaskDecisionRecord,\n TaskRecord,\n} from '@rytass/bpm-core-client/workflow';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useAuth } from '../../lib/auth-provider';\nimport { readTaskNodeText } from '../../lib/task-node-label';\nimport { readLatestTaskDecision } from '../../lib/task-decision';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\n\ntype InboxTabKey = 'history' | 'pending' | 'tracking';\n\ntype InboxTaskRow = Readonly<\n Record<string, unknown> &\n TaskRecord & {\n caseTitle: string;\n key: string;\n nodeText: string;\n slaStatusColor: 'text-error' | 'text-neutral' | 'text-success';\n slaStatusText: string;\n statusLabel: string;\n }\n>;\n\ntype ReturnedInstanceRow = Readonly<{\n caseTitle: string;\n id: string;\n key: string;\n startedAt: string | null;\n}>;\n\n/** The server caps a page at 100; more than that is left to 我發起的. */\nconst RETURNED_INSTANCE_PAGE_SIZE = 100;\n\nconst RETURNED_SECTION_STYLE: CSSProperties = {\n display: 'grid',\n gap: 'var(--mzn-spacing-gap-base)',\n marginBottom: 'var(--mzn-spacing-padding-vertical-spacious)',\n};\n\ntype ApprovalHistoryRow = Readonly<\n Record<string, unknown> &\n TaskRecord & {\n caseTitle: string;\n decisionAction: TaskDecisionRecord['action'] | null;\n decisionComment: string | null;\n decisionCommentText: string;\n decisionLabel: string;\n decidedAt: string | null;\n instanceState: ApprovalInstanceRecord['state'] | null;\n instanceStateLabel: string;\n key: string;\n nodeText: string;\n }\n>;\n\n\n/**\n * Framework-agnostic view for the BPM \"我的待簽\" inbox. Mechanical port of\n * `apps/client/src/app/inbox/page.tsx` — renders pending tasks, tracking,\n * and history tabs.\n */\nexport function InboxView(): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [activeTab, setActiveTab] = useState<InboxTabKey>('pending');\n const [error, setError] = useState<string | null>(null);\n const [historyRows, setHistoryRows] = useState<ApprovalHistoryRow[]>([]);\n const [loading, setLoading] = useState(true);\n const [pendingRows, setPendingRows] = useState<InboxTaskRow[]>([]);\n const [returnedRows, setReturnedRows] = useState<\n readonly ReturnedInstanceRow[]\n >([]);\n const [returnedTruncated, setReturnedTruncated] = useState(false);\n\n useEffect((): void => {\n if (!currentMemberId) {\n return;\n }\n\n void refreshTasks();\n }, [currentMemberId]);\n\n const pendingColumns = useMemo(\n (): TableColumn<InboxTaskRow>[] => [\n { dataIndex: 'caseTitle', key: 'caseTitle', title: '案件', width: 280 },\n { dataIndex: 'nodeText', key: 'nodeText', title: '節點', width: 180 },\n {\n dataIndex: 'statusLabel',\n key: 'statusLabel',\n title: '狀態',\n width: 120,\n },\n {\n key: 'fill',\n // Approving one of these needs the case page, where the fill is entered.\n render: (record: InboxTaskRow): ReactElement | null =>\n record.hasFillableFields ? (\n <Badge size=\"sub\" text=\"需補填\" variant=\"dot-warning\" />\n ) : null,\n title: '補填',\n width: 120,\n },\n {\n key: 'slaDueAt',\n render: (record: InboxTaskRow): ReactElement => (\n <Typography\n color={record.slaStatusColor}\n component=\"span\"\n variant=\"body\"\n >\n {record.slaStatusText}\n </Typography>\n ),\n title: 'SLA',\n width: 180,\n },\n {\n key: 'createdAt',\n render: (record: InboxTaskRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.createdAt)}\n </Typography>\n ),\n title: '建立時間',\n width: 220,\n },\n ],\n [],\n );\n const pendingTableActions = useMemo(\n (): TableActions<InboxTaskRow> => ({\n render: (record): ReturnType<TableActions<InboxTaskRow>['render']> => [\n {\n name: '處理',\n onClick: (): void => router.push(routes.caseDetail(record.instanceId)),\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [router, routes],\n );\n const returnedColumns = useMemo(\n (): TableColumn<ReturnedInstanceRow>[] => [\n { dataIndex: 'caseTitle', key: 'caseTitle', title: '案件', width: 280 },\n {\n key: 'startedAt',\n render: (record: ReturnedInstanceRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startedAt)}\n </Typography>\n ),\n title: '發起時間',\n width: 220,\n },\n ],\n [],\n );\n const returnedTableActions = useMemo(\n (): TableActions<ReturnedInstanceRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<ReturnedInstanceRow>['render']> => [\n {\n name: '重新送出',\n onClick: (): void => router.push(routes.caseDetail(record.id)),\n },\n ],\n variant: 'base-secondary',\n width: 120,\n }),\n [router, routes],\n );\n const historyColumns = useMemo(\n (): TableColumn<ApprovalHistoryRow>[] => [\n { dataIndex: 'caseTitle', key: 'caseTitle', title: '案件', width: 280 },\n { dataIndex: 'nodeText', key: 'nodeText', title: '節點', width: 180 },\n {\n key: 'decisionLabel',\n render: (record: ApprovalHistoryRow): ReactElement => (\n <Typography\n color={readTaskDecisionColor(record.decisionAction)}\n component=\"span\"\n variant=\"body\"\n >\n {record.decisionLabel}\n </Typography>\n ),\n title: '決議',\n width: 120,\n },\n {\n key: 'decisionComment',\n render: (record: ApprovalHistoryRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.decisionCommentText}\n </Typography>\n ),\n title: '意見',\n width: 240,\n },\n {\n key: 'instanceStateLabel',\n render: (record: ApprovalHistoryRow): ReactElement => (\n <Typography\n color={readInstanceStateColor(record.instanceState)}\n component=\"span\"\n variant=\"body\"\n >\n {record.instanceStateLabel}\n </Typography>\n ),\n title: '流程狀態',\n width: 140,\n },\n {\n key: 'decidedAt',\n render: (record: ApprovalHistoryRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatHistoryDateTime(record.decidedAt)}\n </Typography>\n ),\n title: '簽核時間',\n width: 220,\n },\n ],\n [],\n );\n const historyTableActions = useMemo(\n (): TableActions<ApprovalHistoryRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<ApprovalHistoryRow>['render']> => [\n {\n name: '查看',\n onClick: (): void => router.push(routes.caseDetail(record.instanceId)),\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [router, routes],\n );\n const trackingRows = useMemo(\n (): ApprovalHistoryRow[] =>\n historyRows.filter((row) => row.instanceState === 'RUNNING'),\n [historyRows],\n );\n\n function handleTabChange(activeKey: Key): void {\n if (\n activeKey === 'history' ||\n activeKey === 'pending' ||\n activeKey === 'tracking'\n ) {\n setActiveTab(activeKey);\n return;\n }\n\n setActiveTab('pending');\n }\n\n async function refreshTasks(): Promise<void> {\n setLoading(true);\n setError(null);\n\n try {\n if (!currentMemberId) {\n setPendingRows([]);\n setHistoryRows([]);\n setReturnedRows([]);\n setReturnedTruncated(false);\n return;\n }\n\n const [nextPendingTasks, nextHistoryTasks, returned] =\n await Promise.all([\n listInboxTasks(currentMemberId),\n listApprovalHistoryTasks(currentMemberId),\n readReturnedInstances(currentMemberId),\n ]);\n const [nextPendingRows, nextHistoryRows] = await Promise.all([\n readInboxTaskRows(nextPendingTasks),\n readApprovalHistoryRows(nextHistoryTasks, currentMemberId),\n ]);\n\n setPendingRows(nextPendingRows);\n setHistoryRows(nextHistoryRows);\n setReturnedRows(returned?.rows ?? []);\n setReturnedTruncated(returned?.truncated ?? false);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description={`目前以 ${member?.name ?? currentMemberId ?? '目前登入會員'} 查詢待處理與歷史簽核任務。`}\n title=\"我的待簽\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => router.push(routes.caseNew())}\n variant=\"base-primary\"\n >\n 發起簽核\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Tab activeKey={activeTab} onChange={handleTabChange} size=\"sub\">\n <TabItem\n badgeCount={loading ? undefined : pendingRows.length}\n key=\"pending\"\n >\n 待簽核\n </TabItem>\n <TabItem\n badgeCount={loading ? undefined : trackingRows.length}\n key=\"tracking\"\n >\n 已處理未結束\n </TabItem>\n <TabItem key=\"history\">歷史簽核記錄</TabItem>\n </Tab>\n\n {/* A truncated page with none of the member's own cases still\n points to 我發起的: theirs may sit past the first page. */}\n {activeTab === 'pending' &&\n (returnedRows.length > 0 || returnedTruncated) ? (\n <div data-returned-instances=\"\" style={RETURNED_SECTION_STYLE}>\n {/* Without rows there is nothing here to resubmit, only the\n pointer to 我發起的. */}\n {returnedRows.length > 0 ? (\n <Typography component=\"h2\" variant=\"label-primary\">\n 被退回待重送\n </Typography>\n ) : null}\n <Typography color=\"text-neutral\" variant=\"caption\">\n {readReturnedSectionHint(\n returnedRows.length > 0,\n returnedTruncated,\n )}\n </Typography>\n {returnedRows.length > 0 ? (\n <Table\n actions={returnedTableActions}\n columns={returnedColumns}\n dataSource={[...returnedRows]}\n fullWidth\n />\n ) : null}\n </div>\n ) : null}\n {activeTab === 'pending' ? (\n <Table\n actions={pendingTableActions}\n columns={pendingColumns}\n dataSource={pendingRows}\n fullWidth\n loading={loading}\n />\n ) : null}\n {activeTab === 'tracking' ? (\n <Table\n actions={historyTableActions}\n columns={historyColumns}\n dataSource={trackingRows}\n fullWidth\n loading={loading}\n />\n ) : null}\n {activeTab === 'history' ? (\n <Table\n actions={historyTableActions}\n columns={historyColumns}\n dataSource={historyRows}\n fullWidth\n loading={loading}\n />\n ) : null}\n </Section>\n </SectionGroup>\n </>\n );\n}\n\nfunction readReturnedSectionHint(\n hasRows: boolean,\n truncated: boolean,\n): string {\n if (!hasRows) {\n return `前 ${RETURNED_INSTANCE_PAGE_SIZE} 筆被退回的案件中沒有你發起的,可能還有其他被退回的案件,請到「我發起的」查看。`;\n }\n\n return truncated\n ? '你發起的案件被退回,請修改後重新送出。可能還有其他被退回的案件,請到「我發起的」查看。'\n : '你發起的案件被退回,請修改後重新送出。';\n}\n\n/**\n * Returned cases are a side list: a failure here, in the request or in reading\n * its rows, hides that section instead of taking the pending and history tasks\n * down with it.\n */\nasync function readReturnedInstances(\n currentMemberId: string,\n): Promise<Readonly<{\n rows: readonly ReturnedInstanceRow[];\n truncated: boolean;\n}> | null> {\n try {\n // SENT also lists cases filed on someone else's behalf; only the\n // initiator may resubmit, so those are filtered out here.\n const page: ApprovalInstancesPageResult = await listApprovalInstancesPage({\n page: 1,\n pageSize: RETURNED_INSTANCE_PAGE_SIZE,\n searchText: null,\n state: 'RETURNED',\n templateId: null,\n view: 'SENT',\n });\n\n return {\n rows: readReturnedInstanceRows(page.instances, currentMemberId),\n // The total includes cases filed for someone else, so compare it with\n // what this page fetched rather than with the rows kept.\n truncated: page.totalCount > page.instances.length,\n };\n } catch {\n return null;\n }\n}\n\nfunction readReturnedInstanceRows(\n instances: readonly ApprovalInstanceRecord[],\n currentMemberId: string,\n): readonly ReturnedInstanceRow[] {\n return instances\n .filter(\n (instance): boolean => instance.initiatorMemberId === currentMemberId,\n )\n .map(\n (instance): ReturnedInstanceRow => ({\n caseTitle: readApprovalInstanceCaseTitle(instance),\n id: instance.id,\n key: instance.id,\n startedAt: instance.startedAt,\n }),\n );\n}\n\nasync function readInboxTaskRows(\n tasks: readonly TaskRecord[],\n): Promise<InboxTaskRow[]> {\n const instances = await readTaskInstances(tasks);\n\n return tasks.map(\n (task, index): InboxTaskRow => ({\n ...task,\n caseTitle: readTaskCaseTitle(task, instances[index] ?? null),\n key: task.id,\n nodeText: readTaskNodeText(task),\n slaStatusColor: readSlaStatusColor(task.slaDueAt),\n slaStatusText: readSlaStatusText(task.slaDueAt),\n statusLabel: readTaskStatusLabel(task.status),\n }),\n );\n}\n\nasync function readApprovalHistoryRows(\n tasks: readonly TaskRecord[],\n currentMemberId: string,\n): Promise<ApprovalHistoryRow[]> {\n const [decisionLists, instances] = await Promise.all([\n Promise.all(tasks.map((task) => listTaskDecisions(task.id))),\n readTaskInstances(tasks),\n ]);\n\n return tasks.map((task, index): ApprovalHistoryRow => {\n const decisions = decisionLists[index] ?? [];\n const decision = readLatestOwnTaskDecision(decisions, currentMemberId);\n const instance = instances[index] ?? null;\n\n return {\n ...task,\n caseTitle: readTaskCaseTitle(task, instance),\n decisionAction: decision?.action ?? null,\n decisionComment: decision?.comment ?? null,\n decisionCommentText: readDecisionCommentText(decision?.comment ?? null),\n decisionLabel: readTaskDecisionLabel(decision?.action ?? null),\n // completedAt is when the last signer finished, so it can stand in only\n // when the task has no decisions at all.\n decidedAt:\n decision?.decidedAt ??\n (decisions.length === 0 ? task.completedAt : null),\n instanceState: instance?.state ?? null,\n instanceStateLabel: readInstanceStateLabel(instance?.state ?? null),\n key: task.id,\n nodeText: readTaskNodeText(task),\n };\n });\n}\n\nasync function readTaskInstances(\n tasks: readonly TaskRecord[],\n): Promise<readonly (ApprovalInstanceRecord | null)[]> {\n return Promise.all(\n tasks.map(async (task): Promise<ApprovalInstanceRecord | null> => {\n try {\n return (await readApprovalInstance(task.instanceId)).instance;\n } catch {\n return null;\n }\n }),\n );\n}\n\nfunction readTaskCaseTitle(\n task: TaskRecord,\n instance: ApprovalInstanceRecord | null,\n): string {\n return instance ? readApprovalInstanceCaseTitle(instance) : task.instanceId;\n}\n\n// A sequential or countersign task holds decisions from several signers, so\n// the newest one on the task can be somebody else's. A delegate is the one\n// recorded as deciding, and a principal never gets the delegated task in this\n// list.\nfunction readLatestOwnTaskDecision(\n decisions: readonly TaskDecisionRecord[],\n currentMemberId: string,\n): TaskDecisionRecord | null {\n return readLatestTaskDecision(\n decisions.filter(\n (decision): boolean => decision.decidedByMemberId === currentMemberId,\n ),\n );\n}\n\nfunction readTaskDecisionLabel(\n action: TaskDecisionRecord['action'] | null,\n): string {\n if (action === 'APPROVED') {\n return '同意';\n }\n\n if (action === 'REJECTED') {\n return '拒絕';\n }\n\n if (action === 'RETURNED') {\n return '退回';\n }\n\n if (action === 'TRANSFERRED') {\n return '轉派';\n }\n\n return '未記錄';\n}\n\nfunction readTaskDecisionColor(\n action: TaskDecisionRecord['action'] | null,\n): 'text-error' | 'text-neutral' | 'text-success' {\n if (action === 'APPROVED') {\n return 'text-success';\n }\n\n if (action === 'REJECTED' || action === 'RETURNED') {\n return 'text-error';\n }\n\n return 'text-neutral';\n}\n\nfunction readInstanceStateLabel(\n state: ApprovalInstanceRecord['state'] | null,\n): string {\n if (state === 'RUNNING') {\n return '進行中';\n }\n\n if (state === 'APPROVED') {\n return '已通過';\n }\n\n if (state === 'REJECTED') {\n return '已拒絕';\n }\n\n if (state === 'RETURNED') {\n return '已退回';\n }\n\n if (state === 'CANCELLED') {\n return '已取消';\n }\n\n if (state === 'EXPIRED') {\n return '已逾期';\n }\n\n if (state === 'DRAFT') {\n return '草稿';\n }\n\n return '-';\n}\n\nfunction readInstanceStateColor(\n state: ApprovalInstanceRecord['state'] | null,\n): 'text-error' | 'text-neutral' | 'text-success' {\n if (state === 'APPROVED') {\n return 'text-success';\n }\n\n if (state === 'REJECTED' || state === 'CANCELLED' || state === 'EXPIRED') {\n return 'text-error';\n }\n\n return 'text-neutral';\n}\n\nfunction readDecisionCommentText(comment: string | null): string {\n const trimmedComment = comment?.trim() ?? '';\n\n return trimmedComment || '-';\n}\n\nfunction formatHistoryDateTime(value: string | null): string {\n return formatDateTime(value);\n}\n\nfunction readSlaStatusText(value: string | null): string {\n if (!value) {\n return '-';\n }\n\n const dueAt = new Date(value).getTime();\n const now = Date.now();\n const diffMs = Math.abs(dueAt - now);\n const label = formatDuration(diffMs);\n\n return dueAt < now ? `已逾期 ${label}` : `剩餘 ${label}`;\n}\n\nfunction readSlaStatusColor(\n value: string | null,\n): 'text-error' | 'text-neutral' | 'text-success' {\n if (!value) {\n return 'text-neutral';\n }\n\n return new Date(value).getTime() < Date.now() ? 'text-error' : 'text-success';\n}\n\nfunction formatDuration(value: number): string {\n const totalMinutes = Math.max(1, Math.ceil(value / 60_000));\n const days = Math.floor(totalMinutes / 1440);\n const hours = Math.floor((totalMinutes % 1440) / 60);\n const minutes = totalMinutes % 60;\n\n if (days > 0) {\n return `${days}天 ${hours}小時`;\n }\n\n if (hours > 0) {\n return `${hours}小時 ${minutes}分鐘`;\n }\n\n return `${minutes}分鐘`;\n}\n\nfunction readTaskStatusLabel(status: TaskRecord['status']): string {\n if (status === 'PENDING') {\n return '待處理';\n }\n\n if (status === 'IN_PROGRESS') {\n return '處理中';\n }\n\n if (status === 'COMPLETED') {\n return '已完成';\n }\n\n if (status === 'TRANSFERRED') {\n return '已轉派';\n }\n\n if (status === 'CANCELLED') {\n return '已取消';\n }\n\n return status;\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n"],"mappings":"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"}
|