@nocobase/plugin-workflow-manual 0.17.0-alpha.4

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 (84) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +9 -0
  3. package/README.zh-CN.md +9 -0
  4. package/client.d.ts +2 -0
  5. package/client.js +1 -0
  6. package/dist/client/WorkflowTodo.d.ts +5 -0
  7. package/dist/client/WorkflowTodoBlockInitializer.d.ts +2 -0
  8. package/dist/client/index.d.ts +6 -0
  9. package/dist/client/index.js +13 -0
  10. package/dist/client/instruction/AssigneesSelect.d.ts +6 -0
  11. package/dist/client/instruction/DetailsBlockProvider.d.ts +2 -0
  12. package/dist/client/instruction/FormBlockInitializer.d.ts +2 -0
  13. package/dist/client/instruction/FormBlockProvider.d.ts +2 -0
  14. package/dist/client/instruction/ModeConfig.d.ts +5 -0
  15. package/dist/client/instruction/SchemaConfig.d.ts +49 -0
  16. package/dist/client/instruction/forms/create.d.ts +3 -0
  17. package/dist/client/instruction/forms/custom.d.ts +5 -0
  18. package/dist/client/instruction/forms/update.d.ts +3 -0
  19. package/dist/client/instruction/index.d.ts +83 -0
  20. package/dist/client/instruction/utils.d.ts +1 -0
  21. package/dist/externalVersion.js +18 -0
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +39 -0
  24. package/dist/locale/en-US.json +30 -0
  25. package/dist/locale/index.d.ts +3 -0
  26. package/dist/locale/index.js +39 -0
  27. package/dist/locale/zh-CN.json +30 -0
  28. package/dist/server/ManualInstruction.d.ts +28 -0
  29. package/dist/server/ManualInstruction.js +150 -0
  30. package/dist/server/Plugin.d.ts +6 -0
  31. package/dist/server/Plugin.js +73 -0
  32. package/dist/server/actions.d.ts +2 -0
  33. package/dist/server/actions.js +94 -0
  34. package/dist/server/collecions/jobs.d.ts +19 -0
  35. package/dist/server/collecions/jobs.js +39 -0
  36. package/dist/server/collecions/users.d.ts +15 -0
  37. package/dist/server/collecions/users.js +37 -0
  38. package/dist/server/collecions/users_jobs.d.ts +3 -0
  39. package/dist/server/collecions/users_jobs.js +70 -0
  40. package/dist/server/forms/create.d.ts +5 -0
  41. package/dist/server/forms/create.js +41 -0
  42. package/dist/server/forms/index.d.ts +6 -0
  43. package/dist/server/forms/index.js +38 -0
  44. package/dist/server/forms/update.d.ts +6 -0
  45. package/dist/server/forms/update.js +41 -0
  46. package/dist/server/index.d.ts +1 -0
  47. package/dist/server/index.js +33 -0
  48. package/package.json +33 -0
  49. package/server.d.ts +2 -0
  50. package/server.js +1 -0
  51. package/src/client/WorkflowTodo.tsx +618 -0
  52. package/src/client/WorkflowTodoBlockInitializer.tsx +30 -0
  53. package/src/client/index.ts +44 -0
  54. package/src/client/instruction/AssigneesSelect.tsx +39 -0
  55. package/src/client/instruction/DetailsBlockProvider.tsx +85 -0
  56. package/src/client/instruction/FormBlockInitializer.tsx +72 -0
  57. package/src/client/instruction/FormBlockProvider.tsx +84 -0
  58. package/src/client/instruction/ModeConfig.tsx +85 -0
  59. package/src/client/instruction/SchemaConfig.tsx +538 -0
  60. package/src/client/instruction/forms/create.tsx +112 -0
  61. package/src/client/instruction/forms/custom.tsx +403 -0
  62. package/src/client/instruction/forms/update.tsx +150 -0
  63. package/src/client/instruction/index.tsx +157 -0
  64. package/src/client/instruction/utils.ts +19 -0
  65. package/src/index.ts +2 -0
  66. package/src/locale/en-US.json +30 -0
  67. package/src/locale/index.ts +12 -0
  68. package/src/locale/zh-CN.json +30 -0
  69. package/src/server/ManualInstruction.ts +151 -0
  70. package/src/server/Plugin.ts +48 -0
  71. package/src/server/__tests__/collections/categories.ts +15 -0
  72. package/src/server/__tests__/collections/comments.ts +24 -0
  73. package/src/server/__tests__/collections/posts.ts +40 -0
  74. package/src/server/__tests__/collections/replies.ts +9 -0
  75. package/src/server/__tests__/collections/tags.ts +15 -0
  76. package/src/server/__tests__/instruction.test.ts +1154 -0
  77. package/src/server/actions.ts +100 -0
  78. package/src/server/collecions/jobs.ts +17 -0
  79. package/src/server/collecions/users.ts +15 -0
  80. package/src/server/collecions/users_jobs.ts +50 -0
  81. package/src/server/forms/create.ts +23 -0
  82. package/src/server/forms/index.ts +13 -0
  83. package/src/server/forms/update.ts +23 -0
  84. package/src/server/index.ts +1 -0
package/client.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './dist/client';
2
+ export { default } from './dist/client';
package/client.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/client/index.js');
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare const WorkflowTodo: React.FC & {
3
+ Drawer: React.FC;
4
+ Decorator: React.FC;
5
+ };
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const WorkflowTodoBlockInitializer: FC<any>;
@@ -0,0 +1,6 @@
1
+ import { Plugin } from '@nocobase/client';
2
+ export default class extends Plugin {
3
+ afterAdd(): Promise<void>;
4
+ load(): Promise<void>;
5
+ addComponents(): void;
6
+ }
@@ -0,0 +1,13 @@
1
+ (function(f,e){typeof exports=="object"&&typeof module!="undefined"?e(exports,require("@nocobase/client"),require("@nocobase/plugin-workflow/client"),require("react/jsx-runtime"),require("react"),require("@formily/antd-v5"),require("@formily/core"),require("@formily/react"),require("antd"),require("react-i18next"),require("@nocobase/utils/client"),require("lodash"),require("@ant-design/icons"),require("dayjs")):typeof define=="function"&&define.amd?define(["exports","@nocobase/client","@nocobase/plugin-workflow/client","react/jsx-runtime","react","@formily/antd-v5","@formily/core","@formily/react","antd","react-i18next","@nocobase/utils/client","lodash","@ant-design/icons","dayjs"],e):(f=typeof globalThis!="undefined"?globalThis:f||self,e(f["@nocobase/plugin-workflow-manual"]={},f["@nocobase/client"],f["@nocobase/plugin-workflow"],f.jsxRuntime,f.react,f["@formily/antd-v5"],f["@formily/core"],f["@formily/react"],f.antd,f["react-i18next"],f["@nocobase/utils"],f.lodash,f["@ant-design/icons"],f.dayjs))})(this,function(f,e,l,s,m,q,E,b,v,j,T,_,U,se){"use strict";var We=Object.defineProperty,Re=Object.defineProperties;var eo=Object.getOwnPropertyDescriptors;var J=Object.getOwnPropertySymbols;var ne=Object.prototype.hasOwnProperty,re=Object.prototype.propertyIsEnumerable;var L=(f,e,l)=>e in f?We(f,e,{enumerable:!0,configurable:!0,writable:!0,value:l}):f[e]=l,y=(f,e)=>{for(var l in e||(e={}))ne.call(e,l)&&L(f,l,e[l]);if(J)for(var l of J(e))re.call(e,l)&&L(f,l,e[l]);return f},F=(f,e)=>Re(f,eo(e));var M=(f,e)=>{var l={};for(var s in f)ne.call(f,s)&&e.indexOf(s)<0&&(l[s]=f[s]);if(f!=null&&J)for(var s of J(f))e.indexOf(s)<0&&re.call(f,s)&&(l[s]=f[s]);return l};var N=(f,e,l)=>(L(f,typeof e!="symbol"?e+"":e,l),l);var $=(f,e,l)=>new Promise((s,m)=>{var q=v=>{try{b(l.next(v))}catch(j){m(j)}},E=v=>{try{b(l.throw(v))}catch(j){m(j)}},b=v=>v.done?s(v.value):Promise.resolve(v.value).then(q,E);b((l=l.apply(f,e)).next())});const C="workflow-manual";function B(o,n={}){const{t:r}=ie(n);return r(o)}function ie(o){return j.useTranslation(C,o)}function ae(o){const{execution:n,nodes:r}=l.useFlowContext(),t=m.useMemo(()=>r.reduce((p,d)=>Object.assign(p,{[d.id]:d.key}),{}),[r]),i=m.useMemo(()=>{var p;return{$context:n==null?void 0:n.context,$jobsMapByNodeKey:((p=n==null?void 0:n.jobs)!=null?p:[]).reduce((d,c)=>Object.assign(d,{[t[c.nodeId]]:c.result}),{})}},[n==null?void 0:n.context,n==null?void 0:n.jobs,t]);return m.useMemo(()=>T.parse(o)(i),[i,o])}function Q(o){const n=b.useField(),r=m.useRef(null),{appends:t,updateAssociationValues:i}=e.useAssociationNames(),a=ae(o.dataSource),p=m.useMemo(()=>E.createForm({values:a,readPretty:!0}),[a]),d={appends:t},c={loading:!1,data:{data:a}},g=e.useAPIClient().resource(o.collection),h=m.useContext(e.BlockRequestContext);return s.jsx(e.CollectionProvider,{collection:o.collection,children:s.jsx(e.RecordProvider,{record:a,parent:!1,children:s.jsx(e.BlockRequestContext.Provider,{value:{block:"form",field:n,service:c,resource:g,__parent:h},children:s.jsx(e.FormBlockContext.Provider,{value:{params:d,form:p,field:n,service:c,updateAssociationValues:i,formBlockRef:r},children:o.children})})})})}function Y(o){var O,A,D;const n=e.useRecord(),r=b.useFieldSchema(),t=b.useField(),i=m.useRef(null),{appends:a,updateAssociationValues:p}=e.useAssociationNames(),[d]=Object.keys((O=r.toJSON().properties)!=null?O:{}),c=(A=n==null?void 0:n.result)==null?void 0:A[d],{findComponent:x}=e.useDesignable(),g=x((D=t.component)==null?void 0:D[0])||m.Fragment,h=m.useMemo(()=>E.createForm({initialValues:c}),[c]),u=m.useMemo(()=>y({appends:a},o.params),[a,o.params]),S=m.useMemo(()=>({loading:!1,data:{data:c}}),[c]),k=e.useAPIClient().resource(o.collection),I=m.useContext(e.BlockRequestContext),z=m.useMemo(()=>({params:u,form:h,field:t,service:S,updateAssociationValues:p,formBlockRef:i}),[t,h,u,S,p]);return!n.status||c?s.jsx(e.CollectionProvider,{collection:o.collection,children:s.jsx(e.RecordProvider,{record:c,parent:!1,children:s.jsx(e.FormActiveFieldsProvider,{name:"form",children:s.jsx(e.BlockRequestContext.Provider,{value:{block:"form",props:o,field:t,service:S,resource:k,__parent:I},children:s.jsx(e.FormBlockContext.Provider,{value:z,children:s.jsxs(g,F(y({},t.componentProps),{children:[s.jsx(e.FormV2.Templates,{style:{marginBottom:18},form:h}),s.jsx("div",{ref:i,children:s.jsx(b.RecursionField,{schema:r,onlyRenderProperties:!0})})]}))})})})})}):null}function ce(r){var t=r,{schema:o}=t,n=M(t,["schema"]);const{getTemplateSchemaByMode:i}=e.useSchemaTemplateManager(),{insert:a}=e.useSchemaInitializer(),p=e.useRecordCollectionDataSourceItems("FormItem");function d(x){return $(this,arguments,function*({item:c}){const g=c.template?yield i(c):null,h=e.createFormBlockSchema(F(y({actionInitializers:"AddActionButton",actions:{resolve:{type:"void",title:`{{t("Continue the process", { ns: "${C}" })}}`,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:l.JOB_STATUS.RESOLVED},"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useSubmit }}"},"x-designer":"ManualActionDesigner","x-designer-props":{}}}},o),{template:g}));delete h["x-acl-action-props"],delete h["x-acl-action"];const[u]=Object.keys(h.properties);h.properties[u].properties.actions["x-decorator"]="ActionBarProvider",h.properties[u].properties.actions["x-component-props"].style={marginTop:"1.5em",flexWrap:"wrap"},l.traverseSchema(h,S=>{S["x-uid"]&&delete S["x-uid"]}),a(h)})}return s.jsx(e.SchemaInitializerItem,F(y({},n),{onClick:d,items:p}))}function H(){var n;const o=e.useSchemaInitializerItem();return s.jsx(e.CollectionProvider,{collection:(n=o.schema)==null?void 0:n.collection,children:s.jsx(ce,y({},o))})}function P(o,n,r=!1){const t=[];return o?n(o)&&(!r||!o.properties)?(t.push(o),t):(o.properties&&Object.keys(o.properties).forEach(i=>{t.push(...P(o.properties[i],n))}),t):t}function le(){const{name:o,title:n}=e.useCollection();return s.jsxs(e.GeneralSchemaDesigner,{title:n||o,children:[s.jsx(e.SchemaSettingsBlockTitleItem,{}),s.jsx(e.SchemaSettingsLinkageRules,{collectionName:o}),s.jsx(e.SchemaSettingsDataTemplates,{collectionName:o}),s.jsx(e.SchemaSettingsDivider,{}),s.jsx(e.SchemaSettingsRemove,{removeParentsIfNoChildren:!0,breakRemoveOn:{"x-component":"Grid"}})]})}const pe={title:`{{t("Create record form", { ns: "${C}" })}}`,config:{useInitializer({collections:o}){const n=m.useMemo(()=>o.map(a=>({name:_.camelCase(`createRecordForm-child-${a.name}`),type:"item",title:a.title,label:a.label,schema:{collection:a.name,title:`{{t("Create record", { ns: "${C}" })}}`,formType:"create","x-designer":"CreateFormDesigner"},Component:H})),[o]),[r,t]=m.useState(!1),i=e.useMenuSearch(n,r,!0);return{name:"createRecordForm",key:"createRecordForm",type:"subMenu",title:`{{t("Create record form", { ns: "${C}" })}}`,componentProps:{onOpenChange(a){t(a.length>0)}},children:i}},initializers:{},components:{CreateFormDesigner:le},parseFormOptions(o){const n={};return P(o,t=>t["x-decorator"]==="FormBlockProvider"&&t["x-decorator-props"].formType==="create").forEach(t=>{var p;const[i]=Object.keys(t.properties),a=t.properties[i];n[i]={type:"create",title:((p=t["x-component-props"])==null?void 0:p.title)||i,actions:P(a.properties.actions,d=>d["x-component"]==="Action").map(d=>{var c,x;return{status:d["x-decorator-props"].value,values:(x=(c=d["x-action-settings"])==null?void 0:c.assignedValues)==null?void 0:x.values,key:d.name}}),collection:t["x-decorator-props"].collection}}),n}},block:{scope:{},components:{}}};function X(o){var x,g,h,u;const[n,r]=m.useState((g=(x=o.collection)==null?void 0:x.fields)!=null?g:[]),t=e.useRecord(),i=b.useField(),a=b.useFieldSchema(),[p]=Object.keys((h=a.toJSON().properties)!=null?h:{}),d=(u=t==null?void 0:t.result)==null?void 0:u[p],c=m.useMemo(()=>E.createForm({initialValues:d}),[d]);return!t.status||d?s.jsx(e.CollectionProvider,{collection:F(y({},o.collection),{fields:n}),children:s.jsx(e.RecordProvider,{record:d,parent:!1,children:s.jsx(e.FormBlockContext.Provider,{value:{form:c,field:i,setCollectionFields:r},children:o.children})})}):null}function de(){const{insert:o}=e.useSchemaInitializer(),n=e.useSchemaInitializerItem();return s.jsx(e.SchemaInitializerItem,F(y({},n),{onClick:()=>{o({type:"void","x-decorator":"CustomFormBlockProvider","x-decorator-props":{collection:{name:T.uid(),fields:[]}},"x-component":"CardItem","x-component-props":{title:'{{t("Form")}}'},"x-designer":"SimpleDesigner","x-designer-props":{type:"customForm"},properties:{[T.uid()]:{type:"void","x-component":"FormV2","x-component-props":{useProps:"{{ useFormBlockProps }}"},properties:{grid:{type:"void","x-component":"Grid","x-initializer":"AddCustomFormField"},actions:{type:"void","x-decorator":"ActionBarProvider","x-component":"ActionBar","x-component-props":{layout:"one-column",style:{marginTop:"1.5em",flexWrap:"wrap"}},"x-initializer":"AddActionButton",properties:{resolve:{type:"void",title:`{{t("Continue the process", { ns: "${C}" })}}`,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:l.JOB_STATUS.RESOLVED},"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useSubmit }}"},"x-designer":"ManualActionDesigner"}}}}}}})}}))}const Z={basic:'{{t("Basic")}}',choices:'{{t("Choices")}}',media:'{{t("Media")}}',datetime:'{{t("Date & Time")}}',relation:'{{t("Relation")}}',advanced:'{{t("Advanced type")}}',systemInfo:'{{t("System info")}}',others:'{{t("Others")}}'};function ue(o){const n={};return Object.keys(o).forEach(r=>{const t=o[r],{group:i="others"}=t;n[i]=n[i]||{},_.set(n,[i,r],t)}),Object.keys(Z).filter(r=>["basic","choices","datetime","media"].includes(r)).map(r=>({title:Z[r],children:Object.keys(n[r]||{}).map(t=>{const i=n[r][t];return y({value:t,title:i.title,name:t},n[r][t])}).sort((t,i)=>t.order-i.order)}))}function me(){const{interfaces:o}=e.useCollectionManager();return ue(o).map(r=>({name:r.title,type:"itemGroup",title:r.title,children:r.children.map(t=>({name:t.name,type:"item",title:t.title,Component:xe,fieldInterface:t.name}))}))}const W=m.createContext({}),fe=o=>{const[n,r]=m.useState(null),[t,i]=m.useState(),a=me(),p=m.useContext(e.CollectionContext),{setCollectionFields:d}=m.useContext(e.FormBlockContext);return s.jsxs(W.Provider,{value:{onAddField(c){const S=_.cloneDeep(c),{properties:w}=S,k=w,{unique:x,type:g}=k,h=M(k,["unique","type"]),u=M(S,["properties"]);delete h.name["x-disabled"],r(F(y({},u),{properties:h}))},setCallback:i},children:[s.jsx(e.SchemaInitializerItems,F(y({},o),{items:a})),s.jsx(e.ActionContextProvider,{value:{visible:!!n},children:n?s.jsx(e.SchemaComponent,{schema:{type:"void",name:"drawer",title:'{{t("Configure field")}}',"x-decorator":"Form","x-component":"Action.Drawer",properties:F(y({},n.properties),{footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{type:"void",title:'{{t("Cancel")}}',"x-component":"Action","x-component-props":{useAction(){const c=b.useForm();return{run(){return $(this,null,function*(){i(null),r(null),c.reset()})}}}}},submit:{type:"void",title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction(){const{values:c,query:x}=b.useForm(),g=[B("Field name existed in form")];return{run(){return $(this,null,function*(){var I,z,O,A;const{default:u}=n,S=T.uid();if(u.name=(I=c.name)!=null?I:S,u.uiSchema.title=(O=(z=c.uiSchema)==null?void 0:z.title)!=null?O:S,u.interface=n.name,(A=p.fields)==null?void 0:A.find(D=>D.name===u.name)){x("name").take().setFeedback({type:"error",messages:g});return}const k=T.merge(u,c);d([...p.fields,k]),t({name:u.name,type:u.uiSchema.type,"x-decorator":"FormItem","x-component":"CollectionField","x-component-props":{field:k},"x-collection-field":`${p.name}.${u.name}`,"x-designer":"FormItem.Designer"}),i(null),r(null)})}}}}}}}})},components:{ArrayTable:q.ArrayTable}}):null})]})},he=new e.SchemaInitializer({name:"AddCustomFormField",wrap:e.gridRowColWrap,insertPosition:"beforeEnd",title:"{{t('Configure fields')}}",ItemsComponent:fe});function xe(){const o=e.useSchemaInitializerItem(),{insert:n,setVisible:r}=e.useSchemaInitializer(),{onAddField:t,setCallback:i}=m.useContext(W),{getInterface:a}=e.useCollectionManager(),p=a(o.fieldInterface);return s.jsx(e.SchemaInitializerItem,y({onClick:()=>{i(()=>n),t(p),r(!1)}},o),o.fieldInterface)}const R={title:`{{t("Custom form", { ns: "${C}" })}}`,config:{useInitializer(){return{name:"customForm",type:"item",title:`{{t("Custom form", { ns: "${C}" })}}`,Component:de}},initializers:{},components:{CustomFormBlockProvider:X},parseFormOptions(o){const n={};return P(o,t=>t["x-decorator"]==="CustomFormBlockProvider").forEach(t=>{var d;const[i]=Object.keys(t.properties),a=t.properties[i],p=P(a.properties.grid,c=>c["x-component"]==="CollectionField",!0);t["x-decorator-props"].collection.fields=p.map(c=>{var x,g;return(g=(x=c["x-component-props"])==null?void 0:x.field)!=null?g:c["x-interface-options"]}),n[i]={type:"custom",title:((d=t["x-component-props"])==null?void 0:d.title)||i,actions:P(a.properties.actions,c=>c["x-component"]==="Action").map(c=>{var x,g;return{status:c["x-decorator-props"].value,values:(g=(x=c["x-action-settings"])==null?void 0:x.assignedValues)==null?void 0:g.values,key:c.name}}),collection:t["x-decorator-props"].collection}}),n}},block:{scope:{},components:{CustomFormBlockProvider:X}}};function Ce(){const{name:o,title:n}=e.useCollection(),r=b.useFieldSchema(),{t}=j.useTranslation(),{dn:i}=e.useDesignable();return s.jsxs(e.GeneralSchemaDesigner,{title:n||o,children:[s.jsx(e.SchemaSettingsBlockTitleItem,{}),s.jsx(e.SchemaSettingsActionModalItem,{title:t("Filter settings",{ns:C}),schema:{name:"filter",type:"object",title:'{{t("Filter")}}',"x-component":"Filter","x-component-props":{useProps(){var p;return{options:e.useCollectionFilterOptions((p=r==null?void 0:r["x-decorator-props"])==null?void 0:p.collection)}},dynamicComponent:"FilterDynamicComponent"}},initialValues:r==null?void 0:r["x-decorator-props"],onSubmit:({filter:a})=>{r["x-decorator-props"].filter=a,i.emit("patch",{schema:{"x-decorator-props":r["x-decorator-props"]}}),i.refresh()}}),s.jsx(e.SchemaSettingsLinkageRules,{collectionName:o}),s.jsx(e.SchemaSettingsDivider,{}),s.jsx(e.SchemaSettingsRemove,{removeParentsIfNoChildren:!0,breakRemoveOn:{"x-component":"Grid"}})]})}const ge={title:`{{t("Update record form", { ns: "${C}" })}}`,config:{useInitializer({collections:o}){const n=m.useMemo(()=>o.map(a=>({name:_.camelCase(`updateRecordForm-child-${a.name}`),type:"item",title:a.title,label:a.label,schema:{collection:a.name,title:`{{t("Update record", { ns: "${C}" })}}`,formType:"update","x-designer":"UpdateFormDesigner"},Component:H})),[o]),[r,t]=m.useState(!1),i=e.useMenuSearch(n,r,!0);return{name:"updateRecordForm",key:"updateRecordForm",type:"subMenu",title:`{{t("Update record form", { ns: "${C}" })}}`,componentProps:{onOpenChange(a){t(a.length>0)}},children:i}},initializers:{},components:{FilterDynamicComponent:l.FilterDynamicComponent,UpdateFormDesigner:Ce},parseFormOptions(o){const n={};return P(o,t=>t["x-decorator"]==="FormBlockProvider"&&t["x-decorator-props"].formType==="update").forEach(t=>{var p;const[i]=Object.keys(t.properties),a=t.properties[i];n[i]=F(y({},t["x-decorator-props"]),{type:"update",title:((p=t["x-component-props"])==null?void 0:p.title)||i,actions:P(a.properties.actions,d=>d["x-component"]==="Action").map(d=>{var c,x;return{status:d["x-decorator-props"].value,values:(x=(c=d["x-action-settings"])==null?void 0:c.assignedValues)==null?void 0:x.values,key:d.name}})})}),n}},block:{scope:{},components:{}}},V=new T.Registry;V.register("customForm",R),V.register("createForm",pe),V.register("updateForm",ge);function ye(){const{workflow:o}=l.useFlowContext(),n=l.useTrigger();return n.useInitializers?n.useInitializers(o.config):null}const be={customForm:R.title,record:`{{t("Data record", { ns: "${C}" })}}`};function Se(){var t,i;const o=b.useFieldSchema(),n=(i=be[(t=o["x-designer-props"])==null?void 0:t.type])!=null?i:'{{t("Block")}}',r=e.useCompile();return s.jsxs(e.GeneralSchemaDesigner,{title:r(n),children:[s.jsx(e.SchemaSettingsBlockTitleItem,{}),s.jsx(e.SchemaSettingsDivider,{}),s.jsx(e.SchemaSettingsRemove,{removeParentsIfNoChildren:!0,breakRemoveOn:{"x-component":"Grid"}})]})}const ve=new e.SchemaInitializer({name:"AddBlockButton",wrap:e.gridRowColWrap,title:'{{t("Add block")}}',items:[{type:"itemGroup",name:"dataBlocks",title:'{{t("Data blocks")}}',checkChildrenLength:!0,useChildren(){const o=e.usePlugin(l),n=l.useNodeContext(),r=l.useAvailableUpstreams(n),t=[ye()].filter(Boolean),i=r.map(p=>{var c;const d=o.instructions.get(p.type);return(c=d==null?void 0:d.useInitializers)==null?void 0:c.call(d,p)}).filter(Boolean);return[...t,...i.length?[{name:"nodes",type:"subMenu",title:`{{t("Node result", { ns: "${C}" })}}`,children:i}]:[]].filter(Boolean)}},{type:"itemGroup",name:"form",title:'{{t("Form")}}',useChildren(){const{collections:o}=e.useCollectionManager();return Array.from(V.getValues()).map(n=>{const{useInitializer:r}=n.config;return r({collections:o})})}},{type:"itemGroup",name:"otherBlocks",title:'{{t("Other blocks")}}',children:[{name:"markdown",title:'{{t("Markdown")}}',Component:"MarkdownBlockInitializer"}]}]});function Fe(){var I,z,O;const o=m.useContext(e.SchemaComponentContext),{t:n}=j.useTranslation(),r=b.useFieldSchema(),t=l.useWorkflowVariableOptions(),[i,a]=m.useState(!1),[p,d]=m.useState((O=(z=(I=r==null?void 0:r["x-action-settings"])==null?void 0:I.assignedValues)==null?void 0:z.schema)!=null?O:{type:"void","x-component":"Grid","x-initializer":"CustomFormItemInitializers",properties:{}}),[c,x]=m.useState(null),{components:g}=e.useSchemaOptionsContext();m.useEffect(()=>{x(new b.Schema({properties:{grid:p}}))},[p]);const h=m.useMemo(()=>{var D,G;const A=(G=(D=r==null?void 0:r["x-action-settings"])==null?void 0:D.assignedValues)==null?void 0:G.values;return E.createForm({initialValues:T.lodash.cloneDeep(A),values:T.lodash.cloneDeep(A)})},[r]),u=e.useFormActiveFields(),S=n("Assign field values");function w(){a(!1)}function k(){r["x-action-settings"]||(r["x-action-settings"]={}),r["x-action-settings"].assignedValues||(r["x-action-settings"].assignedValues={}),r["x-action-settings"].assignedValues.schema=p,r["x-action-settings"].assignedValues.values=h.values,a(!1),setTimeout(()=>{var A;(A=o.refresh)==null||A.call(o)},300)}return s.jsxs(s.Fragment,{children:[s.jsx(e.SchemaSettingsItem,{title:S,onClick:()=>a(!0),children:S}),s.jsx(v.Modal,{width:"50%",title:S,open:i,onCancel:w,footer:s.jsxs(v.Space,{children:[s.jsx(v.Button,{onClick:w,children:n("Cancel")}),s.jsx(v.Button,{type:"primary",onClick:k,children:n("Submit")})]}),children:s.jsx(e.DefaultValueProvider,{isAllowToSetDefaultValue:()=>!1,children:s.jsx(e.VariableScopeProvider,{scope:t,children:s.jsx(e.FormActiveFieldsProvider,{name:"form",getActiveFieldsName:u==null?void 0:u.getActiveFieldsName,children:s.jsx(b.FormProvider,{form:h,children:s.jsxs(q.FormLayout,{layout:"vertical",children:[s.jsx(v.Alert,{message:B("Values preset in this form will override user submitted ones when continue or reject.")}),s.jsx("br",{}),i&&c&&s.jsx(e.SchemaComponentContext.Provider,{value:F(y({},o),{refresh(){d(T.lodash.get(c.toJSON(),"properties.grid"))}}),children:s.jsx(e.SchemaComponent,{schema:c,components:g})})]})})})})})})]})}function ke(o){return s.jsxs(e.GeneralSchemaDesigner,F(y({},o),{disableInitializer:!0,children:[s.jsx(e.Action.Designer.ButtonEditor,{}),s.jsx(Fe,{}),s.jsx(e.SchemaSettingsDivider,{}),s.jsx(e.SchemaSettingsRemove,{removeParentsIfNoChildren:!0,breakRemoveOn:{"x-component":"ActionBar"}})]}))}function Ie(){const a=e.useSchemaInitializerItem(),{action:n,actionProps:r}=a,t=M(a,["action","actionProps"]),{insert:i}=e.useSchemaInitializer();return s.jsx(e.SchemaInitializerItem,F(y({},t),{onClick:()=>{i({type:"void",title:t.title,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:n},"x-component":"Action","x-component-props":F(y({},r),{useAction:"{{ useSubmit }}"}),"x-designer":"ManualActionDesigner","x-action-settings":{}})}}))}function ee(){const o=e.useSchemaInitializerItem(),i=o,{action:n,actionProps:r}=i,t=M(i,["action","actionProps"]);return s.jsx(e.InitializerWithSwitch,F(y({},t),{item:o,schema:{type:"void",title:t.title,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:n},"x-component":"Action","x-component-props":F(y({},r),{useAction:"{{ useSubmit }}"}),"x-designer":"Action.Designer","x-action":`${n}`},type:"x-action"}))}const Ae=new e.SchemaInitializer({name:"AddActionButton",title:'{{t("Configure actions")}}',items:[{name:"jobStatusResolved",title:`{{t("Continue the process", { ns: "${C}" })}}`,Component:Ie,action:l.JOB_STATUS.RESOLVED,actionProps:{type:"primary"}},{name:"jobStatusRejected",title:`{{t("Terminate the process", { ns: "${C}" })}}`,Component:ee,action:l.JOB_STATUS.REJECTED,actionProps:{danger:!0}},{name:"jobStatusPending",title:`{{t("Save temporarily", { ns: "${C}" })}}`,Component:ee,action:l.JOB_STATUS.PENDING}]});function we(){return{run(){}}}function Be({value:o,onChange:n}){const r=e.usePlugin(l),t=m.useContext(e.SchemaComponentContext),i=l.useNodeContext(),a=l.useAvailableUpstreams(i),p=b.useForm(),{workflow:d}=l.useFlowContext(),c={},x={};a.forEach(u=>{const S=r.instructions.get(u.type);Object.assign(c,S.initializers),Object.assign(x,S.components)});const g=m.useMemo(()=>new b.Schema({properties:{drawer:{type:"void",title:`{{t("User interface", { ns: "${C}" })}}`,"x-decorator":"Form","x-component":"Action.Drawer","x-component-props":{className:e.css`
2
+ .ant-drawer-body {
3
+ background: var(--nb-box-bg);
4
+ }
5
+ `},properties:{tabs:{type:"void","x-component":"Tabs","x-component-props":{},"x-initializer":"TabPaneInitializers","x-initializer-props":{gridInitializer:"AddBlockButton"},properties:o!=null?o:{tab1:{type:"void",title:`{{t("Manual", { ns: "${C}" })}}`,"x-component":"Tabs.TabPane","x-designer":"Tabs.Designer",properties:{grid:{type:"void","x-component":"Grid","x-initializer":"AddBlockButton",properties:{}}}}}}}}}}),[o]),h=m.useCallback(function(){const{tabs:S}=T.lodash.get(g.toJSON(),"properties.drawer.properties"),w=Array.from(V.getValues()).reduce((k,I)=>Object.assign(k,I.config.parseFormOptions(S)),{});p.setValuesIn("forms",w),n(S.properties)},[p,n,g]);return s.jsx(e.SchemaComponentContext.Provider,{value:F(y({},t),{designable:!d.executed,refresh:h}),children:s.jsx(e.SchemaComponent,{schema:g,components:F(y(y({},x),Array.from(V.getValues()).reduce((u,S)=>Object.assign(u,S.config.components),{})),{FormBlockProvider:Y,DetailsBlockProvider:Q,ManualActionStatusProvider(u){return u.children},ActionBarProvider(u){return u.children},SimpleDesigner:Se,ManualActionDesigner:ke}),scope:{useSubmit:we,useDetailsBlockProps:e.useFormBlockContext}})})}function Te(o){const{workflow:n}=l.useFlowContext(),[r,t]=m.useState(!1);return s.jsxs(s.Fragment,{children:[s.jsx(v.Button,{type:"primary",onClick:()=>t(!0),disabled:!1,children:B(n.executed?"View user interface":"Configure user interface")}),s.jsx(e.ActionContextProvider,{value:{visible:r,setVisible:t,formValueChanged:!1},children:o.children})]})}function Oe({value:o,onChange:n}){const r=s.jsx("fieldset",{children:s.jsx(q.FormLayout,{layout:"vertical",children:s.jsx(e.FormItem,{label:B("Negotiation"),children:s.jsxs(v.Radio.Group,{value:o,onChange:n,children:[s.jsx(v.Radio,{value:1,children:s.jsxs(v.Tooltip,{title:B("Everyone should pass"),placement:"bottom",children:[s.jsx("span",{children:B("All pass")}),s.jsx(U.QuestionCircleOutlined,{style:{color:"#999"}})]})}),s.jsx(v.Radio,{value:-1,children:s.jsxs(v.Tooltip,{title:B("Anyone pass"),placement:"bottom",children:[s.jsx("span",{children:B("Any pass")}),s.jsx(U.QuestionCircleOutlined,{style:{color:"#999"}})]})})]})})})});return s.jsxs("fieldset",{className:e.css`
6
+ .ant-radio-group {
7
+ .anticon {
8
+ margin-left: 0.5em;
9
+ }
10
+ }
11
+ `,children:[s.jsx(v.Form.Item,{children:s.jsxs(v.Radio.Group,{value:!!o,onChange:({target:{value:t}})=>{console.log(t),n(Number(t))},children:[s.jsx(v.Radio,{value:!0,children:s.jsxs(v.Tooltip,{title:B("Each user has own task"),placement:"bottom",children:[s.jsx("span",{children:B("Separately")}),s.jsx(U.QuestionCircleOutlined,{style:{color:"#999"}})]})}),s.jsx(v.Radio,{value:!1,children:s.jsxs(v.Tooltip,{title:B("Everyone shares one task"),placement:"bottom",children:[s.jsx("span",{children:B("Collaboratively")}),s.jsx(U.QuestionCircleOutlined,{style:{color:"#999"}})]})})]})}),o?r:null]})}function ze(o){return o.isForeignKey?o.target==="users":o.collectionName==="users"&&o.name==="id"}function De({multiple:o=!1,value:n=[],onChange:r}){const t=l.useWorkflowVariableOptions({types:[ze]});return s.jsx(e.Variable.Input,{scope:t,value:n[0],onChange:i=>{r([i])},children:s.jsx(e.RemoteSelect,{fieldNames:{label:"nickname",value:"id"},service:{resource:"users"},manual:!1,value:n[0],onChange:i=>{r(i!=null?[i]:[])}})})}class Me extends l.Instruction{constructor(){super(...arguments);N(this,"title",`{{t("Manual", { ns: "${C}" })}}`);N(this,"type","manual");N(this,"group","manual");N(this,"description",`{{t("Could be used for manually submitting data, and determine whether to continue or exit. Workflow will generate a todo item for assigned user when it reaches a manual node, and continue processing after user submits the form.", { ns: "${C}" })}}`);N(this,"fieldset",{assignees:{type:"array",title:`{{t("Assignees", { ns: "${C}" })}}`,"x-decorator":"FormItem","x-component":"AssigneesSelect","x-component-props":{},required:!0,default:[]},mode:{type:"number",title:`{{t("Mode", { ns: "${C}" })}}`,"x-decorator":"FormItem","x-component":"ModeConfig",default:1,"x-reactions":{dependencies:["assignees"],fulfill:{state:{visible:"{{$deps[0].length > 1}}"}}}},schema:{type:"void",title:`{{t("User interface", { ns: "${C}" })}}`,"x-decorator":"FormItem","x-component":"SchemaConfigButton",properties:{schema:{type:"object","x-component":"SchemaConfig",default:null}}},forms:{type:"object",default:{}}});N(this,"components",{SchemaConfigButton:Te,SchemaConfig:Be,ModeConfig:Oe,AssigneesSelect:De})}useVariables({key:r,title:t,config:i},{types:a,fieldNames:p=l.defaultFieldNames}){var h;const d=e.useCompile(),{getCollectionFields:c}=e.useCollectionManager(),x=Object.keys((h=i.forms)!=null?h:{});if(!x.length)return null;const g=x.map(u=>{var I;const S=i.forms[u],w=l.getCollectionFieldOptions({fields:(I=S.collection)==null?void 0:I.fields,collection:S.collection,types:a,compile:d,getCollectionFields:c}),k=d(S.title)||u;return w.length?{key:u,value:u,label:k,title:k,children:w}:null}).filter(Boolean);return g.length?{[p.value]:r,[p.label]:t,[p.children]:g}:null}useInitializers(r){var p;const{getCollection:t}=e.useCollectionManager(),i=Object.keys((p=r.config.forms)!=null?p:{});if(!i.length||r.config.mode)return null;const a=i.map(d=>{var g,h;const c=r.config.forms[d],{fields:x=[]}=t(c.collection);return x.length?{name:(g=c.title)!=null?g:d,type:"item",title:(h=c.title)!=null?h:d,Component:l.CollectionBlockInitializer,collection:c.collection,dataSource:`{{$jobsMapByNodeKey.${r.key}.${d}}}`}:null}).filter(Boolean);return a.length?{name:`#${r.id}`,key:"forms",type:"subMenu",title:r.title,children:a}:null}}const Pe={title:`{{t("Task", { ns: "${C}" })}}`,name:"flow_nodes",fields:[{type:"bigInt",name:"id",interface:"m2o",uiSchema:{type:"number",title:"ID","x-component":"RemoteSelect","x-component-props":{fieldNames:{label:"title",value:"id"},service:{resource:"flow_nodes",params:{filter:{type:"manual"}}}}}},{type:"string",name:"title",interface:"input",uiSchema:{type:"string",title:'{{t("Title")}}',"x-component":"Input"}}]},Ve={title:`{{t("Workflow", { ns: "${C}" })}}`,name:"workflows",fields:[{type:"string",name:"title",interface:"input",uiSchema:{title:'{{t("Name")}}',type:"string","x-component":"Input",required:!0}}]},je={title:`{{t("Workflow todos", { ns: "${C}" })}}`,name:"users_jobs",fields:[{type:"belongsTo",name:"user",target:"users",foreignKey:"userId",interface:"m2o",uiSchema:{type:"number",title:'{{t("User")}}',"x-component":"RemoteSelect","x-component-props":{fieldNames:{label:"nickname",value:"id"},service:{resource:"users"}}}},{type:"belongsTo",name:"node",target:"flow_nodes",foreignKey:"nodeId",interface:"m2o",isAssociation:!0,uiSchema:{type:"number",title:`{{t("Task", { ns: "${C}" })}}`,"x-component":"RemoteSelect","x-component-props":{fieldNames:{label:"title",value:"id"},service:{resource:"flow_nodes"}}}},{type:"belongsTo",name:"workflow",target:"workflows",foreignKey:"workflowId",interface:"m2o",uiSchema:{type:"number",title:`{{t("Workflow", { ns: "${C}" })}}`,"x-component":"RemoteSelect","x-component-props":{fieldNames:{label:"title",value:"id"},service:{resource:"workflows"}}}},{type:"integer",name:"status",interface:"select",uiSchema:{type:"number",title:`{{t("Status", { ns: "${C}" })}}`,"x-component":"Select",enum:l.JobStatusOptions}},{name:"createdAt",type:"date",interface:"createdAt",uiSchema:{type:"datetime",title:'{{t("Created at")}}',"x-component":"DatePicker","x-component-props":{showTime:!0}}}]},Ne=b.observer(()=>{var n,r,t;const o=b.useField();return(t=(n=o==null?void 0:o.value)==null?void 0:n.title)!=null?t:`#${(r=o.value)==null?void 0:r.id}`},{displayName:"NodeColumn"}),$e=b.observer(()=>{var n,r,t;const o=b.useField();return(t=(n=o==null?void 0:o.value)==null?void 0:n.title)!=null?t:`#${(r=o.value)==null?void 0:r.id}`},{displayName:"WorkflowColumn"}),Ee=b.observer(()=>{var n,r,t;const o=b.useField();return(t=(n=o==null?void 0:o.value)==null?void 0:n.nickname)!=null?t:(r=o.value)==null?void 0:r.id},{displayName:"UserColumn"}),K=()=>s.jsx(e.SchemaComponent,{components:{NodeColumn:Ne,WorkflowColumn:$e,UserColumn:Ee},schema:{type:"void",properties:{actions:{type:"void","x-component":"ActionBar","x-component-props":{style:{marginBottom:16}},properties:{filter:{type:"void",title:'{{ t("Filter") }}',"x-action":"filter","x-designer":"Filter.Action.Designer","x-component":"Filter.Action","x-component-props":{icon:"FilterOutlined",useProps:"{{ useFilterActionProps }}"},"x-align":"left"},refresher:{type:"void",title:'{{ t("Refresh") }}',"x-action":"refresh","x-component":"Action","x-designer":"Action.Designer","x-component-props":{icon:"ReloadOutlined",useProps:"{{ useRefreshActionProps }}"},"x-align":"right"}}},table:{type:"array","x-component":"TableV2","x-component-props":{rowKey:"id",useProps:"{{ useTableBlockProps }}"},properties:{node:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column",title:`{{t("Task", { ns: "${C}" })}}`,properties:{node:{"x-component":"NodeColumn","x-read-pretty":!0}}},workflow:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column",title:`{{t("Workflow", { ns: "${C}" })}}`,properties:{workflow:{"x-component":"WorkflowColumn","x-read-pretty":!0}}},createdAt:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column",properties:{createdAt:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},user:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column",title:`{{t("Assignee", { ns: "${C}" })}}`,properties:{user:{"x-component":"UserColumn","x-read-pretty":!0}}},status:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column",properties:{status:{"x-component":"CollectionField","x-read-pretty":!0}}},actions:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column",title:'{{t("Actions")}}',properties:{view:{type:"void","x-component":"Action.Link",title:'{{t("View")}}',properties:{drawer:{"x-component":"WorkflowTodo.Drawer"}}}}}}}}}});function qe(o){var x;const{data:n}=e.useCurrentUserContext(),{userJob:r}=l.useFlowContext(),{status:t,result:i,userId:a}=r,p=b.useFieldSchema(),{name:d}=p.parent.toJSON();let{children:c}=o;return t?i[d]||(c=null):((x=n==null?void 0:n.data)==null?void 0:x.id)!==a&&(c=null),c}const Ue=m.createContext(null);function _e({value:o,children:n}){const{userJob:r}=l.useFlowContext(),t=b.useField(),i=b.useFieldSchema();return m.useEffect(()=>{r.status&&(t.disabled=!0,t.visible=r.status===o&&r.result._===i.name)},[r,o,t,i.name]),s.jsx(Ue.Provider,{value:o,children:n})}function Ge(){const o=e.useAPIClient(),{setVisible:n}=e.useActionContext(),{values:r,submit:t}=b.useForm(),i=b.useFieldSchema(),{service:a}=e.useTableBlockContext(),{userJob:p}=l.useFlowContext(),{name:d}=i,{name:c}=i.parent.parent;return{run(){return $(this,null,function*(){p.status||(yield t(),yield o.resource("users_jobs").submit({filterByTk:p.id,values:{result:{[c]:r,_:d}}}),n(!1),a.refresh())})}}}function Je(o){var g;const n=e.usePlugin(l),r=e.useAPIClient(),{id:t}=e.useRecord(),[i,a]=m.useState(null),[p,d]=m.useState(null);m.useEffect(()=>{var h,u;t&&((u=(h=r.resource("users_jobs")).get)==null||u.call(h,{filterByTk:t,appends:["node","workflow","workflow.nodes","execution","execution.jobs"]}).then(({data:S})=>{var A;const D=(A=S==null?void 0:S.data)!=null?A:{},{node:w,workflow:G={}}=D,oe=G,{nodes:k=[]}=oe,I=M(oe,["nodes"]),te=D,{execution:z}=te,O=M(te,["node","workflow","execution"]);l.linkNodes(k),d(w),a({userJob:O,workflow:I,nodes:k,execution:z})}))},[r,t]);const x=l.useAvailableUpstreams(i==null?void 0:i.nodes.find(h=>h.id===p.id)).reduce((h,{type:u})=>Object.assign(h,n.instructions.get(u).components),{});return p&&i?s.jsx(l.FlowContext.Provider,{value:i,children:s.jsx(e.SchemaComponent,{components:y(y({FormBlockProvider:Y,DetailsBlockProvider:Q,ActionBarProvider:qe,ManualActionStatusProvider:_e},Array.from(V.getValues()).reduce((h,u)=>Object.assign(h,u.block.components),{})),x),scope:y({useSubmit:Ge,useFormBlockProps:Ke,useDetailsBlockProps:Le},Array.from(V.getValues()).reduce((h,u)=>Object.assign(h,u.block.scope),{})),schema:{type:"void",name:"tabs","x-component":"Tabs",properties:(g=p.config)==null?void 0:g.schema}})}):s.jsx(v.Spin,{})}function Ke(){var a;const{userJob:o}=l.useFlowContext(),n=e.useRecord(),{data:r}=e.useCurrentUserContext(),{form:t}=e.useFormBlockContext(),i=o.status?n?"readPretty":"disabled":((a=r==null?void 0:r.data)==null?void 0:a.id)!==o.userId?"disabled":"editable";return m.useEffect(()=>{t==null||t.setPattern(i)},[i,t]),{form:t}}function Le(){const{form:o}=e.useFormBlockContext();return{form:o}}function Qe(){const o=e.useCompile(),{status:n,updatedAt:r}=e.useRecord(),t=l.JobStatusOptionsMap[n];return n?s.jsxs(v.Space,{children:[s.jsx("time",{className:e.css`
12
+ margin-right: 0.5em;
13
+ `,children:se(r).format("YYYY-MM-DD HH:mm:ss")}),s.jsx(v.Tag,{icon:t.icon,color:t.color,children:o(t.label)})]}):null}function Ye(){var a;const o=m.useContext(e.SchemaComponentContext),{id:n,node:r,workflow:t,status:i}=e.useRecord();return s.jsx(e.SchemaComponentContext.Provider,{value:F(y({},o),{reset(){},designable:!1}),children:s.jsx(e.SchemaComponent,{components:{FooterStatus:Qe,FlowContextProvider:Je},schema:{type:"void",name:`drawer-${n}-${i}`,"x-component":"Action.Drawer","x-component-props":{className:"nb-action-popup"},title:`${t.title} - ${(a=r.title)!=null?a:`#${r.id}`}`,properties:{tabs:{type:"void","x-component":"FlowContextProvider"},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{content:{type:"void","x-component":"FooterStatus"}}}}}})})}function He({params:o={},children:n}){const a=e.useCollectionManager(),{collections:r}=a,t=M(a,["collections"]),i={collection:"users_jobs",resource:"users_jobs",action:"list",params:F(y({pageSize:20,sort:["-createdAt"]},o),{appends:["user","node","workflow"],except:["node.config","workflow.config","workflow.options"]}),rowKey:"id",showIndex:!0,dragSort:!1};return s.jsx(e.CollectionManagerProvider,F(y({},t),{collections:[...r,Pe,Ve,je],children:s.jsx(e.TableBlockProvider,F(y({name:"workflow-todo"},i),{children:n}))}))}K.Drawer=Ye,K.Decorator=He;const Xe=()=>{const o=e.useSchemaInitializerItem(),{insert:n}=e.useSchemaInitializer();return s.jsx(e.SchemaInitializerItem,F(y({icon:s.jsx(U.TableOutlined,{})},o),{onClick:()=>{n({type:"void","x-decorator":"WorkflowTodo.Decorator","x-decorator-props":{},"x-component":"CardItem","x-designer":"TableBlockDesigner",properties:{todos:{type:"void","x-component":"WorkflowTodo"}}})}}))};class Ze extends e.Plugin{afterAdd(){return $(this,null,function*(){})}load(){return $(this,null,function*(){this.addComponents();const n=this.app.pm.get("workflow"),r=new Me;n.instructions.register(r.type,r),this.app.schemaInitializerManager.add(ve),this.app.schemaInitializerManager.add(Ae),this.app.schemaInitializerManager.add(he),this.app.schemaInitializerManager.get("BlockInitializers").add("otherBlocks.workflowTodos",{title:`{{t("Workflow todos", { ns: "${C}" })}}`,Component:"WorkflowTodoBlockInitializer",icon:"CheckSquareOutlined"})})}addComponents(){this.app.addComponents({WorkflowTodo:K,WorkflowTodoBlockInitializer:Xe})}}f.default=Ze,Object.defineProperties(f,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export declare function AssigneesSelect({ multiple, value, onChange }: {
3
+ multiple?: boolean;
4
+ value?: any[];
5
+ onChange: any;
6
+ }): React.JSX.Element;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare function DetailsBlockProvider(props: any): React.JSX.Element;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare function FormBlockInitializer(): React.JSX.Element;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare function FormBlockProvider(props: any): React.JSX.Element;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare function ModeConfig({ value, onChange }: {
3
+ value: any;
4
+ onChange: any;
5
+ }): React.JSX.Element;
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ import { ISchema } from '@formily/react';
3
+ import { SchemaInitializer, SchemaInitializerItemType } from '@nocobase/client';
4
+ import { JOB_STATUS } from '@nocobase/plugin-workflow/client';
5
+ type ValueOf<T> = T[keyof T];
6
+ export type FormType = {
7
+ type: 'create' | 'update' | 'custom';
8
+ title: string;
9
+ actions: ValueOf<typeof JOB_STATUS>[];
10
+ collection: string | {
11
+ name: string;
12
+ fields: any[];
13
+ [key: string]: any;
14
+ };
15
+ };
16
+ export type ManualFormType = {
17
+ title: string;
18
+ config: {
19
+ useInitializer: ({ collections }?: {
20
+ collections: any[];
21
+ }) => SchemaInitializerItemType;
22
+ initializers?: {
23
+ [key: string]: React.FC;
24
+ };
25
+ components?: {
26
+ [key: string]: React.FC;
27
+ };
28
+ parseFormOptions(root: ISchema): {
29
+ [key: string]: FormType;
30
+ };
31
+ };
32
+ block: {
33
+ scope?: {
34
+ [key: string]: () => any;
35
+ };
36
+ components?: {
37
+ [key: string]: React.FC;
38
+ };
39
+ };
40
+ };
41
+ export declare const manualFormTypes: any;
42
+ export declare const addBlockButton: SchemaInitializer<import("antd").ButtonProps, {}>;
43
+ export declare const addActionButton: SchemaInitializer<import("antd").ButtonProps, {}>;
44
+ export declare function SchemaConfig({ value, onChange }: {
45
+ value: any;
46
+ onChange: any;
47
+ }): React.JSX.Element;
48
+ export declare function SchemaConfigButton(props: any): React.JSX.Element;
49
+ export {};
@@ -0,0 +1,3 @@
1
+ import { ManualFormType } from '../SchemaConfig';
2
+ declare const _default: ManualFormType;
3
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import { SchemaInitializer } from '@nocobase/client';
2
+ import { ManualFormType } from '../SchemaConfig';
3
+ export declare const addCustomFormField: SchemaInitializer<import("antd").ButtonProps, any>;
4
+ declare const _default: ManualFormType;
5
+ export default _default;
@@ -0,0 +1,3 @@
1
+ import { ManualFormType } from '../SchemaConfig';
2
+ declare const _default: ManualFormType;
3
+ export default _default;
@@ -0,0 +1,83 @@
1
+ import { SchemaInitializerItemType } from '@nocobase/client';
2
+ import { Instruction } from '@nocobase/plugin-workflow/client';
3
+ import { SchemaConfig, SchemaConfigButton } from './SchemaConfig';
4
+ import { ModeConfig } from './ModeConfig';
5
+ import { AssigneesSelect } from './AssigneesSelect';
6
+ export default class extends Instruction {
7
+ title: string;
8
+ type: string;
9
+ group: string;
10
+ description: string;
11
+ fieldset: {
12
+ assignees: {
13
+ type: string;
14
+ title: string;
15
+ 'x-decorator': string;
16
+ 'x-component': string;
17
+ 'x-component-props': {};
18
+ required: boolean;
19
+ default: any[];
20
+ };
21
+ mode: {
22
+ type: string;
23
+ title: string;
24
+ 'x-decorator': string;
25
+ 'x-component': string;
26
+ default: number;
27
+ 'x-reactions': {
28
+ dependencies: string[];
29
+ fulfill: {
30
+ state: {
31
+ visible: string;
32
+ };
33
+ };
34
+ };
35
+ };
36
+ schema: {
37
+ type: string;
38
+ title: string;
39
+ 'x-decorator': string;
40
+ 'x-component': string;
41
+ properties: {
42
+ schema: {
43
+ type: string;
44
+ 'x-component': string;
45
+ default: any;
46
+ };
47
+ };
48
+ };
49
+ forms: {
50
+ type: string;
51
+ default: {};
52
+ };
53
+ };
54
+ components: {
55
+ SchemaConfigButton: typeof SchemaConfigButton;
56
+ SchemaConfig: typeof SchemaConfig;
57
+ ModeConfig: typeof ModeConfig;
58
+ AssigneesSelect: typeof AssigneesSelect;
59
+ };
60
+ useVariables({ key, title, config }: {
61
+ key: any;
62
+ title: any;
63
+ config: any;
64
+ }, { types, fieldNames }: {
65
+ types: any;
66
+ fieldNames?: {
67
+ readonly label: "label";
68
+ readonly value: "value";
69
+ readonly children: "children";
70
+ };
71
+ }): {
72
+ value: any;
73
+ label: any;
74
+ children: {
75
+ key: string;
76
+ value: string;
77
+ label: any;
78
+ title: any;
79
+ children: import("@nocobase/plugin-workflow/client").VariableOption[];
80
+ }[];
81
+ };
82
+ useInitializers(node: any): SchemaInitializerItemType | null;
83
+ }
@@ -0,0 +1 @@
1
+ export declare function findSchema(schema: any, filter: any, onlyLeaf?: boolean): any[];
@@ -0,0 +1,18 @@
1
+ module.exports = {
2
+ "react": "18.2.0",
3
+ "@formily/react": "2.2.27",
4
+ "antd": "5.8.6",
5
+ "dayjs": "1.11.9",
6
+ "@nocobase/client": "0.17.0-alpha.4",
7
+ "@nocobase/plugin-workflow": "0.17.0-alpha.4",
8
+ "@ant-design/icons": "5.1.4",
9
+ "react-i18next": "11.18.6",
10
+ "@nocobase/utils": "0.17.0-alpha.4",
11
+ "@nocobase/server": "0.17.0-alpha.4",
12
+ "@nocobase/actions": "0.17.0-alpha.4",
13
+ "@nocobase/resourcer": "0.17.0-alpha.4",
14
+ "@formily/core": "2.2.27",
15
+ "@formily/antd-v5": "1.1.7",
16
+ "@nocobase/database": "0.17.0-alpha.4",
17
+ "lodash": "4.17.21"
18
+ };
@@ -0,0 +1,2 @@
1
+ export * from './server';
2
+ export { default } from './server';
package/dist/index.js ADDED
@@ -0,0 +1,39 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var src_exports = {};
30
+ __export(src_exports, {
31
+ default: () => import_server.default
32
+ });
33
+ module.exports = __toCommonJS(src_exports);
34
+ __reExport(src_exports, require("./server"), module.exports);
35
+ var import_server = __toESM(require("./server"));
36
+ // Annotate the CommonJS export names for ESM import in node:
37
+ 0 && (module.exports = {
38
+ ...require("./server")
39
+ });
@@ -0,0 +1,30 @@
1
+ {
2
+ "Manual": "Manual",
3
+ "Could be used for manually submitting data, and determine whether to continue or exit. Workflow will generate a todo item for assigned user when it reaches a manual node, and continue processing after user submits the form.": "Could be used for manually submitting data, and determine whether to continue or exit. Workflow will generate a todo item for assigned user when it reaches a manual node, and continue processing after user submits the form.",
4
+ "Values preset in this form will override user submitted ones when continue or reject.": "Values preset in this form will override user submitted ones when continue or reject.",
5
+ "Assignee": "Assignee",
6
+ "Assignees": "Assignees",
7
+ "User interface": "User interface",
8
+ "Configure user interface": "Configure user interface",
9
+ "View user interface": "View user interface",
10
+ "Separately": "Separately",
11
+ "Each user has own task": "Each user has own task",
12
+ "Collaboratively": "Collaboratively",
13
+ "Everyone shares one task": "Everyone shares one task",
14
+ "Negotiation": "Negotiation",
15
+ "All pass": "All pass",
16
+ "Everyone should pass": "Everyone should pass",
17
+ "Any pass": "Any pass",
18
+ "Anyone pass": "Anyone pass",
19
+ "Field name existed in form": "Field name existed in form",
20
+ "Continue the process": "Continue the process",
21
+ "Terminate the process": "Terminate the process",
22
+ "Save temporarily": "Save temporarily",
23
+ "Custom form": "Custom form",
24
+ "Data record": "Data record",
25
+ "Create record form": "Create record form",
26
+ "Update record form": "Update record form",
27
+ "Filter settings": "Filter settings",
28
+ "Workflow todos": "Workflow todos",
29
+ "Task": "Task"
30
+ }
@@ -0,0 +1,3 @@
1
+ export declare const NAMESPACE = "workflow-manual";
2
+ export declare function useLang(key: string, options?: {}): string;
3
+ export declare function usePluginTranslation(options: any): import("react-i18next").UseTranslationResponse<"workflow-manual", undefined>;
@@ -0,0 +1,39 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var locale_exports = {};
19
+ __export(locale_exports, {
20
+ NAMESPACE: () => NAMESPACE,
21
+ useLang: () => useLang,
22
+ usePluginTranslation: () => usePluginTranslation
23
+ });
24
+ module.exports = __toCommonJS(locale_exports);
25
+ var import_react_i18next = require("react-i18next");
26
+ const NAMESPACE = "workflow-manual";
27
+ function useLang(key, options = {}) {
28
+ const { t } = usePluginTranslation(options);
29
+ return t(key);
30
+ }
31
+ function usePluginTranslation(options) {
32
+ return (0, import_react_i18next.useTranslation)(NAMESPACE, options);
33
+ }
34
+ // Annotate the CommonJS export names for ESM import in node:
35
+ 0 && (module.exports = {
36
+ NAMESPACE,
37
+ useLang,
38
+ usePluginTranslation
39
+ });
@@ -0,0 +1,30 @@
1
+ {
2
+ "Manual": "人工处理",
3
+ "Could be used for manually submitting data, and determine whether to continue or exit. Workflow will generate a todo item for assigned user when it reaches a manual node, and continue processing after user submits the form.": "可用于人工提交数据,并决定是否继续或退出流程。工作流在执行到人工节点时会为被指派的用户生成待办事项,直到用户提交对应表单后继续处理该流程。",
4
+ "Values preset in this form will override user submitted ones when continue or reject.": "表单中预设的字段值会在用户提交继续或拒绝时覆盖相应字段的值。",
5
+ "Assignee": "负责人",
6
+ "Assignees": "负责人",
7
+ "User interface": "操作界面",
8
+ "Configure user interface": "配置界面",
9
+ "View user interface": "查看界面",
10
+ "Separately": "分别处理",
11
+ "Each user has own task": "每个人处理各自的任务",
12
+ "Collaboratively": "协作处理",
13
+ "Everyone shares one task": "所有人共享同一个任务",
14
+ "Negotiation": "协商机制",
15
+ "All pass": "全部通过",
16
+ "Everyone should pass": "每个人通过才通过",
17
+ "Any pass": "任意通过",
18
+ "Anyone pass": "任何一人通过即通过",
19
+ "Field name existed in form": "表单中已有对应标识的字段",
20
+ "Continue the process": "继续流程",
21
+ "Terminate the process": "终止流程",
22
+ "Save temporarily": "暂存",
23
+ "Custom form": "自定义表单",
24
+ "Data record": "数据记录",
25
+ "Create record form": "新增数据表单",
26
+ "Update record form": "更新数据表单",
27
+ "Filter settings": "筛选设置",
28
+ "Workflow todos": "工作流待办",
29
+ "Task": "任务"
30
+ }
@@ -0,0 +1,28 @@
1
+ import { Registry } from '@nocobase/utils';
2
+ import WorkflowPlugin, { Processor, Instruction } from '@nocobase/plugin-workflow';
3
+ import { FormHandler } from './forms';
4
+ type FormType = {
5
+ type: 'custom' | 'create' | 'update';
6
+ actions: number[];
7
+ options: {
8
+ [key: string]: any;
9
+ };
10
+ };
11
+ export interface ManualConfig {
12
+ schema: {
13
+ [key: string]: any;
14
+ };
15
+ forms: {
16
+ [key: string]: FormType;
17
+ };
18
+ assignees?: (number | string)[];
19
+ mode?: number;
20
+ }
21
+ export default class extends Instruction {
22
+ plugin: WorkflowPlugin;
23
+ formTypes: Registry<FormHandler>;
24
+ constructor(plugin: WorkflowPlugin);
25
+ run(node: any, prevJob: any, processor: Processor): Promise<any>;
26
+ resume(node: any, job: any, processor: Processor): Promise<any>;
27
+ }
28
+ export {};