@nocobase/plugin-workflow-manual 0.21.0-alpha.1 → 0.21.0-alpha.11

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,c,s,_,K,b,S,h,N,D,J,q,de){"use strict";var Re=Object.defineProperty,eo=Object.defineProperties;var oo=Object.getOwnPropertyDescriptors;var Y=Object.getOwnPropertySymbols;var le=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable;var H=(C,e,c)=>e in C?Re(C,e,{enumerable:!0,configurable:!0,writable:!0,value:c}):C[e]=c,y=(C,e)=>{for(var c in e||(e={}))le.call(e,c)&&H(C,c,e[c]);if(Y)for(var c of Y(e))pe.call(e,c)&&H(C,c,e[c]);return C},w=(C,e)=>eo(C,oo(e));var $=(C,e)=>{var c={};for(var s in C)le.call(C,s)&&e.indexOf(s)<0&&(c[s]=C[s]);if(C!=null&&Y)for(var s of Y(C))e.indexOf(s)<0&&pe.call(C,s)&&(c[s]=C[s]);return c};var E=(C,e,c)=>(H(C,typeof e!="symbol"?e+"":e,c),c);var U=(C,e,c)=>new Promise((s,_)=>{var K=h=>{try{S(c.next(h))}catch(N){_(N)}},b=h=>{try{S(c.throw(h))}catch(N){_(N)}},S=h=>h.done?s(h.value):Promise.resolve(h.value).then(K,b);S((c=c.apply(C,e)).next())});const g="workflow-manual";function A(o,r={}){const{t:n}=ue(r);return n(o)}function ue(o){return N.useTranslation(g,o)}function X(o){var M,j,G;const r=e.useRecord(),n=b.useFieldSchema(),t=b.useField(),i=h.useRef(null),a=o.dataSource||e.DEFAULT_DATA_SOURCE_KEY,{getAssociationAppends:p}=e.useAssociationNames(a),{appends:u,updateAssociationValues:d}=p(),[f]=Object.keys((M=n.toJSON().properties)!=null?M:{}),m=(j=r==null?void 0:r.result)==null?void 0:j[f],{findComponent:l}=e.useDesignable(),x=l((G=t.component)==null?void 0:G[0])||h.Fragment,k=h.useMemo(()=>K.createForm({initialValues:m}),[m]),v=h.useMemo(()=>y({appends:u},o.params),[u,o.params]),F=h.useMemo(()=>({loading:!1,data:{data:m}}),[m]),I=e.useAPIClient(),z=e.useDataSourceHeaders(a),T=I.resource(o.collection,void 0,z),B=e.useBlockRequestContext(),V=h.useMemo(()=>({params:v,form:k,field:t,service:F,updateAssociationValues:d,formBlockRef:i}),[t,k,v,F,d]);return!r.status||m?s.jsx(e.CollectionManagerProvider,{dataSource:a,children:s.jsx(e.CollectionProvider_deprecated,{collection:o.collection,children:s.jsx(e.RecordProvider,{record:m,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:T,__parent:B},children:s.jsx(e.FormBlockContext.Provider,{value:V,children:s.jsxs(x,w(y({},t.componentProps),{children:[s.jsx(e.FormV2.Templates,{style:{marginBottom:18},form:k}),s.jsx("div",{ref:i,children:s.jsx(b.RecursionField,{schema:n,onlyRenderProperties:!0})})]}))})})})})})}):null}function me(o){return e.createFormBlockSchema(o)}function fe(n){var t=n,{schema:o}=t,r=$(t,["schema"]);const{getTemplateSchemaByMode:i}=e.useSchemaTemplateManager(),{insert:a}=e.useSchemaInitializer(),p=e.useRecordCollectionDataSourceItems("FormItem");function u(f){return U(this,arguments,function*({item:d}){var v;const m=d.template?yield i(d):null,l=me(w(y({actionInitializers:"workflowManual:form:configureActions",actions:{resolve:{type:"void",title:`{{t("Continue the process", { ns: "${g}" })}}`,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:c.JOB_STATUS.RESOLVED},"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useSubmit }}"},"x-designer":"ManualActionDesigner","x-designer-props":{}}}},o),{template:m}));delete l["x-acl-action-props"],delete l["x-acl-action"];const[x]=Object.keys(l.properties),k=((v=Object.entries(l.properties[x].properties).find(([F,I])=>I["x-component"]==="ActionBar"))==null?void 0:v[0])||"actions";l.properties[x].properties[k]["x-decorator"]="ActionBarProvider",l.properties[x].properties[k]["x-component-props"].style={marginTop:"1.5em",flexWrap:"wrap"},c.traverseSchema(l,F=>{F["x-uid"]&&delete F["x-uid"]}),a(l)})}return s.jsx(e.SchemaInitializerItem,w(y({},r),{onClick:u,items:p}))}function Z(){var r,n;const o=e.useSchemaInitializerItem();return s.jsx(e.CollectionProvider_deprecated,{dataSource:(r=o.schema)==null?void 0:r.dataSource,collection:(n=o.schema)==null?void 0:n.collection,children:s.jsx(fe,y({},o))})}function P(o,r,n=!1){const t=[];return o?r(o)&&(!n||!o.properties)?(t.push(o),t):(o.properties&&Object.keys(o.properties).forEach(i=>{t.push(...P(o.properties[i],r))}),t):t}function he(){const{name:o,title:r}=e.useCollection_deprecated();return s.jsxs(e.GeneralSchemaDesigner,{title:r||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 xe={title:`{{t("Create record form", { ns: "${g}" })}}`,config:{useInitializer({allCollections:o}){const r=h.useMemo(()=>o.map(({key:a,displayName:p,collections:u})=>({key:a,name:a,label:p,type:"subMenu",children:u.map(d=>({name:J.camelCase(`createRecordForm-child-${d.name}`),type:"item",title:d.title||d.tableName,schema:{collection:d.name,dataSource:a,title:`{{t("Create record", { ns: "${g}" })}}`,formType:"create","x-designer":"CreateFormDesigner"},Component:Z}))})),[o]),[n,t]=h.useState([]),i=e.useMenuSearch({data:r,openKeys:n});return{name:"createRecordForm",key:"createRecordForm",type:"subMenu",title:`{{t("Create record form", { ns: "${g}" })}}`,componentProps:{onOpenChange(a){t(a)}},children:i}},initializers:{},components:{CreateFormDesigner:he},parseFormOptions(o){const r={};return P(o,t=>t["x-decorator"]==="FormBlockProvider"&&t["x-decorator-props"].formType==="create").forEach(t=>{var u,d;const[i]=Object.keys(t.properties),a=t.properties[i],p=((u=Object.entries(a.properties).find(([f,m])=>m["x-component"]==="ActionBar"))==null?void 0:u[0])||"actions";r[i]={type:"create",title:((d=t["x-component-props"])==null?void 0:d.title)||i,actions:P(a.properties[p],f=>f["x-component"]==="Action").map(f=>{var m,l;return{status:f["x-decorator-props"].value,values:(l=(m=f["x-action-settings"])==null?void 0:m.assignedValues)==null?void 0:l.values,key:f.name}}),collection:t["x-decorator-props"].collection}}),r}},block:{scope:{},components:{}}};function W(o){var f,m,l,x;const[r,n]=h.useState((m=(f=o.collection)==null?void 0:f.fields)!=null?m:[]),t=e.useRecord(),i=b.useField(),a=b.useFieldSchema(),[p]=Object.keys((l=a.toJSON().properties)!=null?l:{}),u=(x=t==null?void 0:t.result)==null?void 0:x[p],d=h.useMemo(()=>K.createForm({initialValues:u}),[u]);return!t.status||u?s.jsx(e.CollectionProvider_deprecated,{collection:w(y({},o.collection),{fields:r}),children:s.jsx(e.RecordProvider,{record:u,parent:null,children:s.jsx(e.FormBlockContext.Provider,{value:{form:d,field:i,setCollectionFields:n},children:o.children})})}):null}function Ce(){const{insert:o}=e.useSchemaInitializer(),r=e.useSchemaInitializerItem();return s.jsx(e.SchemaInitializerItem,w(y({},r),{onClick:()=>{o({type:"void","x-decorator":"CustomFormBlockProvider","x-decorator-props":{collection:{name:D.uid(),fields:[]}},"x-component":"CardItem","x-component-props":{title:'{{t("Form")}}'},"x-designer":"SimpleDesigner","x-designer-props":{type:"customForm"},properties:{[D.uid()]:{type:"void","x-component":"FormV2","x-component-props":{useProps:"{{ useFormBlockProps }}"},properties:{grid:{type:"void","x-component":"Grid","x-initializer":"workflowManual:customForm:configureFields"},actions:{type:"void","x-decorator":"ActionBarProvider","x-component":"ActionBar","x-component-props":{layout:"one-column",style:{marginTop:"1.5em",flexWrap:"wrap"}},"x-initializer":"workflowManual:form:configureActions",properties:{resolve:{type:"void",title:`{{t("Continue the process", { ns: "${g}" })}}`,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:c.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 ge(o){const r={};return Object.keys(o).forEach(n=>{const t=o[n],{group:i="others"}=t;r[i]=r[i]||{},J.set(r,[i,n],t)}),Object.keys(R).filter(n=>["basic","choices","datetime","media"].includes(n)).map(n=>({title:R[n],children:Object.keys(r[n]||{}).map(t=>{const i=r[n][t];return y({value:t,title:i.title,name:t},r[n][t])}).sort((t,i)=>t.order-i.order)}))}function ye(){const{interfaces:o}=e.useCollectionManager_deprecated();return ge(o).map(n=>({name:n.title,type:"itemGroup",title:n.title,children:n.children.map(t=>({name:t.name,type:"item",title:t.title,Component:Se,fieldInterface:t.name}))}))}const ee=h.createContext({}),oe=o=>{const[r,n]=h.useState(null),[t,i]=h.useState(),a=ye(),p=e.useCollection_deprecated(),{setCollectionFields:u}=h.useContext(e.FormBlockContext),d=h.useMemo(()=>K.createForm(),[r]);return s.jsxs(ee.Provider,{value:{onAddField(f){const m=J.pick(f,["name","group","title","default","validateSchema"]),{properties:z}=f,T=z,{unique:l,type:x,layout:k,autoIncrement:v}=T,F=$(T,["unique","type","layout","autoIncrement"]);m.properties=F;const I=J.cloneDeep(m);delete I.properties.name["x-disabled"],n(I)},setCallback:i},children:[s.jsx(e.SchemaInitializerItems,w(y({},o),{items:a})),s.jsx(e.ActionContextProvider,{value:{visible:!!r,setVisible(f){f||n(null)}},children:r?s.jsx(e.SchemaComponent,{schema:{type:"void",name:"drawer",title:'{{t("Configure field")}}',"x-decorator":"FormV2","x-decorator-props":{form:d},"x-component":"Action.Drawer",properties:w(y({},r.properties),{footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{type:"void",title:'{{t("Cancel")}}',"x-component":"Action","x-component-props":{useAction(){const f=b.useForm();return{run(){return U(this,null,function*(){i(null),n(null),f.reset()})}}}}},submit:{type:"void",title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction(){const{values:f,query:m,reset:l}=b.useForm(),x=[A("Field name existed in form")];return{run(){return U(this,null,function*(){var T,B,V,M;const{default:v}=r,F=D.uid();if(v.name=(T=f.name)!=null?T:F,v.uiSchema.title=(V=(B=f.uiSchema)==null?void 0:B.title)!=null?V:F,v.interface=r.name,(M=p.fields)==null?void 0:M.find(j=>j.name===v.name)){m("name").take().setFeedback({type:"error",messages:x});return}const z=D.merge(v,f);u([...p.fields,z]),t({name:v.name,type:v.uiSchema.type,"x-decorator":"FormItem","x-component":"CollectionField","x-component-props":{field:z},"x-collection-field":`${p.name}.${v.name}`,"x-toolbar":"FormItemSchemaToolbar","x-settings":"fieldSettings:FormItem"}),l(),i(null),n(null)})}}}}}}}})},components:{ArrayTable:_.ArrayTable}}):null})]})},te=new e.CompatibleSchemaInitializer({name:"AddCustomFormField",wrap:e.gridRowColWrap,insertPosition:"beforeEnd",title:"{{t('Configure fields')}}",ItemsComponent:oe}),be=new e.CompatibleSchemaInitializer({name:"workflowManual:customForm:configureFields",wrap:e.gridRowColWrap,insertPosition:"beforeEnd",title:"{{t('Configure fields')}}",ItemsComponent:oe},te);function Se(){const o=e.useSchemaInitializerItem(),{insert:r,setVisible:n}=e.useSchemaInitializer(),{onAddField:t,setCallback:i}=h.useContext(ee),{getInterface:a}=e.useCollectionManager_deprecated(),p=a(o.fieldInterface);return s.jsx(e.SchemaInitializerItem,y({onClick:()=>{i(()=>r),t(p),n(!1)}},o),o.fieldInterface)}const ne={title:`{{t("Custom form", { ns: "${g}" })}}`,config:{useInitializer(){return{name:"customForm",type:"item",title:`{{t("Custom form", { ns: "${g}" })}}`,Component:Ce}},initializers:{},components:{CustomFormBlockProvider:W},parseFormOptions(o){const r={};return P(o,t=>t["x-decorator"]==="CustomFormBlockProvider").forEach(t=>{var d,f;const[i]=Object.keys(t.properties),a=t.properties[i],p=P(a.properties.grid,m=>m["x-component"]==="CollectionField",!0);t["x-decorator-props"].collection.fields=p.map(m=>{var l,x;return(x=(l=m["x-component-props"])==null?void 0:l.field)!=null?x:m["x-interface-options"]});const u=((d=Object.entries(a.properties).find(([m,l])=>l["x-component"]==="ActionBar"))==null?void 0:d[0])||"actions";r[i]={type:"custom",title:((f=t["x-component-props"])==null?void 0:f.title)||i,actions:P(a.properties[u],m=>m["x-component"]==="Action").map(m=>{var l,x;return{status:m["x-decorator-props"].value,values:(x=(l=m["x-action-settings"])==null?void 0:l.assignedValues)==null?void 0:x.values,key:m.name}}),collection:t["x-decorator-props"].collection}}),r}},block:{scope:{},components:{CustomFormBlockProvider:W}}};function ve(){const{name:o,title:r}=e.useCollection_deprecated(),n=b.useFieldSchema(),{t}=N.useTranslation(),{dn:i}=e.useDesignable();return s.jsxs(e.GeneralSchemaDesigner,{title:r||o,children:[s.jsx(e.SchemaSettingsBlockTitleItem,{}),s.jsx(e.SchemaSettingsActionModalItem,{title:t("Filter settings",{ns:g}),schema:{name:"filter",type:"object",title:'{{t("Filter")}}',"x-component":"Filter","x-component-props":{useProps(){var p;return{options:e.useCollectionFilterOptions((p=n==null?void 0:n["x-decorator-props"])==null?void 0:p.collection)}},dynamicComponent:"FilterDynamicComponent"}},initialValues:n==null?void 0:n["x-decorator-props"],onSubmit:({filter:a})=>{n["x-decorator-props"].filter=a,i.emit("patch",{schema:{"x-decorator-props":n["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 Fe={title:`{{t("Update record form", { ns: "${g}" })}}`,config:{useInitializer({allCollections:o}){const r=h.useMemo(()=>o.map(({key:a,displayName:p,collections:u})=>({key:a,name:a,label:p,type:"subMenu",children:u.map(d=>({name:J.camelCase(`updateRecordForm-child-${d.name}`),type:"item",title:d.title||d.tableName,schema:{collection:d.name,dataSource:a,title:`{{t("Update record", { ns: "${g}" })}}`,formType:"update","x-designer":"UpdateFormDesigner"},Component:Z}))})),[o]),[n,t]=h.useState([]),i=e.useMenuSearch({data:r,openKeys:n});return{name:"updateRecordForm",key:"updateRecordForm",type:"subMenu",title:`{{t("Update record form", { ns: "${g}" })}}`,componentProps:{onOpenChange(a){t(a)}},children:i}},initializers:{},components:{FilterDynamicComponent:c.FilterDynamicComponent,UpdateFormDesigner:ve},parseFormOptions(o){const r={};return P(o,t=>t["x-decorator"]==="FormBlockProvider"&&t["x-decorator-props"].formType==="update").forEach(t=>{var u,d;const[i]=Object.keys(t.properties),a=t.properties[i],p=((u=Object.entries(a.properties).find(([f,m])=>m["x-component"]==="ActionBar"))==null?void 0:u[0])||"actions";r[i]=w(y({},t["x-decorator-props"]),{type:"update",title:((d=t["x-component-props"])==null?void 0:d.title)||i,actions:P(a.properties[p],f=>f["x-component"]==="Action").map(f=>{var m,l;return{status:f["x-decorator-props"].value,values:(l=(m=f["x-action-settings"])==null?void 0:m.assignedValues)==null?void 0:l.values,key:f.name}})})}),r}},block:{scope:{},components:{}}},O=new D.Registry;O.register("customForm",ne),O.register("createForm",xe),O.register("updateForm",Fe);function re(){const{workflow:o}=c.useFlowContext(),r=c.useTrigger();return r.useInitializers?r.useInitializers(o.config):null}ne.title,`${g}`;const se=new e.CompatibleSchemaInitializer({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(c),r=c.useNodeContext(),n=c.useAvailableUpstreams(r),t=[re()].filter(Boolean),i=n.map(p=>{var d;const u=o.instructions.get(p.type);return(d=u==null?void 0:u.useInitializers)==null?void 0:d.call(u,p)}).filter(Boolean);return[...t,...i.length?[{name:"nodes",type:"subMenu",title:'{{t("Node result", { ns: "workflow" })}}',children:i}]:[]].filter(Boolean)}},{type:"itemGroup",name:"form",title:'{{t("Form")}}',useChildren(){const r=e.useDataSourceManager().getAllCollections();return Array.from(O.getValues()).map(n=>{const{useInitializer:t}=n.config;return t({allCollections:r})})}},{type:"itemGroup",name:"otherBlocks",title:'{{t("Other blocks")}}',children:[{name:"markdown",title:'{{t("Markdown")}}',Component:"MarkdownBlockInitializer"}]}]}),ke=new e.CompatibleSchemaInitializer({name:"workflowManual:popup:configureUserInterface:addBlock",wrap:e.gridRowColWrap,title:'{{t("Add block")}}',items:[{type:"itemGroup",name:"dataBlocks",title:'{{t("Data blocks")}}',hideIfNoChildren:!0,useChildren(){const o=e.usePlugin(c),r=c.useNodeContext(),n=c.useAvailableUpstreams(r),t=[re()].filter(Boolean),i=n.map(p=>{var d;const u=o.instructions.get(p.type);return(d=u==null?void 0:u.useInitializers)==null?void 0:d.call(u,p)}).filter(Boolean);return[...t,...i.length?[{name:"nodes",type:"subMenu",title:`{{t("Node result", { ns: "${g}" })}}`,children:i}]:[]].filter(Boolean)}},{type:"itemGroup",name:"form",title:'{{t("Form")}}',useChildren(){const r=e.useDataSourceManager().getAllCollections();return Array.from(O.getValues()).map(n=>{const{useInitializer:t}=n.config;return t({allCollections:r})})}},{type:"itemGroup",name:"otherBlocks",title:'{{t("Other blocks")}}',children:[{name:"markdown",title:'{{t("Markdown")}}',Component:"MarkdownBlockInitializer"}]}]},se);function we(){var I,z,T;const o=h.useContext(e.SchemaComponentContext),{t:r}=N.useTranslation(),n=b.useFieldSchema(),t=c.useWorkflowVariableOptions(),[i,a]=h.useState(!1),[p,u]=h.useState((T=(z=(I=n==null?void 0:n["x-action-settings"])==null?void 0:I.assignedValues)==null?void 0:z.schema)!=null?T:{type:"void","x-component":"Grid","x-initializer":"assignFieldValuesForm:configureFields",properties:{}}),[d,f]=h.useState(null),{components:m}=e.useSchemaOptionsContext();h.useEffect(()=>{f(new b.Schema({properties:{grid:p}}))},[p]);const l=h.useMemo(()=>{var V,M;const B=(M=(V=n==null?void 0:n["x-action-settings"])==null?void 0:V.assignedValues)==null?void 0:M.values;return K.createForm({initialValues:D.lodash.cloneDeep(B),values:D.lodash.cloneDeep(B)})},[n]),x=e.useFormActiveFields(),k=r("Assign field values");function v(){a(!1)}function F(){n["x-action-settings"]||(n["x-action-settings"]={}),n["x-action-settings"].assignedValues||(n["x-action-settings"].assignedValues={}),n["x-action-settings"].assignedValues.schema=p,n["x-action-settings"].assignedValues.values=l.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:k,onClick:()=>a(!0),children:k}),s.jsx(S.Modal,{width:"50%",title:k,open:i,onCancel:v,footer:s.jsxs(S.Space,{children:[s.jsx(S.Button,{onClick:v,children:r("Cancel")}),s.jsx(S.Button,{type:"primary",onClick:F,children:r("Submit")})]}),children:s.jsx(e.DefaultValueProvider,{isAllowToSetDefaultValue:()=>!1,children:s.jsx(e.VariableScopeProvider,{scope:t,children:s.jsx(e.FormActiveFieldsProvider,{name:"form",getActiveFieldsName:x==null?void 0:x.getActiveFieldsName,children:s.jsx(b.FormProvider,{form:l,children:s.jsxs(_.FormLayout,{layout:"vertical",children:[s.jsx(S.Alert,{message:A("Values preset in this form will override user submitted ones when continue or reject.")}),s.jsx("br",{}),i&&d&&s.jsx(e.SchemaComponentContext.Provider,{value:w(y({},o),{refresh(){u(D.lodash.get(d.toJSON(),"properties.grid"))}}),children:s.jsx(e.SchemaComponent,{schema:d,components:m})})]})})})})})})]})}function Ie(o){return s.jsxs(e.GeneralSchemaDesigner,w(y({},o),{disableInitializer:!0,children:[s.jsx(e.Action.Designer.ButtonEditor,{}),s.jsx(we,{}),s.jsx(e.SchemaSettingsDivider,{}),s.jsx(e.SchemaSettingsRemove,{removeParentsIfNoChildren:!0,breakRemoveOn:{"x-component":"ActionBar"}})]}))}function ie(){const a=e.useSchemaInitializerItem(),{action:r,actionProps:n}=a,t=$(a,["action","actionProps"]),{insert:i}=e.useSchemaInitializer();return s.jsx(e.SchemaInitializerItem,w(y({},t),{onClick:()=>{i({type:"void",title:t.title,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:r},"x-component":"Action","x-component-props":w(y({},n),{useAction:"{{ useSubmit }}"}),"x-designer":"ManualActionDesigner","x-action-settings":{}})}}))}function L(){const o=e.useSchemaInitializerItem(),i=o,{action:r,actionProps:n}=i,t=$(i,["action","actionProps"]);return s.jsx(e.InitializerWithSwitch,w(y({},t),{item:o,schema:{type:"void",title:t.title,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:r},"x-component":"Action","x-component-props":w(y({},n),{useAction:"{{ useSubmit }}"}),"x-designer":"Action.Designer","x-action":`${r}`},type:"x-action"}))}const ae=new e.CompatibleSchemaInitializer({name:"AddActionButton",title:'{{t("Configure actions")}}',items:[{name:"jobStatusResolved",title:`{{t("Continue the process", { ns: "${g}" })}}`,Component:ie,action:c.JOB_STATUS.RESOLVED,actionProps:{type:"primary"}},{name:"jobStatusRejected",title:`{{t("Terminate the process", { ns: "${g}" })}}`,Component:L,action:c.JOB_STATUS.REJECTED,actionProps:{danger:!0}},{name:"jobStatusPending",title:`{{t("Save temporarily", { ns: "${g}" })}}`,Component:L,action:c.JOB_STATUS.PENDING}]}),Ae=new e.CompatibleSchemaInitializer({name:"workflowManual:form:configureActions",title:'{{t("Configure actions")}}',items:[{name:"jobStatusResolved",title:`{{t("Continue the process", { ns: "${g}" })}}`,Component:ie,action:c.JOB_STATUS.RESOLVED,actionProps:{type:"primary"}},{name:"jobStatusRejected",title:`{{t("Terminate the process", { ns: "${g}" })}}`,Component:L,action:c.JOB_STATUS.REJECTED,actionProps:{danger:!0}},{name:"jobStatusPending",title:`{{t("Save temporarily", { ns: "${g}" })}}`,Component:L,action:c.JOB_STATUS.PENDING}]},ae);function Be(){return{run(){}}}function Te({value:o,onChange:r}){const n=e.usePlugin(c),t=h.useContext(e.SchemaComponentContext),i=c.useNodeContext(),a=c.useAvailableUpstreams(i),p=b.useForm(),{workflow:u}=c.useFlowContext(),d={};a.forEach(l=>{const x=n.instructions.get(l.type);Object.assign(d,x.components)});const f=h.useMemo(()=>new b.Schema({properties:{drawer:{type:"void",title:`{{t("User interface", { ns: "${g}" })}}`,"x-decorator":"Form","x-component":"Action.Drawer","x-component-props":{className:e.css`
1
+ (function(x,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):(x=typeof globalThis!="undefined"?globalThis:x||self,e(x["@nocobase/plugin-workflow-manual"]={},x["@nocobase/client"],x["@nocobase/plugin-workflow"],x.jsxRuntime,x["@formily/antd-v5"],x["@formily/core"],x["@formily/react"],x.antd,x.react,x["react-i18next"],x["@nocobase/utils"],x.lodash,x["@ant-design/icons"],x.dayjs))})(this,function(x,e,c,s,_,K,b,S,h,N,D,J,q,ue){"use strict";var eo=Object.defineProperty,oo=Object.defineProperties;var to=Object.getOwnPropertyDescriptors;var Y=Object.getOwnPropertySymbols;var pe=Object.prototype.hasOwnProperty,de=Object.prototype.propertyIsEnumerable;var X=(x,e,c)=>e in x?eo(x,e,{enumerable:!0,configurable:!0,writable:!0,value:c}):x[e]=c,y=(x,e)=>{for(var c in e||(e={}))pe.call(e,c)&&X(x,c,e[c]);if(Y)for(var c of Y(e))de.call(e,c)&&X(x,c,e[c]);return x},w=(x,e)=>oo(x,to(e));var $=(x,e)=>{var c={};for(var s in x)pe.call(x,s)&&e.indexOf(s)<0&&(c[s]=x[s]);if(x!=null&&Y)for(var s of Y(x))e.indexOf(s)<0&&de.call(x,s)&&(c[s]=x[s]);return c};var E=(x,e,c)=>(X(x,typeof e!="symbol"?e+"":e,c),c);var U=(x,e,c)=>new Promise((s,_)=>{var K=h=>{try{S(c.next(h))}catch(N){_(N)}},b=h=>{try{S(c.throw(h))}catch(N){_(N)}},S=h=>h.done?s(h.value):Promise.resolve(h.value).then(K,b);S((c=c.apply(x,e)).next())});const g="workflow-manual";function B(t,r={}){const{t:n}=Q(r);return n(t)}function Q(t){return N.useTranslation(g,t)}function Z(t){var P,z,G;const r=e.useRecord(),n=b.useFieldSchema(),o=b.useField(),i=h.useRef(null),a=t.dataSource||e.DEFAULT_DATA_SOURCE_KEY,{getAssociationAppends:l}=e.useAssociationNames(a),{appends:p,updateAssociationValues:u}=l(),[m]=Object.keys((P=n.toJSON().properties)!=null?P:{}),f=(z=r==null?void 0:r.result)==null?void 0:z[m],{findComponent:d}=e.useDesignable(),C=d((G=o.component)==null?void 0:G[0])||h.Fragment,k=h.useMemo(()=>K.createForm({initialValues:f}),[f]),v=h.useMemo(()=>y({appends:p},t.params),[p,t.params]),F=h.useMemo(()=>({loading:!1,data:{data:f}}),[f]),I=e.useAPIClient(),T=e.useDataSourceHeaders(a),A=I.resource(t.collection,void 0,T),V=e.useBlockRequestContext(),M=h.useMemo(()=>({params:v,form:k,field:o,service:F,updateAssociationValues:u,formBlockRef:i}),[o,k,v,F,u]);return!r.status||f?s.jsx(e.CollectionManagerProvider,{dataSource:a,children:s.jsx(e.CollectionProvider_deprecated,{collection:t.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:t,field:o,service:F,resource:A,__parent:V},children:s.jsx(e.FormBlockContext.Provider,{value:M,children:s.jsxs(C,w(y({},o.componentProps),{children:[s.jsx(e.FormV2.Templates,{style:{marginBottom:18},form:k}),s.jsx("div",{ref:i,children:s.jsx(b.RecursionField,{schema:n,onlyRenderProperties:!0})})]}))})})})})})}):null}function me(t){return e.createFormBlockSchema(t)}function fe(n){var o=n,{schema:t}=o,r=$(o,["schema"]);const{getTemplateSchemaByMode:i}=e.useSchemaTemplateManager(),{insert:a}=e.useSchemaInitializer(),l=e.useRecordCollectionDataSourceItems("FormItem");function p(m){return U(this,arguments,function*({item:u}){var v;const f=u.template?yield i(u):null,d=me(w(y({actionInitializers:"workflowManual:form:configureActions",actions:{resolve:{type:"void",title:`{{t("Continue the process", { ns: "${g}" })}}`,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:c.JOB_STATUS.RESOLVED},"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useSubmit }}"},"x-designer":"ManualActionDesigner","x-designer-props":{}}}},t),{template:f}));delete d["x-acl-action-props"],delete d["x-acl-action"];const[C]=Object.keys(d.properties),k=((v=Object.entries(d.properties[C].properties).find(([F,I])=>I["x-component"]==="ActionBar"))==null?void 0:v[0])||"actions";d.properties[C].properties[k]["x-decorator"]="ActionBarProvider",d.properties[C].properties[k]["x-component-props"].style={marginTop:"1.5em",flexWrap:"wrap"},c.traverseSchema(d,F=>{F["x-uid"]&&delete F["x-uid"]}),a(d)})}return s.jsx(e.SchemaInitializerItem,w(y({},r),{onClick:p,items:l}))}function W(){var r,n;const t=e.useSchemaInitializerItem();return s.jsx(e.CollectionProvider_deprecated,{dataSource:(r=t.schema)==null?void 0:r.dataSource,collection:(n=t.schema)==null?void 0:n.collection,children:s.jsx(fe,y({},t))})}function j(t,r,n=!1){const o=[];return t?r(t)&&(!n||!t.properties)?(o.push(t),o):(t.properties&&Object.keys(t.properties).forEach(i=>{o.push(...j(t.properties[i],r))}),o):o}function he(){const{name:t,title:r}=e.useCollection_deprecated();return s.jsxs(e.GeneralSchemaDesigner,{title:r||t,children:[s.jsx(e.SchemaSettingsBlockTitleItem,{}),s.jsx(e.SchemaSettingsLinkageRules,{collectionName:t}),s.jsx(e.SchemaSettingsDataTemplates,{collectionName:t}),s.jsx(e.SchemaSettingsDivider,{}),s.jsx(e.SchemaSettingsRemove,{removeParentsIfNoChildren:!0,breakRemoveOn:{"x-component":"Grid"}})]})}const xe={title:`{{t("Create record form", { ns: "${g}" })}}`,config:{useInitializer({allCollections:t}){const r=h.useMemo(()=>t.map(({key:a,displayName:l,collections:p})=>({key:a,name:a,label:l,type:"subMenu",children:p.map(u=>({name:J.camelCase(`createRecordForm-child-${u.name}`),type:"item",title:u.title||u.tableName,schema:{collection:u.name,dataSource:a,title:`{{t("Create record", { ns: "${g}" })}}`,formType:"create","x-designer":"CreateFormDesigner"},Component:W}))})),[t]),[n,o]=h.useState([]),i=e.useMenuSearch({data:r,openKeys:n});return{name:"createRecordForm",key:"createRecordForm",type:"subMenu",title:`{{t("Create record form", { ns: "${g}" })}}`,componentProps:{onOpenChange(a){o(a)}},children:i}},initializers:{},components:{CreateFormDesigner:he},parseFormOptions(t){const r={};return j(t,o=>o["x-decorator"]==="FormBlockProvider"&&o["x-decorator-props"].formType==="create").forEach(o=>{var p,u;const[i]=Object.keys(o.properties),a=o.properties[i],l=((p=Object.entries(a.properties).find(([m,f])=>f["x-component"]==="ActionBar"))==null?void 0:p[0])||"actions";r[i]={type:"create",title:((u=o["x-component-props"])==null?void 0:u.title)||i,actions:j(a.properties[l],m=>m["x-component"]==="Action").map(m=>{var f,d;return{status:m["x-decorator-props"].value,values:(d=(f=m["x-action-settings"])==null?void 0:f.assignedValues)==null?void 0:d.values,key:m.name}}),collection:o["x-decorator-props"].collection}}),r}},block:{scope:{},components:{}}};function R(t){var m,f,d,C;const[r,n]=h.useState((f=(m=t.collection)==null?void 0:m.fields)!=null?f:[]),o=e.useRecord(),i=b.useField(),a=b.useFieldSchema(),[l]=Object.keys((d=a.toJSON().properties)!=null?d:{}),p=(C=o==null?void 0:o.result)==null?void 0:C[l],u=h.useMemo(()=>K.createForm({initialValues:p}),[p]);return!o.status||p?s.jsx(e.CollectionProvider_deprecated,{collection:w(y({},t.collection),{fields:r}),children:s.jsx(e.RecordProvider,{record:p,parent:null,children:s.jsx(e.FormBlockContext.Provider,{value:{form:u,field:i,setCollectionFields:n},children:t.children})})}):null}function Ce(){const{insert:t}=e.useSchemaInitializer(),r=e.useSchemaInitializerItem();return s.jsx(e.SchemaInitializerItem,w(y({},r),{onClick:()=>{t({type:"void","x-decorator":"CustomFormBlockProvider","x-decorator-props":{collection:{name:D.uid(),fields:[]}},"x-component":"CardItem","x-component-props":{title:'{{t("Form")}}'},"x-designer":"SimpleDesigner","x-designer-props":{type:"customForm"},properties:{[D.uid()]:{type:"void","x-component":"FormV2","x-use-component-props":"useFormBlockProps",properties:{grid:{type:"void","x-component":"Grid","x-initializer":"workflowManual:customForm:configureFields"},actions:{type:"void","x-decorator":"ActionBarProvider","x-component":"ActionBar","x-component-props":{layout:"one-column",style:{marginTop:"1.5em",flexWrap:"wrap"}},"x-initializer":"workflowManual:form:configureActions",properties:{resolve:{type:"void",title:`{{t("Continue the process", { ns: "${g}" })}}`,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:c.JOB_STATUS.RESOLVED},"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useSubmit }}"},"x-designer":"ManualActionDesigner"}}}}}}})}}))}const ee={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 ge(t){const r={};return Object.keys(t).forEach(n=>{const o=t[n],{group:i="others"}=o;r[i]=r[i]||{},J.set(r,[i,n],o)}),Object.keys(ee).filter(n=>["basic","choices","datetime","media"].includes(n)).map(n=>({title:ee[n],children:Object.keys(r[n]||{}).map(o=>{const i=r[n][o];return y({value:o,title:i.title,name:o},r[n][o])}).sort((o,i)=>o.order-i.order)}))}function ye(){const{interfaces:t}=e.useCollectionManager_deprecated();return ge(t).map(n=>({name:n.title,type:"itemGroup",title:n.title,children:n.children.map(o=>({name:o.name,type:"item",title:o.title,Component:Se,fieldInterface:o.name}))}))}const oe=h.createContext({}),te=t=>{const[r,n]=h.useState(null),[o,i]=h.useState(),a=ye(),l=e.useCollection_deprecated(),{setCollectionFields:p}=h.useContext(e.FormBlockContext),u=h.useMemo(()=>K.createForm(),[r]);return s.jsxs(oe.Provider,{value:{onAddField(m){const f=J.pick(m,["name","group","title","default","validateSchema"]),{properties:T}=m,A=T,{unique:d,type:C,layout:k,autoIncrement:v}=A,F=$(A,["unique","type","layout","autoIncrement"]);f.properties=F;const I=J.cloneDeep(f);delete I.properties.name["x-disabled"],n(I)},setCallback:i},children:[s.jsx(e.SchemaInitializerItems,w(y({},t),{items:a})),s.jsx(e.ActionContextProvider,{value:{visible:!!r,setVisible(m){m||n(null)}},children:r?s.jsx(e.SchemaComponent,{schema:{type:"void",name:"drawer",title:'{{t("Configure field")}}',"x-decorator":"FormV2","x-decorator-props":{form:u},"x-component":"Action.Drawer",properties:w(y({},r.properties),{footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{type:"void",title:'{{t("Cancel")}}',"x-component":"Action","x-component-props":{useAction(){const m=b.useForm();return{run(){return U(this,null,function*(){i(null),n(null),m.reset()})}}}}},submit:{type:"void",title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction(){const{values:m,query:f,reset:d}=b.useForm(),C=[B("Field name existed in form")];return{run(){return U(this,null,function*(){var A,V,M,P;const{default:v}=r,F=D.uid();if(v.name=(A=m.name)!=null?A:F,v.uiSchema.title=(M=(V=m.uiSchema)==null?void 0:V.title)!=null?M:F,v.interface=r.name,(P=l.fields)==null?void 0:P.find(z=>z.name===v.name)){f("name").take().setFeedback({type:"error",messages:C});return}const T=D.merge(v,m);p([...l.fields,T]),o({name:v.name,type:v.uiSchema.type,"x-decorator":"FormItem","x-component":"CollectionField","x-component-props":{field:T},"x-collection-field":`${l.name}.${v.name}`,"x-toolbar":"FormItemSchemaToolbar","x-settings":"fieldSettings:FormItem"}),d(),i(null),n(null)})}}}}}}}})},components:{ArrayTable:_.ArrayTable}}):null})]})},ne=new e.CompatibleSchemaInitializer({name:"AddCustomFormField",wrap:e.gridRowColWrap,insertPosition:"beforeEnd",title:"{{t('Configure fields')}}",ItemsComponent:te}),be=new e.CompatibleSchemaInitializer({name:"workflowManual:customForm:configureFields",wrap:e.gridRowColWrap,insertPosition:"beforeEnd",title:"{{t('Configure fields')}}",ItemsComponent:te},ne);function Se(){const t=e.useSchemaInitializerItem(),{insert:r,setVisible:n}=e.useSchemaInitializer(),{onAddField:o,setCallback:i}=h.useContext(oe),{getInterface:a}=e.useCollectionManager_deprecated(),l=a(t.fieldInterface);return s.jsx(e.SchemaInitializerItem,y({onClick:()=>{i(()=>r),o(l),n(!1)}},t),t.fieldInterface)}const re={title:`{{t("Custom form", { ns: "${g}" })}}`,config:{useInitializer(){return{name:"customForm",type:"item",title:`{{t("Custom form", { ns: "${g}" })}}`,Component:Ce}},initializers:{},components:{CustomFormBlockProvider:R},parseFormOptions(t){const r={};return j(t,o=>o["x-decorator"]==="CustomFormBlockProvider").forEach(o=>{var u,m;const[i]=Object.keys(o.properties),a=o.properties[i],l=j(a.properties.grid,f=>f["x-component"]==="CollectionField",!0);o["x-decorator-props"].collection.fields=l.map(f=>{var d,C;return(C=(d=f["x-component-props"])==null?void 0:d.field)!=null?C:f["x-interface-options"]});const p=((u=Object.entries(a.properties).find(([f,d])=>d["x-component"]==="ActionBar"))==null?void 0:u[0])||"actions";r[i]={type:"custom",title:((m=o["x-component-props"])==null?void 0:m.title)||i,actions:j(a.properties[p],f=>f["x-component"]==="Action").map(f=>{var d,C;return{status:f["x-decorator-props"].value,values:(C=(d=f["x-action-settings"])==null?void 0:d.assignedValues)==null?void 0:C.values,key:f.name}}),collection:o["x-decorator-props"].collection}}),r}},block:{scope:{},components:{CustomFormBlockProvider:R}}};function ve(){const{name:t,title:r}=e.useCollection_deprecated(),n=b.useFieldSchema(),{t:o}=N.useTranslation(),{dn:i}=e.useDesignable();return s.jsxs(e.GeneralSchemaDesigner,{title:r||t,children:[s.jsx(e.SchemaSettingsBlockTitleItem,{}),s.jsx(e.SchemaSettingsActionModalItem,{title:o("Filter settings",{ns:g}),schema:{name:"filter",type:"object",title:'{{t("Filter")}}',"x-component":"Filter","x-use-component-props":()=>{var l;return{options:e.useCollectionFilterOptions((l=n==null?void 0:n["x-decorator-props"])==null?void 0:l.collection)}},"x-component-props":{dynamicComponent:"FilterDynamicComponent"}},initialValues:n==null?void 0:n["x-decorator-props"],onSubmit:({filter:a})=>{n["x-decorator-props"].filter=a,i.emit("patch",{schema:{"x-decorator-props":n["x-decorator-props"]}}),i.refresh()}}),s.jsx(e.SchemaSettingsLinkageRules,{collectionName:t}),s.jsx(e.SchemaSettingsDivider,{}),s.jsx(e.SchemaSettingsRemove,{removeParentsIfNoChildren:!0,breakRemoveOn:{"x-component":"Grid"}})]})}const Fe={title:`{{t("Update record form", { ns: "${g}" })}}`,config:{useInitializer({allCollections:t}){const r=h.useMemo(()=>t.map(({key:a,displayName:l,collections:p})=>({key:a,name:a,label:l,type:"subMenu",children:p.map(u=>({name:J.camelCase(`updateRecordForm-child-${u.name}`),type:"item",title:u.title||u.tableName,schema:{collection:u.name,dataSource:a,title:`{{t("Update record", { ns: "${g}" })}}`,formType:"update","x-designer":"UpdateFormDesigner"},Component:W}))})),[t]),[n,o]=h.useState([]),i=e.useMenuSearch({data:r,openKeys:n});return{name:"updateRecordForm",key:"updateRecordForm",type:"subMenu",title:`{{t("Update record form", { ns: "${g}" })}}`,componentProps:{onOpenChange(a){o(a)}},children:i}},initializers:{},components:{FilterDynamicComponent:c.FilterDynamicComponent,UpdateFormDesigner:ve},parseFormOptions(t){const r={};return j(t,o=>o["x-decorator"]==="FormBlockProvider"&&o["x-decorator-props"].formType==="update").forEach(o=>{var p,u;const[i]=Object.keys(o.properties),a=o.properties[i],l=((p=Object.entries(a.properties).find(([m,f])=>f["x-component"]==="ActionBar"))==null?void 0:p[0])||"actions";r[i]=w(y({},o["x-decorator-props"]),{type:"update",title:((u=o["x-component-props"])==null?void 0:u.title)||i,actions:j(a.properties[l],m=>m["x-component"]==="Action").map(m=>{var f,d;return{status:m["x-decorator-props"].value,values:(d=(f=m["x-action-settings"])==null?void 0:f.assignedValues)==null?void 0:d.values,key:m.name}})})}),r}},block:{scope:{},components:{}},validate({filter:t}){return!t||!D.isValidFilter(t)?"Please check one of your update record form, and add at least one filter condition in form settings.":null}},O=new D.Registry;O.register("custom",re),O.register("create",xe),O.register("update",Fe);function se(){const{workflow:t}=c.useFlowContext(),r=c.useTrigger();return r.useInitializers?r.useInitializers(t.config):null}re.title,`${g}`;const ie=new e.CompatibleSchemaInitializer({name:"AddBlockButton",wrap:e.gridRowColWrap,title:'{{t("Add block")}}',items:[{type:"itemGroup",name:"dataBlocks",title:'{{t("Data blocks")}}',hideIfNoChildren:!0,useChildren(){const t=e.usePlugin(c),r=c.useNodeContext(),n=c.useAvailableUpstreams(r),o=[se()].filter(Boolean),i=n.map(l=>{var u;const p=t.instructions.get(l.type);return(u=p==null?void 0:p.useInitializers)==null?void 0:u.call(p,l)}).filter(Boolean);return[...o,...i.length?[{name:"nodes",type:"subMenu",title:'{{t("Node result", { ns: "workflow" })}}',children:i}]:[]].filter(Boolean)}},{type:"itemGroup",name:"form",title:'{{t("Form")}}',useChildren(){const r=e.useDataSourceManager().getAllCollections();return Array.from(O.getValues()).map(n=>{const{useInitializer:o}=n.config;return o({allCollections:r})})}},{type:"itemGroup",name:"otherBlocks",title:'{{t("Other blocks")}}',children:[{name:"markdown",title:'{{t("Markdown")}}',Component:"MarkdownBlockInitializer"}]}]}),ke=new e.CompatibleSchemaInitializer({name:"workflowManual:popup:configureUserInterface:addBlock",wrap:e.gridRowColWrap,title:'{{t("Add block")}}',items:[{type:"itemGroup",name:"dataBlocks",title:'{{t("Data blocks")}}',hideIfNoChildren:!0,useChildren(){const t=e.usePlugin(c),r=c.useNodeContext(),n=c.useAvailableUpstreams(r),o=[se()].filter(Boolean),i=n.map(l=>{var u;const p=t.instructions.get(l.type);return(u=p==null?void 0:p.useInitializers)==null?void 0:u.call(p,l)}).filter(Boolean);return[...o,...i.length?[{name:"nodes",type:"subMenu",title:`{{t("Node result", { ns: "${g}" })}}`,children:i}]:[]].filter(Boolean)}},{type:"itemGroup",name:"form",title:'{{t("Form")}}',useChildren(){const r=e.useDataSourceManager().getAllCollections();return Array.from(O.getValues()).map(n=>{const{useInitializer:o}=n.config;return o({allCollections:r})})}},{type:"itemGroup",name:"otherBlocks",title:'{{t("Other blocks")}}',children:[{name:"markdown",title:'{{t("Markdown")}}',Component:"MarkdownBlockInitializer"}]}]},ie);function we(){var T,A,V;const t=h.useContext(e.SchemaComponentContext),{t:r}=N.useTranslation(),{t:n}=Q(),o=b.useFieldSchema(),i=c.useWorkflowVariableOptions(),[a,l]=h.useState(!1),[p,u]=h.useState((V=(A=(T=o==null?void 0:o["x-action-settings"])==null?void 0:T.assignedValues)==null?void 0:A.schema)!=null?V:{type:"void","x-component":"Grid","x-initializer":"assignFieldValuesForm:configureFields",properties:{}}),[m,f]=h.useState(null),{components:d}=e.useSchemaOptionsContext();h.useEffect(()=>{f(new b.Schema({properties:{grid:p}}))},[p]);const C=h.useMemo(()=>{var P,z;const M=(z=(P=o==null?void 0:o["x-action-settings"])==null?void 0:P.assignedValues)==null?void 0:z.values;return K.createForm({initialValues:D.lodash.cloneDeep(M),values:D.lodash.cloneDeep(M)})},[o]),k=e.useFormActiveFields(),v=r("Assign field values");function F(){l(!1)}function I(){o["x-action-settings"]||(o["x-action-settings"]={}),o["x-action-settings"].assignedValues||(o["x-action-settings"].assignedValues={}),o["x-action-settings"].assignedValues.schema=p,o["x-action-settings"].assignedValues.values=C.values,l(!1),setTimeout(()=>{var M;(M=t.refresh)==null||M.call(t)},300)}return s.jsxs(s.Fragment,{children:[s.jsx(e.SchemaSettingsItem,{title:v,onClick:()=>l(!0),children:v}),s.jsx(S.Modal,{width:"50%",title:v,open:a,onCancel:F,footer:s.jsxs(S.Space,{children:[s.jsx(S.Button,{onClick:F,children:n("Cancel")}),s.jsx(S.Button,{type:"primary",onClick:I,children:n("Submit")})]}),children:s.jsx(e.DefaultValueProvider,{isAllowToSetDefaultValue:()=>!1,children:s.jsx(e.VariableScopeProvider,{scope:i,children:s.jsx(e.FormActiveFieldsProvider,{name:"form",getActiveFieldsName:k==null?void 0:k.getActiveFieldsName,children:s.jsx(b.FormProvider,{form:C,children:s.jsxs(_.FormLayout,{layout:"vertical",children:[s.jsx(S.Alert,{message:n("Values preset in this form will override user submitted ones when continue or reject.")}),s.jsx("br",{}),a&&m&&s.jsx(e.SchemaComponentContext.Provider,{value:w(y({},t),{refresh(){u(D.lodash.get(m.toJSON(),"properties.grid"))}}),children:s.jsx(e.SchemaComponent,{schema:m,components:d})})]})})})})})})]})}function Ie(t){return s.jsxs(e.GeneralSchemaDesigner,w(y({},t),{disableInitializer:!0,children:[s.jsx(e.Action.Designer.ButtonEditor,{}),s.jsx(we,{}),s.jsx(e.SchemaSettingsDivider,{}),s.jsx(e.SchemaSettingsRemove,{removeParentsIfNoChildren:!0,breakRemoveOn:{"x-component":"ActionBar"}})]}))}function ae(){const a=e.useSchemaInitializerItem(),{action:r,actionProps:n}=a,o=$(a,["action","actionProps"]),{insert:i}=e.useSchemaInitializer();return s.jsx(e.SchemaInitializerItem,w(y({},o),{onClick:()=>{i({type:"void",title:o.title,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:r},"x-component":"Action","x-component-props":w(y({},n),{useAction:"{{ useSubmit }}"}),"x-designer":"ManualActionDesigner","x-action-settings":{}})}}))}function L(){const t=e.useSchemaInitializerItem(),i=t,{action:r,actionProps:n}=i,o=$(i,["action","actionProps"]);return s.jsx(e.InitializerWithSwitch,w(y({},o),{item:t,schema:{type:"void",title:o.title,"x-decorator":"ManualActionStatusProvider","x-decorator-props":{value:r},"x-component":"Action","x-component-props":w(y({},n),{useAction:"{{ useSubmit }}"}),"x-designer":"Action.Designer","x-action":`${r}`},type:"x-action"}))}const ce=new e.CompatibleSchemaInitializer({name:"AddActionButton",title:'{{t("Configure actions")}}',items:[{name:"jobStatusResolved",title:`{{t("Continue the process", { ns: "${g}" })}}`,Component:ae,action:c.JOB_STATUS.RESOLVED,actionProps:{type:"primary"}},{name:"jobStatusRejected",title:`{{t("Terminate the process", { ns: "${g}" })}}`,Component:L,action:c.JOB_STATUS.REJECTED,actionProps:{danger:!0}},{name:"jobStatusPending",title:`{{t("Save temporarily", { ns: "${g}" })}}`,Component:L,action:c.JOB_STATUS.PENDING}]}),Ae=new e.CompatibleSchemaInitializer({name:"workflowManual:form:configureActions",title:'{{t("Configure actions")}}',items:[{name:"jobStatusResolved",title:`{{t("Continue the process", { ns: "${g}" })}}`,Component:ae,action:c.JOB_STATUS.RESOLVED,actionProps:{type:"primary"}},{name:"jobStatusRejected",title:`{{t("Terminate the process", { ns: "${g}" })}}`,Component:L,action:c.JOB_STATUS.REJECTED,actionProps:{danger:!0}},{name:"jobStatusPending",title:`{{t("Save temporarily", { ns: "${g}" })}}`,Component:L,action:c.JOB_STATUS.PENDING}]},ce);function Be(){return{run(){}}}function Te({value:t,onChange:r}){const n=e.usePlugin(c),o=h.useContext(e.SchemaComponentContext),i=c.useNodeContext(),a=c.useAvailableUpstreams(i),l=b.useForm(),{workflow:p}=c.useFlowContext(),u={};a.forEach(d=>{const C=n.instructions.get(d.type);Object.assign(u,C.components)});const m=h.useMemo(()=>new b.Schema({properties:{drawer:{type:"void",title:`{{t("User interface", { ns: "${g}" })}}`,"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:"workflowManual:popup:configureUserInterface:addBlock"},properties:o!=null?o:{tab1:{type:"void",title:`{{t("Manual", { ns: "${g}" })}}`,"x-component":"Tabs.TabPane","x-designer":"Tabs.Designer",properties:{grid:{type:"void","x-component":"Grid","x-initializer":"workflowManual:popup:configureUserInterface:addBlock",properties:{}}}}}}}}}}),[]),m=h.useCallback(function(){const{tabs:x}=D.lodash.get(f.toJSON(),"properties.drawer.properties"),k=Array.from(O.getValues()).reduce((v,F)=>Object.assign(v,F.config.parseFormOptions(x)),{});p.setValuesIn("forms",k),r(x.properties)},[p,r,f]);return s.jsx(e.SchemaComponentContext.Provider,{value:w(y({},t),{designable:!u.executed,refresh:m}),children:s.jsx(e.SchemaComponent,{schema:f,components:w(y(y({},d),Array.from(O.getValues()).reduce((l,x)=>Object.assign(l,x.config.components),{})),{FormBlockProvider:X,DetailsBlockProvider:c.DetailsBlockProvider,ManualActionStatusProvider(l){return l.children},ActionBarProvider(l){return l.children},SimpleDesigner:c.SimpleDesigner,ManualActionDesigner:Ie}),scope:{useSubmit:Be,useDetailsBlockProps:e.useFormBlockContext}})})}function ze(o){const{workflow:r}=c.useFlowContext(),[n,t]=h.useState(!1);return s.jsxs(s.Fragment,{children:[s.jsx(S.Button,{type:"primary",onClick:()=>t(!0),disabled:!1,children:A(r.executed?"View user interface":"Configure user interface")}),s.jsx(e.ActionContextProvider,{value:{visible:n,setVisible:t,formValueChanged:!1},children:o.children})]})}function Me({value:o,onChange:r}){const n=s.jsx("fieldset",{children:s.jsx(_.FormLayout,{layout:"vertical",children:s.jsx(e.FormItem,{label:A("Negotiation"),children:s.jsxs(S.Radio.Group,{value:o,onChange:r,children:[s.jsx(S.Radio,{value:1,children:s.jsxs(S.Tooltip,{title:A("Everyone should pass"),placement:"bottom",children:[s.jsx("span",{children:A("All pass")}),s.jsx(q.QuestionCircleOutlined,{style:{color:"#999"}})]})}),s.jsx(S.Radio,{value:-1,children:s.jsxs(S.Tooltip,{title:A("Anyone pass"),placement:"bottom",children:[s.jsx("span",{children:A("Any pass")}),s.jsx(q.QuestionCircleOutlined,{style:{color:"#999"}})]})})]})})})});return s.jsxs("fieldset",{className:e.css`
5
+ `},properties:{tabs:{type:"void","x-component":"Tabs","x-component-props":{},"x-initializer":"popup:addTab","x-initializer-props":{gridInitializer:"workflowManual:popup:configureUserInterface:addBlock"},properties:t!=null?t:{tab1:{type:"void",title:`{{t("Manual", { ns: "${g}" })}}`,"x-component":"Tabs.TabPane","x-designer":"Tabs.Designer",properties:{grid:{type:"void","x-component":"Grid","x-initializer":"workflowManual:popup:configureUserInterface:addBlock",properties:{}}}}}}}}}}),[]),f=h.useCallback(function(){const{tabs:C}=D.lodash.get(m.toJSON(),"properties.drawer.properties"),k=Array.from(O.getValues()).reduce((v,F)=>Object.assign(v,F.config.parseFormOptions(C)),{});l.setValuesIn("forms",k),r(C.properties)},[l,r,m]);return s.jsx(e.SchemaComponentContext.Provider,{value:w(y({},o),{designable:!p.executed,refresh:f}),children:s.jsx(e.SchemaComponent,{schema:m,components:w(y(y({},u),Array.from(O.getValues()).reduce((d,C)=>Object.assign(d,C.config.components),{})),{FormBlockProvider:Z,DetailsBlockProvider:c.DetailsBlockProvider,ManualActionStatusProvider(d){return d.children},ActionBarProvider(d){return d.children},SimpleDesigner:c.SimpleDesigner,ManualActionDesigner:Ie}),scope:{useSubmit:Be,useDetailsBlockProps:e.useFormBlockContext}})})}function Me(t={}){for(const r of Object.values(t)){const n=O.get(r.type);if(typeof n.validate=="function"){const o=n.validate(r);if(o)return o}}}function ze(t){const{workflow:r}=c.useFlowContext(),[n,o]=h.useState(!1),{values:i}=b.useForm(),{t:a}=Q(),l=h.useCallback(p=>{if(!p){const u=Me(i.forms);if(u){S.message.error({title:a("Validation failed"),content:a(u)});return}}o(p)},[i.forms]);return s.jsxs(s.Fragment,{children:[s.jsx(S.Button,{type:"primary",onClick:()=>o(!0),disabled:!1,children:a(r.executed?"View user interface":"Configure user interface")}),s.jsx(e.ActionContextProvider,{value:{visible:n,setVisible:l,formValueChanged:!1},children:t.children})]})}function De({value:t,onChange:r}){const n=s.jsx("fieldset",{children:s.jsx(_.FormLayout,{layout:"vertical",children:s.jsx(e.FormItem,{label:B("Negotiation"),children:s.jsxs(S.Radio.Group,{value:t,onChange:r,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(q.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(q.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),r(Number(t))},children:[s.jsx(S.Radio,{value:!0,children:s.jsxs(S.Tooltip,{title:A("Each user has own task"),placement:"bottom",children:[s.jsx("span",{children:A("Separately")}),s.jsx(q.QuestionCircleOutlined,{style:{color:"#999"}})]})}),s.jsx(S.Radio,{value:!1,children:s.jsxs(S.Tooltip,{title:A("Everyone shares one task"),placement:"bottom",children:[s.jsx("span",{children:A("Collaboratively")}),s.jsx(q.QuestionCircleOutlined,{style:{color:"#999"}})]})})]})}),o?n:null]})}function De(o){return o.isForeignKey?o.target==="users":o.collectionName==="users"&&o.name==="id"}function Oe({multiple:o=!1,value:r=[],onChange:n}){const t=c.useWorkflowVariableOptions({types:[De]});return s.jsx(e.Variable.Input,{scope:t,value:r[0],onChange:i=>{n([i])},children:s.jsx(e.RemoteSelect,{fieldNames:{label:"nickname",value:"id"},service:{resource:"users"},manual:!1,value:r[0],onChange:i=>{n(i!=null?[i]:[])}})})}class Pe extends c.Instruction{constructor(){super(...arguments);E(this,"title",`{{t("Manual", { ns: "${g}" })}}`);E(this,"type","manual");E(this,"group","manual");E(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: "${g}" })}}`);E(this,"fieldset",{assignees:{type:"array",title:`{{t("Assignees", { ns: "${g}" })}}`,"x-decorator":"FormItem","x-component":"AssigneesSelect","x-component-props":{},required:!0,default:[]},mode:{type:"number",title:`{{t("Mode", { ns: "${g}" })}}`,"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: "${g}" })}}`,"x-decorator":"FormItem","x-component":"SchemaConfigButton",properties:{schema:{type:"object","x-component":"SchemaConfig",default:null}}},forms:{type:"object",default:{}}});E(this,"components",{SchemaConfigButton:ze,SchemaConfig:Te,ModeConfig:Me,AssigneesSelect:Oe})}useVariables({key:n,title:t,config:i},{types:a,fieldNames:p=c.defaultFieldNames}){var l;const u=e.useCompile(),{getCollectionFields:d}=e.useCollectionManager_deprecated(),f=Object.keys((l=i.forms)!=null?l:{});if(!f.length)return null;const m=f.map(x=>{var I;const k=i.forms[x],v=c.getCollectionFieldOptions({fields:(I=k.collection)==null?void 0:I.fields,collection:k.collection,types:a,compile:u,getCollectionFields:d}),F=u(k.title)||x;return v.length?{key:x,value:x,label:F,title:F,children:v}:null}).filter(Boolean);return m.length?{[p.value]:n,[p.label]:t,[p.children]:m}:null}useInitializers(n){var p;const{getCollection:t}=e.useCollectionManager_deprecated(),i=Object.keys((p=n.config.forms)!=null?p:{});if(!i.length||n.config.mode)return null;const a=i.map(u=>{var m,l;const d=n.config.forms[u],{fields:f=[]}=t(d.collection);return f.length?{name:(m=d.title)!=null?m:u,type:"item",title:(l=d.title)!=null?l:u,Component:c.CollectionBlockInitializer,collection:d.collection,dataPath:`$jobsMapByNodeKey.${n.key}.${u}`}:null}).filter(Boolean);return a.length?{name:`#${n.id}`,key:"forms",type:"subMenu",title:n.title,children:a}:null}isAvailable({engine:n,workflow:t,upstream:i,branchIndex:a}){return!n.isWorkflowSync(t)}}const Ve={title:`{{t("Task", { ns: "${g}" })}}`,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"}}]},je={title:`{{t("Workflow", { ns: "${g}" })}}`,name:"workflows",fields:[{type:"string",name:"title",interface:"input",uiSchema:{title:'{{t("Name")}}',type:"string","x-component":"Input",required:!0}}]},Ne={title:`{{t("Workflow todos", { ns: "${g}" })}}`,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: "${g}" })}}`,"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: "${g}" })}}`,"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: "${g}" })}}`,"x-component":"Select",enum:c.JobStatusOptions}},{name:"createdAt",type:"date",interface:"createdAt",uiSchema:{type:"datetime",title:'{{t("Created at")}}',"x-component":"DatePicker","x-component-props":{showTime:!0}}}]},$e=b.observer(()=>{var r,n,t;const o=b.useField();return(t=(r=o==null?void 0:o.value)==null?void 0:r.title)!=null?t:`#${(n=o.value)==null?void 0:n.id}`},{displayName:"NodeColumn"}),Ee=b.observer(()=>{var r,n,t;const o=b.useField();return(t=(r=o==null?void 0:o.value)==null?void 0:r.title)!=null?t:`#${(n=o.value)==null?void 0:n.id}`},{displayName:"WorkflowColumn"}),Ue=b.observer(()=>{var r,n,t;const o=b.useField();return(t=(r=o==null?void 0:o.value)==null?void 0:r.nickname)!=null?t:(n=o.value)==null?void 0:n.id},{displayName:"UserColumn"});function _e(o){const r=e.useRecord(),n=A("Unprocessed");return r.execution.status&&!r.status?s.jsx(S.Tag,{children:n}):o.children}const Q=()=>s.jsx(e.SchemaComponent,{components:{NodeColumn:$e,WorkflowColumn:Ee,UserColumn:Ue,UserJobStatusColumn:_e},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: "${g}" })}}`,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: "${g}" })}}`,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 Ke(o){var f;const{data:r}=e.useCurrentUserContext(),{userJob:n}=c.useFlowContext(),{status:t,result:i,userId:a}=n,p=b.useFieldSchema(),{name:u}=p.parent.toJSON();let{children:d}=o;return t?i[u]||(d=null):((f=r==null?void 0:r.data)==null?void 0:f.id)!==a&&(d=null),d}const ce=h.createContext(null);ce.displayName="ManualActionStatusContext";function Je({value:o,children:r}){const{userJob:n,execution:t}=c.useFlowContext(),i=b.useField(),a=b.useFieldSchema();return h.useEffect(()=>{(t.status||n.status)&&(i.disabled=!0,i.visible=n.status===o&&n.result._===a.name)},[t,n,o,i,a.name]),s.jsx(ce.Provider,{value:o,children:r})}function qe(){const o=e.useAPIClient(),{setVisible:r}=e.useActionContext(),{values:n,submit:t}=b.useForm(),i=b.useFieldSchema(),{service:a}=e.useTableBlockContext(),{userJob:p,execution:u}=c.useFlowContext(),{name:d}=i,{name:f}=i.parent.parent;return{run(){return U(this,null,function*(){u.status||p.status||(yield t(),yield o.resource("users_jobs").submit({filterByTk:p.id,values:{result:{[f]:n,_:d}}}),r(!1),a.refresh())})}}}function Ge(o){var m;const r=e.usePlugin(c),n=e.useAPIClient(),{id:t}=e.useRecord(),[i,a]=h.useState(null),[p,u]=h.useState(null);h.useEffect(()=>{var l,x;t&&((x=(l=n.resource("users_jobs")).get)==null||x.call(l,{filterByTk:t,appends:["node","job","workflow","workflow.nodes","execution","execution.jobs"]}).then(({data:k})=>{var B;const V=(B=k==null?void 0:k.data)!=null?B:{},{node:v,workflow:M={}}=V,j=M,{nodes:F=[]}=j,I=$(j,["nodes"]),G=V,{execution:z}=G,T=$(G,["node","workflow","execution"]);c.linkNodes(F),u(v),a({userJob:T,workflow:I,nodes:F,execution:z})}))},[n,t]);const f=c.useAvailableUpstreams(i==null?void 0:i.nodes.find(l=>l.id===p.id)).reduce((l,{type:x})=>Object.assign(l,r.instructions.get(x).components),{});return p&&i?s.jsx(c.FlowContext.Provider,{value:i,children:s.jsx(e.SchemaComponent,{components:y(y({FormBlockProvider:X,DetailsBlockProvider:c.DetailsBlockProvider,ActionBarProvider:Ke,ManualActionStatusProvider:Je},Array.from(O.getValues()).reduce((l,x)=>Object.assign(l,x.block.components),{})),f),scope:y({useSubmit:qe,useFormBlockProps:Le,useDetailsBlockProps:Ye},Array.from(O.getValues()).reduce((l,x)=>Object.assign(l,x.block.scope),{})),schema:{type:"void",name:"tabs","x-component":"Tabs",properties:(m=p.config)==null?void 0:m.schema}})}):s.jsx(S.Spin,{})}function Le(){var p;const{userJob:o,execution:r}=c.useFlowContext(),n=e.useRecord(),{data:t}=e.useCurrentUserContext(),{form:i}=e.useFormBlockContext(),a=r.status||o.status?n?"readPretty":"disabled":((p=t==null?void 0:t.data)==null?void 0:p.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:r,updatedAt:n}=e.useRecord(),t=c.JobStatusOptionsMap[r];return r?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:!!t,onChange:({target:{value:o}})=>{console.log(o),r(Number(o))},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(q.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(q.QuestionCircleOutlined,{style:{color:"#999"}})]})})]})}),t?n:null]})}function Oe(t){return t.isForeignKey?t.target==="users":t.collectionName==="users"&&t.name==="id"}function Ve({multiple:t=!1,value:r=[],onChange:n}){const o=c.useWorkflowVariableOptions({types:[Oe]});return s.jsx(e.Variable.Input,{scope:o,value:r[0],onChange:i=>{n([i])},children:s.jsx(e.RemoteSelect,{fieldNames:{label:"nickname",value:"id"},service:{resource:"users"},manual:!1,value:r[0],onChange:i=>{n(i!=null?[i]:[])}})})}class Pe extends c.Instruction{constructor(){super(...arguments);E(this,"title",`{{t("Manual", { ns: "${g}" })}}`);E(this,"type","manual");E(this,"group","manual");E(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: "${g}" })}}`);E(this,"fieldset",{assignees:{type:"array",title:`{{t("Assignees", { ns: "${g}" })}}`,"x-decorator":"FormItem","x-component":"AssigneesSelect","x-component-props":{},required:!0,default:[]},mode:{type:"number",title:`{{t("Mode", { ns: "${g}" })}}`,"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: "${g}" })}}`,"x-decorator":"FormItem","x-component":"SchemaConfigButton",properties:{schema:{type:"object","x-component":"SchemaConfig",default:null}}},forms:{type:"object",default:{}}});E(this,"components",{SchemaConfigButton:ze,SchemaConfig:Te,ModeConfig:De,AssigneesSelect:Ve})}useVariables({key:n,title:o,config:i},{types:a,fieldNames:l=c.defaultFieldNames}){var d;const p=e.useCompile(),{getCollectionFields:u}=e.useCollectionManager_deprecated(),m=Object.keys((d=i.forms)!=null?d:{});if(!m.length)return null;const f=m.map(C=>{var I;const k=i.forms[C],v=c.getCollectionFieldOptions({fields:(I=k.collection)==null?void 0:I.fields,collection:k.collection,types:a,compile:p,getCollectionFields:u}),F=p(k.title)||C;return v.length?{key:C,value:C,label:F,title:F,children:v}:null}).filter(Boolean);return f.length?{[l.value]:n,[l.label]:o,[l.children]:f}:null}useInitializers(n){var l;const{getCollection:o}=e.useCollectionManager_deprecated(),i=Object.keys((l=n.config.forms)!=null?l:{});if(!i.length||n.config.mode)return null;const a=i.map(p=>{var f,d;const u=n.config.forms[p],{fields:m=[]}=o(u.collection);return m.length?{name:(f=u.title)!=null?f:p,type:"item",title:(d=u.title)!=null?d:p,Component:c.CollectionBlockInitializer,collection:u.collection,dataPath:`$jobsMapByNodeKey.${n.key}.${p}`}:null}).filter(Boolean);return a.length?{name:`#${n.id}`,key:"forms",type:"subMenu",title:n.title,children:a}:null}isAvailable({engine:n,workflow:o,upstream:i,branchIndex:a}){return!n.isWorkflowSync(o)}}const je={title:`{{t("Task", { ns: "${g}" })}}`,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"}}]},Ne={title:`{{t("Workflow", { ns: "${g}" })}}`,name:"workflows",fields:[{type:"string",name:"title",interface:"input",uiSchema:{title:'{{t("Name")}}',type:"string","x-component":"Input",required:!0}}]},$e={title:`{{t("Workflow todos", { ns: "${g}" })}}`,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: "${g}" })}}`,"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: "${g}" })}}`,"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: "${g}" })}}`,"x-component":"Select",enum:c.JobStatusOptions}},{name:"createdAt",type:"date",interface:"createdAt",uiSchema:{type:"datetime",title:'{{t("Created at")}}',"x-component":"DatePicker","x-component-props":{showTime:!0}}}]},Ee=b.observer(()=>{var r,n,o;const t=b.useField();return(o=(r=t==null?void 0:t.value)==null?void 0:r.title)!=null?o:`#${(n=t.value)==null?void 0:n.id}`},{displayName:"NodeColumn"}),Ue=b.observer(()=>{var r,n,o;const t=b.useField();return(o=(r=t==null?void 0:t.value)==null?void 0:r.title)!=null?o:`#${(n=t.value)==null?void 0:n.id}`},{displayName:"WorkflowColumn"}),_e=b.observer(()=>{var r,n,o;const t=b.useField();return(o=(r=t==null?void 0:t.value)==null?void 0:r.nickname)!=null?o:(n=t.value)==null?void 0:n.id},{displayName:"UserColumn"});function Ke(t){const r=e.useRecord(),n=B("Unprocessed");return r.execution.status&&!r.status?s.jsx(S.Tag,{children:n}):t.children}const H=()=>s.jsx(e.SchemaComponent,{components:{NodeColumn:Ee,WorkflowColumn:Ue,UserColumn:_e,UserJobStatusColumn:Ke},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-use-component-props":"useFilterActionProps","x-component-props":{icon:"FilterOutlined"},"x-align":"left"},refresher:{type:"void",title:'{{ t("Refresh") }}',"x-action":"refresh","x-component":"Action","x-use-component-props":"useRefreshActionProps","x-toolbar":"ActionSchemaToolbar","x-settings":"actionSettings:refresh","x-component-props":{icon:"ReloadOutlined"},"x-align":"right"}}},table:{type:"array","x-component":"TableV2","x-use-component-props":"useTableBlockProps","x-component-props":{rowKey:"id"},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: "${g}" })}}`,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: "${g}" })}}`,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 Je(t){var m;const{data:r}=e.useCurrentUserContext(),{userJob:n}=c.useFlowContext(),{status:o,result:i,userId:a}=n,l=b.useFieldSchema(),{name:p}=l.parent.toJSON();let{children:u}=t;return o?i[p]||(u=null):((m=r==null?void 0:r.data)==null?void 0:m.id)!==a&&(u=null),u}const le=h.createContext(null);le.displayName="ManualActionStatusContext";function qe({value:t,children:r}){const{userJob:n,execution:o}=c.useFlowContext(),i=b.useField(),a=b.useFieldSchema();return h.useEffect(()=>{(o.status||n.status)&&(i.disabled=!0,i.visible=n.status===t&&n.result._===a.name)},[o,n,t,i,a.name]),s.jsx(le.Provider,{value:t,children:r})}function Ge(){const t=e.useAPIClient(),{setVisible:r}=e.useActionContext(),{values:n,submit:o}=b.useForm(),i=b.useFieldSchema(),{service:a}=e.useTableBlockContext(),{userJob:l,execution:p}=c.useFlowContext(),{name:u}=i,{name:m}=i.parent.parent;return{run(){return U(this,null,function*(){p.status||l.status||(yield o(),yield t.resource("users_jobs").submit({filterByTk:l.id,values:{result:{[m]:n,_:u}}}),r(!1),a.refresh())})}}}function Le(t){var f;const r=e.usePlugin(c),n=e.useAPIClient(),{id:o}=e.useRecord(),[i,a]=h.useState(null),[l,p]=h.useState(null);h.useEffect(()=>{var d,C;o&&((C=(d=n.resource("users_jobs")).get)==null||C.call(d,{filterByTk:o,appends:["node","job","workflow","workflow.nodes","execution","execution.jobs"]}).then(({data:k})=>{var V;const M=(V=k==null?void 0:k.data)!=null?V:{},{node:v,workflow:P={}}=M,z=P,{nodes:F=[]}=z,I=$(z,["nodes"]),G=M,{execution:T}=G,A=$(G,["node","workflow","execution"]);c.linkNodes(F),p(v),a({userJob:A,workflow:I,nodes:F,execution:T})}))},[n,o]);const m=c.useAvailableUpstreams(i==null?void 0:i.nodes.find(d=>d.id===l.id)).reduce((d,{type:C})=>Object.assign(d,r.instructions.get(C).components),{});return l&&i?s.jsx(c.FlowContext.Provider,{value:i,children:s.jsx(e.SchemaComponent,{components:y(y({FormBlockProvider:Z,DetailsBlockProvider:c.DetailsBlockProvider,ActionBarProvider:Je,ManualActionStatusProvider:qe},Array.from(O.getValues()).reduce((d,C)=>Object.assign(d,C.block.components),{})),m),scope:y({useSubmit:Ge,useFormBlockProps:Ye,useDetailsBlockProps:Qe},Array.from(O.getValues()).reduce((d,C)=>Object.assign(d,C.block.scope),{})),schema:{type:"void",name:"tabs","x-component":"Tabs",properties:(f=l.config)==null?void 0:f.schema}})}):s.jsx(S.Spin,{})}function Ye(){var l;const{userJob:t,execution:r}=c.useFlowContext(),n=e.useRecord(),{data:o}=e.useCurrentUserContext(),{form:i}=e.useFormBlockContext(),a=r.status||t.status?n?"readPretty":"disabled":((l=o==null?void 0:o.data)==null?void 0:l.id)!==t.userId?"disabled":"editable";return h.useEffect(()=>{i==null||i.setPattern(a)},[a,i]),{form:i}}function Qe(){const{form:t}=e.useFormBlockContext();return{form:t}}function He(){const t=e.useCompile(),{status:r,updatedAt:n}=e.useRecord(),o=c.JobStatusOptionsMap[r];return r?s.jsxs(S.Space,{children:[s.jsx("time",{className:e.css`
12
12
  margin-right: 0.5em;
13
- `,children:de(n).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:r,node:n,workflow:t,status:i}=e.useRecord();return s.jsx(e.SchemaComponentContext.Provider,{value:w(y({},o),{reset(){},designable:!1}),children:s.jsx(e.SchemaComponent,{components:{FooterStatus:Qe,FlowContextProvider:Ge},schema:{type:"void",name:`drawer-${r}-${i}`,"x-component":"Action.Drawer","x-component-props":{className:"nb-action-popup"},title:`${t.title} - ${(a=n.title)!=null?a:`#${n.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:r}){const n={collection:"users_jobs",resource:"users_jobs",action:"list",params:w(y({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:[Ve,je,Ne],children:s.jsx(e.TableBlockProvider,w(y({name:"workflow-todo"},n),{children:r}))})}Q.Drawer=He,Q.Decorator=Xe;const Ze=()=>{const o=e.useSchemaInitializerItem(),{insert:r}=e.useSchemaInitializer();return s.jsx(e.SchemaInitializerItem,w(y({icon:s.jsx(q.TableOutlined,{})},o),{onClick:()=>{r({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 U(this,null,function*(){})}load(){return U(this,null,function*(){this.addComponents(),this.app.pm.get("workflow").registerInstruction("manual",Pe),this.app.schemaInitializerManager.add(se),this.app.schemaInitializerManager.add(ke),this.app.schemaInitializerManager.add(ae),this.app.schemaInitializerManager.add(Ae),this.app.schemaInitializerManager.add(te),this.app.schemaInitializerManager.add(be),this.app.schemaInitializerManager.get("page:addBlock").add("otherBlocks.workflowTodos",{title:`{{t("Workflow todos", { ns: "${g}" })}}`,Component:"WorkflowTodoBlockInitializer",icon:"CheckSquareOutlined"})})}addComponents(){this.app.addComponents({WorkflowTodo:Q,WorkflowTodoBlockInitializer:Ze})}}C.default=We,Object.defineProperties(C,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
13
+ `,children:ue(n).format("YYYY-MM-DD HH:mm:ss")}),s.jsx(S.Tag,{icon:o.icon,color:o.color,children:t(o.label)})]}):null}function Xe(){var a;const t=h.useContext(e.SchemaComponentContext),{id:r,node:n,workflow:o,status:i}=e.useRecord();return s.jsx(e.SchemaComponentContext.Provider,{value:w(y({},t),{reset(){},designable:!1}),children:s.jsx(e.SchemaComponent,{components:{FooterStatus:He,FlowContextProvider:Le},schema:{type:"void",name:`drawer-${r}-${i}`,"x-component":"Action.Drawer","x-component-props":{className:"nb-action-popup"},title:`${o.title} - ${(a=n.title)!=null?a:`#${n.id}`}`,properties:{tabs:{type:"void","x-component":"FlowContextProvider"},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{content:{type:"void","x-component":"FooterStatus"}}}}}})})}function Ze({params:t={},children:r}){const n={collection:"users_jobs",resource:"users_jobs",action:"list",params:w(y({pageSize:20,sort:["-createdAt"]},t),{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:[je,Ne,$e],children:s.jsx(e.TableBlockProvider,w(y({name:"workflow-todo"},n),{children:r}))})}H.Drawer=Xe,H.Decorator=Ze;const We=()=>{const t=e.useSchemaInitializerItem(),{insert:r}=e.useSchemaInitializer();return s.jsx(e.SchemaInitializerItem,w(y({icon:s.jsx(q.TableOutlined,{})},t),{onClick:()=>{r({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 Re extends e.Plugin{afterAdd(){return U(this,null,function*(){})}load(){return U(this,null,function*(){this.addComponents(),this.app.pm.get("workflow").registerInstruction("manual",Pe),this.app.schemaInitializerManager.add(ie),this.app.schemaInitializerManager.add(ke),this.app.schemaInitializerManager.add(ce),this.app.schemaInitializerManager.add(Ae),this.app.schemaInitializerManager.add(ne),this.app.schemaInitializerManager.add(be),this.app.schemaInitializerManager.get("page:addBlock").add("otherBlocks.workflowTodos",{title:`{{t("Workflow todos", { ns: "${g}" })}}`,Component:"WorkflowTodoBlockInitializer",icon:"CheckSquareOutlined"})})}addComponents(){this.app.addComponents({WorkflowTodo:H,WorkflowTodoBlockInitializer:We})}}x.default=Re,Object.defineProperties(x,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
@@ -37,15 +37,18 @@ export type ManualFormType = {
37
37
  [key: string]: React.FC;
38
38
  };
39
39
  };
40
+ validate?: (config: any) => string | null;
40
41
  };
41
42
  export declare const manualFormTypes: any;
42
43
  /**
43
44
  * @deprecated
45
+ * use `addBlockButton` instead
44
46
  */
45
47
  export declare const addBlockButton_deprecated: CompatibleSchemaInitializer;
46
48
  export declare const addBlockButton: CompatibleSchemaInitializer;
47
49
  /**
48
50
  * @deprecated
51
+ * use `addActionButton` instead
49
52
  */
50
53
  export declare const addActionButton_deprecated: CompatibleSchemaInitializer;
51
54
  export declare const addActionButton: CompatibleSchemaInitializer;
@@ -2,6 +2,7 @@ import { CompatibleSchemaInitializer } from '@nocobase/client';
2
2
  import { ManualFormType } from '../SchemaConfig';
3
3
  /**
4
4
  * @deprecated
5
+ * use `addCustomFormField` instead
5
6
  */
6
7
  export declare const addCustomFormField_deprecated: CompatibleSchemaInitializer;
7
8
  export declare const addCustomFormField: CompatibleSchemaInitializer;
@@ -3,18 +3,18 @@ module.exports = {
3
3
  "antd": "5.12.8",
4
4
  "dayjs": "1.11.10",
5
5
  "react": "18.2.0",
6
- "@nocobase/client": "0.21.0-alpha.1",
7
- "@nocobase/plugin-workflow": "0.21.0-alpha.1",
6
+ "@nocobase/client": "0.21.0-alpha.11",
7
+ "@nocobase/plugin-workflow": "0.21.0-alpha.11",
8
8
  "@ant-design/icons": "5.2.6",
9
9
  "react-i18next": "11.18.6",
10
- "@nocobase/utils": "0.21.0-alpha.1",
11
- "@nocobase/server": "0.21.0-alpha.1",
12
- "@nocobase/actions": "0.21.0-alpha.1",
13
- "@nocobase/resourcer": "0.21.0-alpha.1",
14
- "@nocobase/plugin-workflow-test": "0.21.0-alpha.1",
15
- "@nocobase/test": "0.21.0-alpha.1",
10
+ "@nocobase/utils": "0.21.0-alpha.11",
11
+ "@nocobase/server": "0.21.0-alpha.11",
12
+ "@nocobase/actions": "0.21.0-alpha.11",
13
+ "@nocobase/resourcer": "0.21.0-alpha.11",
14
+ "@nocobase/plugin-workflow-test": "0.21.0-alpha.11",
15
+ "@nocobase/test": "0.21.0-alpha.11",
16
16
  "@formily/core": "2.3.0",
17
17
  "@formily/antd-v5": "1.1.9",
18
- "@nocobase/database": "0.21.0-alpha.1",
18
+ "@nocobase/database": "0.21.0-alpha.11",
19
19
  "lodash": "4.17.21"
20
20
  };
@@ -1,3 +1,4 @@
1
1
  export declare const NAMESPACE = "workflow-manual";
2
2
  export declare function useLang(key: string, options?: {}): string;
3
- export declare function usePluginTranslation(options: any): import("react-i18next").UseTranslationResponse<"workflow-manual", undefined>;
3
+ export declare const lang: typeof useLang;
4
+ export declare function usePluginTranslation(options?: any): import("react-i18next").UseTranslationResponse<"workflow-manual", undefined>;
@@ -18,6 +18,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
18
18
  var locale_exports = {};
19
19
  __export(locale_exports, {
20
20
  NAMESPACE: () => NAMESPACE,
21
+ lang: () => lang,
21
22
  useLang: () => useLang,
22
23
  usePluginTranslation: () => usePluginTranslation
23
24
  });
@@ -28,12 +29,14 @@ function useLang(key, options = {}) {
28
29
  const { t } = usePluginTranslation(options);
29
30
  return t(key);
30
31
  }
32
+ const lang = useLang;
31
33
  function usePluginTranslation(options) {
32
34
  return (0, import_react_i18next.useTranslation)(NAMESPACE, options);
33
35
  }
34
36
  // Annotate the CommonJS export names for ESM import in node:
35
37
  0 && (module.exports = {
36
38
  NAMESPACE,
39
+ lang,
37
40
  useLang,
38
41
  usePluginTranslation
39
42
  });
@@ -27,5 +27,6 @@
27
27
  "Filter settings": "筛选设置",
28
28
  "Workflow todos": "工作流待办",
29
29
  "Task node": "任务节点",
30
- "Unprocessed": "未处理"
30
+ "Unprocessed": "未处理",
31
+ "Please check one of your update record form, and add at least one filter condition in form settings.": "请检查您的其中的更新数据表单,并在表单设置中至少添加一个筛选条件。"
31
32
  }
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.21.0-alpha.1",
7
+ "version": "0.21.0-alpha.11",
8
8
  "license": "AGPL-3.0",
9
9
  "main": "./dist/server/index.js",
10
10
  "homepage": "https://docs.nocobase.com/handbook/workflow-manual",
@@ -30,7 +30,7 @@
30
30
  "@nocobase/test": "0.x",
31
31
  "@nocobase/utils": "0.x"
32
32
  },
33
- "gitHead": "afd2f3d1341b85ea9daa7b2667dd4ace1fafb7ff",
33
+ "gitHead": "69fe8a6d75864a3ba98c5a6d3ebfe43a585d4cd3",
34
34
  "keywords": [
35
35
  "Workflow"
36
36
  ]
@@ -245,9 +245,9 @@ export const WorkflowTodo: React.FC & { Drawer: React.FC; Decorator: React.FC }
245
245
  'x-action': 'filter',
246
246
  'x-designer': 'Filter.Action.Designer',
247
247
  'x-component': 'Filter.Action',
248
+ 'x-use-component-props': 'useFilterActionProps',
248
249
  'x-component-props': {
249
250
  icon: 'FilterOutlined',
250
- useProps: '{{ useFilterActionProps }}',
251
251
  },
252
252
  'x-align': 'left',
253
253
  },
@@ -256,12 +256,12 @@ export const WorkflowTodo: React.FC & { Drawer: React.FC; Decorator: React.FC }
256
256
  title: '{{ t("Refresh") }}',
257
257
  'x-action': 'refresh',
258
258
  'x-component': 'Action',
259
+ 'x-use-component-props': 'useRefreshActionProps',
259
260
  // 'x-designer': 'Action.Designer',
260
261
  'x-toolbar': 'ActionSchemaToolbar',
261
262
  'x-settings': 'actionSettings:refresh',
262
263
  'x-component-props': {
263
264
  icon: 'ReloadOutlined',
264
- useProps: '{{ useRefreshActionProps }}',
265
265
  },
266
266
  'x-align': 'right',
267
267
  },
@@ -270,9 +270,9 @@ export const WorkflowTodo: React.FC & { Drawer: React.FC; Decorator: React.FC }
270
270
  table: {
271
271
  type: 'array',
272
272
  'x-component': 'TableV2',
273
+ 'x-use-component-props': 'useTableBlockProps',
273
274
  'x-component-props': {
274
275
  rowKey: 'id',
275
- useProps: '{{ useTableBlockProps }}',
276
276
  },
277
277
  properties: {
278
278
  actions: {
@@ -703,7 +703,7 @@ test.describe('field data entry', () => {
703
703
 
704
704
  const manualNodeJobResult = manualNodeJob.result;
705
705
  const hasPhone = Object.values(manualNodeJobResult).some(
706
- (value) => (value as { staffnum: number }).staffnum === manualNodeRecord,
706
+ (value) => (value as { staffnum: number }).staffnum == manualNodeRecord,
707
707
  );
708
708
  expect(hasPhone).toBe(true);
709
709
 
@@ -842,7 +842,7 @@ test.describe('field data entry', () => {
842
842
 
843
843
  const manualNodeJobResult = manualNodeJob.result;
844
844
  const hasRegcapital = Object.values(manualNodeJobResult).some(
845
- (value) => (value as { regcapital: number }).regcapital === manualNodeRecord,
845
+ (value) => (value as { regcapital: number }).regcapital == manualNodeRecord,
846
846
  );
847
847
  expect(hasRegcapital).toBe(true);
848
848
 
@@ -719,13 +719,13 @@ test.describe('field data entry', () => {
719
719
  return b.id - a.id;
720
720
  });
721
721
  const jobs = getWorkflowNodeExecutionsObj[0].jobs;
722
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
722
+ const manualNodeJob = jobs.find((job) => job.nodeId.toString() == manualNodeId);
723
723
  const manualNodeJobStatus = manualNodeJob.status;
724
724
  expect(manualNodeJobStatus).toBe(1);
725
725
 
726
726
  const manualNodeJobResult = manualNodeJob.result;
727
727
  const hasStaffnum = Object.values(manualNodeJobResult).some(
728
- (value) => (value as { staffnum: number }).staffnum === manualNodeRecord,
728
+ (value) => (value as { staffnum: number }).staffnum == manualNodeRecord,
729
729
  );
730
730
  expect(hasStaffnum).toBe(true);
731
731
 
@@ -862,13 +862,13 @@ test.describe('field data entry', () => {
862
862
  return b.id - a.id;
863
863
  });
864
864
  const jobs = getWorkflowNodeExecutionsObj[0].jobs;
865
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
865
+ const manualNodeJob = jobs.find((job) => job.nodeId.toString() == manualNodeId);
866
866
  const manualNodeJobStatus = manualNodeJob.status;
867
867
  expect(manualNodeJobStatus).toBe(1);
868
868
 
869
869
  const manualNodeJobResult = manualNodeJob.result;
870
870
  const hasRegcapital = Object.values(manualNodeJobResult).some(
871
- (value) => (value as { regcapital: number }).regcapital === manualNodeRecord,
871
+ (value) => (value as { regcapital: number }).regcapital == manualNodeRecord,
872
872
  );
873
873
  expect(hasRegcapital).toBe(true);
874
874
 
@@ -1101,6 +1101,19 @@ test.describe('field data', () => {
1101
1101
  await preManualNodePom.updateRecordFormMenu.hover();
1102
1102
  await page.getByRole('menuitem', { name: preManualNodeCollectionDisplayName }).click();
1103
1103
  await page.mouse.move(300, 0, { steps: 100 });
1104
+ await page
1105
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${preManualNodeCollectionName}"]`)
1106
+ .hover();
1107
+ await page
1108
+ .getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${preManualNodeCollectionName}`)
1109
+ .click();
1110
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
1111
+ await page.getByText('Add condition', { exact: true }).click();
1112
+ await page.getByTestId('select-filter-field').click();
1113
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
1114
+ await page.getByTestId('select-filter-operator').click();
1115
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
1116
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
1104
1117
  await page
1105
1118
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${preManualNodeCollectionName}"]`)
1106
1119
  .hover();
@@ -104,6 +104,17 @@ test.describe('field data update', () => {
104
104
  }
105
105
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
106
106
  await page.mouse.move(300, 0, { steps: 100 });
107
+ await page
108
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
109
+ .hover();
110
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
111
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
112
+ await page.getByText('Add condition', { exact: true }).click();
113
+ await page.getByTestId('select-filter-field').click();
114
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
115
+ await page.getByTestId('select-filter-operator').click();
116
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
117
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
107
118
  await page
108
119
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
109
120
  .hover();
@@ -260,6 +271,17 @@ test.describe('field data update', () => {
260
271
  }
261
272
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
262
273
  await page.mouse.move(300, 0, { steps: 100 });
274
+ await page
275
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
276
+ .hover();
277
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
278
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
279
+ await page.getByText('Add condition', { exact: true }).click();
280
+ await page.getByTestId('select-filter-field').click();
281
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
282
+ await page.getByTestId('select-filter-operator').click();
283
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
284
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
263
285
  await page
264
286
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
265
287
  .hover();
@@ -416,6 +438,17 @@ test.describe('field data update', () => {
416
438
  }
417
439
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
418
440
  await page.mouse.move(300, 0, { steps: 100 });
441
+ await page
442
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
443
+ .hover();
444
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
445
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
446
+ await page.getByText('Add condition', { exact: true }).click();
447
+ await page.getByTestId('select-filter-field').click();
448
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
449
+ await page.getByTestId('select-filter-operator').click();
450
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
451
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
419
452
  await page
420
453
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
421
454
  .hover();
@@ -572,6 +605,17 @@ test.describe('field data update', () => {
572
605
  }
573
606
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
574
607
  await page.mouse.move(300, 0, { steps: 100 });
608
+ await page
609
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
610
+ .hover();
611
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
612
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
613
+ await page.getByText('Add condition', { exact: true }).click();
614
+ await page.getByTestId('select-filter-field').click();
615
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
616
+ await page.getByTestId('select-filter-operator').click();
617
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
618
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
575
619
  await page
576
620
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
577
621
  .hover();
@@ -728,6 +772,17 @@ test.describe('field data update', () => {
728
772
  }
729
773
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
730
774
  await page.mouse.move(300, 0, { steps: 100 });
775
+ await page
776
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
777
+ .hover();
778
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
779
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
780
+ await page.getByText('Add condition', { exact: true }).click();
781
+ await page.getByTestId('select-filter-field').click();
782
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
783
+ await page.getByTestId('select-filter-operator').click();
784
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
785
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
731
786
  await page
732
787
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
733
788
  .hover();
@@ -781,13 +836,13 @@ test.describe('field data update', () => {
781
836
  return b.id - a.id;
782
837
  });
783
838
  const jobs = getWorkflowNodeExecutionsObj[0].jobs;
784
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
839
+ const manualNodeJob = jobs.find((job) => job.nodeId.toString() == manualNodeId);
785
840
  const manualNodeJobStatus = manualNodeJob.status;
786
841
  expect(manualNodeJobStatus).toBe(1);
787
842
 
788
843
  const manualNodeJobResult = manualNodeJob.result;
789
844
  const hasStaffnum = Object.values(manualNodeJobResult).some(
790
- (value) => (value as { staffnum: number }).staffnum === manualNodeRecord,
845
+ (value) => (value as { staffnum: number }).staffnum == manualNodeRecord,
791
846
  );
792
847
  expect(hasStaffnum).toBe(true);
793
848
 
@@ -884,6 +939,17 @@ test.describe('field data update', () => {
884
939
  }
885
940
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
886
941
  await page.mouse.move(300, 0, { steps: 100 });
942
+ await page
943
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
944
+ .hover();
945
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
946
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
947
+ await page.getByText('Add condition', { exact: true }).click();
948
+ await page.getByTestId('select-filter-field').click();
949
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
950
+ await page.getByTestId('select-filter-operator').click();
951
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
952
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
887
953
  await page
888
954
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
889
955
  .hover();
@@ -937,13 +1003,13 @@ test.describe('field data update', () => {
937
1003
  return b.id - a.id;
938
1004
  });
939
1005
  const jobs = getWorkflowNodeExecutionsObj[0].jobs;
940
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
1006
+ const manualNodeJob = jobs.find((job) => job.nodeId.toString() == manualNodeId);
941
1007
  const manualNodeJobStatus = manualNodeJob.status;
942
1008
  expect(manualNodeJobStatus).toBe(1);
943
1009
 
944
1010
  const manualNodeJobResult = manualNodeJob.result;
945
1011
  const hasRegcapital = Object.values(manualNodeJobResult).some(
946
- (value) => (value as { regcapital: number }).regcapital === manualNodeRecord,
1012
+ (value) => (value as { regcapital: number }).regcapital == manualNodeRecord,
947
1013
  );
948
1014
  expect(hasRegcapital).toBe(true);
949
1015
 
@@ -1056,6 +1122,17 @@ test.describe('field data update', () => {
1056
1122
  }
1057
1123
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
1058
1124
  await page.mouse.move(300, 0, { steps: 100 });
1125
+ await page
1126
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1127
+ .hover();
1128
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
1129
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
1130
+ await page.getByText('Add condition', { exact: true }).click();
1131
+ await page.getByTestId('select-filter-field').click();
1132
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
1133
+ await page.getByTestId('select-filter-operator').click();
1134
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
1135
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
1059
1136
  await page
1060
1137
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1061
1138
  .hover();
@@ -1228,6 +1305,17 @@ test.describe('field data update', () => {
1228
1305
  }
1229
1306
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
1230
1307
  await page.mouse.move(300, 0, { steps: 100 });
1308
+ await page
1309
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1310
+ .hover();
1311
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
1312
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
1313
+ await page.getByText('Add condition', { exact: true }).click();
1314
+ await page.getByTestId('select-filter-field').click();
1315
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
1316
+ await page.getByTestId('select-filter-operator').click();
1317
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
1318
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
1231
1319
  await page
1232
1320
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1233
1321
  .hover();
@@ -1400,6 +1488,17 @@ test.describe('field data update', () => {
1400
1488
  }
1401
1489
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
1402
1490
  await page.mouse.move(300, 0, { steps: 100 });
1491
+ await page
1492
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1493
+ .hover();
1494
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
1495
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
1496
+ await page.getByText('Add condition', { exact: true }).click();
1497
+ await page.getByTestId('select-filter-field').click();
1498
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
1499
+ await page.getByTestId('select-filter-operator').click();
1500
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
1501
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
1403
1502
  await page
1404
1503
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1405
1504
  .hover();
@@ -1573,6 +1672,17 @@ test.describe('field data update', () => {
1573
1672
  }
1574
1673
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
1575
1674
  await page.mouse.move(300, 0, { steps: 100 });
1675
+ await page
1676
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1677
+ .hover();
1678
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
1679
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
1680
+ await page.getByText('Add condition', { exact: true }).click();
1681
+ await page.getByTestId('select-filter-field').click();
1682
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
1683
+ await page.getByTestId('select-filter-operator').click();
1684
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
1685
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
1576
1686
  await page
1577
1687
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1578
1688
  .hover();
@@ -1754,6 +1864,17 @@ test.describe('field data update', () => {
1754
1864
  }
1755
1865
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
1756
1866
  await page.mouse.move(300, 0, { steps: 100 });
1867
+ await page
1868
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1869
+ .hover();
1870
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
1871
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
1872
+ await page.getByText('Add condition', { exact: true }).click();
1873
+ await page.getByTestId('select-filter-field').click();
1874
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
1875
+ await page.getByTestId('select-filter-operator').click();
1876
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
1877
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
1757
1878
  await page
1758
1879
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1759
1880
  .hover();
@@ -1926,6 +2047,17 @@ test.describe('field data update', () => {
1926
2047
  }
1927
2048
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
1928
2049
  await page.mouse.move(300, 0, { steps: 100 });
2050
+ await page
2051
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
2052
+ .hover();
2053
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
2054
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
2055
+ await page.getByText('Add condition', { exact: true }).click();
2056
+ await page.getByTestId('select-filter-field').click();
2057
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
2058
+ await page.getByTestId('select-filter-operator').click();
2059
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
2060
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
1929
2061
  await page
1930
2062
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1931
2063
  .hover();
@@ -2104,6 +2236,17 @@ test.describe('field data update', () => {
2104
2236
  }
2105
2237
  await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
2106
2238
  await page.mouse.move(300, 0, { steps: 100 });
2239
+ await page
2240
+ .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
2241
+ .hover();
2242
+ await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
2243
+ await page.getByRole('menuitem', { name: 'Filter settings' }).click();
2244
+ await page.getByText('Add condition', { exact: true }).click();
2245
+ await page.getByTestId('select-filter-field').click();
2246
+ await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
2247
+ await page.getByTestId('select-filter-operator').click();
2248
+ await page.getByRole('option', { name: 'exists', exact: true }).click();
2249
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
2107
2250
  await page
2108
2251
  .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
2109
2252
  .hover();
@@ -1,7 +1,7 @@
1
1
  import { FormLayout } from '@formily/antd-v5';
2
2
  import { createForm } from '@formily/core';
3
3
  import { FormProvider, ISchema, Schema, useFieldSchema, useForm } from '@formily/react';
4
- import { Alert, Button, Modal, Space } from 'antd';
4
+ import { Alert, Button, Modal, Space, message } from 'antd';
5
5
  import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react';
6
6
  import { useTranslation } from 'react-i18next';
7
7
 
@@ -17,14 +17,12 @@ import {
17
17
  SchemaComponentContext,
18
18
  SchemaInitializerItem,
19
19
  SchemaInitializerItemType,
20
- SchemaSettingsBlockTitleItem,
21
20
  SchemaSettingsDivider,
22
21
  SchemaSettingsItem,
23
22
  SchemaSettingsRemove,
24
23
  VariableScopeProvider,
25
24
  css,
26
25
  gridRowColWrap,
27
- useCompile,
28
26
  useDataSourceManager,
29
27
  useFormActiveFields,
30
28
  useFormBlockContext,
@@ -34,8 +32,8 @@ import {
34
32
  useSchemaOptionsContext,
35
33
  } from '@nocobase/client';
36
34
  import WorkflowPlugin, {
37
- JOB_STATUS,
38
35
  DetailsBlockProvider,
36
+ JOB_STATUS,
39
37
  SimpleDesigner,
40
38
  useAvailableUpstreams,
41
39
  useFlowContext,
@@ -45,7 +43,7 @@ import WorkflowPlugin, {
45
43
  } from '@nocobase/plugin-workflow/client';
46
44
  import { Registry, lodash } from '@nocobase/utils/client';
47
45
 
48
- import { NAMESPACE, useLang } from '../../locale';
46
+ import { NAMESPACE, usePluginTranslation } from '../../locale';
49
47
  import { FormBlockProvider } from './FormBlockProvider';
50
48
  import createRecordForm from './forms/create';
51
49
  import customRecordForm from './forms/custom';
@@ -86,13 +84,14 @@ export type ManualFormType = {
86
84
  [key: string]: React.FC;
87
85
  };
88
86
  };
87
+ validate?: (config: any) => string | null;
89
88
  };
90
89
 
91
90
  export const manualFormTypes = new Registry<ManualFormType>();
92
91
 
93
- manualFormTypes.register('customForm', customRecordForm);
94
- manualFormTypes.register('createForm', createRecordForm);
95
- manualFormTypes.register('updateForm', updateRecordForm);
92
+ manualFormTypes.register('custom', customRecordForm);
93
+ manualFormTypes.register('create', createRecordForm);
94
+ manualFormTypes.register('update', updateRecordForm);
96
95
 
97
96
  function useTriggerInitializers(): SchemaInitializerItemType | null {
98
97
  const { workflow } = useFlowContext();
@@ -107,6 +106,7 @@ const blockTypeNames = {
107
106
 
108
107
  /**
109
108
  * @deprecated
109
+ * use `addBlockButton` instead
110
110
  */
111
111
  export const addBlockButton_deprecated = new CompatibleSchemaInitializer({
112
112
  name: 'AddBlockButton',
@@ -243,7 +243,8 @@ export const addBlockButton = new CompatibleSchemaInitializer(
243
243
 
244
244
  function AssignedFieldValues() {
245
245
  const ctx = useContext(SchemaComponentContext);
246
- const { t } = useTranslation();
246
+ const { t: coreT } = useTranslation();
247
+ const { t } = usePluginTranslation();
247
248
  const fieldSchema = useFieldSchema();
248
249
  const scope = useWorkflowVariableOptions();
249
250
  const [open, setOpen] = useState(false);
@@ -275,7 +276,7 @@ function AssignedFieldValues() {
275
276
  }, [fieldSchema]);
276
277
  const upLevelActiveFields = useFormActiveFields();
277
278
 
278
- const title = t('Assign field values');
279
+ const title = coreT('Assign field values');
279
280
 
280
281
  function onCancel() {
281
282
  setOpen(false);
@@ -321,9 +322,7 @@ function AssignedFieldValues() {
321
322
  <FormProvider form={form}>
322
323
  <FormLayout layout={'vertical'}>
323
324
  <Alert
324
- message={useLang(
325
- 'Values preset in this form will override user submitted ones when continue or reject.',
326
- )}
325
+ message={t('Values preset in this form will override user submitted ones when continue or reject.')}
327
326
  />
328
327
  <br />
329
328
  {open && schema && (
@@ -421,6 +420,7 @@ function ActionInitializer() {
421
420
 
422
421
  /**
423
422
  * @deprecated
423
+ * use `addActionButton` instead
424
424
  */
425
425
  export const addActionButton_deprecated = new CompatibleSchemaInitializer({
426
426
  name: 'AddActionButton',
@@ -531,7 +531,7 @@ export function SchemaConfig({ value, onChange }) {
531
531
  type: 'void',
532
532
  'x-component': 'Tabs',
533
533
  'x-component-props': {},
534
- 'x-initializer': 'TabPaneInitializers',
534
+ 'x-initializer': 'popup:addTab',
535
535
  'x-initializer-props': {
536
536
  gridInitializer: 'workflowManual:popup:configureUserInterface:addBlock',
537
537
  },
@@ -612,15 +612,46 @@ export function SchemaConfig({ value, onChange }) {
612
612
  );
613
613
  }
614
614
 
615
+ function validateForms(forms: Record<string, any> = {}) {
616
+ for (const form of Object.values(forms)) {
617
+ const formType = manualFormTypes.get(form.type);
618
+ if (typeof formType.validate === 'function') {
619
+ const msg = formType.validate(form);
620
+ if (msg) {
621
+ return msg;
622
+ }
623
+ }
624
+ }
625
+ }
626
+
615
627
  export function SchemaConfigButton(props) {
616
628
  const { workflow } = useFlowContext();
617
629
  const [visible, setVisible] = useState(false);
630
+ const { values } = useForm();
631
+ const { t } = usePluginTranslation();
632
+ const onSetVisible = useCallback(
633
+ (v) => {
634
+ if (!v) {
635
+ const msg = validateForms(values.forms);
636
+ if (msg) {
637
+ message.error({
638
+ // eslint-disable-next-line react-hooks/rules-of-hooks
639
+ title: t('Validation failed'),
640
+ content: t(msg),
641
+ });
642
+ return;
643
+ }
644
+ }
645
+ setVisible(v);
646
+ },
647
+ [values.forms],
648
+ );
618
649
  return (
619
650
  <>
620
651
  <Button type="primary" onClick={() => setVisible(true)} disabled={false}>
621
- {useLang(workflow.executed ? 'View user interface' : 'Configure user interface')}
652
+ {t(workflow.executed ? 'View user interface' : 'Configure user interface')}
622
653
  </Button>
623
- <ActionContextProvider value={{ visible, setVisible, formValueChanged: false }}>
654
+ <ActionContextProvider value={{ visible, setVisible: onSetVisible, formValueChanged: false }}>
624
655
  {props.children}
625
656
  </ActionContextProvider>
626
657
  </>
@@ -95,10 +95,7 @@ function CustomFormBlockInitializer() {
95
95
  [uid()]: {
96
96
  type: 'void',
97
97
  'x-component': 'FormV2',
98
- 'x-component-props': {
99
- // disabled / read-pretty / initialValues
100
- useProps: '{{ useFormBlockProps }}',
101
- },
98
+ 'x-use-component-props': 'useFormBlockProps',
102
99
  properties: {
103
100
  grid: {
104
101
  type: 'void',
@@ -343,6 +340,7 @@ const CustomItemsComponent = (props) => {
343
340
 
344
341
  /**
345
342
  * @deprecated
343
+ * use `addCustomFormField` instead
346
344
  */
347
345
  export const addCustomFormField_deprecated = new CompatibleSchemaInitializer({
348
346
  name: 'AddCustomFormField',
@@ -15,6 +15,7 @@ import {
15
15
  useDesignable,
16
16
  useMenuSearch,
17
17
  } from '@nocobase/client';
18
+ import { isValidFilter } from '@nocobase/utils/client';
18
19
  import { FilterDynamicComponent } from '@nocobase/plugin-workflow/client';
19
20
 
20
21
  import { NAMESPACE } from '../../../locale';
@@ -37,15 +38,15 @@ function UpdateFormDesigner() {
37
38
  name: 'filter',
38
39
  type: 'object',
39
40
  title: `{{t("Filter")}}`,
40
- // 'x-decorator': 'FormItem',
41
41
  'x-component': 'Filter',
42
+ 'x-use-component-props': () => {
43
+ // eslint-disable-next-line react-hooks/rules-of-hooks
44
+ const options = useCollectionFilterOptions(fieldSchema?.['x-decorator-props']?.collection);
45
+ return {
46
+ options,
47
+ };
48
+ },
42
49
  'x-component-props': {
43
- useProps() {
44
- const options = useCollectionFilterOptions(fieldSchema?.['x-decorator-props']?.collection);
45
- return {
46
- options,
47
- };
48
- },
49
50
  dynamicComponent: 'FilterDynamicComponent',
50
51
  },
51
52
  }}
@@ -156,4 +157,11 @@ export default {
156
157
  },
157
158
  components: {},
158
159
  },
160
+ validate({ filter }) {
161
+ if (!filter || !isValidFilter(filter)) {
162
+ return 'Please check one of your update record form, and add at least one filter condition in form settings.';
163
+ }
164
+
165
+ return null;
166
+ },
159
167
  } as ManualFormType;
@@ -7,6 +7,8 @@ export function useLang(key: string, options = {}) {
7
7
  return t(key);
8
8
  }
9
9
 
10
- export function usePluginTranslation(options) {
10
+ export const lang = useLang;
11
+
12
+ export function usePluginTranslation(options?) {
11
13
  return useTranslation(NAMESPACE, options);
12
14
  }
@@ -27,5 +27,6 @@
27
27
  "Filter settings": "筛选设置",
28
28
  "Workflow todos": "工作流待办",
29
29
  "Task node": "任务节点",
30
- "Unprocessed": "未处理"
30
+ "Unprocessed": "未处理",
31
+ "Please check one of your update record form, and add at least one filter condition in form settings.": "请检查您的其中的更新数据表单,并在表单设置中至少添加一个筛选条件。"
31
32
  }
@@ -596,6 +596,7 @@ describe('workflow > instructions > manual', () => {
596
596
  type: 'update',
597
597
  actions: [{ status: JOB_STATUS.RESOLVED, key: 'resolve' }],
598
598
  collection: 'posts',
599
+ filter: { title: 't1' },
599
600
  },
600
601
  },
601
602
  },