@rytass/bpm-core-react 0.9.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/dist/chunks/FormBuilderView-CAqjOYAP.cjs +3 -0
  3. package/dist/chunks/{FormBuilderView-BPLwAJGv.cjs.map → FormBuilderView-CAqjOYAP.cjs.map} +1 -1
  4. package/dist/chunks/{FormBuilderView-Do9-MIAe.js → FormBuilderView-TzSezeqC.js} +18 -16
  5. package/dist/chunks/{FormBuilderView-Do9-MIAe.js.map → FormBuilderView-TzSezeqC.js.map} +1 -1
  6. package/dist/chunks/{FormRendererView-C5POZbWz.js → FormRendererView-BurlEDUu.js} +232 -144
  7. package/dist/chunks/FormRendererView-BurlEDUu.js.map +1 -0
  8. package/dist/chunks/FormRendererView-Dde1s3I0.cjs +2 -0
  9. package/dist/chunks/FormRendererView-Dde1s3I0.cjs.map +1 -0
  10. package/dist/chunks/admin-pickers-Btvij1at.cjs.map +1 -1
  11. package/dist/chunks/admin-pickers-DLlG_1du.js.map +1 -1
  12. package/dist/chunks/approval-instance-list-page-BjX2kaoF.js.map +1 -1
  13. package/dist/chunks/approval-instance-list-page-CWiQvnfE.cjs +2 -0
  14. package/dist/chunks/{approval-instance-list-page-C408vxE2.cjs.map → approval-instance-list-page-CWiQvnfE.cjs.map} +1 -1
  15. package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -1
  16. package/dist/chunks/auth-provider-B5oPmvk2.js.map +1 -1
  17. package/dist/chunks/bpm-form-field-Bc6k4ZEO.cjs.map +1 -1
  18. package/dist/chunks/categories-DGlxuC6X.js.map +1 -1
  19. package/dist/chunks/categories-Yid05WAX.cjs +2 -0
  20. package/dist/chunks/{categories-DUfldZ_9.cjs.map → categories-Yid05WAX.cjs.map} +1 -1
  21. package/dist/chunks/{compose-DJBlA5PD.js → compose-CUOe5Ia9.js} +4 -4
  22. package/dist/chunks/{compose-DJBlA5PD.js.map → compose-CUOe5Ia9.js.map} +1 -1
  23. package/dist/chunks/compose-CyRkXdeu.cjs +2 -0
  24. package/dist/chunks/{compose-CULMDsLS.cjs.map → compose-CyRkXdeu.cjs.map} +1 -1
  25. package/dist/chunks/dashboard-page-CH87L5nx.cjs +2 -0
  26. package/dist/chunks/{dashboard-page-DwHQY6Ki.cjs.map → dashboard-page-CH87L5nx.cjs.map} +1 -1
  27. package/dist/chunks/dashboard-page-DJ9vOPga.js.map +1 -1
  28. package/dist/chunks/{delegations-DLEEFBlH.js → delegations-0MbJ7CWj.js} +3 -2
  29. package/dist/chunks/{delegations-DLEEFBlH.js.map → delegations-0MbJ7CWj.js.map} +1 -1
  30. package/dist/chunks/delegations-Bc9psOZ3.cjs +2 -0
  31. package/dist/chunks/{delegations-CGj-tZNO.cjs.map → delegations-Bc9psOZ3.cjs.map} +1 -1
  32. package/dist/chunks/{delegations-DqMpI_Nk.js → delegations-DyMGIDpp.js} +3 -2
  33. package/dist/chunks/{delegations-DqMpI_Nk.js.map → delegations-DyMGIDpp.js.map} +1 -1
  34. package/dist/chunks/delegations-vpLtus9g.cjs +2 -0
  35. package/dist/chunks/{delegations-kbMOSEif.cjs.map → delegations-vpLtus9g.cjs.map} +1 -1
  36. package/dist/chunks/{designer-BszXJ5RO.js → designer-Cb3WAC46.js} +39 -30
  37. package/dist/chunks/{designer-BszXJ5RO.js.map → designer-Cb3WAC46.js.map} +1 -1
  38. package/dist/chunks/designer-zLliyrHu.cjs +65 -0
  39. package/dist/chunks/{designer-CmqAU92b.cjs.map → designer-zLliyrHu.cjs.map} +1 -1
  40. package/dist/chunks/detail-Bp2Nv0cs.cjs +2 -0
  41. package/dist/chunks/detail-Bp2Nv0cs.cjs.map +1 -0
  42. package/dist/chunks/{detail-DAak2OXS.js → detail-Cmw-aQcu.js} +33 -32
  43. package/dist/chunks/detail-Cmw-aQcu.js.map +1 -0
  44. package/dist/chunks/format-date-time-CB-LxzqT.js.map +1 -1
  45. package/dist/chunks/format-date-time-D-cx5M8z.cjs +2 -0
  46. package/dist/chunks/{format-date-time-XxBzF0F5.cjs.map → format-date-time-D-cx5M8z.cjs.map} +1 -1
  47. package/dist/chunks/login-9bCXyjbX.cjs.map +1 -1
  48. package/dist/chunks/login-BKxpLibd.js.map +1 -1
  49. package/dist/chunks/notifications-Bc4mgSds.cjs +2 -0
  50. package/dist/chunks/{notifications--hwl-DR0.cjs.map → notifications-Bc4mgSds.cjs.map} +1 -1
  51. package/dist/chunks/notifications-DJ5wzCye.js.map +1 -1
  52. package/dist/chunks/{orgs-DytLvZ_X.js → orgs-B930facb.js} +11 -10
  53. package/dist/chunks/{orgs-DytLvZ_X.js.map → orgs-B930facb.js.map} +1 -1
  54. package/dist/chunks/orgs-BefGgeyc.cjs +2 -0
  55. package/dist/chunks/{orgs-Ni22buHs.cjs.map → orgs-BefGgeyc.cjs.map} +1 -1
  56. package/dist/chunks/providers-BsEn3ikK.cjs +2 -0
  57. package/dist/chunks/{providers-D_zTbkQH.cjs.map → providers-BsEn3ikK.cjs.map} +1 -1
  58. package/dist/chunks/{providers-DEqcuXw9.js → providers-DjLh4oLY.js} +3 -3
  59. package/dist/chunks/{providers-DEqcuXw9.js.map → providers-DjLh4oLY.js.map} +1 -1
  60. package/dist/chunks/{chunk-CMqjfN_6.cjs → rolldown-runtime-BocRIvOZ.cjs} +1 -1
  61. package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -1
  62. package/dist/chunks/routes-config-fDVHmvXi.cjs.map +1 -1
  63. package/dist/chunks/users-C9LA-Rd7.cjs +2 -0
  64. package/dist/chunks/{users-0HqlM_VQ.cjs.map → users-C9LA-Rd7.cjs.map} +1 -1
  65. package/dist/chunks/users-FWrb3ehW.js.map +1 -1
  66. package/dist/index.cjs +1 -1
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.js +1 -1
  69. package/dist/index.js.map +1 -1
  70. package/dist/next/index.cjs +1 -1
  71. package/dist/next/index.cjs.map +1 -1
  72. package/dist/next/index.js +9 -9
  73. package/dist/next/index.js.map +1 -1
  74. package/dist/next/workflow-chat-route.cjs +1 -1
  75. package/dist/next/workflow-chat-route.cjs.map +1 -1
  76. package/dist/next/workflow-chat-route.js +2 -1
  77. package/dist/next/workflow-chat-route.js.map +1 -1
  78. package/dist/pages/admin/delegations/index.cjs +1 -1
  79. package/dist/pages/admin/delegations/index.cjs.map +1 -1
  80. package/dist/pages/admin/delegations/index.js +1 -1
  81. package/dist/pages/admin/orgs/index.cjs +1 -1
  82. package/dist/pages/admin/orgs/index.cjs.map +1 -1
  83. package/dist/pages/admin/orgs/index.js +1 -1
  84. package/dist/pages/admin/users/index.cjs +1 -1
  85. package/dist/pages/admin/users/index.cjs.map +1 -1
  86. package/dist/pages/cc/index.cjs.map +1 -1
  87. package/dist/pages/dashboard/index.cjs.map +1 -1
  88. package/dist/pages/delegations/index.cjs +1 -1
  89. package/dist/pages/delegations/index.cjs.map +1 -1
  90. package/dist/pages/delegations/index.js +1 -1
  91. package/dist/pages/inbox/index.cjs.map +1 -1
  92. package/dist/pages/instances/detail/index.cjs +1 -1
  93. package/dist/pages/instances/detail/index.cjs.map +1 -1
  94. package/dist/pages/instances/detail/index.js +1 -1
  95. package/dist/pages/instances/new/index.cjs.map +1 -1
  96. package/dist/pages/login/index.cjs.map +1 -1
  97. package/dist/pages/root/index.cjs.map +1 -1
  98. package/dist/pages/search/index.cjs.map +1 -1
  99. package/dist/pages/sent/index.cjs.map +1 -1
  100. package/dist/pages/settings/notifications/index.cjs +1 -1
  101. package/dist/pages/settings/notifications/index.cjs.map +1 -1
  102. package/dist/pages/templates/categories/index.cjs +1 -1
  103. package/dist/pages/templates/categories/index.cjs.map +1 -1
  104. package/dist/pages/templates/compose/index.cjs +1 -1
  105. package/dist/pages/templates/compose/index.cjs.map +1 -1
  106. package/dist/pages/templates/compose/index.js +1 -1
  107. package/dist/pages/templates/designer/index.cjs +1 -1
  108. package/dist/pages/templates/designer/index.cjs.map +1 -1
  109. package/dist/pages/templates/designer/index.js +1 -1
  110. package/dist/pages/templates/index.cjs.map +1 -1
  111. package/dist/pages/templates/versions/index.cjs.map +1 -1
  112. package/dist/views/admin/delegations/index.cjs +1 -1
  113. package/dist/views/admin/delegations/index.js +1 -1
  114. package/dist/views/admin/index.cjs +1 -1
  115. package/dist/views/admin/index.js +2 -2
  116. package/dist/views/admin/orgs/index.cjs +1 -1
  117. package/dist/views/admin/orgs/index.js +1 -1
  118. package/dist/views/admin/users/index.cjs +1 -1
  119. package/dist/views/cc/index.cjs +1 -1
  120. package/dist/views/cc/index.cjs.map +1 -1
  121. package/dist/views/dashboard/index.cjs +1 -1
  122. package/dist/views/dashboard/index.cjs.map +1 -1
  123. package/dist/views/delegations/index.cjs +1 -1
  124. package/dist/views/delegations/index.js +1 -1
  125. package/dist/views/forms/builder/index.cjs +1 -1
  126. package/dist/views/forms/builder/index.js +1 -1
  127. package/dist/views/forms/renderer/form-data-source-field.d.ts +15 -0
  128. package/dist/views/forms/renderer/index.cjs +1 -1
  129. package/dist/views/forms/renderer/index.js +2 -2
  130. package/dist/views/inbox/index.cjs +1 -1
  131. package/dist/views/inbox/index.cjs.map +1 -1
  132. package/dist/views/inbox/index.js.map +1 -1
  133. package/dist/views/instances/detail/index.cjs +1 -1
  134. package/dist/views/instances/detail/index.js +1 -1
  135. package/dist/views/instances/new/index.cjs +1 -1
  136. package/dist/views/instances/new/index.cjs.map +1 -1
  137. package/dist/views/instances/new/index.js +8 -6
  138. package/dist/views/instances/new/index.js.map +1 -1
  139. package/dist/views/search/index.cjs +1 -1
  140. package/dist/views/search/index.cjs.map +1 -1
  141. package/dist/views/sent/index.cjs +1 -1
  142. package/dist/views/sent/index.cjs.map +1 -1
  143. package/dist/views/settings/index.cjs +1 -1
  144. package/dist/views/settings/notifications/index.cjs +1 -1
  145. package/dist/views/templates/categories/index.cjs +1 -1
  146. package/dist/views/templates/compose/index.cjs +1 -1
  147. package/dist/views/templates/compose/index.js +1 -1
  148. package/dist/views/templates/designer/index.cjs +1 -1
  149. package/dist/views/templates/designer/index.js +1 -1
  150. package/dist/views/templates/index.cjs +1 -1
  151. package/dist/views/templates/index.cjs.map +1 -1
  152. package/dist/views/templates/index.js.map +1 -1
  153. package/dist/views/templates/versions/index.cjs +1 -1
  154. package/dist/views/templates/versions/index.cjs.map +1 -1
  155. package/dist/views/templates/versions/index.js.map +1 -1
  156. package/package.json +4 -4
  157. package/dist/chunks/FormBuilderView-BPLwAJGv.cjs +0 -3
  158. package/dist/chunks/FormRendererView-C5POZbWz.js.map +0 -1
  159. package/dist/chunks/FormRendererView-DNtNodNl.cjs +0 -2
  160. package/dist/chunks/FormRendererView-DNtNodNl.cjs.map +0 -1
  161. package/dist/chunks/approval-instance-list-page-C408vxE2.cjs +0 -2
  162. package/dist/chunks/categories-DUfldZ_9.cjs +0 -2
  163. package/dist/chunks/compose-CULMDsLS.cjs +0 -2
  164. package/dist/chunks/dashboard-page-DwHQY6Ki.cjs +0 -2
  165. package/dist/chunks/delegations-CGj-tZNO.cjs +0 -2
  166. package/dist/chunks/delegations-kbMOSEif.cjs +0 -2
  167. package/dist/chunks/designer-CmqAU92b.cjs +0 -65
  168. package/dist/chunks/detail-CDexqBoU.cjs +0 -2
  169. package/dist/chunks/detail-CDexqBoU.cjs.map +0 -1
  170. package/dist/chunks/detail-DAak2OXS.js.map +0 -1
  171. package/dist/chunks/format-date-time-XxBzF0F5.cjs +0 -2
  172. package/dist/chunks/notifications--hwl-DR0.cjs +0 -2
  173. package/dist/chunks/orgs-Ni22buHs.cjs +0 -2
  174. package/dist/chunks/providers-D_zTbkQH.cjs +0 -2
  175. package/dist/chunks/users-0HqlM_VQ.cjs +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"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,SAAgB,EAAqB,EACnC,iBAC0C;CAC1C,IAAM,IAAS,EAAiB,GAC1B,IAAS,EAAa,GACtB,CAAC,GAAQ,KAAa,EAAwC,IAAI,GAClE,CAAC,GAAO,KAAY,EAAwB,IAAI,GAChD,CAAC,GAAS,KAAc,EAAS,EAAI,GACrC,CAAC,GAAa,KAAkB,EAAS,EAAK;CAEpD,QAAsB;EACpB,EAAqB;CACvB,GAAG,CAAC,CAAU,CAAC;CAEf,IAAM,IAAO,SAER,GAAQ,YAAY,CAAC,GAAG,KAAK,OAAa;EACzC,aACE,GAAQ,aAAa,MAClB,MAAgB,EAAY,OAAO,EAAQ,uBAC9C,GAAG,SAAS;EACd,KAAK,EAAQ;EACb,aAAa,EAAe,EAAQ,WAAW;EAC/C,QAAQ,EAAQ;EAChB,WAAW,EAAe,EAAQ,SAAS;EAC3C,SAAS,IAAI,EAAQ;EACrB,WAAW,EAAQ;CACrB,EAAE,GACJ,CAAC,CAAM,CACT,GACM,IAAU,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,GACM,IAAU,SACmB;EAC/B,SAAS,MAAwD,CAC/D;GACE,gBAAyB,KAAe,EAAI,WAAW;GACvD,MAAM;GACN,eAAqB,KAAK,EAAe,EAAI,SAAS;EACxD,CACF;EACA,SAAS;EACT,OAAO;CACT,IACA,CAAC,CAAW,CACd;CAEA,eAAe,IAAiC;EAE9C,AADA,EAAW,EAAI,GACf,EAAS,IAAI;EAEb,IAAI;GACF,EAAU,MAAM,EAAqB,CAAU,CAAC;EAClD,SAAS,GAAuB;GAC9B,EAAS,EAAiB,CAAY,CAAC;EACzC,UAAU;GACR,EAAW,EAAK;EAClB;CACF;CAEA,eAAe,EAAe,GAAkC;EAE9D,AADA,EAAe,EAAI,GACnB,EAAS,IAAI;EAEb,IAAI;GAEF,AADA,MAAM,EAAgC,CAAS,GAC/C,MAAM,EAAgB;EACxB,SAAS,GAAuB;GAC9B,EAAS,EAAiB,CAAY,CAAC;EACzC,UAAU;GACR,EAAe,EAAK;EACtB;CACF;CAEA,OACE,kBAAA,GAAA,EAAA,UAAA,CACI,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACE,aAAY;EACZ,mBAAyB,EAAO,KAAK,EAAO,UAAU,CAAC;EACvD,OAAO,GAAQ,SAAS,QAAQ;CACjC,CAAA,EACS,CAAA,GAEZ,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA,CACG,IACC,kBAAC,GAAD;EAAY,OAAM;EAAa,SAAQ;YACpC;CACS,CAAA,IACV,MACJ,kBAAC,GAAD;EACW;EACA;EACT,YAAY;EACZ,WAAA;EACS;CACV,CAAA,CACM,EAAA,CAAA,EACG,CAAA,CACd,EAAA,CAAA;AAER;AAEA,SAAS,EAAiB,GAAwB;CAChD,OAAO,aAAiB,QAAQ,EAAM,UAAU;AAClD"}
1
+ {"version":3,"file":"index.js","names":[],"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,SAAgB,EAAqB,EACnC,iBAC0C;CAC1C,IAAM,IAAS,EAAiB,GAC1B,IAAS,EAAa,GACtB,CAAC,GAAQ,KAAa,EAAwC,IAAI,GAClE,CAAC,GAAO,KAAY,EAAwB,IAAI,GAChD,CAAC,GAAS,KAAc,EAAS,EAAI,GACrC,CAAC,GAAa,KAAkB,EAAS,EAAK;CAEpD,QAAsB;EACpB,EAAqB;CACvB,GAAG,CAAC,CAAU,CAAC;CAEf,IAAM,IAAO,SAER,GAAQ,YAAY,CAAC,EAAA,CAAG,KAAK,OAAa;EACzC,aACE,GAAQ,aAAa,MAClB,MAAgB,EAAY,OAAO,EAAQ,uBAC9C,CAAC,EAAE,SAAS;EACd,KAAK,EAAQ;EACb,aAAa,EAAe,EAAQ,WAAW;EAC/C,QAAQ,EAAQ;EAChB,WAAW,EAAe,EAAQ,SAAS;EAC3C,SAAS,IAAI,EAAQ;EACrB,WAAW,EAAQ;CACrB,EAAE,GACJ,CAAC,CAAM,CACT,GACM,IAAU,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,GACM,IAAU,SACmB;EAC/B,SAAS,MAAwD,CAC/D;GACE,gBAAyB,KAAe,EAAI,WAAW;GACvD,MAAM;GACN,eAAqB,KAAK,EAAe,EAAI,SAAS;EACxD,CACF;EACA,SAAS;EACT,OAAO;CACT,IACA,CAAC,CAAW,CACd;CAEA,eAAe,IAAiC;EAE9C,AADA,EAAW,EAAI,GACf,EAAS,IAAI;EAEb,IAAI;GACF,EAAU,MAAM,EAAqB,CAAU,CAAC;EAClD,SAAS,GAAuB;GAC9B,EAAS,EAAiB,CAAY,CAAC;EACzC,UAAU;GACR,EAAW,EAAK;EAClB;CACF;CAEA,eAAe,EAAe,GAAkC;EAE9D,AADA,EAAe,EAAI,GACnB,EAAS,IAAI;EAEb,IAAI;GAEF,AADA,MAAM,EAAgC,CAAS,GAC/C,MAAM,EAAgB;EACxB,SAAS,GAAuB;GAC9B,EAAS,EAAiB,CAAY,CAAC;EACzC,UAAU;GACR,EAAe,EAAK;EACtB;CACF;CAEA,OACE,kBAAA,GAAA,EAAA,UAAA,CACI,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACE,aAAY;EACZ,mBAAyB,EAAO,KAAK,EAAO,UAAU,CAAC;EACvD,OAAO,GAAQ,SAAS,QAAQ;CACjC,CAAA,EACS,CAAA,GAEZ,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA,CACG,IACC,kBAAC,GAAD;EAAY,OAAM;EAAa,SAAQ;EACpC,UAAA;CACS,CAAA,IACV,MACJ,kBAAC,GAAD;EACW;EACA;EACT,YAAY;EACZ,WAAA;EACS;CACV,CAAA,CACM,EAAA,CAAA,EACG,CAAA,CACd,EAAA,CAAA;AAER;AAEA,SAAS,EAAiB,GAAwB;CAChD,OAAO,aAAiB,QAAQ,EAAM,UAAU;AAClD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rytass/bpm-core-react",
3
- "version": "0.9.1",
3
+ "version": "0.11.0",
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",
@@ -286,8 +286,8 @@
286
286
  "@mezzanine-ui/core": ">=1.0.0",
287
287
  "@mezzanine-ui/icons": ">=1.0.0",
288
288
  "@mezzanine-ui/react": ">=1.0.0",
289
- "@rytass/bpm-core-client": "^0.9.1",
290
- "@rytass/bpm-core-shared": "^0.9.1",
289
+ "@rytass/bpm-core-client": "^0.11.0",
290
+ "@rytass/bpm-core-shared": "^0.11.0",
291
291
  "@uiw/react-codemirror": ">=4.0.0",
292
292
  "@xyflow/react": ">=12.0.0",
293
293
  "ai": ">=6.0.0",
@@ -342,4 +342,4 @@
342
342
  "dependencies": {
343
343
  "moment": "^2.30.1"
344
344
  }
345
- }
345
+ }
@@ -1,3 +0,0 @@
1
- "use client";const e=require("./chunk-CMqjfN_6.cjs"),t=require("./bpm-form-field-Bc6k4ZEO.cjs"),n=require("./FormRendererView-DNtNodNl.cjs");let r=require("react"),i=require("@mezzanine-ui/react"),a=require("react/jsx-runtime"),o=require("@mezzanine-ui/icons"),s=require("@rytass/bpm-core-client/form"),c=require("@rytass/bpm-core-shared/form"),l=require("@hello-pangea/dnd"),u=require("next/dynamic");u=e.t(u,1);let d=require("@codemirror/lang-json"),f=require("@codemirror/view");var p={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%`},m=[(0,d.json)(),f.EditorView.lineWrapping,f.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`}})],h=(0,u.default)(()=>import(`@uiw/react-codemirror`),{loading:()=>(0,a.jsx)(`div`,{style:p,children:`載入 JSON 編輯器`}),ssr:!1});function ee({disabled:e=!1,height:t,name:n,onChange:r,placeholder:i,value:o}){return(0,a.jsx)(h,{"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:[...m],height:t,indentWithTab:!1,onChange:r,placeholder:i,readOnly:e,theme:`light`,value:o,width:`100%`})}var g=[{description:`單行文字、姓名、編號`,icon:o.AlignLeftIcon,label:`文字`,type:`text`},{description:`多行補充內容`,icon:o.FileIcon,label:`長文字`,type:`textarea`},{description:`金額、數量、分數`,icon:o.CurrencyDollarIcon,label:`數字`,type:`number`},{description:`金額與費用`,icon:o.CurrencyDollarIcon,label:`金額`,type:`money`},{description:`日期或到期日`,icon:o.CalendarIcon,label:`日期`,type:`date`},{description:`日期與時間`,icon:o.CalendarIcon,label:`日期時間`,type:`datetime`},{description:`是 / 否狀態`,icon:o.CheckedIcon,label:`開關`,type:`boolean`},{description:`固定選項擇一`,icon:o.ListIcon,label:`下拉選單`,type:`select`},{description:`可搜尋的固定選項`,icon:o.ListIcon,label:`自動完成`,type:`autocomplete`},{description:`固定選項單選`,icon:o.DotGridIcon,label:`單選`,type:`radio`},{description:`固定選項複選`,icon:o.CheckedOutlineIcon,label:`複選`,type:`checkbox`},{description:`附件或佐證資料`,icon:o.FileAttachmentIcon,label:`附件`,type:`file_upload`}],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},_={display:`grid`,gap:12},ie={display:`flex`,flexWrap:`wrap`,gap:6},ae={flex:`0 0 auto`,whiteSpace:`nowrap`},oe={display:`grid`,gap:8},se={alignItems:`center`,cursor:`grab`,display:`flex`,gap:12,touchAction:`none`},ce={display:`grid`,flex:`1 1 auto`,gap:2,minWidth:0},le={alignItems:`center`,display:`flex`,flex:`0 0 auto`,gap:4},ue={alignItems:`center`,display:`flex`,gap:6},de={cursor:`pointer`,userSelect:`none`},fe={filter:`drop-shadow(0 8px 18px rgba(0, 0, 0, 0.12))`},pe={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)`},me={alignItems:`center`,border:`1px dashed var(--mzn-color-border-neutral)`,borderRadius:6,display:`grid`,gap:12,minHeight:240,padding:32,textAlign:`center`},he={display:`flex`,gap:8,justifyContent:`center`},ge={display:`grid`,gap:14},_e={display:`grid`,columnGap:16,gridTemplateColumns:`repeat(auto-fit, minmax(280px, 1fr))`,rowGap:8},ve={gridColumn:`1 / -1`},ye={alignItems:`center`,display:`flex`,gap:8,gridColumn:`1 / -1`,justifyContent:`flex-end`},be={gridColumn:`1 / -1`},xe={alignItems:`start`,display:`block`,width:`100%`},Se={...xe,gridColumn:`1 / -1`},Ce={minWidth:0,width:`100%`},we={minWidth:`100%`,width:`100%`},Te={display:`grid`,gap:14},Ee={alignItems:`start`,display:`block`,width:`100%`},De={minWidth:0,width:`100%`},Oe={gridColumn:`2 / -1`},ke={display:`grid`,gap:10,width:`100%`},Ae={display:`grid`,gap:8,gridTemplateColumns:`repeat(auto-fit, minmax(160px, 1fr))`},je={display:`inline-flex`},Me={display:`grid`,gap:16},v={display:`grid`,gap:8},y={display:`flex`,justifyContent:`flex-end`},Ne={color:`var(--mzn-color-text-error)`,fontSize:`0.72em`,lineHeight:0,marginLeft:2,verticalAlign:`super`},Pe={display:`grid`,gap:10,gridColumn:`1 / -1`},Fe={backgroundColor:`var(--mzn-color-bg-surface-secondary)`,borderRadius:6,display:`grid`,gap:4,padding:10},Ie={display:`grid`,gap:8,gridTemplateColumns:`minmax(180px, 0.7fr) minmax(220px, 1.3fr)`};function Le(e){e&&(e.style.width=`100%`)}var Re={fields:[],schemaVersion:1},ze={layout:[],schemaVersion:1},b=`__STATIC_OPTIONS__`,x=`__CONSTANT__`,S=`__UNBOUND__`,Be=[{id:b,name:`靜態選項`}],C=[{id:`single`,name:`單選`},{id:`multiple`,name:`複選`}],Ve=[{id:`unset`,name:`不預設`},{id:`true`,name:`是`},{id:`false`,name:`否`}],He=[{id:`true`,name:`是`},{id:`false`,name:`否`}],Ue=[{label:`顯示`,name:`fieldVisibleWhen`,supportingText:`符合條件時才顯示這個欄位。`,target:`visibleWhen`},{label:`必填`,name:`fieldRequiredWhen`,supportingText:`符合條件時才要求填寫這個欄位。`,target:`requiredWhen`},{label:`唯讀`,name:`fieldReadonlyWhen`,supportingText:`符合條件時不允許修改這個欄位。`,target:`readonlyWhen`}];function w({onChange:e,value:u}){let d=u?.schema??Re,f=u?.uiSchema??ze,[p,m]=(0,r.useState)(d),[h,w]=(0,r.useState)(f),[O,k]=(0,r.useState)(D(d)),[rt,A]=(0,r.useState)(D(f)),[it,at]=(0,r.useState)({}),[ot,j]=(0,r.useState)(null),[M,N]=(0,r.useState)(`design`),[P,F]=(0,r.useState)(null),[I,st]=(0,r.useState)([]),[L,ct]=(0,r.useState)(null),[lt,ut]=(0,r.useState)(`loading`),[R,z]=(0,r.useState)(null),[dt,ft]=(0,r.useState)(!1),[B,V]=(0,r.useState)(null);(0,r.useEffect)(()=>{let e=!0;return(0,s.listFormDataSources)().then(t=>{e&&(st(t),ct(null),ut(`ready`))}).catch(t=>{e&&(st([]),ct(`目前無法載入 DataSource Catalog,請稍後重試。`),ut(`unavailable`))}),()=>{e=!1}},[]),(0,r.useEffect)(()=>{p.fields.some(e=>e.fieldKey===P)||F(p.fields[0]?.fieldKey??null)},[p.fields,P]),(0,r.useEffect)(()=>{at(e=>(0,s.buildFormRendererValues)(p.fields,e))},[p.fields]),(0,r.useEffect)(()=>{M!==`advanced`&&(k(D(p)),A(D(h)))},[M,p,h]);let H=(0,r.useMemo)(()=>p.fields.find(e=>e.fieldKey===P)??p.fields[0]??null,[p.fields,P]);(0,r.useEffect)(()=>{e?.({schema:p,uiSchema:h})},[p,h]);function U(e){let t=(0,s.createFieldDefinition)(e,p.fields.length+1);m({...p,fields:[...p.fields,t]}),w({...h,layout:[...h.layout,{fieldKey:t.fieldKey,width:e===`textarea`||e===`file_upload`?`FULL`:`HALF`}]}),F(t.fieldKey),N(`design`),j(null)}function pt(e){let t=e;t===`advanced`&&M!==`advanced`&&(k(D(p)),A(D(h))),N(t)}function mt(e){let t=p.fields.flatMap(t=>(0,c.isFormDataSourceFieldDefinition)(t)&&(0,s.readFormDataSourceFieldDependencyKeys)(t).includes(e)?[t.fieldKey]:[]);if(t.length>0){V({affectedFieldKeys:t,fieldKey:e,kind:`remove-field`});return}ht(e)}function ht(e){let t=p.fields.filter(t=>t.fieldKey!==e);m({...p,fields:t}),w({...h,layout:h.layout.filter(t=>t.fieldKey!==e)}),F(P===e?t[0]?.fieldKey??null:P),j(null),z(null)}function gt(e){let t=e.destination;t&&e.source.index!==t.index&&(m(n=>({...n,fields:nt(n.fields,e.source.index,t.index)})),w(n=>({...n,layout:nt(n.layout,e.source.index,t.index)})),j(null))}function W(e){G(t=>({...t,...e}))}function G(e){if(!H)return;let t=H.fieldKey,n=e(H),r=n.fieldKey,i={...p,fields:p.fields.map(e=>e.fieldKey===t?n:e)};m(t===r?i:(0,s.renameFormDataSourceFieldBindings)(i,t,r)),w({...h,layout:h.layout.map(e=>e.fieldKey===t?{...e,fieldKey:r}:e)}),F(r),j(null),z(null)}function K(e){G(t=>Ze(t)?{...t,...e}:t)}function q(e){G(t=>(0,s.isNumberFieldDefinition)(t)?{...t,...e}:t)}function _t(e){G(t=>(0,s.isDateFieldDefinition)(t)?{...t,...e}:t)}function J(e){G(t=>(0,s.isSelectFieldDefinition)(t)?{...t,...e}:t)}function vt(e){if(!H||H.type!==`select`&&H.type!==`autocomplete`||(0,c.readFormFieldSelectionMode)(H)===e)return;let t=H.defaultValue,n=e===`multiple`?typeof t==`string`?[t]:t:Array.isArray(t)?t[0]:t;Y(H,{...H,defaultValue:n,mode:e},`選擇模式變更可能轉換或捨棄既有預設值。`)}function Y(e,t,n=`此變更會替換目前選項來源;既有 options、dynamic reference 或 bindings 可能失效。`){JSON.stringify(e)!==JSON.stringify(t)&&V({fieldKey:e.fieldKey,impact:n,kind:`replace-field`,nextField:t})}function yt(e,t){if(!t)return;if(t===b){if(!(0,c.isFormDataSourceFieldDefinition)(e))return;let{dataSource:t,defaultValue:n,...r}=e;Y(e,{...r,options:[]});return}let n=I.find(e=>T(e)===t);if(!n)return;if((0,c.isFormDataSourceFieldDefinition)(e)){let t=new Set(n.parameters.map(e=>e.key)),r=e.dataSource.bindings.filter(e=>t.has(e.parameter));Y(e,{...e,dataSource:{bindings:r,key:n.key,version:n.version}});return}let{options:r,defaultValue:i,...a}=e;Y(e,{...a,dataSource:{bindings:[],key:n.key,version:n.version}})}function bt(){B&&(B.kind===`remove-field`?ht(B.fieldKey):(m({...p,fields:p.fields.map(e=>e.fieldKey===B.fieldKey?B.nextField:e)}),j(null),z(null)),V(null))}async function xt(){ft(!0);try{z((await(0,s.lintFormSchema)(p,h)).errors.map(s.readFormSchemaLintMessage))}catch{z([`目前無法完成 DataSource schema 驗證。`])}finally{ft(!1)}}function St(e){G(t=>t.type===`boolean`?{...t,...e}:t)}function Ct(e){G(t=>t.type===`file_upload`?{...t,...e}:t)}function wt(e){at(e)}function Tt(e,t){m(n=>({...n,fields:n.fields.map(n=>n.fieldKey===e?{...n,required:t}:n)})),j(null)}function Et(e){k(e);try{m(JSON.parse(e)),j(null)}catch{j(`Form Schema JSON 格式不正確`)}}function Dt(e){A(e);try{w(JSON.parse(e)),j(null)}catch{j(`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:Me,children:[(0,a.jsxs)(i.Tab,{activeKey:M,onChange:pt,size:`sub`,children:[(0,a.jsx)(i.TabItem,{children:`設計`},`design`),(0,a.jsx)(i.TabItem,{children:`預覽`},`preview`),(0,a.jsx)(i.TabItem,{children:`進階`},`advanced`)]}),M===`design`?Ot():null,M===`preview`?en():null,M===`advanced`?tn():null]})})})}),B?(0,a.jsx)(i.Modal,{cancelText:`返回`,confirmText:`確認變更`,modalType:`standard`,onCancel:()=>V(null),onClose:()=>V(null),onConfirm:bt,open:!0,showModalFooter:!0,showModalHeader:!0,title:B.kind===`remove-field`?`確認移除 dependency 欄位`:`確認替換選項來源`,children:B.kind===`remove-field`?(0,a.jsxs)(`div`,{style:v,children:[(0,a.jsx)(i.Typography,{variant:`body`,children:`此欄位仍被下列 DataSource binding 使用;移除後請重新設定這些欄位。`}),(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:B.affectedFieldKeys.join(`、`)})]}):(0,a.jsxs)(i.Typography,{variant:`body`,children:[B.impact,`確認後才會寫入 schema。`]})}):null]});function Ot(){return(0,a.jsxs)(`div`,{style:_,children:[(0,a.jsxs)(`div`,{style:oe,children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`label-primary`,children:`新增欄位`}),(0,a.jsx)(`div`,{style:ie,children:g.map(e=>(0,a.jsx)(i.Button,{icon:e.icon,iconType:`leading`,onClick:()=>U(e.type),size:`sub`,style:ae,type:`button`,variant:`base-secondary`,children:e.label},e.type))})]}),(0,a.jsxs)(`div`,{style:te,children:[(0,a.jsxs)(`div`,{style:{..._,...ne},children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`label-primary`,children:`表單畫布`}),p.fields.length>0?(0,a.jsx)(l.DragDropContext,{onDragEnd:gt,children:(0,a.jsx)(l.Droppable,{droppableId:`form-builder-fields`,children:e=>(0,a.jsxs)(`div`,{...e.droppableProps,ref:e.innerRef,style:_,children:[p.fields.map((e,t)=>(0,a.jsx)(l.Draggable,{draggableId:e.fieldKey,index:t,children:(t,n)=>Qt(e,t,n.isDragging)},e.fieldKey)),e.placeholder]})})}):(0,a.jsxs)(`div`,{style:me,children:[(0,a.jsxs)(`div`,{style:_,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:he,children:[(0,a.jsx)(i.Button,{onClick:()=>U(`text`),variant:`base-primary`,children:`新增文字欄位`}),(0,a.jsx)(i.Button,{onClick:()=>U(`textarea`),variant:`base-secondary`,children:`新增長文字`})]})]})]}),(0,a.jsxs)(`div`,{style:{..._,...re},children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`label-primary`,children:`欄位設定`}),H?kt(H):(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:`請先新增或選取欄位。`})]})]})]})}function kt(e){return(0,a.jsxs)(`div`,{style:ge,children:[At(e),jt(e)]})}function At(e){return(0,a.jsxs)(`div`,{style:_e,children:[(0,a.jsx)(`div`,{style:ye,children:(0,a.jsx)(i.Badge,{size:`main`,text:We(e.type),variant:`text-info`})}),Q(`標題`,`fieldLabel`,(0,a.jsx)(i.Input,{onChange:e=>W({label:e.target.value}),placeholder:`例如:申請金額`,value:e.label,variant:`base`})),Q(`欄位 Key`,`fieldKey`,(0,a.jsx)(i.Input,{onChange:e=>W({fieldKey:e.target.value}),placeholder:`例如:amount`,value:e.fieldKey,variant:`base`})),Q(`提示文字`,`fieldPlaceholder`,(0,a.jsx)(i.Input,{onChange:e=>W({placeholder:e.target.value||void 0}),placeholder:`例如:請輸入申請金額`,value:e.placeholder??``,variant:`base`})),Mt(e)]})}function jt(e){return(0,a.jsx)(i.Accordion,{defaultExpanded:Ye(e),size:`sub`,title:`進階設定`,children:(0,a.jsxs)(`div`,{style:_e,children:[(0,a.jsx)(i.Typography,{component:`h3`,style:ve,variant:`label-primary`,children:`條件規則`}),(0,a.jsx)(i.Typography,{color:`text-neutral`,style:be,variant:`body`,children:`只有需要根據其他欄位改變顯示、必填或唯讀狀態時才需要設定。`}),Kt(e)]})})}function Mt(e){return Ze(e)?Nt(e):(0,s.isNumberFieldDefinition)(e)?Pt(e):(0,s.isDateFieldDefinition)(e)?Ft(e):(0,c.isFormOptionFieldDefinition)(e)?It(e):e.type===`boolean`?Wt(e):Gt(e)}function Nt(e){return(0,a.jsxs)(a.Fragment,{children:[Q(`預設值`,`fieldDefaultValue`,e.type===`textarea`?Yt({name:`fieldDefaultValue`,onChange:e=>K({defaultValue:e||void 0}),placeholder:`輸入此欄位的預設文字`,rows:3,value:E(e.defaultValue)}):(0,a.jsx)(i.Input,{onChange:e=>K({defaultValue:e.target.value||void 0}),placeholder:`輸入此欄位的預設文字`,value:E(e.defaultValue),variant:`base`})),Q(`最小長度`,`fieldMinLength`,Z(e.minLength,e=>K({minLength:e}),`例如:2`,{min:0})),Q(`最大長度`,`fieldMaxLength`,Z(e.maxLength,e=>K({maxLength:e}),`例如:100`,{min:1}))]})}function Pt(e){return(0,a.jsxs)(a.Fragment,{children:[Q(`預設值`,`fieldDefaultValue`,Z(typeof e.defaultValue==`number`?e.defaultValue:void 0,e=>q({defaultValue:e}),e.type===`money`?`例如:1000`:`輸入預設數值`,{max:e.maximum,min:e.minimum})),Q(`最小值`,`fieldMinimum`,Z(e.minimum,e=>q({minimum:e}),`例如:0`)),Q(`最大值`,`fieldMaximum`,Z(e.maximum,e=>q({maximum:e}),`例如:999999`))]})}function Ft(e){return Q(`預設值`,`fieldDefaultValue`,Xt(e,E(e.defaultValue),e=>_t({defaultValue:e})))}function It(e){let t=(0,s.readCompatibleFormDataSourceDescriptors)(e.type,I),n=(0,c.isFormDataSourceFieldDefinition)(e)?T(e.dataSource):b,r=(0,c.isFormDataSourceFieldDefinition)(e)?I.find(t=>t.key===e.dataSource.key&&t.version===e.dataSource.version):null,o=r?t.some(e=>e.key===r.key&&e.version===r.version):!1,l=[...Be,...t.map(Ge),...(0,c.isFormDataSourceFieldDefinition)(e)&&!o?[{id:n,name:`${e.dataSource.key} v${e.dataSource.version}(目前不可用或不支援)`}]:[]],u=(0,c.readFormFieldSelectionMode)(e);return(0,a.jsxs)(a.Fragment,{children:[e.type===`select`||e.type===`autocomplete`?Q(`選擇模式`,`fieldSelectionMode`,(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>{(e?.id===`single`||e?.id===`multiple`)&&vt(e.id)},options:[...C],value:(0,s.readSelectOption)(C,u)})):Q(`選擇模式`,`fieldSelectionMode`,(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:u===`multiple`?`固定複選`:`固定單選`})),Q(`選項來源`,`fieldOptionSource`,(0,a.jsx)(i.Select,{clearable:!1,disabled:lt===`loading`&&!(0,c.isFormDataSourceFieldDefinition)(e),onChange:t=>yt(e,t?.id),options:l,placeholder:`選擇選項來源`,value:(0,s.readSelectOption)(l,n)})),(0,c.isFormDataSourceFieldDefinition)(e)?Lt(e,t):Ut(e)]})}function Lt(e,t){let n=I.find(t=>t.key===e.dataSource.key&&t.version===e.dataSource.version),r=n&&!(0,s.isFormDataSourceDescriptorCompatible)(n,e.type);return(0,a.jsxs)(`div`,{style:Pe,children:[lt===`loading`?(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:`正在載入可用的 DataSource Catalog…`}):null,L?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:L}):null,n?null:(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:`目前來源版本未出現在 Catalog;會保留原設定,但在環境 lint 通過前不可發布。`}),r?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:`目前來源不支援此控制項或超出 bounded list 限制,請選擇其他版本。`}):null,n?Rt(n):null,n?n.parameters.map(t=>zt(e,t)):null,t.length===0&&!L?(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:`沒有符合目前控制項能力的已註冊來源。`}):null,(0,a.jsx)(`div`,{style:y,children:(0,a.jsx)(i.Button,{disabled:dt,onClick:()=>void xt(),size:`sub`,type:`button`,variant:`base-secondary`,children:dt?`驗證中…`:`驗證 DataSource 設定`})}),R?(0,a.jsx)(i.Typography,{color:R.length>0?`text-error`:`text-success`,variant:`caption`,children:R.length>0?R.join(`;`):`DataSource schema 與目前環境均通過驗證。`}):null]})}function Rt(e){return(0,a.jsxs)(`div`,{style:Fe,children:[(0,a.jsxs)(i.Typography,{variant:`label-primary`,children:[e.label,` · v`,e.version]}),e.description?(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`caption`,children:e.description}):null,(0,a.jsxs)(i.Typography,{color:`text-neutral`,variant:`caption`,children:[`支援:`,e.supportedControls.join(`、`),`;`,e.supportsSearch?`支援搜尋`:`不支援搜尋`,`;`,e.paginationMode===`CURSOR`?`支援分頁`:`完整清單`,`; policy:`,e.revalidationPolicy]})]})}function zt(e,n){let r=(0,s.readFormDataSourceBinding)(e,n.key),o=Ke(r),c=(0,s.readCompatibleFormDataSourceBindingFields)(n.type,p.fields,e.fieldKey),l=[...n.required?[]:[{id:S,name:`未綁定`}],...c,...n.type===`STRING_ARRAY`?[]:[{id:x,name:`固定常數`}]];return(0,a.jsxs)(`div`,{style:Ie,children:[(0,a.jsx)(t.t,{label:`${n.label??n.key}${n.required?`(必填)`:`(選填)`}`,name:`dataSourceParameter_${n.key}`,children:(0,a.jsx)(i.Select,{clearable:!1,onChange:t=>Vt(e,n.key,n.type,t?.id),options:l,placeholder:`選擇欄位或常數`,value:(0,s.readSelectOption)(l,o)})}),(0,s.readFormDataSourceBindingValueKind)(r)===`CONSTANT`?Bt(e,n.key,n.type,r):(0,s.readFormDataSourceBindingValueKind)(r)===`FIELD`?(0,a.jsxs)(i.Typography,{color:`text-neutral`,variant:`caption`,children:[`使用表單欄位「`,r?.from.kind===`FIELD`?r.from.fieldKey:``,`」的目前值。`]}):(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`caption`,children:n.required?c.length>0?`請選擇相容的表單欄位或固定常數。`:`目前沒有型別相容的表單欄位,請先建立 dependency。`:`此參數可不綁定。`})]},n.key)}function Bt(e,t,n,r){let o=(0,s.readFormDataSourceBindingValue)(e,t);if(n===`BOOLEAN`){let e=[{id:`true`,name:`是`},{id:`false`,name:`否`}];return(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>Ht(t,e?.id===`true`),options:e,value:(0,s.readSelectOption)(e,o===!0?`true`:`false`)})}return n===`STRING_ARRAY`?(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`caption`,children:`STRING_ARRAY 參數請綁定複選欄位;目前不接受固定常數。`}):(0,a.jsx)(i.Input,{onChange:e=>Ht(t,n===`NUMBER`?(0,s.parseOptionalNumberInput)(e.target.value)??0:e.target.value),placeholder:n===`NUMBER`?`輸入數字`:`輸入固定值`,value:Je(r,n),variant:`base`})}function Vt(e,t,n,r){if(!r||r===S){G(e=>(0,c.isFormDataSourceFieldDefinition)(e)?(0,s.upsertFormDataSourceFieldBinding)(e,t,null):e);return}if(r===x){G(e=>(0,c.isFormDataSourceFieldDefinition)(e)?(0,s.upsertFormDataSourceFieldBinding)(e,t,{from:{kind:`CONSTANT`,value:qe(n)},parameter:t}):e);return}G(e=>(0,c.isFormDataSourceFieldDefinition)(e)?(0,s.upsertFormDataSourceFieldBinding)(e,t,{from:{fieldKey:r,kind:`FIELD`},parameter:t}):e)}function Ht(e,t){G(n=>(0,c.isFormDataSourceFieldDefinition)(n)?(0,s.upsertFormDataSourceFieldBinding)(n,e,{from:{kind:`CONSTANT`,value:t},parameter:e}):n)}function Ut(e){let t=(0,c.readFormFieldSelectionMode)(e),n=Array.isArray(e.defaultValue)?e.defaultValue:[],r=e.options.map(s.readFieldOptionAsSelectOption),o=r.filter(e=>n.includes(e.id));return(0,a.jsxs)(a.Fragment,{children:[Q(`預設值`,`fieldDefaultValue`,t===`multiple`?(0,a.jsx)(i.Select,{clearable:!0,mode:`multiple`,onChange:e=>J({defaultValue:e.length?e.map(e=>e.id):void 0}),options:r,placeholder:`選擇一或多個預設選項`,value:o}):(0,a.jsx)(i.Select,{clearable:!0,onChange:e=>J({defaultValue:e?.id||void 0}),options:r,placeholder:`選擇預設選項`,value:typeof e.defaultValue==`string`?(0,s.readSelectOption)(r,e.defaultValue):null})),Q(`選項`,`fieldOptions`,Zt(e),!0)]})}function Wt(e){let t=typeof e.defaultValue==`boolean`?String(e.defaultValue):`unset`;return Q(`預設值`,`fieldDefaultValue`,(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>St({defaultValue:e?.id===`true`?!0:e?.id===`false`?!1:void 0}),options:[...Ve],placeholder:`選擇預設狀態`,value:(0,s.readSelectOption)(Ve,t)}))}function Gt(e){return(0,a.jsxs)(a.Fragment,{children:[Q(`檔案數`,`fieldMaxFiles`,Z(e.maxFiles,e=>Ct({maxFiles:e}),`例如:1`,{min:1})),Q(`MIME`,`fieldAcceptedMimeTypes`,Yt({name:`fieldAcceptedMimeTypes`,onChange:e=>Ct({acceptedMimeTypes:Qe(e)}),placeholder:`每行一個 MIME type,例如:application/pdf`,rows:3,value:$e(e.acceptedMimeTypes)}),!1)]})}function Kt(e){let t=p.fields.filter(t=>t.fieldKey!==e.fieldKey);return t.length?(0,a.jsx)(a.Fragment,{children:Ue.map(n=>qt(e,n,t))}):(0,a.jsx)(i.Typography,{color:`text-neutral`,style:be,variant:`body`,children:`目前沒有其他欄位可作為條件來源。新增更多欄位後即可設定條件規則。`})}function qt(e,t,n){let r=e[t.target],o=r?(0,s.parseConditionRule)(r):null,c=n.find(e=>e.fieldKey===o?.fieldKey),l=c??n[0],u=n.map(Xe),d=(0,s.readConditionOperatorOptions)(l),f=o&&d.some(e=>e.id===o.operator)?o.operator:(0,s.readDefaultConditionOperator)(l),p=o?.value??(0,s.readDefaultConditionValue)(l),m=!!r,h=m&&(!o||!c);return Q(t.label,t.name,(0,a.jsxs)(`div`,{style:ke,children:[(0,a.jsx)(i.Toggle,{checked:m,label:m?`已啟用`:`不啟用`,onChange:e=>X(t.target,e.target.checked?(0,s.buildConditionExpression)(l,(0,s.readDefaultConditionOperator)(l),(0,s.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:Ae,children:[(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>{let r=n.find(t=>t.fieldKey===e?.id)??l;X(t.target,(0,s.buildConditionExpression)(r,(0,s.readDefaultConditionOperator)(r),(0,s.readDefaultConditionValue)(r)))},options:u,placeholder:`選擇欄位`,value:(0,s.readSelectOption)(u,l.fieldKey)}),(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>X(t.target,(0,s.buildConditionExpression)(l,(0,s.readConditionOperatorOption)(e?.id)??f,p)),options:[...d],placeholder:`判斷方式`,value:(0,s.readSelectOption)(d,f)}),Jt(l,p,e=>X(t.target,(0,s.buildConditionExpression)(l,f,e)))]}):null]}),!0)}function X(e,t){W({[e]:t})}function Jt(e,t,n){if(e.type===`boolean`)return(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>n(e?.id??`true`),options:[...He],placeholder:`比較值`,value:(0,s.readSelectOption)(He,t===`false`?`false`:`true`)});if((0,s.isSelectFieldDefinition)(e)){let r=e.options.map(s.readFieldOptionAsSelectOption);return(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>n(e?.id??r[0]?.id??``),options:r,placeholder:`比較值`,value:(0,s.readSelectOption)(r,t)})}return(0,s.isNumberFieldDefinition)(e)?Z((0,s.parseOptionalNumberInput)(t),e=>n(String(e??0)),`比較值`):(0,s.isDateFieldDefinition)(e)?Xt(e,t,e=>n(e??``)):(0,a.jsx)(i.Input,{onChange:e=>n(e.target.value),placeholder:`比較值`,value:t,variant:`base`})}function Yt({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:Le,resize:`vertical`,rows:r,style:we,value:o})}function Z(e,t,n,r={}){return(0,a.jsx)(i.Input,{max:r.max,min:r.min,onChange:e=>t((0,s.clampOptionalNumber)((0,s.parseOptionalNumberInput)(e.target.value),r)),placeholder:n,showSpinner:!0,step:r.step??1,value:typeof e==`number`?String(e):``,variant:`measure`})}function Xt(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,s.formatDateTimePickerValue)(e)),placeholderLeft:`選擇日期`,placeholderRight:`選擇時間`,value:(0,s.readDatePickerValue)(t)}):(0,a.jsx)(i.DatePicker,{format:`YYYY-MM-DD`,onChange:e=>n((0,s.formatDatePickerValue)(e)),placeholder:`選擇日期`,value:(0,s.readDatePickerValue)(t)})}function Zt(e){return(0,a.jsxs)(`div`,{style:v,children:[(0,a.jsx)(i.Table,{actions:{render:t=>[{disabled:()=>e.options.length<=1,icon:o.TrashIcon,iconType:`icon-only`,name:`移除選項`,onClick:()=>J({options:e.options.filter((e,n)=>n!==t.index)}),variant:`destructive-ghost`}],width:56},columns:[{key:`label`,render:t=>(0,a.jsx)(i.Input,{onChange:n=>J({options:et(e.options,t.index,{label:n.target.value})}),placeholder:`例如:主管`,size:`sub`,value:t.label,variant:`base`}),title:`Label`},{key:`value`,render:t=>(0,a.jsx)(i.Input,{onChange:n=>J({options:et(e.options,t.index,{value:n.target.value})}),placeholder:`例如:manager`,size:`sub`,value:t.value,variant:`base`}),title:`Value`}],dataSource:e.options.map((t,n)=>({index:n,key:`${e.fieldKey}-${n}`,label:t.label,value:t.value})),showHeader:!0,size:`sub`}),(0,a.jsx)(`div`,{style:y,children:(0,a.jsx)(i.Button,{icon:o.PlusIcon,iconType:`leading`,onClick:()=>J({options:[...e.options,tt(e.options)]}),variant:`base-secondary`,children:`新增選項`})})]})}function Qt(e,t,n){return(0,a.jsx)(`div`,{...t.draggableProps,"data-form-builder-field-key":e.fieldKey,ref:t.innerRef,style:{...de,...n?fe:null,...t.draggableProps.style},children:(0,a.jsx)(i.BaseCard,{style:e.fieldKey===H?.fieldKey?pe:void 0,children:$t(e,t,n)})})}function Q(e,n,r,i=!1){return(0,a.jsx)(`div`,{style:i?Se:xe,children:(0,a.jsx)(`div`,{style:Ce,children:(0,a.jsx)(t.t,{label:e,name:n,children:r})})})}function $t(e,t,n){return(0,a.jsxs)(`div`,{...t.dragHandleProps??{},"aria-label":`選取或拖曳排序欄位`,onClick:()=>F(e.fieldKey),style:se,title:`點擊選取,拖曳排序`,children:[(0,a.jsx)(`span`,{"aria-label":`拖曳排序`,role:`img`,style:je,title:`拖曳排序`,children:(0,a.jsx)(i.Icon,{icon:o.DotDragVerticalIcon,size:20})}),(0,a.jsxs)(`div`,{style:ce,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:Ne,children:`*`}):null]}),(0,a.jsxs)(i.Typography,{color:`text-neutral`,component:`span`,ellipsis:!0,variant:`caption`,children:[We(e.type),` ·`,e.required?` 必填`:` 選填`,` ·`,e.fieldKey]})]}),(0,a.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:le,children:[(0,a.jsx)(`div`,{style:ue,children:(0,a.jsx)(i.Toggle,{checked:!!e.required,disabled:n,label:`必填`,onChange:t=>Tt(e.fieldKey,t.target.checked)})}),(0,a.jsx)(i.Button,{disabled:n,icon:o.TrashIcon,iconType:`icon-only`,onClick:()=>mt(e.fieldKey),variant:`destructive-ghost`,children:`移除欄位`})]})]})}function en(){return(0,a.jsxs)(`div`,{style:_,children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`h3`,children:`填寫預覽`}),(0,a.jsx)(n.t,{dataSourceContext:{kind:`preview`},onChange:wt,schema:p,uiSchema:h,value:it})]})}function tn(){return(0,a.jsxs)(`div`,{style:_,children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`h3`,children:`Schema`}),(0,a.jsxs)(`div`,{style:Te,children:[$(`Form Schema`,`schemaJson`,(0,a.jsx)(ee,{height:`360px`,name:`schemaJson`,onChange:Et,placeholder:`輸入 Form Schema JSON`,value:O})),$(`UI Schema`,`uiSchemaJson`,(0,a.jsx)(ee,{height:`240px`,name:`uiSchemaJson`,onChange:Dt,placeholder:`輸入 UI Schema JSON`,value:rt})),ot?(0,a.jsx)(i.Typography,{color:`text-error`,style:Oe,variant:`body`,children:ot}):null]})]})}function $(e,n,r){return(0,a.jsx)(`div`,{style:Ee,children:(0,a.jsx)(`div`,{style:De,children:(0,a.jsx)(t.t,{label:e,name:n,children:r})})})}}function We(e){return g.find(t=>t.type===e)?.label??e}function T(e){return`${e.key}@${e.version}`}function Ge(e){return{id:T(e),name:`${e.label} · ${e.key} v${e.version}`}}function Ke(e){return e?e.from.kind===`FIELD`?e.from.fieldKey:x:S}function qe(e){switch(e){case`BOOLEAN`:return!1;case`NUMBER`:return 0;case`STRING_ARRAY`:return``;case`STRING`:return``;default:return``}}function Je(e,t){let n=e?.from.kind===`CONSTANT`?e.from.value:``;return t===`NUMBER`?typeof n==`number`?String(n):``:typeof n==`string`?n:``}function Ye(e){return!!(e.visibleWhen||e.requiredWhen||e.readonlyWhen)}function Xe(e){return{id:e.fieldKey,name:e.label}}function Ze(e){return e.type===`text`||e.type===`textarea`}function E(e){return typeof e==`string`?e:``}function Qe(e){let t=e.split(/[\n,]/u).map(e=>e.trim()).filter(Boolean);return t.length?t:void 0}function $e(e){return e?.join(`
2
- `)??``}function D(e){return JSON.stringify(e,null,2)}function et(e,t,n){return e.map((e,r)=>r===t?{...e,...n}:e)}function tt(e){let t=e.length+1;return{label:`選項 ${t}`,value:O(e,t)}}function O(e,t){let n=`option_${t}`;return e.some(e=>e.value===n)?O(e,t+1):n}function nt(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 w}});
3
- //# sourceMappingURL=FormBuilderView-BPLwAJGv.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FormRendererView-C5POZbWz.js","names":[],"sources":["../../src/views/forms/renderer/form-data-source-field.ts","../../src/views/forms/renderer/FormRendererView.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n FormDataSourceValueSnapshots,\n FormDefinitionSchema,\n FormFieldDefinition,\n FormFieldOption,\n FormFieldValue,\n FormUiSchema,\n isFormDataSourceFieldDefinition,\n} from '@rytass/bpm-core-shared/form';\nimport {\n FormDataSourceFieldStatus,\n FormRendererValues,\n mergeFormDataSourceOptions,\n readFormDataSourceErrorMessage,\n readMissingFormDataSourceOptionValues,\n previewFormFieldOptions,\n readFormDataSourceValueSignature,\n readMissingFormDataSourceDependencies,\n readSelectedFormDataSourceOptions,\n readFormFieldOptions,\n} from '@rytass/bpm-core-client/form';\n\nexport type FormRendererDataSourceContext =\n | { readonly kind: 'preview' }\n | {\n readonly instanceId?: string | null;\n readonly kind: 'runtime';\n readonly templateId?: string | null;\n };\n\nexport interface FormDataSourceFieldState {\n readonly error: string | null;\n readonly hasValue: boolean;\n readonly hasNextPage: boolean;\n readonly invalidValues: readonly string[];\n readonly onReachBottom: () => void;\n readonly onSearch: (searchText: string) => void;\n readonly options: readonly FormFieldOption[];\n readonly retry: () => void;\n readonly status: FormDataSourceFieldStatus;\n}\n\nexport interface UseFormDataSourceFieldInput {\n readonly context?: FormRendererDataSourceContext;\n readonly field: FormFieldDefinition;\n readonly formData: FormRendererValues;\n readonly initialFormData?: FormRendererValues;\n readonly initialValue?: FormFieldValue | undefined;\n readonly optionSnapshots?: FormDataSourceValueSnapshots;\n readonly readonly: boolean;\n readonly schema: FormDefinitionSchema;\n readonly uiSchema: FormUiSchema;\n}\n\nconst EMPTY_FIELD_STATE: FormDataSourceFieldState = {\n error: null,\n hasValue: false,\n hasNextPage: false,\n invalidValues: [],\n onReachBottom: (): void => undefined,\n onSearch: (): void => undefined,\n options: [],\n retry: (): void => undefined,\n status: 'IDLE',\n};\n\nexport function useFormDataSourceField(\n input: UseFormDataSourceFieldInput,\n): FormDataSourceFieldState {\n const dynamicField = isFormDataSourceFieldDefinition(input.field)\n ? input.field\n : null;\n const snapshot = dynamicField\n ? input.optionSnapshots?.[dynamicField.fieldKey]\n : undefined;\n const snapshotSignature = JSON.stringify(snapshot ?? null);\n const snapshotOptions = useMemo(\n (): readonly FormFieldOption[] => snapshot?.options ?? [],\n [snapshotSignature],\n );\n const formDataSignature = JSON.stringify(input.formData);\n const initialFormDataSignature = JSON.stringify(input.initialFormData ?? {});\n const schemaSignature = JSON.stringify(input.schema);\n const uiSchemaSignature = JSON.stringify(input.uiSchema);\n const contextKind = input.context?.kind;\n const contextInstanceId =\n input.context?.kind === 'runtime' ? input.context.instanceId : undefined;\n const contextTemplateId =\n input.context?.kind === 'runtime' ? input.context.templateId : undefined;\n const missingDependencies = dynamicField\n ? readMissingFormDataSourceDependencies(dynamicField, input.formData)\n : [];\n const missingDependenciesSignature = JSON.stringify(missingDependencies);\n const dataSourceRefreshSignature = dynamicField\n ? JSON.stringify({\n bindings: dynamicField.dataSource.bindings.map((binding) =>\n binding.from.kind === 'FIELD'\n ? {\n fieldKey: binding.from.fieldKey,\n value: input.formData[binding.from.fieldKey],\n }\n : { value: binding.from.value },\n ),\n value:\n typeof input.initialFormData !== 'undefined' ||\n typeof input.initialValue !== 'undefined'\n ? input.formData[dynamicField.fieldKey]\n : undefined,\n })\n : '';\n const effectiveContext = useMemo(\n (): FormRendererDataSourceContext | undefined => {\n if (contextKind === 'preview') {\n return { kind: 'preview' };\n }\n\n if (contextKind === 'runtime' && !input.readonly) {\n return {\n instanceId: contextInstanceId,\n kind: 'runtime',\n templateId: contextTemplateId,\n };\n }\n\n return undefined;\n },\n [\n contextInstanceId,\n contextKind,\n contextTemplateId,\n input.readonly,\n ],\n );\n const valueChanged = dynamicField\n ? (typeof input.initialFormData !== 'undefined' ||\n typeof input.initialValue !== 'undefined') &&\n readFormDataSourceValueSignature(input.initialValue) !==\n readFormDataSourceValueSignature(input.formData[dynamicField.fieldKey])\n : false;\n const bindingsChanged = dynamicField\n ? typeof input.initialFormData !== 'undefined' &&\n dynamicField.dataSource.bindings.some((binding) => {\n if (binding.from.kind !== 'FIELD') {\n return false;\n }\n\n return (\n readFormDataSourceValueSignature(\n input.initialFormData?.[binding.from.fieldKey],\n ) !==\n readFormDataSourceValueSignature(input.formData[binding.from.fieldKey])\n );\n })\n : false;\n const isStale = Boolean(snapshot && (valueChanged || bindingsChanged));\n const [remoteOptions, setRemoteOptions] = useState<readonly FormFieldOption[]>(\n [],\n );\n const [searchText, setSearchText] = useState('');\n const [nextCursor, setNextCursor] = useState<string | null>(null);\n const [status, setStatus] = useState<FormDataSourceFieldStatus>(\n dynamicField ? (snapshot ? (isStale ? 'STALE' : 'VALID') : 'IDLE') : 'IDLE',\n );\n const [error, setError] = useState<string | null>(null);\n const requestSequence = useRef(0);\n const lastRequest = useRef<{ readonly cursor: string | null; readonly searchText: string }>({\n cursor: null,\n searchText: '',\n });\n\n const queryFormData = useMemo(\n (): Readonly<Record<string, FormFieldValue>> =>\n Object.entries(input.formData).reduce<\n Readonly<Record<string, FormFieldValue>>\n >((values, [key, value]) => {\n if (typeof value === 'undefined') {\n return values;\n }\n\n return { ...values, [key]: value };\n }, {}),\n [formDataSignature],\n );\n const mergedOptions = useMemo(\n (): readonly FormFieldOption[] =>\n mergeFormDataSourceOptions(snapshotOptions, remoteOptions),\n [remoteOptions, snapshotOptions],\n );\n const invalidValues = useMemo(\n (): readonly string[] =>\n readMissingFormDataSourceOptionValues(\n dynamicField ? input.formData[dynamicField.fieldKey] : undefined,\n mergedOptions,\n ),\n [dynamicField, input.formData, mergedOptions],\n );\n const hasValue = readFormDataSourceValuePresent(\n dynamicField ? input.formData[dynamicField.fieldKey] : undefined,\n );\n\n const loadOptions = useCallback(\n (nextSearchTextToLoad: string, cursor: string | null): void => {\n if (!dynamicField || !effectiveContext) {\n return;\n }\n\n if (missingDependencies.length > 0) {\n setStatus('WAITING_FOR_DEPENDENCIES');\n setError(null);\n\n return;\n }\n\n const requestId = requestSequence.current + 1;\n requestSequence.current = requestId;\n lastRequest.current = {\n cursor,\n searchText: nextSearchTextToLoad,\n };\n setStatus(isStale ? 'STALE' : 'LOADING');\n setError(null);\n\n const request =\n effectiveContext.kind === 'preview'\n ? previewFormFieldOptions({\n cursor,\n fieldKey: dynamicField.fieldKey,\n formData: queryFormData,\n schema: input.schema,\n searchText: nextSearchTextToLoad,\n uiSchema: input.uiSchema,\n })\n : readFormFieldOptions({\n cursor,\n fieldKey: dynamicField.fieldKey,\n formData: queryFormData,\n instanceId: effectiveContext.instanceId ?? null,\n searchText: nextSearchTextToLoad,\n templateId: effectiveContext.templateId ?? null,\n });\n\n void request\n .then((result): void => {\n if (requestSequence.current !== requestId) {\n return;\n }\n\n setRemoteOptions((currentOptions) => {\n const currentValue = dynamicField\n ? input.formData[dynamicField.fieldKey]\n : undefined;\n const selectedOptions = readSelectedFormDataSourceOptions(\n currentValue,\n currentOptions,\n );\n\n return mergeFormDataSourceOptions(\n selectedOptions,\n cursor ? currentOptions : [],\n result.options,\n );\n });\n setNextCursor(result.nextCursor);\n setStatus('VALID');\n setError(null);\n })\n .catch((requestError: unknown): void => {\n if (requestSequence.current !== requestId) {\n return;\n }\n\n setStatus('UNAVAILABLE');\n // The backend answers with stable codes rather than prose, so show\n // the mapped copy instead of a raw `FORM_DATA_SOURCE_*` string.\n setError(\n readFormDataSourceErrorMessage(requestError) ??\n (requestError instanceof Error\n ? requestError.message\n : '選項來源暫時無法使用。'),\n );\n });\n },\n [\n dynamicField,\n effectiveContext,\n isStale,\n missingDependencies.length,\n queryFormData,\n schemaSignature,\n uiSchemaSignature,\n ],\n );\n const loadOptionsRef = useRef(loadOptions);\n loadOptionsRef.current = loadOptions;\n\n useEffect((): void => {\n requestSequence.current += 1;\n setRemoteOptions((currentOptions) => {\n const currentValue = dynamicField\n ? input.formData[dynamicField.fieldKey]\n : undefined;\n\n return readSelectedFormDataSourceOptions(currentValue, currentOptions);\n });\n setNextCursor((currentCursor) =>\n currentCursor === null ? currentCursor : null,\n );\n setSearchText((currentSearchText) =>\n currentSearchText ? '' : currentSearchText,\n );\n setError((currentError) => (currentError ? null : currentError));\n\n if (!dynamicField) {\n setStatus('IDLE');\n\n return;\n }\n\n if (missingDependencies.length > 0) {\n setStatus('WAITING_FOR_DEPENDENCIES');\n\n return;\n }\n\n if (!effectiveContext) {\n setStatus(\n snapshot\n ? isStale\n ? 'STALE'\n : 'VALID'\n : input.readonly\n ? 'UNAVAILABLE'\n : 'IDLE',\n );\n\n return;\n }\n\n if (dynamicField.type === 'autocomplete') {\n setStatus(snapshot ? (isStale ? 'STALE' : 'VALID') : 'IDLE');\n\n return;\n }\n\n loadOptionsRef.current('', null);\n }, [\n dynamicField,\n effectiveContext,\n dataSourceRefreshSignature,\n initialFormDataSignature,\n input.readonly,\n isStale,\n missingDependenciesSignature,\n snapshotSignature,\n ]);\n\n const onSearch = useCallback(\n (nextSearchTextToLoad: string): void => {\n setSearchText(nextSearchTextToLoad);\n setRemoteOptions((currentOptions) => {\n const currentValue = dynamicField\n ? input.formData[dynamicField.fieldKey]\n : undefined;\n\n return readSelectedFormDataSourceOptions(currentValue, currentOptions);\n });\n setNextCursor(null);\n loadOptions(nextSearchTextToLoad, null);\n },\n [loadOptions],\n );\n const onReachBottom = useCallback((): void => {\n if (nextCursor) {\n loadOptions(searchText, nextCursor);\n }\n }, [loadOptions, nextCursor, searchText]);\n const retry = useCallback((): void => {\n loadOptions(lastRequest.current.searchText, lastRequest.current.cursor);\n }, [loadOptions]);\n\n if (!dynamicField) {\n return EMPTY_FIELD_STATE;\n }\n\n return {\n error,\n hasValue,\n hasNextPage: Boolean(nextCursor),\n invalidValues,\n onReachBottom,\n onSearch,\n options: mergedOptions,\n retry,\n status: status === 'VALID' && invalidValues.length ? 'INVALID' : status,\n };\n}\n\nexport function readFormDataSourceFieldStatusMessage(\n state: FormDataSourceFieldState,\n): string | null {\n switch (state.status) {\n case 'WAITING_FOR_DEPENDENCIES':\n return '請先填寫相依欄位。';\n case 'STALE':\n return '選項需要重新載入或驗證。';\n case 'INVALID':\n return state.invalidValues.length\n ? `無法辨識選項:${state.invalidValues.join('、')}`\n : '目前選項已失效,請重新選擇。';\n case 'UNAVAILABLE':\n return state.error ?? '選項來源暫時無法使用。';\n case 'VALID':\n return state.options.length ? null : '目前沒有可用選項。';\n default:\n return null;\n }\n}\n\nexport function isFormDataSourceFieldSubmissionBlocked(\n state: Pick<FormDataSourceFieldState, 'hasValue' | 'status'>,\n): boolean {\n return state.hasValue && state.status !== 'VALID';\n}\n\nfunction readFormDataSourceValuePresent(\n value: FormFieldValue | undefined,\n): boolean {\n if (typeof value === 'undefined' || value === null) {\n return false;\n }\n\n if (typeof value === 'string') {\n return value.trim().length > 0;\n }\n\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n\n return true;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n ReactElement,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Button,\n CheckboxGroup,\n DatePicker,\n DateTimePicker,\n Input,\n RadioGroup,\n Select,\n Textarea,\n Toggle,\n Typography,\n Upload,\n} from '@mezzanine-ui/react';\nimport type { UploadFile } from '@mezzanine-ui/react/Upload';\nimport {\n FormDataSourceOptionFieldDefinition,\n FormDataSourceValueSnapshots,\n FormDefinitionSchema,\n FormFieldDefinition,\n FormFieldValue,\n FormUiSchema,\n isFormDataSourceFieldDefinition,\n isFormStaticOptionFieldDefinition,\n readFormFieldSelectionMode,\n} from '@rytass/bpm-core-shared/form';\nimport {\n buildFormRendererValues,\n clampOptionalNumber,\n formatDatePickerValue,\n formatDateTimePickerValue,\n FormRendererValues,\n isFormRendererFieldReadonly,\n isFormRendererFieldRequired,\n parseOptionalNumberInput,\n readDatePickerValue,\n readFieldOptionAsSelectOption,\n readSelectedFormDataSourceOptions,\n readSelectOption,\n readVisibleFormRendererFields,\n} from '@rytass/bpm-core-client/form';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport {\n FormDataSourceFieldState,\n FormRendererDataSourceContext,\n readFormDataSourceFieldStatusMessage,\n useFormDataSourceField,\n} from './form-data-source-field';\n\nexport interface FormRendererProps {\n readonly dataSourceContext?: FormRendererDataSourceContext;\n readonly dataSourceInitialValues?: FormRendererValues;\n readonly emptyText?: string;\n readonly errors?: Readonly<Record<string, string>>;\n readonly maxWidth?: CSSProperties['maxWidth'];\n readonly onChange?: (values: FormRendererValues) => void;\n readonly onDataSourceStateChange?: (\n fieldKey: string,\n state: Pick<\n FormDataSourceFieldState,\n 'hasValue' | 'invalidValues' | 'status'\n >,\n ) => void;\n readonly onUploadAttachment?: (\n field: FormFieldDefinition,\n file: File,\n ) => Promise<{ readonly id: string }>;\n readonly optionSnapshots?: FormDataSourceValueSnapshots;\n readonly readonly?: boolean;\n readonly schema: FormDefinitionSchema;\n readonly singleColumn?: boolean;\n readonly uiSchema: FormUiSchema;\n readonly value?: FormRendererValues;\n}\n\nconst FORM_RENDERER_GRID_STYLE: CSSProperties = {\n alignItems: 'start',\n display: 'grid',\n gap: 12,\n gridTemplateColumns: 'repeat(12, minmax(0, 1fr))',\n};\n\nconst FORM_RENDERER_EMPTY_STYLE: CSSProperties = {\n gridColumn: '1 / -1',\n};\n\nconst FORM_RENDERER_FIELD_STYLE: CSSProperties = {\n alignItems: 'start',\n display: 'grid',\n gap: 8,\n minWidth: 0,\n};\n\nconst TEXTAREA_STYLE: CSSProperties = {\n minWidth: '100%',\n width: '100%',\n};\n\nfunction applyFullWidthTextareaHost(element: HTMLDivElement | null): void {\n if (!element) {\n return;\n }\n\n element.style.width = '100%';\n}\n\nexport function FormRenderer({\n dataSourceContext,\n dataSourceInitialValues,\n emptyText = '尚未建立欄位。',\n errors = {},\n maxWidth,\n onChange,\n onDataSourceStateChange,\n onUploadAttachment,\n optionSnapshots,\n readonly = false,\n schema,\n singleColumn = false,\n uiSchema,\n value,\n}: FormRendererProps): ReactElement {\n const [internalValues, setInternalValues] = useState<FormRendererValues>(() =>\n buildFormRendererValues(schema.fields, value ?? {}),\n );\n const values = useMemo(\n (): FormRendererValues =>\n buildFormRendererValues(schema.fields, value ?? internalValues),\n [internalValues, schema.fields, value],\n );\n const valuesRef = useRef<FormRendererValues>(values);\n const visibleFields = useMemo(\n (): readonly FormFieldDefinition[] =>\n readVisibleFormRendererFields(schema, uiSchema, values),\n [schema, uiSchema, values],\n );\n\n useEffect((): void => {\n valuesRef.current = values;\n }, [values]);\n\n useEffect((): void => {\n setInternalValues((currentValues) =>\n buildFormRendererValues(schema.fields, value ?? currentValues),\n );\n }, [schema.fields, value]);\n\n function updateValue(\n fieldKey: string,\n nextValue: FormFieldValue | undefined,\n ): void {\n const nextValues = {\n ...valuesRef.current,\n [fieldKey]: nextValue,\n };\n valuesRef.current = nextValues;\n\n if (!value) {\n setInternalValues(nextValues);\n }\n\n onChange?.(nextValues);\n }\n\n if (!visibleFields.length) {\n return (\n <div style={FORM_RENDERER_GRID_STYLE}>\n <Typography\n color=\"text-neutral\"\n style={FORM_RENDERER_EMPTY_STYLE}\n variant=\"body\"\n >\n {schema.fields.length > 0 ? '目前條件下沒有可填寫欄位。' : emptyText}\n </Typography>\n </div>\n );\n }\n\n return (\n <div\n style={{\n ...FORM_RENDERER_GRID_STYLE,\n ...(singleColumn ? { maxWidth, width: '100%' } : {}),\n }}\n >\n {visibleFields.map((field) => (\n <FormRendererField\n dataSourceContext={dataSourceContext}\n dataSourceInitialValues={dataSourceInitialValues}\n field={field}\n error={errors[field.fieldKey] ?? null}\n fields={schema.fields}\n key={field.fieldKey}\n onChange={updateValue}\n onDataSourceStateChange={onDataSourceStateChange}\n onUploadAttachment={onUploadAttachment}\n optionSnapshots={optionSnapshots}\n readonly={readonly}\n schema={schema}\n style={{\n ...FORM_RENDERER_FIELD_STYLE,\n gridColumn: `span ${\n singleColumn ? 12 : readFieldColumnSpan(field, uiSchema)\n }`,\n }}\n value={values[field.fieldKey]}\n values={values}\n uiSchema={uiSchema}\n />\n ))}\n </div>\n );\n}\n\nfunction FormRendererField({\n dataSourceContext,\n dataSourceInitialValues,\n error,\n field,\n fields,\n onChange,\n onDataSourceStateChange,\n onUploadAttachment,\n optionSnapshots,\n readonly,\n schema,\n style,\n value,\n values,\n uiSchema,\n}: {\n readonly dataSourceContext?: FormRendererDataSourceContext;\n readonly dataSourceInitialValues?: FormRendererValues;\n readonly error: string | null;\n readonly field: FormFieldDefinition;\n readonly fields: readonly FormFieldDefinition[];\n readonly onChange: (\n fieldKey: string,\n value: FormFieldValue | undefined,\n ) => void;\n readonly onDataSourceStateChange?: (\n fieldKey: string,\n state: Pick<\n FormDataSourceFieldState,\n 'hasValue' | 'invalidValues' | 'status'\n >,\n ) => void;\n readonly onUploadAttachment?:\n | ((\n field: FormFieldDefinition,\n file: File,\n ) => Promise<{ readonly id: string }>)\n | undefined;\n readonly optionSnapshots?: FormDataSourceValueSnapshots;\n readonly readonly: boolean;\n readonly schema: FormDefinitionSchema;\n readonly style: CSSProperties;\n readonly uiSchema: FormUiSchema;\n readonly value: FormFieldValue | undefined;\n readonly values: FormRendererValues;\n}): ReactElement {\n const required = isFormRendererFieldRequired(field, fields, values);\n const fieldReadonly =\n readonly || isFormRendererFieldReadonly(field, fields, values);\n const dataSourceState = useFormDataSourceField({\n context: dataSourceContext,\n field,\n formData: values,\n initialFormData: dataSourceInitialValues,\n initialValue: dataSourceInitialValues?.[field.fieldKey],\n optionSnapshots,\n readonly: fieldReadonly,\n schema,\n uiSchema,\n });\n const dataSourceStatusMessage = readFormDataSourceFieldStatusMessage(\n dataSourceState,\n );\n const dataSourceStateSignature = JSON.stringify({\n hasValue: dataSourceState.hasValue,\n invalidValues: dataSourceState.invalidValues,\n status: dataSourceState.status,\n });\n\n useEffect((): void => {\n if (!isFormDataSourceFieldDefinition(field)) {\n return;\n }\n\n onDataSourceStateChange?.(field.fieldKey, {\n hasValue: dataSourceState.hasValue,\n invalidValues: dataSourceState.invalidValues,\n status: dataSourceState.status,\n });\n }, [\n dataSourceStateSignature,\n field.fieldKey,\n onDataSourceStateChange,\n ]);\n\n return (\n <div data-form-field-key={field.fieldKey} style={style}>\n <BPMFormField\n label={field.label}\n name={field.fieldKey}\n required={required}\n >\n {renderControl(\n field,\n value,\n fieldReadonly,\n onChange,\n onUploadAttachment,\n dataSourceContext,\n dataSourceState,\n )}\n </BPMFormField>\n {error ? (\n <Typography color=\"text-error\" variant=\"caption\">\n {error}\n </Typography>\n ) : null}\n {dataSourceStatusMessage ? (\n <div style={DATA_SOURCE_FEEDBACK_STYLE}>\n <Typography\n color={\n dataSourceState.status === 'INVALID' ||\n dataSourceState.status === 'UNAVAILABLE'\n ? 'text-error'\n : 'text-neutral'\n }\n variant=\"caption\"\n >\n {dataSourceStatusMessage}\n </Typography>\n {dataSourceState.status === 'UNAVAILABLE' ? (\n <Button\n onClick={dataSourceState.retry}\n size=\"sub\"\n type=\"button\"\n variant=\"base-ghost\"\n >\n 重試\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nconst DATA_SOURCE_FEEDBACK_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'flex',\n gap: 8,\n};\n\nfunction renderControl(\n field: FormFieldDefinition,\n value: FormFieldValue | undefined,\n readonly: boolean,\n onChange: (fieldKey: string, value: FormFieldValue | undefined) => void,\n onUploadAttachment:\n | ((\n field: FormFieldDefinition,\n file: File,\n ) => Promise<{ readonly id: string }>)\n | undefined,\n dataSourceContext: FormRendererDataSourceContext | undefined,\n dataSourceState: FormDataSourceFieldState,\n): ReactElement {\n if (field.type === 'textarea') {\n return (\n <Textarea\n onChange={(event: ChangeEvent<HTMLTextAreaElement>): void =>\n onChange(field.fieldKey, event.target.value)\n }\n placeholder={field.placeholder ?? '請輸入多行文字'}\n readOnly={readonly}\n ref={applyFullWidthTextareaHost}\n rows={3}\n style={TEXTAREA_STYLE}\n value={readStringValue(value)}\n />\n );\n }\n\n if (field.type === 'boolean') {\n return (\n <Toggle\n checked={value === true}\n disabled={readonly}\n label=\"啟用\"\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(field.fieldKey, event.target.checked)\n }\n />\n );\n }\n\n if (isFormDataSourceFieldDefinition(field)) {\n return renderDynamicOptionControl(\n field,\n value,\n readonly,\n onChange,\n dataSourceContext,\n dataSourceState,\n );\n }\n\n if (isFormStaticOptionFieldDefinition(field) && field.type === 'checkbox') {\n const options = field.options.map(readFieldOptionAsSelectOption);\n\n return (\n <Select\n mode=\"multiple\"\n onChange={(options): void =>\n onChange(\n field.fieldKey,\n options?.length\n ? options.map((option) => option.id)\n : undefined,\n )\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇一或多個選項'}\n readOnly={readonly}\n value={options.filter((option) =>\n readStringArrayValue(value).includes(option.id),\n )}\n />\n );\n }\n\n if (isFormStaticOptionFieldDefinition(field)) {\n const options = field.options.map(readFieldOptionAsSelectOption);\n\n return (\n <Select\n onChange={(option): void =>\n onChange(field.fieldKey, option?.id ?? undefined)\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇'}\n readOnly={readonly}\n value={readSelectOption(options, readStringValue(value))}\n />\n );\n }\n\n if (field.type === 'file_upload') {\n return (\n <Upload\n accept={field.acceptedMimeTypes?.join(',')}\n disabled={readonly}\n maxFiles={field.maxFiles}\n mode=\"button-list\"\n {...((field.maxFiles ?? 1) > 1 ? { multiple: true } : {})}\n onChange={(files): void =>\n onChange(\n field.fieldKey,\n files.length ? files.map((file) => file.id) : undefined,\n )\n }\n onUpload={async (files): Promise<UploadFile[]> =>\n Promise.all(\n files.map(async (file): Promise<UploadFile> => {\n const uploadedFile = onUploadAttachment\n ? await onUploadAttachment(field, file)\n : { id: `${file.name}-${file.lastModified}` };\n\n return {\n file,\n id: uploadedFile.id,\n progress: 100,\n status: 'done',\n };\n }),\n )\n }\n size=\"sub\"\n />\n );\n }\n\n if (field.type === 'date') {\n return (\n <DatePicker\n format=\"YYYY-MM-DD\"\n fullWidth\n onChange={(nextValue): void =>\n onChange(field.fieldKey, formatDatePickerValue(nextValue))\n }\n placeholder={field.placeholder ?? readInputPlaceholder(field.type)}\n readOnly={readonly}\n value={readDatePickerValue(value)}\n />\n );\n }\n\n if (field.type === 'datetime') {\n return (\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n onChange(field.fieldKey, formatDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"選擇日期\"\n placeholderRight=\"選擇時間\"\n readOnly={readonly}\n value={readDatePickerValue(value)}\n />\n );\n }\n\n if (field.type === 'number' || field.type === 'money') {\n return (\n <Input\n fullWidth\n max={field.maximum}\n min={field.minimum}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(\n field.fieldKey,\n clampOptionalNumber(parseOptionalNumberInput(event.target.value), {\n max: field.maximum,\n min: field.minimum,\n }),\n )\n }\n placeholder={field.placeholder ?? readInputPlaceholder(field.type)}\n {...(readonly ? { readonly: true as const } : {})}\n showSpinner\n value={readNumberInputValue(value)}\n variant=\"measure\"\n />\n );\n }\n\n return (\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(field.fieldKey, event.target.value)\n }\n placeholder={field.placeholder ?? readInputPlaceholder(field.type)}\n {...(readonly ? { readonly: true as const } : {})}\n value={readStringValue(value)}\n variant=\"base\"\n />\n );\n}\n\nfunction renderDynamicOptionControl(\n field: FormDataSourceOptionFieldDefinition,\n value: FormFieldValue | undefined,\n readonly: boolean,\n onChange: (fieldKey: string, value: FormFieldValue | undefined) => void,\n dataSourceContext: FormRendererDataSourceContext | undefined,\n dataSourceState: FormDataSourceFieldState,\n): ReactElement {\n const options = dataSourceState.options.map(readFieldOptionAsSelectOption);\n const selectedOptions = readSelectedFormDataSourceOptions(\n value,\n dataSourceState.options,\n ).map(readFieldOptionAsSelectOption);\n const loading = dataSourceState.status === 'LOADING';\n const waitingForDependencies =\n dataSourceState.status === 'WAITING_FOR_DEPENDENCIES';\n const interactiveSearch = Boolean(dataSourceContext) && !readonly;\n const optionControlDisabled = readonly || waitingForDependencies;\n\n if (field.type === 'autocomplete') {\n if (readFormFieldSelectionMode(field) === 'multiple') {\n return (\n <AutoComplete\n asyncData={interactiveSearch}\n clearSearchText\n disabled={optionControlDisabled}\n disabledOptionsFilter={interactiveSearch}\n globalPortal\n loading={loading}\n mode=\"multiple\"\n onChange={(nextOptions): void =>\n onChange(\n field.fieldKey,\n nextOptions.length\n ? nextOptions.map((option) => option.id)\n : undefined,\n )\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n onSearch={interactiveSearch ? dataSourceState.onSearch : undefined}\n options={options}\n placeholder={field.placeholder ?? '請輸入或選擇'}\n readOnly={readonly}\n searchDebounceTime={300}\n value={selectedOptions}\n />\n );\n }\n\n return (\n <AutoComplete\n asyncData={interactiveSearch}\n clearSearchText\n disabled={optionControlDisabled}\n disabledOptionsFilter={interactiveSearch}\n globalPortal\n loading={loading}\n mode=\"single\"\n onChange={(nextOption): void =>\n onChange(field.fieldKey, nextOption?.id ?? undefined)\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n onSearch={interactiveSearch ? dataSourceState.onSearch : undefined}\n options={options}\n placeholder={field.placeholder ?? '請輸入或選擇'}\n readOnly={readonly}\n searchDebounceTime={300}\n value={selectedOptions[0] ?? null}\n />\n );\n }\n\n if (field.type === 'radio') {\n return (\n <RadioGroup\n disabled={optionControlDisabled}\n name={field.fieldKey}\n onChange={(event): void =>\n onChange(field.fieldKey, event.target.value || undefined)\n }\n options={options}\n value={readStringValue(value)}\n />\n );\n }\n\n if (field.type === 'checkbox') {\n return (\n <CheckboxGroup\n disabled={optionControlDisabled}\n name={field.fieldKey}\n onChange={(event): void =>\n onChange(\n field.fieldKey,\n event.target.values.length ? event.target.values : undefined,\n )\n }\n options={options.map((option) => ({\n label: option.name,\n value: option.id,\n }))}\n value={[...readStringArrayValue(value)]}\n />\n );\n }\n\n if (readFormFieldSelectionMode(field) === 'multiple') {\n return (\n <Select\n disabled={optionControlDisabled}\n loading={loading}\n mode=\"multiple\"\n onChange={(nextOptions): void =>\n onChange(\n field.fieldKey,\n nextOptions.length\n ? nextOptions.map((option) => option.id)\n : undefined,\n )\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇一或多個選項'}\n readOnly={readonly}\n value={selectedOptions}\n />\n );\n }\n\n return (\n <Select\n disabled={optionControlDisabled}\n loading={loading}\n onChange={(nextOption): void =>\n onChange(field.fieldKey, nextOption?.id ?? undefined)\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇'}\n readOnly={readonly}\n value={selectedOptions[0] ?? null}\n />\n );\n}\n\nfunction readFieldColumnSpan(\n field: FormFieldDefinition,\n uiSchema: FormUiSchema,\n): number {\n const width =\n uiSchema.layout.find((item) => item.fieldKey === field.fieldKey)?.width ??\n 'FULL';\n const spans: Readonly<Record<typeof width, number>> = {\n FULL: 12,\n HALF: 6,\n THIRD: 4,\n };\n\n return spans[width];\n}\n\nfunction readStringValue(value: FormFieldValue | undefined): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction readStringArrayValue(\n value: FormFieldValue | undefined,\n): readonly string[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction readNumberInputValue(value: FormFieldValue | undefined): string {\n return typeof value === 'number' ? String(value) : '';\n}\n\nfunction readInputPlaceholder(type: FormFieldDefinition['type']): string {\n const placeholders: Readonly<Record<FormFieldDefinition['type'], string>> = {\n boolean: '',\n autocomplete: '請輸入或選擇',\n checkbox: '請選擇一或多個選項',\n date: '請選擇日期',\n datetime: '請選擇日期與時間',\n file_upload: '請上傳附件',\n money: '請輸入金額',\n number: '請輸入數字',\n radio: '請選擇一個選項',\n select: '請選擇一個選項',\n text: '請輸入文字',\n textarea: '請輸入多行文字',\n };\n\n return placeholders[type];\n}\n\nexport { FormRenderer as FormRendererView };\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use client";const e=require("./bpm-form-field-Bc6k4ZEO.cjs");let t=require("react"),n=require("@mezzanine-ui/react"),r=require("react/jsx-runtime"),i=require("@rytass/bpm-core-client/form"),a=require("@rytass/bpm-core-shared/form");var o={error:null,hasValue:!1,hasNextPage:!1,invalidValues:[],onReachBottom:()=>void 0,onSearch:()=>void 0,options:[],retry:()=>void 0,status:`IDLE`};function s(e){let n=(0,a.isFormDataSourceFieldDefinition)(e.field)?e.field:null,r=n?e.optionSnapshots?.[n.fieldKey]:void 0,s=JSON.stringify(r??null),c=(0,t.useMemo)(()=>r?.options??[],[s]),l=JSON.stringify(e.formData),d=JSON.stringify(e.initialFormData??{}),f=JSON.stringify(e.schema),p=JSON.stringify(e.uiSchema),m=e.context?.kind,h=e.context?.kind===`runtime`?e.context.instanceId:void 0,g=e.context?.kind===`runtime`?e.context.templateId:void 0,_=n?(0,i.readMissingFormDataSourceDependencies)(n,e.formData):[],v=JSON.stringify(_),y=n?JSON.stringify({bindings:n.dataSource.bindings.map(t=>t.from.kind===`FIELD`?{fieldKey:t.from.fieldKey,value:e.formData[t.from.fieldKey]}:{value:t.from.value}),value:e.initialFormData!==void 0||e.initialValue!==void 0?e.formData[n.fieldKey]:void 0}):``,b=(0,t.useMemo)(()=>{if(m===`preview`)return{kind:`preview`};if(m===`runtime`&&!e.readonly)return{instanceId:h,kind:`runtime`,templateId:g}},[h,m,g,e.readonly]),x=n?(e.initialFormData!==void 0||e.initialValue!==void 0)&&(0,i.readFormDataSourceValueSignature)(e.initialValue)!==(0,i.readFormDataSourceValueSignature)(e.formData[n.fieldKey]):!1,S=n?e.initialFormData!==void 0&&n.dataSource.bindings.some(t=>t.from.kind===`FIELD`?(0,i.readFormDataSourceValueSignature)(e.initialFormData?.[t.from.fieldKey])!==(0,i.readFormDataSourceValueSignature)(e.formData[t.from.fieldKey]):!1):!1,C=!!(r&&(x||S)),[w,T]=(0,t.useState)([]),[E,D]=(0,t.useState)(``),[O,k]=(0,t.useState)(null),[A,j]=(0,t.useState)(n&&r?C?`STALE`:`VALID`:`IDLE`),[M,N]=(0,t.useState)(null),P=(0,t.useRef)(0),F=(0,t.useRef)({cursor:null,searchText:``}),I=(0,t.useMemo)(()=>Object.entries(e.formData).reduce((e,[t,n])=>n===void 0?e:{...e,[t]:n},{}),[l]),L=(0,t.useMemo)(()=>(0,i.mergeFormDataSourceOptions)(c,w),[w,c]),R=(0,t.useMemo)(()=>(0,i.readMissingFormDataSourceOptionValues)(n?e.formData[n.fieldKey]:void 0,L),[n,e.formData,L]),z=u(n?e.formData[n.fieldKey]:void 0),B=(0,t.useCallback)((t,r)=>{if(!n||!b)return;if(_.length>0){j(`WAITING_FOR_DEPENDENCIES`),N(null);return}let a=P.current+1;P.current=a,F.current={cursor:r,searchText:t},j(C?`STALE`:`LOADING`),N(null),(b.kind===`preview`?(0,i.previewFormFieldOptions)({cursor:r,fieldKey:n.fieldKey,formData:I,schema:e.schema,searchText:t,uiSchema:e.uiSchema}):(0,i.readFormFieldOptions)({cursor:r,fieldKey:n.fieldKey,formData:I,instanceId:b.instanceId??null,searchText:t,templateId:b.templateId??null})).then(t=>{P.current===a&&(T(a=>(0,i.mergeFormDataSourceOptions)((0,i.readSelectedFormDataSourceOptions)(n?e.formData[n.fieldKey]:void 0,a),r?a:[],t.options)),k(t.nextCursor),j(`VALID`),N(null))}).catch(e=>{P.current===a&&(j(`UNAVAILABLE`),N((0,i.readFormDataSourceErrorMessage)(e)??(e instanceof Error?e.message:`選項來源暫時無法使用。`)))})},[n,b,C,_.length,I,f,p]),V=(0,t.useRef)(B);V.current=B,(0,t.useEffect)(()=>{if(P.current+=1,T(t=>(0,i.readSelectedFormDataSourceOptions)(n?e.formData[n.fieldKey]:void 0,t)),k(e=>e===null?e:null),D(e=>e&&``),N(e=>e&&null),!n){j(`IDLE`);return}if(_.length>0){j(`WAITING_FOR_DEPENDENCIES`);return}if(!b){j(r?C?`STALE`:`VALID`:e.readonly?`UNAVAILABLE`:`IDLE`);return}if(n.type===`autocomplete`){j(r?C?`STALE`:`VALID`:`IDLE`);return}V.current(``,null)},[n,b,y,d,e.readonly,C,v,s]);let H=(0,t.useCallback)(t=>{D(t),T(t=>(0,i.readSelectedFormDataSourceOptions)(n?e.formData[n.fieldKey]:void 0,t)),k(null),B(t,null)},[B]),U=(0,t.useCallback)(()=>{O&&B(E,O)},[B,O,E]),W=(0,t.useCallback)(()=>{B(F.current.searchText,F.current.cursor)},[B]);return n?{error:M,hasValue:z,hasNextPage:!!O,invalidValues:R,onReachBottom:U,onSearch:H,options:L,retry:W,status:A===`VALID`&&R.length?`INVALID`:A}:o}function c(e){switch(e.status){case`WAITING_FOR_DEPENDENCIES`:return`請先填寫相依欄位。`;case`STALE`:return`選項需要重新載入或驗證。`;case`INVALID`:return e.invalidValues.length?`無法辨識選項:${e.invalidValues.join(`、`)}`:`目前選項已失效,請重新選擇。`;case`UNAVAILABLE`:return e.error??`選項來源暫時無法使用。`;case`VALID`:return e.options.length?null:`目前沒有可用選項。`;default:return null}}function l(e){return e.hasValue&&e.status!==`VALID`}function u(e){return e==null?!1:typeof e==`string`?e.trim().length>0:Array.isArray(e)?e.length>0:!0}var d={alignItems:`start`,display:`grid`,gap:12,gridTemplateColumns:`repeat(12, minmax(0, 1fr))`},f={gridColumn:`1 / -1`},p={alignItems:`start`,display:`grid`,gap:8,minWidth:0},m={minWidth:`100%`,width:`100%`};function h(e){e&&(e.style.width=`100%`)}function g({dataSourceContext:e,dataSourceInitialValues:a,emptyText:o=`尚未建立欄位。`,errors:s={},maxWidth:c,onChange:l,onDataSourceStateChange:u,onUploadAttachment:m,optionSnapshots:h,readonly:g=!1,schema:v,singleColumn:y=!1,uiSchema:b,value:S}){let[C,w]=(0,t.useState)(()=>(0,i.buildFormRendererValues)(v.fields,S??{})),T=(0,t.useMemo)(()=>(0,i.buildFormRendererValues)(v.fields,S??C),[C,v.fields,S]),E=(0,t.useRef)(T),D=(0,t.useMemo)(()=>(0,i.readVisibleFormRendererFields)(v,b,T),[v,b,T]);(0,t.useEffect)(()=>{E.current=T},[T]),(0,t.useEffect)(()=>{w(e=>(0,i.buildFormRendererValues)(v.fields,S??e))},[v.fields,S]);function O(e,t){let n={...E.current,[e]:t};E.current=n,S||w(n),l?.(n)}return D.length?(0,r.jsx)(`div`,{style:{...d,...y?{maxWidth:c,width:`100%`}:{}},children:D.map(t=>(0,r.jsx)(_,{dataSourceContext:e,dataSourceInitialValues:a,field:t,error:s[t.fieldKey]??null,fields:v.fields,onChange:O,onDataSourceStateChange:u,onUploadAttachment:m,optionSnapshots:h,readonly:g,schema:v,style:{...p,gridColumn:`span ${y?12:x(t,b)}`},value:T[t.fieldKey],values:T,uiSchema:b},t.fieldKey))}):(0,r.jsx)(`div`,{style:d,children:(0,r.jsx)(n.Typography,{color:`text-neutral`,style:f,variant:`body`,children:v.fields.length>0?`目前條件下沒有可填寫欄位。`:o})})}function _({dataSourceContext:o,dataSourceInitialValues:l,error:u,field:d,fields:f,onChange:p,onDataSourceStateChange:m,onUploadAttachment:h,optionSnapshots:g,readonly:_,schema:b,style:x,value:S,values:C,uiSchema:w}){let T=(0,i.isFormRendererFieldRequired)(d,f,C),E=_||(0,i.isFormRendererFieldReadonly)(d,f,C),D=s({context:o,field:d,formData:C,initialFormData:l,initialValue:l?.[d.fieldKey],optionSnapshots:g,readonly:E,schema:b,uiSchema:w}),O=c(D);return(0,t.useEffect)(()=>{(0,a.isFormDataSourceFieldDefinition)(d)&&m?.(d.fieldKey,{hasValue:D.hasValue,invalidValues:D.invalidValues,status:D.status})},[JSON.stringify({hasValue:D.hasValue,invalidValues:D.invalidValues,status:D.status}),d.fieldKey,m]),(0,r.jsxs)(`div`,{"data-form-field-key":d.fieldKey,style:x,children:[(0,r.jsx)(e.t,{label:d.label,name:d.fieldKey,required:T,children:y(d,S,E,p,h,o,D)}),u?(0,r.jsx)(n.Typography,{color:`text-error`,variant:`caption`,children:u}):null,O?(0,r.jsxs)(`div`,{style:v,children:[(0,r.jsx)(n.Typography,{color:D.status===`INVALID`||D.status===`UNAVAILABLE`?`text-error`:`text-neutral`,variant:`caption`,children:O}),D.status===`UNAVAILABLE`?(0,r.jsx)(n.Button,{onClick:D.retry,size:`sub`,type:`button`,variant:`base-ghost`,children:`重試`}):null]}):null]})}var v={alignItems:`center`,display:`flex`,gap:8};function y(e,t,o,s,c,l,u){if(e.type===`textarea`)return(0,r.jsx)(n.Textarea,{onChange:t=>s(e.fieldKey,t.target.value),placeholder:e.placeholder??`請輸入多行文字`,readOnly:o,ref:h,rows:3,style:m,value:S(t)});if(e.type===`boolean`)return(0,r.jsx)(n.Toggle,{checked:t===!0,disabled:o,label:`啟用`,onChange:t=>s(e.fieldKey,t.target.checked)});if((0,a.isFormDataSourceFieldDefinition)(e))return b(e,t,o,s,l,u);if((0,a.isFormStaticOptionFieldDefinition)(e)&&e.type===`checkbox`){let a=e.options.map(i.readFieldOptionAsSelectOption);return(0,r.jsx)(n.Select,{mode:`multiple`,onChange:t=>s(e.fieldKey,t?.length?t.map(e=>e.id):void 0),options:a,placeholder:e.placeholder??`請選擇一或多個選項`,readOnly:o,value:a.filter(e=>C(t).includes(e.id))})}if((0,a.isFormStaticOptionFieldDefinition)(e)){let a=e.options.map(i.readFieldOptionAsSelectOption);return(0,r.jsx)(n.Select,{onChange:t=>s(e.fieldKey,t?.id??void 0),options:a,placeholder:e.placeholder??`請選擇`,readOnly:o,value:(0,i.readSelectOption)(a,S(t))})}return e.type===`file_upload`?(0,r.jsx)(n.Upload,{accept:e.acceptedMimeTypes?.join(`,`),disabled:o,maxFiles:e.maxFiles,mode:`button-list`,...(e.maxFiles??1)>1?{multiple:!0}:{},onChange:t=>s(e.fieldKey,t.length?t.map(e=>e.id):void 0),onUpload:async t=>Promise.all(t.map(async t=>({file:t,id:(c?await c(e,t):{id:`${t.name}-${t.lastModified}`}).id,progress:100,status:`done`}))),size:`sub`}):e.type===`date`?(0,r.jsx)(n.DatePicker,{format:`YYYY-MM-DD`,fullWidth:!0,onChange:t=>s(e.fieldKey,(0,i.formatDatePickerValue)(t)),placeholder:e.placeholder??T(e.type),readOnly:o,value:(0,i.readDatePickerValue)(t)}):e.type===`datetime`?(0,r.jsx)(n.DateTimePicker,{formatDate:`YYYY-MM-DD`,formatTime:`HH:mm`,fullWidth:!0,hideSecond:!0,onChange:t=>s(e.fieldKey,(0,i.formatDateTimePickerValue)(t)),placeholderLeft:`選擇日期`,placeholderRight:`選擇時間`,readOnly:o,value:(0,i.readDatePickerValue)(t)}):e.type===`number`||e.type===`money`?(0,r.jsx)(n.Input,{fullWidth:!0,max:e.maximum,min:e.minimum,onChange:t=>s(e.fieldKey,(0,i.clampOptionalNumber)((0,i.parseOptionalNumberInput)(t.target.value),{max:e.maximum,min:e.minimum})),placeholder:e.placeholder??T(e.type),...o?{readonly:!0}:{},showSpinner:!0,value:w(t),variant:`measure`}):(0,r.jsx)(n.Input,{fullWidth:!0,onChange:t=>s(e.fieldKey,t.target.value),placeholder:e.placeholder??T(e.type),...o?{readonly:!0}:{},value:S(t),variant:`base`})}function b(e,t,o,s,c,l){let u=l.options.map(i.readFieldOptionAsSelectOption),d=(0,i.readSelectedFormDataSourceOptions)(t,l.options).map(i.readFieldOptionAsSelectOption),f=l.status===`LOADING`,p=l.status===`WAITING_FOR_DEPENDENCIES`,m=!!c&&!o,h=o||p;return e.type===`autocomplete`?(0,a.readFormFieldSelectionMode)(e)===`multiple`?(0,r.jsx)(n.AutoComplete,{asyncData:m,clearSearchText:!0,disabled:h,disabledOptionsFilter:m,globalPortal:!0,loading:f,mode:`multiple`,onChange:t=>s(e.fieldKey,t.length?t.map(e=>e.id):void 0),onReachBottom:l.hasNextPage?l.onReachBottom:void 0,onSearch:m?l.onSearch:void 0,options:u,placeholder:e.placeholder??`請輸入或選擇`,readOnly:o,searchDebounceTime:300,value:d}):(0,r.jsx)(n.AutoComplete,{asyncData:m,clearSearchText:!0,disabled:h,disabledOptionsFilter:m,globalPortal:!0,loading:f,mode:`single`,onChange:t=>s(e.fieldKey,t?.id??void 0),onReachBottom:l.hasNextPage?l.onReachBottom:void 0,onSearch:m?l.onSearch:void 0,options:u,placeholder:e.placeholder??`請輸入或選擇`,readOnly:o,searchDebounceTime:300,value:d[0]??null}):e.type===`radio`?(0,r.jsx)(n.RadioGroup,{disabled:h,name:e.fieldKey,onChange:t=>s(e.fieldKey,t.target.value||void 0),options:u,value:S(t)}):e.type===`checkbox`?(0,r.jsx)(n.CheckboxGroup,{disabled:h,name:e.fieldKey,onChange:t=>s(e.fieldKey,t.target.values.length?t.target.values:void 0),options:u.map(e=>({label:e.name,value:e.id})),value:[...C(t)]}):(0,a.readFormFieldSelectionMode)(e)===`multiple`?(0,r.jsx)(n.Select,{disabled:h,loading:f,mode:`multiple`,onChange:t=>s(e.fieldKey,t.length?t.map(e=>e.id):void 0),onReachBottom:l.hasNextPage?l.onReachBottom:void 0,options:u,placeholder:e.placeholder??`請選擇一或多個選項`,readOnly:o,value:d}):(0,r.jsx)(n.Select,{disabled:h,loading:f,onChange:t=>s(e.fieldKey,t?.id??void 0),onReachBottom:l.hasNextPage?l.onReachBottom:void 0,options:u,placeholder:e.placeholder??`請選擇`,readOnly:o,value:d[0]??null})}function x(e,t){return{FULL:12,HALF:6,THIRD:4}[t.layout.find(t=>t.fieldKey===e.fieldKey)?.width??`FULL`]}function S(e){return typeof e==`string`?e:``}function C(e){return Array.isArray(e)?e:[]}function w(e){return typeof e==`number`?String(e):``}function T(e){return{boolean:``,autocomplete:`請輸入或選擇`,checkbox:`請選擇一或多個選項`,date:`請選擇日期`,datetime:`請選擇日期與時間`,file_upload:`請上傳附件`,money:`請輸入金額`,number:`請輸入數字`,radio:`請選擇一個選項`,select:`請選擇一個選項`,text:`請輸入文字`,textarea:`請輸入多行文字`}[e]}Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return g}});
2
- //# sourceMappingURL=FormRendererView-DNtNodNl.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FormRendererView-DNtNodNl.cjs","names":[],"sources":["../../src/views/forms/renderer/form-data-source-field.ts","../../src/views/forms/renderer/FormRendererView.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n FormDataSourceValueSnapshots,\n FormDefinitionSchema,\n FormFieldDefinition,\n FormFieldOption,\n FormFieldValue,\n FormUiSchema,\n isFormDataSourceFieldDefinition,\n} from '@rytass/bpm-core-shared/form';\nimport {\n FormDataSourceFieldStatus,\n FormRendererValues,\n mergeFormDataSourceOptions,\n readFormDataSourceErrorMessage,\n readMissingFormDataSourceOptionValues,\n previewFormFieldOptions,\n readFormDataSourceValueSignature,\n readMissingFormDataSourceDependencies,\n readSelectedFormDataSourceOptions,\n readFormFieldOptions,\n} from '@rytass/bpm-core-client/form';\n\nexport type FormRendererDataSourceContext =\n | { readonly kind: 'preview' }\n | {\n readonly instanceId?: string | null;\n readonly kind: 'runtime';\n readonly templateId?: string | null;\n };\n\nexport interface FormDataSourceFieldState {\n readonly error: string | null;\n readonly hasValue: boolean;\n readonly hasNextPage: boolean;\n readonly invalidValues: readonly string[];\n readonly onReachBottom: () => void;\n readonly onSearch: (searchText: string) => void;\n readonly options: readonly FormFieldOption[];\n readonly retry: () => void;\n readonly status: FormDataSourceFieldStatus;\n}\n\nexport interface UseFormDataSourceFieldInput {\n readonly context?: FormRendererDataSourceContext;\n readonly field: FormFieldDefinition;\n readonly formData: FormRendererValues;\n readonly initialFormData?: FormRendererValues;\n readonly initialValue?: FormFieldValue | undefined;\n readonly optionSnapshots?: FormDataSourceValueSnapshots;\n readonly readonly: boolean;\n readonly schema: FormDefinitionSchema;\n readonly uiSchema: FormUiSchema;\n}\n\nconst EMPTY_FIELD_STATE: FormDataSourceFieldState = {\n error: null,\n hasValue: false,\n hasNextPage: false,\n invalidValues: [],\n onReachBottom: (): void => undefined,\n onSearch: (): void => undefined,\n options: [],\n retry: (): void => undefined,\n status: 'IDLE',\n};\n\nexport function useFormDataSourceField(\n input: UseFormDataSourceFieldInput,\n): FormDataSourceFieldState {\n const dynamicField = isFormDataSourceFieldDefinition(input.field)\n ? input.field\n : null;\n const snapshot = dynamicField\n ? input.optionSnapshots?.[dynamicField.fieldKey]\n : undefined;\n const snapshotSignature = JSON.stringify(snapshot ?? null);\n const snapshotOptions = useMemo(\n (): readonly FormFieldOption[] => snapshot?.options ?? [],\n [snapshotSignature],\n );\n const formDataSignature = JSON.stringify(input.formData);\n const initialFormDataSignature = JSON.stringify(input.initialFormData ?? {});\n const schemaSignature = JSON.stringify(input.schema);\n const uiSchemaSignature = JSON.stringify(input.uiSchema);\n const contextKind = input.context?.kind;\n const contextInstanceId =\n input.context?.kind === 'runtime' ? input.context.instanceId : undefined;\n const contextTemplateId =\n input.context?.kind === 'runtime' ? input.context.templateId : undefined;\n const missingDependencies = dynamicField\n ? readMissingFormDataSourceDependencies(dynamicField, input.formData)\n : [];\n const missingDependenciesSignature = JSON.stringify(missingDependencies);\n const dataSourceRefreshSignature = dynamicField\n ? JSON.stringify({\n bindings: dynamicField.dataSource.bindings.map((binding) =>\n binding.from.kind === 'FIELD'\n ? {\n fieldKey: binding.from.fieldKey,\n value: input.formData[binding.from.fieldKey],\n }\n : { value: binding.from.value },\n ),\n value:\n typeof input.initialFormData !== 'undefined' ||\n typeof input.initialValue !== 'undefined'\n ? input.formData[dynamicField.fieldKey]\n : undefined,\n })\n : '';\n const effectiveContext = useMemo(\n (): FormRendererDataSourceContext | undefined => {\n if (contextKind === 'preview') {\n return { kind: 'preview' };\n }\n\n if (contextKind === 'runtime' && !input.readonly) {\n return {\n instanceId: contextInstanceId,\n kind: 'runtime',\n templateId: contextTemplateId,\n };\n }\n\n return undefined;\n },\n [\n contextInstanceId,\n contextKind,\n contextTemplateId,\n input.readonly,\n ],\n );\n const valueChanged = dynamicField\n ? (typeof input.initialFormData !== 'undefined' ||\n typeof input.initialValue !== 'undefined') &&\n readFormDataSourceValueSignature(input.initialValue) !==\n readFormDataSourceValueSignature(input.formData[dynamicField.fieldKey])\n : false;\n const bindingsChanged = dynamicField\n ? typeof input.initialFormData !== 'undefined' &&\n dynamicField.dataSource.bindings.some((binding) => {\n if (binding.from.kind !== 'FIELD') {\n return false;\n }\n\n return (\n readFormDataSourceValueSignature(\n input.initialFormData?.[binding.from.fieldKey],\n ) !==\n readFormDataSourceValueSignature(input.formData[binding.from.fieldKey])\n );\n })\n : false;\n const isStale = Boolean(snapshot && (valueChanged || bindingsChanged));\n const [remoteOptions, setRemoteOptions] = useState<readonly FormFieldOption[]>(\n [],\n );\n const [searchText, setSearchText] = useState('');\n const [nextCursor, setNextCursor] = useState<string | null>(null);\n const [status, setStatus] = useState<FormDataSourceFieldStatus>(\n dynamicField ? (snapshot ? (isStale ? 'STALE' : 'VALID') : 'IDLE') : 'IDLE',\n );\n const [error, setError] = useState<string | null>(null);\n const requestSequence = useRef(0);\n const lastRequest = useRef<{ readonly cursor: string | null; readonly searchText: string }>({\n cursor: null,\n searchText: '',\n });\n\n const queryFormData = useMemo(\n (): Readonly<Record<string, FormFieldValue>> =>\n Object.entries(input.formData).reduce<\n Readonly<Record<string, FormFieldValue>>\n >((values, [key, value]) => {\n if (typeof value === 'undefined') {\n return values;\n }\n\n return { ...values, [key]: value };\n }, {}),\n [formDataSignature],\n );\n const mergedOptions = useMemo(\n (): readonly FormFieldOption[] =>\n mergeFormDataSourceOptions(snapshotOptions, remoteOptions),\n [remoteOptions, snapshotOptions],\n );\n const invalidValues = useMemo(\n (): readonly string[] =>\n readMissingFormDataSourceOptionValues(\n dynamicField ? input.formData[dynamicField.fieldKey] : undefined,\n mergedOptions,\n ),\n [dynamicField, input.formData, mergedOptions],\n );\n const hasValue = readFormDataSourceValuePresent(\n dynamicField ? input.formData[dynamicField.fieldKey] : undefined,\n );\n\n const loadOptions = useCallback(\n (nextSearchTextToLoad: string, cursor: string | null): void => {\n if (!dynamicField || !effectiveContext) {\n return;\n }\n\n if (missingDependencies.length > 0) {\n setStatus('WAITING_FOR_DEPENDENCIES');\n setError(null);\n\n return;\n }\n\n const requestId = requestSequence.current + 1;\n requestSequence.current = requestId;\n lastRequest.current = {\n cursor,\n searchText: nextSearchTextToLoad,\n };\n setStatus(isStale ? 'STALE' : 'LOADING');\n setError(null);\n\n const request =\n effectiveContext.kind === 'preview'\n ? previewFormFieldOptions({\n cursor,\n fieldKey: dynamicField.fieldKey,\n formData: queryFormData,\n schema: input.schema,\n searchText: nextSearchTextToLoad,\n uiSchema: input.uiSchema,\n })\n : readFormFieldOptions({\n cursor,\n fieldKey: dynamicField.fieldKey,\n formData: queryFormData,\n instanceId: effectiveContext.instanceId ?? null,\n searchText: nextSearchTextToLoad,\n templateId: effectiveContext.templateId ?? null,\n });\n\n void request\n .then((result): void => {\n if (requestSequence.current !== requestId) {\n return;\n }\n\n setRemoteOptions((currentOptions) => {\n const currentValue = dynamicField\n ? input.formData[dynamicField.fieldKey]\n : undefined;\n const selectedOptions = readSelectedFormDataSourceOptions(\n currentValue,\n currentOptions,\n );\n\n return mergeFormDataSourceOptions(\n selectedOptions,\n cursor ? currentOptions : [],\n result.options,\n );\n });\n setNextCursor(result.nextCursor);\n setStatus('VALID');\n setError(null);\n })\n .catch((requestError: unknown): void => {\n if (requestSequence.current !== requestId) {\n return;\n }\n\n setStatus('UNAVAILABLE');\n // The backend answers with stable codes rather than prose, so show\n // the mapped copy instead of a raw `FORM_DATA_SOURCE_*` string.\n setError(\n readFormDataSourceErrorMessage(requestError) ??\n (requestError instanceof Error\n ? requestError.message\n : '選項來源暫時無法使用。'),\n );\n });\n },\n [\n dynamicField,\n effectiveContext,\n isStale,\n missingDependencies.length,\n queryFormData,\n schemaSignature,\n uiSchemaSignature,\n ],\n );\n const loadOptionsRef = useRef(loadOptions);\n loadOptionsRef.current = loadOptions;\n\n useEffect((): void => {\n requestSequence.current += 1;\n setRemoteOptions((currentOptions) => {\n const currentValue = dynamicField\n ? input.formData[dynamicField.fieldKey]\n : undefined;\n\n return readSelectedFormDataSourceOptions(currentValue, currentOptions);\n });\n setNextCursor((currentCursor) =>\n currentCursor === null ? currentCursor : null,\n );\n setSearchText((currentSearchText) =>\n currentSearchText ? '' : currentSearchText,\n );\n setError((currentError) => (currentError ? null : currentError));\n\n if (!dynamicField) {\n setStatus('IDLE');\n\n return;\n }\n\n if (missingDependencies.length > 0) {\n setStatus('WAITING_FOR_DEPENDENCIES');\n\n return;\n }\n\n if (!effectiveContext) {\n setStatus(\n snapshot\n ? isStale\n ? 'STALE'\n : 'VALID'\n : input.readonly\n ? 'UNAVAILABLE'\n : 'IDLE',\n );\n\n return;\n }\n\n if (dynamicField.type === 'autocomplete') {\n setStatus(snapshot ? (isStale ? 'STALE' : 'VALID') : 'IDLE');\n\n return;\n }\n\n loadOptionsRef.current('', null);\n }, [\n dynamicField,\n effectiveContext,\n dataSourceRefreshSignature,\n initialFormDataSignature,\n input.readonly,\n isStale,\n missingDependenciesSignature,\n snapshotSignature,\n ]);\n\n const onSearch = useCallback(\n (nextSearchTextToLoad: string): void => {\n setSearchText(nextSearchTextToLoad);\n setRemoteOptions((currentOptions) => {\n const currentValue = dynamicField\n ? input.formData[dynamicField.fieldKey]\n : undefined;\n\n return readSelectedFormDataSourceOptions(currentValue, currentOptions);\n });\n setNextCursor(null);\n loadOptions(nextSearchTextToLoad, null);\n },\n [loadOptions],\n );\n const onReachBottom = useCallback((): void => {\n if (nextCursor) {\n loadOptions(searchText, nextCursor);\n }\n }, [loadOptions, nextCursor, searchText]);\n const retry = useCallback((): void => {\n loadOptions(lastRequest.current.searchText, lastRequest.current.cursor);\n }, [loadOptions]);\n\n if (!dynamicField) {\n return EMPTY_FIELD_STATE;\n }\n\n return {\n error,\n hasValue,\n hasNextPage: Boolean(nextCursor),\n invalidValues,\n onReachBottom,\n onSearch,\n options: mergedOptions,\n retry,\n status: status === 'VALID' && invalidValues.length ? 'INVALID' : status,\n };\n}\n\nexport function readFormDataSourceFieldStatusMessage(\n state: FormDataSourceFieldState,\n): string | null {\n switch (state.status) {\n case 'WAITING_FOR_DEPENDENCIES':\n return '請先填寫相依欄位。';\n case 'STALE':\n return '選項需要重新載入或驗證。';\n case 'INVALID':\n return state.invalidValues.length\n ? `無法辨識選項:${state.invalidValues.join('、')}`\n : '目前選項已失效,請重新選擇。';\n case 'UNAVAILABLE':\n return state.error ?? '選項來源暫時無法使用。';\n case 'VALID':\n return state.options.length ? null : '目前沒有可用選項。';\n default:\n return null;\n }\n}\n\nexport function isFormDataSourceFieldSubmissionBlocked(\n state: Pick<FormDataSourceFieldState, 'hasValue' | 'status'>,\n): boolean {\n return state.hasValue && state.status !== 'VALID';\n}\n\nfunction readFormDataSourceValuePresent(\n value: FormFieldValue | undefined,\n): boolean {\n if (typeof value === 'undefined' || value === null) {\n return false;\n }\n\n if (typeof value === 'string') {\n return value.trim().length > 0;\n }\n\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n\n return true;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n ReactElement,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Button,\n CheckboxGroup,\n DatePicker,\n DateTimePicker,\n Input,\n RadioGroup,\n Select,\n Textarea,\n Toggle,\n Typography,\n Upload,\n} from '@mezzanine-ui/react';\nimport type { UploadFile } from '@mezzanine-ui/react/Upload';\nimport {\n FormDataSourceOptionFieldDefinition,\n FormDataSourceValueSnapshots,\n FormDefinitionSchema,\n FormFieldDefinition,\n FormFieldValue,\n FormUiSchema,\n isFormDataSourceFieldDefinition,\n isFormStaticOptionFieldDefinition,\n readFormFieldSelectionMode,\n} from '@rytass/bpm-core-shared/form';\nimport {\n buildFormRendererValues,\n clampOptionalNumber,\n formatDatePickerValue,\n formatDateTimePickerValue,\n FormRendererValues,\n isFormRendererFieldReadonly,\n isFormRendererFieldRequired,\n parseOptionalNumberInput,\n readDatePickerValue,\n readFieldOptionAsSelectOption,\n readSelectedFormDataSourceOptions,\n readSelectOption,\n readVisibleFormRendererFields,\n} from '@rytass/bpm-core-client/form';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport {\n FormDataSourceFieldState,\n FormRendererDataSourceContext,\n readFormDataSourceFieldStatusMessage,\n useFormDataSourceField,\n} from './form-data-source-field';\n\nexport interface FormRendererProps {\n readonly dataSourceContext?: FormRendererDataSourceContext;\n readonly dataSourceInitialValues?: FormRendererValues;\n readonly emptyText?: string;\n readonly errors?: Readonly<Record<string, string>>;\n readonly maxWidth?: CSSProperties['maxWidth'];\n readonly onChange?: (values: FormRendererValues) => void;\n readonly onDataSourceStateChange?: (\n fieldKey: string,\n state: Pick<\n FormDataSourceFieldState,\n 'hasValue' | 'invalidValues' | 'status'\n >,\n ) => void;\n readonly onUploadAttachment?: (\n field: FormFieldDefinition,\n file: File,\n ) => Promise<{ readonly id: string }>;\n readonly optionSnapshots?: FormDataSourceValueSnapshots;\n readonly readonly?: boolean;\n readonly schema: FormDefinitionSchema;\n readonly singleColumn?: boolean;\n readonly uiSchema: FormUiSchema;\n readonly value?: FormRendererValues;\n}\n\nconst FORM_RENDERER_GRID_STYLE: CSSProperties = {\n alignItems: 'start',\n display: 'grid',\n gap: 12,\n gridTemplateColumns: 'repeat(12, minmax(0, 1fr))',\n};\n\nconst FORM_RENDERER_EMPTY_STYLE: CSSProperties = {\n gridColumn: '1 / -1',\n};\n\nconst FORM_RENDERER_FIELD_STYLE: CSSProperties = {\n alignItems: 'start',\n display: 'grid',\n gap: 8,\n minWidth: 0,\n};\n\nconst TEXTAREA_STYLE: CSSProperties = {\n minWidth: '100%',\n width: '100%',\n};\n\nfunction applyFullWidthTextareaHost(element: HTMLDivElement | null): void {\n if (!element) {\n return;\n }\n\n element.style.width = '100%';\n}\n\nexport function FormRenderer({\n dataSourceContext,\n dataSourceInitialValues,\n emptyText = '尚未建立欄位。',\n errors = {},\n maxWidth,\n onChange,\n onDataSourceStateChange,\n onUploadAttachment,\n optionSnapshots,\n readonly = false,\n schema,\n singleColumn = false,\n uiSchema,\n value,\n}: FormRendererProps): ReactElement {\n const [internalValues, setInternalValues] = useState<FormRendererValues>(() =>\n buildFormRendererValues(schema.fields, value ?? {}),\n );\n const values = useMemo(\n (): FormRendererValues =>\n buildFormRendererValues(schema.fields, value ?? internalValues),\n [internalValues, schema.fields, value],\n );\n const valuesRef = useRef<FormRendererValues>(values);\n const visibleFields = useMemo(\n (): readonly FormFieldDefinition[] =>\n readVisibleFormRendererFields(schema, uiSchema, values),\n [schema, uiSchema, values],\n );\n\n useEffect((): void => {\n valuesRef.current = values;\n }, [values]);\n\n useEffect((): void => {\n setInternalValues((currentValues) =>\n buildFormRendererValues(schema.fields, value ?? currentValues),\n );\n }, [schema.fields, value]);\n\n function updateValue(\n fieldKey: string,\n nextValue: FormFieldValue | undefined,\n ): void {\n const nextValues = {\n ...valuesRef.current,\n [fieldKey]: nextValue,\n };\n valuesRef.current = nextValues;\n\n if (!value) {\n setInternalValues(nextValues);\n }\n\n onChange?.(nextValues);\n }\n\n if (!visibleFields.length) {\n return (\n <div style={FORM_RENDERER_GRID_STYLE}>\n <Typography\n color=\"text-neutral\"\n style={FORM_RENDERER_EMPTY_STYLE}\n variant=\"body\"\n >\n {schema.fields.length > 0 ? '目前條件下沒有可填寫欄位。' : emptyText}\n </Typography>\n </div>\n );\n }\n\n return (\n <div\n style={{\n ...FORM_RENDERER_GRID_STYLE,\n ...(singleColumn ? { maxWidth, width: '100%' } : {}),\n }}\n >\n {visibleFields.map((field) => (\n <FormRendererField\n dataSourceContext={dataSourceContext}\n dataSourceInitialValues={dataSourceInitialValues}\n field={field}\n error={errors[field.fieldKey] ?? null}\n fields={schema.fields}\n key={field.fieldKey}\n onChange={updateValue}\n onDataSourceStateChange={onDataSourceStateChange}\n onUploadAttachment={onUploadAttachment}\n optionSnapshots={optionSnapshots}\n readonly={readonly}\n schema={schema}\n style={{\n ...FORM_RENDERER_FIELD_STYLE,\n gridColumn: `span ${\n singleColumn ? 12 : readFieldColumnSpan(field, uiSchema)\n }`,\n }}\n value={values[field.fieldKey]}\n values={values}\n uiSchema={uiSchema}\n />\n ))}\n </div>\n );\n}\n\nfunction FormRendererField({\n dataSourceContext,\n dataSourceInitialValues,\n error,\n field,\n fields,\n onChange,\n onDataSourceStateChange,\n onUploadAttachment,\n optionSnapshots,\n readonly,\n schema,\n style,\n value,\n values,\n uiSchema,\n}: {\n readonly dataSourceContext?: FormRendererDataSourceContext;\n readonly dataSourceInitialValues?: FormRendererValues;\n readonly error: string | null;\n readonly field: FormFieldDefinition;\n readonly fields: readonly FormFieldDefinition[];\n readonly onChange: (\n fieldKey: string,\n value: FormFieldValue | undefined,\n ) => void;\n readonly onDataSourceStateChange?: (\n fieldKey: string,\n state: Pick<\n FormDataSourceFieldState,\n 'hasValue' | 'invalidValues' | 'status'\n >,\n ) => void;\n readonly onUploadAttachment?:\n | ((\n field: FormFieldDefinition,\n file: File,\n ) => Promise<{ readonly id: string }>)\n | undefined;\n readonly optionSnapshots?: FormDataSourceValueSnapshots;\n readonly readonly: boolean;\n readonly schema: FormDefinitionSchema;\n readonly style: CSSProperties;\n readonly uiSchema: FormUiSchema;\n readonly value: FormFieldValue | undefined;\n readonly values: FormRendererValues;\n}): ReactElement {\n const required = isFormRendererFieldRequired(field, fields, values);\n const fieldReadonly =\n readonly || isFormRendererFieldReadonly(field, fields, values);\n const dataSourceState = useFormDataSourceField({\n context: dataSourceContext,\n field,\n formData: values,\n initialFormData: dataSourceInitialValues,\n initialValue: dataSourceInitialValues?.[field.fieldKey],\n optionSnapshots,\n readonly: fieldReadonly,\n schema,\n uiSchema,\n });\n const dataSourceStatusMessage = readFormDataSourceFieldStatusMessage(\n dataSourceState,\n );\n const dataSourceStateSignature = JSON.stringify({\n hasValue: dataSourceState.hasValue,\n invalidValues: dataSourceState.invalidValues,\n status: dataSourceState.status,\n });\n\n useEffect((): void => {\n if (!isFormDataSourceFieldDefinition(field)) {\n return;\n }\n\n onDataSourceStateChange?.(field.fieldKey, {\n hasValue: dataSourceState.hasValue,\n invalidValues: dataSourceState.invalidValues,\n status: dataSourceState.status,\n });\n }, [\n dataSourceStateSignature,\n field.fieldKey,\n onDataSourceStateChange,\n ]);\n\n return (\n <div data-form-field-key={field.fieldKey} style={style}>\n <BPMFormField\n label={field.label}\n name={field.fieldKey}\n required={required}\n >\n {renderControl(\n field,\n value,\n fieldReadonly,\n onChange,\n onUploadAttachment,\n dataSourceContext,\n dataSourceState,\n )}\n </BPMFormField>\n {error ? (\n <Typography color=\"text-error\" variant=\"caption\">\n {error}\n </Typography>\n ) : null}\n {dataSourceStatusMessage ? (\n <div style={DATA_SOURCE_FEEDBACK_STYLE}>\n <Typography\n color={\n dataSourceState.status === 'INVALID' ||\n dataSourceState.status === 'UNAVAILABLE'\n ? 'text-error'\n : 'text-neutral'\n }\n variant=\"caption\"\n >\n {dataSourceStatusMessage}\n </Typography>\n {dataSourceState.status === 'UNAVAILABLE' ? (\n <Button\n onClick={dataSourceState.retry}\n size=\"sub\"\n type=\"button\"\n variant=\"base-ghost\"\n >\n 重試\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nconst DATA_SOURCE_FEEDBACK_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'flex',\n gap: 8,\n};\n\nfunction renderControl(\n field: FormFieldDefinition,\n value: FormFieldValue | undefined,\n readonly: boolean,\n onChange: (fieldKey: string, value: FormFieldValue | undefined) => void,\n onUploadAttachment:\n | ((\n field: FormFieldDefinition,\n file: File,\n ) => Promise<{ readonly id: string }>)\n | undefined,\n dataSourceContext: FormRendererDataSourceContext | undefined,\n dataSourceState: FormDataSourceFieldState,\n): ReactElement {\n if (field.type === 'textarea') {\n return (\n <Textarea\n onChange={(event: ChangeEvent<HTMLTextAreaElement>): void =>\n onChange(field.fieldKey, event.target.value)\n }\n placeholder={field.placeholder ?? '請輸入多行文字'}\n readOnly={readonly}\n ref={applyFullWidthTextareaHost}\n rows={3}\n style={TEXTAREA_STYLE}\n value={readStringValue(value)}\n />\n );\n }\n\n if (field.type === 'boolean') {\n return (\n <Toggle\n checked={value === true}\n disabled={readonly}\n label=\"啟用\"\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(field.fieldKey, event.target.checked)\n }\n />\n );\n }\n\n if (isFormDataSourceFieldDefinition(field)) {\n return renderDynamicOptionControl(\n field,\n value,\n readonly,\n onChange,\n dataSourceContext,\n dataSourceState,\n );\n }\n\n if (isFormStaticOptionFieldDefinition(field) && field.type === 'checkbox') {\n const options = field.options.map(readFieldOptionAsSelectOption);\n\n return (\n <Select\n mode=\"multiple\"\n onChange={(options): void =>\n onChange(\n field.fieldKey,\n options?.length\n ? options.map((option) => option.id)\n : undefined,\n )\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇一或多個選項'}\n readOnly={readonly}\n value={options.filter((option) =>\n readStringArrayValue(value).includes(option.id),\n )}\n />\n );\n }\n\n if (isFormStaticOptionFieldDefinition(field)) {\n const options = field.options.map(readFieldOptionAsSelectOption);\n\n return (\n <Select\n onChange={(option): void =>\n onChange(field.fieldKey, option?.id ?? undefined)\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇'}\n readOnly={readonly}\n value={readSelectOption(options, readStringValue(value))}\n />\n );\n }\n\n if (field.type === 'file_upload') {\n return (\n <Upload\n accept={field.acceptedMimeTypes?.join(',')}\n disabled={readonly}\n maxFiles={field.maxFiles}\n mode=\"button-list\"\n {...((field.maxFiles ?? 1) > 1 ? { multiple: true } : {})}\n onChange={(files): void =>\n onChange(\n field.fieldKey,\n files.length ? files.map((file) => file.id) : undefined,\n )\n }\n onUpload={async (files): Promise<UploadFile[]> =>\n Promise.all(\n files.map(async (file): Promise<UploadFile> => {\n const uploadedFile = onUploadAttachment\n ? await onUploadAttachment(field, file)\n : { id: `${file.name}-${file.lastModified}` };\n\n return {\n file,\n id: uploadedFile.id,\n progress: 100,\n status: 'done',\n };\n }),\n )\n }\n size=\"sub\"\n />\n );\n }\n\n if (field.type === 'date') {\n return (\n <DatePicker\n format=\"YYYY-MM-DD\"\n fullWidth\n onChange={(nextValue): void =>\n onChange(field.fieldKey, formatDatePickerValue(nextValue))\n }\n placeholder={field.placeholder ?? readInputPlaceholder(field.type)}\n readOnly={readonly}\n value={readDatePickerValue(value)}\n />\n );\n }\n\n if (field.type === 'datetime') {\n return (\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n onChange(field.fieldKey, formatDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"選擇日期\"\n placeholderRight=\"選擇時間\"\n readOnly={readonly}\n value={readDatePickerValue(value)}\n />\n );\n }\n\n if (field.type === 'number' || field.type === 'money') {\n return (\n <Input\n fullWidth\n max={field.maximum}\n min={field.minimum}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(\n field.fieldKey,\n clampOptionalNumber(parseOptionalNumberInput(event.target.value), {\n max: field.maximum,\n min: field.minimum,\n }),\n )\n }\n placeholder={field.placeholder ?? readInputPlaceholder(field.type)}\n {...(readonly ? { readonly: true as const } : {})}\n showSpinner\n value={readNumberInputValue(value)}\n variant=\"measure\"\n />\n );\n }\n\n return (\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(field.fieldKey, event.target.value)\n }\n placeholder={field.placeholder ?? readInputPlaceholder(field.type)}\n {...(readonly ? { readonly: true as const } : {})}\n value={readStringValue(value)}\n variant=\"base\"\n />\n );\n}\n\nfunction renderDynamicOptionControl(\n field: FormDataSourceOptionFieldDefinition,\n value: FormFieldValue | undefined,\n readonly: boolean,\n onChange: (fieldKey: string, value: FormFieldValue | undefined) => void,\n dataSourceContext: FormRendererDataSourceContext | undefined,\n dataSourceState: FormDataSourceFieldState,\n): ReactElement {\n const options = dataSourceState.options.map(readFieldOptionAsSelectOption);\n const selectedOptions = readSelectedFormDataSourceOptions(\n value,\n dataSourceState.options,\n ).map(readFieldOptionAsSelectOption);\n const loading = dataSourceState.status === 'LOADING';\n const waitingForDependencies =\n dataSourceState.status === 'WAITING_FOR_DEPENDENCIES';\n const interactiveSearch = Boolean(dataSourceContext) && !readonly;\n const optionControlDisabled = readonly || waitingForDependencies;\n\n if (field.type === 'autocomplete') {\n if (readFormFieldSelectionMode(field) === 'multiple') {\n return (\n <AutoComplete\n asyncData={interactiveSearch}\n clearSearchText\n disabled={optionControlDisabled}\n disabledOptionsFilter={interactiveSearch}\n globalPortal\n loading={loading}\n mode=\"multiple\"\n onChange={(nextOptions): void =>\n onChange(\n field.fieldKey,\n nextOptions.length\n ? nextOptions.map((option) => option.id)\n : undefined,\n )\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n onSearch={interactiveSearch ? dataSourceState.onSearch : undefined}\n options={options}\n placeholder={field.placeholder ?? '請輸入或選擇'}\n readOnly={readonly}\n searchDebounceTime={300}\n value={selectedOptions}\n />\n );\n }\n\n return (\n <AutoComplete\n asyncData={interactiveSearch}\n clearSearchText\n disabled={optionControlDisabled}\n disabledOptionsFilter={interactiveSearch}\n globalPortal\n loading={loading}\n mode=\"single\"\n onChange={(nextOption): void =>\n onChange(field.fieldKey, nextOption?.id ?? undefined)\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n onSearch={interactiveSearch ? dataSourceState.onSearch : undefined}\n options={options}\n placeholder={field.placeholder ?? '請輸入或選擇'}\n readOnly={readonly}\n searchDebounceTime={300}\n value={selectedOptions[0] ?? null}\n />\n );\n }\n\n if (field.type === 'radio') {\n return (\n <RadioGroup\n disabled={optionControlDisabled}\n name={field.fieldKey}\n onChange={(event): void =>\n onChange(field.fieldKey, event.target.value || undefined)\n }\n options={options}\n value={readStringValue(value)}\n />\n );\n }\n\n if (field.type === 'checkbox') {\n return (\n <CheckboxGroup\n disabled={optionControlDisabled}\n name={field.fieldKey}\n onChange={(event): void =>\n onChange(\n field.fieldKey,\n event.target.values.length ? event.target.values : undefined,\n )\n }\n options={options.map((option) => ({\n label: option.name,\n value: option.id,\n }))}\n value={[...readStringArrayValue(value)]}\n />\n );\n }\n\n if (readFormFieldSelectionMode(field) === 'multiple') {\n return (\n <Select\n disabled={optionControlDisabled}\n loading={loading}\n mode=\"multiple\"\n onChange={(nextOptions): void =>\n onChange(\n field.fieldKey,\n nextOptions.length\n ? nextOptions.map((option) => option.id)\n : undefined,\n )\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇一或多個選項'}\n readOnly={readonly}\n value={selectedOptions}\n />\n );\n }\n\n return (\n <Select\n disabled={optionControlDisabled}\n loading={loading}\n onChange={(nextOption): void =>\n onChange(field.fieldKey, nextOption?.id ?? undefined)\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇'}\n readOnly={readonly}\n value={selectedOptions[0] ?? null}\n />\n );\n}\n\nfunction readFieldColumnSpan(\n field: FormFieldDefinition,\n uiSchema: FormUiSchema,\n): number {\n const width =\n uiSchema.layout.find((item) => item.fieldKey === field.fieldKey)?.width ??\n 'FULL';\n const spans: Readonly<Record<typeof width, number>> = {\n FULL: 12,\n HALF: 6,\n THIRD: 4,\n };\n\n return spans[width];\n}\n\nfunction readStringValue(value: FormFieldValue | undefined): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction readStringArrayValue(\n value: FormFieldValue | undefined,\n): readonly string[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction readNumberInputValue(value: FormFieldValue | undefined): string {\n return typeof value === 'number' ? String(value) : '';\n}\n\nfunction readInputPlaceholder(type: FormFieldDefinition['type']): string {\n const placeholders: Readonly<Record<FormFieldDefinition['type'], string>> = {\n boolean: '',\n autocomplete: '請輸入或選擇',\n checkbox: '請選擇一或多個選項',\n date: '請選擇日期',\n datetime: '請選擇日期與時間',\n file_upload: '請上傳附件',\n money: '請輸入金額',\n number: '請輸入數字',\n radio: '請選擇一個選項',\n select: '請選擇一個選項',\n text: '請輸入文字',\n textarea: '請輸入多行文字',\n };\n\n return placeholders[type];\n}\n\nexport { FormRenderer as FormRendererView };\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use client";require('../approval-instance-list-page.css');const e=require("./chunk-CMqjfN_6.cjs"),t=require("./router-adapter--gYs13E8.cjs"),n=require("./format-date-time-XxBzF0F5.cjs"),r=require("./routes-config-fDVHmvXi.cjs");let i=require("react"),a=require("@mezzanine-ui/react"),o=require("@rytass/bpm-core-client"),s=require("react/jsx-runtime"),c=require("@rytass/bpm-core-client/workflow"),l=require("@mezzanine-ui/core/form"),u=require("@mezzanine-ui/react/ContentHeader");u=e.t(u,1);var d={instanceFilterArea:`bpm_instanceFilterArea_qpvJq`},f=[10,20,50],p=[{id:`ALL`,name:`全部狀態`,state:null},{id:`RUNNING`,name:`進行中`,state:`RUNNING`},{id:`APPROVED`,name:`已通過`,state:`APPROVED`},{id:`REJECTED`,name:`已拒絕`,state:`REJECTED`},{id:`RETURNED`,name:`已退回`,state:`RETURNED`},{id:`CANCELLED`,name:`已取消`,state:`CANCELLED`},{id:`EXPIRED`,name:`已逾期`,state:`EXPIRED`},{id:`DRAFT`,name:`草稿`,state:`DRAFT`}];function m({defaultState:e,description:m,emptyMessage:y,searchPlaceholder:b,title:w,view:T}){let E=t.r(),D=r.r(),[O,k]=(0,i.useState)(null),[A,j]=(0,i.useState)(new Map),[M,N]=(0,i.useState)(1),[P,F]=(0,i.useState)(10),[I,L]=(0,i.useState)(0),[R,z]=(0,i.useState)(!0),[B,V]=(0,i.useState)([]),[H,U]=(0,i.useState)(``),[W,G]=(0,i.useState)(_(e)),K=(0,i.useRef)(0),q=(0,i.useCallback)(async()=>{let e=K.current+1;K.current=e,z(!0),k(null);try{let t=await(0,c.listApprovalInstancesPage)({page:M,pageSize:P,searchText:H,state:W.state,templateId:null,view:T});if(e!==K.current)return;V(t.instances.map(h)),L(t.totalCount)}catch(t){e===K.current&&k(C(t))}finally{e===K.current&&z(!1)}},[M,P,H,W,T]);(0,i.useEffect)(()=>{q()},[q]),(0,i.useEffect)(()=>{let e=Array.from(new Set(B.map(e=>e.initiatorMemberId).filter(Boolean)));if(e.length===0){j(new Map);return}let t=!1;return(async()=>{try{let n=await(0,o.resolveMembers)(e);if(t)return;j(new Map(n.map(e=>[e.memberId,e])))}catch{if(t)return;j(new Map)}})(),()=>{t=!0}},[B]);let J=(0,i.useMemo)(()=>[{dataIndex:`caseTitle`,key:`caseTitle`,title:`案件`,width:300},{key:`state`,render:e=>(0,s.jsx)(a.Typography,{color:x(e.state),component:`span`,variant:`body`,children:e.stateLabel}),title:`狀態`,width:120},{key:`initiatorMemberId`,render:e=>(0,s.jsx)(a.Typography,{component:`span`,variant:`body`,children:S(e.initiatorMemberId,A)}),title:`發起人`,width:180},{key:`startedAt`,render:e=>(0,s.jsx)(a.Typography,{component:`span`,variant:`body`,children:n.t(e.startedAt)}),title:`發起時間`,width:220},{key:`completedAt`,render:e=>(0,s.jsx)(a.Typography,{component:`span`,variant:`body`,children:n.t(e.completedAt)}),title:`完成時間`,width:220}],[A]),Y=(0,i.useMemo)(()=>({render:e=>[{name:`查看`,onClick:()=>E.push(D.caseDetail(e.id))}],variant:`base-secondary`,width:88}),[E]);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.PageHeader,{children:(0,s.jsx)(u.default,{description:m,title:w})}),(0,s.jsx)(a.SectionGroup,{children:(0,s.jsxs)(a.Section,{filterArea:(0,s.jsx)(a.FilterArea,{className:d.instanceFilterArea,size:`sub`,children:(0,s.jsxs)(a.FilterLine,{children:[(0,s.jsx)(a.Filter,{span:3,children:(0,s.jsx)(a.FormField,{fullWidth:!0,layout:l.FormFieldLayout.VERTICAL,name:`instanceSearchText`,children:(0,s.jsx)(a.Input,{fullWidth:!0,onChange:e=>{U(e.target.value),N(1)},placeholder:b,size:`sub`,value:H,variant:`base`})})}),(0,s.jsx)(a.Filter,{span:2,children:(0,s.jsx)(a.FormField,{fullWidth:!0,layout:l.FormFieldLayout.VERTICAL,name:`instanceState`,children:(0,s.jsx)(a.Select,{clearable:!1,fullWidth:!0,onChange:e=>{G(g(e)),N(1)},options:[...p],placeholder:`狀態`,renderValue:e=>`狀態:${v(e)}`,size:`sub`,value:W})})})]})}),children:[O?(0,s.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:O}):null,!O&&!R&&B.length===0?(0,s.jsx)(a.Typography,{color:`text-neutral`,variant:`body`,children:y}):null,(0,s.jsx)(a.Table,{actions:Y,columns:J,dataSource:[...B],fullWidth:!0,loading:R,pagination:{current:M,onChange:e=>{N(e)},onChangePageSize:e=>{N(1),F(e)},pageSize:P,pageSizeLabel:`每頁筆數`,pageSizeOptions:f,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:I}})]})})]})}function h(e){return{...e,caseTitle:(0,c.readApprovalInstanceCaseTitle)(e),key:e.id,stateLabel:b(e.state)}}function g(e){return y(e)?_(e.state):p[0]}function _(e){return p.find(t=>t.state===e)??p[0]}function v(e){return y(e)?e.name:p[0].name}function y(e){return typeof e==`object`&&!!e&&`id`in e&&`name`in e&&`state`in e}function b(e){return e===`RUNNING`?`進行中`:e===`APPROVED`?`已通過`:e===`REJECTED`?`已拒絕`:e===`RETURNED`?`已退回`:e===`CANCELLED`?`已取消`:e===`EXPIRED`?`已逾期`:`草稿`}function x(e){return e===`APPROVED`?`text-success`:e===`REJECTED`||e===`CANCELLED`||e===`EXPIRED`?`text-error`:`text-neutral`}function S(e,t){let n=(e??``).trim();return n?t.get(n)?.name??n:`未知發起人`}function C(e){return e instanceof Error?e.message:`讀取簽核案件失敗。`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return m}});
2
- //# sourceMappingURL=approval-instance-list-page-C408vxE2.cjs.map
@@ -1,2 +0,0 @@
1
- "use client";require('../categories.css');const e=require("./chunk-CMqjfN_6.cjs"),t=require("./format-date-time-XxBzF0F5.cjs"),n=require("./bpm-form-field-Bc6k4ZEO.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/react/ContentHeader");s=e.t(s,1);let c=require("@mezzanine-ui/icons"),l=require("@rytass/bpm-core-client/template");var u={templateFilterArea:`bpm_templateFilterArea_nUL-R`,templateModalFields:`bpm_templateModalFields_hUxWp`},d=[10,20,50],f=[{key:`ALL`,label:`全部`},{key:`ACTIVE`,label:`啟用`},{key:`INACTIVE`,label:`停用`}];function p(){let[e,n]=(0,r.useState)([]),[p,y]=(0,r.useState)(1),[b,x]=(0,r.useState)(10),[S,C]=(0,r.useState)(`ALL`),[w,T]=(0,r.useState)(0),[E,D]=(0,r.useState)(null),[O,k]=(0,r.useState)(null),[A,j]=(0,r.useState)(!0),[M,N]=(0,r.useState)(null),[P,F]=(0,r.useState)(!1),[I,L]=(0,r.useState)(``),R=(0,r.useCallback)(async()=>{j(!0),k(null);try{let e=await(0,l.listApprovalTemplateCategoriesPage)({page:p,pageSize:b,searchText:I,status:_(S)});n(e.categories),T(e.totalCount)}catch(e){k(v(e))}finally{j(!1)}},[p,b,S,I]);(0,r.useEffect)(()=>{R()},[R]);let z=(0,r.useMemo)(()=>e.map(e=>({...e,key:e.id,updatedAtLabel:t.t(e.updatedAt)})),[e]),B=(0,r.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`分類名稱`,width:180},{key:`status`,render:e=>(0,a.jsx)(h,{isActive:e.isActive}),title:`狀態`,width:120},{dataIndex:`sortOrder`,key:`sortOrder`,title:`排序`,width:100},{key:`description`,render:e=>(0,a.jsx)(i.Typography,{component:`span`,variant:`body`,children:e.description||`無`}),title:`說明`,width:260},{dataIndex:`updatedAtLabel`,key:`updatedAtLabel`,title:`更新時間`,width:220}],[]);async function V(e){F(!0),k(null);try{M?.type===`EDIT`&&M.record?await(0,l.updateApprovalTemplateCategory)({...e,id:M.record.id}):await(0,l.createApprovalTemplateCategory)(e),N(null),await R()}catch(e){throw k(v(e)),e}finally{F(!1)}}async function H(e){F(!0),k(null);try{await(0,l.updateApprovalTemplateCategory)({description:e.description,id:e.id,isActive:!e.isActive,name:e.name,sortOrder:e.sortOrder}),await R()}catch(e){k(v(e))}finally{F(!1)}}async function U(){if(E){F(!0),k(null);try{await(0,l.deleteApprovalTemplateCategory)(E.id),D(null),await R()}catch(e){k(v(e))}finally{F(!1)}}}let W=(0,r.useMemo)(()=>({render:e=>[{name:`編輯`,onClick:()=>N({record:e,type:`EDIT`})},{name:e.isActive?`停用`:`啟用`,onClick:()=>void H(e),variant:e.isActive?`destructive-secondary`:`base-secondary`},{name:`刪除`,onClick:()=>D({id:e.id,name:e.name}),variant:`destructive-secondary`}],variant:`base-secondary`,width:192}),[R]);return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.PageHeader,{children:(0,a.jsx)(s.default,{description:`維護簽核模板分類,供模板建立、篩選與列表標示使用。`,title:`簽核模板分類`,children:(0,a.jsx)(i.Button,{icon:c.PlusIcon,iconType:`leading`,onClick:()=>N({record:null,type:`CREATE`}),variant:`base-primary`,children:`建立分類`})})}),(0,a.jsx)(i.SectionGroup,{children:(0,a.jsxs)(i.Section,{filterArea:(0,a.jsx)(i.FilterArea,{className:u.templateFilterArea,size:`sub`,children:(0,a.jsx)(i.FilterLine,{children:(0,a.jsx)(i.Filter,{span:3,children:(0,a.jsx)(i.FormField,{fullWidth:!0,layout:o.FormFieldLayout.VERTICAL,name:`categorySearchText`,children:(0,a.jsx)(i.Input,{fullWidth:!0,onChange:e=>{L(e.target.value),y(1)},placeholder:`關鍵字:搜尋分類名稱或說明`,size:`sub`,value:I,variant:`base`})})})})}),tab:(0,a.jsx)(i.Tab,{activeKey:S,onChange:e=>{C(g(e)),y(1)},children:f.map(e=>(0,a.jsx)(i.TabItem,{children:e.label},e.key))}),children:[O?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:O}):null,(0,a.jsx)(i.Table,{actions:W,columns:B,dataSource:z,fullWidth:!0,loading:A||P,pagination:{current:p,onChange:e=>{y(e)},onChangePageSize:e=>{y(1),x(e)},pageSize:b,pageSizeLabel:`每頁筆數`,pageSizeOptions:d,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:w}})]})})]}),(0,a.jsx)(m,{loading:P,modal:M,onClose:()=>N(null),onSubmit:V}),(0,a.jsx)(i.Modal,{cancelText:`取消`,confirmButtonProps:{variant:`destructive-primary`},confirmText:`刪除`,loading:P,modalStatusType:`error`,modalType:`standard`,onCancel:()=>D(null),onClose:()=>D(null),onConfirm:()=>void U(),open:!!E,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`若分類已被模板使用,系統會改為停用分類並保留既有模板關聯。`,title:`刪除分類`,children:(0,a.jsxs)(i.Typography,{color:`text-neutral`,variant:`body`,children:[`確定要刪除「`,E?.name??``,`」嗎?`]})})]})}function m({loading:e,modal:t,onClose:o,onSubmit:s}){let[c,l]=(0,r.useState)(``),[d,f]=(0,r.useState)(null),[p,m]=(0,r.useState)(``),[h,g]=(0,r.useState)(`0`);(0,r.useEffect)(()=>{t&&(l(t.record?.description??``),f(null),m(t.record?.name??``),g(String(t.record?.sortOrder??0)))},[t]);async function _(){let e=p.trim(),n=Number(h);if(!e){f(`請輸入分類名稱`);return}if(!Number.isInteger(n)){f(`排序必須是整數`);return}try{await s({description:c.trim()||null,isActive:t?.record?.isActive??!0,name:e,sortOrder:n})}catch(e){f(v(e))}}return(0,a.jsxs)(i.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!p.trim()},confirmText:t?.type===`EDIT`?`儲存`:`建立`,loading:e,modalType:`standard`,onCancel:o,onClose:o,onConfirm:()=>void _(),open:!!t,showModalFooter:!0,showModalHeader:!0,size:`regular`,title:t?.type===`EDIT`?`編輯分類`:`建立分類`,children:[(0,a.jsxs)(`div`,{className:u.templateModalFields,children:[(0,a.jsx)(n.t,{label:`分類名稱`,name:`categoryName`,required:!0,children:(0,a.jsx)(i.Input,{autoFocus:!0,fullWidth:!0,onChange:e=>{m(e.target.value),f(null)},placeholder:`例如:行政管理`,value:p,variant:`base`})}),(0,a.jsx)(n.t,{label:`排序`,name:`categorySortOrder`,children:(0,a.jsx)(i.Input,{fullWidth:!0,onChange:e=>{g(e.target.value),f(null)},placeholder:`0`,value:h,variant:`base`})}),(0,a.jsx)(n.t,{label:`說明`,name:`categoryDescription`,children:(0,a.jsx)(i.Textarea,{onChange:e=>{l(e.target.value),f(null)},placeholder:`補充分類用途`,value:c})})]}),d?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:d}):null]})}function h({isActive:e}){return e?(0,a.jsx)(i.Badge,{size:`sub`,text:`啟用`,variant:`dot-success`}):(0,a.jsx)(i.Badge,{size:`sub`,text:`停用`,variant:`dot-inactive`})}function g(e){return e===`ACTIVE`||e===`INACTIVE`?e:`ALL`}function _(e){return e}function v(e){return e instanceof Error?e.message:`發生未知錯誤`}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return p}});
2
- //# sourceMappingURL=categories-DUfldZ_9.cjs.map
@@ -1,2 +0,0 @@
1
- "use client";const e=require("./chunk-CMqjfN_6.cjs"),t=require("./router-adapter--gYs13E8.cjs"),n=require("./routes-config-fDVHmvXi.cjs"),r=require("./FormRendererView-DNtNodNl.cjs"),i=require("./FormBuilderView-BPLwAJGv.cjs"),a=require("./designer-CmqAU92b.cjs");let o=require("react"),s=require("@mezzanine-ui/react"),c=require("react/jsx-runtime"),l=require("@mezzanine-ui/core/form"),u=require("@mezzanine-ui/react/ContentHeader");u=e.t(u,1);let d=require("@rytass/bpm-core-client/form"),f=require("@rytass/bpm-core-client/template");var p={id:`UNCATEGORIZED`,name:`未分類`},m=100;function h({categoryId:e,formSchema:t,formUiSchema:n,name:r,onCategoryIdChange:a,onFormChange:u,onNameChange:d}){let[h,_]=(0,o.useState)([]);(0,o.useEffect)(()=>{let e=!0;return(async()=>{try{let t=await(0,f.listApprovalTemplateCategoriesPage)({page:1,pageSize:m,searchText:``,status:`ACTIVE`});e&&_(t.categories)}catch{e&&_([])}})(),()=>{e=!1}},[]);let v=[p,...h.map(e=>({id:e.id,name:e.name}))],y=v.find(t=>t.id===e)??p;return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsxs)(`div`,{style:g,children:[(0,c.jsx)(s.FormField,{label:`名稱`,layout:l.FormFieldLayout.VERTICAL,name:`composeName`,children:(0,c.jsx)(s.Input,{fullWidth:!0,onChange:e=>d(e.target.value),placeholder:`例如:請款簽核`,value:r})}),(0,c.jsx)(s.FormField,{label:`分類(選填)`,layout:l.FormFieldLayout.VERTICAL,name:`composeCategory`,children:(0,c.jsx)(s.Select,{clearable:!1,fullWidth:!0,onChange:e=>a(e&&e.id!==p.id?e.id:null),options:v,placeholder:`未分類`,value:y})})]}),(0,c.jsx)(s.Typography,{color:`text-neutral`,variant:`caption`,children:`先設計表單欄位,下一步的流程條件分流即可直接引用這些欄位。`}),(0,c.jsx)(i.t,{onChange:u,value:{schema:t,uiSchema:n}})]})}var g={display:`grid`,gap:16,gridTemplateColumns:`repeat(auto-fit, minmax(220px, 1fr))`};function _({formSchema:e,formUiSchema:t,initiatorPolicyCel:n,name:i,publishError:a,workflowDefinition:o}){let l=o?.nodes??[],u=o?.edges??[],d=e.fields.length,f=new Map(l.map(e=>[e.id,e.data.label])),p=l.map(e=>({detail:x(e)??`—`,key:e.id,label:e.data.label,typeLabel:b(e)})),m=u.filter(e=>!!e.data.condition).map(e=>({condition:e.data.condition??``,key:e.id,source:f.get(e.source)??e.source,target:f.get(e.target)??e.target}));return(0,c.jsxs)(`div`,{style:S,children:[(0,c.jsx)(s.Typography,{component:`h2`,style:C,variant:`h2`,children:i||`(未命名)`}),(0,c.jsxs)(`div`,{style:S,children:[(0,c.jsx)(s.Typography,{variant:`h3`,children:`表單預覽`}),d>0?(0,c.jsx)(r.t,{dataSourceContext:{kind:`preview`},readonly:!0,schema:e,uiSchema:t}):(0,c.jsx)(s.Empty,{title:`尚未設計表單欄位`})]}),(0,c.jsxs)(`div`,{style:S,children:[(0,c.jsx)(s.Typography,{variant:`h3`,children:`流程概覽`}),l.length>0?(0,c.jsx)(s.Table,{columns:v,dataSource:p,fullWidth:!0}):(0,c.jsx)(s.Empty,{title:`尚未設計流程節點`}),m.length>0?(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.Typography,{color:`text-neutral`,variant:`caption`,children:`條件分流`}),(0,c.jsx)(s.Table,{columns:y,dataSource:m,fullWidth:!0})]}):null,n?(0,c.jsxs)(s.Typography,{color:`text-neutral`,variant:`caption`,children:[`發起權限:`,n]}):null]}),a?(0,c.jsx)(s.Typography,{color:`text-error`,variant:`body`,children:a}):null]})}var v=[{key:`type`,render:e=>(0,c.jsx)(s.Tag,{label:e.typeLabel,size:`sub`,type:`static`}),title:`類型`,width:130},{dataIndex:`label`,key:`label`,title:`節點`},{dataIndex:`detail`,key:`detail`,title:`簽核方式`,width:160}],y=[{dataIndex:`source`,key:`source`,title:`來源`,width:180},{dataIndex:`target`,key:`target`,title:`目標`,width:180},{dataIndex:`condition`,key:`condition`,title:`條件`}];function b(e){switch(e.type){case`startEvent`:return`開始`;case`endEvent`:return e.data.endState===`REJECTED`?`結束(駁回)`:`結束(核准)`;case`userTask`:return`簽核`;case`serviceTask`:return`服務`;case`exclusiveGateway`:return`條件閘道`;case`parallelGateway`:return`平行閘道`;default:return`節點`}}function x(e){if(e.type!==`userTask`)return null;switch(e.data.approverResolver.type){case`DIRECT`:return`指定成員`;case`POSITION`:return`指定職位`;case`ORG_UNIT_MEMBER`:return`單位成員`;case`ORG_UNIT_POSITION`:return`單位職位`;case`ORG_MANAGER`:return`主管`;case`ORG_UNIT_MANAGER`:return`單位主管`;case`DYNAMIC_FORM`:return`表單動態指派`;case`EXPRESSION`:return`運算式`;default:return`簽核人`}}var S={display:`grid`,gap:12},C={marginTop:`var(--mzn-spacing-padding-vertical-spacious)`};function w({aiAssistantAvailable:e=!1,formSchema:t,initiatorPolicyCel:n,onInitiatorPolicyChange:r,onWorkflowChange:i,showAiAssistant:o=!1,workflowDefinition:l}){return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.Typography,{color:`text-neutral`,variant:`caption`,children:`設計簽核節點與條件分流;條件可直接引用上一步設計的表單欄位。`}),(0,c.jsx)(a.t,{aiAssistantAvailable:e,embedded:!0,formSchemaOverride:t,initialInitiatorPolicyCel:n,initialWorkflowDefinition:l??void 0,onInitiatorPolicyChange:r,onWorkflowChange:i,showAiAssistant:o})]})}var T={fields:[],schemaVersion:1},E={layout:[],schemaVersion:1};function D(){let[e,t]=(0,o.useState)(0),[n,r]=(0,o.useState)(``),[i,a]=(0,o.useState)(null),[s,c]=(0,o.useState)(T),[l,u]=(0,o.useState)(E),[d,p]=(0,o.useState)(null),[m,h]=(0,o.useState)(null),[g,_]=(0,o.useState)(`idle`),[v,y]=(0,o.useState)(null),b=n.trim().length>0&&s.fields.length>0,x=(0,o.useCallback)(e=>{t(e)},[]),S=(0,o.useCallback)(()=>{t(e=>e<2?e+1:e)},[]),C=(0,o.useCallback)(()=>{t(e=>e>0?e-1:e)},[]),w=(0,o.useCallback)(e=>{c(e.schema),u(e.uiSchema)},[]),D=(0,o.useCallback)(e=>{p(e)},[]),A=(0,o.useCallback)(e=>{h(e)},[]);return{canLeaveBasics:b,categoryId:i,currentStep:e,formSchema:s,formUiSchema:l,goBack:C,goNext:S,goToStep:x,initiatorPolicyCel:m,name:n,publish:(0,o.useCallback)(async()=>{_(`submitting`),y(null);try{let e=await(0,f.composeApprovalTemplateWithForm)({category:null,categoryId:i,formDefinitionId:null,formDescription:null,formName:n,initiatorPolicyCel:m,notificationConfig:null,publish:!0,schema:s,slaDefaults:null,templateDescription:null,templateId:null,templateName:n,uiSchema:l,workflowDefinition:d??O});return _(`success`),e}catch(e){return y(k(e)),_(`error`),null}},[i,s,l,m,n,d]),publishError:v,publishPhase:g,setCategoryId:a,setFormValue:w,setInitiatorPolicyCel:A,setName:r,setWorkflowDefinition:D,workflowDefinition:d}}var O={edges:[],meta:{schemaVersion:1},nodes:[{data:{label:`開始`},id:`start`,position:{x:80,y:160},type:`startEvent`},{data:{endState:`APPROVED`,label:`完成`,triggerMode:`AND`},id:`end`,position:{x:560,y:160},type:`endEvent`}]};function k(e){return e instanceof Error?(0,d.readFormSchemaLintMessage)(e.message):`發生未知錯誤`}function A({aiAssistantAvailable:e=!1,showAiAssistant:r=!1}={}){let i=t.r(),a=n.r(),o=D(),l=o.publishPhase===`submitting`;async function d(){let e=await o.publish();e&&i.push(a.templateDesigner(e.templateId))}return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.PageHeader,{children:(0,c.jsx)(u.default,{description:`一次完成表單與流程設計,發佈後即可直接發起。`,title:`建立模板(表單 + 流程)`,children:(0,c.jsx)(s.Button,{disabled:l,onClick:()=>i.push(a.templates()),variant:`base-secondary`,children:`返回模板列表`})})}),(0,c.jsx)(s.SectionGroup,{children:(0,c.jsxs)(s.Section,{children:[(0,c.jsxs)(s.Stepper,{currentStep:o.currentStep,children:[(0,c.jsx)(s.Step,{description:`設計欄位與版面`,title:`表單設計`}),(0,c.jsx)(s.Step,{description:`設計簽核節點與條件`,title:`流程設計`}),(0,c.jsx)(s.Step,{description:`確認後發佈`,title:`檢視並發佈`})]}),o.currentStep===0?(0,c.jsx)(h,{categoryId:o.categoryId,formSchema:o.formSchema,formUiSchema:o.formUiSchema,name:o.name,onCategoryIdChange:o.setCategoryId,onFormChange:o.setFormValue,onNameChange:o.setName}):null,o.currentStep===1?(0,c.jsx)(w,{aiAssistantAvailable:e,formSchema:o.formSchema,initiatorPolicyCel:o.initiatorPolicyCel,onInitiatorPolicyChange:o.setInitiatorPolicyCel,onWorkflowChange:o.setWorkflowDefinition,showAiAssistant:r,workflowDefinition:o.workflowDefinition}):null,o.currentStep===2?(0,c.jsx)(_,{formSchema:o.formSchema,formUiSchema:o.formUiSchema,initiatorPolicyCel:o.initiatorPolicyCel,name:o.name,publishError:o.publishError,workflowDefinition:o.workflowDefinition}):null,(0,c.jsxs)(`div`,{style:j,children:[o.currentStep===0&&!o.canLeaveBasics?(0,c.jsx)(s.Typography,{color:`text-neutral`,variant:`caption`,children:`請填寫模板名稱、表單名稱,並至少新增一個表單欄位。`}):(0,c.jsx)(`span`,{}),(0,c.jsxs)(`div`,{style:M,children:[(0,c.jsx)(s.Button,{disabled:o.currentStep===0||l,onClick:o.goBack,variant:`base-secondary`,children:`上一步`}),o.currentStep<2?(0,c.jsx)(s.Button,{disabled:o.currentStep===0&&!o.canLeaveBasics,onClick:o.goNext,variant:`base-primary`,children:`下一步`}):(0,c.jsx)(s.Button,{disabled:l,loading:l,onClick:()=>{d()},variant:`base-primary`,children:`發佈`})]})]})]})})]})}var j={alignItems:`center`,display:`flex`,marginTop:`var(--mzn-spacing-padding-vertical-spacious)`,justifyContent:`space-between`,gap:16},M={display:`flex`,gap:8};Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return A}});
2
- //# sourceMappingURL=compose-CULMDsLS.cjs.map
@@ -1,2 +0,0 @@
1
- "use client";require('../dashboard-page.css');const e=require("./chunk-CMqjfN_6.cjs"),t=require("./router-adapter--gYs13E8.cjs"),n=require("./auth-provider-4BeCw7cI.cjs"),r=require("./routes-config-fDVHmvXi.cjs");let i=require("react"),a=require("@mezzanine-ui/react"),o=require("react/jsx-runtime"),s=require("@rytass/bpm-core-client/workflow"),c=require("@mezzanine-ui/react/ContentHeader");c=e.t(c,1);let l=require("@mezzanine-ui/icons");var u={metricCard:`bpm_metricCard_vp2qC`},d={activeInstanceCount:0,completedInstanceCount:0,overdueTaskCount:0,pendingTaskCount:0,rejectedInstanceCount:0,totalInstanceCount:0,unreadNotificationCount:0};function f(){let e=t.r(),f=r.r(),{member:h}=n.n(),g=h?.memberId??null,[_,v]=(0,i.useState)(null),[y,b]=(0,i.useState)(!0),[x,S]=(0,i.useState)(d),C=(0,i.useCallback)(async()=>{if(!g){b(!1);return}b(!0),v(null);try{S(await(0,s.readWorkflowDashboardSummary)({currentMemberId:g,from:null,to:null}))}catch(e){v(m(e))}finally{b(!1)}},[g]);(0,i.useEffect)(()=>{C()},[C]);let w=(0,i.useMemo)(()=>[{caption:`目前需要你處理的任務`,href:f.inbox(),label:`待處理簽核`,value:p(x.pendingTaskCount,y)},{caption:`尚未讀取的站內通知`,href:f.inbox(),label:`未讀通知`,value:p(x.unreadNotificationCount,y)},{caption:`目前仍在流程中的案件`,href:f.search(),label:`進行中案件`,value:p(x.activeInstanceCount,y)},{caption:`已超過 SLA 的待處理任務`,href:f.inbox(),label:`逾時任務`,value:p(x.overdueTaskCount,y)},{caption:`你有權限查看的全部案件`,href:f.search(),label:`案件總數`,value:p(x.totalInstanceCount,y)}],[y,f,x]);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.PageHeader,{children:(0,o.jsx)(c.default,{description:`查看待處理簽核、近期通知與你發起的案件進度。`,title:`工作台`,children:(0,o.jsx)(a.Button,{icon:l.PlusIcon,iconType:`leading`,onClick:()=>e.push(f.caseNew()),variant:`base-primary`,children:`發起簽核`})})}),(0,o.jsx)(a.SectionGroup,{children:(0,o.jsxs)(a.Section,{children:[_?(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:_}):null,(0,o.jsx)(a.CardGroup,{children:w.map(t=>(0,o.jsx)(a.BaseCard,{"aria-label":`前往${t.label}`,className:u.metricCard,description:t.value,onClick:()=>e.push(t.href),onKeyDown:n=>{(n.key===`Enter`||n.key===` `)&&(n.preventDefault(),e.push(t.href))},role:`link`,tabIndex:0,title:t.label,children:(0,o.jsx)(a.Typography,{color:`text-neutral`,variant:`caption`,children:t.caption})},t.label))})]})})]})}function p(e,t){return t?`-`:String(e)}function m(e){return e instanceof Error?e.message:`讀取工作台摘要失敗。`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return f}});
2
- //# sourceMappingURL=dashboard-page-DwHQY6Ki.cjs.map
@@ -1,2 +0,0 @@
1
- "use client";require('../delegations.css');const e=require("./chunk-CMqjfN_6.cjs"),t=require("./auth-provider-4BeCw7cI.cjs"),n=require("./format-date-time-XxBzF0F5.cjs"),r=require("./bpm-form-field-Bc6k4ZEO.cjs");let i=require("react"),a=require("@mezzanine-ui/react"),o=require("react/jsx-runtime"),s=require("@rytass/bpm-core-client/workflow"),c=require("@mezzanine-ui/core/form"),l=require("@mezzanine-ui/react/ContentHeader");l=e.t(l,1);let u=require("@mezzanine-ui/icons"),d=require("@rytass/bpm-core-client/template");var f={delegationModalFields:`bpm_delegationModalFields_gUlCQ`,delegationFilterArea:`bpm_delegationFilterArea_QDZkw`,memberNameWithTooltip:`bpm_memberNameWithTooltip_RggTW`},p=c.FormFieldLayout.HORIZONTAL,m=[10,20,50],h=[{key:`ALL`,label:`全部`},{key:`ACTIVE`,label:`啟用中`},{key:`REVOKED`,label:`已撤銷`},{key:`EXPIRED`,label:`已過期`}],g=[{id:`ALL`,name:`全部簽核`},{id:`TEMPLATE_LIST`,name:`指定模板`}],_=[{id:`ALL_SCOPES`,name:`全部範圍`,scopeType:null},{id:`ALL`,name:`全部簽核`,scopeType:`ALL`},{id:`TEMPLATE_LIST`,name:`指定模板`,scopeType:`TEMPLATE_LIST`}];function v(){let{member:e}=t.n(),p=e?.memberId??null,[v,x]=(0,i.useState)(null),[C,w]=(0,i.useState)(``),[E,D]=(0,i.useState)(null),[O,A]=(0,i.useState)(!0),[j,M]=(0,i.useState)(!1),[N,P]=(0,i.useState)([]),[F,de]=(0,i.useState)(null),[I,fe]=(0,i.useState)(null),[pe,L]=(0,i.useState)(!1),[R,z]=(0,i.useState)(null),[B,me]=(0,i.useState)(`100`),[V,H]=(0,i.useState)(1),[U,he]=(0,i.useState)(10),[W,ge]=(0,i.useState)(`ALL`),[_e,ve]=(0,i.useState)(0),[ye,be]=(0,i.useState)([]),[xe,Se]=(0,i.useState)(!1),[G,Ce]=(0,i.useState)([]),[K,we]=(0,i.useState)(_[0]),[Te,Ee]=(0,i.useState)(g[0]),[q,De]=(0,i.useState)(``),[Oe,ke]=(0,i.useState)(!1),[Ae,J]=(0,i.useState)([]),Y=(0,i.useCallback)(async()=>{A(!0),D(null);try{let[e,t]=await Promise.all([(0,s.listDelegationRulesPage)({agentMemberId:I?.id??null,includeInactive:!0,page:V,pageSize:U,principalMemberId:F?.id??null,scopeType:K.scopeType,status:W===`ALL`?null:W}),(0,s.searchMembers)(``)]);be(e.rules),ve(e.totalCount),P(t.map(b))}catch(e){D(k(e))}finally{A(!1)}},[I,F,V,U,W,K]);(0,i.useEffect)(()=>{Y()},[Y]);let X=(0,i.useMemo)(()=>new Map(N.map(e=>[e.id,e])),[N]),je=(0,i.useMemo)(()=>ye.map(e=>({...e,agentEmail:X.get(e.agentMemberId)?.email??null,agentName:X.get(e.agentMemberId)?.displayName??e.agentMemberId,key:e.id,principalEmail:X.get(e.principalMemberId)?.email??null,principalName:X.get(e.principalMemberId)?.displayName??e.principalMemberId,scopeLabel:oe(e)})),[X,ye]),Z=g.find(e=>e.id===Te.id)??g[0],Me=(0,i.useMemo)(()=>[{key:`principal`,render:e=>(0,o.jsx)(S,{email:e.principalEmail,name:e.principalName}),title:`原簽核人`,width:220},{key:`agent`,render:e=>(0,o.jsx)(S,{email:e.agentEmail,name:e.agentName}),title:`代理人`,width:220},{dataIndex:`scopeLabel`,key:`scope`,title:`代理範圍`,width:220},{key:`status`,render:e=>(0,o.jsx)(se,{status:e.status}),title:`狀態`,width:120},{dataIndex:`priority`,key:`priority`,title:`優先序`,width:100},{key:`startAt`,render:e=>(0,o.jsx)(a.Typography,{component:`span`,variant:`body`,children:n.t(e.startAt)}),title:`開始時間`,width:220},{key:`endAt`,render:e=>(0,o.jsx)(a.Typography,{component:`span`,variant:`body`,children:e.endAt?n.t(e.endAt):`-`}),title:`結束時間`,width:220}],[]),Ne=(0,i.useCallback)(async e=>{if(p){D(null);try{await(0,s.revokeDelegationRule)({id:e,revokedByMemberId:p}),await Y()}catch(e){D(k(e))}}},[p,Y]),Pe=(0,i.useMemo)(()=>({render:e=>e.status===`ACTIVE`?[{name:`撤銷`,onClick:()=>void Ne(e.id)}]:[],variant:`destructive-secondary`,width:88}),[Ne]);async function Q(e){M(!0);try{P((await(0,s.searchMembers)(e)).map(b))}catch(e){D(k(e))}finally{M(!1)}}async function $(e,t=G){ke(!0);try{J(re(t,ne((await(0,d.listApprovalTemplates)()).map(ee),e)))}catch(e){D(k(e))}finally{ke(!1)}}function Fe(){x(null),w(``),z(null),me(`100`),Ce([]),Ee(g[0]),De(``),J([]),$(``,[]),L(!0)}function Ie(){xe||L(!1)}async function Le(){if(p){if(!R||!v){D(`請選擇原簽核人與代理人`);return}if(Z.id===`TEMPLATE_LIST`&&G.length<1){D(`請選擇至少一個簽核模板`);return}if(ue(q,C)){D(`結束時間必須晚於起始時間`);return}Se(!0),D(null);try{await(0,s.createDelegationRule)({agentMemberId:v.id,createdByMemberId:p,endAt:C||null,principalMemberId:R.id,priority:Number(B)||100,requiresConfirmation:!1,scopeConditionCel:null,scopeTemplateIds:Z.id===`TEMPLATE_LIST`?G.map(e=>e.id):[],scopeType:Z.id,startAt:q||null}),L(!1),V===1?await Y():H(1)}catch(e){D(k(e))}finally{Se(!1)}}}return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.PageHeader,{children:(0,o.jsx)(l.default,{description:`設定簽核代理規則,讓符合範圍的待簽任務自動改派給代理人。`,title:`代理設定`,children:(0,o.jsx)(a.Button,{icon:u.PlusIcon,iconType:`leading`,onClick:Fe,variant:`base-primary`,children:`建立代理`})})}),(0,o.jsx)(a.SectionGroup,{children:(0,o.jsxs)(a.Section,{filterArea:(0,o.jsx)(a.FilterArea,{className:f.delegationFilterArea,children:(0,o.jsxs)(a.FilterLine,{children:[(0,o.jsx)(a.Filter,{span:2,children:(0,o.jsx)(y,{hideLabel:!0,label:`原簽核人`,loading:j,name:`principalFilterMemberId`,onChange:e=>{de(e),H(1)},onSearch:Q,options:N,required:!1,layout:c.FormFieldLayout.VERTICAL,size:`sub`,value:F})}),(0,o.jsx)(a.Filter,{span:2,children:(0,o.jsx)(y,{hideLabel:!0,label:`代理人`,loading:j,name:`agentFilterMemberId`,onChange:e=>{fe(e),H(1)},onSearch:Q,options:N,required:!1,layout:c.FormFieldLayout.VERTICAL,size:`sub`,value:I})}),(0,o.jsx)(a.Filter,{span:2,children:(0,o.jsx)(a.FormField,{fullWidth:!0,layout:c.FormFieldLayout.VERTICAL,name:`scopeFilterType`,children:(0,o.jsx)(a.Select,{clearable:!1,fullWidth:!0,onChange:e=>{we(ae(e)),H(1)},options:[..._],placeholder:`代理範圍`,size:`sub`,value:K})})})]})}),tab:(0,o.jsx)(a.Tab,{activeKey:W,onChange:e=>{ge(ce(e)),H(1)},children:h.map(e=>(0,o.jsx)(a.TabItem,{children:e.label},e.key))}),children:[E?(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:E}):null,(0,o.jsx)(a.Table,{actions:Pe,columns:Me,dataSource:je,fullWidth:!0,loading:O,pagination:{current:V,onChange:e=>{H(e)},onChangePageSize:e=>{H(1),he(e)},pageSize:U,pageSizeLabel:`每頁筆數`,pageSizeOptions:m,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:_e}})]})}),(0,o.jsx)(a.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!R||!v},confirmText:`建立代理`,loading:xe,modalType:`standard`,onCancel:Ie,onClose:Ie,onConfirm:()=>void Le(),open:pe,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`代理生效後,後續建立的待簽任務會依範圍自動指派。`,title:`建立代理`,children:(0,o.jsxs)(`div`,{className:f.delegationModalFields,children:[(0,o.jsx)(y,{label:`原簽核人`,loading:j,name:`principalMemberId`,onChange:z,onSearch:Q,options:N,value:R}),(0,o.jsx)(y,{label:`代理人`,loading:j,name:`agentMemberId`,onChange:x,onSearch:Q,options:N,value:v}),(0,o.jsx)(r.t,{label:`代理範圍`,name:`scopeType`,required:!0,children:(0,o.jsx)(a.Select,{clearable:!1,fullWidth:!0,onChange:e=>Ee(ie(e)),options:[...g],value:Z})}),Z.id===`TEMPLATE_LIST`?(0,o.jsx)(r.t,{label:`簽核模板`,name:`scopeTemplateIds`,required:!0,children:(0,o.jsx)(a.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的模板`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`scopeTemplateIds`,spellCheck:!1},loading:Oe,loadingText:`搜尋模板中...`,mode:`multiple`,onChange:e=>{let t=te(e);Ce(t),J(e=>re(t,e))},onSearch:$,onVisibilityChange:e=>{e&&$(``)},options:[...Ae],overflowStrategy:`wrap`,placeholder:`搜尋並選取簽核模板`,searchDebounceTime:300,value:[...G]})}):null,(0,o.jsx)(r.t,{label:`優先序`,name:`priority`,children:(0,o.jsx)(a.Input,{fullWidth:!0,onChange:e=>me(e.target.value),value:B,variant:`base`})}),(0,o.jsx)(r.t,{label:`起始時間`,name:`startAt`,children:(0,o.jsx)(a.DateTimePicker,{formatDate:`YYYY-MM-DD`,formatTime:`HH:mm`,fullWidth:!0,hideSecond:!0,onChange:e=>De(T(e)),placeholderLeft:`留空立即生效`,placeholderRight:`選擇時間`,value:le(q)})}),(0,o.jsx)(r.t,{label:`結束時間`,name:`endAt`,children:(0,o.jsx)(a.DateTimePicker,{formatDate:`YYYY-MM-DD`,formatTime:`HH:mm`,fullWidth:!0,hideSecond:!0,onChange:e=>w(T(e)),placeholderLeft:`可留空`,placeholderRight:`選擇時間`,value:le(C)})})]})})]})}function y({hideLabel:e=!1,label:t,layout:n=p,loading:i,name:s,onChange:c,onSearch:l,options:u,required:d=!0,size:f,value:m}){let h=(0,o.jsx)(a.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:s,spellCheck:!1},loading:i,loadingText:`搜尋成員中...`,mode:`single`,onChange:e=>c(x(e)),onSearch:l,onSearchTextChange:e=>c(C(e,u)),onVisibilityChange:e=>{e&&l(``)},options:[...u],placeholder:e?t:`搜尋姓名或信箱`,searchDebounceTime:300,size:f,value:m});return e?(0,o.jsx)(a.FormField,{fullWidth:!0,layout:n,name:s,children:h}):(0,o.jsx)(r.t,{label:t,layout:n,name:s,required:d,children:h})}function b(e){return{displayName:e.name,email:e.email,id:e.memberId,name:`${e.name} · ${e.email}`}}function x(e){if(!A(e))return null;let t=e.id,n=e.name,r=e.email,i=e.displayName;return typeof t==`string`&&typeof n==`string`?{displayName:typeof i==`string`?i:n,email:typeof r==`string`?r:null,id:t,name:n}:null}function S({email:e,name:t}){return e?(0,o.jsx)(a.Tooltip,{title:e,children:({onMouseEnter:e,onMouseLeave:n,ref:r})=>(0,o.jsx)(`span`,{className:f.memberNameWithTooltip,onMouseEnter:e,onMouseLeave:n,ref:r,children:t})}):(0,o.jsx)(`span`,{children:t})}function C(e,t){let n=e.trim().toLocaleLowerCase();if(!n)return null;let r=t.filter(e=>[e.id,e.name,e.email??``].some(e=>e.toLocaleLowerCase().includes(n)));return r.length===1?r[0]??null:null}function ee(e){return{id:e.id,name:e.name}}function te(e){return e.flatMap(e=>{if(!A(e))return[];let t=e.id,n=e.name;return typeof t==`string`&&typeof n==`string`?[{id:t,name:n}]:[]})}function ne(e,t){let n=t.trim().toLocaleLowerCase();return n?e.filter(e=>[e.id,e.name].some(e=>e.toLocaleLowerCase().includes(n))):e}function re(e,t){return[...e,...t].reduce((e,t)=>e.some(e=>e.id===t.id)?e:[...e,t],[])}function ie(e){return!A(e)||!w(e.id)?g[0]:g.find(t=>t.id===e.id)??g[0]}function ae(e){if(!A(e))return _[0];let t=e.id;return _.find(e=>e.id===t)??_[0]}function w(e){return e===`ALL`||e===`TEMPLATE_LIST`}function oe(e){return e.scopeType===`ALL`?`全部簽核`:e.scopeType===`TEMPLATE_LIST`?`指定模板:${e.scopeTemplateIds.length}`:e.scopeConditionCel?`條件:${e.scopeConditionCel}`:`條件式`}function se({status:e}){return e===`ACTIVE`?(0,o.jsx)(a.Badge,{size:`sub`,text:`啟用中`,variant:`dot-success`}):e===`REVOKED`?(0,o.jsx)(a.Badge,{size:`sub`,text:`已撤銷`,variant:`dot-inactive`}):e===`EXPIRED`?(0,o.jsx)(a.Badge,{size:`sub`,text:`已過期`,variant:`dot-warning`}):(0,o.jsx)(a.Badge,{size:`sub`,text:e,variant:`dot-info`})}function ce(e){return e===`ACTIVE`||e===`REVOKED`||e===`EXPIRED`?e:`ALL`}function le(e){let t=e?E(e):null;return t?`${D(t)}T${O(t.getHours())}:${O(t.getMinutes())}`:void 0}function T(e){let t=e?E(e):null;return t?t.toISOString():``}function ue(e,t){if(!e||!t)return!1;let n=E(e),r=E(t);return!!n&&!!r&&r.getTime()<=n.getTime()}function E(e){if(e.endsWith(`Z`)||/[+-]\d{2}:\d{2}$/.test(e)){let t=new Date(e);return Number.isNaN(t.getTime())?null:t}let[t=``,n=`00:00`]=e.split(`T`),[r=0,i=1,a=1]=t.split(`-`).map(Number),[o=0,s=0]=n.split(`:`).map(Number),c=new Date(r,i-1,a,o,s);return Number.isNaN(c.getTime())?null:c}function D(e){return`${e.getFullYear()}-${O(e.getMonth()+1)}-${O(e.getDate())}`}function O(e){return String(e).padStart(2,`0`)}function k(e){return e instanceof Error?e.message:`發生未知錯誤`}function A(e){return typeof e==`object`&&!!e}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return v}});
2
- //# sourceMappingURL=delegations-CGj-tZNO.cjs.map
@@ -1,2 +0,0 @@
1
- "use client";require('../delegations2.css');const e=require("./chunk-CMqjfN_6.cjs"),t=require("./auth-provider-4BeCw7cI.cjs"),n=require("./format-date-time-XxBzF0F5.cjs"),r=require("./bpm-form-field-Bc6k4ZEO.cjs");let i=require("react"),a=require("@mezzanine-ui/react"),o=require("react/jsx-runtime"),s=require("@rytass/bpm-core-client/workflow"),c=require("@mezzanine-ui/core/form"),l=require("@mezzanine-ui/react/ContentHeader");l=e.t(l,1);let ee=require("@mezzanine-ui/icons"),te=require("@rytass/bpm-core-client/template");var u={delegationFilterArea:`bpm_delegationFilterArea_hAA4C`,delegationModalFields:`bpm_delegationModalFields_1aOVW`,memberNameWithTooltip:`bpm_memberNameWithTooltip_6Mojc`},d=c.FormFieldLayout.HORIZONTAL,ne=[10,20,50],re=[{key:`ALL`,label:`全部`},{key:`ACTIVE`,label:`啟用中`},{key:`REVOKED`,label:`已撤銷`},{key:`EXPIRED`,label:`已過期`}],f=[{id:`ALL_SCOPES`,name:`全部範圍`,scopeType:null},{id:`ALL`,name:`全部簽核`,scopeType:`ALL`},{id:`TEMPLATE_LIST`,name:`指定模板`,scopeType:`TEMPLATE_LIST`}],p=[{id:`ALL`,name:`全部簽核`},{id:`TEMPLATE_LIST`,name:`指定模板`}];function m(){let{member:e}=t.n(),d=e?.memberId??null,[m,g]=(0,i.useState)(null),[_,y]=(0,i.useState)(``),[S,C]=(0,i.useState)(null),[w,E]=(0,i.useState)(!0),[he,D]=(0,i.useState)(!1),[O,k]=(0,i.useState)([]),[ge,A]=(0,i.useState)(!1),[j,M]=(0,i.useState)(1),[N,_e]=(0,i.useState)(10),[P,ve]=(0,i.useState)(`ALL`),[ye,be]=(0,i.useState)(0),[F,xe]=(0,i.useState)([]),[I,L]=(0,i.useState)(!1),[R,Se]=(0,i.useState)(f[0]),[z,B]=(0,i.useState)([]),[Ce,V]=(0,i.useState)(p[0]),[H,U]=(0,i.useState)(``),[we,W]=(0,i.useState)(!1),[Te,G]=(0,i.useState)([]),K=(0,i.useRef)(0),q=(0,i.useCallback)(async()=>{let e=K.current+1;if(K.current=e,!d){E(!1);return}E(!0),C(null);try{let[t,n]=await Promise.all([(0,s.listDelegationRulesPage)({includeInactive:!0,page:j,pageSize:N,principalMemberId:d,scopeType:R.scopeType,status:P===`ALL`?null:P}),(0,s.searchMembers)(``)]);e===K.current&&(xe(t.rules),be(t.totalCount),k(n.map(h)))}catch(t){e===K.current&&C(T(t))}finally{e===K.current&&E(!1)}},[d,j,N,P,R]);(0,i.useEffect)(()=>{q()},[q]);let J=(0,i.useMemo)(()=>new Map(O.map(e=>[e.id,e])),[O]),Ee=(0,i.useMemo)(()=>F.map(e=>({...e,agentEmail:J.get(e.agentMemberId)?.email??null,agentName:J.get(e.agentMemberId)?.displayName??e.agentMemberId,key:e.id,scopeLabel:ue(e)})),[J,F]),Y=p.find(e=>e.id===Ce.id)??p[0],X=(0,i.useMemo)(()=>[{key:`agent`,render:e=>(0,o.jsx)(ae,{email:e.agentEmail,name:e.agentName}),title:`代理人`,width:220},{dataIndex:`scopeLabel`,key:`scope`,title:`代理範圍`,width:220},{key:`status`,render:e=>(0,o.jsx)(fe,{status:e.status}),title:`狀態`,width:120},{key:`startAt`,render:e=>(0,o.jsx)(a.Typography,{component:`span`,variant:`body`,children:n.t(e.startAt)}),title:`開始時間`,width:220},{key:`endAt`,render:e=>(0,o.jsx)(a.Typography,{component:`span`,variant:`body`,children:e.endAt?n.t(e.endAt):`-`}),title:`結束時間`,width:220}],[]),Z=(0,i.useCallback)(async e=>{if(d){C(null);try{await(0,s.revokeDelegationRule)({id:e,revokedByMemberId:d}),await q()}catch(e){C(T(e))}}},[d,q]),De=(0,i.useMemo)(()=>({render:e=>e.status===`ACTIVE`?[{name:`撤銷`,onClick:()=>void Z(e.id)}]:[],variant:`destructive-secondary`,width:88}),[Z]);async function Oe(e){D(!0);try{k((await(0,s.searchMembers)(e)).map(h))}catch(e){C(T(e))}finally{D(!1)}}async function Q(e,t=z){W(!0);try{G(v(t,ce((await(0,te.listApprovalTemplates)()).map(oe),e)))}catch(e){C(T(e))}finally{W(!1)}}function ke(){g(null),y(``),B([]),V(p[0]),U(``),G([]),Q(``,[]),A(!0)}function $(){I||A(!1)}async function Ae(){if(d){if(!m){C(`請選擇代理人`);return}if(m.id===d){C(`代理人不可設定為自己`);return}if(Y.id===`TEMPLATE_LIST`&&z.length<1){C(`請選擇至少一個簽核模板`);return}if(me(H,_)){C(`結束時間必須晚於起始時間`);return}L(!0),C(null);try{await(0,s.createDelegationRule)({agentMemberId:m.id,createdByMemberId:d,endAt:_||null,principalMemberId:d,priority:100,requiresConfirmation:!1,scopeConditionCel:null,scopeTemplateIds:Y.id===`TEMPLATE_LIST`?z.map(e=>e.id):[],scopeType:Y.id,startAt:H||null}),A(!1),j===1?await q():M(1)}catch(e){C(T(e))}finally{L(!1)}}}return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.PageHeader,{children:(0,o.jsx)(l.default,{description:`設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。`,title:`我的代理`,children:(0,o.jsx)(a.Button,{icon:ee.PlusIcon,iconType:`leading`,onClick:ke,variant:`base-primary`,children:`建立代理`})})}),(0,o.jsx)(a.SectionGroup,{children:(0,o.jsxs)(a.Section,{filterArea:(0,o.jsx)(a.FilterArea,{className:u.delegationFilterArea,size:`sub`,children:(0,o.jsx)(a.FilterLine,{children:(0,o.jsx)(a.Filter,{span:2,children:(0,o.jsx)(a.FormField,{fullWidth:!0,layout:c.FormFieldLayout.VERTICAL,name:`scopeFilterType`,children:(0,o.jsx)(a.Select,{clearable:!1,fullWidth:!0,onChange:e=>{Se(le(e)),M(1)},options:[...f],placeholder:`代理範圍`,size:`sub`,value:R})})})})}),tab:(0,o.jsx)(a.Tab,{activeKey:P,onChange:e=>{ve(pe(e)),M(1)},children:re.map(e=>(0,o.jsx)(a.TabItem,{children:e.label},e.key))}),children:[S?(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:S}):null,(0,o.jsx)(a.Table,{actions:De,columns:X,dataSource:Ee,fullWidth:!0,loading:w,pagination:{current:j,onChange:e=>{M(e)},onChangePageSize:e=>{M(1),_e(e)},pageSize:N,pageSizeLabel:`每頁筆數`,pageSizeOptions:ne,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:ye}})]})}),(0,o.jsx)(a.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!m},confirmText:`建立代理`,loading:I,modalType:`standard`,onCancel:$,onClose:$,onConfirm:()=>void Ae(),open:ge,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`代理生效後,後續建立的待簽任務會依範圍自動指派給代理人。`,title:`建立個人代理`,children:(0,o.jsxs)(`div`,{className:u.delegationModalFields,children:[(0,o.jsx)(ie,{label:`代理人`,loading:he,name:`agentMemberId`,onChange:g,onSearch:Oe,options:O,value:m}),(0,o.jsx)(r.t,{label:`代理範圍`,name:`scopeType`,required:!0,children:(0,o.jsx)(a.Select,{clearable:!1,fullWidth:!0,onChange:e=>V(de(e)),options:[...p],placeholder:`選擇代理範圍`,value:Y})}),Y.id===`TEMPLATE_LIST`?(0,o.jsx)(r.t,{label:`簽核模板`,name:`scopeTemplateIds`,required:!0,children:(0,o.jsx)(a.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的模板`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`scopeTemplateIds`,spellCheck:!1},loading:we,loadingText:`搜尋模板中...`,mode:`multiple`,onChange:e=>{let t=se(e);B(t),G(e=>v(t,e))},onSearch:Q,onVisibilityChange:e=>{e&&Q(``)},options:[...Te],overflowStrategy:`wrap`,placeholder:`搜尋並選取簽核模板`,searchDebounceTime:300,value:[...z]})}):null,(0,o.jsx)(r.t,{label:`起始時間`,name:`startAt`,children:(0,o.jsx)(a.DateTimePicker,{formatDate:`YYYY-MM-DD`,formatTime:`HH:mm`,fullWidth:!0,hideSecond:!0,onChange:e=>U(x(e)),placeholderLeft:`留空立即生效`,placeholderRight:`選擇時間`,value:b(H)})}),(0,o.jsx)(r.t,{label:`結束時間`,name:`endAt`,children:(0,o.jsx)(a.DateTimePicker,{formatDate:`YYYY-MM-DD`,formatTime:`HH:mm`,fullWidth:!0,hideSecond:!0,onChange:e=>y(x(e)),placeholderLeft:`可留空`,placeholderRight:`選擇時間`,value:b(_)})})]})})]})}function ie({label:e,loading:t,name:n,onChange:i,onSearch:s,options:c,value:l}){return(0,o.jsx)(r.t,{label:e,layout:d,name:n,required:!0,children:(0,o.jsx)(a.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:n,spellCheck:!1},loading:t,loadingText:`搜尋成員中...`,mode:`single`,onChange:e=>i(g(e)),onSearch:s,onSearchTextChange:e=>i(_(e,c)),onVisibilityChange:e=>{e&&s(``)},options:[...c],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:l})})}function ae({email:e,name:t}){return e?(0,o.jsx)(a.Tooltip,{title:e,children:({onMouseEnter:e,onMouseLeave:n,ref:r})=>(0,o.jsx)(`span`,{className:u.memberNameWithTooltip,onMouseEnter:e,onMouseLeave:n,ref:r,children:t})}):(0,o.jsx)(`span`,{children:t})}function h(e){return{displayName:e.name,email:e.email,id:e.memberId,name:`${e.name} (${e.email})`}}function g(e){if(!E(e))return null;let t=e.displayName,n=e.email,r=e.id,i=e.name;return typeof r==`string`&&typeof i==`string`?{displayName:typeof t==`string`?t:i,email:typeof n==`string`?n:null,id:r,name:i}:null}function _(e,t){let n=e.trim().toLocaleLowerCase();if(!n)return null;let r=t.filter(e=>[e.id,e.name,e.email??``].some(e=>e.toLocaleLowerCase().includes(n)));return r.length===1?r[0]??null:null}function oe(e){return{id:e.id,name:e.name}}function se(e){return e.flatMap(e=>{if(!E(e))return[];let t=e.id,n=e.name;return typeof t==`string`&&typeof n==`string`?[{id:t,name:n}]:[]})}function ce(e,t){let n=t.trim().toLocaleLowerCase();return n?e.filter(e=>[e.id,e.name].some(e=>e.toLocaleLowerCase().includes(n))):e}function v(e,t){return[...e,...t].reduce((e,t)=>e.some(e=>e.id===t.id)?e:[...e,t],[])}function le(e){if(!E(e))return f[0];let t=e.id;return f.find(e=>e.id===t)??f[0]}function ue(e){return e.scopeType===`ALL`?`全部簽核`:e.scopeType===`TEMPLATE_LIST`?`指定模板:${e.scopeTemplateIds.length}`:e.scopeConditionCel?`條件:${e.scopeConditionCel}`:`條件式`}function de(e){return!E(e)||!y(e.id)?p[0]:p.find(t=>t.id===e.id)??p[0]}function y(e){return e===`ALL`||e===`TEMPLATE_LIST`}function fe({status:e}){return e===`ACTIVE`?(0,o.jsx)(a.Badge,{size:`sub`,text:`啟用中`,variant:`dot-success`}):e===`REVOKED`?(0,o.jsx)(a.Badge,{size:`sub`,text:`已撤銷`,variant:`dot-inactive`}):e===`EXPIRED`?(0,o.jsx)(a.Badge,{size:`sub`,text:`已過期`,variant:`dot-warning`}):(0,o.jsx)(a.Badge,{size:`sub`,text:e,variant:`dot-info`})}function pe(e){return e===`ACTIVE`||e===`REVOKED`||e===`EXPIRED`?e:`ALL`}function b(e){let t=e?S(e):null;return t?`${C(t)}T${w(t.getHours())}:${w(t.getMinutes())}`:void 0}function x(e){let t=e?S(e):null;return t?t.toISOString():``}function me(e,t){if(!e||!t)return!1;let n=S(e),r=S(t);return!!n&&!!r&&r.getTime()<=n.getTime()}function S(e){if(e.endsWith(`Z`)||/[+-]\d{2}:\d{2}$/.test(e)){let t=new Date(e);return Number.isNaN(t.getTime())?null:t}let[t=``,n=`00:00`]=e.split(`T`),[r=0,i=1,a=1]=t.split(`-`).map(Number),[o=0,s=0]=n.split(`:`).map(Number),c=new Date(r,i-1,a,o,s);return Number.isNaN(c.getTime())?null:c}function C(e){return`${e.getFullYear()}-${w(e.getMonth()+1)}-${w(e.getDate())}`}function w(e){return String(e).padStart(2,`0`)}function T(e){return e instanceof Error?e.message:`發生未知錯誤`}function E(e){return typeof e==`object`&&!!e}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return m}});
2
- //# sourceMappingURL=delegations-kbMOSEif.cjs.map