@nocobase/plugin-workflow-manual 0.19.0-alpha.9 → 0.20.0-alpha.2

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.
@@ -1,13 +1,13 @@
1
- (function(C,e){typeof exports=="object"&&typeof module!="undefined"?e(exports,require("@nocobase/client"),require("@nocobase/plugin-workflow/client"),require("react/jsx-runtime"),require("@formily/antd-v5"),require("@formily/core"),require("@formily/react"),require("antd"),require("react"),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","@formily/antd-v5","@formily/core","@formily/react","antd","react","react-i18next","@nocobase/utils/client","lodash","@ant-design/icons","dayjs"],e):(C=typeof globalThis!="undefined"?globalThis:C||self,e(C["@nocobase/plugin-workflow-manual"]={},C["@nocobase/client"],C["@nocobase/plugin-workflow"],C.jsxRuntime,C["@formily/antd-v5"],C["@formily/core"],C["@formily/react"],C.antd,C.react,C["react-i18next"],C["@nocobase/utils"],C.lodash,C["@ant-design/icons"],C.dayjs))})(this,function(C,e,p,s,U,q,b,S,m,j,T,G,_,se){"use strict";var Re=Object.defineProperty,eo=Object.defineProperties;var oo=Object.getOwnPropertyDescriptors;var J=Object.getOwnPropertySymbols;var ne=Object.prototype.hasOwnProperty,re=Object.prototype.propertyIsEnumerable;var L=(C,e,p)=>e in C?Re(C,e,{enumerable:!0,configurable:!0,writable:!0,value:p}):C[e]=p,g=(C,e)=>{for(var p in e||(e={}))ne.call(e,p)&&L(C,p,e[p]);if(J)for(var p of J(e))re.call(e,p)&&L(C,p,e[p]);return C},F=(C,e)=>eo(C,oo(e));var M=(C,e)=>{var p={};for(var s in C)ne.call(C,s)&&e.indexOf(s)<0&&(p[s]=C[s]);if(C!=null&&J)for(var s of J(C))e.indexOf(s)<0&&re.call(C,s)&&(p[s]=C[s]);return p};var $=(C,e,p)=>(L(C,typeof e!="symbol"?e+"":e,p),p);var E=(C,e,p)=>new Promise((s,U)=>{var q=m=>{try{S(p.next(m))}catch(j){U(j)}},b=m=>{try{S(p.throw(m))}catch(j){U(j)}},S=m=>m.done?s(m.value):Promise.resolve(m.value).then(q,b);S((p=p.apply(C,e)).next())});const y="workflow-manual";function B(o,n={}){const{t:r}=ie(n);return r(o)}function ie(o){return j.useTranslation(y,o)}function ae(o){const{execution:n,nodes:r}=p.useFlowContext(),t=m.useMemo(()=>r.reduce((l,f)=>Object.assign(l,{[f.id]:f.key}),{}),[r]),i=m.useMemo(()=>{var l;return{$context:n==null?void 0:n.context,$jobsMapByNodeKey:((l=n==null?void 0:n.jobs)!=null?l:[]).reduce((f,u)=>Object.assign(f,{[t[u.nodeId]]:u.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),{getAssociationAppends:t}=e.useAssociationNames(),{appends:i,updateAssociationValues:a}=t(),l=ae(o.dataSource),f=m.useMemo(()=>q.createForm({values:l,readPretty:!0}),[l]),u={appends:i},h={loading:!1,data:{data:l}},c=e.useAPIClient().resource(o.collection),d=m.useContext(e.BlockRequestContext);return s.jsx(e.CollectionProvider,{collection:o.collection,children:s.jsx(e.RecordProvider,{record:l,parent:!1,children:s.jsx(e.BlockRequestContext.Provider,{value:{block:"form",field:n,service:h,resource:c,__parent:d},children:s.jsx(e.FormBlockContext.Provider,{value:{params:u,form:f,field:n,service:h,updateAssociationValues:a,formBlockRef:r},children:o.children})})})})}function Y(o){var w,z,N;const n=e.useRecord(),r=b.useFieldSchema(),t=b.useField(),i=m.useRef(null),{getAssociationAppends:a}=e.useAssociationNames(),{appends:l,updateAssociationValues:f}=a(),[u]=Object.keys((w=r.toJSON().properties)!=null?w:{}),h=(z=n==null?void 0:n.result)==null?void 0:z[u],{findComponent:x}=e.useDesignable(),c=x((N=t.component)==null?void 0:N[0])||m.Fragment,d=m.useMemo(()=>q.createForm({initialValues:h}),[h]),v=m.useMemo(()=>g({appends:l},o.params),[l,o.params]),A=m.useMemo(()=>({loading:!1,data:{data:h}}),[h]),I=e.useAPIClient().resource(o.collection),O=m.useContext(e.BlockRequestContext),D=m.useMemo(()=>({params:v,form:d,field:t,service:A,updateAssociationValues:f,formBlockRef:i}),[t,d,v,A,f]);return!n.status||h?s.jsx(e.CollectionProvider,{collection:o.collection,children:s.jsx(e.RecordProvider,{record:h,parent:!1,children:s.jsx(e.FormActiveFieldsProvider,{name:"form",children:s.jsx(e.BlockRequestContext.Provider,{value:{block:"form",props:o,field:t,service:A,resource:I,__parent:O},children:s.jsx(e.FormBlockContext.Provider,{value:D,children:s.jsxs(c,F(g({},t.componentProps),{children:[s.jsx(e.FormV2.Templates,{style:{marginBottom:18},form:d}),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(),l=e.useRecordCollectionDataSourceItems("FormItem");function f(h){return E(this,arguments,function*({item:u}){var A;const x=u.template?yield i(u):null,c=e.createFormBlockSchema(F(g({actionInitializers:"AddActionButton",actions:{resolve:{type:"void",title:`{{t("Continue the process", { ns: "${y}" })}}`,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:p.JOB_STATUS.RESOLVED},"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useSubmit }}"},"x-designer":"ManualActionDesigner","x-designer-props":{}}}},o),{template:x}));delete c["x-acl-action-props"],delete c["x-acl-action"];const[d]=Object.keys(c.properties),v=((A=Object.entries(c.properties[d].properties).find(([k,I])=>I["x-component"]==="ActionBar"))==null?void 0:A[0])||"actions";c.properties[d].properties[v]["x-decorator"]="ActionBarProvider",c.properties[d].properties[v]["x-component-props"].style={marginTop:"1.5em",flexWrap:"wrap"},p.traverseSchema(c,k=>{k["x-uid"]&&delete k["x-uid"]}),a(c)})}return s.jsx(e.SchemaInitializerItem,F(g({},n),{onClick:f,items:l}))}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,g({},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: "${y}" })}}`,config:{useInitializer({collections:o}){const n=m.useMemo(()=>o.map(a=>({name:G.camelCase(`createRecordForm-child-${a.name}`),type:"item",title:a.title,label:a.label,schema:{collection:a.name,title:`{{t("Create record", { ns: "${y}" })}}`,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: "${y}" })}}`,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 f,u;const[i]=Object.keys(t.properties),a=t.properties[i],l=((f=Object.entries(a.properties).find(([h,x])=>x["x-component"]==="ActionBar"))==null?void 0:f[0])||"actions";n[i]={type:"create",title:((u=t["x-component-props"])==null?void 0:u.title)||i,actions:P(a.properties[l],h=>h["x-component"]==="Action").map(h=>{var x,c;return{status:h["x-decorator-props"].value,values:(c=(x=h["x-action-settings"])==null?void 0:x.assignedValues)==null?void 0:c.values,key:h.name}}),collection:t["x-decorator-props"].collection}}),n}},block:{scope:{},components:{}}};function X(o){var h,x,c,d;const[n,r]=m.useState((x=(h=o.collection)==null?void 0:h.fields)!=null?x:[]),t=e.useRecord(),i=b.useField(),a=b.useFieldSchema(),[l]=Object.keys((c=a.toJSON().properties)!=null?c:{}),f=(d=t==null?void 0:t.result)==null?void 0:d[l],u=m.useMemo(()=>q.createForm({initialValues:f}),[f]);return!t.status||f?s.jsx(e.CollectionProvider,{collection:F(g({},o.collection),{fields:n}),children:s.jsx(e.RecordProvider,{record:f,parent:!1,children:s.jsx(e.FormBlockContext.Provider,{value:{form:u,field:i,setCollectionFields:r},children:o.children})})}):null}function de(){const{insert:o}=e.useSchemaInitializer(),n=e.useSchemaInitializerItem();return s.jsx(e.SchemaInitializerItem,F(g({},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: "${y}" })}}`,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:p.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]||{},G.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 g({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(),l=m.useContext(e.CollectionContext),{setCollectionFields:f}=m.useContext(e.FormBlockContext);return s.jsxs(W.Provider,{value:{onAddField(u){const v=G.cloneDeep(u),{properties:A}=v,k=A,{unique:h,type:x}=k,c=M(k,["unique","type"]),d=M(v,["properties"]);delete c.name["x-disabled"],r(F(g({},d),{properties:c}))},setCallback:i},children:[s.jsx(e.SchemaInitializerItems,F(g({},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(g({},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 u=b.useForm();return{run(){return E(this,null,function*(){i(null),r(null),u.reset()})}}}}},submit:{type:"void",title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction(){const{values:u,query:h}=b.useForm(),x=[B("Field name existed in form")];return{run(){return E(this,null,function*(){var I,O,D,w;const{default:d}=n,v=T.uid();if(d.name=(I=u.name)!=null?I:v,d.uiSchema.title=(D=(O=u.uiSchema)==null?void 0:O.title)!=null?D:v,d.interface=n.name,(w=l.fields)==null?void 0:w.find(z=>z.name===d.name)){h("name").take().setFeedback({type:"error",messages:x});return}const k=T.merge(d,u);f([...l.fields,k]),t({name:d.name,type:d.uiSchema.type,"x-decorator":"FormItem","x-component":"CollectionField","x-component-props":{field:k},"x-collection-field":`${l.name}.${d.name}`,"x-designer":"FormItem.Designer"}),i(null),r(null)})}}}}}}}})},components:{ArrayTable:U.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(),l=a(o.fieldInterface);return s.jsx(e.SchemaInitializerItem,g({onClick:()=>{i(()=>n),t(l),r(!1)}},o),o.fieldInterface)}const R={title:`{{t("Custom form", { ns: "${y}" })}}`,config:{useInitializer(){return{name:"customForm",type:"item",title:`{{t("Custom form", { ns: "${y}" })}}`,Component:de}},initializers:{},components:{CustomFormBlockProvider:X},parseFormOptions(o){const n={};return P(o,t=>t["x-decorator"]==="CustomFormBlockProvider").forEach(t=>{var u,h;const[i]=Object.keys(t.properties),a=t.properties[i],l=P(a.properties.grid,x=>x["x-component"]==="CollectionField",!0);t["x-decorator-props"].collection.fields=l.map(x=>{var c,d;return(d=(c=x["x-component-props"])==null?void 0:c.field)!=null?d:x["x-interface-options"]});const f=((u=Object.entries(a.properties).find(([x,c])=>c["x-component"]==="ActionBar"))==null?void 0:u[0])||"actions";n[i]={type:"custom",title:((h=t["x-component-props"])==null?void 0:h.title)||i,actions:P(a.properties[f],x=>x["x-component"]==="Action").map(x=>{var c,d;return{status:x["x-decorator-props"].value,values:(d=(c=x["x-action-settings"])==null?void 0:c.assignedValues)==null?void 0:d.values,key:x.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:y}),schema:{name:"filter",type:"object",title:'{{t("Filter")}}',"x-component":"Filter","x-component-props":{useProps(){var l;return{options:e.useCollectionFilterOptions((l=r==null?void 0:r["x-decorator-props"])==null?void 0:l.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 ye={title:`{{t("Update record form", { ns: "${y}" })}}`,config:{useInitializer({collections:o}){const n=m.useMemo(()=>o.map(a=>({name:G.camelCase(`updateRecordForm-child-${a.name}`),type:"item",title:a.title,label:a.label,schema:{collection:a.name,title:`{{t("Update record", { ns: "${y}" })}}`,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: "${y}" })}}`,componentProps:{onOpenChange(a){t(a.length>0)}},children:i}},initializers:{},components:{FilterDynamicComponent:p.FilterDynamicComponent,UpdateFormDesigner:Ce},parseFormOptions(o){const n={};return P(o,t=>t["x-decorator"]==="FormBlockProvider"&&t["x-decorator-props"].formType==="update").forEach(t=>{var f,u;const[i]=Object.keys(t.properties),a=t.properties[i],l=((f=Object.entries(a.properties).find(([h,x])=>x["x-component"]==="ActionBar"))==null?void 0:f[0])||"actions";n[i]=F(g({},t["x-decorator-props"]),{type:"update",title:((u=t["x-component-props"])==null?void 0:u.title)||i,actions:P(a.properties[l],h=>h["x-component"]==="Action").map(h=>{var x,c;return{status:h["x-decorator-props"].value,values:(c=(x=h["x-action-settings"])==null?void 0:x.assignedValues)==null?void 0:c.values,key:h.name}})})}),n}},block:{scope:{},components:{}}},V=new T.Registry;V.register("customForm",R),V.register("createForm",pe),V.register("updateForm",ye);function ge(){const{workflow:o}=p.useFlowContext(),n=p.useTrigger();return n.useInitializers?n.useInitializers(o.config):null}const be={customForm:R.title,record:`{{t("Data record", { ns: "${y}" })}}`};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(p),n=p.useNodeContext(),r=p.useAvailableUpstreams(n),t=[ge()].filter(Boolean),i=r.map(l=>{var u;const f=o.instructions.get(l.type);return(u=f==null?void 0:f.useInitializers)==null?void 0:u.call(f,l)}).filter(Boolean);return[...t,...i.length?[{name:"nodes",type:"subMenu",title:`{{t("Node result", { ns: "${y}" })}}`,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,O,D;const o=m.useContext(e.SchemaComponentContext),{t:n}=j.useTranslation(),r=b.useFieldSchema(),t=p.useWorkflowVariableOptions(),[i,a]=m.useState(!1),[l,f]=m.useState((D=(O=(I=r==null?void 0:r["x-action-settings"])==null?void 0:I.assignedValues)==null?void 0:O.schema)!=null?D:{type:"void","x-component":"Grid","x-initializer":"CustomFormItemInitializers",properties:{}}),[u,h]=m.useState(null),{components:x}=e.useSchemaOptionsContext();m.useEffect(()=>{h(new b.Schema({properties:{grid:l}}))},[l]);const c=m.useMemo(()=>{var z,N;const w=(N=(z=r==null?void 0:r["x-action-settings"])==null?void 0:z.assignedValues)==null?void 0:N.values;return q.createForm({initialValues:T.lodash.cloneDeep(w),values:T.lodash.cloneDeep(w)})},[r]),d=e.useFormActiveFields(),v=n("Assign field values");function A(){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=l,r["x-action-settings"].assignedValues.values=c.values,a(!1),setTimeout(()=>{var w;(w=o.refresh)==null||w.call(o)},300)}return s.jsxs(s.Fragment,{children:[s.jsx(e.SchemaSettingsItem,{title:v,onClick:()=>a(!0),children:v}),s.jsx(S.Modal,{width:"50%",title:v,open:i,onCancel:A,footer:s.jsxs(S.Space,{children:[s.jsx(S.Button,{onClick:A,children:n("Cancel")}),s.jsx(S.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:d==null?void 0:d.getActiveFieldsName,children:s.jsx(b.FormProvider,{form:c,children:s.jsxs(U.FormLayout,{layout:"vertical",children:[s.jsx(S.Alert,{message:B("Values preset in this form will override user submitted ones when continue or reject.")}),s.jsx("br",{}),i&&u&&s.jsx(e.SchemaComponentContext.Provider,{value:F(g({},o),{refresh(){f(T.lodash.get(u.toJSON(),"properties.grid"))}}),children:s.jsx(e.SchemaComponent,{schema:u,components:x})})]})})})})})})]})}function ke(o){return s.jsxs(e.GeneralSchemaDesigner,F(g({},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 Ae(){const a=e.useSchemaInitializerItem(),{action:n,actionProps:r}=a,t=M(a,["action","actionProps"]),{insert:i}=e.useSchemaInitializer();return s.jsx(e.SchemaInitializerItem,F(g({},t),{onClick:()=>{i({type:"void",title:t.title,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:n},"x-component":"Action","x-component-props":F(g({},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(g({},t),{item:o,schema:{type:"void",title:t.title,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:n},"x-component":"Action","x-component-props":F(g({},r),{useAction:"{{ useSubmit }}"}),"x-designer":"Action.Designer","x-action":`${n}`},type:"x-action"}))}const Ie=new e.SchemaInitializer({name:"AddActionButton",title:'{{t("Configure actions")}}',items:[{name:"jobStatusResolved",title:`{{t("Continue the process", { ns: "${y}" })}}`,Component:Ae,action:p.JOB_STATUS.RESOLVED,actionProps:{type:"primary"}},{name:"jobStatusRejected",title:`{{t("Terminate the process", { ns: "${y}" })}}`,Component:ee,action:p.JOB_STATUS.REJECTED,actionProps:{danger:!0}},{name:"jobStatusPending",title:`{{t("Save temporarily", { ns: "${y}" })}}`,Component:ee,action:p.JOB_STATUS.PENDING}]});function we(){return{run(){}}}function Be({value:o,onChange:n}){const r=e.usePlugin(p),t=m.useContext(e.SchemaComponentContext),i=p.useNodeContext(),a=p.useAvailableUpstreams(i),l=b.useForm(),{workflow:f}=p.useFlowContext(),u={};a.forEach(c=>{const d=r.instructions.get(c.type);Object.assign(u,d.components)});const h=m.useMemo(()=>new b.Schema({properties:{drawer:{type:"void",title:`{{t("User interface", { ns: "${y}" })}}`,"x-decorator":"Form","x-component":"Action.Drawer","x-component-props":{className:e.css`
1
+ (function(C,e){typeof exports=="object"&&typeof module!="undefined"?e(exports,require("@nocobase/client"),require("@nocobase/plugin-workflow/client"),require("react/jsx-runtime"),require("@formily/antd-v5"),require("@formily/core"),require("@formily/react"),require("antd"),require("react"),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","@formily/antd-v5","@formily/core","@formily/react","antd","react","react-i18next","@nocobase/utils/client","lodash","@ant-design/icons","dayjs"],e):(C=typeof globalThis!="undefined"?globalThis:C||self,e(C["@nocobase/plugin-workflow-manual"]={},C["@nocobase/client"],C["@nocobase/plugin-workflow"],C.jsxRuntime,C["@formily/antd-v5"],C["@formily/core"],C["@formily/react"],C.antd,C.react,C["react-i18next"],C["@nocobase/utils"],C.lodash,C["@ant-design/icons"],C.dayjs))})(this,function(C,e,d,s,E,U,b,S,h,j,T,J,K,se){"use strict";var Re=Object.defineProperty,eo=Object.defineProperties;var oo=Object.getOwnPropertyDescriptors;var L=Object.getOwnPropertySymbols;var ne=Object.prototype.hasOwnProperty,re=Object.prototype.propertyIsEnumerable;var Q=(C,e,d)=>e in C?Re(C,e,{enumerable:!0,configurable:!0,writable:!0,value:d}):C[e]=d,g=(C,e)=>{for(var d in e||(e={}))ne.call(e,d)&&Q(C,d,e[d]);if(L)for(var d of L(e))re.call(e,d)&&Q(C,d,e[d]);return C},k=(C,e)=>eo(C,oo(e));var V=(C,e)=>{var d={};for(var s in C)ne.call(C,s)&&e.indexOf(s)<0&&(d[s]=C[s]);if(C!=null&&L)for(var s of L(C))e.indexOf(s)<0&&re.call(C,s)&&(d[s]=C[s]);return d};var $=(C,e,d)=>(Q(C,typeof e!="symbol"?e+"":e,d),d);var _=(C,e,d)=>new Promise((s,E)=>{var U=h=>{try{S(d.next(h))}catch(j){E(j)}},b=h=>{try{S(d.throw(h))}catch(j){E(j)}},S=h=>h.done?s(h.value):Promise.resolve(h.value).then(U,b);S((d=d.apply(C,e)).next())});const y="workflow-manual";function w(o,n={}){const{t:r}=ie(n);return r(o)}function ie(o){return j.useTranslation(y,o)}function ae(o){const{execution:n,nodes:r}=d.useFlowContext(),t=h.useMemo(()=>r.reduce((c,u)=>Object.assign(c,{[u.id]:u.key}),{}),[r]),i=h.useMemo(()=>{var c;return{$context:n==null?void 0:n.context,$jobsMapByNodeKey:((c=n==null?void 0:n.jobs)!=null?c:[]).reduce((u,l)=>Object.assign(u,{[t[l.nodeId]]:l.result}),{})}},[n==null?void 0:n.context,n==null?void 0:n.jobs,t]);return h.useMemo(()=>T.parse(o)(i),[i,o])}function H(o){const n=b.useField(),r=h.useRef(null),{getAssociationAppends:t}=e.useAssociationNames(),{appends:i,updateAssociationValues:a}=t(),c=ae(o.dataSource),u=h.useMemo(()=>U.createForm({values:c,readPretty:!0}),[c]),l={appends:i},x={loading:!1,data:{data:c}},p=e.useAPIClient().resource(o.collection),m=e.useBlockRequestContext();return s.jsx(e.CollectionProvider_deprecated,{collection:o.collection,children:s.jsx(e.RecordProvider,{record:c,parent:null,children:s.jsx(e.BlockRequestContext_deprecated.Provider,{value:{block:"form",field:n,service:x,resource:p,__parent:m},children:s.jsx(e.FormBlockContext.Provider,{value:{params:l,form:u,field:n,service:x,updateAssociationValues:a,formBlockRef:r},children:o.children})})})})}function X(o){var N,q,G;const n=e.useRecord(),r=b.useFieldSchema(),t=b.useField(),i=h.useRef(null),a=o.dataSource||e.DEFAULT_DATA_SOURCE_KEY,{getAssociationAppends:c}=e.useAssociationNames(a),{appends:u,updateAssociationValues:l}=c(),[x]=Object.keys((N=r.toJSON().properties)!=null?N:{}),f=(q=n==null?void 0:n.result)==null?void 0:q[x],{findComponent:p}=e.useDesignable(),m=p((G=t.component)==null?void 0:G[0])||h.Fragment,v=h.useMemo(()=>U.createForm({initialValues:f}),[f]),A=h.useMemo(()=>g({appends:u},o.params),[u,o.params]),F=h.useMemo(()=>({loading:!1,data:{data:f}}),[f]),I=e.useAPIClient(),O=e.useDataSourceHeaders(a),D=I.resource(o.collection,void 0,O),B=e.useBlockRequestContext(),P=h.useMemo(()=>({params:A,form:v,field:t,service:F,updateAssociationValues:l,formBlockRef:i}),[t,v,A,F,l]);return!n.status||f?s.jsx(e.CollectionManagerProvider,{dataSource:a,children:s.jsx(e.CollectionProvider_deprecated,{collection:o.collection,children:s.jsx(e.RecordProvider,{record:f,parent:null,children:s.jsx(e.FormActiveFieldsProvider,{name:"form",children:s.jsx(e.BlockRequestContext_deprecated.Provider,{value:{block:"form",props:o,field:t,service:F,resource:D,__parent:B},children:s.jsx(e.FormBlockContext.Provider,{value:P,children:s.jsxs(m,k(g({},t.componentProps),{children:[s.jsx(e.FormV2.Templates,{style:{marginBottom:18},form:v}),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=V(t,["schema"]);const{getTemplateSchemaByMode:i}=e.useSchemaTemplateManager(),{insert:a}=e.useSchemaInitializer(),c=e.useRecordCollectionDataSourceItems("FormItem");function u(x){return _(this,arguments,function*({item:l}){var A;const f=l.template?yield i(l):null,p=e.createFormBlockSchema(k(g({actionInitializers:"AddActionButton",actions:{resolve:{type:"void",title:`{{t("Continue the process", { ns: "${y}" })}}`,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:d.JOB_STATUS.RESOLVED},"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useSubmit }}"},"x-designer":"ManualActionDesigner","x-designer-props":{}}}},o),{template:f}));delete p["x-acl-action-props"],delete p["x-acl-action"];const[m]=Object.keys(p.properties),v=((A=Object.entries(p.properties[m].properties).find(([F,I])=>I["x-component"]==="ActionBar"))==null?void 0:A[0])||"actions";p.properties[m].properties[v]["x-decorator"]="ActionBarProvider",p.properties[m].properties[v]["x-component-props"].style={marginTop:"1.5em",flexWrap:"wrap"},d.traverseSchema(p,F=>{F["x-uid"]&&delete F["x-uid"]}),a(p)})}return s.jsx(e.SchemaInitializerItem,k(g({},n),{onClick:u,items:c}))}function Z(){var n,r;const o=e.useSchemaInitializerItem();return s.jsx(e.CollectionProvider_deprecated,{dataSource:(n=o.schema)==null?void 0:n.dataSource,collection:(r=o.schema)==null?void 0:r.collection,children:s.jsx(ce,g({},o))})}function z(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(...z(o.properties[i],n))}),t):t}function le(){const{name:o,title:n}=e.useCollection_deprecated();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: "${y}" })}}`,config:{useInitializer({allCollections:o}){const n=h.useMemo(()=>o.map(({key:a,displayName:c,collections:u})=>({key:a,name:a,label:c,type:"subMenu",children:u.map(l=>({name:J.camelCase(`createRecordForm-child-${l.name}`),type:"item",title:l.title||l.tableName,schema:{collection:l.name,dataSource:a,title:`{{t("Create record", { ns: "${y}" })}}`,formType:"create","x-designer":"CreateFormDesigner"},Component:Z}))})),[o]),[r,t]=h.useState([]),i=e.useMenuSearch(n,r);return{name:"createRecordForm",key:"createRecordForm",type:"subMenu",title:`{{t("Create record form", { ns: "${y}" })}}`,componentProps:{onOpenChange(a){t(a)}},children:i}},initializers:{},components:{CreateFormDesigner:le},parseFormOptions(o){const n={};return z(o,t=>t["x-decorator"]==="FormBlockProvider"&&t["x-decorator-props"].formType==="create").forEach(t=>{var u,l;const[i]=Object.keys(t.properties),a=t.properties[i],c=((u=Object.entries(a.properties).find(([x,f])=>f["x-component"]==="ActionBar"))==null?void 0:u[0])||"actions";n[i]={type:"create",title:((l=t["x-component-props"])==null?void 0:l.title)||i,actions:z(a.properties[c],x=>x["x-component"]==="Action").map(x=>{var f,p;return{status:x["x-decorator-props"].value,values:(p=(f=x["x-action-settings"])==null?void 0:f.assignedValues)==null?void 0:p.values,key:x.name}}),collection:t["x-decorator-props"].collection}}),n}},block:{scope:{},components:{}}};function W(o){var x,f,p,m;const[n,r]=h.useState((f=(x=o.collection)==null?void 0:x.fields)!=null?f:[]),t=e.useRecord(),i=b.useField(),a=b.useFieldSchema(),[c]=Object.keys((p=a.toJSON().properties)!=null?p:{}),u=(m=t==null?void 0:t.result)==null?void 0:m[c],l=h.useMemo(()=>U.createForm({initialValues:u}),[u]);return!t.status||u?s.jsx(e.CollectionProvider_deprecated,{collection:k(g({},o.collection),{fields:n}),children:s.jsx(e.RecordProvider,{record:u,parent:null,children:s.jsx(e.FormBlockContext.Provider,{value:{form:l,field:i,setCollectionFields:r},children:o.children})})}):null}function de(){const{insert:o}=e.useSchemaInitializer(),n=e.useSchemaInitializerItem();return s.jsx(e.SchemaInitializerItem,k(g({},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: "${y}" })}}`,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:d.JOB_STATUS.RESOLVED},"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useSubmit }}"},"x-designer":"ManualActionDesigner"}}}}}}})}}))}const R={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]||{},J.set(n,[i,r],t)}),Object.keys(R).filter(r=>["basic","choices","datetime","media"].includes(r)).map(r=>({title:R[r],children:Object.keys(n[r]||{}).map(t=>{const i=n[r][t];return g({value:t,title:i.title,name:t},n[r][t])}).sort((t,i)=>t.order-i.order)}))}function me(){const{interfaces:o}=e.useCollectionManager_deprecated();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 ee=h.createContext({}),fe=o=>{const[n,r]=h.useState(null),[t,i]=h.useState(),a=me(),c=e.useCollection_deprecated(),{setCollectionFields:u}=h.useContext(e.FormBlockContext);return s.jsxs(ee.Provider,{value:{onAddField(l){const v=J.cloneDeep(l),{properties:A}=v,F=A,{unique:x,type:f}=F,p=V(F,["unique","type"]),m=V(v,["properties"]);delete p.name["x-disabled"],r(k(g({},m),{properties:p}))},setCallback:i},children:[s.jsx(e.SchemaInitializerItems,k(g({},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:k(g({},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 l=b.useForm();return{run(){return _(this,null,function*(){i(null),r(null),l.reset()})}}}}},submit:{type:"void",title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction(){const{values:l,query:x}=b.useForm(),f=[w("Field name existed in form")];return{run(){return _(this,null,function*(){var I,O,D,B;const{default:m}=n,v=T.uid();if(m.name=(I=l.name)!=null?I:v,m.uiSchema.title=(D=(O=l.uiSchema)==null?void 0:O.title)!=null?D:v,m.interface=n.name,(B=c.fields)==null?void 0:B.find(P=>P.name===m.name)){x("name").take().setFeedback({type:"error",messages:f});return}const F=T.merge(m,l);u([...c.fields,F]),t({name:m.name,type:m.uiSchema.type,"x-decorator":"FormItem","x-component":"CollectionField","x-component-props":{field:F},"x-collection-field":`${c.name}.${m.name}`,"x-toolbar":"FormItemSchemaToolbar","x-settings":"fieldSettings:FormItem"}),i(null),r(null)})}}}}}}}})},components:{ArrayTable:E.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}=h.useContext(ee),{getInterface:a}=e.useCollectionManager_deprecated(),c=a(o.fieldInterface);return s.jsx(e.SchemaInitializerItem,g({onClick:()=>{i(()=>n),t(c),r(!1)}},o),o.fieldInterface)}const oe={title:`{{t("Custom form", { ns: "${y}" })}}`,config:{useInitializer(){return{name:"customForm",type:"item",title:`{{t("Custom form", { ns: "${y}" })}}`,Component:de}},initializers:{},components:{CustomFormBlockProvider:W},parseFormOptions(o){const n={};return z(o,t=>t["x-decorator"]==="CustomFormBlockProvider").forEach(t=>{var l,x;const[i]=Object.keys(t.properties),a=t.properties[i],c=z(a.properties.grid,f=>f["x-component"]==="CollectionField",!0);t["x-decorator-props"].collection.fields=c.map(f=>{var p,m;return(m=(p=f["x-component-props"])==null?void 0:p.field)!=null?m:f["x-interface-options"]});const u=((l=Object.entries(a.properties).find(([f,p])=>p["x-component"]==="ActionBar"))==null?void 0:l[0])||"actions";n[i]={type:"custom",title:((x=t["x-component-props"])==null?void 0:x.title)||i,actions:z(a.properties[u],f=>f["x-component"]==="Action").map(f=>{var p,m;return{status:f["x-decorator-props"].value,values:(m=(p=f["x-action-settings"])==null?void 0:p.assignedValues)==null?void 0:m.values,key:f.name}}),collection:t["x-decorator-props"].collection}}),n}},block:{scope:{},components:{CustomFormBlockProvider:W}}};function Ce(){const{name:o,title:n}=e.useCollection_deprecated(),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:y}),schema:{name:"filter",type:"object",title:'{{t("Filter")}}',"x-component":"Filter","x-component-props":{useProps(){var c;return{options:e.useCollectionFilterOptions((c=r==null?void 0:r["x-decorator-props"])==null?void 0:c.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 ye={title:`{{t("Update record form", { ns: "${y}" })}}`,config:{useInitializer({allCollections:o}){const n=h.useMemo(()=>o.map(({key:a,displayName:c,collections:u})=>({key:a,name:a,label:c,type:"subMenu",children:u.map(l=>({name:J.camelCase(`updateRecordForm-child-${l.name}`),type:"item",title:l.title||l.tableName,schema:{collection:l.name,dataSource:a,title:`{{t("Update record", { ns: "${y}" })}}`,formType:"update","x-designer":"UpdateFormDesigner"},Component:Z}))})),[o]),[r,t]=h.useState([]),i=e.useMenuSearch(n,r);return{name:"updateRecordForm",key:"updateRecordForm",type:"subMenu",title:`{{t("Update record form", { ns: "${y}" })}}`,componentProps:{onOpenChange(a){t(a)}},children:i}},initializers:{},components:{FilterDynamicComponent:d.FilterDynamicComponent,UpdateFormDesigner:Ce},parseFormOptions(o){const n={};return z(o,t=>t["x-decorator"]==="FormBlockProvider"&&t["x-decorator-props"].formType==="update").forEach(t=>{var u,l;const[i]=Object.keys(t.properties),a=t.properties[i],c=((u=Object.entries(a.properties).find(([x,f])=>f["x-component"]==="ActionBar"))==null?void 0:u[0])||"actions";n[i]=k(g({},t["x-decorator-props"]),{type:"update",title:((l=t["x-component-props"])==null?void 0:l.title)||i,actions:z(a.properties[c],x=>x["x-component"]==="Action").map(x=>{var f,p;return{status:x["x-decorator-props"].value,values:(p=(f=x["x-action-settings"])==null?void 0:f.assignedValues)==null?void 0:p.values,key:x.name}})})}),n}},block:{scope:{},components:{}}},M=new T.Registry;M.register("customForm",oe),M.register("createForm",pe),M.register("updateForm",ye);function ge(){const{workflow:o}=d.useFlowContext(),n=d.useTrigger();return n.useInitializers?n.useInitializers(o.config):null}const be={customForm:oe.title,record:`{{t("Data record", { ns: "${y}" })}}`};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")}}',hideIfNoChildren:!0,useChildren(){const o=e.usePlugin(d),n=d.useNodeContext(),r=d.useAvailableUpstreams(n),t=[ge()].filter(Boolean),i=r.map(c=>{var l;const u=o.instructions.get(c.type);return(l=u==null?void 0:u.useInitializers)==null?void 0:l.call(u,c)}).filter(Boolean);return[...t,...i.length?[{name:"nodes",type:"subMenu",title:`{{t("Node result", { ns: "${y}" })}}`,children:i}]:[]].filter(Boolean)}},{type:"itemGroup",name:"form",title:'{{t("Form")}}',useChildren(){const n=e.useDataSourceManager().getAllCollections();return Array.from(M.getValues()).map(r=>{const{useInitializer:t}=r.config;return t({allCollections:n})})}},{type:"itemGroup",name:"otherBlocks",title:'{{t("Other blocks")}}',children:[{name:"markdown",title:'{{t("Markdown")}}',Component:"MarkdownBlockInitializer"}]}]});function Fe(){var I,O,D;const o=h.useContext(e.SchemaComponentContext),{t:n}=j.useTranslation(),r=b.useFieldSchema(),t=d.useWorkflowVariableOptions(),[i,a]=h.useState(!1),[c,u]=h.useState((D=(O=(I=r==null?void 0:r["x-action-settings"])==null?void 0:I.assignedValues)==null?void 0:O.schema)!=null?D:{type:"void","x-component":"Grid","x-initializer":"CustomFormItemInitializers",properties:{}}),[l,x]=h.useState(null),{components:f}=e.useSchemaOptionsContext();h.useEffect(()=>{x(new b.Schema({properties:{grid:c}}))},[c]);const p=h.useMemo(()=>{var P,N;const B=(N=(P=r==null?void 0:r["x-action-settings"])==null?void 0:P.assignedValues)==null?void 0:N.values;return U.createForm({initialValues:T.lodash.cloneDeep(B),values:T.lodash.cloneDeep(B)})},[r]),m=e.useFormActiveFields(),v=n("Assign field values");function A(){a(!1)}function F(){r["x-action-settings"]||(r["x-action-settings"]={}),r["x-action-settings"].assignedValues||(r["x-action-settings"].assignedValues={}),r["x-action-settings"].assignedValues.schema=c,r["x-action-settings"].assignedValues.values=p.values,a(!1),setTimeout(()=>{var B;(B=o.refresh)==null||B.call(o)},300)}return s.jsxs(s.Fragment,{children:[s.jsx(e.SchemaSettingsItem,{title:v,onClick:()=>a(!0),children:v}),s.jsx(S.Modal,{width:"50%",title:v,open:i,onCancel:A,footer:s.jsxs(S.Space,{children:[s.jsx(S.Button,{onClick:A,children:n("Cancel")}),s.jsx(S.Button,{type:"primary",onClick:F,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:m==null?void 0:m.getActiveFieldsName,children:s.jsx(b.FormProvider,{form:p,children:s.jsxs(E.FormLayout,{layout:"vertical",children:[s.jsx(S.Alert,{message:w("Values preset in this form will override user submitted ones when continue or reject.")}),s.jsx("br",{}),i&&l&&s.jsx(e.SchemaComponentContext.Provider,{value:k(g({},o),{refresh(){u(T.lodash.get(l.toJSON(),"properties.grid"))}}),children:s.jsx(e.SchemaComponent,{schema:l,components:f})})]})})})})})})]})}function ke(o){return s.jsxs(e.GeneralSchemaDesigner,k(g({},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 Ae(){const a=e.useSchemaInitializerItem(),{action:n,actionProps:r}=a,t=V(a,["action","actionProps"]),{insert:i}=e.useSchemaInitializer();return s.jsx(e.SchemaInitializerItem,k(g({},t),{onClick:()=>{i({type:"void",title:t.title,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:n},"x-component":"Action","x-component-props":k(g({},r),{useAction:"{{ useSubmit }}"}),"x-designer":"ManualActionDesigner","x-action-settings":{}})}}))}function te(){const o=e.useSchemaInitializerItem(),i=o,{action:n,actionProps:r}=i,t=V(i,["action","actionProps"]);return s.jsx(e.InitializerWithSwitch,k(g({},t),{item:o,schema:{type:"void",title:t.title,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:n},"x-component":"Action","x-component-props":k(g({},r),{useAction:"{{ useSubmit }}"}),"x-designer":"Action.Designer","x-action":`${n}`},type:"x-action"}))}const Ie=new e.SchemaInitializer({name:"AddActionButton",title:'{{t("Configure actions")}}',items:[{name:"jobStatusResolved",title:`{{t("Continue the process", { ns: "${y}" })}}`,Component:Ae,action:d.JOB_STATUS.RESOLVED,actionProps:{type:"primary"}},{name:"jobStatusRejected",title:`{{t("Terminate the process", { ns: "${y}" })}}`,Component:te,action:d.JOB_STATUS.REJECTED,actionProps:{danger:!0}},{name:"jobStatusPending",title:`{{t("Save temporarily", { ns: "${y}" })}}`,Component:te,action:d.JOB_STATUS.PENDING}]});function we(){return{run(){}}}function Be({value:o,onChange:n}){const r=e.usePlugin(d),t=h.useContext(e.SchemaComponentContext),i=d.useNodeContext(),a=d.useAvailableUpstreams(i),c=b.useForm(),{workflow:u}=d.useFlowContext(),l={};a.forEach(p=>{const m=r.instructions.get(p.type);Object.assign(l,m.components)});const x=h.useMemo(()=>new b.Schema({properties:{drawer:{type:"void",title:`{{t("User interface", { ns: "${y}" })}}`,"x-decorator":"Form","x-component":"Action.Drawer","x-component-props":{className:e.css`
2
2
  .ant-drawer-body {
3
3
  background: var(--nb-box-bg);
4
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: "${y}" })}}`,"x-component":"Tabs.TabPane","x-designer":"Tabs.Designer",properties:{grid:{type:"void","x-component":"Grid","x-initializer":"AddBlockButton",properties:{}}}}}}}}}}),[]),x=m.useCallback(function(){const{tabs:d}=T.lodash.get(h.toJSON(),"properties.drawer.properties"),v=Array.from(V.getValues()).reduce((A,k)=>Object.assign(A,k.config.parseFormOptions(d)),{});l.setValuesIn("forms",v),n(d.properties)},[l,n,h]);return s.jsx(e.SchemaComponentContext.Provider,{value:F(g({},t),{designable:!f.executed,refresh:x}),children:s.jsx(e.SchemaComponent,{schema:h,components:F(g(g({},u),Array.from(V.getValues()).reduce((c,d)=>Object.assign(c,d.config.components),{})),{FormBlockProvider:Y,DetailsBlockProvider:Q,ManualActionStatusProvider(c){return c.children},ActionBarProvider(c){return c.children},SimpleDesigner:Se,ManualActionDesigner:ke}),scope:{useSubmit:we,useDetailsBlockProps:e.useFormBlockContext}})})}function Te(o){const{workflow:n}=p.useFlowContext(),[r,t]=m.useState(!1);return s.jsxs(s.Fragment,{children:[s.jsx(S.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(U.FormLayout,{layout:"vertical",children:s.jsx(e.FormItem,{label:B("Negotiation"),children:s.jsxs(S.Radio.Group,{value:o,onChange:n,children:[s.jsx(S.Radio,{value:1,children:s.jsxs(S.Tooltip,{title:B("Everyone should pass"),placement:"bottom",children:[s.jsx("span",{children:B("All pass")}),s.jsx(_.QuestionCircleOutlined,{style:{color:"#999"}})]})}),s.jsx(S.Radio,{value:-1,children:s.jsxs(S.Tooltip,{title:B("Anyone pass"),placement:"bottom",children:[s.jsx("span",{children:B("Any pass")}),s.jsx(_.QuestionCircleOutlined,{style:{color:"#999"}})]})})]})})})});return s.jsxs("fieldset",{className:e.css`
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: "${y}" })}}`,"x-component":"Tabs.TabPane","x-designer":"Tabs.Designer",properties:{grid:{type:"void","x-component":"Grid","x-initializer":"AddBlockButton",properties:{}}}}}}}}}}),[]),f=h.useCallback(function(){const{tabs:m}=T.lodash.get(x.toJSON(),"properties.drawer.properties"),v=Array.from(M.getValues()).reduce((A,F)=>Object.assign(A,F.config.parseFormOptions(m)),{});c.setValuesIn("forms",v),n(m.properties)},[c,n,x]);return s.jsx(e.SchemaComponentContext.Provider,{value:k(g({},t),{designable:!u.executed,refresh:f}),children:s.jsx(e.SchemaComponent,{schema:x,components:k(g(g({},l),Array.from(M.getValues()).reduce((p,m)=>Object.assign(p,m.config.components),{})),{FormBlockProvider:X,DetailsBlockProvider:H,ManualActionStatusProvider(p){return p.children},ActionBarProvider(p){return p.children},SimpleDesigner:Se,ManualActionDesigner:ke}),scope:{useSubmit:we,useDetailsBlockProps:e.useFormBlockContext}})})}function Te(o){const{workflow:n}=d.useFlowContext(),[r,t]=h.useState(!1);return s.jsxs(s.Fragment,{children:[s.jsx(S.Button,{type:"primary",onClick:()=>t(!0),disabled:!1,children:w(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(E.FormLayout,{layout:"vertical",children:s.jsx(e.FormItem,{label:w("Negotiation"),children:s.jsxs(S.Radio.Group,{value:o,onChange:n,children:[s.jsx(S.Radio,{value:1,children:s.jsxs(S.Tooltip,{title:w("Everyone should pass"),placement:"bottom",children:[s.jsx("span",{children:w("All pass")}),s.jsx(K.QuestionCircleOutlined,{style:{color:"#999"}})]})}),s.jsx(S.Radio,{value:-1,children:s.jsxs(S.Tooltip,{title:w("Anyone pass"),placement:"bottom",children:[s.jsx("span",{children:w("Any pass")}),s.jsx(K.QuestionCircleOutlined,{style:{color:"#999"}})]})})]})})})});return s.jsxs("fieldset",{className:e.css`
6
6
  .ant-radio-group {
7
7
  .anticon {
8
8
  margin-left: 0.5em;
9
9
  }
10
10
  }
11
- `,children:[s.jsx(S.Form.Item,{children:s.jsxs(S.Radio.Group,{value:!!o,onChange:({target:{value:t}})=>{console.log(t),n(Number(t))},children:[s.jsx(S.Radio,{value:!0,children:s.jsxs(S.Tooltip,{title:B("Each user has own task"),placement:"bottom",children:[s.jsx("span",{children:B("Separately")}),s.jsx(_.QuestionCircleOutlined,{style:{color:"#999"}})]})}),s.jsx(S.Radio,{value:!1,children:s.jsxs(S.Tooltip,{title:B("Everyone shares one task"),placement:"bottom",children:[s.jsx("span",{children:B("Collaboratively")}),s.jsx(_.QuestionCircleOutlined,{style:{color:"#999"}})]})})]})}),o?r:null]})}function De(o){return o.isForeignKey?o.target==="users":o.collectionName==="users"&&o.name==="id"}function ze({multiple:o=!1,value:n=[],onChange:r}){const t=p.useWorkflowVariableOptions({types:[De]});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 p.Instruction{constructor(){super(...arguments);$(this,"title",`{{t("Manual", { ns: "${y}" })}}`);$(this,"type","manual");$(this,"group","manual");$(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: "${y}" })}}`);$(this,"fieldset",{assignees:{type:"array",title:`{{t("Assignees", { ns: "${y}" })}}`,"x-decorator":"FormItem","x-component":"AssigneesSelect","x-component-props":{},required:!0,default:[]},mode:{type:"number",title:`{{t("Mode", { ns: "${y}" })}}`,"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: "${y}" })}}`,"x-decorator":"FormItem","x-component":"SchemaConfigButton",properties:{schema:{type:"object","x-component":"SchemaConfig",default:null}}},forms:{type:"object",default:{}}});$(this,"components",{SchemaConfigButton:Te,SchemaConfig:Be,ModeConfig:Oe,AssigneesSelect:ze})}useVariables({key:r,title:t,config:i},{types:a,fieldNames:l=p.defaultFieldNames}){var c;const f=e.useCompile(),{getCollectionFields:u}=e.useCollectionManager(),h=Object.keys((c=i.forms)!=null?c:{});if(!h.length)return null;const x=h.map(d=>{var I;const v=i.forms[d],A=p.getCollectionFieldOptions({fields:(I=v.collection)==null?void 0:I.fields,collection:v.collection,types:a,compile:f,getCollectionFields:u}),k=f(v.title)||d;return A.length?{key:d,value:d,label:k,title:k,children:A}:null}).filter(Boolean);return x.length?{[l.value]:r,[l.label]:t,[l.children]:x}:null}useInitializers(r){var l;const{getCollection:t}=e.useCollectionManager(),i=Object.keys((l=r.config.forms)!=null?l:{});if(!i.length||r.config.mode)return null;const a=i.map(f=>{var x,c;const u=r.config.forms[f],{fields:h=[]}=t(u.collection);return h.length?{name:(x=u.title)!=null?x:f,type:"item",title:(c=u.title)!=null?c:f,Component:p.CollectionBlockInitializer,collection:u.collection,dataSource:`{{$jobsMapByNodeKey.${r.key}.${f}}}`}:null}).filter(Boolean);return a.length?{name:`#${r.id}`,key:"forms",type:"subMenu",title:r.title,children:a}:null}isAvailable({engine:r,workflow:t,upstream:i,branchIndex:a}){return!r.isWorkflowSync(t)}}const Pe={title:`{{t("Task", { ns: "${y}" })}}`,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: "${y}" })}}`,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: "${y}" })}}`,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: "${y}" })}}`,"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: "${y}" })}}`,"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: "${y}" })}}`,"x-component":"Select",enum:p.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"});function Ue(o){const n=e.useRecord(),r=B("Unprocessed");return n.execution.status&&!n.status?s.jsx(S.Tag,{children:r}):o.children}const K=()=>s.jsx(e.SchemaComponent,{components:{NodeColumn:Ne,WorkflowColumn:$e,UserColumn:Ee,UserJobStatusColumn:Ue},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:{actions:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:60},title:'{{t("Actions")}}',properties:{view:{type:"void","x-component":"Action.Link",title:'{{t("View")}}',properties:{drawer:{"x-component":"WorkflowTodo.Drawer"}}}}},node:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:null},title:`{{t("Task node", { ns: "${y}" })}}`,properties:{node:{"x-component":"NodeColumn","x-read-pretty":!0}}},workflow:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:null},title:'{{t("Workflow", { ns: "workflow" })}}',properties:{workflow:{"x-component":"WorkflowColumn","x-read-pretty":!0}}},status:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:100},title:'{{t("Status", { ns: "workflow" })}}',properties:{status:{type:"number","x-decorator":"UserJobStatusColumn","x-component":"CollectionField","x-read-pretty":!0}}},user:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:140},title:`{{t("Assignee", { ns: "${y}" })}}`,properties:{user:{"x-component":"UserColumn","x-read-pretty":!0}}},createdAt:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:160},properties:{createdAt:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}}}}}}});function qe(o){var h;const{data:n}=e.useCurrentUserContext(),{userJob:r}=p.useFlowContext(),{status:t,result:i,userId:a}=r,l=b.useFieldSchema(),{name:f}=l.parent.toJSON();let{children:u}=o;return t?i[f]||(u=null):((h=n==null?void 0:n.data)==null?void 0:h.id)!==a&&(u=null),u}const _e=m.createContext(null);function Ge({value:o,children:n}){const{userJob:r,execution:t}=p.useFlowContext(),i=b.useField(),a=b.useFieldSchema();return m.useEffect(()=>{(t.status||r.status)&&(i.disabled=!0,i.visible=r.status===o&&r.result._===a.name)},[t,r,o,i,a.name]),s.jsx(_e.Provider,{value:o,children:n})}function Je(){const o=e.useAPIClient(),{setVisible:n}=e.useActionContext(),{values:r,submit:t}=b.useForm(),i=b.useFieldSchema(),{service:a}=e.useTableBlockContext(),{userJob:l,execution:f}=p.useFlowContext(),{name:u}=i,{name:h}=i.parent.parent;return{run(){return E(this,null,function*(){f.status||l.status||(yield t(),yield o.resource("users_jobs").submit({filterByTk:l.id,values:{result:{[h]:r,_:u}}}),n(!1),a.refresh())})}}}function Ke(o){var x;const n=e.usePlugin(p),r=e.useAPIClient(),{id:t}=e.useRecord(),[i,a]=m.useState(null),[l,f]=m.useState(null);m.useEffect(()=>{var c,d;t&&((d=(c=r.resource("users_jobs")).get)==null||d.call(c,{filterByTk:t,appends:["node","job","workflow","workflow.nodes","execution","execution.jobs"]}).then(({data:v})=>{var w;const z=(w=v==null?void 0:v.data)!=null?w:{},{node:A,workflow:N={}}=z,oe=N,{nodes:k=[]}=oe,I=M(oe,["nodes"]),te=z,{execution:O}=te,D=M(te,["node","workflow","execution"]);p.linkNodes(k),f(A),a({userJob:D,workflow:I,nodes:k,execution:O})}))},[r,t]);const h=p.useAvailableUpstreams(i==null?void 0:i.nodes.find(c=>c.id===l.id)).reduce((c,{type:d})=>Object.assign(c,n.instructions.get(d).components),{});return l&&i?s.jsx(p.FlowContext.Provider,{value:i,children:s.jsx(e.SchemaComponent,{components:g(g({FormBlockProvider:Y,DetailsBlockProvider:Q,ActionBarProvider:qe,ManualActionStatusProvider:Ge},Array.from(V.getValues()).reduce((c,d)=>Object.assign(c,d.block.components),{})),h),scope:g({useSubmit:Je,useFormBlockProps:Le,useDetailsBlockProps:Qe},Array.from(V.getValues()).reduce((c,d)=>Object.assign(c,d.block.scope),{})),schema:{type:"void",name:"tabs","x-component":"Tabs",properties:(x=l.config)==null?void 0:x.schema}})}):s.jsx(S.Spin,{})}function Le(){var l;const{userJob:o,execution:n}=p.useFlowContext(),r=e.useRecord(),{data:t}=e.useCurrentUserContext(),{form:i}=e.useFormBlockContext(),a=n.status||o.status?r?"readPretty":"disabled":((l=t==null?void 0:t.data)==null?void 0:l.id)!==o.userId?"disabled":"editable";return m.useEffect(()=>{i==null||i.setPattern(a)},[a,i]),{form:i}}function Qe(){const{form:o}=e.useFormBlockContext();return{form:o}}function Ye(){const o=e.useCompile(),{status:n,updatedAt:r}=e.useRecord(),t=p.JobStatusOptionsMap[n];return n?s.jsxs(S.Space,{children:[s.jsx("time",{className:e.css`
11
+ `,children:[s.jsx(S.Form.Item,{children:s.jsxs(S.Radio.Group,{value:!!o,onChange:({target:{value:t}})=>{console.log(t),n(Number(t))},children:[s.jsx(S.Radio,{value:!0,children:s.jsxs(S.Tooltip,{title:w("Each user has own task"),placement:"bottom",children:[s.jsx("span",{children:w("Separately")}),s.jsx(K.QuestionCircleOutlined,{style:{color:"#999"}})]})}),s.jsx(S.Radio,{value:!1,children:s.jsxs(S.Tooltip,{title:w("Everyone shares one task"),placement:"bottom",children:[s.jsx("span",{children:w("Collaboratively")}),s.jsx(K.QuestionCircleOutlined,{style:{color:"#999"}})]})})]})}),o?r:null]})}function De(o){return o.isForeignKey?o.target==="users":o.collectionName==="users"&&o.name==="id"}function ze({multiple:o=!1,value:n=[],onChange:r}){const t=d.useWorkflowVariableOptions({types:[De]});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 d.Instruction{constructor(){super(...arguments);$(this,"title",`{{t("Manual", { ns: "${y}" })}}`);$(this,"type","manual");$(this,"group","manual");$(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: "${y}" })}}`);$(this,"fieldset",{assignees:{type:"array",title:`{{t("Assignees", { ns: "${y}" })}}`,"x-decorator":"FormItem","x-component":"AssigneesSelect","x-component-props":{},required:!0,default:[]},mode:{type:"number",title:`{{t("Mode", { ns: "${y}" })}}`,"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: "${y}" })}}`,"x-decorator":"FormItem","x-component":"SchemaConfigButton",properties:{schema:{type:"object","x-component":"SchemaConfig",default:null}}},forms:{type:"object",default:{}}});$(this,"components",{SchemaConfigButton:Te,SchemaConfig:Be,ModeConfig:Oe,AssigneesSelect:ze})}useVariables({key:r,title:t,config:i},{types:a,fieldNames:c=d.defaultFieldNames}){var p;const u=e.useCompile(),{getCollectionFields:l}=e.useCollectionManager_deprecated(),x=Object.keys((p=i.forms)!=null?p:{});if(!x.length)return null;const f=x.map(m=>{var I;const v=i.forms[m],A=d.getCollectionFieldOptions({fields:(I=v.collection)==null?void 0:I.fields,collection:v.collection,types:a,compile:u,getCollectionFields:l}),F=u(v.title)||m;return A.length?{key:m,value:m,label:F,title:F,children:A}:null}).filter(Boolean);return f.length?{[c.value]:r,[c.label]:t,[c.children]:f}:null}useInitializers(r){var c;const{getCollection:t}=e.useCollectionManager_deprecated(),i=Object.keys((c=r.config.forms)!=null?c:{});if(!i.length||r.config.mode)return null;const a=i.map(u=>{var f,p;const l=r.config.forms[u],{fields:x=[]}=t(l.collection);return x.length?{name:(f=l.title)!=null?f:u,type:"item",title:(p=l.title)!=null?p:u,Component:d.CollectionBlockInitializer,collection:l.collection,dataSource:`{{$jobsMapByNodeKey.${r.key}.${u}}}`}:null}).filter(Boolean);return a.length?{name:`#${r.id}`,key:"forms",type:"subMenu",title:r.title,children:a}:null}isAvailable({engine:r,workflow:t,upstream:i,branchIndex:a}){return!r.isWorkflowSync(t)}}const Pe={title:`{{t("Task", { ns: "${y}" })}}`,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: "${y}" })}}`,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: "${y}" })}}`,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: "${y}" })}}`,"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: "${y}" })}}`,"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: "${y}" })}}`,"x-component":"Select",enum:d.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"}),_e=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"});function Ee(o){const n=e.useRecord(),r=w("Unprocessed");return n.execution.status&&!n.status?s.jsx(S.Tag,{children:r}):o.children}const Y=()=>s.jsx(e.SchemaComponent,{components:{NodeColumn:Ne,WorkflowColumn:$e,UserColumn:_e,UserJobStatusColumn: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-toolbar":"ActionSchemaToolbar","x-settings":"actionSettings:refresh","x-component-props":{icon:"ReloadOutlined",useProps:"{{ useRefreshActionProps }}"},"x-align":"right"}}},table:{type:"array","x-component":"TableV2","x-component-props":{rowKey:"id",useProps:"{{ useTableBlockProps }}"},properties:{actions:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:60},title:'{{t("Actions")}}',properties:{view:{type:"void","x-component":"Action.Link",title:'{{t("View")}}',properties:{drawer:{"x-component":"WorkflowTodo.Drawer"}}}}},node:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:null},title:`{{t("Task node", { ns: "${y}" })}}`,properties:{node:{"x-component":"NodeColumn","x-read-pretty":!0}}},workflow:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:null},title:'{{t("Workflow", { ns: "workflow" })}}',properties:{workflow:{"x-component":"WorkflowColumn","x-read-pretty":!0}}},status:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:100},title:'{{t("Status", { ns: "workflow" })}}',properties:{status:{type:"number","x-decorator":"UserJobStatusColumn","x-component":"CollectionField","x-read-pretty":!0}}},user:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:140},title:`{{t("Assignee", { ns: "${y}" })}}`,properties:{user:{"x-component":"UserColumn","x-read-pretty":!0}}},createdAt:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column","x-component-props":{width:160},properties:{createdAt:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}}}}}}});function Ue(o){var x;const{data:n}=e.useCurrentUserContext(),{userJob:r}=d.useFlowContext(),{status:t,result:i,userId:a}=r,c=b.useFieldSchema(),{name:u}=c.parent.toJSON();let{children:l}=o;return t?i[u]||(l=null):((x=n==null?void 0:n.data)==null?void 0:x.id)!==a&&(l=null),l}const Ke=h.createContext(null);function qe({value:o,children:n}){const{userJob:r,execution:t}=d.useFlowContext(),i=b.useField(),a=b.useFieldSchema();return h.useEffect(()=>{(t.status||r.status)&&(i.disabled=!0,i.visible=r.status===o&&r.result._===a.name)},[t,r,o,i,a.name]),s.jsx(Ke.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:c,execution:u}=d.useFlowContext(),{name:l}=i,{name:x}=i.parent.parent;return{run(){return _(this,null,function*(){u.status||c.status||(yield t(),yield o.resource("users_jobs").submit({filterByTk:c.id,values:{result:{[x]:r,_:l}}}),n(!1),a.refresh())})}}}function Je(o){var f;const n=e.usePlugin(d),r=e.useAPIClient(),{id:t}=e.useRecord(),[i,a]=h.useState(null),[c,u]=h.useState(null);h.useEffect(()=>{var p,m;t&&((m=(p=r.resource("users_jobs")).get)==null||m.call(p,{filterByTk:t,appends:["node","job","workflow","workflow.nodes","execution","execution.jobs"]}).then(({data:v})=>{var B;const P=(B=v==null?void 0:v.data)!=null?B:{},{node:A,workflow:N={}}=P,q=N,{nodes:F=[]}=q,I=V(q,["nodes"]),G=P,{execution:O}=G,D=V(G,["node","workflow","execution"]);d.linkNodes(F),u(A),a({userJob:D,workflow:I,nodes:F,execution:O})}))},[r,t]);const x=d.useAvailableUpstreams(i==null?void 0:i.nodes.find(p=>p.id===c.id)).reduce((p,{type:m})=>Object.assign(p,n.instructions.get(m).components),{});return c&&i?s.jsx(d.FlowContext.Provider,{value:i,children:s.jsx(e.SchemaComponent,{components:g(g({FormBlockProvider:X,DetailsBlockProvider:H,ActionBarProvider:Ue,ManualActionStatusProvider:qe},Array.from(M.getValues()).reduce((p,m)=>Object.assign(p,m.block.components),{})),x),scope:g({useSubmit:Ge,useFormBlockProps:Le,useDetailsBlockProps:Ye},Array.from(M.getValues()).reduce((p,m)=>Object.assign(p,m.block.scope),{})),schema:{type:"void",name:"tabs","x-component":"Tabs",properties:(f=c.config)==null?void 0:f.schema}})}):s.jsx(S.Spin,{})}function Le(){var c;const{userJob:o,execution:n}=d.useFlowContext(),r=e.useRecord(),{data:t}=e.useCurrentUserContext(),{form:i}=e.useFormBlockContext(),a=n.status||o.status?r?"readPretty":"disabled":((c=t==null?void 0:t.data)==null?void 0:c.id)!==o.userId?"disabled":"editable";return h.useEffect(()=>{i==null||i.setPattern(a)},[a,i]),{form:i}}function Ye(){const{form:o}=e.useFormBlockContext();return{form:o}}function Qe(){const o=e.useCompile(),{status:n,updatedAt:r}=e.useRecord(),t=d.JobStatusOptionsMap[n];return n?s.jsxs(S.Space,{children:[s.jsx("time",{className:e.css`
12
12
  margin-right: 0.5em;
13
- `,children:se(r).format("YYYY-MM-DD HH:mm:ss")}),s.jsx(S.Tag,{icon:t.icon,color:t.color,children:o(t.label)})]}):null}function He(){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(g({},o),{reset(){},designable:!1}),children:s.jsx(e.SchemaComponent,{components:{FooterStatus:Ye,FlowContextProvider:Ke},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 Xe({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(g({pageSize:20,sort:["-createdAt"]},o),{appends:["user","node","workflow","execution.status"],except:["node.config","workflow.config","workflow.options"]}),rowKey:"id",showIndex:!0,dragSort:!1};return s.jsx(e.CollectionManagerProvider,F(g({},t),{collections:[...r,Pe,Ve,je],children:s.jsx(e.TableBlockProvider,F(g({name:"workflow-todo"},i),{children:n}))}))}K.Drawer=He,K.Decorator=Xe;const Ze=()=>{const o=e.useSchemaInitializerItem(),{insert:n}=e.useSchemaInitializer();return s.jsx(e.SchemaInitializerItem,F(g({icon:s.jsx(_.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 We extends e.Plugin{afterAdd(){return E(this,null,function*(){})}load(){return E(this,null,function*(){this.addComponents(),this.app.pm.get("workflow").registerInstruction("manual",Me),this.app.schemaInitializerManager.add(ve),this.app.schemaInitializerManager.add(Ie),this.app.schemaInitializerManager.add(he),this.app.schemaInitializerManager.get("BlockInitializers").add("otherBlocks.workflowTodos",{title:`{{t("Workflow todos", { ns: "${y}" })}}`,Component:"WorkflowTodoBlockInitializer",icon:"CheckSquareOutlined"})})}addComponents(){this.app.addComponents({WorkflowTodo:K,WorkflowTodoBlockInitializer:Ze})}}C.default=We,Object.defineProperties(C,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
13
+ `,children:se(r).format("YYYY-MM-DD HH:mm:ss")}),s.jsx(S.Tag,{icon:t.icon,color:t.color,children:o(t.label)})]}):null}function He(){var a;const o=h.useContext(e.SchemaComponentContext),{id:n,node:r,workflow:t,status:i}=e.useRecord();return s.jsx(e.SchemaComponentContext.Provider,{value:k(g({},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 Xe({params:o={},children:n}){const r={collection:"users_jobs",resource:"users_jobs",action:"list",params:k(g({pageSize:20,sort:["-createdAt"]},o),{appends:["user","node","workflow","execution.status"],except:["node.config","workflow.config","workflow.options"]}),rowKey:"id",showIndex:!0,dragSort:!1};return s.jsx(e.ExtendCollectionsProvider,{collections:[Pe,Ve,je],children:s.jsx(e.TableBlockProvider,k(g({name:"workflow-todo"},r),{children:n}))})}Y.Drawer=He,Y.Decorator=Xe;const Ze=()=>{const o=e.useSchemaInitializerItem(),{insert:n}=e.useSchemaInitializer();return s.jsx(e.SchemaInitializerItem,k(g({icon:s.jsx(K.TableOutlined,{})},o),{onClick:()=>{n({type:"void","x-decorator":"WorkflowTodo.Decorator","x-decorator-props":{},"x-component":"CardItem","x-toolbar":"BlockSchemaToolbar","x-settings":"blockSettings:table",properties:{todos:{type:"void","x-component":"WorkflowTodo"}}})}}))};class We extends e.Plugin{afterAdd(){return _(this,null,function*(){})}load(){return _(this,null,function*(){this.addComponents(),this.app.pm.get("workflow").registerInstruction("manual",Me),this.app.schemaInitializerManager.add(ve),this.app.schemaInitializerManager.add(Ie),this.app.schemaInitializerManager.add(he),this.app.schemaInitializerManager.get("BlockInitializers").add("otherBlocks.workflowTodos",{title:`{{t("Workflow todos", { ns: "${y}" })}}`,Component:"WorkflowTodoBlockInitializer",icon:"CheckSquareOutlined"})})}addComponents(){this.app.addComponents({WorkflowTodo:Y,WorkflowTodoBlockInitializer:Ze})}}C.default=We,Object.defineProperties(C,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
@@ -16,8 +16,8 @@ export type FormType = {
16
16
  export type ManualFormType = {
17
17
  title: string;
18
18
  config: {
19
- useInitializer: ({ collections }?: {
20
- collections: any[];
19
+ useInitializer: ({ allCollections }?: {
20
+ allCollections: any[];
21
21
  }) => SchemaInitializerItemType;
22
22
  initializers?: {
23
23
  [key: string]: React.FC;
@@ -1,20 +1,20 @@
1
1
  module.exports = {
2
- "react": "18.2.0",
3
2
  "@formily/react": "2.3.0",
4
3
  "antd": "5.12.8",
5
4
  "dayjs": "1.11.10",
6
- "@nocobase/client": "0.19.0-alpha.9",
7
- "@nocobase/plugin-workflow": "0.19.0-alpha.9",
5
+ "react": "18.2.0",
6
+ "@nocobase/client": "0.20.0-alpha.2",
7
+ "@nocobase/plugin-workflow": "0.20.0-alpha.2",
8
8
  "@ant-design/icons": "5.2.6",
9
9
  "react-i18next": "11.18.6",
10
- "@nocobase/utils": "0.19.0-alpha.9",
11
- "@nocobase/server": "0.19.0-alpha.9",
12
- "@nocobase/actions": "0.19.0-alpha.9",
13
- "@nocobase/resourcer": "0.19.0-alpha.9",
14
- "@nocobase/plugin-workflow-test": "0.19.0-alpha.9",
15
- "@nocobase/test": "0.19.0-alpha.9",
10
+ "@nocobase/utils": "0.20.0-alpha.2",
11
+ "@nocobase/server": "0.20.0-alpha.2",
12
+ "@nocobase/actions": "0.20.0-alpha.2",
13
+ "@nocobase/resourcer": "0.20.0-alpha.2",
14
+ "@nocobase/plugin-workflow-test": "0.20.0-alpha.2",
15
+ "@nocobase/test": "0.20.0-alpha.2",
16
16
  "@formily/core": "2.3.0",
17
17
  "@formily/antd-v5": "1.1.9",
18
- "@nocobase/database": "0.19.0-alpha.9",
18
+ "@nocobase/database": "0.20.0-alpha.2",
19
19
  "lodash": "4.17.21"
20
20
  };
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "displayName.zh-CN": "工作流:人工处理节点",
5
5
  "description": "Could be used for workflows which some of decisions are made by users.",
6
6
  "description.zh-CN": "用于人工控制部分决策的流程。",
7
- "version": "0.19.0-alpha.9",
7
+ "version": "0.20.0-alpha.2",
8
8
  "license": "AGPL-3.0",
9
9
  "main": "./dist/server/index.js",
10
10
  "homepage": "https://docs.nocobase.com/plugins/workflow-manual",
@@ -30,7 +30,7 @@
30
30
  "@nocobase/test": "0.x",
31
31
  "@nocobase/utils": "0.x"
32
32
  },
33
- "gitHead": "975f9c58a1995df6a8d7a4d191a0dc4a9769ebc5",
33
+ "gitHead": "6fb885dfc3554e4b0f29e9a7a1eecbbe85d0eebb",
34
34
  "keywords": [
35
35
  "Workflow"
36
36
  ]
@@ -1,37 +1,35 @@
1
- import React, { createContext, useContext, useEffect, useState } from 'react';
2
1
  import { observer, useField, useFieldSchema, useForm } from '@formily/react';
3
2
  import { Space, Spin, Tag } from 'antd';
4
3
  import dayjs from 'dayjs';
4
+ import React, { createContext, useContext, useEffect, useState } from 'react';
5
5
 
6
- import { css, usePlugin } from '@nocobase/client';
6
+ import { css, useCompile, usePlugin } from '@nocobase/client';
7
7
 
8
8
  import {
9
- CollectionManagerProvider,
10
9
  SchemaComponent,
11
10
  SchemaComponentContext,
12
11
  TableBlockProvider,
13
12
  useAPIClient,
14
13
  useActionContext,
15
- useCollectionManager,
16
- useCompile,
17
14
  useCurrentUserContext,
18
15
  useFormBlockContext,
19
16
  useRecord,
20
17
  useTableBlockContext,
18
+ ExtendCollectionsProvider,
21
19
  } from '@nocobase/client';
22
20
  import WorkflowPlugin, {
23
- useAvailableUpstreams,
24
21
  FlowContext,
25
- useFlowContext,
26
22
  JobStatusOptions,
27
23
  JobStatusOptionsMap,
28
24
  linkNodes,
25
+ useAvailableUpstreams,
26
+ useFlowContext,
29
27
  } from '@nocobase/plugin-workflow/client';
30
28
 
29
+ import { NAMESPACE, useLang } from '../locale';
31
30
  import { DetailsBlockProvider } from './instruction/DetailsBlockProvider';
32
31
  import { FormBlockProvider } from './instruction/FormBlockProvider';
33
32
  import { ManualFormType, manualFormTypes } from './instruction/SchemaConfig';
34
- import { NAMESPACE, useLang } from '../locale';
35
33
 
36
34
  const nodeCollection = {
37
35
  title: `{{t("Task", { ns: "${NAMESPACE}" })}}`,
@@ -258,7 +256,9 @@ export const WorkflowTodo: React.FC & { Drawer: React.FC; Decorator: React.FC }
258
256
  title: '{{ t("Refresh") }}',
259
257
  'x-action': 'refresh',
260
258
  'x-component': 'Action',
261
- 'x-designer': 'Action.Designer',
259
+ // 'x-designer': 'Action.Designer',
260
+ 'x-toolbar': 'ActionSchemaToolbar',
261
+ 'x-settings': 'actionSettings:refresh',
262
262
  'x-component-props': {
263
263
  icon: 'ReloadOutlined',
264
264
  useProps: '{{ useRefreshActionProps }}',
@@ -617,7 +617,6 @@ function Drawer() {
617
617
  }
618
618
 
619
619
  function Decorator({ params = {}, children }) {
620
- const { collections, ...cm } = useCollectionManager();
621
620
  const blockProps = {
622
621
  collection: 'users_jobs',
623
622
  resource: 'users_jobs',
@@ -635,14 +634,11 @@ function Decorator({ params = {}, children }) {
635
634
  };
636
635
 
637
636
  return (
638
- <CollectionManagerProvider
639
- {...cm}
640
- collections={[...collections, nodeCollection, workflowCollection, todoCollection]}
641
- >
637
+ <ExtendCollectionsProvider collections={[nodeCollection, workflowCollection, todoCollection]}>
642
638
  <TableBlockProvider name="workflow-todo" {...blockProps}>
643
639
  {children}
644
640
  </TableBlockProvider>
645
- </CollectionManagerProvider>
641
+ </ExtendCollectionsProvider>
646
642
  );
647
643
  }
648
644
 
@@ -1,5 +1,5 @@
1
- import React, { FC } from 'react';
2
1
  import { TableOutlined } from '@ant-design/icons';
2
+ import React, { FC } from 'react';
3
3
 
4
4
  import { SchemaInitializerItem, useSchemaInitializer, useSchemaInitializerItem } from '@nocobase/client';
5
5
 
@@ -16,7 +16,9 @@ export const WorkflowTodoBlockInitializer: FC<any> = () => {
16
16
  'x-decorator': 'WorkflowTodo.Decorator',
17
17
  'x-decorator-props': {},
18
18
  'x-component': 'CardItem',
19
- 'x-designer': 'TableBlockDesigner',
19
+ // 'x-designer': 'TableBlockDesigner',
20
+ 'x-toolbar': 'BlockSchemaToolbar',
21
+ 'x-settings': 'blockSettings:table',
20
22
  properties: {
21
23
  todos: {
22
24
  type: 'void',
@@ -1,16 +1,17 @@
1
1
  import { createForm } from '@formily/core';
2
2
  import { useField } from '@formily/react';
3
3
  import {
4
- BlockRequestContext,
5
- CollectionProvider,
4
+ BlockRequestContext_deprecated,
5
+ CollectionProvider_deprecated,
6
6
  FormBlockContext,
7
7
  RecordProvider,
8
8
  useAPIClient,
9
9
  useAssociationNames,
10
+ useBlockRequestContext,
10
11
  } from '@nocobase/client';
11
12
  import { useFlowContext } from '@nocobase/plugin-workflow/client';
12
13
  import { parse } from '@nocobase/utils/client';
13
- import React, { useContext, useMemo, useRef } from 'react';
14
+ import React, { useMemo, useRef } from 'react';
14
15
 
15
16
  function useFlowContextData(dataSource) {
16
17
  const { execution, nodes } = useFlowContext();
@@ -61,12 +62,12 @@ export function DetailsBlockProvider(props) {
61
62
  };
62
63
  const api = useAPIClient();
63
64
  const resource = api.resource(props.collection);
64
- const __parent = useContext(BlockRequestContext);
65
+ const __parent = useBlockRequestContext();
65
66
 
66
67
  return (
67
- <CollectionProvider collection={props.collection}>
68
- <RecordProvider record={values} parent={false}>
69
- <BlockRequestContext.Provider value={{ block: 'form', field, service, resource, __parent }}>
68
+ <CollectionProvider_deprecated collection={props.collection}>
69
+ <RecordProvider record={values} parent={null}>
70
+ <BlockRequestContext_deprecated.Provider value={{ block: 'form', field, service, resource, __parent }}>
70
71
  <FormBlockContext.Provider
71
72
  value={{
72
73
  params,
@@ -79,8 +80,8 @@ export function DetailsBlockProvider(props) {
79
80
  >
80
81
  {props.children}
81
82
  </FormBlockContext.Provider>
82
- </BlockRequestContext.Provider>
83
+ </BlockRequestContext_deprecated.Provider>
83
84
  </RecordProvider>
84
- </CollectionProvider>
85
+ </CollectionProvider_deprecated>
85
86
  );
86
87
  }
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
 
3
3
  import {
4
- CollectionProvider,
4
+ CollectionProvider_deprecated,
5
5
  SchemaInitializerItem,
6
6
  SchemaInitializerItemType,
7
7
  createFormBlockSchema,
@@ -69,8 +69,11 @@ function InternalFormBlockInitializer({ schema, ...others }) {
69
69
  export function FormBlockInitializer() {
70
70
  const itemConfig = useSchemaInitializerItem();
71
71
  return (
72
- <CollectionProvider collection={itemConfig.schema?.collection}>
72
+ <CollectionProvider_deprecated
73
+ dataSource={itemConfig.schema?.dataSource}
74
+ collection={itemConfig.schema?.collection}
75
+ >
73
76
  <InternalFormBlockInitializer {...itemConfig} />
74
- </CollectionProvider>
77
+ </CollectionProvider_deprecated>
75
78
  );
76
79
  }
@@ -1,25 +1,31 @@
1
1
  import { createForm } from '@formily/core';
2
2
  import { RecursionField, useField, useFieldSchema } from '@formily/react';
3
3
  import {
4
- BlockRequestContext,
5
- CollectionProvider,
4
+ BlockRequestContext_deprecated,
5
+ CollectionManagerProvider,
6
+ CollectionProvider_deprecated,
7
+ DEFAULT_DATA_SOURCE_KEY,
6
8
  FormActiveFieldsProvider,
7
9
  FormBlockContext,
8
10
  FormV2,
9
11
  RecordProvider,
10
12
  useAPIClient,
11
13
  useAssociationNames,
14
+ useBlockRequestContext,
15
+ useDataSourceHeaders,
12
16
  useDesignable,
13
17
  useRecord,
14
18
  } from '@nocobase/client';
15
- import React, { useContext, useMemo, useRef } from 'react';
19
+ import React, { useMemo, useRef } from 'react';
16
20
 
17
21
  export function FormBlockProvider(props) {
18
22
  const userJob = useRecord();
19
23
  const fieldSchema = useFieldSchema();
20
24
  const field = useField();
21
25
  const formBlockRef = useRef(null);
22
- const { getAssociationAppends } = useAssociationNames();
26
+ const dataSource = props.dataSource || DEFAULT_DATA_SOURCE_KEY;
27
+
28
+ const { getAssociationAppends } = useAssociationNames(dataSource);
23
29
  const { appends, updateAssociationValues } = getAssociationAppends();
24
30
  const [formKey] = Object.keys(fieldSchema.toJSON().properties ?? {});
25
31
  const values = userJob?.result?.[formKey];
@@ -50,8 +56,10 @@ export function FormBlockProvider(props) {
50
56
  };
51
57
  }, [values]);
52
58
  const api = useAPIClient();
53
- const resource = api.resource(props.collection);
54
- const __parent = useContext(BlockRequestContext);
59
+ const headers = useDataSourceHeaders(dataSource);
60
+
61
+ const resource = api.resource(props.collection, undefined, headers);
62
+ const __parent = useBlockRequestContext();
55
63
 
56
64
  const formBlockValue = useMemo(() => {
57
65
  return {
@@ -65,21 +73,25 @@ export function FormBlockProvider(props) {
65
73
  }, [field, form, params, service, updateAssociationValues]);
66
74
 
67
75
  return !userJob.status || values ? (
68
- <CollectionProvider collection={props.collection}>
69
- <RecordProvider record={values} parent={false}>
70
- <FormActiveFieldsProvider name="form">
71
- <BlockRequestContext.Provider value={{ block: 'form', props, field, service, resource, __parent }}>
72
- <FormBlockContext.Provider value={formBlockValue}>
73
- <Component {...field.componentProps}>
74
- <FormV2.Templates style={{ marginBottom: 18 }} form={form} />
75
- <div ref={formBlockRef}>
76
- <RecursionField schema={fieldSchema} onlyRenderProperties />
77
- </div>
78
- </Component>
79
- </FormBlockContext.Provider>
80
- </BlockRequestContext.Provider>
81
- </FormActiveFieldsProvider>
82
- </RecordProvider>
83
- </CollectionProvider>
76
+ <CollectionManagerProvider dataSource={dataSource}>
77
+ <CollectionProvider_deprecated collection={props.collection}>
78
+ <RecordProvider record={values} parent={null}>
79
+ <FormActiveFieldsProvider name="form">
80
+ <BlockRequestContext_deprecated.Provider
81
+ value={{ block: 'form', props, field, service, resource, __parent }}
82
+ >
83
+ <FormBlockContext.Provider value={formBlockValue}>
84
+ <Component {...field.componentProps}>
85
+ <FormV2.Templates style={{ marginBottom: 18 }} form={form} />
86
+ <div ref={formBlockRef}>
87
+ <RecursionField schema={fieldSchema} onlyRenderProperties />
88
+ </div>
89
+ </Component>
90
+ </FormBlockContext.Provider>
91
+ </BlockRequestContext_deprecated.Provider>
92
+ </FormActiveFieldsProvider>
93
+ </RecordProvider>
94
+ </CollectionProvider_deprecated>
95
+ </CollectionManagerProvider>
84
96
  ) : null;
85
97
  }
@@ -24,8 +24,8 @@ import {
24
24
  VariableScopeProvider,
25
25
  css,
26
26
  gridRowColWrap,
27
- useCollectionManager,
28
27
  useCompile,
28
+ useDataSourceManager,
29
29
  useFormActiveFields,
30
30
  useFormBlockContext,
31
31
  usePlugin,
@@ -68,7 +68,7 @@ export type FormType = {
68
68
  export type ManualFormType = {
69
69
  title: string;
70
70
  config: {
71
- useInitializer: ({ collections }?: { collections: any[] }) => SchemaInitializerItemType;
71
+ useInitializer: ({ allCollections }?: { allCollections: any[] }) => SchemaInitializerItemType;
72
72
  initializers?: {
73
73
  [key: string]: React.FC;
74
74
  };
@@ -131,7 +131,7 @@ export const addBlockButton: SchemaInitializer = new SchemaInitializer({
131
131
  type: 'itemGroup',
132
132
  name: 'dataBlocks',
133
133
  title: '{{t("Data blocks")}}',
134
- checkChildrenLength: true,
134
+ hideIfNoChildren: true,
135
135
  useChildren() {
136
136
  const workflowPlugin = usePlugin(WorkflowPlugin);
137
137
  const current = useNodeContext();
@@ -164,10 +164,11 @@ export const addBlockButton: SchemaInitializer = new SchemaInitializer({
164
164
  name: 'form',
165
165
  title: '{{t("Form")}}',
166
166
  useChildren() {
167
- const { collections } = useCollectionManager();
167
+ const dm = useDataSourceManager();
168
+ const allCollections = dm.getAllCollections();
168
169
  return Array.from(manualFormTypes.getValues()).map((item: ManualFormType) => {
169
170
  const { useInitializer: getInitializer } = item.config;
170
- return getInitializer({ collections });
171
+ return getInitializer({ allCollections });
171
172
  });
172
173
  },
173
174
  },
@@ -412,7 +413,6 @@ export function SchemaConfig({ value, onChange }) {
412
413
  const form = useForm();
413
414
  const { workflow } = useFlowContext();
414
415
 
415
- const nodeInitializers = {};
416
416
  const nodeComponents = {};
417
417
  nodes.forEach((item) => {
418
418
  const instruction = workflowPlugin.instructions.get(item.type);
@@ -7,7 +7,8 @@ import {
7
7
  SchemaSettingsDivider,
8
8
  SchemaSettingsLinkageRules,
9
9
  SchemaSettingsRemove,
10
- useCollection,
10
+ useCollection_deprecated,
11
+ useGetSchemaInitializerMenuItems,
11
12
  useMenuSearch,
12
13
  } from '@nocobase/client';
13
14
 
@@ -18,7 +19,7 @@ import { ManualFormType } from '../SchemaConfig';
18
19
  import { findSchema } from '../utils';
19
20
 
20
21
  function CreateFormDesigner() {
21
- const { name, title } = useCollection();
22
+ const { name, title } = useCollection_deprecated();
22
23
 
23
24
  return (
24
25
  <GeneralSchemaDesigner title={title || name}>
@@ -39,26 +40,33 @@ function CreateFormDesigner() {
39
40
  export default {
40
41
  title: `{{t("Create record form", { ns: "${NAMESPACE}" })}}`,
41
42
  config: {
42
- useInitializer({ collections }) {
43
+ useInitializer({ allCollections }) {
43
44
  const childItems = useMemo(
44
45
  () =>
45
- collections.map((item) => ({
46
- name: _.camelCase(`createRecordForm-child-${item.name}`),
47
- type: 'item',
48
- title: item.title,
49
- label: item.label,
50
- schema: {
51
- collection: item.name,
52
- title: `{{t("Create record", { ns: "${NAMESPACE}" })}}`,
53
- formType: 'create',
54
- 'x-designer': 'CreateFormDesigner',
55
- },
56
- Component: FormBlockInitializer,
46
+ allCollections.map(({ key, displayName, collections }) => ({
47
+ key: key,
48
+ name: key,
49
+ label: displayName,
50
+ type: 'subMenu',
51
+ children: collections.map((item) => ({
52
+ name: _.camelCase(`createRecordForm-child-${item.name}`),
53
+ type: 'item',
54
+ title: item.title || item.tableName,
55
+ schema: {
56
+ collection: item.name,
57
+ dataSource: key,
58
+ title: `{{t("Create record", { ns: "${NAMESPACE}" })}}`,
59
+ formType: 'create',
60
+ 'x-designer': 'CreateFormDesigner',
61
+ },
62
+ Component: FormBlockInitializer,
63
+ })),
57
64
  })),
58
- [collections],
65
+ [allCollections],
59
66
  );
60
- const [isOpenSubMenu, setIsOpenSubMenu] = useState(false);
61
- const searchedChildren = useMenuSearch(childItems, isOpenSubMenu, true);
67
+ const [openMenuKeys, setOpenMenuKeys] = useState([]);
68
+ const searchedChildren = useMenuSearch(childItems, openMenuKeys);
69
+
62
70
  return {
63
71
  name: 'createRecordForm',
64
72
  key: 'createRecordForm',
@@ -66,7 +74,7 @@ export default {
66
74
  title: `{{t("Create record form", { ns: "${NAMESPACE}" })}}`,
67
75
  componentProps: {
68
76
  onOpenChange(keys) {
69
- setIsOpenSubMenu(keys.length > 0);
77
+ setOpenMenuKeys(keys);
70
78
  },
71
79
  },
72
80
  children: searchedChildren,
@@ -7,8 +7,7 @@ import lodash from 'lodash';
7
7
 
8
8
  import {
9
9
  ActionContextProvider,
10
- CollectionContext,
11
- CollectionProvider,
10
+ CollectionProvider_deprecated,
12
11
  FormBlockContext,
13
12
  RecordProvider,
14
13
  SchemaComponent,
@@ -17,7 +16,8 @@ import {
17
16
  SchemaInitializerItemType,
18
17
  SchemaInitializerItems,
19
18
  gridRowColWrap,
20
- useCollectionManager,
19
+ useCollectionManager_deprecated,
20
+ useCollection_deprecated,
21
21
  useRecord,
22
22
  useSchemaInitializer,
23
23
  useSchemaInitializerItem,
@@ -46,13 +46,13 @@ function CustomFormBlockProvider(props) {
46
46
  );
47
47
 
48
48
  return !userJob.status || values ? (
49
- <CollectionProvider
49
+ <CollectionProvider_deprecated
50
50
  collection={{
51
51
  ...props.collection,
52
52
  fields,
53
53
  }}
54
54
  >
55
- <RecordProvider record={values} parent={false}>
55
+ <RecordProvider record={values} parent={null}>
56
56
  <FormBlockContext.Provider
57
57
  value={{
58
58
  form,
@@ -63,7 +63,7 @@ function CustomFormBlockProvider(props) {
63
63
  {props.children}
64
64
  </FormBlockContext.Provider>
65
65
  </RecordProvider>
66
- </CollectionProvider>
66
+ </CollectionProvider_deprecated>
67
67
  ) : null;
68
68
  }
69
69
 
@@ -183,7 +183,7 @@ function getOptions(interfaces) {
183
183
  }
184
184
 
185
185
  function useCommonInterfaceInitializers(): SchemaInitializerItemType[] {
186
- const { interfaces } = useCollectionManager();
186
+ const { interfaces } = useCollectionManager_deprecated();
187
187
  const options = getOptions(interfaces);
188
188
 
189
189
  return options.map((group) => ({
@@ -206,7 +206,7 @@ const CustomItemsComponent = (props) => {
206
206
  const [interfaceOptions, setInterface] = useState<any>(null);
207
207
  const [insert, setCallback] = useState<any>();
208
208
  const items = useCommonInterfaceInitializers();
209
- const collection = useContext(CollectionContext);
209
+ const collection = useCollection_deprecated();
210
210
  const { setCollectionFields } = useContext(FormBlockContext);
211
211
 
212
212
  return (
@@ -297,7 +297,9 @@ const CustomItemsComponent = (props) => {
297
297
  field: newField,
298
298
  },
299
299
  'x-collection-field': `${collection.name}.${options.name}`,
300
- 'x-designer': 'FormItem.Designer',
300
+ // 'x-designer': 'FormItem.Designer',
301
+ 'x-toolbar': 'FormItemSchemaToolbar',
302
+ 'x-settings': 'fieldSettings:FormItem',
301
303
  });
302
304
  setCallback(null);
303
305
  setInterface(null);
@@ -332,7 +334,7 @@ function CustomFormFieldInitializer() {
332
334
  const itemConfig = useSchemaInitializerItem();
333
335
  const { insert, setVisible } = useSchemaInitializer();
334
336
  const { onAddField, setCallback } = useContext(AddCustomFormFieldButtonContext);
335
- const { getInterface } = useCollectionManager();
337
+ const { getInterface } = useCollectionManager_deprecated();
336
338
 
337
339
  const interfaceOptions = getInterface(itemConfig.fieldInterface);
338
340
 
@@ -10,7 +10,7 @@ import {
10
10
  SchemaSettingsDivider,
11
11
  SchemaSettingsLinkageRules,
12
12
  SchemaSettingsRemove,
13
- useCollection,
13
+ useCollection_deprecated,
14
14
  useCollectionFilterOptions,
15
15
  useDesignable,
16
16
  useMenuSearch,
@@ -23,7 +23,7 @@ import { ManualFormType } from '../SchemaConfig';
23
23
  import { findSchema } from '../utils';
24
24
 
25
25
  function UpdateFormDesigner() {
26
- const { name, title } = useCollection();
26
+ const { name, title } = useCollection_deprecated();
27
27
  const fieldSchema = useFieldSchema();
28
28
  const { t } = useTranslation();
29
29
  const { dn } = useDesignable();
@@ -76,26 +76,32 @@ function UpdateFormDesigner() {
76
76
  export default {
77
77
  title: `{{t("Update record form", { ns: "${NAMESPACE}" })}}`,
78
78
  config: {
79
- useInitializer({ collections }) {
79
+ useInitializer({ allCollections }) {
80
80
  const childItems = useMemo(
81
81
  () =>
82
- collections.map((item) => ({
83
- name: _.camelCase(`updateRecordForm-child-${item.name}`),
84
- type: 'item',
85
- title: item.title,
86
- label: item.label,
87
- schema: {
88
- collection: item.name,
89
- title: `{{t("Update record", { ns: "${NAMESPACE}" })}}`,
90
- formType: 'update',
91
- 'x-designer': 'UpdateFormDesigner',
92
- },
93
- Component: FormBlockInitializer,
82
+ allCollections.map(({ key, displayName, collections }) => ({
83
+ key: key,
84
+ name: key,
85
+ label: displayName,
86
+ type: 'subMenu',
87
+ children: collections.map((item) => ({
88
+ name: _.camelCase(`updateRecordForm-child-${item.name}`),
89
+ type: 'item',
90
+ title: item.title || item.tableName,
91
+ schema: {
92
+ collection: item.name,
93
+ dataSource: key,
94
+ title: `{{t("Update record", { ns: "${NAMESPACE}" })}}`,
95
+ formType: 'update',
96
+ 'x-designer': 'UpdateFormDesigner',
97
+ },
98
+ Component: FormBlockInitializer,
99
+ })),
94
100
  })),
95
- [collections],
101
+ [allCollections],
96
102
  );
97
- const [isOpenSubMenu, setIsOpenSubMenu] = useState(false);
98
- const searchedChildren = useMenuSearch(childItems, isOpenSubMenu, true);
103
+ const [openMenuKeys, setOpenMenuKeys] = useState([]);
104
+ const searchedChildren = useMenuSearch(childItems, openMenuKeys);
99
105
  return {
100
106
  name: 'updateRecordForm',
101
107
  key: 'updateRecordForm',
@@ -103,7 +109,7 @@ export default {
103
109
  title: `{{t("Update record form", { ns: "${NAMESPACE}" })}}`,
104
110
  componentProps: {
105
111
  onOpenChange(keys) {
106
- setIsOpenSubMenu(keys.length > 0);
112
+ setOpenMenuKeys(keys);
107
113
  },
108
114
  },
109
115
  children: searchedChildren,
@@ -1,4 +1,4 @@
1
- import { SchemaInitializerItemType, useCollectionManager, useCompile, usePlugin } from '@nocobase/client';
1
+ import { SchemaInitializerItemType, useCollectionManager_deprecated, useCompile, usePlugin } from '@nocobase/client';
2
2
 
3
3
  import WorkflowPlugin, {
4
4
  defaultFieldNames,
@@ -80,7 +80,7 @@ export default class extends Instruction {
80
80
  // eslint-disable-next-line react-hooks/rules-of-hooks
81
81
  const compile = useCompile();
82
82
  // eslint-disable-next-line react-hooks/rules-of-hooks
83
- const { getCollectionFields } = useCollectionManager();
83
+ const { getCollectionFields } = useCollectionManager_deprecated();
84
84
  const formKeys = Object.keys(config.forms ?? {});
85
85
  if (!formKeys.length) {
86
86
  return null;
@@ -120,7 +120,7 @@ export default class extends Instruction {
120
120
  }
121
121
  useInitializers(node): SchemaInitializerItemType | null {
122
122
  // eslint-disable-next-line react-hooks/rules-of-hooks
123
- const { getCollection } = useCollectionManager();
123
+ const { getCollection } = useCollectionManager_deprecated();
124
124
  const formKeys = Object.keys(node.config.forms ?? {});
125
125
  if (!formKeys.length || node.config.mode) {
126
126
  return null;