@rytass/bpm-core-react 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/dist/chunks/{FormBuilderView-BVKY1j_0.js → FormBuilderView-Djlm3y4S.js} +485 -481
- package/dist/chunks/FormBuilderView-Djlm3y4S.js.map +1 -0
- package/dist/chunks/FormBuilderView-G6uRSywl.cjs +3 -0
- package/dist/chunks/FormBuilderView-G6uRSywl.cjs.map +1 -0
- package/dist/chunks/{FormRendererView-BsTwZkqU.js → FormRendererView-DHfVgbo6.js} +511 -274
- package/dist/chunks/FormRendererView-DHfVgbo6.js.map +1 -0
- package/dist/chunks/FormRendererView-DwfFbaip.cjs +6 -0
- package/dist/chunks/FormRendererView-DwfFbaip.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/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-B1GlrZW9.js → compose-D6zBIc2Z.js} +131 -148
- package/dist/chunks/compose-D6zBIc2Z.js.map +1 -0
- package/dist/chunks/compose-NH6dsFXD.cjs +2 -0
- package/dist/chunks/compose-NH6dsFXD.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-Be9UI9Tg.cjs +65 -0
- package/dist/chunks/designer-Be9UI9Tg.cjs.map +1 -0
- package/dist/chunks/{designer-BCLrjb4H.js → designer-uhC_7m2i.js} +1791 -1407
- package/dist/chunks/designer-uhC_7m2i.js.map +1 -0
- package/dist/chunks/detail-6uw5dmTi.cjs +5 -0
- package/dist/chunks/detail-6uw5dmTi.cjs.map +1 -0
- package/dist/chunks/{detail-4F39ggBn.js → detail-_GeKqNC-.js} +1012 -972
- package/dist/chunks/detail-_GeKqNC-.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/{approver-filled-form-Dm3Iw7iw.cjs → instance-error-message-DTARGbGo.cjs} +2 -2
- package/dist/chunks/instance-error-message-DTARGbGo.cjs.map +1 -0
- package/dist/chunks/{approver-filled-form-ZEwpmsHJ.js → instance-error-message-q6gy5evy.js} +50 -38
- package/dist/chunks/instance-error-message-q6gy5evy.js.map +1 -0
- 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/FormRendererView.d.cts +24 -1
- package/dist/views/forms/renderer/FormRendererView.d.ts +24 -1
- package/dist/views/forms/renderer/file-upload-field.d.cts +84 -0
- package/dist/views/forms/renderer/file-upload-field.d.ts +84 -0
- package/dist/views/forms/renderer/form-value-readers.d.cts +7 -0
- package/dist/views/forms/renderer/form-value-readers.d.ts +7 -0
- package/dist/views/forms/renderer/index.cjs +1 -1
- package/dist/views/forms/renderer/index.d.cts +1 -0
- package/dist/views/forms/renderer/index.d.ts +1 -0
- 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/InstanceFormSection.d.cts +19 -2
- package/dist/views/instances/detail/sections/InstanceFormSection.d.ts +19 -2
- 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 +3 -4
- package/dist/views/instances/detail/sections/shared.d.ts +3 -4
- package/dist/views/instances/instance-error-message.d.cts +5 -0
- package/dist/views/instances/instance-error-message.d.ts +5 -0
- 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 +78 -77
- package/dist/views/instances/new/index.js.map +1 -1
- package/dist/views/login/index.cjs +1 -1
- package/dist/views/login/index.js +1 -1
- package/dist/views/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-BVKY1j_0.js.map +0 -1
- package/dist/chunks/FormBuilderView-SrGltzFT.cjs +0 -3
- package/dist/chunks/FormBuilderView-SrGltzFT.cjs.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-Dm3Iw7iw.cjs.map +0 -1
- package/dist/chunks/approver-filled-form-ZEwpmsHJ.js.map +0 -1
- package/dist/chunks/compose-B1GlrZW9.js.map +0 -1
- package/dist/chunks/compose-DZk-SfHT.cjs +0 -2
- package/dist/chunks/compose-DZk-SfHT.cjs.map +0 -1
- package/dist/chunks/designer-BCLrjb4H.js.map +0 -1
- package/dist/chunks/designer-BYYxEN9L.cjs +0 -65
- package/dist/chunks/designer-BYYxEN9L.cjs.map +0 -1
- package/dist/chunks/detail-4F39ggBn.js.map +0 -1
- package/dist/chunks/detail-BkMtA_0K.cjs +0 -2
- package/dist/chunks/detail-BkMtA_0K.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,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/categories-DQUtVEiV.cjs"),n=require("../../chunks/format-date-time-D-cx5M8z.cjs"),r=require("../../chunks/router-adapter--gYs13E8.cjs"),i=require("../../chunks/routes-config-C1j_vFKo.cjs"),a=require("./versions/index.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/core/form"),d=require("@mezzanine-ui/react/ContentHeader");d=e.t(d,1);let f=require("@mezzanine-ui/icons"),p=require("@rytass/bpm-core-client/template");var m=[10,20,50],h=[{key:`ALL`,label:`全部`},{key:`PUBLISHED`,label:`已發布`},{key:`DRAFT`,label:`草稿`}],g=100;function _(){let e=r.r(),a=i.r(),[_,O]=(0,o.useState)([]),[k,A]=(0,o.useState)(C),[j,M]=(0,o.useState)([]),[N,P]=(0,o.useState)(new Set),[F,I]=(0,o.useState)(null),[L,R]=(0,o.useState)(!0),[z,B]=(0,o.useState)(1),[V,H]=(0,o.useState)(10),[U,W]=(0,o.useState)(``),[G,K]=(0,o.useState)(`ALL`),[q,J]=(0,o.useState)(0),[Y,X]=(0,o.useState)(null),Z=(0,o.useRef)(0),Q=(0,o.useCallback)(async()=>{let e=Z.current+1;Z.current=e,R(!0),I(null),P(new Set),(0,l.listLaunchableTemplates)().then(t=>{e===Z.current&&P(new Set(t.map(e=>e.id)))}).catch(()=>{e===Z.current&&P(new Set)});try{let[t,n]=await Promise.all([(0,p.listApprovalTemplatesPage)({categoryId:k.categoryId,page:z,pageSize:V,searchText:U,status:G===`ALL`?null:G}),(0,p.listApprovalTemplateCategoriesPage)({page:1,pageSize:g,searchText:``,status:`ACTIVE`})]);if(e!==Z.current)return;M([...n.categories.map(w)]),O(t.templates),J(t.totalCount)}catch(t){e===Z.current&&I(v(t))}finally{e===Z.current&&R(!1)}},[k,z,V,U,G]);(0,o.useEffect)(()=>{Q()},[Q]);let $=(0,o.useCallback)(async e=>{X(e.id),I(null);try{await(e.isActive?(0,p.deactivateApprovalTemplate)(e.id):(0,p.activateApprovalTemplate)(e.id)),await Q()}catch(e){I(v(e))}finally{X(null)}},[Q]),ee=(0,o.useMemo)(()=>_.map(e=>({...e,categoryLabel:D(e),key:e.id,status:e.currentVersionId?`PUBLISHED`:`DRAFT`,updatedAt:n.t(e.updatedAt)})),[_]),te=(0,o.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`模板名稱`,width:220},{key:`status`,render:e=>(0,c.jsx)(b,{status:e.status}),title:`狀態`,width:120},{key:`isActive`,render:e=>(0,c.jsx)(x,{isActive:e.isActive}),title:`服務狀態`,width:120},{key:`category`,render:e=>(0,c.jsx)(S,{record:e}),title:`分類`,width:160},{dataIndex:`updatedAt`,key:`updatedAt`,title:`更新時間`,width:220}],[]),ne=(0,o.useMemo)(()=>({render:t=>[{disabled:e=>!N.has(e.id),name:`發起`,onClick:()=>e.push(a.caseNew(t.id)),variant:`base-primary`},{name:`設計`,onClick:()=>e.push(a.templateDesigner(t.id))},{name:`版本`,onClick:()=>e.push(a.templateVersions(t.id))},{disabled:e=>Y===e.id,name:t.isActive?`停用`:`啟用`,onClick:e=>{$(e)},variant:t.isActive?`destructive-secondary`:`base-secondary`}],variant:`base-secondary`,width:264}),[Y,N,e,$]);return(0,c.jsx)(c.Fragment,{children:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.PageHeader,{children:(0,c.jsx)(d.default,{description:`建立流程模板、維護草稿與發布版本。`,title:`簽核模板`,children:(0,c.jsx)(s.Button,{icon:f.PlusIcon,iconType:`leading`,onClick:()=>e.push(a.templateCompose()),variant:`base-primary`,children:`建立模板`})})}),(0,c.jsx)(s.SectionGroup,{children:(0,c.jsxs)(s.Section,{filterArea:(0,c.jsx)(s.FilterArea,{className:t.n.templateFilterArea,size:`sub`,children:(0,c.jsxs)(s.FilterLine,{children:[(0,c.jsx)(s.Filter,{span:3,children:(0,c.jsx)(s.FormField,{fullWidth:!0,layout:u.FormFieldLayout.VERTICAL,name:`templateSearchText`,children:(0,c.jsx)(s.Input,{fullWidth:!0,onChange:e=>{W(e.target.value),B(1)},placeholder:`關鍵字:搜尋模板名稱、分類或描述`,size:`sub`,value:U,variant:`base`})})}),(0,c.jsx)(s.Filter,{span:2,children:(0,c.jsx)(s.FormField,{fullWidth:!0,layout:u.FormFieldLayout.VERTICAL,name:`templateCategoryFilter`,children:(0,c.jsx)(s.Select,{clearable:!1,fullWidth:!0,onChange:e=>{A(T(e,j)),B(1)},options:[C,...j],placeholder:`分類`,renderValue:e=>`分類:${E(e)}`,size:`sub`,value:k})})})]})}),tab:(0,c.jsx)(s.Tab,{activeKey:G,onChange:e=>{K(y(e)),B(1)},children:h.map(e=>(0,c.jsx)(s.TabItem,{children:e.label},e.key))}),children:[F?(0,c.jsx)(s.Typography,{color:`text-error`,variant:`body`,children:F}):null,(0,c.jsx)(s.Table,{actions:ne,columns:te,dataSource:ee,fullWidth:!0,loading:L,pagination:{current:z,onChange:e=>{B(e)},onChangePageSize:e=>{B(1),H(e)},pageSize:V,pageSizeLabel:`每頁筆數`,pageSizeOptions:m,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:q}})]})})]})})}function v(e){return e instanceof Error?e.message:`發生未知錯誤`}function y(e){return e===`PUBLISHED`||e===`DRAFT`?e:`ALL`}function b({status:e}){return e===`PUBLISHED`?(0,c.jsx)(s.Badge,{size:`sub`,text:`已發布`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`草稿`,variant:`dot-inactive`})}function x({isActive:e}){return e?(0,c.jsx)(s.Badge,{size:`sub`,text:`啟用中`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`已停用`,variant:`dot-inactive`})}function S({record:e}){return e.categoryDetail?.isActive===!1?(0,c.jsx)(s.Badge,{size:`sub`,text:`${e.categoryLabel}(停用)`,variant:`dot-inactive`}):(0,c.jsx)(s.Typography,{component:`span`,variant:`body`,children:e.categoryLabel})}var C={categoryId:null,id:`ALL_CATEGORIES`,name:`全部分類`};function w(e){return{categoryId:e.id,id:e.id,name:e.name}}function T(e,t){if(!O(e))return C;let n=typeof e.id==`string`?e.id:null;return n===C.id?C:t.find(e=>e.id===n)??C}function E(e){return Array.isArray(e)||!O(e)?C.name:typeof e.name==`string`?e.name:C.name}function D(e){return e.categoryDetail?.name??e.category??`未分類`}function O(e){return typeof e==`object`&&!!e}exports.TemplateCategoriesView=t.t,exports.TemplateVersionsView=a.TemplateVersionsView,exports.TemplatesView=_;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["useRouterAdapter","useBPMRoutes","useState","useRef","useCallback","listLaunchableTemplates","listApprovalTemplatesPage","listApprovalTemplateCategoriesPage","deactivateApprovalTemplate","activateApprovalTemplate","useMemo","formatDateTime","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","styles","FilterLine","Filter","FormField","FormFieldLayout","Input","Select","Tab","TabItem","Typography","Table","Badge","require_rolldown_runtime","require_router_adapter","require_format_date_time","require_routes_config","require_categories","require_views_templates_versions_index","react","_mezzanine_ui_react","react_jsx_runtime","_rytass_bpm_core_client_workflow","_mezzanine_ui_core_form","_mezzanine_ui_react_ContentHeader","_mezzanine_ui_icons","_rytass_bpm_core_client_template","TEMPLATE_PAGE_SIZE_OPTIONS","TEMPLATE_STATUS_TABS","TEMPLATE_CATEGORY_PAGE_SIZE","TemplatesView","router","routes","templates","setTemplates","categoryFilter","setCategoryFilter","UNCATEGORIZED_TEMPLATE_FILTER_OPTION","categoryOptions","setCategoryOptions","launchableTemplateIds","setLaunchableTemplateIds","error","setError","loading","setLoading","templatePage","setTemplatePage","templatePageSize","setTemplatePageSize","templateSearchText","setTemplateSearchText","templateStatus","setTemplateStatus","templateTotalCount","setTemplateTotalCount","activationPendingTemplateId","setActivationPendingTemplateId","refreshRequestIdRef","refreshTemplates","requestId","nextLaunchableTemplates","template","templatePageResult","activeCategoryPageResult","readCategoryOption","requestError","readErrorMessage","toggleTemplateActivation","rows","readTemplateCategoryLabel","columns","TemplateStatusBadge","record","TemplateActivationBadge","TemplateCategoryLabel","tableActions","event","readCategoryFilterOption","option","readTemplateCategoryFilterLabel","value","readTemplateStatusTabKey","activeKey","statusTab","page","pageSize","from","to","total","status","isActive","category","isRecord","id","options"],"sources":["../../../src/views/templates/TemplatesView.tsx"],"sourcesContent":["'use client';\n\nimport type { ChangeEvent, Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Badge,\n Button,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\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 { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport styles from './templates.module.scss';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\nimport {\n ApprovalTemplateListStatus,\n ApprovalTemplateRecord,\n ApprovalTemplateCategoryRecord,\n activateApprovalTemplate,\n deactivateApprovalTemplate,\n listApprovalTemplateCategoriesPage,\n listApprovalTemplatesPage,\n} from '@rytass/bpm-core-client/template';\nimport { listLaunchableTemplates } from '@rytass/bpm-core-client/workflow';\n\nconst TEMPLATE_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst TEMPLATE_STATUS_TABS: readonly {\n readonly key: TemplateStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'PUBLISHED', label: '已發布' },\n { key: 'DRAFT', label: '草稿' },\n];\n\nconst TEMPLATE_CATEGORY_PAGE_SIZE = 100;\n\nexport interface TemplateCategoryOption {\n readonly categoryId: string | null;\n readonly id: string;\n readonly name: string;\n}\n\ntype TemplateStatusTabKey = 'ALL' | ApprovalTemplateListStatus;\n\ntype TemplateRow = Readonly<\n Record<string, unknown> &\n ApprovalTemplateRecord & {\n categoryLabel: string;\n key: string;\n status: ApprovalTemplateListStatus;\n }\n>;\n\nexport function TemplatesView(): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const [templates, setTemplates] = useState<readonly ApprovalTemplateRecord[]>(\n [],\n );\n const [categoryFilter, setCategoryFilter] = useState<TemplateCategoryOption>(\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n );\n const [categoryOptions, setCategoryOptions] = useState<\n readonly TemplateCategoryOption[]\n >([]);\n const [launchableTemplateIds, setLaunchableTemplateIds] = useState<\n ReadonlySet<string>\n >(new Set());\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [templatePage, setTemplatePage] = useState(1);\n const [templatePageSize, setTemplatePageSize] = useState(10);\n const [templateSearchText, setTemplateSearchText] = useState('');\n const [templateStatus, setTemplateStatus] =\n useState<TemplateStatusTabKey>('ALL');\n const [templateTotalCount, setTemplateTotalCount] = useState(0);\n const [activationPendingTemplateId, setActivationPendingTemplateId] =\n useState<string | null>(null);\n const refreshRequestIdRef = useRef(0);\n\n const refreshTemplates = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n setLoading(true);\n setError(null);\n setLaunchableTemplateIds(new Set());\n\n void listLaunchableTemplates()\n .then((nextLaunchableTemplates): void => {\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setLaunchableTemplateIds(\n new Set(nextLaunchableTemplates.map((template) => template.id)),\n );\n })\n .catch((): void => {\n if (requestId === refreshRequestIdRef.current) {\n setLaunchableTemplateIds(new Set());\n }\n });\n\n try {\n const [templatePageResult, activeCategoryPageResult] = await Promise.all([\n listApprovalTemplatesPage({\n categoryId: categoryFilter.categoryId,\n page: templatePage,\n pageSize: templatePageSize,\n searchText: templateSearchText,\n status: templateStatus === 'ALL' ? null : templateStatus,\n }),\n listApprovalTemplateCategoriesPage({\n page: 1,\n pageSize: TEMPLATE_CATEGORY_PAGE_SIZE,\n searchText: '',\n status: 'ACTIVE',\n }),\n ]);\n\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setCategoryOptions([\n ...activeCategoryPageResult.categories.map(readCategoryOption),\n ]);\n setTemplates(templatePageResult.templates);\n setTemplateTotalCount(templatePageResult.totalCount);\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [\n categoryFilter,\n templatePage,\n templatePageSize,\n templateSearchText,\n templateStatus,\n ]);\n\n useEffect((): void => {\n void refreshTemplates();\n }, [refreshTemplates]);\n\n const toggleTemplateActivation = useCallback(\n async (template: ApprovalTemplateRecord): Promise<void> => {\n setActivationPendingTemplateId(template.id);\n setError(null);\n\n try {\n await (template.isActive\n ? deactivateApprovalTemplate(template.id)\n : activateApprovalTemplate(template.id));\n await refreshTemplates();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setActivationPendingTemplateId(null);\n }\n },\n [refreshTemplates],\n );\n\n const rows = useMemo(\n (): TemplateRow[] =>\n templates.map((template) => ({\n ...template,\n categoryLabel: readTemplateCategoryLabel(template),\n key: template.id,\n status: template.currentVersionId ? 'PUBLISHED' : 'DRAFT',\n updatedAt: formatDateTime(template.updatedAt),\n })),\n [templates],\n );\n const columns = useMemo(\n (): TableColumn<TemplateRow>[] => [\n { dataIndex: 'name', key: 'name', title: '模板名稱', width: 220 },\n {\n key: 'status',\n render: (record: TemplateRow): ReactElement => (\n <TemplateStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'isActive',\n render: (record: TemplateRow): ReactElement => (\n <TemplateActivationBadge isActive={record.isActive} />\n ),\n title: '服務狀態',\n width: 120,\n },\n {\n key: 'category',\n render: (record: TemplateRow): ReactElement => (\n <TemplateCategoryLabel record={record} />\n ),\n title: '分類',\n width: 160,\n },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<TemplateRow> => ({\n render: (record): ReturnType<TableActions<TemplateRow>['render']> => [\n {\n disabled: (template): boolean =>\n !launchableTemplateIds.has(template.id),\n name: '發起',\n onClick: (): void => router.push(routes.caseNew(record.id)),\n variant: 'base-primary',\n },\n {\n name: '設計',\n onClick: (): void => router.push(routes.templateDesigner(record.id)),\n },\n {\n name: '版本',\n onClick: (): void => router.push(routes.templateVersions(record.id)),\n },\n {\n disabled: (template): boolean =>\n activationPendingTemplateId === template.id,\n name: record.isActive ? '停用' : '啟用',\n onClick: (template): void => {\n void toggleTemplateActivation(template);\n },\n variant: record.isActive ? 'destructive-secondary' : 'base-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 264,\n }),\n [\n activationPendingTemplateId,\n launchableTemplateIds,\n router,\n toggleTemplateActivation,\n ],\n );\n\n return (\n <>\n <>\n <PageHeader>\n <ContentHeader\n description=\"建立流程模板、維護草稿與發布版本。\"\n title=\"簽核模板\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => router.push(routes.templateCompose())}\n variant=\"base-primary\"\n >\n 建立模板\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.templateFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setTemplateSearchText(event.target.value);\n setTemplatePage(1);\n }}\n placeholder=\"關鍵字:搜尋模板名稱、分類或描述\"\n size=\"sub\"\n value={templateSearchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateCategoryFilter\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setCategoryFilter(\n readCategoryFilterOption(option, categoryOptions),\n );\n setTemplatePage(1);\n }}\n options={[\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n ...categoryOptions,\n ]}\n placeholder=\"分類\"\n renderValue={(value): string =>\n `分類:${readTemplateCategoryFilterLabel(value)}`\n }\n size=\"sub\"\n value={categoryFilter}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={templateStatus}\n onChange={(activeKey): void => {\n setTemplateStatus(readTemplateStatusTabKey(activeKey));\n setTemplatePage(1);\n }}\n >\n {TEMPLATE_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\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: templatePage,\n onChange: (page): void => {\n setTemplatePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setTemplatePage(1);\n setTemplatePageSize(pageSize);\n },\n pageSize: templatePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: TEMPLATE_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: templateTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </>\n </>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction readTemplateStatusTabKey(activeKey: Key): TemplateStatusTabKey {\n if (activeKey === 'PUBLISHED' || activeKey === 'DRAFT') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction TemplateStatusBadge({\n status,\n}: {\n readonly status: ApprovalTemplateListStatus;\n}): ReactElement {\n if (status === 'PUBLISHED') {\n return <Badge size=\"sub\" text=\"已發布\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"草稿\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateActivationBadge({\n isActive,\n}: {\n readonly isActive: boolean;\n}): ReactElement {\n if (isActive) {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"已停用\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateCategoryLabel({\n record,\n}: {\n readonly record: TemplateRow;\n}): ReactElement {\n if (record.categoryDetail?.isActive === false) {\n return (\n <Badge\n size=\"sub\"\n text={`${record.categoryLabel}(停用)`}\n variant=\"dot-inactive\"\n />\n );\n }\n\n return (\n <Typography component=\"span\" variant=\"body\">\n {record.categoryLabel}\n </Typography>\n );\n}\n\nconst UNCATEGORIZED_TEMPLATE_FILTER_OPTION: TemplateCategoryOption = {\n categoryId: null,\n id: 'ALL_CATEGORIES',\n name: '全部分類',\n};\n\nfunction readCategoryOption(\n category: ApprovalTemplateCategoryRecord,\n): TemplateCategoryOption {\n return {\n categoryId: category.id,\n id: category.id,\n name: category.name,\n };\n}\n\nfunction readCategoryFilterOption(\n value: unknown,\n options: readonly TemplateCategoryOption[],\n): TemplateCategoryOption {\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n const id = typeof value.id === 'string' ? value.id : null;\n\n if (id === UNCATEGORIZED_TEMPLATE_FILTER_OPTION.id) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n return (\n options.find((option) => option.id === id) ??\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION\n );\n}\n\nfunction readTemplateCategoryFilterLabel(value: unknown): string {\n if (Array.isArray(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n return typeof value.name === 'string'\n ? value.name\n : UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n}\n\nfunction readTemplateCategoryLabel(template: ApprovalTemplateRecord): string {\n return template.categoryDetail?.name ?? template.category ?? '未分類';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["useRouterAdapter","useBPMRoutes","useState","useRef","useCallback","listLaunchableTemplates","listApprovalTemplatesPage","listApprovalTemplateCategoriesPage","deactivateApprovalTemplate","activateApprovalTemplate","useMemo","formatDateTime","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","styles","FilterLine","Filter","FormField","FormFieldLayout","Input","Select","Tab","TabItem","Typography","Table","Badge","require_rolldown_runtime","require_categories","require_format_date_time","require_router_adapter","require_routes_config","require_views_templates_versions_index","react","_mezzanine_ui_react","react_jsx_runtime","_rytass_bpm_core_client_workflow","_mezzanine_ui_core_form","_mezzanine_ui_react_ContentHeader","_mezzanine_ui_icons","_rytass_bpm_core_client_template","TEMPLATE_PAGE_SIZE_OPTIONS","TEMPLATE_STATUS_TABS","TEMPLATE_CATEGORY_PAGE_SIZE","TemplatesView","router","routes","templates","setTemplates","categoryFilter","setCategoryFilter","UNCATEGORIZED_TEMPLATE_FILTER_OPTION","categoryOptions","setCategoryOptions","launchableTemplateIds","setLaunchableTemplateIds","error","setError","loading","setLoading","templatePage","setTemplatePage","templatePageSize","setTemplatePageSize","templateSearchText","setTemplateSearchText","templateStatus","setTemplateStatus","templateTotalCount","setTemplateTotalCount","activationPendingTemplateId","setActivationPendingTemplateId","refreshRequestIdRef","refreshTemplates","requestId","nextLaunchableTemplates","template","templatePageResult","activeCategoryPageResult","readCategoryOption","requestError","readErrorMessage","toggleTemplateActivation","rows","readTemplateCategoryLabel","columns","TemplateStatusBadge","record","TemplateActivationBadge","TemplateCategoryLabel","tableActions","event","readCategoryFilterOption","option","readTemplateCategoryFilterLabel","value","readTemplateStatusTabKey","activeKey","statusTab","page","pageSize","from","to","total","status","isActive","category","isRecord","id","options"],"sources":["../../../src/views/templates/TemplatesView.tsx"],"sourcesContent":["'use client';\n\nimport type { ChangeEvent, Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Badge,\n Button,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\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 { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport styles from './templates.module.scss';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\nimport {\n ApprovalTemplateListStatus,\n ApprovalTemplateRecord,\n ApprovalTemplateCategoryRecord,\n activateApprovalTemplate,\n deactivateApprovalTemplate,\n listApprovalTemplateCategoriesPage,\n listApprovalTemplatesPage,\n} from '@rytass/bpm-core-client/template';\nimport { listLaunchableTemplates } from '@rytass/bpm-core-client/workflow';\n\nconst TEMPLATE_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst TEMPLATE_STATUS_TABS: readonly {\n readonly key: TemplateStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'PUBLISHED', label: '已發布' },\n { key: 'DRAFT', label: '草稿' },\n];\n\nconst TEMPLATE_CATEGORY_PAGE_SIZE = 100;\n\nexport interface TemplateCategoryOption {\n readonly categoryId: string | null;\n readonly id: string;\n readonly name: string;\n}\n\ntype TemplateStatusTabKey = 'ALL' | ApprovalTemplateListStatus;\n\ntype TemplateRow = Readonly<\n Record<string, unknown> &\n ApprovalTemplateRecord & {\n categoryLabel: string;\n key: string;\n status: ApprovalTemplateListStatus;\n }\n>;\n\nexport function TemplatesView(): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const [templates, setTemplates] = useState<readonly ApprovalTemplateRecord[]>(\n [],\n );\n const [categoryFilter, setCategoryFilter] = useState<TemplateCategoryOption>(\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n );\n const [categoryOptions, setCategoryOptions] = useState<\n readonly TemplateCategoryOption[]\n >([]);\n const [launchableTemplateIds, setLaunchableTemplateIds] = useState<\n ReadonlySet<string>\n >(new Set());\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [templatePage, setTemplatePage] = useState(1);\n const [templatePageSize, setTemplatePageSize] = useState(10);\n const [templateSearchText, setTemplateSearchText] = useState('');\n const [templateStatus, setTemplateStatus] =\n useState<TemplateStatusTabKey>('ALL');\n const [templateTotalCount, setTemplateTotalCount] = useState(0);\n const [activationPendingTemplateId, setActivationPendingTemplateId] =\n useState<string | null>(null);\n const refreshRequestIdRef = useRef(0);\n\n const refreshTemplates = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n setLoading(true);\n setError(null);\n setLaunchableTemplateIds(new Set());\n\n void listLaunchableTemplates()\n .then((nextLaunchableTemplates): void => {\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setLaunchableTemplateIds(\n new Set(nextLaunchableTemplates.map((template) => template.id)),\n );\n })\n .catch((): void => {\n if (requestId === refreshRequestIdRef.current) {\n setLaunchableTemplateIds(new Set());\n }\n });\n\n try {\n const [templatePageResult, activeCategoryPageResult] = await Promise.all([\n listApprovalTemplatesPage({\n categoryId: categoryFilter.categoryId,\n page: templatePage,\n pageSize: templatePageSize,\n searchText: templateSearchText,\n status: templateStatus === 'ALL' ? null : templateStatus,\n }),\n listApprovalTemplateCategoriesPage({\n page: 1,\n pageSize: TEMPLATE_CATEGORY_PAGE_SIZE,\n searchText: '',\n status: 'ACTIVE',\n }),\n ]);\n\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setCategoryOptions([\n ...activeCategoryPageResult.categories.map(readCategoryOption),\n ]);\n setTemplates(templatePageResult.templates);\n setTemplateTotalCount(templatePageResult.totalCount);\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [\n categoryFilter,\n templatePage,\n templatePageSize,\n templateSearchText,\n templateStatus,\n ]);\n\n useEffect((): void => {\n void refreshTemplates();\n }, [refreshTemplates]);\n\n const toggleTemplateActivation = useCallback(\n async (template: ApprovalTemplateRecord): Promise<void> => {\n setActivationPendingTemplateId(template.id);\n setError(null);\n\n try {\n await (template.isActive\n ? deactivateApprovalTemplate(template.id)\n : activateApprovalTemplate(template.id));\n await refreshTemplates();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setActivationPendingTemplateId(null);\n }\n },\n [refreshTemplates],\n );\n\n const rows = useMemo(\n (): TemplateRow[] =>\n templates.map((template) => ({\n ...template,\n categoryLabel: readTemplateCategoryLabel(template),\n key: template.id,\n status: template.currentVersionId ? 'PUBLISHED' : 'DRAFT',\n updatedAt: formatDateTime(template.updatedAt),\n })),\n [templates],\n );\n const columns = useMemo(\n (): TableColumn<TemplateRow>[] => [\n { dataIndex: 'name', key: 'name', title: '模板名稱', width: 220 },\n {\n key: 'status',\n render: (record: TemplateRow): ReactElement => (\n <TemplateStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'isActive',\n render: (record: TemplateRow): ReactElement => (\n <TemplateActivationBadge isActive={record.isActive} />\n ),\n title: '服務狀態',\n width: 120,\n },\n {\n key: 'category',\n render: (record: TemplateRow): ReactElement => (\n <TemplateCategoryLabel record={record} />\n ),\n title: '分類',\n width: 160,\n },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<TemplateRow> => ({\n render: (record): ReturnType<TableActions<TemplateRow>['render']> => [\n {\n disabled: (template): boolean =>\n !launchableTemplateIds.has(template.id),\n name: '發起',\n onClick: (): void => router.push(routes.caseNew(record.id)),\n variant: 'base-primary',\n },\n {\n name: '設計',\n onClick: (): void => router.push(routes.templateDesigner(record.id)),\n },\n {\n name: '版本',\n onClick: (): void => router.push(routes.templateVersions(record.id)),\n },\n {\n disabled: (template): boolean =>\n activationPendingTemplateId === template.id,\n name: record.isActive ? '停用' : '啟用',\n onClick: (template): void => {\n void toggleTemplateActivation(template);\n },\n variant: record.isActive ? 'destructive-secondary' : 'base-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 264,\n }),\n [\n activationPendingTemplateId,\n launchableTemplateIds,\n router,\n toggleTemplateActivation,\n ],\n );\n\n return (\n <>\n <>\n <PageHeader>\n <ContentHeader\n description=\"建立流程模板、維護草稿與發布版本。\"\n title=\"簽核模板\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => router.push(routes.templateCompose())}\n variant=\"base-primary\"\n >\n 建立模板\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.templateFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setTemplateSearchText(event.target.value);\n setTemplatePage(1);\n }}\n placeholder=\"關鍵字:搜尋模板名稱、分類或描述\"\n size=\"sub\"\n value={templateSearchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateCategoryFilter\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setCategoryFilter(\n readCategoryFilterOption(option, categoryOptions),\n );\n setTemplatePage(1);\n }}\n options={[\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n ...categoryOptions,\n ]}\n placeholder=\"分類\"\n renderValue={(value): string =>\n `分類:${readTemplateCategoryFilterLabel(value)}`\n }\n size=\"sub\"\n value={categoryFilter}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={templateStatus}\n onChange={(activeKey): void => {\n setTemplateStatus(readTemplateStatusTabKey(activeKey));\n setTemplatePage(1);\n }}\n >\n {TEMPLATE_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\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: templatePage,\n onChange: (page): void => {\n setTemplatePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setTemplatePage(1);\n setTemplatePageSize(pageSize);\n },\n pageSize: templatePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: TEMPLATE_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: templateTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </>\n </>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction readTemplateStatusTabKey(activeKey: Key): TemplateStatusTabKey {\n if (activeKey === 'PUBLISHED' || activeKey === 'DRAFT') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction TemplateStatusBadge({\n status,\n}: {\n readonly status: ApprovalTemplateListStatus;\n}): ReactElement {\n if (status === 'PUBLISHED') {\n return <Badge size=\"sub\" text=\"已發布\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"草稿\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateActivationBadge({\n isActive,\n}: {\n readonly isActive: boolean;\n}): ReactElement {\n if (isActive) {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"已停用\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateCategoryLabel({\n record,\n}: {\n readonly record: TemplateRow;\n}): ReactElement {\n if (record.categoryDetail?.isActive === false) {\n return (\n <Badge\n size=\"sub\"\n text={`${record.categoryLabel}(停用)`}\n variant=\"dot-inactive\"\n />\n );\n }\n\n return (\n <Typography component=\"span\" variant=\"body\">\n {record.categoryLabel}\n </Typography>\n );\n}\n\nconst UNCATEGORIZED_TEMPLATE_FILTER_OPTION: TemplateCategoryOption = {\n categoryId: null,\n id: 'ALL_CATEGORIES',\n name: '全部分類',\n};\n\nfunction readCategoryOption(\n category: ApprovalTemplateCategoryRecord,\n): TemplateCategoryOption {\n return {\n categoryId: category.id,\n id: category.id,\n name: category.name,\n };\n}\n\nfunction readCategoryFilterOption(\n value: unknown,\n options: readonly TemplateCategoryOption[],\n): TemplateCategoryOption {\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n const id = typeof value.id === 'string' ? value.id : null;\n\n if (id === UNCATEGORIZED_TEMPLATE_FILTER_OPTION.id) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n return (\n options.find((option) => option.id === id) ??\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION\n );\n}\n\nfunction readTemplateCategoryFilterLabel(value: unknown): string {\n if (Array.isArray(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n return typeof value.name === 'string'\n ? value.name\n : UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n}\n\nfunction readTemplateCategoryLabel(template: ApprovalTemplateRecord): string {\n return template.categoryDetail?.name ?? template.category ?? '未分類';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { t } from "../../chunks/format-date-time-
|
|
4
|
-
import { r as
|
|
5
|
-
import {
|
|
6
|
-
import { TemplateVersionsView as
|
|
7
|
-
import { useCallback as
|
|
8
|
-
import { Badge as
|
|
2
|
+
import { n as e, t } from "../../chunks/categories-BAdxjNSA.js";
|
|
3
|
+
import { t as n } from "../../chunks/format-date-time-B0LdmWg4.js";
|
|
4
|
+
import { r as ee } from "../../chunks/router-adapter-CkxCyzf5.js";
|
|
5
|
+
import { r as te } from "../../chunks/routes-config-BcNaWJWJ.js";
|
|
6
|
+
import { TemplateVersionsView as r } from "./versions/index.js";
|
|
7
|
+
import { useCallback as i, useEffect as ne, useMemo as a, useRef as o, useState as s } from "react";
|
|
8
|
+
import { Badge as c, Button as re, Filter as l, FilterArea as ie, FilterLine as u, FormField as d, Input as f, PageHeader as p, Section as m, SectionGroup as h, Select as ae, Tab as oe, TabItem as se, Table as ce, Typography as g } from "@mezzanine-ui/react";
|
|
9
9
|
import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
10
|
-
import { listLaunchableTemplates as
|
|
11
|
-
import { FormFieldLayout as
|
|
12
|
-
import
|
|
13
|
-
import { PlusIcon as
|
|
14
|
-
import { activateApprovalTemplate as
|
|
15
|
-
|
|
16
|
-
var
|
|
10
|
+
import { listLaunchableTemplates as le } from "@rytass/bpm-core-client/workflow";
|
|
11
|
+
import { FormFieldLayout as b } from "@mezzanine-ui/core/form";
|
|
12
|
+
import ue from "@mezzanine-ui/react/ContentHeader";
|
|
13
|
+
import { PlusIcon as de } from "@mezzanine-ui/icons";
|
|
14
|
+
import { activateApprovalTemplate as fe, deactivateApprovalTemplate as pe, listApprovalTemplateCategoriesPage as me, listApprovalTemplatesPage as he } from "@rytass/bpm-core-client/template";
|
|
15
|
+
// src/views/templates/TemplatesView.tsx
|
|
16
|
+
var x = [
|
|
17
17
|
10,
|
|
18
18
|
20,
|
|
19
19
|
50
|
|
@@ -32,21 +32,21 @@ var he = [
|
|
|
32
32
|
}
|
|
33
33
|
], C = 100;
|
|
34
34
|
function w() {
|
|
35
|
-
let
|
|
35
|
+
let t = ee(), r = te(), [c, w] = s([]), [F, I] = s(A), [L, R] = s([]), [z, B] = s(/* @__PURE__ */ new Set()), [V, H] = s(null), [ge, U] = s(!0), [W, G] = s(1), [K, _e] = s(10), [q, ve] = s(""), [J, ye] = s("ALL"), [be, xe] = s(0), [Y, X] = s(null), Z = o(0), Q = i(async () => {
|
|
36
36
|
let e = Z.current + 1;
|
|
37
|
-
Z.current = e, U(!0), H(null), B(/* @__PURE__ */ new Set()),
|
|
37
|
+
Z.current = e, U(!0), H(null), B(/* @__PURE__ */ new Set()), le().then((t) => {
|
|
38
38
|
e === Z.current && B(new Set(t.map((e) => e.id)));
|
|
39
39
|
}).catch(() => {
|
|
40
40
|
e === Z.current && B(/* @__PURE__ */ new Set());
|
|
41
41
|
});
|
|
42
42
|
try {
|
|
43
|
-
let [t, n] = await Promise.all([
|
|
43
|
+
let [t, n] = await Promise.all([he({
|
|
44
44
|
categoryId: F.categoryId,
|
|
45
45
|
page: W,
|
|
46
46
|
pageSize: K,
|
|
47
47
|
searchText: q,
|
|
48
48
|
status: J === "ALL" ? null : J
|
|
49
|
-
}),
|
|
49
|
+
}), me({
|
|
50
50
|
page: 1,
|
|
51
51
|
pageSize: C,
|
|
52
52
|
searchText: "",
|
|
@@ -66,25 +66,25 @@ function w() {
|
|
|
66
66
|
q,
|
|
67
67
|
J
|
|
68
68
|
]);
|
|
69
|
-
|
|
69
|
+
ne(() => {
|
|
70
70
|
Q();
|
|
71
71
|
}, [Q]);
|
|
72
|
-
let $ =
|
|
72
|
+
let $ = i(async (e) => {
|
|
73
73
|
X(e.id), H(null);
|
|
74
74
|
try {
|
|
75
|
-
await (e.isActive ?
|
|
75
|
+
await (e.isActive ? pe(e.id) : fe(e.id)), await Q();
|
|
76
76
|
} catch (e) {
|
|
77
77
|
H(T(e));
|
|
78
78
|
} finally {
|
|
79
79
|
X(null);
|
|
80
80
|
}
|
|
81
|
-
}, [Q]), Se =
|
|
81
|
+
}, [Q]), Se = a(() => c.map((e) => ({
|
|
82
82
|
...e,
|
|
83
83
|
categoryLabel: P(e),
|
|
84
84
|
key: e.id,
|
|
85
85
|
status: e.currentVersionId ? "PUBLISHED" : "DRAFT",
|
|
86
|
-
updatedAt:
|
|
87
|
-
})), [
|
|
86
|
+
updatedAt: n(e.updatedAt)
|
|
87
|
+
})), [c]), Ce = a(() => [
|
|
88
88
|
{
|
|
89
89
|
dataIndex: "name",
|
|
90
90
|
key: "name",
|
|
@@ -115,21 +115,21 @@ function w() {
|
|
|
115
115
|
title: "更新時間",
|
|
116
116
|
width: 220
|
|
117
117
|
}
|
|
118
|
-
], []), we =
|
|
118
|
+
], []), we = a(() => ({
|
|
119
119
|
render: (e) => [
|
|
120
120
|
{
|
|
121
121
|
disabled: (e) => !z.has(e.id),
|
|
122
122
|
name: "發起",
|
|
123
|
-
onClick: () =>
|
|
123
|
+
onClick: () => t.push(r.caseNew(e.id)),
|
|
124
124
|
variant: "base-primary"
|
|
125
125
|
},
|
|
126
126
|
{
|
|
127
127
|
name: "設計",
|
|
128
|
-
onClick: () =>
|
|
128
|
+
onClick: () => t.push(r.templateDesigner(e.id))
|
|
129
129
|
},
|
|
130
130
|
{
|
|
131
131
|
name: "版本",
|
|
132
|
-
onClick: () =>
|
|
132
|
+
onClick: () => t.push(r.templateVersions(e.id))
|
|
133
133
|
},
|
|
134
134
|
{
|
|
135
135
|
disabled: (e) => Y === e.id,
|
|
@@ -145,30 +145,30 @@ function w() {
|
|
|
145
145
|
}), [
|
|
146
146
|
Y,
|
|
147
147
|
z,
|
|
148
|
-
|
|
148
|
+
t,
|
|
149
149
|
$
|
|
150
150
|
]);
|
|
151
|
-
return /* @__PURE__ */ v(_, { children: /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(
|
|
151
|
+
return /* @__PURE__ */ v(_, { children: /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(p, { children: /* @__PURE__ */ v(ue, {
|
|
152
152
|
description: "建立流程模板、維護草稿與發布版本。",
|
|
153
153
|
title: "簽核模板",
|
|
154
|
-
children: /* @__PURE__ */ v(
|
|
155
|
-
icon:
|
|
154
|
+
children: /* @__PURE__ */ v(re, {
|
|
155
|
+
icon: de,
|
|
156
156
|
iconType: "leading",
|
|
157
|
-
onClick: () =>
|
|
157
|
+
onClick: () => t.push(r.templateCompose()),
|
|
158
158
|
variant: "base-primary",
|
|
159
159
|
children: "建立模板"
|
|
160
160
|
})
|
|
161
|
-
}) }), /* @__PURE__ */ v(
|
|
162
|
-
filterArea: /* @__PURE__ */ v(
|
|
163
|
-
className:
|
|
161
|
+
}) }), /* @__PURE__ */ v(h, { children: /* @__PURE__ */ y(m, {
|
|
162
|
+
filterArea: /* @__PURE__ */ v(ie, {
|
|
163
|
+
className: e.templateFilterArea,
|
|
164
164
|
size: "sub",
|
|
165
|
-
children: /* @__PURE__ */ y(
|
|
165
|
+
children: /* @__PURE__ */ y(u, { children: [/* @__PURE__ */ v(l, {
|
|
166
166
|
span: 3,
|
|
167
|
-
children: /* @__PURE__ */ v(
|
|
167
|
+
children: /* @__PURE__ */ v(d, {
|
|
168
168
|
fullWidth: !0,
|
|
169
|
-
layout:
|
|
169
|
+
layout: b.VERTICAL,
|
|
170
170
|
name: "templateSearchText",
|
|
171
|
-
children: /* @__PURE__ */ v(
|
|
171
|
+
children: /* @__PURE__ */ v(f, {
|
|
172
172
|
fullWidth: !0,
|
|
173
173
|
onChange: (e) => {
|
|
174
174
|
ve(e.target.value), G(1);
|
|
@@ -179,11 +179,11 @@ function w() {
|
|
|
179
179
|
variant: "base"
|
|
180
180
|
})
|
|
181
181
|
})
|
|
182
|
-
}), /* @__PURE__ */ v(
|
|
182
|
+
}), /* @__PURE__ */ v(l, {
|
|
183
183
|
span: 2,
|
|
184
|
-
children: /* @__PURE__ */ v(
|
|
184
|
+
children: /* @__PURE__ */ v(d, {
|
|
185
185
|
fullWidth: !0,
|
|
186
|
-
layout:
|
|
186
|
+
layout: b.VERTICAL,
|
|
187
187
|
name: "templateCategoryFilter",
|
|
188
188
|
children: /* @__PURE__ */ v(ae, {
|
|
189
189
|
clearable: !1,
|
|
@@ -227,7 +227,7 @@ function w() {
|
|
|
227
227
|
},
|
|
228
228
|
pageSize: K,
|
|
229
229
|
pageSizeLabel: "每頁筆數",
|
|
230
|
-
pageSizeOptions:
|
|
230
|
+
pageSizeOptions: x,
|
|
231
231
|
renderResultSummary: (e, t, n) => `顯示 ${e}-${t} 筆,共 ${n} 筆`,
|
|
232
232
|
showPageSizeOptions: !0,
|
|
233
233
|
total: be
|
|
@@ -242,29 +242,29 @@ function E(e) {
|
|
|
242
242
|
return e === "PUBLISHED" || e === "DRAFT" ? e : "ALL";
|
|
243
243
|
}
|
|
244
244
|
function D({ status: e }) {
|
|
245
|
-
return e === "PUBLISHED" ? /* @__PURE__ */ v(
|
|
245
|
+
return e === "PUBLISHED" ? /* @__PURE__ */ v(c, {
|
|
246
246
|
size: "sub",
|
|
247
247
|
text: "已發布",
|
|
248
248
|
variant: "dot-success"
|
|
249
|
-
}) : /* @__PURE__ */ v(
|
|
249
|
+
}) : /* @__PURE__ */ v(c, {
|
|
250
250
|
size: "sub",
|
|
251
251
|
text: "草稿",
|
|
252
252
|
variant: "dot-inactive"
|
|
253
253
|
});
|
|
254
254
|
}
|
|
255
255
|
function O({ isActive: e }) {
|
|
256
|
-
return e ? /* @__PURE__ */ v(
|
|
256
|
+
return e ? /* @__PURE__ */ v(c, {
|
|
257
257
|
size: "sub",
|
|
258
258
|
text: "啟用中",
|
|
259
259
|
variant: "dot-success"
|
|
260
|
-
}) : /* @__PURE__ */ v(
|
|
260
|
+
}) : /* @__PURE__ */ v(c, {
|
|
261
261
|
size: "sub",
|
|
262
262
|
text: "已停用",
|
|
263
263
|
variant: "dot-inactive"
|
|
264
264
|
});
|
|
265
265
|
}
|
|
266
266
|
function k({ record: e }) {
|
|
267
|
-
return e.categoryDetail?.isActive === !1 ? /* @__PURE__ */ v(
|
|
267
|
+
return e.categoryDetail?.isActive === !1 ? /* @__PURE__ */ v(c, {
|
|
268
268
|
size: "sub",
|
|
269
269
|
text: `${e.categoryLabel}(停用)`,
|
|
270
270
|
variant: "dot-inactive"
|
|
@@ -300,7 +300,6 @@ function P(e) {
|
|
|
300
300
|
function F(e) {
|
|
301
301
|
return typeof e == "object" && !!e;
|
|
302
302
|
}
|
|
303
|
-
|
|
304
|
-
export { r as TemplateCategoriesView, i as TemplateVersionsView, w as TemplatesView };
|
|
303
|
+
export { t as TemplateCategoriesView, r as TemplateVersionsView, w as TemplatesView };
|
|
305
304
|
|
|
306
305
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_Fragment","styles","useRouterAdapter","useBPMRoutes","templates_module_default","TemplateCategoriesView","Fragment$1","ContentHeader","TEMPLATE_PAGE_SIZE_OPTIONS","TEMPLATE_STATUS_TABS","TEMPLATE_CATEGORY_PAGE_SIZE","TemplatesView","router","routes","templates","setTemplates","useState","categoryFilter","setCategoryFilter","UNCATEGORIZED_TEMPLATE_FILTER_OPTION","categoryOptions","setCategoryOptions","launchableTemplateIds","setLaunchableTemplateIds","error","setError","loading","setLoading","templatePage","setTemplatePage","templatePageSize","setTemplatePageSize","templateSearchText","setTemplateSearchText","templateStatus","setTemplateStatus","templateTotalCount","setTemplateTotalCount","activationPendingTemplateId","setActivationPendingTemplateId","refreshRequestIdRef","useRef","refreshTemplates","useCallback","requestId","listLaunchableTemplates","nextLaunchableTemplates","template","templatePageResult","activeCategoryPageResult","listApprovalTemplatesPage","listApprovalTemplateCategoriesPage","readCategoryOption","requestError","readErrorMessage","toggleTemplateActivation","deactivateApprovalTemplate","activateApprovalTemplate","rows","useMemo","readTemplateCategoryLabel","formatDateTime","columns","TemplateStatusBadge","record","TemplateActivationBadge","TemplateCategoryLabel","tableActions","PageHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","FilterLine","Filter","FormField","FormFieldLayout","Input","event","Select","readCategoryFilterOption","option","readTemplateCategoryFilterLabel","value","Tab","readTemplateStatusTabKey","activeKey","TabItem","statusTab","Typography","Table","page","pageSize","from","to","total","status","Badge","isActive","category","isRecord","id","options","TemplateVersionsView"],"sources":["../../../src/views/templates/TemplatesView.tsx"],"sourcesContent":["'use client';\n\nimport type { ChangeEvent, Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Badge,\n Button,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\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 { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport styles from './templates.module.scss';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\nimport {\n ApprovalTemplateListStatus,\n ApprovalTemplateRecord,\n ApprovalTemplateCategoryRecord,\n activateApprovalTemplate,\n deactivateApprovalTemplate,\n listApprovalTemplateCategoriesPage,\n listApprovalTemplatesPage,\n} from '@rytass/bpm-core-client/template';\nimport { listLaunchableTemplates } from '@rytass/bpm-core-client/workflow';\n\nconst TEMPLATE_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst TEMPLATE_STATUS_TABS: readonly {\n readonly key: TemplateStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'PUBLISHED', label: '已發布' },\n { key: 'DRAFT', label: '草稿' },\n];\n\nconst TEMPLATE_CATEGORY_PAGE_SIZE = 100;\n\nexport interface TemplateCategoryOption {\n readonly categoryId: string | null;\n readonly id: string;\n readonly name: string;\n}\n\ntype TemplateStatusTabKey = 'ALL' | ApprovalTemplateListStatus;\n\ntype TemplateRow = Readonly<\n Record<string, unknown> &\n ApprovalTemplateRecord & {\n categoryLabel: string;\n key: string;\n status: ApprovalTemplateListStatus;\n }\n>;\n\nexport function TemplatesView(): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const [templates, setTemplates] = useState<readonly ApprovalTemplateRecord[]>(\n [],\n );\n const [categoryFilter, setCategoryFilter] = useState<TemplateCategoryOption>(\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n );\n const [categoryOptions, setCategoryOptions] = useState<\n readonly TemplateCategoryOption[]\n >([]);\n const [launchableTemplateIds, setLaunchableTemplateIds] = useState<\n ReadonlySet<string>\n >(new Set());\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [templatePage, setTemplatePage] = useState(1);\n const [templatePageSize, setTemplatePageSize] = useState(10);\n const [templateSearchText, setTemplateSearchText] = useState('');\n const [templateStatus, setTemplateStatus] =\n useState<TemplateStatusTabKey>('ALL');\n const [templateTotalCount, setTemplateTotalCount] = useState(0);\n const [activationPendingTemplateId, setActivationPendingTemplateId] =\n useState<string | null>(null);\n const refreshRequestIdRef = useRef(0);\n\n const refreshTemplates = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n setLoading(true);\n setError(null);\n setLaunchableTemplateIds(new Set());\n\n void listLaunchableTemplates()\n .then((nextLaunchableTemplates): void => {\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setLaunchableTemplateIds(\n new Set(nextLaunchableTemplates.map((template) => template.id)),\n );\n })\n .catch((): void => {\n if (requestId === refreshRequestIdRef.current) {\n setLaunchableTemplateIds(new Set());\n }\n });\n\n try {\n const [templatePageResult, activeCategoryPageResult] = await Promise.all([\n listApprovalTemplatesPage({\n categoryId: categoryFilter.categoryId,\n page: templatePage,\n pageSize: templatePageSize,\n searchText: templateSearchText,\n status: templateStatus === 'ALL' ? null : templateStatus,\n }),\n listApprovalTemplateCategoriesPage({\n page: 1,\n pageSize: TEMPLATE_CATEGORY_PAGE_SIZE,\n searchText: '',\n status: 'ACTIVE',\n }),\n ]);\n\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setCategoryOptions([\n ...activeCategoryPageResult.categories.map(readCategoryOption),\n ]);\n setTemplates(templatePageResult.templates);\n setTemplateTotalCount(templatePageResult.totalCount);\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [\n categoryFilter,\n templatePage,\n templatePageSize,\n templateSearchText,\n templateStatus,\n ]);\n\n useEffect((): void => {\n void refreshTemplates();\n }, [refreshTemplates]);\n\n const toggleTemplateActivation = useCallback(\n async (template: ApprovalTemplateRecord): Promise<void> => {\n setActivationPendingTemplateId(template.id);\n setError(null);\n\n try {\n await (template.isActive\n ? deactivateApprovalTemplate(template.id)\n : activateApprovalTemplate(template.id));\n await refreshTemplates();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setActivationPendingTemplateId(null);\n }\n },\n [refreshTemplates],\n );\n\n const rows = useMemo(\n (): TemplateRow[] =>\n templates.map((template) => ({\n ...template,\n categoryLabel: readTemplateCategoryLabel(template),\n key: template.id,\n status: template.currentVersionId ? 'PUBLISHED' : 'DRAFT',\n updatedAt: formatDateTime(template.updatedAt),\n })),\n [templates],\n );\n const columns = useMemo(\n (): TableColumn<TemplateRow>[] => [\n { dataIndex: 'name', key: 'name', title: '模板名稱', width: 220 },\n {\n key: 'status',\n render: (record: TemplateRow): ReactElement => (\n <TemplateStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'isActive',\n render: (record: TemplateRow): ReactElement => (\n <TemplateActivationBadge isActive={record.isActive} />\n ),\n title: '服務狀態',\n width: 120,\n },\n {\n key: 'category',\n render: (record: TemplateRow): ReactElement => (\n <TemplateCategoryLabel record={record} />\n ),\n title: '分類',\n width: 160,\n },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<TemplateRow> => ({\n render: (record): ReturnType<TableActions<TemplateRow>['render']> => [\n {\n disabled: (template): boolean =>\n !launchableTemplateIds.has(template.id),\n name: '發起',\n onClick: (): void => router.push(routes.caseNew(record.id)),\n variant: 'base-primary',\n },\n {\n name: '設計',\n onClick: (): void => router.push(routes.templateDesigner(record.id)),\n },\n {\n name: '版本',\n onClick: (): void => router.push(routes.templateVersions(record.id)),\n },\n {\n disabled: (template): boolean =>\n activationPendingTemplateId === template.id,\n name: record.isActive ? '停用' : '啟用',\n onClick: (template): void => {\n void toggleTemplateActivation(template);\n },\n variant: record.isActive ? 'destructive-secondary' : 'base-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 264,\n }),\n [\n activationPendingTemplateId,\n launchableTemplateIds,\n router,\n toggleTemplateActivation,\n ],\n );\n\n return (\n <>\n <>\n <PageHeader>\n <ContentHeader\n description=\"建立流程模板、維護草稿與發布版本。\"\n title=\"簽核模板\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => router.push(routes.templateCompose())}\n variant=\"base-primary\"\n >\n 建立模板\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.templateFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setTemplateSearchText(event.target.value);\n setTemplatePage(1);\n }}\n placeholder=\"關鍵字:搜尋模板名稱、分類或描述\"\n size=\"sub\"\n value={templateSearchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateCategoryFilter\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setCategoryFilter(\n readCategoryFilterOption(option, categoryOptions),\n );\n setTemplatePage(1);\n }}\n options={[\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n ...categoryOptions,\n ]}\n placeholder=\"分類\"\n renderValue={(value): string =>\n `分類:${readTemplateCategoryFilterLabel(value)}`\n }\n size=\"sub\"\n value={categoryFilter}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={templateStatus}\n onChange={(activeKey): void => {\n setTemplateStatus(readTemplateStatusTabKey(activeKey));\n setTemplatePage(1);\n }}\n >\n {TEMPLATE_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\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: templatePage,\n onChange: (page): void => {\n setTemplatePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setTemplatePage(1);\n setTemplatePageSize(pageSize);\n },\n pageSize: templatePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: TEMPLATE_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: templateTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </>\n </>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction readTemplateStatusTabKey(activeKey: Key): TemplateStatusTabKey {\n if (activeKey === 'PUBLISHED' || activeKey === 'DRAFT') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction TemplateStatusBadge({\n status,\n}: {\n readonly status: ApprovalTemplateListStatus;\n}): ReactElement {\n if (status === 'PUBLISHED') {\n return <Badge size=\"sub\" text=\"已發布\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"草稿\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateActivationBadge({\n isActive,\n}: {\n readonly isActive: boolean;\n}): ReactElement {\n if (isActive) {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"已停用\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateCategoryLabel({\n record,\n}: {\n readonly record: TemplateRow;\n}): ReactElement {\n if (record.categoryDetail?.isActive === false) {\n return (\n <Badge\n size=\"sub\"\n text={`${record.categoryLabel}(停用)`}\n variant=\"dot-inactive\"\n />\n );\n }\n\n return (\n <Typography component=\"span\" variant=\"body\">\n {record.categoryLabel}\n </Typography>\n );\n}\n\nconst UNCATEGORIZED_TEMPLATE_FILTER_OPTION: TemplateCategoryOption = {\n categoryId: null,\n id: 'ALL_CATEGORIES',\n name: '全部分類',\n};\n\nfunction readCategoryOption(\n category: ApprovalTemplateCategoryRecord,\n): TemplateCategoryOption {\n return {\n categoryId: category.id,\n id: category.id,\n name: category.name,\n };\n}\n\nfunction readCategoryFilterOption(\n value: unknown,\n options: readonly TemplateCategoryOption[],\n): TemplateCategoryOption {\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n const id = typeof value.id === 'string' ? value.id : null;\n\n if (id === UNCATEGORIZED_TEMPLATE_FILTER_OPTION.id) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n return (\n options.find((option) => option.id === id) ??\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION\n );\n}\n\nfunction readTemplateCategoryFilterLabel(value: unknown): string {\n if (Array.isArray(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n return typeof value.name === 'string'\n ? value.name\n : UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n}\n\nfunction readTemplateCategoryLabel(template: ApprovalTemplateRecord): string {\n return template.categoryDetail?.name ?? template.category ?? '未分類';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_Fragment","styles","templates_module_default","formatDateTime","useRouterAdapter","useBPMRoutes","Fragment$1","ContentHeader","TEMPLATE_PAGE_SIZE_OPTIONS","TEMPLATE_STATUS_TABS","TEMPLATE_CATEGORY_PAGE_SIZE","TemplatesView","router","routes","templates","setTemplates","useState","categoryFilter","setCategoryFilter","UNCATEGORIZED_TEMPLATE_FILTER_OPTION","categoryOptions","setCategoryOptions","launchableTemplateIds","setLaunchableTemplateIds","error","setError","loading","setLoading","templatePage","setTemplatePage","templatePageSize","setTemplatePageSize","templateSearchText","setTemplateSearchText","templateStatus","setTemplateStatus","templateTotalCount","setTemplateTotalCount","activationPendingTemplateId","setActivationPendingTemplateId","refreshRequestIdRef","useRef","refreshTemplates","useCallback","requestId","listLaunchableTemplates","nextLaunchableTemplates","template","templatePageResult","activeCategoryPageResult","listApprovalTemplatesPage","listApprovalTemplateCategoriesPage","readCategoryOption","requestError","readErrorMessage","toggleTemplateActivation","deactivateApprovalTemplate","activateApprovalTemplate","rows","useMemo","readTemplateCategoryLabel","columns","TemplateStatusBadge","record","TemplateActivationBadge","TemplateCategoryLabel","tableActions","PageHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","FilterLine","Filter","FormField","FormFieldLayout","Input","event","Select","readCategoryFilterOption","option","readTemplateCategoryFilterLabel","value","Tab","readTemplateStatusTabKey","activeKey","TabItem","statusTab","Typography","Table","page","pageSize","from","to","total","status","Badge","isActive","category","isRecord","id","options","TemplateCategoriesView","TemplateVersionsView"],"sources":["../../../src/views/templates/TemplatesView.tsx"],"sourcesContent":["'use client';\n\nimport type { ChangeEvent, Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Badge,\n Button,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\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 { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport styles from './templates.module.scss';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\nimport {\n ApprovalTemplateListStatus,\n ApprovalTemplateRecord,\n ApprovalTemplateCategoryRecord,\n activateApprovalTemplate,\n deactivateApprovalTemplate,\n listApprovalTemplateCategoriesPage,\n listApprovalTemplatesPage,\n} from '@rytass/bpm-core-client/template';\nimport { listLaunchableTemplates } from '@rytass/bpm-core-client/workflow';\n\nconst TEMPLATE_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst TEMPLATE_STATUS_TABS: readonly {\n readonly key: TemplateStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'PUBLISHED', label: '已發布' },\n { key: 'DRAFT', label: '草稿' },\n];\n\nconst TEMPLATE_CATEGORY_PAGE_SIZE = 100;\n\nexport interface TemplateCategoryOption {\n readonly categoryId: string | null;\n readonly id: string;\n readonly name: string;\n}\n\ntype TemplateStatusTabKey = 'ALL' | ApprovalTemplateListStatus;\n\ntype TemplateRow = Readonly<\n Record<string, unknown> &\n ApprovalTemplateRecord & {\n categoryLabel: string;\n key: string;\n status: ApprovalTemplateListStatus;\n }\n>;\n\nexport function TemplatesView(): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const [templates, setTemplates] = useState<readonly ApprovalTemplateRecord[]>(\n [],\n );\n const [categoryFilter, setCategoryFilter] = useState<TemplateCategoryOption>(\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n );\n const [categoryOptions, setCategoryOptions] = useState<\n readonly TemplateCategoryOption[]\n >([]);\n const [launchableTemplateIds, setLaunchableTemplateIds] = useState<\n ReadonlySet<string>\n >(new Set());\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [templatePage, setTemplatePage] = useState(1);\n const [templatePageSize, setTemplatePageSize] = useState(10);\n const [templateSearchText, setTemplateSearchText] = useState('');\n const [templateStatus, setTemplateStatus] =\n useState<TemplateStatusTabKey>('ALL');\n const [templateTotalCount, setTemplateTotalCount] = useState(0);\n const [activationPendingTemplateId, setActivationPendingTemplateId] =\n useState<string | null>(null);\n const refreshRequestIdRef = useRef(0);\n\n const refreshTemplates = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n setLoading(true);\n setError(null);\n setLaunchableTemplateIds(new Set());\n\n void listLaunchableTemplates()\n .then((nextLaunchableTemplates): void => {\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setLaunchableTemplateIds(\n new Set(nextLaunchableTemplates.map((template) => template.id)),\n );\n })\n .catch((): void => {\n if (requestId === refreshRequestIdRef.current) {\n setLaunchableTemplateIds(new Set());\n }\n });\n\n try {\n const [templatePageResult, activeCategoryPageResult] = await Promise.all([\n listApprovalTemplatesPage({\n categoryId: categoryFilter.categoryId,\n page: templatePage,\n pageSize: templatePageSize,\n searchText: templateSearchText,\n status: templateStatus === 'ALL' ? null : templateStatus,\n }),\n listApprovalTemplateCategoriesPage({\n page: 1,\n pageSize: TEMPLATE_CATEGORY_PAGE_SIZE,\n searchText: '',\n status: 'ACTIVE',\n }),\n ]);\n\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setCategoryOptions([\n ...activeCategoryPageResult.categories.map(readCategoryOption),\n ]);\n setTemplates(templatePageResult.templates);\n setTemplateTotalCount(templatePageResult.totalCount);\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [\n categoryFilter,\n templatePage,\n templatePageSize,\n templateSearchText,\n templateStatus,\n ]);\n\n useEffect((): void => {\n void refreshTemplates();\n }, [refreshTemplates]);\n\n const toggleTemplateActivation = useCallback(\n async (template: ApprovalTemplateRecord): Promise<void> => {\n setActivationPendingTemplateId(template.id);\n setError(null);\n\n try {\n await (template.isActive\n ? deactivateApprovalTemplate(template.id)\n : activateApprovalTemplate(template.id));\n await refreshTemplates();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setActivationPendingTemplateId(null);\n }\n },\n [refreshTemplates],\n );\n\n const rows = useMemo(\n (): TemplateRow[] =>\n templates.map((template) => ({\n ...template,\n categoryLabel: readTemplateCategoryLabel(template),\n key: template.id,\n status: template.currentVersionId ? 'PUBLISHED' : 'DRAFT',\n updatedAt: formatDateTime(template.updatedAt),\n })),\n [templates],\n );\n const columns = useMemo(\n (): TableColumn<TemplateRow>[] => [\n { dataIndex: 'name', key: 'name', title: '模板名稱', width: 220 },\n {\n key: 'status',\n render: (record: TemplateRow): ReactElement => (\n <TemplateStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'isActive',\n render: (record: TemplateRow): ReactElement => (\n <TemplateActivationBadge isActive={record.isActive} />\n ),\n title: '服務狀態',\n width: 120,\n },\n {\n key: 'category',\n render: (record: TemplateRow): ReactElement => (\n <TemplateCategoryLabel record={record} />\n ),\n title: '分類',\n width: 160,\n },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<TemplateRow> => ({\n render: (record): ReturnType<TableActions<TemplateRow>['render']> => [\n {\n disabled: (template): boolean =>\n !launchableTemplateIds.has(template.id),\n name: '發起',\n onClick: (): void => router.push(routes.caseNew(record.id)),\n variant: 'base-primary',\n },\n {\n name: '設計',\n onClick: (): void => router.push(routes.templateDesigner(record.id)),\n },\n {\n name: '版本',\n onClick: (): void => router.push(routes.templateVersions(record.id)),\n },\n {\n disabled: (template): boolean =>\n activationPendingTemplateId === template.id,\n name: record.isActive ? '停用' : '啟用',\n onClick: (template): void => {\n void toggleTemplateActivation(template);\n },\n variant: record.isActive ? 'destructive-secondary' : 'base-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 264,\n }),\n [\n activationPendingTemplateId,\n launchableTemplateIds,\n router,\n toggleTemplateActivation,\n ],\n );\n\n return (\n <>\n <>\n <PageHeader>\n <ContentHeader\n description=\"建立流程模板、維護草稿與發布版本。\"\n title=\"簽核模板\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => router.push(routes.templateCompose())}\n variant=\"base-primary\"\n >\n 建立模板\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.templateFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setTemplateSearchText(event.target.value);\n setTemplatePage(1);\n }}\n placeholder=\"關鍵字:搜尋模板名稱、分類或描述\"\n size=\"sub\"\n value={templateSearchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateCategoryFilter\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setCategoryFilter(\n readCategoryFilterOption(option, categoryOptions),\n );\n setTemplatePage(1);\n }}\n options={[\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n ...categoryOptions,\n ]}\n placeholder=\"分類\"\n renderValue={(value): string =>\n `分類:${readTemplateCategoryFilterLabel(value)}`\n }\n size=\"sub\"\n value={categoryFilter}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={templateStatus}\n onChange={(activeKey): void => {\n setTemplateStatus(readTemplateStatusTabKey(activeKey));\n setTemplatePage(1);\n }}\n >\n {TEMPLATE_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\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: templatePage,\n onChange: (page): void => {\n setTemplatePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setTemplatePage(1);\n setTemplatePageSize(pageSize);\n },\n pageSize: templatePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: TEMPLATE_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: templateTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </>\n </>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction readTemplateStatusTabKey(activeKey: Key): TemplateStatusTabKey {\n if (activeKey === 'PUBLISHED' || activeKey === 'DRAFT') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction TemplateStatusBadge({\n status,\n}: {\n readonly status: ApprovalTemplateListStatus;\n}): ReactElement {\n if (status === 'PUBLISHED') {\n return <Badge size=\"sub\" text=\"已發布\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"草稿\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateActivationBadge({\n isActive,\n}: {\n readonly isActive: boolean;\n}): ReactElement {\n if (isActive) {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"已停用\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateCategoryLabel({\n record,\n}: {\n readonly record: TemplateRow;\n}): ReactElement {\n if (record.categoryDetail?.isActive === false) {\n return (\n <Badge\n size=\"sub\"\n text={`${record.categoryLabel}(停用)`}\n variant=\"dot-inactive\"\n />\n );\n }\n\n return (\n <Typography component=\"span\" variant=\"body\">\n {record.categoryLabel}\n </Typography>\n );\n}\n\nconst UNCATEGORIZED_TEMPLATE_FILTER_OPTION: TemplateCategoryOption = {\n categoryId: null,\n id: 'ALL_CATEGORIES',\n name: '全部分類',\n};\n\nfunction readCategoryOption(\n category: ApprovalTemplateCategoryRecord,\n): TemplateCategoryOption {\n return {\n categoryId: category.id,\n id: category.id,\n name: category.name,\n };\n}\n\nfunction readCategoryFilterOption(\n value: unknown,\n options: readonly TemplateCategoryOption[],\n): TemplateCategoryOption {\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n const id = typeof value.id === 'string' ? value.id : null;\n\n if (id === UNCATEGORIZED_TEMPLATE_FILTER_OPTION.id) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n return (\n options.find((option) => option.id === id) ??\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION\n );\n}\n\nfunction readTemplateCategoryFilterLabel(value: unknown): string {\n if (Array.isArray(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n return typeof value.name === 'string'\n ? value.name\n : UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n}\n\nfunction readTemplateCategoryLabel(template: ApprovalTemplateRecord): string {\n return template.categoryDetail?.name ?? template.category ?? '未分類';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
|
|
@@ -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/router-adapter--gYs13E8.cjs"),n=require("../../../chunks/
|
|
1
|
+
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/rolldown-runtime-BocRIvOZ.cjs"),t=require("../../../chunks/router-adapter--gYs13E8.cjs"),n=require("../../../chunks/routes-config-C1j_vFKo.cjs"),r=require("../../../chunks/format-date-time-D-cx5M8z.cjs");let i=require("react"),a=require("@mezzanine-ui/react"),o=require("react/jsx-runtime"),s=require("@mezzanine-ui/react/ContentHeader");s=e.t(s,1);let c=require("@rytass/bpm-core-client/template");function l({templateId:e}){let l=t.r(),d=n.r(),[f,p]=(0,i.useState)(null),[m,h]=(0,i.useState)(null),[g,_]=(0,i.useState)(!0),[v,y]=(0,i.useState)(!1);(0,i.useEffect)(()=>{C()},[e]);let b=(0,i.useMemo)(()=>(f?.versions??[]).map(e=>({formVersion:f?.formVersions.find(t=>t.id===e.formDefinitionVersionId)?.label??`未綁定`,key:e.id,publishedAt:r.t(e.publishedAt),status:e.status,updatedAt:r.t(e.updatedAt),version:`v${e.version}`,versionId:e.id})),[f]),x=(0,i.useMemo)(()=>[{dataIndex:`version`,key:`version`,title:`版本`,width:100},{dataIndex:`status`,key:`status`,title:`狀態`,width:140},{dataIndex:`formVersion`,key:`formVersion`,title:`表單版本`,width:220},{dataIndex:`publishedAt`,key:`publishedAt`,title:`發布時間`,width:200},{dataIndex:`updatedAt`,key:`updatedAt`,title:`更新時間`,width:200}],[]),S=(0,i.useMemo)(()=>({render:e=>[{disabled:()=>v||e.status===`DRAFT`,name:`Rollback`,onClick:()=>void w(e.versionId)}],variant:`base-secondary`,width:104}),[v]);async function C(){_(!0),h(null);try{p(await(0,c.readTemplateDesigner)(e))}catch(e){h(u(e))}finally{_(!1)}}async function w(e){y(!0),h(null);try{await(0,c.rollbackApprovalTemplateVersion)(e),await C()}catch(e){h(u(e))}finally{y(!1)}}return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.PageHeader,{children:(0,o.jsx)(s.default,{description:`查看發布、歸檔與 rollback 狀態。`,onBackClick:()=>l.push(d.templates()),title:f?.template.name??`模板版本`})}),(0,o.jsx)(a.SectionGroup,{children:(0,o.jsxs)(a.Section,{children:[m?(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:m}):null,(0,o.jsx)(a.Table,{actions:S,columns:x,dataSource:b,fullWidth:!0,loading:g})]})})]})}function u(e){return e instanceof Error?e.message:`發生未知錯誤`}exports.TemplateVersionsView=l;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["useRouterAdapter","useBPMRoutes","useState","useMemo","formatDateTime","readTemplateDesigner","rollbackApprovalTemplateVersion","_Fragment","PageHeader","ContentHeader","SectionGroup","Section","Typography","Table","require_rolldown_runtime","require_router_adapter","
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["useRouterAdapter","useBPMRoutes","useState","useMemo","formatDateTime","readTemplateDesigner","rollbackApprovalTemplateVersion","_Fragment","PageHeader","ContentHeader","SectionGroup","Section","Typography","Table","require_rolldown_runtime","require_router_adapter","require_routes_config","require_format_date_time","react","_mezzanine_ui_react","react_jsx_runtime","_mezzanine_ui_react_ContentHeader","_rytass_bpm_core_client_template","TemplateVersionsView","router","routes","record","setRecord","error","setError","loading","setLoading","rollingBack","setRollingBack","refreshVersions","templateId","rows","formVersion","version","columns","actions","row","handleRollback","requestError","readErrorMessage","versionId"],"sources":["../../../../src/views/templates/versions/TemplateVersionsView.tsx"],"sourcesContent":["'use client';\n\nimport { ReactElement, useEffect, useMemo, useState } from 'react';\nimport {\n PageHeader,\n Section,\n SectionGroup,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { useRouterAdapter } from '../../../lib/router-adapter';\nimport { useBPMRoutes } from '../../../lib/routes-config';\nimport {\n readTemplateDesigner,\n rollbackApprovalTemplateVersion,\n TemplateDesignerRecord,\n} from '@rytass/bpm-core-client/template';\nimport { formatDateTime } from '../../../lib/format-date-time';\n\ntype VersionRow = Readonly<\n Record<string, unknown> & {\n formVersion: string;\n key: string;\n publishedAt: string;\n status: string;\n updatedAt: string;\n version: string;\n versionId: string;\n }\n>;\n\nexport interface TemplateVersionsViewProps {\n readonly templateId: string;\n}\n\nexport function TemplateVersionsView({\n templateId,\n}: TemplateVersionsViewProps): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const [record, setRecord] = useState<TemplateDesignerRecord | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [rollingBack, setRollingBack] = useState(false);\n\n useEffect((): void => {\n void refreshVersions();\n }, [templateId]);\n\n const rows = useMemo(\n (): VersionRow[] =>\n (record?.versions ?? []).map((version) => ({\n formVersion:\n record?.formVersions.find(\n (formVersion) => formVersion.id === version.formDefinitionVersionId,\n )?.label ?? '未綁定',\n key: version.id,\n publishedAt: formatDateTime(version.publishedAt),\n status: version.status,\n updatedAt: formatDateTime(version.updatedAt),\n version: `v${version.version}`,\n versionId: version.id,\n })),\n [record],\n );\n const columns = useMemo(\n (): TableColumn<VersionRow>[] => [\n { dataIndex: 'version', key: 'version', title: '版本', width: 100 },\n { dataIndex: 'status', key: 'status', title: '狀態', width: 140 },\n {\n dataIndex: 'formVersion',\n key: 'formVersion',\n title: '表單版本',\n width: 220,\n },\n {\n dataIndex: 'publishedAt',\n key: 'publishedAt',\n title: '發布時間',\n width: 200,\n },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 200,\n },\n ],\n [],\n );\n const actions = useMemo(\n (): TableActions<VersionRow> => ({\n render: (row): ReturnType<TableActions<VersionRow>['render']> => [\n {\n disabled: (): boolean => rollingBack || row.status === 'DRAFT',\n name: 'Rollback',\n onClick: (): void => void handleRollback(row.versionId),\n },\n ],\n variant: 'base-secondary',\n width: 104,\n }),\n [rollingBack],\n );\n\n async function refreshVersions(): Promise<void> {\n setLoading(true);\n setError(null);\n\n try {\n setRecord(await readTemplateDesigner(templateId));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }\n\n async function handleRollback(versionId: string): Promise<void> {\n setRollingBack(true);\n setError(null);\n\n try {\n await rollbackApprovalTemplateVersion(versionId);\n await refreshVersions();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setRollingBack(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"查看發布、歸檔與 rollback 狀態。\"\n onBackClick={(): void => router.push(routes.templates())}\n title={record?.template.name ?? '模板版本'}\n />\n </PageHeader>\n\n <SectionGroup>\n <Section>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={actions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n />\n </Section>\n </SectionGroup>\n </>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n"],"mappings":"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"}
|