@amaster.ai/bpm-ui 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Amaster Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,116 @@
1
+ # @amaster.ai/bpm-ui
2
+
3
+ BPM task management UI components for React applications.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @amaster.ai/bpm-ui @amaster.ai/bpm-client
9
+ ```
10
+
11
+ ## Components
12
+
13
+ ### MyTasksPage
14
+
15
+ Displays current user's pending tasks.
16
+
17
+ ```tsx
18
+ import { createBpmClient } from "@amaster.ai/bpm-client";
19
+ import { MyTasksPage, addBpmTranslations } from "@amaster.ai/bpm-ui";
20
+ import i18n from "i18next";
21
+
22
+ // Add translations
23
+ addBpmTranslations(i18n);
24
+
25
+ function MyTasks() {
26
+ const bpmClient = createBpmClient();
27
+
28
+ return (
29
+ <MyTasksPage
30
+ bpmClient={bpmClient}
31
+ currentUser="admin"
32
+ onApprove={(task) => {
33
+ window.location.href = `/approve?taskId=${task.id}`;
34
+ }}
35
+ />
36
+ );
37
+ }
38
+ ```
39
+
40
+ ### MyHistoryTasksPage
41
+
42
+ Displays current user's completed tasks.
43
+
44
+ ```tsx
45
+ import { MyHistoryTasksPage } from "@amaster.ai/bpm-ui";
46
+
47
+ function MyHistory() {
48
+ const bpmClient = createBpmClient();
49
+
50
+ return <MyHistoryTasksPage bpmClient={bpmClient} currentUser="admin" />;
51
+ }
52
+ ```
53
+
54
+ ### ApproveTaskPage
55
+
56
+ Task approval form with customizable fields.
57
+
58
+ ```tsx
59
+ import { ApproveTaskPage } from "@amaster.ai/bpm-ui";
60
+
61
+ function ApproveTask({ taskId }: { taskId: string }) {
62
+ const bpmClient = createBpmClient();
63
+
64
+ return (
65
+ <ApproveTaskPage
66
+ taskId={taskId}
67
+ bpmClient={bpmClient}
68
+ renderForm={(formVariables, onChange) => (
69
+ <div>
70
+ {/* Custom form fields based on formVariables */}
71
+ <input type="text" onChange={(e) => onChange("comment", e.target.value)} />
72
+ </div>
73
+ )}
74
+ onApproved={() => {
75
+ window.location.href = "/my-tasks";
76
+ }}
77
+ onRejected={() => {
78
+ window.location.href = "/my-tasks";
79
+ }}
80
+ />
81
+ );
82
+ }
83
+ ```
84
+
85
+ ## i18n
86
+
87
+ The package includes translations for English and Chinese. Add them to your i18next instance:
88
+
89
+ ```tsx
90
+ import { addBpmTranslations } from "@amaster.ai/bpm-ui";
91
+ import i18n from "i18next";
92
+
93
+ addBpmTranslations(i18n);
94
+ ```
95
+
96
+ Or import translations directly:
97
+
98
+ ```tsx
99
+ import { bpmTranslations } from "@amaster.ai/bpm-ui/i18n";
100
+ ```
101
+
102
+ ## Styling
103
+
104
+ Components use BEM-style class names (`bpm-*`). Provide your own styles or use with a UI library.
105
+
106
+ CSS class names:
107
+
108
+ - `.bpm-tasks-page` - Tasks page container
109
+ - `.bpm-history-page` - History page container
110
+ - `.bpm-approve-page` - Approve page container
111
+ - `.bpm-table` - Table element
112
+ - `.bpm-btn` - Button base
113
+ - `.bpm-btn-primary` - Primary button
114
+ - `.bpm-btn-danger` - Danger button
115
+ - `.bpm-btn-outline` - Outline button
116
+ - `.bpm-error` - Error message
@@ -0,0 +1,2 @@
1
+ 'use strict';var a={en:{taskList:{myTasks:"My Tasks",myHistory:"My Completed Tasks",taskName:"Task Name",processInstance:"Process Instance",createdAt:"Created At",dueDate:"Due Date",startTime:"Start Time",endTime:"End Time",duration:"Duration",actions:"Actions",approve:"Approve",refresh:"Refresh",loading:"Loading...",noTasks:"No pending tasks",noHistory:"No completed tasks"},approveTask:{approve:"Approve",reject:"Reject",cancel:"Cancel",notFound:"Task not found",loading:"Loading...",submitting:"Submitting..."}},"zh-CN":{taskList:{myTasks:"\u6211\u7684\u5F85\u529E",myHistory:"\u6211\u7684\u5DF2\u529E",taskName:"\u4EFB\u52A1\u540D\u79F0",processInstance:"\u6D41\u7A0B\u5B9E\u4F8B",createdAt:"\u521B\u5EFA\u65F6\u95F4",dueDate:"\u622A\u6B62\u65F6\u95F4",startTime:"\u5F00\u59CB\u65F6\u95F4",endTime:"\u7ED3\u675F\u65F6\u95F4",duration:"\u8017\u65F6",actions:"\u64CD\u4F5C",approve:"\u5BA1\u6279",refresh:"\u5237\u65B0",loading:"\u52A0\u8F7D\u4E2D...",noTasks:"\u6682\u65E0\u5F85\u529E\u4EFB\u52A1",noHistory:"\u6682\u65E0\u5DF2\u529E\u4EFB\u52A1"},approveTask:{approve:"\u540C\u610F",reject:"\u62D2\u7EDD",cancel:"\u53D6\u6D88",notFound:"\u4EFB\u52A1\u4E0D\u5B58\u5728",loading:"\u52A0\u8F7D\u4E2D...",submitting:"\u63D0\u4EA4\u4E2D..."}}};function n(e){Object.entries(a).forEach(([t,s])=>{e.addResourceBundle(t,"bpm",s,true,true);});}exports.addBpmTranslations=n;exports.bpmTranslations=a;//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/i18n/index.ts"],"names":["bpmTranslations","addBpmTranslations","i18n","lng","resources"],"mappings":"aAAO,IAAMA,CAAAA,CAAkB,CAC7B,EAAA,CAAI,CACF,QAAA,CAAU,CACR,OAAA,CAAS,UAAA,CACT,SAAA,CAAW,oBAAA,CACX,QAAA,CAAU,WAAA,CACV,eAAA,CAAiB,kBAAA,CACjB,SAAA,CAAW,YAAA,CACX,OAAA,CAAS,UAAA,CACT,SAAA,CAAW,YAAA,CACX,OAAA,CAAS,UAAA,CACT,QAAA,CAAU,UAAA,CACV,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,QAAS,SAAA,CACT,OAAA,CAAS,YAAA,CACT,OAAA,CAAS,kBAAA,CACT,SAAA,CAAW,oBACb,CAAA,CACA,WAAA,CAAa,CACX,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,gBAAA,CACV,OAAA,CAAS,YAAA,CACT,UAAA,CAAY,eACd,CACF,CAAA,CACA,OAAA,CAAS,CACP,QAAA,CAAU,CACR,OAAA,CAAS,0BAAA,CACT,SAAA,CAAW,0BAAA,CACX,SAAU,0BAAA,CACV,eAAA,CAAiB,0BAAA,CACjB,SAAA,CAAW,0BAAA,CACX,OAAA,CAAS,0BAAA,CACT,SAAA,CAAW,0BAAA,CACX,OAAA,CAAS,0BAAA,CACT,QAAA,CAAU,cAAA,CACV,OAAA,CAAS,cAAA,CACT,OAAA,CAAS,cAAA,CACT,OAAA,CAAS,cAAA,CACT,OAAA,CAAS,uBAAA,CACT,OAAA,CAAS,sCAAA,CACT,SAAA,CAAW,sCACb,CAAA,CACA,WAAA,CAAa,CACX,OAAA,CAAS,cAAA,CACT,MAAA,CAAQ,cAAA,CACR,OAAQ,cAAA,CACR,QAAA,CAAU,gCAAA,CACV,OAAA,CAAS,uBAAA,CACT,UAAA,CAAY,uBACd,CACF,CACF,EAKO,SAASC,CAAAA,CAAmBC,CAAAA,CAQhC,CACD,MAAA,CAAO,OAAA,CAAQF,CAAe,CAAA,CAAE,OAAA,CAAQ,CAAC,CAACG,CAAAA,CAAKC,CAAS,CAAA,GAAM,CAC5DF,CAAAA,CAAK,iBAAA,CAAkBC,CAAAA,CAAK,KAAA,CAAOC,CAAAA,CAAW,IAAA,CAAM,IAAI,EAC1D,CAAC,EACH","file":"index.cjs","sourcesContent":["export const bpmTranslations = {\n en: {\n taskList: {\n myTasks: \"My Tasks\",\n myHistory: \"My Completed Tasks\",\n taskName: \"Task Name\",\n processInstance: \"Process Instance\",\n createdAt: \"Created At\",\n dueDate: \"Due Date\",\n startTime: \"Start Time\",\n endTime: \"End Time\",\n duration: \"Duration\",\n actions: \"Actions\",\n approve: \"Approve\",\n refresh: \"Refresh\",\n loading: \"Loading...\",\n noTasks: \"No pending tasks\",\n noHistory: \"No completed tasks\",\n },\n approveTask: {\n approve: \"Approve\",\n reject: \"Reject\",\n cancel: \"Cancel\",\n notFound: \"Task not found\",\n loading: \"Loading...\",\n submitting: \"Submitting...\",\n },\n },\n \"zh-CN\": {\n taskList: {\n myTasks: \"我的待办\",\n myHistory: \"我的已办\",\n taskName: \"任务名称\",\n processInstance: \"流程实例\",\n createdAt: \"创建时间\",\n dueDate: \"截止时间\",\n startTime: \"开始时间\",\n endTime: \"结束时间\",\n duration: \"耗时\",\n actions: \"操作\",\n approve: \"审批\",\n refresh: \"刷新\",\n loading: \"加载中...\",\n noTasks: \"暂无待办任务\",\n noHistory: \"暂无已办任务\",\n },\n approveTask: {\n approve: \"同意\",\n reject: \"拒绝\",\n cancel: \"取消\",\n notFound: \"任务不存在\",\n loading: \"加载中...\",\n submitting: \"提交中...\",\n },\n },\n};\n\n/**\n * Add BPM translations to i18next instance\n */\nexport function addBpmTranslations(i18n: {\n addResourceBundle: (\n lng: string,\n ns: string,\n resources: Record<string, unknown>,\n deep?: boolean,\n overwrite?: boolean\n ) => void;\n}) {\n Object.entries(bpmTranslations).forEach(([lng, resources]) => {\n i18n.addResourceBundle(lng, \"bpm\", resources, true, true);\n });\n}\n"]}
@@ -0,0 +1,64 @@
1
+ declare const bpmTranslations: {
2
+ en: {
3
+ taskList: {
4
+ myTasks: string;
5
+ myHistory: string;
6
+ taskName: string;
7
+ processInstance: string;
8
+ createdAt: string;
9
+ dueDate: string;
10
+ startTime: string;
11
+ endTime: string;
12
+ duration: string;
13
+ actions: string;
14
+ approve: string;
15
+ refresh: string;
16
+ loading: string;
17
+ noTasks: string;
18
+ noHistory: string;
19
+ };
20
+ approveTask: {
21
+ approve: string;
22
+ reject: string;
23
+ cancel: string;
24
+ notFound: string;
25
+ loading: string;
26
+ submitting: string;
27
+ };
28
+ };
29
+ "zh-CN": {
30
+ taskList: {
31
+ myTasks: string;
32
+ myHistory: string;
33
+ taskName: string;
34
+ processInstance: string;
35
+ createdAt: string;
36
+ dueDate: string;
37
+ startTime: string;
38
+ endTime: string;
39
+ duration: string;
40
+ actions: string;
41
+ approve: string;
42
+ refresh: string;
43
+ loading: string;
44
+ noTasks: string;
45
+ noHistory: string;
46
+ };
47
+ approveTask: {
48
+ approve: string;
49
+ reject: string;
50
+ cancel: string;
51
+ notFound: string;
52
+ loading: string;
53
+ submitting: string;
54
+ };
55
+ };
56
+ };
57
+ /**
58
+ * Add BPM translations to i18next instance
59
+ */
60
+ declare function addBpmTranslations(i18n: {
61
+ addResourceBundle: (lng: string, ns: string, resources: Record<string, unknown>, deep?: boolean, overwrite?: boolean) => void;
62
+ }): void;
63
+
64
+ export { addBpmTranslations, bpmTranslations };
@@ -0,0 +1,64 @@
1
+ declare const bpmTranslations: {
2
+ en: {
3
+ taskList: {
4
+ myTasks: string;
5
+ myHistory: string;
6
+ taskName: string;
7
+ processInstance: string;
8
+ createdAt: string;
9
+ dueDate: string;
10
+ startTime: string;
11
+ endTime: string;
12
+ duration: string;
13
+ actions: string;
14
+ approve: string;
15
+ refresh: string;
16
+ loading: string;
17
+ noTasks: string;
18
+ noHistory: string;
19
+ };
20
+ approveTask: {
21
+ approve: string;
22
+ reject: string;
23
+ cancel: string;
24
+ notFound: string;
25
+ loading: string;
26
+ submitting: string;
27
+ };
28
+ };
29
+ "zh-CN": {
30
+ taskList: {
31
+ myTasks: string;
32
+ myHistory: string;
33
+ taskName: string;
34
+ processInstance: string;
35
+ createdAt: string;
36
+ dueDate: string;
37
+ startTime: string;
38
+ endTime: string;
39
+ duration: string;
40
+ actions: string;
41
+ approve: string;
42
+ refresh: string;
43
+ loading: string;
44
+ noTasks: string;
45
+ noHistory: string;
46
+ };
47
+ approveTask: {
48
+ approve: string;
49
+ reject: string;
50
+ cancel: string;
51
+ notFound: string;
52
+ loading: string;
53
+ submitting: string;
54
+ };
55
+ };
56
+ };
57
+ /**
58
+ * Add BPM translations to i18next instance
59
+ */
60
+ declare function addBpmTranslations(i18n: {
61
+ addResourceBundle: (lng: string, ns: string, resources: Record<string, unknown>, deep?: boolean, overwrite?: boolean) => void;
62
+ }): void;
63
+
64
+ export { addBpmTranslations, bpmTranslations };
@@ -0,0 +1,2 @@
1
+ var a={en:{taskList:{myTasks:"My Tasks",myHistory:"My Completed Tasks",taskName:"Task Name",processInstance:"Process Instance",createdAt:"Created At",dueDate:"Due Date",startTime:"Start Time",endTime:"End Time",duration:"Duration",actions:"Actions",approve:"Approve",refresh:"Refresh",loading:"Loading...",noTasks:"No pending tasks",noHistory:"No completed tasks"},approveTask:{approve:"Approve",reject:"Reject",cancel:"Cancel",notFound:"Task not found",loading:"Loading...",submitting:"Submitting..."}},"zh-CN":{taskList:{myTasks:"\u6211\u7684\u5F85\u529E",myHistory:"\u6211\u7684\u5DF2\u529E",taskName:"\u4EFB\u52A1\u540D\u79F0",processInstance:"\u6D41\u7A0B\u5B9E\u4F8B",createdAt:"\u521B\u5EFA\u65F6\u95F4",dueDate:"\u622A\u6B62\u65F6\u95F4",startTime:"\u5F00\u59CB\u65F6\u95F4",endTime:"\u7ED3\u675F\u65F6\u95F4",duration:"\u8017\u65F6",actions:"\u64CD\u4F5C",approve:"\u5BA1\u6279",refresh:"\u5237\u65B0",loading:"\u52A0\u8F7D\u4E2D...",noTasks:"\u6682\u65E0\u5F85\u529E\u4EFB\u52A1",noHistory:"\u6682\u65E0\u5DF2\u529E\u4EFB\u52A1"},approveTask:{approve:"\u540C\u610F",reject:"\u62D2\u7EDD",cancel:"\u53D6\u6D88",notFound:"\u4EFB\u52A1\u4E0D\u5B58\u5728",loading:"\u52A0\u8F7D\u4E2D...",submitting:"\u63D0\u4EA4\u4E2D..."}}};function n(e){Object.entries(a).forEach(([t,s])=>{e.addResourceBundle(t,"bpm",s,true,true);});}export{n as addBpmTranslations,a as bpmTranslations};//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/i18n/index.ts"],"names":["bpmTranslations","addBpmTranslations","i18n","lng","resources"],"mappings":"AAAO,IAAMA,CAAAA,CAAkB,CAC7B,EAAA,CAAI,CACF,QAAA,CAAU,CACR,OAAA,CAAS,UAAA,CACT,SAAA,CAAW,oBAAA,CACX,QAAA,CAAU,WAAA,CACV,eAAA,CAAiB,kBAAA,CACjB,SAAA,CAAW,YAAA,CACX,OAAA,CAAS,UAAA,CACT,SAAA,CAAW,YAAA,CACX,OAAA,CAAS,UAAA,CACT,QAAA,CAAU,UAAA,CACV,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,QAAS,SAAA,CACT,OAAA,CAAS,YAAA,CACT,OAAA,CAAS,kBAAA,CACT,SAAA,CAAW,oBACb,CAAA,CACA,WAAA,CAAa,CACX,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,gBAAA,CACV,OAAA,CAAS,YAAA,CACT,UAAA,CAAY,eACd,CACF,CAAA,CACA,OAAA,CAAS,CACP,QAAA,CAAU,CACR,OAAA,CAAS,0BAAA,CACT,SAAA,CAAW,0BAAA,CACX,SAAU,0BAAA,CACV,eAAA,CAAiB,0BAAA,CACjB,SAAA,CAAW,0BAAA,CACX,OAAA,CAAS,0BAAA,CACT,SAAA,CAAW,0BAAA,CACX,OAAA,CAAS,0BAAA,CACT,QAAA,CAAU,cAAA,CACV,OAAA,CAAS,cAAA,CACT,OAAA,CAAS,cAAA,CACT,OAAA,CAAS,cAAA,CACT,OAAA,CAAS,uBAAA,CACT,OAAA,CAAS,sCAAA,CACT,SAAA,CAAW,sCACb,CAAA,CACA,WAAA,CAAa,CACX,OAAA,CAAS,cAAA,CACT,MAAA,CAAQ,cAAA,CACR,OAAQ,cAAA,CACR,QAAA,CAAU,gCAAA,CACV,OAAA,CAAS,uBAAA,CACT,UAAA,CAAY,uBACd,CACF,CACF,EAKO,SAASC,CAAAA,CAAmBC,CAAAA,CAQhC,CACD,MAAA,CAAO,OAAA,CAAQF,CAAe,CAAA,CAAE,OAAA,CAAQ,CAAC,CAACG,CAAAA,CAAKC,CAAS,CAAA,GAAM,CAC5DF,CAAAA,CAAK,iBAAA,CAAkBC,CAAAA,CAAK,KAAA,CAAOC,CAAAA,CAAW,IAAA,CAAM,IAAI,EAC1D,CAAC,EACH","file":"index.js","sourcesContent":["export const bpmTranslations = {\n en: {\n taskList: {\n myTasks: \"My Tasks\",\n myHistory: \"My Completed Tasks\",\n taskName: \"Task Name\",\n processInstance: \"Process Instance\",\n createdAt: \"Created At\",\n dueDate: \"Due Date\",\n startTime: \"Start Time\",\n endTime: \"End Time\",\n duration: \"Duration\",\n actions: \"Actions\",\n approve: \"Approve\",\n refresh: \"Refresh\",\n loading: \"Loading...\",\n noTasks: \"No pending tasks\",\n noHistory: \"No completed tasks\",\n },\n approveTask: {\n approve: \"Approve\",\n reject: \"Reject\",\n cancel: \"Cancel\",\n notFound: \"Task not found\",\n loading: \"Loading...\",\n submitting: \"Submitting...\",\n },\n },\n \"zh-CN\": {\n taskList: {\n myTasks: \"我的待办\",\n myHistory: \"我的已办\",\n taskName: \"任务名称\",\n processInstance: \"流程实例\",\n createdAt: \"创建时间\",\n dueDate: \"截止时间\",\n startTime: \"开始时间\",\n endTime: \"结束时间\",\n duration: \"耗时\",\n actions: \"操作\",\n approve: \"审批\",\n refresh: \"刷新\",\n loading: \"加载中...\",\n noTasks: \"暂无待办任务\",\n noHistory: \"暂无已办任务\",\n },\n approveTask: {\n approve: \"同意\",\n reject: \"拒绝\",\n cancel: \"取消\",\n notFound: \"任务不存在\",\n loading: \"加载中...\",\n submitting: \"提交中...\",\n },\n },\n};\n\n/**\n * Add BPM translations to i18next instance\n */\nexport function addBpmTranslations(i18n: {\n addResourceBundle: (\n lng: string,\n ns: string,\n resources: Record<string, unknown>,\n deep?: boolean,\n overwrite?: boolean\n ) => void;\n}) {\n Object.entries(bpmTranslations).forEach(([lng, resources]) => {\n i18n.addResourceBundle(lng, \"bpm\", resources, true, true);\n });\n}\n"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),reactI18next=require('react-i18next'),jsxRuntime=require('react/jsx-runtime');function j({bpmClient:n,currentUser:p,onApprove:f,renderTaskName:k,renderActions:L,onRefresh:P,className:r=""}){let{t:s}=reactI18next.useTranslation("bpm"),[l,g]=react.useState([]),[T,y]=react.useState(false),[v,b]=react.useState(null),h=react.useCallback(async()=>{y(true),b(null);try{let{data:e,error:i}=await n.getTasks({assignee:p});i?b(i.message):g(e||[]);}catch(e){b(e instanceof Error?e.message:"Failed to fetch tasks");}finally{y(false);}},[n,p]);react.useEffect(()=>{h();},[h]);let R=()=>{h(),P?.();},C=e=>{f?.(e);},t=e=>e?new Date(e).toLocaleString():"-",m=e=>jsxRuntime.jsx("button",{type:"button",onClick:()=>C(e),className:"bpm-btn bpm-btn-outline",children:s("taskList.approve","Approve")});return jsxRuntime.jsxs("div",{className:`bpm-tasks-page ${r}`,children:[jsxRuntime.jsxs("div",{className:"bpm-tasks-header",children:[jsxRuntime.jsx("h1",{className:"bpm-tasks-title",children:s("taskList.myTasks","My Tasks")}),jsxRuntime.jsx("button",{type:"button",onClick:R,disabled:T,className:"bpm-btn bpm-btn-outline",children:T?s("taskList.loading","Loading..."):s("taskList.refresh","Refresh")})]}),v&&jsxRuntime.jsx("div",{className:"bpm-error",children:v}),jsxRuntime.jsxs("table",{className:"bpm-table",children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{children:[jsxRuntime.jsx("th",{children:s("taskList.taskName","Task Name")}),jsxRuntime.jsx("th",{children:s("taskList.processInstance","Process Instance")}),jsxRuntime.jsx("th",{children:s("taskList.createdAt","Created At")}),jsxRuntime.jsx("th",{children:s("taskList.dueDate","Due Date")}),jsxRuntime.jsx("th",{children:s("taskList.actions","Actions")})]})}),jsxRuntime.jsx("tbody",{children:l.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colSpan:5,className:"bpm-table-empty",children:T?s("taskList.loading","Loading..."):s("taskList.noTasks","No pending tasks")})}):l.map(e=>jsxRuntime.jsxs("tr",{children:[jsxRuntime.jsx("td",{children:k?k(e):e.name}),jsxRuntime.jsxs("td",{className:"bpm-mono",children:[e.processInstanceId?.slice(0,8),"..."]}),jsxRuntime.jsx("td",{children:t(e.created)}),jsxRuntime.jsx("td",{children:t(e.due)}),jsxRuntime.jsx("td",{children:L?L(e,m(e)):m(e)})]},e.id))})]})]})}function G({bpmClient:n,currentUser:p,renderTaskName:f,renderActions:k,onRefresh:L,className:P=""}){let{t:r}=reactI18next.useTranslation("bpm"),[s,l]=react.useState([]),[g,T]=react.useState(false),[y,v]=react.useState(null),b=react.useCallback(async()=>{T(true),v(null);try{let{data:t,error:m}=await n.getHistoryTasks({taskAssignee:p,finished:!0});m?v(m.message):l(t||[]);}catch(t){v(t instanceof Error?t.message:"Failed to fetch history");}finally{T(false);}},[n,p]);react.useEffect(()=>{b();},[b]);let h=()=>{b(),L?.();},R=t=>t?new Date(t).toLocaleString():"-",C=(t,m)=>{if(!t||!m)return "-";let e=new Date(m).getTime()-new Date(t).getTime(),i=Math.floor(e/6e4),N=Math.floor(i/60),D=Math.floor(N/24);return D>0?`${D}d ${N%24}h`:N>0?`${N}h ${i%60}m`:`${i}m`};return jsxRuntime.jsxs("div",{className:`bpm-history-page ${P}`,children:[jsxRuntime.jsxs("div",{className:"bpm-tasks-header",children:[jsxRuntime.jsx("h1",{className:"bpm-tasks-title",children:r("taskList.myHistory","My Completed Tasks")}),jsxRuntime.jsx("button",{type:"button",onClick:h,disabled:g,className:"bpm-btn bpm-btn-outline",children:g?r("taskList.loading","Loading..."):r("taskList.refresh","Refresh")})]}),y&&jsxRuntime.jsx("div",{className:"bpm-error",children:y}),jsxRuntime.jsxs("table",{className:"bpm-table",children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{children:[jsxRuntime.jsx("th",{children:r("taskList.taskName","Task Name")}),jsxRuntime.jsx("th",{children:r("taskList.processInstance","Process Instance")}),jsxRuntime.jsx("th",{children:r("taskList.startTime","Start Time")}),jsxRuntime.jsx("th",{children:r("taskList.endTime","End Time")}),jsxRuntime.jsx("th",{children:r("taskList.duration","Duration")}),k&&jsxRuntime.jsx("th",{children:r("taskList.actions","Actions")})]})}),jsxRuntime.jsx("tbody",{children:s.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colSpan:k?6:5,className:"bpm-table-empty",children:g?r("taskList.loading","Loading..."):r("taskList.noHistory","No completed tasks")})}):s.map(t=>jsxRuntime.jsxs("tr",{children:[jsxRuntime.jsx("td",{children:f?f(t):t.name}),jsxRuntime.jsxs("td",{className:"bpm-mono",children:[t.processInstanceId?.slice(0,8),"..."]}),jsxRuntime.jsx("td",{children:R(t.startTime)}),jsxRuntime.jsx("td",{children:R(t.endTime)}),jsxRuntime.jsx("td",{children:C(t.startTime,t.endTime)}),k&&jsxRuntime.jsx("td",{children:k(t)})]},t.id))})]})]})}function U({taskId:n,bpmClient:p,renderForm:f,onApproved:k,onRejected:L,onCancel:P,additionalVariables:r={},className:s=""}){let{t:l}=reactI18next.useTranslation("bpm"),[g,T]=react.useState(null),[y,v]=react.useState({}),[b,h]=react.useState({}),[R,C]=react.useState(true),[t,m]=react.useState(false),[e,i]=react.useState(null),N=react.useCallback(async()=>{C(true),i(null);try{let[d,u]=await Promise.all([p.getTask(n),p.getTaskFormVariables(n)]);if(d.error){i(d.error.message);return}if(u.error){i(u.error.message);return}T(d.data),v(u.data||{});}catch(d){i(d instanceof Error?d.message:"Failed to load task");}finally{C(false);}},[p,n]);react.useEffect(()=>{n&&N();},[n,N]);let D=(d,u)=>{h(F=>({...F,[d]:u}));},B=async d=>{m(true),i(null);try{let u={...b,...r,approvalStatus:d?"approved":"rejected"},{error:F}=await p.completeTask(n,u);if(F){i(F.message);return}d?k?.():L?.();}catch(u){i(u instanceof Error?u.message:"Failed to complete task");}finally{m(false);}};return R?jsxRuntime.jsx("div",{className:`bpm-approve-page bpm-loading ${s}`,children:l("approveTask.loading","Loading...")}):g?jsxRuntime.jsx("div",{className:`bpm-approve-page ${s}`,children:jsxRuntime.jsxs("div",{className:"bpm-approve-card",children:[jsxRuntime.jsx("div",{className:"bpm-approve-header",children:jsxRuntime.jsx("h2",{className:"bpm-approve-title",children:g.name})}),jsxRuntime.jsxs("div",{className:"bpm-approve-content",children:[e&&jsxRuntime.jsx("div",{className:"bpm-error",children:e}),jsxRuntime.jsx("div",{className:"bpm-approve-form",children:f(y,D)}),jsxRuntime.jsxs("div",{className:"bpm-approve-actions",children:[jsxRuntime.jsx("button",{type:"button",onClick:()=>B(true),disabled:t,className:"bpm-btn bpm-btn-primary",children:t?l("approveTask.submitting","Submitting..."):l("approveTask.approve","Approve")}),jsxRuntime.jsx("button",{type:"button",onClick:()=>B(false),disabled:t,className:"bpm-btn bpm-btn-danger",children:t?l("approveTask.submitting","Submitting..."):l("approveTask.reject","Reject")}),P&&jsxRuntime.jsx("button",{type:"button",onClick:P,disabled:t,className:"bpm-btn bpm-btn-outline",children:l("approveTask.cancel","Cancel")})]})]})]})}):jsxRuntime.jsx("div",{className:`bpm-approve-page ${s}`,children:jsxRuntime.jsx("div",{className:"bpm-error",children:l("approveTask.notFound","Task not found")})})}var S={en:{taskList:{myTasks:"My Tasks",myHistory:"My Completed Tasks",taskName:"Task Name",processInstance:"Process Instance",createdAt:"Created At",dueDate:"Due Date",startTime:"Start Time",endTime:"End Time",duration:"Duration",actions:"Actions",approve:"Approve",refresh:"Refresh",loading:"Loading...",noTasks:"No pending tasks",noHistory:"No completed tasks"},approveTask:{approve:"Approve",reject:"Reject",cancel:"Cancel",notFound:"Task not found",loading:"Loading...",submitting:"Submitting..."}},"zh-CN":{taskList:{myTasks:"\u6211\u7684\u5F85\u529E",myHistory:"\u6211\u7684\u5DF2\u529E",taskName:"\u4EFB\u52A1\u540D\u79F0",processInstance:"\u6D41\u7A0B\u5B9E\u4F8B",createdAt:"\u521B\u5EFA\u65F6\u95F4",dueDate:"\u622A\u6B62\u65F6\u95F4",startTime:"\u5F00\u59CB\u65F6\u95F4",endTime:"\u7ED3\u675F\u65F6\u95F4",duration:"\u8017\u65F6",actions:"\u64CD\u4F5C",approve:"\u5BA1\u6279",refresh:"\u5237\u65B0",loading:"\u52A0\u8F7D\u4E2D...",noTasks:"\u6682\u65E0\u5F85\u529E\u4EFB\u52A1",noHistory:"\u6682\u65E0\u5DF2\u529E\u4EFB\u52A1"},approveTask:{approve:"\u540C\u610F",reject:"\u62D2\u7EDD",cancel:"\u53D6\u6D88",notFound:"\u4EFB\u52A1\u4E0D\u5B58\u5728",loading:"\u52A0\u8F7D\u4E2D...",submitting:"\u63D0\u4EA4\u4E2D..."}}};function W(n){Object.entries(S).forEach(([p,f])=>{n.addResourceBundle(p,"bpm",f,true,true);});}exports.ApproveTaskPage=U;exports.MyHistoryTasksPage=G;exports.MyTasksPage=j;exports.addBpmTranslations=W;exports.bpmTranslations=S;//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pages/MyTasksPage.tsx","../src/pages/MyHistoryTasksPage.tsx","../src/pages/ApproveTaskPage.tsx","../src/i18n/index.ts"],"names":["MyTasksPage","bpmClient","currentUser","onApprove","renderTaskName","renderActions","onRefresh","className","t","useTranslation","tasks","setTasks","useState","loading","setLoading","error","setError","fetchTasks","useCallback","data","fetchError","err","useEffect","handleRefresh","handleApprove","task","formatDate","dateString","defaultActionButton","jsx","jsxs","MyHistoryTasksPage","formatDuration","start","end","diffMs","diffMins","diffHours","diffDays","ApproveTaskPage","taskId","renderForm","onApproved","onRejected","onCancel","additionalVariables","setTask","formVariables","setFormVariables","formValues","setFormValues","submitting","setSubmitting","fetchTaskData","taskRes","varsRes","handleFieldChange","field","value","prev","handleComplete","approved","variables","completeError","bpmTranslations","addBpmTranslations","i18n","lng","resources"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { Task, BpmClient } from \"@amaster.ai/bpm-client\";\n\nexport interface MyTasksPageProps {\n /** BPM client instance */\n bpmClient: BpmClient;\n /** Current user identifier */\n currentUser: string;\n /** Called when clicking approve button */\n onApprove?: (task: Task) => void;\n /** Custom render for task name cell */\n renderTaskName?: (task: Task) => React.ReactNode;\n /** Custom render for actions cell */\n renderActions?: (task: Task, defaultAction: React.ReactNode) => React.ReactNode;\n /** Called when task list is refreshed */\n onRefresh?: () => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * My Tasks Page - displays current user's pending tasks\n *\n * This is a shared component that can be used across different applications.\n * Each application sees the same UI but fetches different data based on the currentUser.\n */\nexport function MyTasksPage({\n bpmClient,\n currentUser,\n onApprove,\n renderTaskName,\n renderActions,\n onRefresh,\n className = \"\",\n}: MyTasksPageProps) {\n const { t } = useTranslation(\"bpm\");\n const [tasks, setTasks] = useState<Task[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchTasks = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const { data, error: fetchError } = await bpmClient.getTasks({\n assignee: currentUser,\n });\n if (fetchError) {\n setError(fetchError.message);\n } else {\n setTasks(data || []);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch tasks\");\n } finally {\n setLoading(false);\n }\n }, [bpmClient, currentUser]);\n\n useEffect(() => {\n fetchTasks();\n }, [fetchTasks]);\n\n const handleRefresh = () => {\n fetchTasks();\n onRefresh?.();\n };\n\n const handleApprove = (task: Task) => {\n onApprove?.(task);\n };\n\n const formatDate = (dateString: string | null | undefined) => {\n if (!dateString) return \"-\";\n return new Date(dateString).toLocaleString();\n };\n\n const defaultActionButton = (task: Task) => (\n <button type=\"button\" onClick={() => handleApprove(task)} className=\"bpm-btn bpm-btn-outline\">\n {t(\"taskList.approve\", \"Approve\")}\n </button>\n );\n\n return (\n <div className={`bpm-tasks-page ${className}`}>\n <div className=\"bpm-tasks-header\">\n <h1 className=\"bpm-tasks-title\">{t(\"taskList.myTasks\", \"My Tasks\")}</h1>\n <button\n type=\"button\"\n onClick={handleRefresh}\n disabled={loading}\n className=\"bpm-btn bpm-btn-outline\"\n >\n {loading ? t(\"taskList.loading\", \"Loading...\") : t(\"taskList.refresh\", \"Refresh\")}\n </button>\n </div>\n\n {error && <div className=\"bpm-error\">{error}</div>}\n\n <table className=\"bpm-table\">\n <thead>\n <tr>\n <th>{t(\"taskList.taskName\", \"Task Name\")}</th>\n <th>{t(\"taskList.processInstance\", \"Process Instance\")}</th>\n <th>{t(\"taskList.createdAt\", \"Created At\")}</th>\n <th>{t(\"taskList.dueDate\", \"Due Date\")}</th>\n <th>{t(\"taskList.actions\", \"Actions\")}</th>\n </tr>\n </thead>\n <tbody>\n {tasks.length === 0 ? (\n <tr>\n <td colSpan={5} className=\"bpm-table-empty\">\n {loading\n ? t(\"taskList.loading\", \"Loading...\")\n : t(\"taskList.noTasks\", \"No pending tasks\")}\n </td>\n </tr>\n ) : (\n tasks.map((task) => (\n <tr key={task.id}>\n <td>{renderTaskName ? renderTaskName(task) : task.name}</td>\n <td className=\"bpm-mono\">{task.processInstanceId?.slice(0, 8)}...</td>\n <td>{formatDate(task.created)}</td>\n <td>{formatDate(task.due)}</td>\n <td>\n {renderActions\n ? renderActions(task, defaultActionButton(task))\n : defaultActionButton(task)}\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport type { Task };\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { HistoryTask, BpmClient } from \"@amaster.ai/bpm-client\";\n\nexport interface MyHistoryTasksPageProps {\n /** BPM client instance */\n bpmClient: BpmClient;\n /** Current user identifier */\n currentUser: string;\n /** Custom render for task name cell */\n renderTaskName?: (task: HistoryTask) => React.ReactNode;\n /** Custom render for actions cell */\n renderActions?: (task: HistoryTask) => React.ReactNode;\n /** Called when task list is refreshed */\n onRefresh?: () => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * My History Tasks Page - displays current user's completed tasks\n */\nexport function MyHistoryTasksPage({\n bpmClient,\n currentUser,\n renderTaskName,\n renderActions,\n onRefresh,\n className = \"\",\n}: MyHistoryTasksPageProps) {\n const { t } = useTranslation(\"bpm\");\n const [tasks, setTasks] = useState<HistoryTask[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchTasks = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const { data, error: fetchError } = await bpmClient.getHistoryTasks({\n taskAssignee: currentUser,\n finished: true,\n });\n if (fetchError) {\n setError(fetchError.message);\n } else {\n setTasks(data || []);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch history\");\n } finally {\n setLoading(false);\n }\n }, [bpmClient, currentUser]);\n\n useEffect(() => {\n fetchTasks();\n }, [fetchTasks]);\n\n const handleRefresh = () => {\n fetchTasks();\n onRefresh?.();\n };\n\n const formatDate = (dateString: string | null | undefined) => {\n if (!dateString) return \"-\";\n return new Date(dateString).toLocaleString();\n };\n\n const formatDuration = (start: string | null | undefined, end: string | null | undefined) => {\n if (!start || !end) return \"-\";\n const diffMs = new Date(end).getTime() - new Date(start).getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffDays > 0) return `${diffDays}d ${diffHours % 24}h`;\n if (diffHours > 0) return `${diffHours}h ${diffMins % 60}m`;\n return `${diffMins}m`;\n };\n\n return (\n <div className={`bpm-history-page ${className}`}>\n <div className=\"bpm-tasks-header\">\n <h1 className=\"bpm-tasks-title\">{t(\"taskList.myHistory\", \"My Completed Tasks\")}</h1>\n <button\n type=\"button\"\n onClick={handleRefresh}\n disabled={loading}\n className=\"bpm-btn bpm-btn-outline\"\n >\n {loading ? t(\"taskList.loading\", \"Loading...\") : t(\"taskList.refresh\", \"Refresh\")}\n </button>\n </div>\n\n {error && <div className=\"bpm-error\">{error}</div>}\n\n <table className=\"bpm-table\">\n <thead>\n <tr>\n <th>{t(\"taskList.taskName\", \"Task Name\")}</th>\n <th>{t(\"taskList.processInstance\", \"Process Instance\")}</th>\n <th>{t(\"taskList.startTime\", \"Start Time\")}</th>\n <th>{t(\"taskList.endTime\", \"End Time\")}</th>\n <th>{t(\"taskList.duration\", \"Duration\")}</th>\n {renderActions && <th>{t(\"taskList.actions\", \"Actions\")}</th>}\n </tr>\n </thead>\n <tbody>\n {tasks.length === 0 ? (\n <tr>\n <td colSpan={renderActions ? 6 : 5} className=\"bpm-table-empty\">\n {loading\n ? t(\"taskList.loading\", \"Loading...\")\n : t(\"taskList.noHistory\", \"No completed tasks\")}\n </td>\n </tr>\n ) : (\n tasks.map((task) => (\n <tr key={task.id}>\n <td>{renderTaskName ? renderTaskName(task) : task.name}</td>\n <td className=\"bpm-mono\">{task.processInstanceId?.slice(0, 8)}...</td>\n <td>{formatDate(task.startTime)}</td>\n <td>{formatDate(task.endTime)}</td>\n <td>{formatDuration(task.startTime, task.endTime)}</td>\n {renderActions && <td>{renderActions(task)}</td>}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport type { HistoryTask };\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { BpmClient, TaskFormVariables, Task } from \"@amaster.ai/bpm-client\";\n\nexport interface ApproveTaskPageProps {\n /** Task ID to approve */\n taskId: string;\n /** BPM client instance */\n bpmClient: BpmClient;\n /** Render form fields based on form variables */\n renderForm: (\n formVariables: TaskFormVariables,\n onFieldChange: (field: string, value: unknown) => void\n ) => React.ReactNode;\n /** Called after successful approval */\n onApproved?: () => void;\n /** Called after rejection */\n onRejected?: () => void;\n /** Called on cancel */\n onCancel?: () => void;\n /** Additional variables to include when completing task */\n additionalVariables?: Record<string, unknown>;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Approve Task Page - displays task details and form for approval\n */\nexport function ApproveTaskPage({\n taskId,\n bpmClient,\n renderForm,\n onApproved,\n onRejected,\n onCancel,\n additionalVariables = {},\n className = \"\",\n}: ApproveTaskPageProps) {\n const { t } = useTranslation(\"bpm\");\n const [task, setTask] = useState<Task | null>(null);\n const [formVariables, setFormVariables] = useState<TaskFormVariables>({});\n const [formValues, setFormValues] = useState<Record<string, unknown>>({});\n const [loading, setLoading] = useState(true);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchTaskData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const [taskRes, varsRes] = await Promise.all([\n bpmClient.getTask(taskId),\n bpmClient.getTaskFormVariables(taskId),\n ]);\n\n if (taskRes.error) {\n setError(taskRes.error.message);\n return;\n }\n if (varsRes.error) {\n setError(varsRes.error.message);\n return;\n }\n\n setTask(taskRes.data);\n setFormVariables(varsRes.data || {});\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load task\");\n } finally {\n setLoading(false);\n }\n }, [bpmClient, taskId]);\n\n useEffect(() => {\n if (taskId) {\n fetchTaskData();\n }\n }, [taskId, fetchTaskData]);\n\n const handleFieldChange = (field: string, value: unknown) => {\n setFormValues((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleComplete = async (approved: boolean) => {\n setSubmitting(true);\n setError(null);\n try {\n const variables = {\n ...formValues,\n ...additionalVariables,\n approvalStatus: approved ? \"approved\" : \"rejected\",\n };\n\n const { error: completeError } = await bpmClient.completeTask(taskId, variables);\n\n if (completeError) {\n setError(completeError.message);\n return;\n }\n\n if (approved) {\n onApproved?.();\n } else {\n onRejected?.();\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to complete task\");\n } finally {\n setSubmitting(false);\n }\n };\n\n if (loading) {\n return (\n <div className={`bpm-approve-page bpm-loading ${className}`}>\n {t(\"approveTask.loading\", \"Loading...\")}\n </div>\n );\n }\n\n if (!task) {\n return (\n <div className={`bpm-approve-page ${className}`}>\n <div className=\"bpm-error\">{t(\"approveTask.notFound\", \"Task not found\")}</div>\n </div>\n );\n }\n\n return (\n <div className={`bpm-approve-page ${className}`}>\n <div className=\"bpm-approve-card\">\n <div className=\"bpm-approve-header\">\n <h2 className=\"bpm-approve-title\">{task.name}</h2>\n </div>\n <div className=\"bpm-approve-content\">\n {error && <div className=\"bpm-error\">{error}</div>}\n\n <div className=\"bpm-approve-form\">{renderForm(formVariables, handleFieldChange)}</div>\n\n <div className=\"bpm-approve-actions\">\n <button\n type=\"button\"\n onClick={() => handleComplete(true)}\n disabled={submitting}\n className=\"bpm-btn bpm-btn-primary\"\n >\n {submitting\n ? t(\"approveTask.submitting\", \"Submitting...\")\n : t(\"approveTask.approve\", \"Approve\")}\n </button>\n <button\n type=\"button\"\n onClick={() => handleComplete(false)}\n disabled={submitting}\n className=\"bpm-btn bpm-btn-danger\"\n >\n {submitting\n ? t(\"approveTask.submitting\", \"Submitting...\")\n : t(\"approveTask.reject\", \"Reject\")}\n </button>\n {onCancel && (\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={submitting}\n className=\"bpm-btn bpm-btn-outline\"\n >\n {t(\"approveTask.cancel\", \"Cancel\")}\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport type { TaskFormVariables };\n","export const bpmTranslations = {\n en: {\n taskList: {\n myTasks: \"My Tasks\",\n myHistory: \"My Completed Tasks\",\n taskName: \"Task Name\",\n processInstance: \"Process Instance\",\n createdAt: \"Created At\",\n dueDate: \"Due Date\",\n startTime: \"Start Time\",\n endTime: \"End Time\",\n duration: \"Duration\",\n actions: \"Actions\",\n approve: \"Approve\",\n refresh: \"Refresh\",\n loading: \"Loading...\",\n noTasks: \"No pending tasks\",\n noHistory: \"No completed tasks\",\n },\n approveTask: {\n approve: \"Approve\",\n reject: \"Reject\",\n cancel: \"Cancel\",\n notFound: \"Task not found\",\n loading: \"Loading...\",\n submitting: \"Submitting...\",\n },\n },\n \"zh-CN\": {\n taskList: {\n myTasks: \"我的待办\",\n myHistory: \"我的已办\",\n taskName: \"任务名称\",\n processInstance: \"流程实例\",\n createdAt: \"创建时间\",\n dueDate: \"截止时间\",\n startTime: \"开始时间\",\n endTime: \"结束时间\",\n duration: \"耗时\",\n actions: \"操作\",\n approve: \"审批\",\n refresh: \"刷新\",\n loading: \"加载中...\",\n noTasks: \"暂无待办任务\",\n noHistory: \"暂无已办任务\",\n },\n approveTask: {\n approve: \"同意\",\n reject: \"拒绝\",\n cancel: \"取消\",\n notFound: \"任务不存在\",\n loading: \"加载中...\",\n submitting: \"提交中...\",\n },\n },\n};\n\n/**\n * Add BPM translations to i18next instance\n */\nexport function addBpmTranslations(i18n: {\n addResourceBundle: (\n lng: string,\n ns: string,\n resources: Record<string, unknown>,\n deep?: boolean,\n overwrite?: boolean\n ) => void;\n}) {\n Object.entries(bpmTranslations).forEach(([lng, resources]) => {\n i18n.addResourceBundle(lng, \"bpm\", resources, true, true);\n });\n}\n"]}
@@ -0,0 +1,72 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { BpmClient, Task, HistoryTask, TaskFormVariables } from '@amaster.ai/bpm-client';
3
+ export { BpmClient, HistoryTask, Task, TaskFormVariables } from '@amaster.ai/bpm-client';
4
+ export { addBpmTranslations, bpmTranslations } from './i18n/index.cjs';
5
+
6
+ interface MyTasksPageProps {
7
+ /** BPM client instance */
8
+ bpmClient: BpmClient;
9
+ /** Current user identifier */
10
+ currentUser: string;
11
+ /** Called when clicking approve button */
12
+ onApprove?: (task: Task) => void;
13
+ /** Custom render for task name cell */
14
+ renderTaskName?: (task: Task) => React.ReactNode;
15
+ /** Custom render for actions cell */
16
+ renderActions?: (task: Task, defaultAction: React.ReactNode) => React.ReactNode;
17
+ /** Called when task list is refreshed */
18
+ onRefresh?: () => void;
19
+ /** Additional class name */
20
+ className?: string;
21
+ }
22
+ /**
23
+ * My Tasks Page - displays current user's pending tasks
24
+ *
25
+ * This is a shared component that can be used across different applications.
26
+ * Each application sees the same UI but fetches different data based on the currentUser.
27
+ */
28
+ declare function MyTasksPage({ bpmClient, currentUser, onApprove, renderTaskName, renderActions, onRefresh, className, }: MyTasksPageProps): react_jsx_runtime.JSX.Element;
29
+
30
+ interface MyHistoryTasksPageProps {
31
+ /** BPM client instance */
32
+ bpmClient: BpmClient;
33
+ /** Current user identifier */
34
+ currentUser: string;
35
+ /** Custom render for task name cell */
36
+ renderTaskName?: (task: HistoryTask) => React.ReactNode;
37
+ /** Custom render for actions cell */
38
+ renderActions?: (task: HistoryTask) => React.ReactNode;
39
+ /** Called when task list is refreshed */
40
+ onRefresh?: () => void;
41
+ /** Additional class name */
42
+ className?: string;
43
+ }
44
+ /**
45
+ * My History Tasks Page - displays current user's completed tasks
46
+ */
47
+ declare function MyHistoryTasksPage({ bpmClient, currentUser, renderTaskName, renderActions, onRefresh, className, }: MyHistoryTasksPageProps): react_jsx_runtime.JSX.Element;
48
+
49
+ interface ApproveTaskPageProps {
50
+ /** Task ID to approve */
51
+ taskId: string;
52
+ /** BPM client instance */
53
+ bpmClient: BpmClient;
54
+ /** Render form fields based on form variables */
55
+ renderForm: (formVariables: TaskFormVariables, onFieldChange: (field: string, value: unknown) => void) => React.ReactNode;
56
+ /** Called after successful approval */
57
+ onApproved?: () => void;
58
+ /** Called after rejection */
59
+ onRejected?: () => void;
60
+ /** Called on cancel */
61
+ onCancel?: () => void;
62
+ /** Additional variables to include when completing task */
63
+ additionalVariables?: Record<string, unknown>;
64
+ /** Additional class name */
65
+ className?: string;
66
+ }
67
+ /**
68
+ * Approve Task Page - displays task details and form for approval
69
+ */
70
+ declare function ApproveTaskPage({ taskId, bpmClient, renderForm, onApproved, onRejected, onCancel, additionalVariables, className, }: ApproveTaskPageProps): react_jsx_runtime.JSX.Element;
71
+
72
+ export { ApproveTaskPage, type ApproveTaskPageProps, MyHistoryTasksPage, type MyHistoryTasksPageProps, MyTasksPage, type MyTasksPageProps };
@@ -0,0 +1,72 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { BpmClient, Task, HistoryTask, TaskFormVariables } from '@amaster.ai/bpm-client';
3
+ export { BpmClient, HistoryTask, Task, TaskFormVariables } from '@amaster.ai/bpm-client';
4
+ export { addBpmTranslations, bpmTranslations } from './i18n/index.js';
5
+
6
+ interface MyTasksPageProps {
7
+ /** BPM client instance */
8
+ bpmClient: BpmClient;
9
+ /** Current user identifier */
10
+ currentUser: string;
11
+ /** Called when clicking approve button */
12
+ onApprove?: (task: Task) => void;
13
+ /** Custom render for task name cell */
14
+ renderTaskName?: (task: Task) => React.ReactNode;
15
+ /** Custom render for actions cell */
16
+ renderActions?: (task: Task, defaultAction: React.ReactNode) => React.ReactNode;
17
+ /** Called when task list is refreshed */
18
+ onRefresh?: () => void;
19
+ /** Additional class name */
20
+ className?: string;
21
+ }
22
+ /**
23
+ * My Tasks Page - displays current user's pending tasks
24
+ *
25
+ * This is a shared component that can be used across different applications.
26
+ * Each application sees the same UI but fetches different data based on the currentUser.
27
+ */
28
+ declare function MyTasksPage({ bpmClient, currentUser, onApprove, renderTaskName, renderActions, onRefresh, className, }: MyTasksPageProps): react_jsx_runtime.JSX.Element;
29
+
30
+ interface MyHistoryTasksPageProps {
31
+ /** BPM client instance */
32
+ bpmClient: BpmClient;
33
+ /** Current user identifier */
34
+ currentUser: string;
35
+ /** Custom render for task name cell */
36
+ renderTaskName?: (task: HistoryTask) => React.ReactNode;
37
+ /** Custom render for actions cell */
38
+ renderActions?: (task: HistoryTask) => React.ReactNode;
39
+ /** Called when task list is refreshed */
40
+ onRefresh?: () => void;
41
+ /** Additional class name */
42
+ className?: string;
43
+ }
44
+ /**
45
+ * My History Tasks Page - displays current user's completed tasks
46
+ */
47
+ declare function MyHistoryTasksPage({ bpmClient, currentUser, renderTaskName, renderActions, onRefresh, className, }: MyHistoryTasksPageProps): react_jsx_runtime.JSX.Element;
48
+
49
+ interface ApproveTaskPageProps {
50
+ /** Task ID to approve */
51
+ taskId: string;
52
+ /** BPM client instance */
53
+ bpmClient: BpmClient;
54
+ /** Render form fields based on form variables */
55
+ renderForm: (formVariables: TaskFormVariables, onFieldChange: (field: string, value: unknown) => void) => React.ReactNode;
56
+ /** Called after successful approval */
57
+ onApproved?: () => void;
58
+ /** Called after rejection */
59
+ onRejected?: () => void;
60
+ /** Called on cancel */
61
+ onCancel?: () => void;
62
+ /** Additional variables to include when completing task */
63
+ additionalVariables?: Record<string, unknown>;
64
+ /** Additional class name */
65
+ className?: string;
66
+ }
67
+ /**
68
+ * Approve Task Page - displays task details and form for approval
69
+ */
70
+ declare function ApproveTaskPage({ taskId, bpmClient, renderForm, onApproved, onRejected, onCancel, additionalVariables, className, }: ApproveTaskPageProps): react_jsx_runtime.JSX.Element;
71
+
72
+ export { ApproveTaskPage, type ApproveTaskPageProps, MyHistoryTasksPage, type MyHistoryTasksPageProps, MyTasksPage, type MyTasksPageProps };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import {useState,useCallback,useEffect}from'react';import {useTranslation}from'react-i18next';import {jsxs,jsx}from'react/jsx-runtime';function j({bpmClient:n,currentUser:p,onApprove:f,renderTaskName:k,renderActions:L,onRefresh:P,className:r=""}){let{t:s}=useTranslation("bpm"),[l,g]=useState([]),[T,y]=useState(false),[v,b]=useState(null),h=useCallback(async()=>{y(true),b(null);try{let{data:e,error:i}=await n.getTasks({assignee:p});i?b(i.message):g(e||[]);}catch(e){b(e instanceof Error?e.message:"Failed to fetch tasks");}finally{y(false);}},[n,p]);useEffect(()=>{h();},[h]);let R=()=>{h(),P?.();},C=e=>{f?.(e);},t=e=>e?new Date(e).toLocaleString():"-",m=e=>jsx("button",{type:"button",onClick:()=>C(e),className:"bpm-btn bpm-btn-outline",children:s("taskList.approve","Approve")});return jsxs("div",{className:`bpm-tasks-page ${r}`,children:[jsxs("div",{className:"bpm-tasks-header",children:[jsx("h1",{className:"bpm-tasks-title",children:s("taskList.myTasks","My Tasks")}),jsx("button",{type:"button",onClick:R,disabled:T,className:"bpm-btn bpm-btn-outline",children:T?s("taskList.loading","Loading..."):s("taskList.refresh","Refresh")})]}),v&&jsx("div",{className:"bpm-error",children:v}),jsxs("table",{className:"bpm-table",children:[jsx("thead",{children:jsxs("tr",{children:[jsx("th",{children:s("taskList.taskName","Task Name")}),jsx("th",{children:s("taskList.processInstance","Process Instance")}),jsx("th",{children:s("taskList.createdAt","Created At")}),jsx("th",{children:s("taskList.dueDate","Due Date")}),jsx("th",{children:s("taskList.actions","Actions")})]})}),jsx("tbody",{children:l.length===0?jsx("tr",{children:jsx("td",{colSpan:5,className:"bpm-table-empty",children:T?s("taskList.loading","Loading..."):s("taskList.noTasks","No pending tasks")})}):l.map(e=>jsxs("tr",{children:[jsx("td",{children:k?k(e):e.name}),jsxs("td",{className:"bpm-mono",children:[e.processInstanceId?.slice(0,8),"..."]}),jsx("td",{children:t(e.created)}),jsx("td",{children:t(e.due)}),jsx("td",{children:L?L(e,m(e)):m(e)})]},e.id))})]})]})}function G({bpmClient:n,currentUser:p,renderTaskName:f,renderActions:k,onRefresh:L,className:P=""}){let{t:r}=useTranslation("bpm"),[s,l]=useState([]),[g,T]=useState(false),[y,v]=useState(null),b=useCallback(async()=>{T(true),v(null);try{let{data:t,error:m}=await n.getHistoryTasks({taskAssignee:p,finished:!0});m?v(m.message):l(t||[]);}catch(t){v(t instanceof Error?t.message:"Failed to fetch history");}finally{T(false);}},[n,p]);useEffect(()=>{b();},[b]);let h=()=>{b(),L?.();},R=t=>t?new Date(t).toLocaleString():"-",C=(t,m)=>{if(!t||!m)return "-";let e=new Date(m).getTime()-new Date(t).getTime(),i=Math.floor(e/6e4),N=Math.floor(i/60),D=Math.floor(N/24);return D>0?`${D}d ${N%24}h`:N>0?`${N}h ${i%60}m`:`${i}m`};return jsxs("div",{className:`bpm-history-page ${P}`,children:[jsxs("div",{className:"bpm-tasks-header",children:[jsx("h1",{className:"bpm-tasks-title",children:r("taskList.myHistory","My Completed Tasks")}),jsx("button",{type:"button",onClick:h,disabled:g,className:"bpm-btn bpm-btn-outline",children:g?r("taskList.loading","Loading..."):r("taskList.refresh","Refresh")})]}),y&&jsx("div",{className:"bpm-error",children:y}),jsxs("table",{className:"bpm-table",children:[jsx("thead",{children:jsxs("tr",{children:[jsx("th",{children:r("taskList.taskName","Task Name")}),jsx("th",{children:r("taskList.processInstance","Process Instance")}),jsx("th",{children:r("taskList.startTime","Start Time")}),jsx("th",{children:r("taskList.endTime","End Time")}),jsx("th",{children:r("taskList.duration","Duration")}),k&&jsx("th",{children:r("taskList.actions","Actions")})]})}),jsx("tbody",{children:s.length===0?jsx("tr",{children:jsx("td",{colSpan:k?6:5,className:"bpm-table-empty",children:g?r("taskList.loading","Loading..."):r("taskList.noHistory","No completed tasks")})}):s.map(t=>jsxs("tr",{children:[jsx("td",{children:f?f(t):t.name}),jsxs("td",{className:"bpm-mono",children:[t.processInstanceId?.slice(0,8),"..."]}),jsx("td",{children:R(t.startTime)}),jsx("td",{children:R(t.endTime)}),jsx("td",{children:C(t.startTime,t.endTime)}),k&&jsx("td",{children:k(t)})]},t.id))})]})]})}function U({taskId:n,bpmClient:p,renderForm:f,onApproved:k,onRejected:L,onCancel:P,additionalVariables:r={},className:s=""}){let{t:l}=useTranslation("bpm"),[g,T]=useState(null),[y,v]=useState({}),[b,h]=useState({}),[R,C]=useState(true),[t,m]=useState(false),[e,i]=useState(null),N=useCallback(async()=>{C(true),i(null);try{let[d,u]=await Promise.all([p.getTask(n),p.getTaskFormVariables(n)]);if(d.error){i(d.error.message);return}if(u.error){i(u.error.message);return}T(d.data),v(u.data||{});}catch(d){i(d instanceof Error?d.message:"Failed to load task");}finally{C(false);}},[p,n]);useEffect(()=>{n&&N();},[n,N]);let D=(d,u)=>{h(F=>({...F,[d]:u}));},B=async d=>{m(true),i(null);try{let u={...b,...r,approvalStatus:d?"approved":"rejected"},{error:F}=await p.completeTask(n,u);if(F){i(F.message);return}d?k?.():L?.();}catch(u){i(u instanceof Error?u.message:"Failed to complete task");}finally{m(false);}};return R?jsx("div",{className:`bpm-approve-page bpm-loading ${s}`,children:l("approveTask.loading","Loading...")}):g?jsx("div",{className:`bpm-approve-page ${s}`,children:jsxs("div",{className:"bpm-approve-card",children:[jsx("div",{className:"bpm-approve-header",children:jsx("h2",{className:"bpm-approve-title",children:g.name})}),jsxs("div",{className:"bpm-approve-content",children:[e&&jsx("div",{className:"bpm-error",children:e}),jsx("div",{className:"bpm-approve-form",children:f(y,D)}),jsxs("div",{className:"bpm-approve-actions",children:[jsx("button",{type:"button",onClick:()=>B(true),disabled:t,className:"bpm-btn bpm-btn-primary",children:t?l("approveTask.submitting","Submitting..."):l("approveTask.approve","Approve")}),jsx("button",{type:"button",onClick:()=>B(false),disabled:t,className:"bpm-btn bpm-btn-danger",children:t?l("approveTask.submitting","Submitting..."):l("approveTask.reject","Reject")}),P&&jsx("button",{type:"button",onClick:P,disabled:t,className:"bpm-btn bpm-btn-outline",children:l("approveTask.cancel","Cancel")})]})]})]})}):jsx("div",{className:`bpm-approve-page ${s}`,children:jsx("div",{className:"bpm-error",children:l("approveTask.notFound","Task not found")})})}var S={en:{taskList:{myTasks:"My Tasks",myHistory:"My Completed Tasks",taskName:"Task Name",processInstance:"Process Instance",createdAt:"Created At",dueDate:"Due Date",startTime:"Start Time",endTime:"End Time",duration:"Duration",actions:"Actions",approve:"Approve",refresh:"Refresh",loading:"Loading...",noTasks:"No pending tasks",noHistory:"No completed tasks"},approveTask:{approve:"Approve",reject:"Reject",cancel:"Cancel",notFound:"Task not found",loading:"Loading...",submitting:"Submitting..."}},"zh-CN":{taskList:{myTasks:"\u6211\u7684\u5F85\u529E",myHistory:"\u6211\u7684\u5DF2\u529E",taskName:"\u4EFB\u52A1\u540D\u79F0",processInstance:"\u6D41\u7A0B\u5B9E\u4F8B",createdAt:"\u521B\u5EFA\u65F6\u95F4",dueDate:"\u622A\u6B62\u65F6\u95F4",startTime:"\u5F00\u59CB\u65F6\u95F4",endTime:"\u7ED3\u675F\u65F6\u95F4",duration:"\u8017\u65F6",actions:"\u64CD\u4F5C",approve:"\u5BA1\u6279",refresh:"\u5237\u65B0",loading:"\u52A0\u8F7D\u4E2D...",noTasks:"\u6682\u65E0\u5F85\u529E\u4EFB\u52A1",noHistory:"\u6682\u65E0\u5DF2\u529E\u4EFB\u52A1"},approveTask:{approve:"\u540C\u610F",reject:"\u62D2\u7EDD",cancel:"\u53D6\u6D88",notFound:"\u4EFB\u52A1\u4E0D\u5B58\u5728",loading:"\u52A0\u8F7D\u4E2D...",submitting:"\u63D0\u4EA4\u4E2D..."}}};function W(n){Object.entries(S).forEach(([p,f])=>{n.addResourceBundle(p,"bpm",f,true,true);});}export{U as ApproveTaskPage,G as MyHistoryTasksPage,j as MyTasksPage,W as addBpmTranslations,S as bpmTranslations};//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pages/MyTasksPage.tsx","../src/pages/MyHistoryTasksPage.tsx","../src/pages/ApproveTaskPage.tsx","../src/i18n/index.ts"],"names":["MyTasksPage","bpmClient","currentUser","onApprove","renderTaskName","renderActions","onRefresh","className","t","useTranslation","tasks","setTasks","useState","loading","setLoading","error","setError","fetchTasks","useCallback","data","fetchError","err","useEffect","handleRefresh","handleApprove","task","formatDate","dateString","defaultActionButton","jsx","jsxs","MyHistoryTasksPage","formatDuration","start","end","diffMs","diffMins","diffHours","diffDays","ApproveTaskPage","taskId","renderForm","onApproved","onRejected","onCancel","additionalVariables","setTask","formVariables","setFormVariables","formValues","setFormValues","submitting","setSubmitting","fetchTaskData","taskRes","varsRes","handleFieldChange","field","value","prev","handleComplete","approved","variables","completeError","bpmTranslations","addBpmTranslations","i18n","lng","resources"],"mappings":"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","file":"index.js","sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { Task, BpmClient } from \"@amaster.ai/bpm-client\";\n\nexport interface MyTasksPageProps {\n /** BPM client instance */\n bpmClient: BpmClient;\n /** Current user identifier */\n currentUser: string;\n /** Called when clicking approve button */\n onApprove?: (task: Task) => void;\n /** Custom render for task name cell */\n renderTaskName?: (task: Task) => React.ReactNode;\n /** Custom render for actions cell */\n renderActions?: (task: Task, defaultAction: React.ReactNode) => React.ReactNode;\n /** Called when task list is refreshed */\n onRefresh?: () => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * My Tasks Page - displays current user's pending tasks\n *\n * This is a shared component that can be used across different applications.\n * Each application sees the same UI but fetches different data based on the currentUser.\n */\nexport function MyTasksPage({\n bpmClient,\n currentUser,\n onApprove,\n renderTaskName,\n renderActions,\n onRefresh,\n className = \"\",\n}: MyTasksPageProps) {\n const { t } = useTranslation(\"bpm\");\n const [tasks, setTasks] = useState<Task[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchTasks = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const { data, error: fetchError } = await bpmClient.getTasks({\n assignee: currentUser,\n });\n if (fetchError) {\n setError(fetchError.message);\n } else {\n setTasks(data || []);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch tasks\");\n } finally {\n setLoading(false);\n }\n }, [bpmClient, currentUser]);\n\n useEffect(() => {\n fetchTasks();\n }, [fetchTasks]);\n\n const handleRefresh = () => {\n fetchTasks();\n onRefresh?.();\n };\n\n const handleApprove = (task: Task) => {\n onApprove?.(task);\n };\n\n const formatDate = (dateString: string | null | undefined) => {\n if (!dateString) return \"-\";\n return new Date(dateString).toLocaleString();\n };\n\n const defaultActionButton = (task: Task) => (\n <button type=\"button\" onClick={() => handleApprove(task)} className=\"bpm-btn bpm-btn-outline\">\n {t(\"taskList.approve\", \"Approve\")}\n </button>\n );\n\n return (\n <div className={`bpm-tasks-page ${className}`}>\n <div className=\"bpm-tasks-header\">\n <h1 className=\"bpm-tasks-title\">{t(\"taskList.myTasks\", \"My Tasks\")}</h1>\n <button\n type=\"button\"\n onClick={handleRefresh}\n disabled={loading}\n className=\"bpm-btn bpm-btn-outline\"\n >\n {loading ? t(\"taskList.loading\", \"Loading...\") : t(\"taskList.refresh\", \"Refresh\")}\n </button>\n </div>\n\n {error && <div className=\"bpm-error\">{error}</div>}\n\n <table className=\"bpm-table\">\n <thead>\n <tr>\n <th>{t(\"taskList.taskName\", \"Task Name\")}</th>\n <th>{t(\"taskList.processInstance\", \"Process Instance\")}</th>\n <th>{t(\"taskList.createdAt\", \"Created At\")}</th>\n <th>{t(\"taskList.dueDate\", \"Due Date\")}</th>\n <th>{t(\"taskList.actions\", \"Actions\")}</th>\n </tr>\n </thead>\n <tbody>\n {tasks.length === 0 ? (\n <tr>\n <td colSpan={5} className=\"bpm-table-empty\">\n {loading\n ? t(\"taskList.loading\", \"Loading...\")\n : t(\"taskList.noTasks\", \"No pending tasks\")}\n </td>\n </tr>\n ) : (\n tasks.map((task) => (\n <tr key={task.id}>\n <td>{renderTaskName ? renderTaskName(task) : task.name}</td>\n <td className=\"bpm-mono\">{task.processInstanceId?.slice(0, 8)}...</td>\n <td>{formatDate(task.created)}</td>\n <td>{formatDate(task.due)}</td>\n <td>\n {renderActions\n ? renderActions(task, defaultActionButton(task))\n : defaultActionButton(task)}\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport type { Task };\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { HistoryTask, BpmClient } from \"@amaster.ai/bpm-client\";\n\nexport interface MyHistoryTasksPageProps {\n /** BPM client instance */\n bpmClient: BpmClient;\n /** Current user identifier */\n currentUser: string;\n /** Custom render for task name cell */\n renderTaskName?: (task: HistoryTask) => React.ReactNode;\n /** Custom render for actions cell */\n renderActions?: (task: HistoryTask) => React.ReactNode;\n /** Called when task list is refreshed */\n onRefresh?: () => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * My History Tasks Page - displays current user's completed tasks\n */\nexport function MyHistoryTasksPage({\n bpmClient,\n currentUser,\n renderTaskName,\n renderActions,\n onRefresh,\n className = \"\",\n}: MyHistoryTasksPageProps) {\n const { t } = useTranslation(\"bpm\");\n const [tasks, setTasks] = useState<HistoryTask[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchTasks = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const { data, error: fetchError } = await bpmClient.getHistoryTasks({\n taskAssignee: currentUser,\n finished: true,\n });\n if (fetchError) {\n setError(fetchError.message);\n } else {\n setTasks(data || []);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch history\");\n } finally {\n setLoading(false);\n }\n }, [bpmClient, currentUser]);\n\n useEffect(() => {\n fetchTasks();\n }, [fetchTasks]);\n\n const handleRefresh = () => {\n fetchTasks();\n onRefresh?.();\n };\n\n const formatDate = (dateString: string | null | undefined) => {\n if (!dateString) return \"-\";\n return new Date(dateString).toLocaleString();\n };\n\n const formatDuration = (start: string | null | undefined, end: string | null | undefined) => {\n if (!start || !end) return \"-\";\n const diffMs = new Date(end).getTime() - new Date(start).getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffDays > 0) return `${diffDays}d ${diffHours % 24}h`;\n if (diffHours > 0) return `${diffHours}h ${diffMins % 60}m`;\n return `${diffMins}m`;\n };\n\n return (\n <div className={`bpm-history-page ${className}`}>\n <div className=\"bpm-tasks-header\">\n <h1 className=\"bpm-tasks-title\">{t(\"taskList.myHistory\", \"My Completed Tasks\")}</h1>\n <button\n type=\"button\"\n onClick={handleRefresh}\n disabled={loading}\n className=\"bpm-btn bpm-btn-outline\"\n >\n {loading ? t(\"taskList.loading\", \"Loading...\") : t(\"taskList.refresh\", \"Refresh\")}\n </button>\n </div>\n\n {error && <div className=\"bpm-error\">{error}</div>}\n\n <table className=\"bpm-table\">\n <thead>\n <tr>\n <th>{t(\"taskList.taskName\", \"Task Name\")}</th>\n <th>{t(\"taskList.processInstance\", \"Process Instance\")}</th>\n <th>{t(\"taskList.startTime\", \"Start Time\")}</th>\n <th>{t(\"taskList.endTime\", \"End Time\")}</th>\n <th>{t(\"taskList.duration\", \"Duration\")}</th>\n {renderActions && <th>{t(\"taskList.actions\", \"Actions\")}</th>}\n </tr>\n </thead>\n <tbody>\n {tasks.length === 0 ? (\n <tr>\n <td colSpan={renderActions ? 6 : 5} className=\"bpm-table-empty\">\n {loading\n ? t(\"taskList.loading\", \"Loading...\")\n : t(\"taskList.noHistory\", \"No completed tasks\")}\n </td>\n </tr>\n ) : (\n tasks.map((task) => (\n <tr key={task.id}>\n <td>{renderTaskName ? renderTaskName(task) : task.name}</td>\n <td className=\"bpm-mono\">{task.processInstanceId?.slice(0, 8)}...</td>\n <td>{formatDate(task.startTime)}</td>\n <td>{formatDate(task.endTime)}</td>\n <td>{formatDuration(task.startTime, task.endTime)}</td>\n {renderActions && <td>{renderActions(task)}</td>}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport type { HistoryTask };\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { BpmClient, TaskFormVariables, Task } from \"@amaster.ai/bpm-client\";\n\nexport interface ApproveTaskPageProps {\n /** Task ID to approve */\n taskId: string;\n /** BPM client instance */\n bpmClient: BpmClient;\n /** Render form fields based on form variables */\n renderForm: (\n formVariables: TaskFormVariables,\n onFieldChange: (field: string, value: unknown) => void\n ) => React.ReactNode;\n /** Called after successful approval */\n onApproved?: () => void;\n /** Called after rejection */\n onRejected?: () => void;\n /** Called on cancel */\n onCancel?: () => void;\n /** Additional variables to include when completing task */\n additionalVariables?: Record<string, unknown>;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Approve Task Page - displays task details and form for approval\n */\nexport function ApproveTaskPage({\n taskId,\n bpmClient,\n renderForm,\n onApproved,\n onRejected,\n onCancel,\n additionalVariables = {},\n className = \"\",\n}: ApproveTaskPageProps) {\n const { t } = useTranslation(\"bpm\");\n const [task, setTask] = useState<Task | null>(null);\n const [formVariables, setFormVariables] = useState<TaskFormVariables>({});\n const [formValues, setFormValues] = useState<Record<string, unknown>>({});\n const [loading, setLoading] = useState(true);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchTaskData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const [taskRes, varsRes] = await Promise.all([\n bpmClient.getTask(taskId),\n bpmClient.getTaskFormVariables(taskId),\n ]);\n\n if (taskRes.error) {\n setError(taskRes.error.message);\n return;\n }\n if (varsRes.error) {\n setError(varsRes.error.message);\n return;\n }\n\n setTask(taskRes.data);\n setFormVariables(varsRes.data || {});\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load task\");\n } finally {\n setLoading(false);\n }\n }, [bpmClient, taskId]);\n\n useEffect(() => {\n if (taskId) {\n fetchTaskData();\n }\n }, [taskId, fetchTaskData]);\n\n const handleFieldChange = (field: string, value: unknown) => {\n setFormValues((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleComplete = async (approved: boolean) => {\n setSubmitting(true);\n setError(null);\n try {\n const variables = {\n ...formValues,\n ...additionalVariables,\n approvalStatus: approved ? \"approved\" : \"rejected\",\n };\n\n const { error: completeError } = await bpmClient.completeTask(taskId, variables);\n\n if (completeError) {\n setError(completeError.message);\n return;\n }\n\n if (approved) {\n onApproved?.();\n } else {\n onRejected?.();\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to complete task\");\n } finally {\n setSubmitting(false);\n }\n };\n\n if (loading) {\n return (\n <div className={`bpm-approve-page bpm-loading ${className}`}>\n {t(\"approveTask.loading\", \"Loading...\")}\n </div>\n );\n }\n\n if (!task) {\n return (\n <div className={`bpm-approve-page ${className}`}>\n <div className=\"bpm-error\">{t(\"approveTask.notFound\", \"Task not found\")}</div>\n </div>\n );\n }\n\n return (\n <div className={`bpm-approve-page ${className}`}>\n <div className=\"bpm-approve-card\">\n <div className=\"bpm-approve-header\">\n <h2 className=\"bpm-approve-title\">{task.name}</h2>\n </div>\n <div className=\"bpm-approve-content\">\n {error && <div className=\"bpm-error\">{error}</div>}\n\n <div className=\"bpm-approve-form\">{renderForm(formVariables, handleFieldChange)}</div>\n\n <div className=\"bpm-approve-actions\">\n <button\n type=\"button\"\n onClick={() => handleComplete(true)}\n disabled={submitting}\n className=\"bpm-btn bpm-btn-primary\"\n >\n {submitting\n ? t(\"approveTask.submitting\", \"Submitting...\")\n : t(\"approveTask.approve\", \"Approve\")}\n </button>\n <button\n type=\"button\"\n onClick={() => handleComplete(false)}\n disabled={submitting}\n className=\"bpm-btn bpm-btn-danger\"\n >\n {submitting\n ? t(\"approveTask.submitting\", \"Submitting...\")\n : t(\"approveTask.reject\", \"Reject\")}\n </button>\n {onCancel && (\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={submitting}\n className=\"bpm-btn bpm-btn-outline\"\n >\n {t(\"approveTask.cancel\", \"Cancel\")}\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport type { TaskFormVariables };\n","export const bpmTranslations = {\n en: {\n taskList: {\n myTasks: \"My Tasks\",\n myHistory: \"My Completed Tasks\",\n taskName: \"Task Name\",\n processInstance: \"Process Instance\",\n createdAt: \"Created At\",\n dueDate: \"Due Date\",\n startTime: \"Start Time\",\n endTime: \"End Time\",\n duration: \"Duration\",\n actions: \"Actions\",\n approve: \"Approve\",\n refresh: \"Refresh\",\n loading: \"Loading...\",\n noTasks: \"No pending tasks\",\n noHistory: \"No completed tasks\",\n },\n approveTask: {\n approve: \"Approve\",\n reject: \"Reject\",\n cancel: \"Cancel\",\n notFound: \"Task not found\",\n loading: \"Loading...\",\n submitting: \"Submitting...\",\n },\n },\n \"zh-CN\": {\n taskList: {\n myTasks: \"我的待办\",\n myHistory: \"我的已办\",\n taskName: \"任务名称\",\n processInstance: \"流程实例\",\n createdAt: \"创建时间\",\n dueDate: \"截止时间\",\n startTime: \"开始时间\",\n endTime: \"结束时间\",\n duration: \"耗时\",\n actions: \"操作\",\n approve: \"审批\",\n refresh: \"刷新\",\n loading: \"加载中...\",\n noTasks: \"暂无待办任务\",\n noHistory: \"暂无已办任务\",\n },\n approveTask: {\n approve: \"同意\",\n reject: \"拒绝\",\n cancel: \"取消\",\n notFound: \"任务不存在\",\n loading: \"加载中...\",\n submitting: \"提交中...\",\n },\n },\n};\n\n/**\n * Add BPM translations to i18next instance\n */\nexport function addBpmTranslations(i18n: {\n addResourceBundle: (\n lng: string,\n ns: string,\n resources: Record<string, unknown>,\n deep?: boolean,\n overwrite?: boolean\n ) => void;\n}) {\n Object.entries(bpmTranslations).forEach(([lng, resources]) => {\n i18n.addResourceBundle(lng, \"bpm\", resources, true, true);\n });\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@amaster.ai/bpm-ui",
3
+ "version": "1.0.0-beta.1",
4
+ "description": "BPM task management UI components - My Tasks, My History, Approve Task",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./i18n": {
16
+ "types": "./dist/i18n/index.d.ts",
17
+ "import": "./dist/i18n/index.js",
18
+ "require": "./dist/i18n/index.cjs"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md"
24
+ ],
25
+ "keywords": [
26
+ "bpm",
27
+ "camunda",
28
+ "workflow",
29
+ "tasks",
30
+ "approval",
31
+ "react",
32
+ "ui",
33
+ "typescript"
34
+ ],
35
+ "author": "Amaster Team",
36
+ "license": "MIT",
37
+ "publishConfig": {
38
+ "access": "public",
39
+ "registry": "https://registry.npmjs.org/"
40
+ },
41
+ "dependencies": {
42
+ "@amaster.ai/bpm-client": "1.0.0-beta.11"
43
+ },
44
+ "peerDependencies": {
45
+ "react": "^18.0.0",
46
+ "react-dom": "^18.0.0",
47
+ "i18next": "^23.0.0",
48
+ "react-i18next": "^13.0.0 || ^14.0.0 || ^15.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "react": "^18.3.1",
52
+ "react-dom": "^18.3.1",
53
+ "i18next": "^23.16.8",
54
+ "react-i18next": "^15.4.1",
55
+ "@types/react": "^18.3.17",
56
+ "@types/react-dom": "^18.3.5",
57
+ "tsup": "^8.3.5",
58
+ "typescript": "~5.7.2"
59
+ },
60
+ "scripts": {
61
+ "build": "tsup",
62
+ "dev": "tsup --watch",
63
+ "clean": "rm -rf dist *.tsbuildinfo",
64
+ "type-check": "tsc --noEmit"
65
+ }
66
+ }