@rytass/bpm-core-react 0.20.1 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +1 -1
  3. package/dist/approval-instance-list-page.css +1 -1
  4. package/dist/chunks/{FormBuilderView-CFRiw04B.js → FormBuilderView-6KdApi-D.js} +667 -584
  5. package/dist/chunks/FormBuilderView-6KdApi-D.js.map +1 -0
  6. package/dist/chunks/FormBuilderView-CGKkuVFi.cjs +4 -0
  7. package/dist/chunks/FormBuilderView-CGKkuVFi.cjs.map +1 -0
  8. package/dist/chunks/{FormRendererView-lYSaR8CQ.cjs → FormRendererView-B-xycC9S.cjs} +3 -3
  9. package/dist/chunks/{FormRendererView-lYSaR8CQ.cjs.map → FormRendererView-B-xycC9S.cjs.map} +1 -1
  10. package/dist/chunks/{FormRendererView-GfbVWEGa.js → FormRendererView-BcQKUi1A.js} +238 -238
  11. package/dist/chunks/{FormRendererView-GfbVWEGa.js.map → FormRendererView-BcQKUi1A.js.map} +1 -1
  12. package/dist/chunks/approval-instance-list-page-BI5fIXc-.js +724 -0
  13. package/dist/chunks/approval-instance-list-page-BI5fIXc-.js.map +1 -0
  14. package/dist/chunks/approval-instance-list-page-Cv5I1YPX.cjs +2 -0
  15. package/dist/chunks/approval-instance-list-page-Cv5I1YPX.cjs.map +1 -0
  16. package/dist/chunks/{categories-DQUtVEiV.cjs → categories-CyyqG6wG.cjs} +2 -2
  17. package/dist/chunks/{categories-DQUtVEiV.cjs.map → categories-CyyqG6wG.cjs.map} +1 -1
  18. package/dist/chunks/{categories-BAdxjNSA.js → categories-f7E-RJEc.js} +9 -9
  19. package/dist/chunks/{categories-BAdxjNSA.js.map → categories-f7E-RJEc.js.map} +1 -1
  20. package/dist/chunks/{compose-egQlRjuZ.js → compose-DFuLPmOA.js} +5 -5
  21. package/dist/chunks/{compose-egQlRjuZ.js.map → compose-DFuLPmOA.js.map} +1 -1
  22. package/dist/chunks/compose-DK3ocWwG.cjs +2 -0
  23. package/dist/chunks/compose-DK3ocWwG.cjs.map +1 -0
  24. package/dist/chunks/{delegations-CVmtpkRn.cjs → delegations-ClRCwD1I.cjs} +2 -2
  25. package/dist/chunks/{delegations-CVmtpkRn.cjs.map → delegations-ClRCwD1I.cjs.map} +1 -1
  26. package/dist/chunks/{delegations-9-yvWWws.js → delegations-CqND-Qtz.js} +5 -5
  27. package/dist/chunks/{delegations-9-yvWWws.js.map → delegations-CqND-Qtz.js.map} +1 -1
  28. package/dist/chunks/{delegations-CrfjsH94.cjs → delegations-D43VDSz1.cjs} +2 -2
  29. package/dist/chunks/{delegations-CrfjsH94.cjs.map → delegations-D43VDSz1.cjs.map} +1 -1
  30. package/dist/chunks/{delegations-CxnNvTCc.js → delegations-zisffLwk.js} +5 -5
  31. package/dist/chunks/{delegations-CxnNvTCc.js.map → delegations-zisffLwk.js.map} +1 -1
  32. package/dist/chunks/designer-CAUWEKJ4.cjs +69 -0
  33. package/dist/chunks/designer-CAUWEKJ4.cjs.map +1 -0
  34. package/dist/chunks/{designer-CZDlQ9Nf.js → designer-CCy5EbOe.js} +2380 -1786
  35. package/dist/chunks/designer-CCy5EbOe.js.map +1 -0
  36. package/dist/chunks/detail-C5KrUC7s.cjs +5 -0
  37. package/dist/chunks/detail-C5KrUC7s.cjs.map +1 -0
  38. package/dist/chunks/{detail-ByZV1XaI.js → detail-Dnc4PPWO.js} +804 -777
  39. package/dist/chunks/detail-Dnc4PPWO.js.map +1 -0
  40. package/dist/chunks/instance-error-message-BEM4O_Kj.js +208 -0
  41. package/dist/chunks/instance-error-message-BEM4O_Kj.js.map +1 -0
  42. package/dist/chunks/instance-error-message-BpCLCOjp.cjs +2 -0
  43. package/dist/chunks/instance-error-message-BpCLCOjp.cjs.map +1 -0
  44. package/dist/chunks/organization-time-zone-provider-B7CXQril.cjs +2 -0
  45. package/dist/chunks/organization-time-zone-provider-B7CXQril.cjs.map +1 -0
  46. package/dist/chunks/organization-time-zone-provider-DNL8yo4-.js +42 -0
  47. package/dist/chunks/organization-time-zone-provider-DNL8yo4-.js.map +1 -0
  48. package/dist/chunks/{providers-BbCs23sk.js → providers-CQWekD7_.js} +197 -196
  49. package/dist/chunks/providers-CQWekD7_.js.map +1 -0
  50. package/dist/chunks/providers-VUOh6i0i.cjs +2 -0
  51. package/dist/chunks/providers-VUOh6i0i.cjs.map +1 -0
  52. package/dist/components/approval-instance-field-filter-controls.d.cts +12 -0
  53. package/dist/components/approval-instance-field-filter-controls.d.ts +12 -0
  54. package/dist/components/approval-instance-field-filters.d.cts +86 -0
  55. package/dist/components/approval-instance-field-filters.d.ts +86 -0
  56. package/dist/components/approval-instance-list-page.d.cts +4 -0
  57. package/dist/components/approval-instance-list-page.d.ts +4 -0
  58. package/dist/components/notification-drawer-options.d.cts +18 -0
  59. package/dist/components/notification-drawer-options.d.ts +18 -0
  60. package/dist/index.cjs +1 -1
  61. package/dist/index.cjs.map +1 -1
  62. package/dist/index.d.cts +1 -0
  63. package/dist/index.d.ts +1 -0
  64. package/dist/index.js +23 -23
  65. package/dist/index.js.map +1 -1
  66. package/dist/lib/organization-time-zone-provider.d.cts +20 -0
  67. package/dist/lib/organization-time-zone-provider.d.ts +20 -0
  68. package/dist/lib/organization-time-zone.d.cts +8 -0
  69. package/dist/lib/organization-time-zone.d.ts +8 -0
  70. package/dist/lib/providers.d.cts +10 -1
  71. package/dist/lib/providers.d.ts +10 -1
  72. package/dist/next/BPMNextProviders.d.cts +8 -1
  73. package/dist/next/BPMNextProviders.d.ts +8 -1
  74. package/dist/next/index.cjs +1 -1
  75. package/dist/next/index.cjs.map +1 -1
  76. package/dist/next/index.js +12 -11
  77. package/dist/next/index.js.map +1 -1
  78. package/dist/next/workflow-chat-route.cjs +2 -2
  79. package/dist/next/workflow-chat-route.cjs.map +1 -1
  80. package/dist/next/workflow-chat-route.js +13 -13
  81. package/dist/pages/admin/delegations/index.cjs +1 -1
  82. package/dist/pages/admin/delegations/index.js +1 -1
  83. package/dist/pages/delegations/index.cjs +1 -1
  84. package/dist/pages/delegations/index.js +1 -1
  85. package/dist/pages/instances/detail/index.cjs +1 -1
  86. package/dist/pages/instances/detail/index.js +1 -1
  87. package/dist/pages/templates/categories/index.cjs +1 -1
  88. package/dist/pages/templates/categories/index.js +1 -1
  89. package/dist/pages/templates/compose/index.cjs +1 -1
  90. package/dist/pages/templates/compose/index.js +1 -1
  91. package/dist/pages/templates/designer/index.cjs +1 -1
  92. package/dist/pages/templates/designer/index.js +1 -1
  93. package/dist/views/admin/delegations/index.cjs +1 -1
  94. package/dist/views/admin/delegations/index.js +1 -1
  95. package/dist/views/admin/index.cjs +1 -1
  96. package/dist/views/admin/index.js +1 -1
  97. package/dist/views/admin/webhook-endpoints/index.cjs +1 -1
  98. package/dist/views/admin/webhook-endpoints/index.cjs.map +1 -1
  99. package/dist/views/admin/webhook-endpoints/index.js +60 -60
  100. package/dist/views/admin/webhook-endpoints/index.js.map +1 -1
  101. package/dist/views/cc/index.cjs +1 -1
  102. package/dist/views/cc/index.js +1 -1
  103. package/dist/views/delegations/index.cjs +1 -1
  104. package/dist/views/delegations/index.js +1 -1
  105. package/dist/views/forms/builder/FormBuilderView.d.cts +8 -1
  106. package/dist/views/forms/builder/FormBuilderView.d.ts +8 -1
  107. package/dist/views/forms/builder/index.cjs +1 -1
  108. package/dist/views/forms/builder/index.js +1 -1
  109. package/dist/views/forms/renderer/index.cjs +1 -1
  110. package/dist/views/forms/renderer/index.js +1 -1
  111. package/dist/views/instances/approver-filled-form.d.cts +8 -5
  112. package/dist/views/instances/approver-filled-form.d.ts +8 -5
  113. package/dist/views/instances/detail/index.cjs +1 -1
  114. package/dist/views/instances/detail/index.js +1 -1
  115. package/dist/views/instances/detail/sections/InstanceTasksSection.d.cts +2 -1
  116. package/dist/views/instances/detail/sections/InstanceTasksSection.d.ts +2 -1
  117. package/dist/views/instances/detail/sections/shared.d.cts +0 -1
  118. package/dist/views/instances/detail/sections/shared.d.ts +0 -1
  119. package/dist/views/instances/new/index.cjs +1 -1
  120. package/dist/views/instances/new/index.cjs.map +1 -1
  121. package/dist/views/instances/new/index.js +8 -8
  122. package/dist/views/instances/new/index.js.map +1 -1
  123. package/dist/views/search/index.cjs +1 -1
  124. package/dist/views/search/index.js +1 -1
  125. package/dist/views/sent/index.cjs +1 -1
  126. package/dist/views/sent/index.js +1 -1
  127. package/dist/views/templates/categories/index.cjs +1 -1
  128. package/dist/views/templates/categories/index.js +1 -1
  129. package/dist/views/templates/compose/index.cjs +1 -1
  130. package/dist/views/templates/compose/index.js +1 -1
  131. package/dist/views/templates/designer/NotifyWebhookTargetsEditor.d.cts +2 -0
  132. package/dist/views/templates/designer/NotifyWebhookTargetsEditor.d.ts +2 -0
  133. package/dist/views/templates/designer/approver-resolver-model.d.cts +105 -1
  134. package/dist/views/templates/designer/approver-resolver-model.d.ts +105 -1
  135. package/dist/views/templates/designer/dynamic-form-resolver-options.d.cts +5 -0
  136. package/dist/views/templates/designer/dynamic-form-resolver-options.d.ts +5 -0
  137. package/dist/views/templates/designer/index.cjs +1 -1
  138. package/dist/views/templates/designer/index.js +1 -1
  139. package/dist/views/templates/designer/node-actor-resolver-options.d.cts +44 -1
  140. package/dist/views/templates/designer/node-actor-resolver-options.d.ts +44 -1
  141. package/dist/views/templates/designer/notify-recipient-options.d.cts +81 -0
  142. package/dist/views/templates/designer/notify-recipient-options.d.ts +81 -0
  143. package/dist/views/templates/designer/position-level-options.d.cts +3 -1
  144. package/dist/views/templates/designer/position-level-options.d.ts +3 -1
  145. package/dist/views/templates/designer/position-scope.d.cts +51 -0
  146. package/dist/views/templates/designer/position-scope.d.ts +51 -0
  147. package/dist/views/templates/index.cjs +1 -1
  148. package/dist/views/templates/index.cjs.map +1 -1
  149. package/dist/views/templates/index.js +7 -7
  150. package/package.json +3 -3
  151. package/dist/chunks/FormBuilderView-CFRiw04B.js.map +0 -1
  152. package/dist/chunks/FormBuilderView-CpUgbSbt.cjs +0 -3
  153. package/dist/chunks/FormBuilderView-CpUgbSbt.cjs.map +0 -1
  154. package/dist/chunks/approval-instance-list-page-BnI4t5mD.js +0 -279
  155. package/dist/chunks/approval-instance-list-page-BnI4t5mD.js.map +0 -1
  156. package/dist/chunks/approval-instance-list-page-fqvmkBlg.cjs +0 -2
  157. package/dist/chunks/approval-instance-list-page-fqvmkBlg.cjs.map +0 -1
  158. package/dist/chunks/compose-Bb5bUVFd.cjs +0 -2
  159. package/dist/chunks/compose-Bb5bUVFd.cjs.map +0 -1
  160. package/dist/chunks/designer-CX9bhYJS.cjs +0 -69
  161. package/dist/chunks/designer-CX9bhYJS.cjs.map +0 -1
  162. package/dist/chunks/designer-CZDlQ9Nf.js.map +0 -1
  163. package/dist/chunks/detail-ByZV1XaI.js.map +0 -1
  164. package/dist/chunks/detail-ChseSF55.cjs +0 -5
  165. package/dist/chunks/detail-ChseSF55.cjs.map +0 -1
  166. package/dist/chunks/instance-error-message-DTARGbGo.cjs +0 -2
  167. package/dist/chunks/instance-error-message-DTARGbGo.cjs.map +0 -1
  168. package/dist/chunks/instance-error-message-q6gy5evy.js +0 -120
  169. package/dist/chunks/instance-error-message-q6gy5evy.js.map +0 -1
  170. package/dist/chunks/language-provider-Bdnx3Gxl.cjs +0 -2
  171. package/dist/chunks/language-provider-Bdnx3Gxl.cjs.map +0 -1
  172. package/dist/chunks/language-provider-phkWOapf.js +0 -17
  173. package/dist/chunks/language-provider-phkWOapf.js.map +0 -1
  174. package/dist/chunks/providers-BbCs23sk.js.map +0 -1
  175. package/dist/chunks/providers-D_KAgOOu.cjs +0 -2
  176. package/dist/chunks/providers-D_KAgOOu.cjs.map +0 -1
@@ -0,0 +1,51 @@
1
+ import { MembershipRecord, OrgUnitRecord, PositionRecord } from '@rytass/bpm-core-client/organization';
2
+ /**
3
+ * Today as `YYYY-MM-DD` in the organization zone, the clock the designer's
4
+ * pickers and dry run share. Mirrors the engine's `formatDateOnlyInTimeZone`;
5
+ * a UTC date is one day behind Taipei between 00:00 and 08:00. `timeZone`
6
+ * must already be resolved (see `useBPMOrganizationTimeZone`).
7
+ */
8
+ export declare function readTodayDateOnlyString(now?: Date, timeZone?: string): string;
9
+ /**
10
+ * Today in the host's organization zone (`organizationTimeZone` on the BPM
11
+ * providers, the value the engine's `BPMRootModule` is given), read on every
12
+ * render, so the designer judges effective dates on the engine's day.
13
+ */
14
+ export declare function useOrganizationTodayDateOnlyString(): string;
15
+ export declare function isMembershipActiveOn(membership: Pick<MembershipRecord, 'effectiveFrom' | 'effectiveTo'>, date: string): boolean;
16
+ /**
17
+ * The positions at least one member holds through a membership that is in
18
+ * effect on `date`. The engine resolves a position or an organization position
19
+ * only through such members, so a position outside this set has nobody to
20
+ * notify or assign.
21
+ */
22
+ export declare function readActivePositionIds(memberships: readonly MembershipRecord[], date: string): ReadonlySet<string>;
23
+ /**
24
+ * The positions an organization-scoped picker offers: those held by a member
25
+ * effective on `date` inside the organization scope. Memberships that have
26
+ * ended or not started yet do not count, the same rule the engine applies.
27
+ */
28
+ export declare function readOrgScopedPositions({ date, includeDescendants, memberships, orgUnitId, orgUnits, positions, }: {
29
+ readonly date: string;
30
+ readonly includeDescendants: boolean;
31
+ readonly memberships: readonly MembershipRecord[];
32
+ readonly orgUnitId: string;
33
+ readonly orgUnits: readonly OrgUnitRecord[];
34
+ readonly positions: readonly PositionRecord[];
35
+ }): readonly PositionRecord[];
36
+ /**
37
+ * Options for an organization-scoped position picker, and whether the stored
38
+ * position has no effective holder in that scope. A stored position outside
39
+ * the scope stays in the options (and so selected), as the POSITION picker
40
+ * keeps an inactive one, so the author sees what the engine will not resolve.
41
+ */
42
+ export declare function readOrgPositionPickerState({ orgUnitId, positionId, positions, scopedPositions, }: {
43
+ readonly orgUnitId: string;
44
+ readonly positionId: string;
45
+ readonly positions: readonly PositionRecord[];
46
+ readonly scopedPositions: readonly PositionRecord[];
47
+ }): {
48
+ readonly isInactive: boolean;
49
+ readonly options: readonly PositionRecord[];
50
+ };
51
+ export declare function readOrgUnitScopeIds(orgUnits: readonly OrgUnitRecord[], orgUnitId: string, includeDescendants: boolean): readonly string[];
@@ -0,0 +1,51 @@
1
+ import { MembershipRecord, OrgUnitRecord, PositionRecord } from '@rytass/bpm-core-client/organization';
2
+ /**
3
+ * Today as `YYYY-MM-DD` in the organization zone, the clock the designer's
4
+ * pickers and dry run share. Mirrors the engine's `formatDateOnlyInTimeZone`;
5
+ * a UTC date is one day behind Taipei between 00:00 and 08:00. `timeZone`
6
+ * must already be resolved (see `useBPMOrganizationTimeZone`).
7
+ */
8
+ export declare function readTodayDateOnlyString(now?: Date, timeZone?: string): string;
9
+ /**
10
+ * Today in the host's organization zone (`organizationTimeZone` on the BPM
11
+ * providers, the value the engine's `BPMRootModule` is given), read on every
12
+ * render, so the designer judges effective dates on the engine's day.
13
+ */
14
+ export declare function useOrganizationTodayDateOnlyString(): string;
15
+ export declare function isMembershipActiveOn(membership: Pick<MembershipRecord, 'effectiveFrom' | 'effectiveTo'>, date: string): boolean;
16
+ /**
17
+ * The positions at least one member holds through a membership that is in
18
+ * effect on `date`. The engine resolves a position or an organization position
19
+ * only through such members, so a position outside this set has nobody to
20
+ * notify or assign.
21
+ */
22
+ export declare function readActivePositionIds(memberships: readonly MembershipRecord[], date: string): ReadonlySet<string>;
23
+ /**
24
+ * The positions an organization-scoped picker offers: those held by a member
25
+ * effective on `date` inside the organization scope. Memberships that have
26
+ * ended or not started yet do not count, the same rule the engine applies.
27
+ */
28
+ export declare function readOrgScopedPositions({ date, includeDescendants, memberships, orgUnitId, orgUnits, positions, }: {
29
+ readonly date: string;
30
+ readonly includeDescendants: boolean;
31
+ readonly memberships: readonly MembershipRecord[];
32
+ readonly orgUnitId: string;
33
+ readonly orgUnits: readonly OrgUnitRecord[];
34
+ readonly positions: readonly PositionRecord[];
35
+ }): readonly PositionRecord[];
36
+ /**
37
+ * Options for an organization-scoped position picker, and whether the stored
38
+ * position has no effective holder in that scope. A stored position outside
39
+ * the scope stays in the options (and so selected), as the POSITION picker
40
+ * keeps an inactive one, so the author sees what the engine will not resolve.
41
+ */
42
+ export declare function readOrgPositionPickerState({ orgUnitId, positionId, positions, scopedPositions, }: {
43
+ readonly orgUnitId: string;
44
+ readonly positionId: string;
45
+ readonly positions: readonly PositionRecord[];
46
+ readonly scopedPositions: readonly PositionRecord[];
47
+ }): {
48
+ readonly isInactive: boolean;
49
+ readonly options: readonly PositionRecord[];
50
+ };
51
+ export declare function readOrgUnitScopeIds(orgUnits: readonly OrgUnitRecord[], orgUnitId: string, includeDescendants: boolean): readonly string[];
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/rolldown-runtime-BocRIvOZ.cjs"),t=require("../../chunks/categories-DQUtVEiV.cjs"),n=require("../../chunks/format-date-time-D-cx5M8z.cjs"),r=require("../../chunks/router-adapter--gYs13E8.cjs"),i=require("../../chunks/routes-config-C1j_vFKo.cjs"),a=require("./versions/index.cjs");let o=require("react"),s=require("@mezzanine-ui/react"),c=require("react/jsx-runtime"),l=require("@rytass/bpm-core-client/workflow"),u=require("@mezzanine-ui/core/form"),d=require("@mezzanine-ui/react/ContentHeader");d=e.t(d,1);let f=require("@mezzanine-ui/icons"),p=require("@rytass/bpm-core-client/template");var m=[10,20,50],h=[{key:`ALL`,label:`全部`},{key:`PUBLISHED`,label:`已發布`},{key:`DRAFT`,label:`草稿`}],g=100;function _(){let e=r.r(),a=i.r(),[_,O]=(0,o.useState)([]),[k,A]=(0,o.useState)(C),[j,M]=(0,o.useState)([]),[N,P]=(0,o.useState)(new Set),[F,I]=(0,o.useState)(null),[L,R]=(0,o.useState)(!0),[z,B]=(0,o.useState)(1),[V,H]=(0,o.useState)(10),[U,W]=(0,o.useState)(``),[G,K]=(0,o.useState)(`ALL`),[q,J]=(0,o.useState)(0),[Y,X]=(0,o.useState)(null),Z=(0,o.useRef)(0),Q=(0,o.useCallback)(async()=>{let e=Z.current+1;Z.current=e,R(!0),I(null),P(new Set),(0,l.listLaunchableTemplates)().then(t=>{e===Z.current&&P(new Set(t.map(e=>e.id)))}).catch(()=>{e===Z.current&&P(new Set)});try{let[t,n]=await Promise.all([(0,p.listApprovalTemplatesPage)({categoryId:k.categoryId,page:z,pageSize:V,searchText:U,status:G===`ALL`?null:G}),(0,p.listApprovalTemplateCategoriesPage)({page:1,pageSize:g,searchText:``,status:`ACTIVE`})]);if(e!==Z.current)return;M([...n.categories.map(w)]),O(t.templates),J(t.totalCount)}catch(t){e===Z.current&&I(v(t))}finally{e===Z.current&&R(!1)}},[k,z,V,U,G]);(0,o.useEffect)(()=>{Q()},[Q]);let $=(0,o.useCallback)(async e=>{X(e.id),I(null);try{await(e.isActive?(0,p.deactivateApprovalTemplate)(e.id):(0,p.activateApprovalTemplate)(e.id)),await Q()}catch(e){I(v(e))}finally{X(null)}},[Q]),ee=(0,o.useMemo)(()=>_.map(e=>({...e,categoryLabel:D(e),key:e.id,status:e.currentVersionId?`PUBLISHED`:`DRAFT`,updatedAt:n.t(e.updatedAt)})),[_]),te=(0,o.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`模板名稱`,width:220},{key:`status`,render:e=>(0,c.jsx)(b,{status:e.status}),title:`狀態`,width:120},{key:`isActive`,render:e=>(0,c.jsx)(x,{isActive:e.isActive}),title:`服務狀態`,width:120},{key:`category`,render:e=>(0,c.jsx)(S,{record:e}),title:`分類`,width:160},{dataIndex:`updatedAt`,key:`updatedAt`,title:`更新時間`,width:220}],[]),ne=(0,o.useMemo)(()=>({render:t=>[{disabled:e=>!N.has(e.id),name:`發起`,onClick:()=>e.push(a.caseNew(t.id)),variant:`base-primary`},{name:`設計`,onClick:()=>e.push(a.templateDesigner(t.id))},{name:`版本`,onClick:()=>e.push(a.templateVersions(t.id))},{disabled:e=>Y===e.id,name:t.isActive?`停用`:`啟用`,onClick:e=>{$(e)},variant:t.isActive?`destructive-secondary`:`base-secondary`}],variant:`base-secondary`,width:264}),[Y,N,e,$]);return(0,c.jsx)(c.Fragment,{children:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.PageHeader,{children:(0,c.jsx)(d.default,{description:`建立流程模板、維護草稿與發布版本。`,title:`簽核模板`,children:(0,c.jsx)(s.Button,{icon:f.PlusIcon,iconType:`leading`,onClick:()=>e.push(a.templateCompose()),variant:`base-primary`,children:`建立模板`})})}),(0,c.jsx)(s.SectionGroup,{children:(0,c.jsxs)(s.Section,{filterArea:(0,c.jsx)(s.FilterArea,{className:t.n.templateFilterArea,size:`sub`,children:(0,c.jsxs)(s.FilterLine,{children:[(0,c.jsx)(s.Filter,{span:3,children:(0,c.jsx)(s.FormField,{fullWidth:!0,layout:u.FormFieldLayout.VERTICAL,name:`templateSearchText`,children:(0,c.jsx)(s.Input,{fullWidth:!0,onChange:e=>{W(e.target.value),B(1)},placeholder:`關鍵字:搜尋模板名稱、分類或描述`,size:`sub`,value:U,variant:`base`})})}),(0,c.jsx)(s.Filter,{span:2,children:(0,c.jsx)(s.FormField,{fullWidth:!0,layout:u.FormFieldLayout.VERTICAL,name:`templateCategoryFilter`,children:(0,c.jsx)(s.Select,{clearable:!1,fullWidth:!0,onChange:e=>{A(T(e,j)),B(1)},options:[C,...j],placeholder:`分類`,renderValue:e=>`分類:${E(e)}`,size:`sub`,value:k})})})]})}),tab:(0,c.jsx)(s.Tab,{activeKey:G,onChange:e=>{K(y(e)),B(1)},children:h.map(e=>(0,c.jsx)(s.TabItem,{children:e.label},e.key))}),children:[F?(0,c.jsx)(s.Typography,{color:`text-error`,variant:`body`,children:F}):null,(0,c.jsx)(s.Table,{actions:ne,columns:te,dataSource:ee,fullWidth:!0,loading:L,pagination:{current:z,onChange:e=>{B(e)},onChangePageSize:e=>{B(1),H(e)},pageSize:V,pageSizeLabel:`每頁筆數`,pageSizeOptions:m,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:q}})]})})]})})}function v(e){return e instanceof Error?e.message:`發生未知錯誤`}function y(e){return e===`PUBLISHED`||e===`DRAFT`?e:`ALL`}function b({status:e}){return e===`PUBLISHED`?(0,c.jsx)(s.Badge,{size:`sub`,text:`已發布`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`草稿`,variant:`dot-inactive`})}function x({isActive:e}){return e?(0,c.jsx)(s.Badge,{size:`sub`,text:`啟用中`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`已停用`,variant:`dot-inactive`})}function S({record:e}){return e.categoryDetail?.isActive===!1?(0,c.jsx)(s.Badge,{size:`sub`,text:`${e.categoryLabel}(停用)`,variant:`dot-inactive`}):(0,c.jsx)(s.Typography,{component:`span`,variant:`body`,children:e.categoryLabel})}var C={categoryId:null,id:`ALL_CATEGORIES`,name:`全部分類`};function w(e){return{categoryId:e.id,id:e.id,name:e.name}}function T(e,t){if(!O(e))return C;let n=typeof e.id==`string`?e.id:null;return n===C.id?C:t.find(e=>e.id===n)??C}function E(e){return Array.isArray(e)||!O(e)?C.name:typeof e.name==`string`?e.name:C.name}function D(e){return e.categoryDetail?.name??e.category??`未分類`}function O(e){return typeof e==`object`&&!!e}exports.TemplateCategoriesView=t.t,exports.TemplateVersionsView=a.TemplateVersionsView,exports.TemplatesView=_;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/rolldown-runtime-BocRIvOZ.cjs"),t=require("../../chunks/categories-CyyqG6wG.cjs"),n=require("../../chunks/format-date-time-D-cx5M8z.cjs"),r=require("../../chunks/router-adapter--gYs13E8.cjs"),i=require("../../chunks/routes-config-C1j_vFKo.cjs"),a=require("./versions/index.cjs");let o=require("react"),s=require("@mezzanine-ui/react"),c=require("react/jsx-runtime"),l=require("@rytass/bpm-core-client/workflow"),u=require("@mezzanine-ui/core/form"),d=require("@mezzanine-ui/react/ContentHeader");d=e.t(d,1);let f=require("@rytass/bpm-core-client/template"),p=require("@mezzanine-ui/icons");var m=[10,20,50],h=[{key:`ALL`,label:`全部`},{key:`PUBLISHED`,label:`已發布`},{key:`DRAFT`,label:`草稿`}],g=100;function _(){let e=r.r(),a=i.r(),[_,O]=(0,o.useState)([]),[k,A]=(0,o.useState)(C),[j,M]=(0,o.useState)([]),[N,P]=(0,o.useState)(new Set),[F,I]=(0,o.useState)(null),[L,R]=(0,o.useState)(!0),[z,B]=(0,o.useState)(1),[V,H]=(0,o.useState)(10),[U,W]=(0,o.useState)(``),[G,K]=(0,o.useState)(`ALL`),[q,J]=(0,o.useState)(0),[Y,X]=(0,o.useState)(null),Z=(0,o.useRef)(0),Q=(0,o.useCallback)(async()=>{let e=Z.current+1;Z.current=e,R(!0),I(null),P(new Set),(0,l.listLaunchableTemplates)().then(t=>{e===Z.current&&P(new Set(t.map(e=>e.id)))}).catch(()=>{e===Z.current&&P(new Set)});try{let[t,n]=await Promise.all([(0,f.listApprovalTemplatesPage)({categoryId:k.categoryId,page:z,pageSize:V,searchText:U,status:G===`ALL`?null:G}),(0,f.listApprovalTemplateCategoriesPage)({page:1,pageSize:g,searchText:``,status:`ACTIVE`})]);if(e!==Z.current)return;M([...n.categories.map(w)]),O(t.templates),J(t.totalCount)}catch(t){e===Z.current&&I(v(t))}finally{e===Z.current&&R(!1)}},[k,z,V,U,G]);(0,o.useEffect)(()=>{Q()},[Q]);let $=(0,o.useCallback)(async e=>{X(e.id),I(null);try{await(e.isActive?(0,f.deactivateApprovalTemplate)(e.id):(0,f.activateApprovalTemplate)(e.id)),await Q()}catch(e){I(v(e))}finally{X(null)}},[Q]),ee=(0,o.useMemo)(()=>_.map(e=>({...e,categoryLabel:D(e),key:e.id,status:e.currentVersionId?`PUBLISHED`:`DRAFT`,updatedAt:n.t(e.updatedAt)})),[_]),te=(0,o.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`模板名稱`,width:220},{key:`status`,render:e=>(0,c.jsx)(b,{status:e.status}),title:`狀態`,width:120},{key:`isActive`,render:e=>(0,c.jsx)(x,{isActive:e.isActive}),title:`服務狀態`,width:120},{key:`category`,render:e=>(0,c.jsx)(S,{record:e}),title:`分類`,width:160},{dataIndex:`updatedAt`,key:`updatedAt`,title:`更新時間`,width:220}],[]),ne=(0,o.useMemo)(()=>({render:t=>[{disabled:e=>!N.has(e.id),name:`發起`,onClick:()=>e.push(a.caseNew(t.id)),variant:`base-primary`},{name:`設計`,onClick:()=>e.push(a.templateDesigner(t.id))},{name:`版本`,onClick:()=>e.push(a.templateVersions(t.id))},{disabled:e=>Y===e.id,name:t.isActive?`停用`:`啟用`,onClick:e=>{$(e)},variant:t.isActive?`destructive-secondary`:`base-secondary`}],variant:`base-secondary`,width:264}),[Y,N,e,$]);return(0,c.jsx)(c.Fragment,{children:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.PageHeader,{children:(0,c.jsx)(d.default,{description:`建立流程模板、維護草稿與發布版本。`,title:`簽核模板`,children:(0,c.jsx)(s.Button,{icon:p.PlusIcon,iconType:`leading`,onClick:()=>e.push(a.templateCompose()),variant:`base-primary`,children:`建立模板`})})}),(0,c.jsx)(s.SectionGroup,{children:(0,c.jsxs)(s.Section,{filterArea:(0,c.jsx)(s.FilterArea,{className:t.n.templateFilterArea,size:`sub`,children:(0,c.jsxs)(s.FilterLine,{children:[(0,c.jsx)(s.Filter,{span:3,children:(0,c.jsx)(s.FormField,{fullWidth:!0,layout:u.FormFieldLayout.VERTICAL,name:`templateSearchText`,children:(0,c.jsx)(s.Input,{fullWidth:!0,onChange:e=>{W(e.target.value),B(1)},placeholder:`關鍵字:搜尋模板名稱、分類或描述`,size:`sub`,value:U,variant:`base`})})}),(0,c.jsx)(s.Filter,{span:2,children:(0,c.jsx)(s.FormField,{fullWidth:!0,layout:u.FormFieldLayout.VERTICAL,name:`templateCategoryFilter`,children:(0,c.jsx)(s.Select,{clearable:!1,fullWidth:!0,onChange:e=>{A(T(e,j)),B(1)},options:[C,...j],placeholder:`分類`,renderValue:e=>`分類:${E(e)}`,size:`sub`,value:k})})})]})}),tab:(0,c.jsx)(s.Tab,{activeKey:G,onChange:e=>{K(y(e)),B(1)},children:h.map(e=>(0,c.jsx)(s.TabItem,{children:e.label},e.key))}),children:[F?(0,c.jsx)(s.Typography,{color:`text-error`,variant:`body`,children:F}):null,(0,c.jsx)(s.Table,{actions:ne,columns:te,dataSource:ee,fullWidth:!0,loading:L,pagination:{current:z,onChange:e=>{B(e)},onChangePageSize:e=>{B(1),H(e)},pageSize:V,pageSizeLabel:`每頁筆數`,pageSizeOptions:m,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:q}})]})})]})})}function v(e){return e instanceof Error?e.message:`發生未知錯誤`}function y(e){return e===`PUBLISHED`||e===`DRAFT`?e:`ALL`}function b({status:e}){return e===`PUBLISHED`?(0,c.jsx)(s.Badge,{size:`sub`,text:`已發布`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`草稿`,variant:`dot-inactive`})}function x({isActive:e}){return e?(0,c.jsx)(s.Badge,{size:`sub`,text:`啟用中`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`已停用`,variant:`dot-inactive`})}function S({record:e}){return e.categoryDetail?.isActive===!1?(0,c.jsx)(s.Badge,{size:`sub`,text:`${e.categoryLabel}(停用)`,variant:`dot-inactive`}):(0,c.jsx)(s.Typography,{component:`span`,variant:`body`,children:e.categoryLabel})}var C={categoryId:null,id:`ALL_CATEGORIES`,name:`全部分類`};function w(e){return{categoryId:e.id,id:e.id,name:e.name}}function T(e,t){if(!O(e))return C;let n=typeof e.id==`string`?e.id:null;return n===C.id?C:t.find(e=>e.id===n)??C}function E(e){return Array.isArray(e)||!O(e)?C.name:typeof e.name==`string`?e.name:C.name}function D(e){return e.categoryDetail?.name??e.category??`未分類`}function O(e){return typeof e==`object`&&!!e}exports.TemplateCategoriesView=t.t,exports.TemplateVersionsView=a.TemplateVersionsView,exports.TemplatesView=_;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["useRouterAdapter","useBPMRoutes","useState","useRef","useCallback","listLaunchableTemplates","listApprovalTemplatesPage","listApprovalTemplateCategoriesPage","deactivateApprovalTemplate","activateApprovalTemplate","useMemo","formatDateTime","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","styles","FilterLine","Filter","FormField","FormFieldLayout","Input","Select","Tab","TabItem","Typography","Table","Badge","require_rolldown_runtime","require_categories","require_format_date_time","require_router_adapter","require_routes_config","require_views_templates_versions_index","react","_mezzanine_ui_react","react_jsx_runtime","_rytass_bpm_core_client_workflow","_mezzanine_ui_core_form","_mezzanine_ui_react_ContentHeader","_mezzanine_ui_icons","_rytass_bpm_core_client_template","TEMPLATE_PAGE_SIZE_OPTIONS","TEMPLATE_STATUS_TABS","TEMPLATE_CATEGORY_PAGE_SIZE","TemplatesView","router","routes","templates","setTemplates","categoryFilter","setCategoryFilter","UNCATEGORIZED_TEMPLATE_FILTER_OPTION","categoryOptions","setCategoryOptions","launchableTemplateIds","setLaunchableTemplateIds","error","setError","loading","setLoading","templatePage","setTemplatePage","templatePageSize","setTemplatePageSize","templateSearchText","setTemplateSearchText","templateStatus","setTemplateStatus","templateTotalCount","setTemplateTotalCount","activationPendingTemplateId","setActivationPendingTemplateId","refreshRequestIdRef","refreshTemplates","requestId","nextLaunchableTemplates","template","templatePageResult","activeCategoryPageResult","readCategoryOption","requestError","readErrorMessage","toggleTemplateActivation","rows","readTemplateCategoryLabel","columns","TemplateStatusBadge","record","TemplateActivationBadge","TemplateCategoryLabel","tableActions","event","readCategoryFilterOption","option","readTemplateCategoryFilterLabel","value","readTemplateStatusTabKey","activeKey","statusTab","page","pageSize","from","to","total","status","isActive","category","isRecord","id","options"],"sources":["../../../src/views/templates/TemplatesView.tsx"],"sourcesContent":["'use client';\n\nimport type { ChangeEvent, Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Badge,\n Button,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport styles from './templates.module.scss';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\nimport {\n ApprovalTemplateListStatus,\n ApprovalTemplateRecord,\n ApprovalTemplateCategoryRecord,\n activateApprovalTemplate,\n deactivateApprovalTemplate,\n listApprovalTemplateCategoriesPage,\n listApprovalTemplatesPage,\n} from '@rytass/bpm-core-client/template';\nimport { listLaunchableTemplates } from '@rytass/bpm-core-client/workflow';\n\nconst TEMPLATE_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst TEMPLATE_STATUS_TABS: readonly {\n readonly key: TemplateStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'PUBLISHED', label: '已發布' },\n { key: 'DRAFT', label: '草稿' },\n];\n\nconst TEMPLATE_CATEGORY_PAGE_SIZE = 100;\n\nexport interface TemplateCategoryOption {\n readonly categoryId: string | null;\n readonly id: string;\n readonly name: string;\n}\n\ntype TemplateStatusTabKey = 'ALL' | ApprovalTemplateListStatus;\n\ntype TemplateRow = Readonly<\n Record<string, unknown> &\n ApprovalTemplateRecord & {\n categoryLabel: string;\n key: string;\n status: ApprovalTemplateListStatus;\n }\n>;\n\nexport function TemplatesView(): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const [templates, setTemplates] = useState<readonly ApprovalTemplateRecord[]>(\n [],\n );\n const [categoryFilter, setCategoryFilter] = useState<TemplateCategoryOption>(\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n );\n const [categoryOptions, setCategoryOptions] = useState<\n readonly TemplateCategoryOption[]\n >([]);\n const [launchableTemplateIds, setLaunchableTemplateIds] = useState<\n ReadonlySet<string>\n >(new Set());\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [templatePage, setTemplatePage] = useState(1);\n const [templatePageSize, setTemplatePageSize] = useState(10);\n const [templateSearchText, setTemplateSearchText] = useState('');\n const [templateStatus, setTemplateStatus] =\n useState<TemplateStatusTabKey>('ALL');\n const [templateTotalCount, setTemplateTotalCount] = useState(0);\n const [activationPendingTemplateId, setActivationPendingTemplateId] =\n useState<string | null>(null);\n const refreshRequestIdRef = useRef(0);\n\n const refreshTemplates = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n setLoading(true);\n setError(null);\n setLaunchableTemplateIds(new Set());\n\n void listLaunchableTemplates()\n .then((nextLaunchableTemplates): void => {\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setLaunchableTemplateIds(\n new Set(nextLaunchableTemplates.map((template) => template.id)),\n );\n })\n .catch((): void => {\n if (requestId === refreshRequestIdRef.current) {\n setLaunchableTemplateIds(new Set());\n }\n });\n\n try {\n const [templatePageResult, activeCategoryPageResult] = await Promise.all([\n listApprovalTemplatesPage({\n categoryId: categoryFilter.categoryId,\n page: templatePage,\n pageSize: templatePageSize,\n searchText: templateSearchText,\n status: templateStatus === 'ALL' ? null : templateStatus,\n }),\n listApprovalTemplateCategoriesPage({\n page: 1,\n pageSize: TEMPLATE_CATEGORY_PAGE_SIZE,\n searchText: '',\n status: 'ACTIVE',\n }),\n ]);\n\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setCategoryOptions([\n ...activeCategoryPageResult.categories.map(readCategoryOption),\n ]);\n setTemplates(templatePageResult.templates);\n setTemplateTotalCount(templatePageResult.totalCount);\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [\n categoryFilter,\n templatePage,\n templatePageSize,\n templateSearchText,\n templateStatus,\n ]);\n\n useEffect((): void => {\n void refreshTemplates();\n }, [refreshTemplates]);\n\n const toggleTemplateActivation = useCallback(\n async (template: ApprovalTemplateRecord): Promise<void> => {\n setActivationPendingTemplateId(template.id);\n setError(null);\n\n try {\n await (template.isActive\n ? deactivateApprovalTemplate(template.id)\n : activateApprovalTemplate(template.id));\n await refreshTemplates();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setActivationPendingTemplateId(null);\n }\n },\n [refreshTemplates],\n );\n\n const rows = useMemo(\n (): TemplateRow[] =>\n templates.map((template) => ({\n ...template,\n categoryLabel: readTemplateCategoryLabel(template),\n key: template.id,\n status: template.currentVersionId ? 'PUBLISHED' : 'DRAFT',\n updatedAt: formatDateTime(template.updatedAt),\n })),\n [templates],\n );\n const columns = useMemo(\n (): TableColumn<TemplateRow>[] => [\n { dataIndex: 'name', key: 'name', title: '模板名稱', width: 220 },\n {\n key: 'status',\n render: (record: TemplateRow): ReactElement => (\n <TemplateStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'isActive',\n render: (record: TemplateRow): ReactElement => (\n <TemplateActivationBadge isActive={record.isActive} />\n ),\n title: '服務狀態',\n width: 120,\n },\n {\n key: 'category',\n render: (record: TemplateRow): ReactElement => (\n <TemplateCategoryLabel record={record} />\n ),\n title: '分類',\n width: 160,\n },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<TemplateRow> => ({\n render: (record): ReturnType<TableActions<TemplateRow>['render']> => [\n {\n disabled: (template): boolean =>\n !launchableTemplateIds.has(template.id),\n name: '發起',\n onClick: (): void => router.push(routes.caseNew(record.id)),\n variant: 'base-primary',\n },\n {\n name: '設計',\n onClick: (): void => router.push(routes.templateDesigner(record.id)),\n },\n {\n name: '版本',\n onClick: (): void => router.push(routes.templateVersions(record.id)),\n },\n {\n disabled: (template): boolean =>\n activationPendingTemplateId === template.id,\n name: record.isActive ? '停用' : '啟用',\n onClick: (template): void => {\n void toggleTemplateActivation(template);\n },\n variant: record.isActive ? 'destructive-secondary' : 'base-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 264,\n }),\n [\n activationPendingTemplateId,\n launchableTemplateIds,\n router,\n toggleTemplateActivation,\n ],\n );\n\n return (\n <>\n <>\n <PageHeader>\n <ContentHeader\n description=\"建立流程模板、維護草稿與發布版本。\"\n title=\"簽核模板\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => router.push(routes.templateCompose())}\n variant=\"base-primary\"\n >\n 建立模板\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.templateFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setTemplateSearchText(event.target.value);\n setTemplatePage(1);\n }}\n placeholder=\"關鍵字:搜尋模板名稱、分類或描述\"\n size=\"sub\"\n value={templateSearchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateCategoryFilter\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setCategoryFilter(\n readCategoryFilterOption(option, categoryOptions),\n );\n setTemplatePage(1);\n }}\n options={[\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n ...categoryOptions,\n ]}\n placeholder=\"分類\"\n renderValue={(value): string =>\n `分類:${readTemplateCategoryFilterLabel(value)}`\n }\n size=\"sub\"\n value={categoryFilter}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={templateStatus}\n onChange={(activeKey): void => {\n setTemplateStatus(readTemplateStatusTabKey(activeKey));\n setTemplatePage(1);\n }}\n >\n {TEMPLATE_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: templatePage,\n onChange: (page): void => {\n setTemplatePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setTemplatePage(1);\n setTemplatePageSize(pageSize);\n },\n pageSize: templatePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: TEMPLATE_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: templateTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </>\n </>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction readTemplateStatusTabKey(activeKey: Key): TemplateStatusTabKey {\n if (activeKey === 'PUBLISHED' || activeKey === 'DRAFT') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction TemplateStatusBadge({\n status,\n}: {\n readonly status: ApprovalTemplateListStatus;\n}): ReactElement {\n if (status === 'PUBLISHED') {\n return <Badge size=\"sub\" text=\"已發布\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"草稿\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateActivationBadge({\n isActive,\n}: {\n readonly isActive: boolean;\n}): ReactElement {\n if (isActive) {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"已停用\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateCategoryLabel({\n record,\n}: {\n readonly record: TemplateRow;\n}): ReactElement {\n if (record.categoryDetail?.isActive === false) {\n return (\n <Badge\n size=\"sub\"\n text={`${record.categoryLabel}(停用)`}\n variant=\"dot-inactive\"\n />\n );\n }\n\n return (\n <Typography component=\"span\" variant=\"body\">\n {record.categoryLabel}\n </Typography>\n );\n}\n\nconst UNCATEGORIZED_TEMPLATE_FILTER_OPTION: TemplateCategoryOption = {\n categoryId: null,\n id: 'ALL_CATEGORIES',\n name: '全部分類',\n};\n\nfunction readCategoryOption(\n category: ApprovalTemplateCategoryRecord,\n): TemplateCategoryOption {\n return {\n categoryId: category.id,\n id: category.id,\n name: category.name,\n };\n}\n\nfunction readCategoryFilterOption(\n value: unknown,\n options: readonly TemplateCategoryOption[],\n): TemplateCategoryOption {\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n const id = typeof value.id === 'string' ? value.id : null;\n\n if (id === UNCATEGORIZED_TEMPLATE_FILTER_OPTION.id) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n return (\n options.find((option) => option.id === id) ??\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION\n );\n}\n\nfunction readTemplateCategoryFilterLabel(value: unknown): string {\n if (Array.isArray(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n return typeof value.name === 'string'\n ? value.name\n : UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n}\n\nfunction readTemplateCategoryLabel(template: ApprovalTemplateRecord): string {\n return template.categoryDetail?.name ?? template.category ?? '未分類';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["useRouterAdapter","useBPMRoutes","useState","useRef","useCallback","listLaunchableTemplates","listApprovalTemplatesPage","listApprovalTemplateCategoriesPage","deactivateApprovalTemplate","activateApprovalTemplate","useMemo","formatDateTime","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","styles","FilterLine","Filter","FormField","FormFieldLayout","Input","Select","Tab","TabItem","Typography","Table","Badge","require_rolldown_runtime","require_categories","require_format_date_time","require_router_adapter","require_routes_config","require_views_templates_versions_index","react","_mezzanine_ui_react","react_jsx_runtime","_rytass_bpm_core_client_workflow","_mezzanine_ui_core_form","_mezzanine_ui_react_ContentHeader","_rytass_bpm_core_client_template","_mezzanine_ui_icons","TEMPLATE_PAGE_SIZE_OPTIONS","TEMPLATE_STATUS_TABS","TEMPLATE_CATEGORY_PAGE_SIZE","TemplatesView","router","routes","templates","setTemplates","categoryFilter","setCategoryFilter","UNCATEGORIZED_TEMPLATE_FILTER_OPTION","categoryOptions","setCategoryOptions","launchableTemplateIds","setLaunchableTemplateIds","error","setError","loading","setLoading","templatePage","setTemplatePage","templatePageSize","setTemplatePageSize","templateSearchText","setTemplateSearchText","templateStatus","setTemplateStatus","templateTotalCount","setTemplateTotalCount","activationPendingTemplateId","setActivationPendingTemplateId","refreshRequestIdRef","refreshTemplates","requestId","nextLaunchableTemplates","template","templatePageResult","activeCategoryPageResult","readCategoryOption","requestError","readErrorMessage","toggleTemplateActivation","rows","readTemplateCategoryLabel","columns","TemplateStatusBadge","record","TemplateActivationBadge","TemplateCategoryLabel","tableActions","event","readCategoryFilterOption","option","readTemplateCategoryFilterLabel","value","readTemplateStatusTabKey","activeKey","statusTab","page","pageSize","from","to","total","status","isActive","category","isRecord","id","options"],"sources":["../../../src/views/templates/TemplatesView.tsx"],"sourcesContent":["'use client';\n\nimport type { ChangeEvent, Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Badge,\n Button,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport styles from './templates.module.scss';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\nimport {\n ApprovalTemplateListStatus,\n ApprovalTemplateRecord,\n ApprovalTemplateCategoryRecord,\n activateApprovalTemplate,\n deactivateApprovalTemplate,\n listApprovalTemplateCategoriesPage,\n listApprovalTemplatesPage,\n} from '@rytass/bpm-core-client/template';\nimport { listLaunchableTemplates } from '@rytass/bpm-core-client/workflow';\n\nconst TEMPLATE_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst TEMPLATE_STATUS_TABS: readonly {\n readonly key: TemplateStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'PUBLISHED', label: '已發布' },\n { key: 'DRAFT', label: '草稿' },\n];\n\nconst TEMPLATE_CATEGORY_PAGE_SIZE = 100;\n\nexport interface TemplateCategoryOption {\n readonly categoryId: string | null;\n readonly id: string;\n readonly name: string;\n}\n\ntype TemplateStatusTabKey = 'ALL' | ApprovalTemplateListStatus;\n\ntype TemplateRow = Readonly<\n Record<string, unknown> &\n ApprovalTemplateRecord & {\n categoryLabel: string;\n key: string;\n status: ApprovalTemplateListStatus;\n }\n>;\n\nexport function TemplatesView(): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const [templates, setTemplates] = useState<readonly ApprovalTemplateRecord[]>(\n [],\n );\n const [categoryFilter, setCategoryFilter] = useState<TemplateCategoryOption>(\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n );\n const [categoryOptions, setCategoryOptions] = useState<\n readonly TemplateCategoryOption[]\n >([]);\n const [launchableTemplateIds, setLaunchableTemplateIds] = useState<\n ReadonlySet<string>\n >(new Set());\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [templatePage, setTemplatePage] = useState(1);\n const [templatePageSize, setTemplatePageSize] = useState(10);\n const [templateSearchText, setTemplateSearchText] = useState('');\n const [templateStatus, setTemplateStatus] =\n useState<TemplateStatusTabKey>('ALL');\n const [templateTotalCount, setTemplateTotalCount] = useState(0);\n const [activationPendingTemplateId, setActivationPendingTemplateId] =\n useState<string | null>(null);\n const refreshRequestIdRef = useRef(0);\n\n const refreshTemplates = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n setLoading(true);\n setError(null);\n setLaunchableTemplateIds(new Set());\n\n void listLaunchableTemplates()\n .then((nextLaunchableTemplates): void => {\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setLaunchableTemplateIds(\n new Set(nextLaunchableTemplates.map((template) => template.id)),\n );\n })\n .catch((): void => {\n if (requestId === refreshRequestIdRef.current) {\n setLaunchableTemplateIds(new Set());\n }\n });\n\n try {\n const [templatePageResult, activeCategoryPageResult] = await Promise.all([\n listApprovalTemplatesPage({\n categoryId: categoryFilter.categoryId,\n page: templatePage,\n pageSize: templatePageSize,\n searchText: templateSearchText,\n status: templateStatus === 'ALL' ? null : templateStatus,\n }),\n listApprovalTemplateCategoriesPage({\n page: 1,\n pageSize: TEMPLATE_CATEGORY_PAGE_SIZE,\n searchText: '',\n status: 'ACTIVE',\n }),\n ]);\n\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setCategoryOptions([\n ...activeCategoryPageResult.categories.map(readCategoryOption),\n ]);\n setTemplates(templatePageResult.templates);\n setTemplateTotalCount(templatePageResult.totalCount);\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [\n categoryFilter,\n templatePage,\n templatePageSize,\n templateSearchText,\n templateStatus,\n ]);\n\n useEffect((): void => {\n void refreshTemplates();\n }, [refreshTemplates]);\n\n const toggleTemplateActivation = useCallback(\n async (template: ApprovalTemplateRecord): Promise<void> => {\n setActivationPendingTemplateId(template.id);\n setError(null);\n\n try {\n await (template.isActive\n ? deactivateApprovalTemplate(template.id)\n : activateApprovalTemplate(template.id));\n await refreshTemplates();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setActivationPendingTemplateId(null);\n }\n },\n [refreshTemplates],\n );\n\n const rows = useMemo(\n (): TemplateRow[] =>\n templates.map((template) => ({\n ...template,\n categoryLabel: readTemplateCategoryLabel(template),\n key: template.id,\n status: template.currentVersionId ? 'PUBLISHED' : 'DRAFT',\n updatedAt: formatDateTime(template.updatedAt),\n })),\n [templates],\n );\n const columns = useMemo(\n (): TableColumn<TemplateRow>[] => [\n { dataIndex: 'name', key: 'name', title: '模板名稱', width: 220 },\n {\n key: 'status',\n render: (record: TemplateRow): ReactElement => (\n <TemplateStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'isActive',\n render: (record: TemplateRow): ReactElement => (\n <TemplateActivationBadge isActive={record.isActive} />\n ),\n title: '服務狀態',\n width: 120,\n },\n {\n key: 'category',\n render: (record: TemplateRow): ReactElement => (\n <TemplateCategoryLabel record={record} />\n ),\n title: '分類',\n width: 160,\n },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<TemplateRow> => ({\n render: (record): ReturnType<TableActions<TemplateRow>['render']> => [\n {\n disabled: (template): boolean =>\n !launchableTemplateIds.has(template.id),\n name: '發起',\n onClick: (): void => router.push(routes.caseNew(record.id)),\n variant: 'base-primary',\n },\n {\n name: '設計',\n onClick: (): void => router.push(routes.templateDesigner(record.id)),\n },\n {\n name: '版本',\n onClick: (): void => router.push(routes.templateVersions(record.id)),\n },\n {\n disabled: (template): boolean =>\n activationPendingTemplateId === template.id,\n name: record.isActive ? '停用' : '啟用',\n onClick: (template): void => {\n void toggleTemplateActivation(template);\n },\n variant: record.isActive ? 'destructive-secondary' : 'base-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 264,\n }),\n [\n activationPendingTemplateId,\n launchableTemplateIds,\n router,\n toggleTemplateActivation,\n ],\n );\n\n return (\n <>\n <>\n <PageHeader>\n <ContentHeader\n description=\"建立流程模板、維護草稿與發布版本。\"\n title=\"簽核模板\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => router.push(routes.templateCompose())}\n variant=\"base-primary\"\n >\n 建立模板\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.templateFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setTemplateSearchText(event.target.value);\n setTemplatePage(1);\n }}\n placeholder=\"關鍵字:搜尋模板名稱、分類或描述\"\n size=\"sub\"\n value={templateSearchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateCategoryFilter\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setCategoryFilter(\n readCategoryFilterOption(option, categoryOptions),\n );\n setTemplatePage(1);\n }}\n options={[\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n ...categoryOptions,\n ]}\n placeholder=\"分類\"\n renderValue={(value): string =>\n `分類:${readTemplateCategoryFilterLabel(value)}`\n }\n size=\"sub\"\n value={categoryFilter}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={templateStatus}\n onChange={(activeKey): void => {\n setTemplateStatus(readTemplateStatusTabKey(activeKey));\n setTemplatePage(1);\n }}\n >\n {TEMPLATE_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: templatePage,\n onChange: (page): void => {\n setTemplatePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setTemplatePage(1);\n setTemplatePageSize(pageSize);\n },\n pageSize: templatePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: TEMPLATE_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: templateTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </>\n </>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction readTemplateStatusTabKey(activeKey: Key): TemplateStatusTabKey {\n if (activeKey === 'PUBLISHED' || activeKey === 'DRAFT') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction TemplateStatusBadge({\n status,\n}: {\n readonly status: ApprovalTemplateListStatus;\n}): ReactElement {\n if (status === 'PUBLISHED') {\n return <Badge size=\"sub\" text=\"已發布\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"草稿\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateActivationBadge({\n isActive,\n}: {\n readonly isActive: boolean;\n}): ReactElement {\n if (isActive) {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"已停用\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateCategoryLabel({\n record,\n}: {\n readonly record: TemplateRow;\n}): ReactElement {\n if (record.categoryDetail?.isActive === false) {\n return (\n <Badge\n size=\"sub\"\n text={`${record.categoryLabel}(停用)`}\n variant=\"dot-inactive\"\n />\n );\n }\n\n return (\n <Typography component=\"span\" variant=\"body\">\n {record.categoryLabel}\n </Typography>\n );\n}\n\nconst UNCATEGORIZED_TEMPLATE_FILTER_OPTION: TemplateCategoryOption = {\n categoryId: null,\n id: 'ALL_CATEGORIES',\n name: '全部分類',\n};\n\nfunction readCategoryOption(\n category: ApprovalTemplateCategoryRecord,\n): TemplateCategoryOption {\n return {\n categoryId: category.id,\n id: category.id,\n name: category.name,\n };\n}\n\nfunction readCategoryFilterOption(\n value: unknown,\n options: readonly TemplateCategoryOption[],\n): TemplateCategoryOption {\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n const id = typeof value.id === 'string' ? value.id : null;\n\n if (id === UNCATEGORIZED_TEMPLATE_FILTER_OPTION.id) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n return (\n options.find((option) => option.id === id) ??\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION\n );\n}\n\nfunction readTemplateCategoryFilterLabel(value: unknown): string {\n if (Array.isArray(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n return typeof value.name === 'string'\n ? value.name\n : UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n}\n\nfunction readTemplateCategoryLabel(template: ApprovalTemplateRecord): string {\n return template.categoryDetail?.name ?? template.category ?? '未分類';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { n as e, t } from "../../chunks/categories-BAdxjNSA.js";
2
+ import { n as e, t } from "../../chunks/categories-f7E-RJEc.js";
3
3
  import { t as n } from "../../chunks/format-date-time-B0LdmWg4.js";
4
4
  import { r as ee } from "../../chunks/router-adapter-CkxCyzf5.js";
5
5
  import { r as te } from "../../chunks/routes-config-BcNaWJWJ.js";
@@ -10,8 +10,8 @@ import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
10
10
  import { listLaunchableTemplates as le } from "@rytass/bpm-core-client/workflow";
11
11
  import { FormFieldLayout as b } from "@mezzanine-ui/core/form";
12
12
  import ue from "@mezzanine-ui/react/ContentHeader";
13
- import { PlusIcon as de } from "@mezzanine-ui/icons";
14
- import { activateApprovalTemplate as fe, deactivateApprovalTemplate as pe, listApprovalTemplateCategoriesPage as me, listApprovalTemplatesPage as he } from "@rytass/bpm-core-client/template";
13
+ import { activateApprovalTemplate as de, deactivateApprovalTemplate as fe, listApprovalTemplateCategoriesPage as pe, listApprovalTemplatesPage as me } from "@rytass/bpm-core-client/template";
14
+ import { PlusIcon as he } from "@mezzanine-ui/icons";
15
15
  // src/views/templates/TemplatesView.tsx
16
16
  var x = [
17
17
  10,
@@ -40,13 +40,13 @@ function w() {
40
40
  e === Z.current && B(/* @__PURE__ */ new Set());
41
41
  });
42
42
  try {
43
- let [t, n] = await Promise.all([he({
43
+ let [t, n] = await Promise.all([me({
44
44
  categoryId: F.categoryId,
45
45
  page: W,
46
46
  pageSize: K,
47
47
  searchText: q,
48
48
  status: J === "ALL" ? null : J
49
- }), me({
49
+ }), pe({
50
50
  page: 1,
51
51
  pageSize: C,
52
52
  searchText: "",
@@ -72,7 +72,7 @@ function w() {
72
72
  let $ = i(async (e) => {
73
73
  X(e.id), H(null);
74
74
  try {
75
- await (e.isActive ? pe(e.id) : fe(e.id)), await Q();
75
+ await (e.isActive ? fe(e.id) : de(e.id)), await Q();
76
76
  } catch (e) {
77
77
  H(T(e));
78
78
  } finally {
@@ -152,7 +152,7 @@ function w() {
152
152
  description: "建立流程模板、維護草稿與發布版本。",
153
153
  title: "簽核模板",
154
154
  children: /* @__PURE__ */ v(re, {
155
- icon: de,
155
+ icon: he,
156
156
  iconType: "leading",
157
157
  onClick: () => t.push(r.templateCompose()),
158
158
  variant: "base-primary",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rytass/bpm-core-react",
3
- "version": "0.20.1",
3
+ "version": "0.21.1",
4
4
  "description": "BPM approval workflow React components and views for the Rytass BPM stack. Ships AuthProvider, NotificationDrawer + bell widget, host-facing hooks (useBPMMember / useBPMLogout / useBPMRoutes), and full page-body views for inbox / instances / templates / forms / admin / settings on top of Mezzanine UI and the BPM client functions. The host owns the navigation shell — BPM does not bundle a layout.",
5
5
  "keywords": [
6
6
  "bpm",
@@ -536,8 +536,8 @@
536
536
  "@mezzanine-ui/core": ">=1.0.0",
537
537
  "@mezzanine-ui/icons": ">=1.0.0",
538
538
  "@mezzanine-ui/react": ">=1.0.0",
539
- "@rytass/bpm-core-client": "^0.20.1",
540
- "@rytass/bpm-core-shared": "^0.20.1",
539
+ "@rytass/bpm-core-client": "^0.21.1",
540
+ "@rytass/bpm-core-shared": "^0.21.1",
541
541
  "@uiw/react-codemirror": ">=4.0.0",
542
542
  "@xyflow/react": ">=12.0.0",
543
543
  "ai": ">=6.0.0",