@rytass/bpm-core-react 0.17.9 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +61 -0
- package/README.md +8 -0
- package/dist/chunks/FormBuilderView-CHaAQL5v.cjs +3 -0
- package/dist/chunks/FormBuilderView-CHaAQL5v.cjs.map +1 -0
- package/dist/chunks/{FormBuilderView-ClLnQ1e_.js → FormBuilderView-vQfVc08Z.js} +493 -437
- package/dist/chunks/FormBuilderView-vQfVc08Z.js.map +1 -0
- package/dist/chunks/{FormRendererView-BsTwZkqU.js → FormRendererView-CTLlG13b.js} +300 -189
- package/dist/chunks/FormRendererView-CTLlG13b.js.map +1 -0
- package/dist/chunks/FormRendererView-ChmM_4Yc.cjs +4 -0
- package/dist/chunks/FormRendererView-ChmM_4Yc.cjs.map +1 -0
- package/dist/chunks/admin-pickers-BjbkBpSJ.cjs +2 -0
- package/dist/chunks/admin-pickers-BjbkBpSJ.cjs.map +1 -0
- package/dist/chunks/{admin-pickers-Djq3h-UR.js → admin-pickers-DfGxsjpp.js} +42 -42
- package/dist/chunks/admin-pickers-DfGxsjpp.js.map +1 -0
- package/dist/chunks/{approval-instance-list-page-CPXMP3PL.js → approval-instance-list-page-BnI4t5mD.js} +7 -8
- package/dist/chunks/{approval-instance-list-page-CPXMP3PL.js.map → approval-instance-list-page-BnI4t5mD.js.map} +1 -1
- package/dist/chunks/{approval-instance-list-page-ax0pm8bt.cjs → approval-instance-list-page-fqvmkBlg.cjs} +2 -2
- package/dist/chunks/{approval-instance-list-page-ax0pm8bt.cjs.map → approval-instance-list-page-fqvmkBlg.cjs.map} +1 -1
- package/dist/chunks/approver-filled-form-B4zPg9kz.cjs +2 -0
- package/dist/chunks/approver-filled-form-B4zPg9kz.cjs.map +1 -0
- package/dist/chunks/approver-filled-form-Bgazhbvd.js +112 -0
- package/dist/chunks/approver-filled-form-Bgazhbvd.js.map +1 -0
- package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -1
- package/dist/chunks/{auth-provider-B5oPmvk2.js → auth-provider-C2b-5mGt.js} +2 -3
- package/dist/chunks/{auth-provider-B5oPmvk2.js.map → auth-provider-C2b-5mGt.js.map} +1 -1
- package/dist/chunks/{bpm-form-field-Cao0rMol.js → bpm-form-field-9B-Det0u.js} +2 -3
- package/dist/chunks/{bpm-form-field-Cao0rMol.js.map → bpm-form-field-9B-Det0u.js.map} +1 -1
- package/dist/chunks/bpm-form-field-Bc6k4ZEO.cjs.map +1 -1
- package/dist/chunks/{categories-riC33J_j.js → categories-BAdxjNSA.js} +14 -15
- package/dist/chunks/{categories-riC33J_j.js.map → categories-BAdxjNSA.js.map} +1 -1
- package/dist/chunks/{categories-AxxhqjLZ.cjs → categories-DQUtVEiV.cjs} +2 -2
- package/dist/chunks/{categories-AxxhqjLZ.cjs.map → categories-DQUtVEiV.cjs.map} +1 -1
- package/dist/chunks/{compose-jnvnnVfN.js → compose-D9ipJpF_.js} +131 -148
- package/dist/chunks/compose-D9ipJpF_.js.map +1 -0
- package/dist/chunks/compose-DtfX8DQ9.cjs +2 -0
- package/dist/chunks/compose-DtfX8DQ9.cjs.map +1 -0
- package/dist/chunks/{dashboard-page-DdBvV6YI.js → dashboard-page-BoqNhjT_.js} +5 -6
- package/dist/chunks/{dashboard-page-DdBvV6YI.js.map → dashboard-page-BoqNhjT_.js.map} +1 -1
- package/dist/chunks/{dashboard-page-BWQBSGDq.cjs → dashboard-page-D7YJ3udk.cjs} +2 -2
- package/dist/chunks/{dashboard-page-BWQBSGDq.cjs.map → dashboard-page-D7YJ3udk.cjs.map} +1 -1
- package/dist/chunks/{delegations-MxF3uJGW.js → delegations-BfhCDz5e.js} +15 -16
- package/dist/chunks/{delegations-MxF3uJGW.js.map → delegations-BfhCDz5e.js.map} +1 -1
- package/dist/chunks/{delegations-Ckf03icM.cjs → delegations-BmFGcuhA.cjs} +2 -2
- package/dist/chunks/{delegations-Ckf03icM.cjs.map → delegations-BmFGcuhA.cjs.map} +1 -1
- package/dist/chunks/{delegations-V9HIe3_P.cjs → delegations-CcS0SHbf.cjs} +2 -2
- package/dist/chunks/{delegations-V9HIe3_P.cjs.map → delegations-CcS0SHbf.cjs.map} +1 -1
- package/dist/chunks/{delegations-xUt1tj8d.js → delegations-DBh5TT6G.js} +16 -17
- package/dist/chunks/{delegations-xUt1tj8d.js.map → delegations-DBh5TT6G.js.map} +1 -1
- package/dist/chunks/designer-Df79YzUn.cjs +65 -0
- package/dist/chunks/designer-Df79YzUn.cjs.map +1 -0
- package/dist/chunks/{designer-B8Gvew_k.js → designer-ubnZbP-A.js} +1779 -1360
- package/dist/chunks/designer-ubnZbP-A.js.map +1 -0
- package/dist/chunks/detail-BBC9kqXd.cjs +5 -0
- package/dist/chunks/detail-BBC9kqXd.cjs.map +1 -0
- package/dist/chunks/detail-C6XKZjlF.js +2665 -0
- package/dist/chunks/detail-C6XKZjlF.js.map +1 -0
- package/dist/chunks/{format-date-time-CB-LxzqT.js → format-date-time-B0LdmWg4.js} +2 -3
- package/dist/chunks/{format-date-time-CB-LxzqT.js.map → format-date-time-B0LdmWg4.js.map} +1 -1
- package/dist/chunks/format-date-time-D-cx5M8z.cjs.map +1 -1
- package/dist/chunks/{format-member-label-DudVI55w.js → format-member-label-C73FuP-d.js} +2 -3
- package/dist/chunks/{format-member-label-DudVI55w.js.map → format-member-label-C73FuP-d.js.map} +1 -1
- package/dist/chunks/format-member-label-t7ANTF62.cjs.map +1 -1
- package/dist/chunks/language-provider-Bdnx3Gxl.cjs.map +1 -1
- package/dist/chunks/{language-provider-B3cEbLe4.js → language-provider-phkWOapf.js} +2 -3
- package/dist/chunks/{language-provider-B3cEbLe4.js.map → language-provider-phkWOapf.js.map} +1 -1
- package/dist/chunks/{login-C6qlTC6F.js → login-D6cc3bo7.js} +4 -5
- package/dist/chunks/{login-C6qlTC6F.js.map → login-D6cc3bo7.js.map} +1 -1
- package/dist/chunks/{login-AtVxZBsC.cjs → login-uvVcltrS.cjs} +2 -2
- package/dist/chunks/{login-AtVxZBsC.cjs.map → login-uvVcltrS.cjs.map} +1 -1
- package/dist/chunks/notifications-Bc4mgSds.cjs.map +1 -1
- package/dist/chunks/{notifications-DJ5wzCye.js → notifications-Cvme5Qbl.js} +2 -3
- package/dist/chunks/{notifications-DJ5wzCye.js.map → notifications-Cvme5Qbl.js.map} +1 -1
- package/dist/chunks/orgs-B_2J2tLX.cjs +2 -0
- package/dist/chunks/{orgs-BeeDDWL1.cjs.map → orgs-B_2J2tLX.cjs.map} +1 -1
- package/dist/chunks/{orgs-8hje_l2n.js → orgs-DqxMds26.js} +48 -49
- package/dist/chunks/{orgs-8hje_l2n.js.map → orgs-DqxMds26.js.map} +1 -1
- package/dist/chunks/{providers-B_d5tbCL.js → providers-BbCs23sk.js} +21 -25
- package/dist/chunks/{providers-B_d5tbCL.js.map → providers-BbCs23sk.js.map} +1 -1
- package/dist/chunks/{providers-chuJvMgv.cjs → providers-D_KAgOOu.cjs} +2 -2
- package/dist/chunks/{providers-chuJvMgv.cjs.map → providers-D_KAgOOu.cjs.map} +1 -1
- package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -1
- package/dist/chunks/{router-adapter-DftlFTOd.js → router-adapter-CkxCyzf5.js} +2 -3
- package/dist/chunks/{router-adapter-DftlFTOd.js.map → router-adapter-CkxCyzf5.js.map} +1 -1
- package/dist/chunks/{routes-config-yZbESPlw.js → routes-config-BcNaWJWJ.js} +2 -3
- package/dist/chunks/{routes-config-yZbESPlw.js.map → routes-config-BcNaWJWJ.js.map} +1 -1
- package/dist/chunks/routes-config-C1j_vFKo.cjs.map +1 -1
- package/dist/chunks/task-decision-3d17ZvZE.js +29 -0
- package/dist/chunks/task-decision-3d17ZvZE.js.map +1 -0
- package/dist/chunks/task-decision-CqZ4WQOC.cjs +2 -0
- package/dist/chunks/task-decision-CqZ4WQOC.cjs.map +1 -0
- package/dist/chunks/{use-bpm-member-D57LKe_u.js → use-bpm-member-BPzcNU1g.js} +3 -4
- package/dist/chunks/{use-bpm-member-D57LKe_u.js.map → use-bpm-member-BPzcNU1g.js.map} +1 -1
- package/dist/chunks/use-bpm-member-DpNAQtNC.cjs.map +1 -1
- package/dist/chunks/{users-Pl6hY5Y5.js → users-BBtiZ9QQ.js} +22 -25
- package/dist/chunks/{users-Pl6hY5Y5.js.map → users-BBtiZ9QQ.js.map} +1 -1
- package/dist/chunks/{users-O2L_M3BK.cjs → users-EqSzDhuj.cjs} +2 -2
- package/dist/chunks/{users-O2L_M3BK.cjs.map → users-EqSzDhuj.cjs.map} +1 -1
- package/dist/components/admin-picker-options.d.cts +11 -0
- package/dist/components/admin-picker-options.d.ts +11 -0
- package/dist/components/admin-pickers.d.cts +2 -11
- package/dist/components/admin-pickers.d.ts +2 -11
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +17 -19
- package/dist/index.js.map +1 -1
- package/dist/lib/task-decision.d.cts +16 -0
- package/dist/lib/task-decision.d.ts +16 -0
- package/dist/lib/use-org-unit-names.d.cts +10 -0
- package/dist/lib/use-org-unit-names.d.ts +10 -0
- package/dist/next/index.cjs +1 -1
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.js +7 -8
- package/dist/next/index.js.map +1 -1
- package/dist/next/workflow-chat-route.cjs +19 -1
- package/dist/next/workflow-chat-route.cjs.map +1 -1
- package/dist/next/workflow-chat-route.js +2 -3
- package/dist/next/workflow-chat-route.js.map +1 -1
- package/dist/pages/admin/delegations/index.cjs +1 -1
- package/dist/pages/admin/delegations/index.cjs.map +1 -1
- package/dist/pages/admin/delegations/index.js +2 -3
- package/dist/pages/admin/orgs/index.cjs +1 -1
- package/dist/pages/admin/orgs/index.cjs.map +1 -1
- package/dist/pages/admin/orgs/index.js +2 -3
- package/dist/pages/admin/users/index.cjs +1 -1
- package/dist/pages/admin/users/index.cjs.map +1 -1
- package/dist/pages/admin/users/index.js +2 -3
- package/dist/pages/admin/webhook-endpoints/index.cjs.map +1 -1
- package/dist/pages/admin/webhook-endpoints/index.js +1 -2
- package/dist/pages/cc/index.cjs.map +1 -1
- package/dist/pages/cc/index.js +1 -2
- package/dist/pages/dashboard/index.cjs.map +1 -1
- package/dist/pages/dashboard/index.js +1 -2
- package/dist/pages/delegations/index.cjs +1 -1
- package/dist/pages/delegations/index.cjs.map +1 -1
- package/dist/pages/delegations/index.js +2 -3
- package/dist/pages/inbox/index.cjs.map +1 -1
- package/dist/pages/inbox/index.js +1 -2
- package/dist/pages/instances/detail/index.cjs +1 -1
- package/dist/pages/instances/detail/index.cjs.map +1 -1
- package/dist/pages/instances/detail/index.js +2 -3
- package/dist/pages/instances/new/index.cjs.map +1 -1
- package/dist/pages/instances/new/index.js +1 -2
- package/dist/pages/login/index.cjs +1 -1
- package/dist/pages/login/index.cjs.map +1 -1
- package/dist/pages/login/index.js +2 -3
- package/dist/pages/root/index.cjs.map +1 -1
- package/dist/pages/root/index.js +1 -2
- package/dist/pages/search/index.cjs.map +1 -1
- package/dist/pages/search/index.js +1 -2
- package/dist/pages/sent/index.cjs.map +1 -1
- package/dist/pages/sent/index.js +1 -2
- package/dist/pages/settings/notifications/index.cjs.map +1 -1
- package/dist/pages/settings/notifications/index.js +2 -3
- package/dist/pages/templates/categories/index.cjs +1 -1
- package/dist/pages/templates/categories/index.cjs.map +1 -1
- package/dist/pages/templates/categories/index.js +2 -3
- package/dist/pages/templates/compose/index.cjs +1 -1
- package/dist/pages/templates/compose/index.cjs.map +1 -1
- package/dist/pages/templates/compose/index.js +2 -3
- package/dist/pages/templates/designer/index.cjs +1 -1
- package/dist/pages/templates/designer/index.cjs.map +1 -1
- package/dist/pages/templates/designer/index.js +2 -3
- package/dist/pages/templates/index.cjs.map +1 -1
- package/dist/pages/templates/index.js +1 -2
- package/dist/pages/templates/versions/index.cjs.map +1 -1
- package/dist/pages/templates/versions/index.js +1 -2
- package/dist/views/admin/delegations/index.cjs +1 -1
- package/dist/views/admin/delegations/index.js +1 -1
- package/dist/views/admin/index.cjs +1 -1
- package/dist/views/admin/index.js +3 -3
- package/dist/views/admin/orgs/index.cjs +1 -1
- package/dist/views/admin/orgs/index.js +1 -1
- package/dist/views/admin/users/index.cjs +1 -1
- package/dist/views/admin/users/index.js +1 -1
- package/dist/views/admin/webhook-endpoints/index.cjs +1 -1
- package/dist/views/admin/webhook-endpoints/index.cjs.map +1 -1
- package/dist/views/admin/webhook-endpoints/index.js +52 -53
- package/dist/views/admin/webhook-endpoints/index.js.map +1 -1
- package/dist/views/cc/index.cjs +1 -1
- package/dist/views/cc/index.cjs.map +1 -1
- package/dist/views/cc/index.js +2 -3
- package/dist/views/dashboard/index.cjs +1 -1
- package/dist/views/dashboard/index.cjs.map +1 -1
- package/dist/views/dashboard/index.js +2 -3
- package/dist/views/delegations/index.cjs +1 -1
- package/dist/views/delegations/index.js +1 -1
- package/dist/views/forms/builder/index.cjs +1 -1
- package/dist/views/forms/builder/index.js +1 -1
- package/dist/views/forms/renderer/index.cjs +1 -1
- package/dist/views/forms/renderer/index.js +1 -1
- package/dist/views/forms/renderer/org-unit-field-options.d.cts +44 -0
- package/dist/views/forms/renderer/org-unit-field-options.d.ts +44 -0
- package/dist/views/forms/renderer/org-unit-field.d.cts +23 -0
- package/dist/views/forms/renderer/org-unit-field.d.ts +23 -0
- package/dist/views/inbox/index.cjs +1 -1
- package/dist/views/inbox/index.cjs.map +1 -1
- package/dist/views/inbox/index.js +133 -137
- package/dist/views/inbox/index.js.map +1 -1
- package/dist/views/instances/approver-filled-form.d.cts +9 -2
- package/dist/views/instances/approver-filled-form.d.ts +9 -2
- package/dist/views/instances/detail/index.cjs +1 -1
- package/dist/views/instances/detail/index.js +1 -1
- package/dist/views/instances/detail/sections/InstanceHistorySection.d.cts +8 -1
- package/dist/views/instances/detail/sections/InstanceHistorySection.d.ts +8 -1
- package/dist/views/instances/detail/sections/container-helpers.d.cts +0 -1
- package/dist/views/instances/detail/sections/container-helpers.d.ts +0 -1
- package/dist/views/instances/detail/sections/shared.d.cts +2 -2
- package/dist/views/instances/detail/sections/shared.d.ts +2 -2
- package/dist/views/instances/new/index.cjs +1 -1
- package/dist/views/instances/new/index.cjs.map +1 -1
- package/dist/views/instances/new/index.js +24 -21
- package/dist/views/instances/new/index.js.map +1 -1
- package/dist/views/login/index.cjs +1 -1
- package/dist/views/login/index.js +1 -1
- package/dist/views/search/index.cjs +1 -1
- package/dist/views/search/index.cjs.map +1 -1
- package/dist/views/search/index.js +2 -3
- package/dist/views/sent/index.cjs +1 -1
- package/dist/views/sent/index.cjs.map +1 -1
- package/dist/views/sent/index.js +2 -3
- package/dist/views/settings/index.js +1 -1
- package/dist/views/settings/notifications/index.js +1 -1
- package/dist/views/templates/categories/index.cjs +1 -1
- package/dist/views/templates/categories/index.js +1 -1
- package/dist/views/templates/compose/index.cjs +1 -1
- package/dist/views/templates/compose/index.js +1 -1
- package/dist/views/templates/designer/approver-resolver-model.d.cts +211 -0
- package/dist/views/templates/designer/approver-resolver-model.d.ts +211 -0
- package/dist/views/templates/designer/dry-run-assignee-label.d.cts +2 -0
- package/dist/views/templates/designer/dry-run-assignee-label.d.ts +2 -0
- package/dist/views/templates/designer/dry-run-sample-data.d.cts +6 -0
- package/dist/views/templates/designer/dry-run-sample-data.d.ts +6 -0
- package/dist/views/templates/designer/dynamic-form-resolver-options.d.cts +25 -0
- package/dist/views/templates/designer/dynamic-form-resolver-options.d.ts +25 -0
- package/dist/views/templates/designer/index.cjs +1 -1
- package/dist/views/templates/designer/index.js +1 -1
- package/dist/views/templates/designer/node-actor-resolver-options.d.cts +38 -0
- package/dist/views/templates/designer/node-actor-resolver-options.d.ts +38 -0
- package/dist/views/templates/index.cjs +1 -1
- package/dist/views/templates/index.cjs.map +1 -1
- package/dist/views/templates/index.js +50 -51
- package/dist/views/templates/index.js.map +1 -1
- package/dist/views/templates/versions/index.cjs +1 -1
- package/dist/views/templates/versions/index.cjs.map +1 -1
- package/dist/views/templates/versions/index.js +7 -8
- package/dist/views/templates/versions/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunks/FormBuilderView-CUOyS07f.cjs +0 -3
- package/dist/chunks/FormBuilderView-CUOyS07f.cjs.map +0 -1
- package/dist/chunks/FormBuilderView-ClLnQ1e_.js.map +0 -1
- package/dist/chunks/FormRendererView-BsTwZkqU.js.map +0 -1
- package/dist/chunks/FormRendererView-GpsE03np.cjs +0 -4
- package/dist/chunks/FormRendererView-GpsE03np.cjs.map +0 -1
- package/dist/chunks/admin-pickers-BRHk3qKq.cjs +0 -2
- package/dist/chunks/admin-pickers-BRHk3qKq.cjs.map +0 -1
- package/dist/chunks/admin-pickers-Djq3h-UR.js.map +0 -1
- package/dist/chunks/approver-filled-form-D1DmqDVP.cjs +0 -2
- package/dist/chunks/approver-filled-form-D1DmqDVP.cjs.map +0 -1
- package/dist/chunks/approver-filled-form-DuQGPtNB.js +0 -95
- package/dist/chunks/approver-filled-form-DuQGPtNB.js.map +0 -1
- package/dist/chunks/compose-Cock_B2Q.cjs +0 -2
- package/dist/chunks/compose-Cock_B2Q.cjs.map +0 -1
- package/dist/chunks/compose-jnvnnVfN.js.map +0 -1
- package/dist/chunks/designer-B8Gvew_k.js.map +0 -1
- package/dist/chunks/designer-CAEFV1ve.cjs +0 -65
- package/dist/chunks/designer-CAEFV1ve.cjs.map +0 -1
- package/dist/chunks/detail-CExpbazF.js +0 -2629
- package/dist/chunks/detail-CExpbazF.js.map +0 -1
- package/dist/chunks/detail-DIY-L4i-.cjs +0 -2
- package/dist/chunks/detail-DIY-L4i-.cjs.map +0 -1
- package/dist/chunks/orgs-BeeDDWL1.cjs +0 -2
- package/dist/chunks/task-node-label-BF6UllxP.cjs +0 -2
- package/dist/chunks/task-node-label-BF6UllxP.cjs.map +0 -1
- package/dist/chunks/task-node-label-CWZgOBj0.js +0 -9
- package/dist/chunks/task-node-label-CWZgOBj0.js.map +0 -1
|
@@ -1 +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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"}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { r as e } from "../../../chunks/router-adapter-
|
|
3
|
-
import { t } from "../../../chunks/
|
|
4
|
-
import {
|
|
2
|
+
import { r as e } from "../../../chunks/router-adapter-CkxCyzf5.js";
|
|
3
|
+
import { r as t } from "../../../chunks/routes-config-BcNaWJWJ.js";
|
|
4
|
+
import { t as n } from "../../../chunks/format-date-time-B0LdmWg4.js";
|
|
5
5
|
import { useEffect as r, useMemo as i, useState as a } from "react";
|
|
6
6
|
import { PageHeader as o, Section as s, SectionGroup as c, Table as l, Typography as u } from "@mezzanine-ui/react";
|
|
7
7
|
import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
8
8
|
import m from "@mezzanine-ui/react/ContentHeader";
|
|
9
9
|
import { readTemplateDesigner as h, rollbackApprovalTemplateVersion as g } from "@rytass/bpm-core-client/template";
|
|
10
|
-
|
|
10
|
+
// src/views/templates/versions/TemplateVersionsView.tsx
|
|
11
11
|
function _({ templateId: _ }) {
|
|
12
|
-
let y = e(), b =
|
|
12
|
+
let y = e(), b = t(), [x, S] = a(null), [C, w] = a(null), [T, E] = a(!0), [D, O] = a(!1);
|
|
13
13
|
r(() => {
|
|
14
14
|
M();
|
|
15
15
|
}, [_]);
|
|
16
16
|
let k = i(() => (x?.versions ?? []).map((e) => ({
|
|
17
17
|
formVersion: x?.formVersions.find((t) => t.id === e.formDefinitionVersionId)?.label ?? "未綁定",
|
|
18
18
|
key: e.id,
|
|
19
|
-
publishedAt:
|
|
19
|
+
publishedAt: n(e.publishedAt),
|
|
20
20
|
status: e.status,
|
|
21
|
-
updatedAt:
|
|
21
|
+
updatedAt: n(e.updatedAt),
|
|
22
22
|
version: `v${e.version}`,
|
|
23
23
|
versionId: e.id
|
|
24
24
|
})), [x]), A = i(() => [
|
|
@@ -100,7 +100,6 @@ function _({ templateId: _ }) {
|
|
|
100
100
|
function v(e) {
|
|
101
101
|
return e instanceof Error ? e.message : "發生未知錯誤";
|
|
102
102
|
}
|
|
103
|
-
//#endregion
|
|
104
103
|
export { _ as TemplateVersionsView };
|
|
105
104
|
|
|
106
105
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_Fragment","useRouterAdapter","useBPMRoutes","Fragment$1","ContentHeader","TemplateVersionsView","router","routes","record","setRecord","useState","error","setError","loading","setLoading","rollingBack","setRollingBack","templateId","rows","useMemo","formVersion","version","
|
|
1
|
+
{"version":3,"file":"index.js","names":["_Fragment","useRouterAdapter","useBPMRoutes","formatDateTime","Fragment$1","ContentHeader","TemplateVersionsView","router","routes","record","setRecord","useState","error","setError","loading","setLoading","rollingBack","setRollingBack","templateId","rows","useMemo","formVersion","version","columns","actions","row","handleRollback","refreshVersions","readTemplateDesigner","requestError","readErrorMessage","rollbackApprovalTemplateVersion","versionId","PageHeader","SectionGroup","Section","Typography","Table"],"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":";;;;;;;;;;AAqCA,SAAgBM,EAAqB,EACnC,iBAC0C;CAC1C,IAAMC,IAASN,EAAiB,GAC1BO,IAASN,EAAa,GACtB,CAACO,GAAQC,KAAaC,EAAwC,IAAI,GAClE,CAACC,GAAOC,KAAYF,EAAwB,IAAI,GAChD,CAACG,GAASC,KAAcJ,EAAS,EAAI,GACrC,CAACK,GAAaC,KAAkBN,EAAS,EAAK;CAEpD,QAAsB;EACpB,EAAqB;CACvB,GAAG,CAACO,CAAU,CAAC;CAEf,IAAMC,IAAOC,SAERX,GAAQ,YAAY,CAAC,EAAA,CAAG,KAAK,OAAa;EACzC,aACEA,GAAQ,aAAa,MAClB,MAAgBY,EAAY,OAAOC,EAAQ,uBAC9C,CAAC,EAAE,SAAS;EACd,KAAKA,EAAQ;EACb,aAAanB,EAAemB,EAAQ,WAAW;EAC/C,QAAQA,EAAQ;EAChB,WAAWnB,EAAemB,EAAQ,SAAS;EAC3C,SAAS,IAAIA,EAAQ;EACrB,WAAWA,EAAQ;CACrB,EAAE,GACJ,CAACb,CAAM,CACT,GACMc,IAAUH,QACmB;EAC/B;GAAE,WAAW;GAAW,KAAK;GAAW,OAAO;GAAM,OAAO;EAAI;EAChE;GAAE,WAAW;GAAU,KAAK;GAAU,OAAO;GAAM,OAAO;EAAI;EAC9D;GACE,WAAW;GACX,KAAK;GACL,OAAO;GACP,OAAO;EACT;EACA;GACE,WAAW;GACX,KAAK;GACL,OAAO;GACP,OAAO;EACT;EACA;GACE,WAAW;GACX,KAAK;GACL,OAAO;GACP,OAAO;EACT;CACF,GACA,CAAC,CACH,GACMI,IAAUJ,SACmB;EAC/B,SAAS,MAAwD,CAC/D;GACE,gBAAyBJ,KAAeS,EAAI,WAAW;GACvD,MAAM;GACN,eAAqB,KAAKC,EAAeD,EAAI,SAAS;EACxD,CACF;EACA,SAAS;EACT,OAAO;CACT,IACA,CAACT,CAAW,CACd;CAEA,eAAeW,IAAiC;EAE9C,AADAZ,EAAW,EAAI,GACfF,EAAS,IAAI;EAEb,IAAI;GACF,EAAU,MAAMe,EAAqBV,CAAU,CAAC;EAClD,SAASW,GAAuB;GAC9B,EAASC,EAAiBD,CAAY,CAAC;EACzC,UAAU;GACR,EAAW,EAAK;EAClB;CACF;CAEA,eAAeH,EAAe,GAAkC;EAE9D,AADAT,EAAe,EAAI,GACnBJ,EAAS,IAAI;EAEb,IAAI;GAEF,AADA,MAAMkB,EAAgCC,CAAS,GAC/C,MAAML,EAAgB;EACxB,SAASE,GAAuB;GAC9B,EAASC,EAAiBD,CAAY,CAAC;EACzC,UAAU;GACR,EAAe,EAAK;EACtB;CACF;CAEA,OACE,kBAAA7B,GAAA,EAAA,UAAA,CACI,kBAACiC,GAAD,EAAA,UACE,kBAAC5B,GAAD;EACE,aAAY;EACZ,mBAAyBE,EAAO,KAAKC,EAAO,UAAU,CAAC;EACvD,OAAOC,GAAQ,SAAS,QAAQ;CACjC,CAAA,EACS,CAAA,GAEZ,kBAACyB,GAAD,EAAA,UACE,kBAACC,GAAD,EAAA,UAAA,CACGvB,IACC,kBAACwB,GAAD;EAAY,OAAM;EAAa,SAAQ;EACpC,UAAAxB;CACS,CAAA,IACV,MACJ,kBAACyB,GAAD;EACW;EACA;EACT,YAAYlB;EACZ,WAAA;EACS;CACV,CAAA,CACM,EAAA,CAAA,EACG,CAAA,CACd,EAAA,CAAA;AAER;AAEA,SAASW,EAAiB,GAAwB;CAChD,OAAOlB,aAAiB,QAAQA,EAAM,UAAU;AAClD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rytass/bpm-core-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.1",
|
|
4
4
|
"description": "BPM approval workflow React components and views for the Rytass BPM stack. Ships AuthProvider, NotificationDrawer + bell widget, host-facing hooks (useBPMMember / useBPMLogout / useBPMRoutes), and full page-body views for inbox / instances / templates / forms / admin / settings on top of Mezzanine UI and the BPM client functions. The host owns the navigation shell — BPM does not bundle a layout.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bpm",
|
|
@@ -536,8 +536,8 @@
|
|
|
536
536
|
"@mezzanine-ui/core": ">=1.0.0",
|
|
537
537
|
"@mezzanine-ui/icons": ">=1.0.0",
|
|
538
538
|
"@mezzanine-ui/react": ">=1.0.0",
|
|
539
|
-
"@rytass/bpm-core-client": "^0.
|
|
540
|
-
"@rytass/bpm-core-shared": "^0.
|
|
539
|
+
"@rytass/bpm-core-client": "^0.18.1",
|
|
540
|
+
"@rytass/bpm-core-shared": "^0.18.1",
|
|
541
541
|
"@uiw/react-codemirror": ">=4.0.0",
|
|
542
542
|
"@xyflow/react": ">=12.0.0",
|
|
543
543
|
"ai": ">=6.0.0",
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
"use client";const e=require("./rolldown-runtime-BocRIvOZ.cjs"),t=require("./bpm-form-field-Bc6k4ZEO.cjs"),n=require("./FormRendererView-GpsE03np.cjs");let r=require("react"),i=require("@mezzanine-ui/react"),a=require("react/jsx-runtime"),o=require("@mezzanine-ui/core/form"),s=require("@mezzanine-ui/icons"),c=require("@rytass/bpm-core-client/form"),l=require("@rytass/bpm-core-shared/form"),u=require("@hello-pangea/dnd"),d=require("next/dynamic");d=e.t(d,1);let f=require("@codemirror/lang-json"),p=require("@codemirror/view");var m={alignItems:`center`,border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:4,color:`var(--mzn-color-text-neutral)`,display:`flex`,minHeight:160,padding:12,width:`100%`},h=[(0,f.json)(),p.EditorView.lineWrapping,p.EditorView.theme({"&":{border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:`4px`,fontSize:`13px`,width:`100%`},"&.cm-focused":{outline:`1px solid var(--mzn-color-border-primary)`},".cm-content":{fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace`,minHeight:`100%`},".cm-editor":{width:`100%`},".cm-gutters":{borderRight:`1px solid var(--mzn-color-border-neutral)`},".cm-scroller":{fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace`}})],g=(0,d.default)(()=>import(`@uiw/react-codemirror`),{loading:()=>(0,a.jsx)(`div`,{style:m,children:`載入 JSON 編輯器`}),ssr:!1});function ee({disabled:e=!1,height:t,name:n,onChange:r,placeholder:i,value:o}){return(0,a.jsx)(g,{"aria-label":n,basicSetup:{autocompletion:!0,bracketMatching:!0,closeBrackets:!0,defaultKeymap:!0,foldGutter:!0,highlightActiveLine:!0,highlightSelectionMatches:!0,lineNumbers:!0,syntaxHighlighting:!0},editable:!e,extensions:[...h],height:t,indentWithTab:!1,onChange:r,placeholder:i,readOnly:e,theme:`light`,value:o,width:`100%`})}var _=[{description:`單行文字、姓名、編號`,icon:s.AlignLeftIcon,label:`文字`,type:`text`},{description:`多行補充內容`,icon:s.FileIcon,label:`長文字`,type:`textarea`},{description:`金額、數量、分數`,icon:s.CurrencyDollarIcon,label:`數字`,type:`number`},{description:`金額與費用`,icon:s.CurrencyDollarIcon,label:`金額`,type:`money`},{description:`日期或到期日`,icon:s.CalendarIcon,label:`日期`,type:`date`},{description:`日期與時間`,icon:s.CalendarIcon,label:`日期時間`,type:`datetime`},{description:`是 / 否狀態`,icon:s.CheckedIcon,label:`開關`,type:`boolean`},{description:`固定選項擇一`,icon:s.ListIcon,label:`下拉選單`,type:`select`},{description:`可搜尋的固定選項`,icon:s.ListIcon,label:`自動完成`,type:`autocomplete`},{description:`固定選項單選`,icon:s.DotGridIcon,label:`單選`,type:`radio`},{description:`固定選項複選`,icon:s.CheckedOutlineIcon,label:`複選`,type:`checkbox`},{description:`附件或佐證資料`,icon:s.FileAttachmentIcon,label:`附件`,type:`file_upload`},{description:`從成員名單挑選一或多位人員`,icon:s.UserIcon,label:`人員選擇`,type:`member`},{description:`多列多欄明細`,icon:s.DotGridIcon,label:`表格`,type:`table`}],v=_.filter(e=>(0,l.isTableColumnFieldType)(e.type)).map(e=>({id:e.type,name:e.label})),te={alignItems:`start`,display:`flex`,flexWrap:`wrap`,gap:16},ne={flex:`0.55 1 300px`,minWidth:0},re={flex:`1.45 1 720px`,minWidth:620,paddingBottom:260},ie=240,ae={BOOLEAN:`開關`,NUMBER:`數字`,STRING:`文字或選單`,STRING_ARRAY:`多選`},oe=/^schema\.fields\[(\d+)\](?:\.columns\[(\d+)\])?\.dataSource\.bindings missing required parameter: (.+)$/u,se=/^schema\.fields\[(\d+)\](?:\.columns\[(\d+)\])?\.dataSource\.bindings unknown parameter: (.+)$/u,y={display:`grid`,gap:12},ce={display:`flex`,flexWrap:`wrap`,gap:6},le={flex:`0 0 auto`,whiteSpace:`nowrap`},ue={display:`grid`,gap:8},de={alignItems:`center`,cursor:`grab`,display:`flex`,gap:12,touchAction:`none`},fe={display:`grid`,flex:`1 1 auto`,gap:2,minWidth:0},pe={alignItems:`center`,display:`flex`,flex:`0 0 auto`,gap:4},me={alignItems:`center`,display:`flex`,gap:6},he={cursor:`pointer`,userSelect:`none`},ge={filter:`drop-shadow(0 8px 18px rgba(0, 0, 0, 0.12))`},_e={backgroundColor:`color-mix(in srgb, var(--mzn-color-primary) 8%, var(--mzn-color-bg-surface))`,boxShadow:`inset 0 0 0 1px var(--mzn-color-border-primary)`},ve={alignItems:`center`,border:`1px dashed var(--mzn-color-border-neutral)`,borderRadius:6,display:`grid`,gap:12,minHeight:240,padding:32,textAlign:`center`},ye={display:`flex`,gap:8,justifyContent:`center`},be={display:`grid`,gap:14},xe={display:`grid`,columnGap:16,gridTemplateColumns:`repeat(auto-fit, minmax(280px, 360px))`,justifyContent:`start`,maxWidth:736,rowGap:8},Se={gridColumn:`1 / -1`},Ce={alignItems:`center`,display:`flex`,gap:8,gridColumn:`1 / -1`,justifyContent:`flex-end`},b={gridColumn:`1 / -1`},we={alignItems:`start`,display:`block`,width:`100%`},Te={...we,gridColumn:`1 / -1`},Ee={minWidth:0,width:`100%`},De={minWidth:`100%`,width:`100%`},Oe={display:`grid`,gap:14},ke={alignItems:`start`,display:`block`,width:`100%`},Ae={minWidth:0,width:`100%`},je={gridColumn:`2 / -1`},Me={display:`grid`,gap:10,width:`100%`},Ne={display:`grid`,gap:8,gridTemplateColumns:`repeat(auto-fit, minmax(160px, 1fr))`},Pe={display:`inline-flex`},Fe={display:`grid`,gap:16},Ie={display:`grid`,gap:8},Le={display:`flex`,justifyContent:`flex-end`},Re={color:`var(--mzn-color-text-error)`,fontSize:`0.72em`,lineHeight:0,marginLeft:2,verticalAlign:`super`},ze={display:`grid`,gap:10,gridColumn:`1 / -1`},Be={display:`grid`,gap:2},Ve={display:`grid`,gap:8},He={display:`flex`,justifyContent:`flex-start`},Ue={display:`flex`,flexWrap:`wrap`,gap:4},We={backgroundColor:`var(--mzn-color-bg-surface-secondary)`,borderRadius:6,display:`grid`,gap:4,padding:10},Ge={...xe,gridTemplateColumns:`minmax(280px, 520px)`,padding:`4px 0 8px`},Ke={display:`grid`,gap:8,gridColumn:`1 / -1`},qe={alignItems:`center`,display:`flex`,gap:12,justifyContent:`space-between`},Je={alignItems:`baseline`,display:`flex`,gap:2},Ye={display:`grid`,gap:4};function Xe(e){e&&(e.style.width=`100%`)}var Ze={fields:[],schemaVersion:1},Qe={layout:[],schemaVersion:1},x=`__STATIC_OPTIONS__`,S=`__CONSTANT__`,C=`__ROW_FIELD__:`,w=`__UNBOUND__`,$e=[{id:x,name:`靜態選項`}],et=[{id:`single`,name:`單選`},{id:`multiple`,name:`複選`}],tt=[{id:`unset`,name:`不預設`},{id:`true`,name:`是`},{id:`false`,name:`否`}],nt=[{id:`true`,name:`是`},{id:`false`,name:`否`}],rt=[{label:`顯示`,name:`fieldVisibleWhen`,supportingText:`符合條件時才顯示這個欄位。`,target:`visibleWhen`},{label:`必填`,name:`fieldRequiredWhen`,supportingText:`符合條件時才要求填寫這個欄位。`,target:`requiredWhen`},{label:`唯讀`,name:`fieldReadonlyWhen`,supportingText:`符合條件時不允許修改這個欄位。`,target:`readonlyWhen`}];function T({onChange:e,value:d}){let f=d?.schema??Ze,p=d?.uiSchema??Qe,[m,h]=(0,r.useState)(f),[g,T]=(0,r.useState)(p),[ct,D]=(0,r.useState)(A(f)),[pt,j]=(0,r.useState)(A(p)),[St,Ct]=(0,r.useState)({}),[wt,N]=(0,r.useState)(null),[P,Tt]=(0,r.useState)(`design`),[F,I]=(0,r.useState)(null),[L,Et]=(0,r.useState)([]),[R,Dt]=(0,r.useState)(null),[Ot,kt]=(0,r.useState)(`loading`),[z,B]=(0,r.useState)(null),[At,jt]=(0,r.useState)(!1),[V,H]=(0,r.useState)(null),[Mt,U]=(0,r.useState)(null);(0,r.useEffect)(()=>{let e=!0;return(0,c.listFormDataSources)().then(t=>{e&&(Et(t),Dt(null),kt(`ready`))}).catch(t=>{e&&(Et([]),Dt(`目前無法載入 DataSource Catalog,請稍後重試。`),kt(`unavailable`))}),()=>{e=!1}},[]),(0,r.useEffect)(()=>{m.fields.some(e=>e.fieldKey===F)||I(m.fields[0]?.fieldKey??null)},[m.fields,F]),(0,r.useEffect)(()=>{Ct(e=>(0,c.buildFormRendererValues)(m.fields,e))},[m.fields]),(0,r.useEffect)(()=>{P!==`advanced`&&(D(A(m)),j(A(g)))},[P,m,g]);let W=(0,r.useMemo)(()=>m.fields.find(e=>e.fieldKey===F)??m.fields[0]??null,[m.fields,F]);(0,r.useEffect)(()=>{e?.({schema:m,uiSchema:g})},[m,g]);function G(e){let t=m.fields.length+1,n=(0,c.createFieldDefinition)(e,t);h({...m,fields:[...m.fields,n]}),T({...g,layout:[...g.layout,{fieldKey:n.fieldKey,width:e===`textarea`||e===`file_upload`||e===`table`?`FULL`:`HALF`}]}),I(n.fieldKey),Tt(`design`),N(null)}function Nt(e){let t=e;t===`advanced`&&P!==`advanced`&&(D(A(m)),j(A(g))),Tt(t)}function Pt(e){let t=m.fields.flatMap(t=>(0,l.isTableFieldDefinition)(t)?t.columns.flatMap(n=>(0,l.isFormDataSourceFieldDefinition)(n)&&(0,c.readFormDataSourceFieldDependencyKeys)(n).includes(e)?[`${t.fieldKey}.${n.fieldKey}`]:[]):(0,l.isFormDataSourceFieldDefinition)(t)&&(0,c.readFormDataSourceFieldDependencyKeys)(t).includes(e)?[t.fieldKey]:[]);t.length>0?H({affectedFieldKeys:t,fieldKey:e,kind:`remove-field`}):Ft(e)}function Ft(e){let t=m.fields.filter(t=>t.fieldKey!==e);h({...m,fields:t}),T({...g,layout:g.layout.filter(t=>t.fieldKey!==e)}),I(F===e?t[0]?.fieldKey??null:F),N(null),B(null)}function It(e){let t=e.destination;t&&e.source.index!==t.index&&(h(n=>({...n,fields:M(n.fields,e.source.index,t.index)})),T(n=>({...n,layout:M(n.layout,e.source.index,t.index)})),N(null))}function K(e){q(t=>({...t,...e}))}function q(e){if(!W)return;let t=W.fieldKey,n=e(W),r=n.fieldKey,i={...m,fields:m.fields.map(e=>e.fieldKey===t?n:e)},a=t===r?i:(0,c.renameFormDataSourceFieldBindings)(i,t,r);h(a),T({...g,layout:g.layout.map(e=>e.fieldKey===t?{...e,fieldKey:r}:e)}),I(r),N(null),B(null)}function Lt(e){q(()=>e)}function J(e,t){h(n=>({...n,fields:n.fields.map(n=>n.fieldKey===e&&(0,l.isTableFieldDefinition)(n)?t(n):n)})),N(null),B(null)}function Y(e,t,n){let r=e.columns[t]?.fieldKey;J(e.fieldKey,e=>{let i={...e,columns:e.columns.map((e,r)=>r===t?n:e)};return typeof r==`string`&&r!==n.fieldKey?(0,c.renameFormTableColumnBindings)(i,r,n.fieldKey):i})}function Rt(e){let t=(0,c.createTableColumnDefinition)(e.columns,`text`);J(e.fieldKey,e=>({...e,columns:[...e.columns,t]})),U(e.columns.length)}function zt(e,t){J(e,e=>({...e,columns:e.columns.filter((e,n)=>n!==t)})),U(e=>e===null||e<t?e:e===t?null:e-1)}function Bt(e,t,n){J(e.fieldKey,e=>({...e,columns:M(e.columns,t,n)})),U(e=>e===null?e:e===t?n:e>t&&e<=n?e-1:e<t&&e>=n?e+1:e)}function Vt(e,t,n){if(e.type!==`select`&&e.type!==`autocomplete`||(0,l.readFormFieldSelectionMode)(e)===t)return;let r=e.defaultValue,i=t===`multiple`?typeof r==`string`?[r]:r:Array.isArray(r)?r[0]:r;n(e,{...e,defaultValue:i,mode:t},`選擇模式變更可能轉換或捨棄既有預設值。`)}function Ht(e,t,n=`此變更會替換目前選項來源;既有 options、dynamic reference 或 bindings 可能失效。`){JSON.stringify(e)!==JSON.stringify(t)&&H({fieldKey:e.fieldKey,impact:n,kind:`replace-field`,nextField:t})}function Ut(e,t,n){if(!t)return;if(t===x){if(!(0,l.isFormDataSourceFieldDefinition)(e))return;let{dataSource:t,defaultValue:r,...i}=e;n({...i,options:[]});return}let r=L.find(e=>E(e)===t);if(!r)return;if((0,l.isFormDataSourceFieldDefinition)(e)){let t=new Set(r.parameters.map(e=>e.key)),i=e.dataSource.bindings.filter(e=>t.has(e.parameter));n({...e,dataSource:{bindings:i,key:r.key,version:r.version}});return}let{options:i,defaultValue:a,...o}=e;n({...o,dataSource:{bindings:[],key:r.key,version:r.version}})}function Wt(){V&&(Gt(V),H(null))}function Gt(e){e.kind===`remove-field`?Ft(e.fieldKey):e.kind===`remove-column`?zt(e.fieldKey,e.columnIndex):e.kind===`replace-column`?(J(e.fieldKey,t=>({...t,columns:t.columns.map(t=>t.fieldKey===e.columnKey?e.nextColumn:t)})),U(e.columnIndex)):(h({...m,fields:m.fields.map(t=>t.fieldKey===e.fieldKey?e.nextField:t)}),N(null),B(null))}async function Kt(){jt(!0);try{let e=await(0,c.lintFormSchema)(m,g);B(e.errors.map(qt))}catch{B([`目前無法完成 DataSource schema 驗證。`])}finally{jt(!1)}}function qt(e){let t=oe.exec(e);if(t?.[1]&&t[3])return`${Jt(t[1],t[2])}尚未指定必要參數「${Yt(t[1],t[2],t[3])}」的來源`;let n=se.exec(e);return n?.[1]&&n[3]?`${Jt(n[1],n[2])}綁定了來源沒有的參數「${n[3]}」`:(0,c.readFormSchemaLintMessage)(e)}function Jt(e,t){let n=m.fields[Number(e)];if(!n)return``;let r=n.label||n.fieldKey,i=Xt(n,t);return i?`「${r}」表格的「${i.label||i.fieldKey}」欄`:`「${r}」欄位`}function Yt(e,t,n){let r=m.fields[Number(e)];if(!r)return n;let i=Xt(r,t)??r,a=(0,l.isFormDataSourceFieldDefinition)(i)?i.dataSource:null;return(a?L.find(e=>e.key===a.key&&e.version===a.version):void 0)?.parameters.find(e=>e.key===n)?.label||n}function Xt(e,t){return typeof t==`string`&&(0,l.isTableFieldDefinition)(e)?e.columns[Number(t)]:void 0}function Zt(e){Ct(e)}function Qt(e,t){h(n=>({...n,fields:n.fields.map(n=>n.fieldKey===e?{...n,required:t}:n)})),N(null)}function $t(e){D(e);try{h(JSON.parse(e)),N(null)}catch{N(`Form Schema JSON 格式不正確`)}}function en(e){j(e);try{T(JSON.parse(e)),N(null)}catch{N(`UI Schema JSON 格式不正確`)}}return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(i.SectionGroup,{children:(0,a.jsx)(i.Section,{children:(0,a.jsxs)(`div`,{style:Fe,children:[(0,a.jsxs)(i.Tab,{activeKey:P,onChange:Nt,size:`sub`,children:[(0,a.jsx)(i.TabItem,{children:`設計`},`design`),(0,a.jsx)(i.TabItem,{children:`預覽`},`preview`),(0,a.jsx)(i.TabItem,{children:`進階`},`advanced`)]}),P===`design`?tn():null,P===`preview`?Vn():null,P===`advanced`?Hn():null]})})})}),V?(0,a.jsx)(i.Modal,{cancelText:`返回`,confirmText:`確認變更`,modalType:`standard`,onCancel:()=>H(null),onClose:()=>H(null),onConfirm:Wt,open:!0,showModalFooter:!0,showModalHeader:!0,title:dt(V),children:V.kind===`remove-field`?(0,a.jsxs)(`div`,{style:Ie,children:[(0,a.jsx)(i.Typography,{variant:`body`,children:`此欄位仍被下列 DataSource binding 使用;移除後請重新設定這些欄位。`}),(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:V.affectedFieldKeys.join(`、`)})]}):V.kind===`remove-column`?(0,a.jsxs)(i.Typography,{variant:`body`,children:[`移除欄「`,V.columnKey,`」後,既有案件仍保留原本的表單版本,但新版本的這一欄資料將不再被填寫。`]}):(0,a.jsx)(i.Typography,{variant:`body`,children:V.impact})}):null]});function tn(){return(0,a.jsxs)(`div`,{style:y,children:[(0,a.jsxs)(`div`,{style:ue,children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`label-primary`,children:`新增欄位`}),(0,a.jsx)(`div`,{style:ce,children:_.map(e=>(0,a.jsx)(i.Button,{icon:e.icon,iconType:`leading`,onClick:()=>G(e.type),size:`sub`,style:le,type:`button`,variant:`base-secondary`,children:e.label},e.type))})]}),(0,a.jsxs)(`div`,{style:te,children:[(0,a.jsxs)(`div`,{style:{...y,...ne},children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`label-primary`,children:`表單畫布`}),m.fields.length>0?(0,a.jsx)(u.DragDropContext,{onDragEnd:It,children:(0,a.jsx)(u.Droppable,{droppableId:`form-builder-fields`,children:e=>(0,a.jsxs)(`div`,{...e.droppableProps,ref:e.innerRef,style:y,children:[m.fields.map((e,t)=>(0,a.jsx)(u.Draggable,{draggableId:e.fieldKey,index:t,children:(t,n)=>zn(e,t,n.isDragging)},e.fieldKey)),e.placeholder]})})}):(0,a.jsxs)(`div`,{style:ve,children:[(0,a.jsxs)(`div`,{style:y,children:[(0,a.jsx)(i.Typography,{component:`h3`,variant:`h3`,children:`尚未建立欄位`}),(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:`從上方新增第一個欄位,或直接建立常用文字欄位開始設計。`})]}),(0,a.jsxs)(`div`,{style:ye,children:[(0,a.jsx)(i.Button,{onClick:()=>G(`text`),variant:`base-primary`,children:`新增文字欄位`}),(0,a.jsx)(i.Button,{onClick:()=>G(`textarea`),variant:`base-secondary`,children:`新增長文字`})]})]})]}),(0,a.jsxs)(`div`,{style:{...y,...re},children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`label-primary`,children:`欄位設定`}),W?nn(W):(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:`請先新增或選取欄位。`})]})]})]})}function nn(e){return(0,a.jsxs)(`div`,{style:be,children:[rn(e),(0,l.isTableFieldDefinition)(e)?cn(e):null,an(e)]})}function rn(e){return(0,a.jsxs)(`div`,{style:xe,children:[(0,a.jsx)(`div`,{style:Ce,children:(0,a.jsx)(i.Badge,{size:`main`,text:it(e.type),variant:`text-info`})}),$(`標題`,`fieldLabel`,(0,a.jsx)(i.Input,{onChange:e=>K({label:e.target.value}),placeholder:`例如:申請金額`,value:e.label,variant:`base`})),$(`欄位 Key`,`fieldKey`,(0,a.jsx)(i.Input,{onChange:e=>K({fieldKey:e.target.value}),placeholder:`例如:amount`,value:e.fieldKey,variant:`base`})),(0,l.isTableFieldDefinition)(e)?null:$(`提示文字`,`fieldPlaceholder`,(0,a.jsx)(i.Input,{onChange:e=>K({placeholder:e.target.value||void 0}),placeholder:`例如:請輸入申請金額`,value:e.placeholder??``,variant:`base`})),on(e,Lt,Ht),O(e)?$(`以連結顯示`,`fieldDisplayAsLink`,(0,a.jsx)(i.Toggle,{checked:e.displayAs===`link`,onChange:e=>q(t=>e.target.checked?O(t)?{...t,displayAs:`link`}:t:ht(t,`displayAs`))})):null,$(`只存不顯示(系統整合用)`,`fieldHidden`,(0,a.jsx)(i.Toggle,{checked:e.hidden===!0,onChange:e=>q(t=>e.target.checked?{...t,hidden:!0,required:!1}:ht(t,`hidden`))})),e.hidden===!0?(0,a.jsx)(i.Typography,{color:`text-neutral`,style:b,variant:`body`,children:`填寫、唯讀與重送畫面都不會顯示這個欄位,值仍會存下來; 透過 API 仍然讀得到這個值,不是權限控管。`}):null]})}function an(e){return(0,a.jsx)(i.Accordion,{defaultExpanded:gt(e),size:`sub`,title:`進階設定`,children:(0,a.jsxs)(`div`,{style:xe,children:[(0,a.jsx)(i.Typography,{component:`h3`,style:Se,variant:`label-primary`,children:`條件規則`}),(0,a.jsx)(i.Typography,{color:`text-neutral`,style:b,variant:`body`,children:`只有需要根據其他欄位改變顯示、必填或唯讀狀態時才需要設定。`}),Nn(e)]})})}function on(e,t,n,r){return O(e)?pn(e,t):(0,c.isNumberFieldDefinition)(e)?mn(e,t):(0,c.isDateFieldDefinition)(e)?hn(e,t):(0,l.isFormOptionFieldDefinition)(e)?gn(e,t,n,r):e.type===`boolean`?An(e,t):e.type===`file_upload`?Mn(e,t):(0,l.isMemberFieldDefinition)(e)?jn(e,t):(0,l.isTableFieldDefinition)(e)?sn(e):null}function sn(e){let t=(0,c.readFormTableRowBounds)(e);return(0,a.jsxs)(a.Fragment,{children:[$(`最少列數`,`fieldMinRows`,Q(e.minRows,t=>J(e.fieldKey,e=>({...e,minRows:t})),`例如:1`,{max:t.maxRows,min:0})),$(`最多列數`,`fieldMaxRows`,Q(e.maxRows,t=>J(e.fieldKey,e=>({...e,maxRows:t})),`未設定即為 ${l.FORM_TABLE_MAX_ROWS}`,{max:l.FORM_TABLE_MAX_ROWS,min:Math.max(t.minRows,1)})),$(`新增列按鈕文字`,`fieldAddRowLabel`,(0,a.jsx)(i.Input,{onChange:t=>J(e.fieldKey,e=>({...e,addRowLabel:t.target.value||void 0})),placeholder:`預設為「新增一列」`,value:e.addRowLabel??``,variant:`base`}))]})}function cn(e){return(0,a.jsxs)(`div`,{style:Ke,children:[(0,a.jsxs)(`div`,{style:qe,children:[(0,a.jsxs)(i.Typography,{component:`h3`,variant:`label-primary`,children:[`欄(`,e.columns.length,`)`]}),(0,a.jsx)(i.Button,{icon:s.PlusIcon,iconType:`leading`,onClick:()=>Rt(e),size:`sub`,type:`button`,variant:`base-secondary`,children:`新增欄`})]}),ln(e)]})}function ln(e){let t=e.columns.map((t,n)=>({fieldKey:t.fieldKey,index:n,key:`${e.fieldKey}-column-${n}`,label:t.label,type:t.type})),n=[{key:`label`,render:t=>(0,a.jsx)(i.Input,{fullWidth:!0,onChange:n=>Y(e,t.index,{...X(e,t.index),label:n.target.value}),placeholder:`例如:數量`,size:`sub`,value:t.label,variant:`base`}),title:`標題`},{key:`type`,render:t=>(0,a.jsx)(i.Select,{fullWidth:!0,clearable:!1,menuMaxHeight:ie,onChange:n=>dn(e,t.index,n?.id),options:[...v],size:`sub`,value:(0,c.readSelectOption)(v,t.type)}),title:`型別`},{key:`required`,render:t=>(0,a.jsx)(i.Toggle,{checked:X(e,t.index).required===!0,inputProps:{"aria-label":`${t.label||t.fieldKey} 必填`},onChange:n=>Y(e,t.index,{...X(e,t.index),required:n.target.checked}),size:`sub`}),title:`必填`}],r={render:t=>[{disabled:()=>e.columns.length<=1,icon:s.TrashIcon,iconType:`leading`,name:`移除此欄`,onClick:()=>H({columnIndex:t.index,columnKey:t.fieldKey,fieldKey:e.fieldKey,kind:`remove-column`}),variant:`destructive-ghost`}],width:104},o=Mt===null?void 0:t[Mt]?.key;return(0,a.jsx)(i.Table,{actions:r,columns:n,dataSource:t,draggable:{enabled:!0,onDragEnd:(t,n)=>Bt(e,n.fromIndex,n.toIndex)},expandable:{expandedRowKeys:o?[o]:[],expandedRowRender:t=>un(e,t.index),onExpand:(e,t)=>U(e?t.index:null)},fullWidth:!0,rowHeightPreset:`roomy`,showHeader:!0,size:`sub`})}function un(e,t){let n=e.columns[t];return n?(0,a.jsxs)(`div`,{style:Ge,children:[$(`欄位 Key`,`columnFieldKey`,(0,a.jsx)(i.Input,{onChange:r=>Y(e,t,{...n,fieldKey:r.target.value}),placeholder:`例如:qty`,value:n.fieldKey,variant:`base`})),$(`提示文字`,`columnPlaceholder`,(0,a.jsx)(i.Input,{onChange:r=>Y(e,t,{...n,placeholder:r.target.value||void 0}),placeholder:`例如:請輸入數量`,value:n.placeholder??``,variant:`base`})),on(n,n=>{(0,l.isTableColumnFieldType)(n.type)&&Y(e,t,n)},(n,r)=>{(0,l.isTableColumnFieldType)(r.type)&&Y(e,t,r)},e.columns)]}):null}function dn(e,t,n){let r=e.columns[t],i=v.find(e=>e.id===n)?.id;if(!r||!i||r.type===i)return;let a=mt(r,i),o=ft(r);o.length===0?(Y(e,t,a),U(t)):H({columnIndex:t,columnKey:r.fieldKey,fieldKey:e.fieldKey,impact:`「${r.label||r.fieldKey}」改為${fn(i)}後,這一欄的${o.join(`、`)}會被捨棄。`,kind:`replace-column`,nextColumn:a})}function fn(e){return v.find(t=>t.id===e)?.name??e}function X(e,t){let n=e.columns[t];if(!n)throw Error(`Table ${e.fieldKey} has no column at index ${t}.`);return n}function pn(e,t){return(0,a.jsxs)(a.Fragment,{children:[$(`預設值`,`fieldDefaultValue`,e.type===`textarea`?In({name:`fieldDefaultValue`,onChange:n=>t({...e,defaultValue:n||void 0}),placeholder:`輸入此欄位的預設文字`,rows:3,value:k(e.defaultValue)}):(0,a.jsx)(i.Input,{onChange:n=>t({...e,defaultValue:n.target.value||void 0}),placeholder:`輸入此欄位的預設文字`,value:k(e.defaultValue),variant:`base`})),$(`最小長度`,`fieldMinLength`,Q(e.minLength,n=>t({...e,minLength:n}),`例如:2`,{min:0})),$(`最大長度`,`fieldMaxLength`,Q(e.maxLength,n=>t({...e,maxLength:n}),`例如:100`,{min:1}))]})}function mn(e,t){return(0,a.jsxs)(a.Fragment,{children:[$(`預設值`,`fieldDefaultValue`,Q(typeof e.defaultValue==`number`?e.defaultValue:void 0,n=>t({...e,defaultValue:n}),e.type===`money`?`例如:1000`:`輸入預設數值`,{max:e.maximum,min:e.minimum})),$(`最小值`,`fieldMinimum`,Q(e.minimum,n=>t({...e,minimum:n}),`例如:0`)),$(`最大值`,`fieldMaximum`,Q(e.maximum,n=>t({...e,maximum:n}),`例如:999999`))]})}function hn(e,t){return $(`預設值`,`fieldDefaultValue`,Ln(e,k(e.defaultValue),n=>t({...e,defaultValue:n})))}function gn(e,t,n,r){let o=(0,c.readCompatibleFormDataSourceDescriptors)(e.type,L),s={commit:e=>t(e),rowColumns:r},u=(0,l.isFormDataSourceFieldDefinition)(e)?E(e.dataSource):x,d=(0,l.isFormDataSourceFieldDefinition)(e)?L.find(t=>t.key===e.dataSource.key&&t.version===e.dataSource.version):null,f=d?o.some(e=>e.key===d.key&&e.version===d.version):!1,p=[...$e,...o.map(ot),...(0,l.isFormDataSourceFieldDefinition)(e)&&!f?[{id:u,name:`${e.dataSource.key} v${e.dataSource.version}(目前不可用或不支援)`}]:[]],m=(0,l.readFormFieldSelectionMode)(e);return(0,a.jsxs)(a.Fragment,{children:[e.type===`select`||e.type===`autocomplete`?$(`選擇模式`,`fieldSelectionMode`,(0,a.jsx)(i.Select,{clearable:!1,onChange:t=>{(t?.id===`single`||t?.id===`multiple`)&&Vt(e,t.id,n)},options:[...et],value:(0,c.readSelectOption)(et,m)})):$(`選擇模式`,`fieldSelectionMode`,(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:m===`multiple`?`固定複選`:`固定單選`})),$(`選項來源`,`fieldOptionSource`,(0,a.jsx)(i.Select,{clearable:!1,disabled:Ot===`loading`&&!(0,l.isFormDataSourceFieldDefinition)(e),onChange:n=>Ut(e,n?.id,t),options:p,placeholder:`選擇選項來源`,value:(0,c.readSelectOption)(p,u)})),(0,l.isFormDataSourceFieldDefinition)(e)?_n(e,o,s):kn(e,t)]})}function _n(e,t,n){let r=L.find(t=>t.key===e.dataSource.key&&t.version===e.dataSource.version),o=r&&!(0,c.isFormDataSourceDescriptorCompatible)(r,e.type);return(0,a.jsxs)(`div`,{style:ze,children:[Ot===`loading`?(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:`正在載入可用的選項來源…`}):null,R?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:R}):null,r?null:(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:`找不到目前設定的來源版本。設定會保留,但這張表單在來源恢復前無法發布。`}),o?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:`這個來源不支援目前的控制項,請改選其他來源。`}):null,r?vn(r):null,r&&r.parameters.length>0?yn(e,r,n):null,t.length===0&&!R?(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:`沒有支援目前控制項的已註冊來源。`}):null,(0,a.jsx)(`div`,{style:He,children:(0,a.jsx)(i.Button,{disabled:At,loading:At,onClick:()=>void Kt(),size:`sub`,type:`button`,variant:`base-secondary`,children:`檢查全部動態選項設定`})}),z?(0,a.jsx)(`div`,{style:Be,children:z.length>0?z.map(e=>(0,a.jsx)(i.Typography,{color:`text-error`,variant:`caption`,children:e},e)):(0,a.jsx)(i.Typography,{color:`text-success`,variant:`caption`,children:`這張表單的動態選項設定都可以使用。`})}):null]})}function vn(e){return(0,a.jsxs)(`div`,{style:We,children:[e.description?(0,a.jsx)(i.Typography,{variant:`body`,children:e.description}):null,(0,a.jsx)(`div`,{style:Ue,children:at(e).map(e=>(0,a.jsx)(i.Tag,{label:e,readOnly:!0,size:`minor`},e))}),(0,a.jsxs)(i.Typography,{color:`text-neutral`,variant:`caption`,children:[`來源代號:`,e.key,` · v`,e.version]})]})}function yn(e,t,n){let r=t.parameters.map((e,t)=>({key:e.key,index:t,parameter:e}));return(0,a.jsxs)(`div`,{style:Ve,children:[(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`label-secondary`,children:`這個來源需要的條件`}),(0,a.jsx)(i.Table,{columns:[{key:`parameter`,render:e=>(0,a.jsxs)(`div`,{style:Je,children:[(0,a.jsx)(i.Typography,{variant:`input`,children:e.parameter.label??e.parameter.key}),e.parameter.required?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`input`,children:`*`}):null]}),title:`條件`,width:100},{key:`binding`,width:268,render:t=>xn(e,t.parameter,n),title:`值從哪裡來`},{key:`constant`,width:140,render:t=>(0,c.readFormDataSourceBindingValueKind)((0,c.readFormDataSourceBinding)(e,t.parameter.key))===`CONSTANT`?Tn(e,t.parameter.key,t.parameter.type,(0,c.readFormDataSourceBinding)(e,t.parameter.key),n):(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`caption`,children:`—`}),title:`固定值`},{key:`meaning`,render:t=>(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`caption`,children:Cn((0,c.readFormDataSourceBinding)(e,t.parameter.key),t.parameter,n,bn(e,t.parameter,n))}),title:`填寫時的行為`}],dataSource:r,fullWidth:!0,showHeader:!0,size:`sub`})]})}function bn(e,t,n){return(0,c.readCompatibleFormDataSourceBindingFields)(t.type,m.fields,e.fieldKey).length+(n.rowColumns?(0,c.readCompatibleFormTableColumnBindingFields)(t.type,n.rowColumns,e.fieldKey).length:0)}function xn(e,t,n){let r=st((0,c.readFormDataSourceBinding)(e,t.key)),o=n.rowColumns?(0,c.readCompatibleFormTableColumnBindingFields)(t.type,n.rowColumns,e.fieldKey).map(e=>({id:`${C}${e.id}`,name:`同列:${e.name}`})):[],s=[...t.required?[]:[{id:w,name:`未綁定`}],...o,...(0,c.readCompatibleFormDataSourceBindingFields)(t.type,m.fields,e.fieldKey),...t.type===`STRING_ARRAY`?[]:[{id:S,name:`固定常數`}]];return(0,a.jsx)(`div`,{"data-data-source-parameter":t.key,style:Ye,children:(0,a.jsx)(i.Select,{clearable:!1,fullWidth:!0,inputProps:{"aria-label":`${t.label??t.key} 的值來源`,title:(0,c.readSelectOption)(s,r)?.name??``},onChange:r=>Dn(e,t.key,t.type,r?.id,n),options:s,placeholder:`選擇欄位或常數`,size:`sub`,value:(0,c.readSelectOption)(s,r)})})}function Sn(e){return ae[e]}function Cn(e,t,n,r){let i=(0,c.readFormDataSourceBindingValueKind)(e);return i===`CONSTANT`?`固定值,不隨填寫變動`:i===`FIELD`?`隨欄位「${wn(e,n)}」變動`:i===`ROW_FIELD`?`隨同列「${wn(e,n)}」變動`:t.required?r>0?`尚未設定,選項無法載入`:`沒有相容的${Sn(t.type)}欄位,請改用固定值`:`未設定,不做這層篩選`}function wn(e,t){let n=e?.from;if(n?.kind===`FIELD`){let e=m.fields.find(e=>e.fieldKey===n.fieldKey);return e?e.label||e.fieldKey:``}if(n?.kind===`ROW_FIELD`){let e=t.rowColumns?.find(e=>e.fieldKey===n.columnKey);return e?e.label||e.fieldKey:``}return``}function Tn(e,t,n,r,i){return(0,a.jsx)(`div`,{"data-data-source-constant":t,children:En(e,t,n,r,i)})}function En(e,t,n,r,o){let s=(0,c.readFormDataSourceBindingValue)(e,t);if(n===`BOOLEAN`){let n=[{id:`true`,name:`是`},{id:`false`,name:`否`}];return(0,a.jsx)(i.Select,{clearable:!1,fullWidth:!0,onChange:n=>On(e,t,n?.id===`true`,o),options:n,size:`sub`,value:(0,c.readSelectOption)(n,s===!0?`true`:`false`)})}return n===`STRING_ARRAY`?(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`caption`,children:`這個條件要收多個值,請綁定一個複選欄位;不接受固定值。`}):(0,a.jsx)(i.Input,{onChange:r=>On(e,t,n===`NUMBER`?(0,c.parseOptionalNumberInput)(r.target.value)??0:r.target.value,o),placeholder:n===`NUMBER`?`輸入數字`:`輸入固定值`,value:lt(r,n),variant:`base`})}function Dn(e,t,n,r,i){i.commit((0,c.upsertFormDataSourceFieldBinding)(e,t,ut(t,n,r)))}function On(e,t,n,r){r.commit((0,c.upsertFormDataSourceFieldBinding)(e,t,{from:{kind:`CONSTANT`,value:n},parameter:t}))}function kn(e,t){let n=(0,l.readFormFieldSelectionMode)(e),r=Array.isArray(e.defaultValue)?e.defaultValue:[],o=e.options.map(c.readFieldOptionAsSelectOption),s=o.filter(e=>r.includes(e.id));return(0,a.jsxs)(a.Fragment,{children:[$(`預設值`,`fieldDefaultValue`,n===`multiple`?(0,a.jsx)(i.Select,{clearable:!0,mode:`multiple`,onChange:n=>t({...e,defaultValue:n.length?n.map(e=>e.id):void 0}),options:o,placeholder:`選擇一或多個預設選項`,value:s}):(0,a.jsx)(i.Select,{clearable:!0,onChange:n=>t({...e,defaultValue:n?.id||void 0}),options:o,placeholder:`選擇預設選項`,value:typeof e.defaultValue==`string`?(0,c.readSelectOption)(o,e.defaultValue):null})),$(`選項`,`fieldOptions`,Rn(e,t),!0)]})}function An(e,t){let n=typeof e.defaultValue==`boolean`?String(e.defaultValue):`unset`;return $(`預設值`,`fieldDefaultValue`,(0,a.jsx)(i.Select,{clearable:!1,onChange:n=>t({...e,defaultValue:n?.id===`true`||n?.id!==`false`&&void 0}),options:[...tt],placeholder:`選擇預設狀態`,value:(0,c.readSelectOption)(tt,n)}))}function jn(e,t){return $(`可複選`,`fieldMemberMultiple`,(0,a.jsx)(i.Toggle,{checked:e.multiple===!0,label:e.multiple===!0?`可選多位`:`只能選一位`,onChange:n=>t({...e,defaultValue:void 0,multiple:n.target.checked||void 0}),size:`sub`}))}function Mn(e,t){return(0,a.jsxs)(a.Fragment,{children:[$(`檔案數`,`fieldMaxFiles`,Q(e.maxFiles,n=>t({...e,maxFiles:n}),`例如:1`,{min:1})),$(`MIME`,`fieldAcceptedMimeTypes`,In({name:`fieldAcceptedMimeTypes`,onChange:n=>t({...e,acceptedMimeTypes:vt(n)}),placeholder:`每行一個 MIME type,例如:application/pdf`,rows:3,value:yt(e.acceptedMimeTypes)}),!1)]})}function Nn(e){let t=m.fields.filter(t=>t.fieldKey!==e.fieldKey&&!(0,l.isMemberFieldDefinition)(t));return t.length?(0,a.jsx)(a.Fragment,{children:rt.map(n=>Pn(e,n,t))}):(0,a.jsx)(i.Typography,{color:`text-neutral`,style:b,variant:`body`,children:`目前沒有其他欄位可作為條件來源。新增更多欄位後即可設定條件規則。`})}function Pn(e,t,n){let r=e[t.target],o=r?(0,c.parseConditionRule)(r):null,s=n.find(e=>e.fieldKey===o?.fieldKey),l=s??n[0],u=n.map(_t),d=(0,c.readConditionOperatorOptions)(l),f=o&&d.some(e=>e.id===o.operator)?o.operator:(0,c.readDefaultConditionOperator)(l),p=o?.value??(0,c.readDefaultConditionValue)(l),m=!!r,h=m&&(!o||!s);return $(t.label,t.name,(0,a.jsxs)(`div`,{style:Me,children:[(0,a.jsx)(i.Toggle,{checked:m,label:m?`已啟用`:`不啟用`,onChange:e=>Z(t.target,e.target.checked?(0,c.buildConditionExpression)(l,(0,c.readDefaultConditionOperator)(l),(0,c.readDefaultConditionValue)(l)):void 0),size:`sub`,supportingText:t.supportingText}),m?h?(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:`這個規則不是目前 UI 支援的格式。重新選擇條件後會取代既有規則。`}):(0,a.jsxs)(`div`,{style:Ne,children:[(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>{let r=n.find(t=>t.fieldKey===e?.id)??l;Z(t.target,(0,c.buildConditionExpression)(r,(0,c.readDefaultConditionOperator)(r),(0,c.readDefaultConditionValue)(r)))},options:u,placeholder:`選擇欄位`,value:(0,c.readSelectOption)(u,l.fieldKey)}),(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>Z(t.target,(0,c.buildConditionExpression)(l,(0,c.readConditionOperatorOption)(e?.id)??f,p)),options:[...d],placeholder:`判斷方式`,value:(0,c.readSelectOption)(d,f)}),Fn(l,p,e=>Z(t.target,(0,c.buildConditionExpression)(l,f,e)))]}):null]}),!0)}function Z(e,t){K({[e]:t})}function Fn(e,t,n){if(e.type===`boolean`)return(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>n(e?.id??`true`),options:[...nt],placeholder:`比較值`,value:(0,c.readSelectOption)(nt,t===`false`?`false`:`true`)});if((0,c.isSelectFieldDefinition)(e)){let r=e.options.map(c.readFieldOptionAsSelectOption);return(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>n(e?.id??r[0]?.id??``),options:r,placeholder:`比較值`,value:(0,c.readSelectOption)(r,t)})}return(0,c.isNumberFieldDefinition)(e)?Q((0,c.parseOptionalNumberInput)(t),e=>n(String(e??0)),`比較值`):(0,c.isDateFieldDefinition)(e)?Ln(e,t,e=>n(e??``)):(0,a.jsx)(i.Input,{onChange:e=>n(e.target.value),placeholder:`比較值`,value:t,variant:`base`})}function In({name:e,onChange:t,placeholder:n,rows:r,value:o}){return(0,a.jsx)(i.Textarea,{"aria-label":e,onChange:e=>t(e.target.value),placeholder:n,ref:Xe,resize:`vertical`,rows:r,style:De,value:o})}function Q(e,t,n,r={}){return(0,a.jsx)(i.Input,{max:r.max,min:r.min,onChange:e=>t((0,c.clampOptionalNumber)((0,c.parseOptionalNumberInput)(e.target.value),r)),placeholder:n,showSpinner:!0,step:r.step??1,value:typeof e==`number`?String(e):``,variant:`measure`})}function Ln(e,t,n){return e.type===`datetime`?(0,a.jsx)(i.DateTimePicker,{formatDate:`YYYY-MM-DD`,formatTime:`HH:mm`,hideSecond:!0,onChange:e=>n((0,c.formatDateTimePickerValue)(e)),placeholderLeft:`選擇日期`,placeholderRight:`選擇時間`,value:(0,c.readDatePickerValue)(t)}):(0,a.jsx)(i.DatePicker,{format:`YYYY-MM-DD`,onChange:e=>n((0,c.formatDatePickerValue)(e)),placeholder:`選擇日期`,value:(0,c.readDatePickerValue)(t)})}function Rn(e,t){let n=e.options.map((t,n)=>({index:n,key:`${e.fieldKey}-${n}`,label:t.label,value:t.value}));return(0,a.jsxs)(`div`,{style:Ie,children:[(0,a.jsx)(i.Table,{actions:{render:n=>[{disabled:()=>e.options.length<=1,icon:s.TrashIcon,iconType:`icon-only`,name:`移除選項`,onClick:()=>t({...e,options:e.options.filter((e,t)=>t!==n.index)}),variant:`destructive-ghost`}],width:56},columns:[{key:`label`,render:n=>(0,a.jsx)(i.Input,{onChange:r=>t({...e,options:bt(e.options,n.index,{label:r.target.value})}),placeholder:`例如:主管`,size:`sub`,value:n.label,variant:`base`}),title:`Label`},{key:`value`,render:n=>(0,a.jsx)(i.Input,{onChange:r=>t({...e,options:bt(e.options,n.index,{value:r.target.value})}),placeholder:`例如:manager`,size:`sub`,value:n.value,variant:`base`}),title:`Value`}],dataSource:n,showHeader:!0,size:`sub`}),(0,a.jsx)(`div`,{style:Le,children:(0,a.jsx)(i.Button,{icon:s.PlusIcon,iconType:`leading`,onClick:()=>t({...e,options:[...e.options,xt(e.options)]}),variant:`base-secondary`,children:`新增選項`})})]})}function zn(e,t,n){return(0,a.jsx)(`div`,{...t.draggableProps,"data-form-builder-field-key":e.fieldKey,ref:t.innerRef,style:{...he,...n?ge:null,...t.draggableProps.style},children:(0,a.jsx)(i.BaseCard,{style:e.fieldKey===W?.fieldKey?_e:void 0,children:Bn(e,t,n)})})}function $(e,n,r,i=!1){return(0,a.jsx)(`div`,{style:i?Te:we,children:(0,a.jsx)(`div`,{style:Ee,children:(0,a.jsx)(t.t,{label:e,layout:i?o.FormFieldLayout.VERTICAL:o.FormFieldLayout.STRETCH,name:n,children:r})})})}function Bn(e,t,n){return(0,a.jsxs)(`div`,{...t.dragHandleProps??{},"aria-label":`選取或拖曳排序欄位`,onClick:()=>I(e.fieldKey),style:de,title:`點擊選取,拖曳排序`,children:[(0,a.jsx)(`span`,{"aria-label":`拖曳排序`,role:`img`,style:Pe,title:`拖曳排序`,children:(0,a.jsx)(i.Icon,{icon:s.DotDragVerticalIcon,size:20})}),(0,a.jsxs)(`div`,{style:fe,children:[(0,a.jsxs)(i.Typography,{component:`span`,ellipsis:!0,variant:`label-primary`,children:[e.label,e.required?(0,a.jsx)(`sup`,{"aria-label":`必填`,style:Re,children:`*`}):null]}),(0,a.jsxs)(i.Typography,{color:`text-neutral`,component:`span`,ellipsis:!0,variant:`caption`,children:[it(e.type),` ·`,e.required?` 必填`:` 選填`,` ·`,e.fieldKey,e.hidden?` · 只存不顯示`:null]})]}),(0,a.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:pe,children:[(0,a.jsx)(`div`,{style:me,children:(0,a.jsx)(i.Toggle,{checked:!!e.required,disabled:n||e.hidden===!0,label:`必填`,onChange:t=>Qt(e.fieldKey,t.target.checked)})}),(0,a.jsx)(i.Button,{disabled:n,icon:s.TrashIcon,iconType:`icon-only`,onClick:()=>Pt(e.fieldKey),variant:`destructive-ghost`,children:`移除欄位`})]})]})}function Vn(){return(0,a.jsxs)(`div`,{style:y,children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`h3`,children:`填寫預覽`}),(0,a.jsx)(n.t,{dataSourceContext:{kind:`preview`},onChange:Zt,schema:m,uiSchema:g,value:St})]})}function Hn(){return(0,a.jsxs)(`div`,{style:y,children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`h3`,children:`Schema`}),(0,a.jsxs)(`div`,{style:Oe,children:[Un(`Form Schema`,`schemaJson`,(0,a.jsx)(ee,{height:`360px`,name:`schemaJson`,onChange:$t,placeholder:`輸入 Form Schema JSON`,value:ct})),Un(`UI Schema`,`uiSchemaJson`,(0,a.jsx)(ee,{height:`240px`,name:`uiSchemaJson`,onChange:en,placeholder:`輸入 UI Schema JSON`,value:pt})),wt?(0,a.jsx)(i.Typography,{color:`text-error`,style:je,variant:`body`,children:wt}):null]})]})}function Un(e,n,r){return(0,a.jsx)(`div`,{style:ke,children:(0,a.jsx)(`div`,{style:Ae,children:(0,a.jsx)(t.t,{label:e,name:n,children:r})})})}}function it(e){return _.find(t=>t.type===e)?.label??e}function E(e){return`${e.key}@${e.version}`}function at(e){return[e.supportsSearch?`可輸入關鍵字搜尋${e.minimumSearchLength>1?`(至少 ${e.minimumSearchLength} 字)`:``}`:`不支援搜尋`,e.paginationMode===`CURSOR`?`捲動載入更多(每次 ${e.pageSize} 筆)`:`一次載入完整清單(最多 ${e.maximumResultCount} 筆)`,e.revalidationPolicy===`ALWAYS`?`退回重送時一律重新確認`:`值與條件未變時沿用上次結果`]}function ot(e){return{id:E(e),name:e.label}}function st(e){return e?e.from.kind===`FIELD`?e.from.fieldKey:e.from.kind===`ROW_FIELD`?`${C}${e.from.columnKey}`:S:w}function ct(e){switch(e){case`BOOLEAN`:return!1;case`NUMBER`:return 0;case`STRING_ARRAY`:return``;case`STRING`:return``;default:return``}}function lt(e,t){let n=e?.from.kind===`CONSTANT`?e.from.value:``;return t===`NUMBER`?typeof n==`number`?String(n):``:typeof n==`string`?n:``}function ut(e,t,n){return!n||n===w?null:n===S?{from:{kind:`CONSTANT`,value:ct(t)},parameter:e}:n.startsWith(C)?{from:{columnKey:n.slice(14),kind:`ROW_FIELD`},parameter:e}:{from:{fieldKey:n,kind:`FIELD`},parameter:e}}function dt(e){return e.kind===`remove-field`?`確認移除 dependency 欄位`:e.kind===`remove-column`?`確認移除表格欄`:e.kind===`replace-column`?`確認變更欄型別`:`確認變更選擇模式`}var D=[{label:`選項 A`,value:`option_a`},{label:`選項 B`,value:`option_b`}];function ft(e){let t=[];return e.defaultValue!==void 0&&t.push(`預設值`),e.type===`text`&&(typeof e.minLength==`number`||typeof e.maxLength==`number`)&&t.push(`長度限制`),(e.type===`number`||e.type===`money`)&&(typeof e.minimum==`number`||typeof e.maximum==`number`)&&t.push(`數值範圍`),(0,l.isFormDataSourceFieldDefinition)(e)?t.push(`選項來源設定`):(0,l.isFormStaticOptionFieldDefinition)(e)&&!pt(e.options)&&t.push(`${e.options.length} 個選項`),(e.type===`select`||e.type===`autocomplete`)&&e.mode===`multiple`&&t.push(`選擇模式`),t}function pt(e){return e.length===D.length&&e.every((e,t)=>e.label===D[t]?.label&&e.value===D[t]?.value)}function mt(e,t){let n={fieldKey:e.fieldKey,label:e.label,required:e.required,...e.description?{description:e.description}:{},...e.placeholder?{placeholder:e.placeholder}:{}};return t===`select`||t===`autocomplete`?{...n,mode:`single`,options:[...D],type:t}:{...n,type:t}}function ht(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))}function gt(e){return!!(e.visibleWhen||e.requiredWhen||e.readonlyWhen)}function _t(e){return{id:e.fieldKey,name:e.label}}function O(e){return e.type===`text`||e.type===`textarea`}function k(e){return typeof e==`string`?e:``}function vt(e){let t=e.split(/[\n,]/u).map(e=>e.trim()).filter(Boolean);return t.length?t:void 0}function yt(e){return e?.join(`
|
|
2
|
-
`)??``}function A(e){return JSON.stringify(e,null,2)}function bt(e,t,n){return e.map((e,r)=>r===t?{...e,...n}:e)}function xt(e){let t=e.length+1;return{label:`選項 ${t}`,value:j(e,t)}}function j(e,t){let n=`option_${t}`;return e.some(e=>e.value===n)?j(e,t+1):n}function M(e,t,n){let r=e[t];if(!r||t===n)return[...e];let i=e.filter((e,n)=>n!==t);return[...i.slice(0,n),r,...i.slice(n)]}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return T}});
|
|
3
|
-
//# sourceMappingURL=FormBuilderView-CUOyS07f.cjs.map
|