@nocobase/plugin-workflow-manual 0.21.0-alpha.1 → 0.21.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.js +4 -4
- package/dist/client/instruction/SchemaConfig.d.ts +3 -0
- package/dist/client/instruction/forms/custom.d.ts +1 -0
- package/dist/externalVersion.js +9 -9
- package/dist/locale/index.d.ts +2 -1
- package/dist/locale/index.js +3 -0
- package/dist/locale/zh-CN.json +2 -1
- package/package.json +2 -2
- package/src/client/WorkflowTodo.tsx +3 -3
- package/src/client/__e2e__/createRecordForm.test.ts +2 -2
- package/src/client/__e2e__/customFormBlocks.test.ts +4 -4
- package/src/client/__e2e__/datablocks.test.ts +13 -0
- package/src/client/__e2e__/updateRecordForm.test.ts +147 -4
- package/src/client/instruction/SchemaConfig.tsx +47 -16
- package/src/client/instruction/forms/custom.tsx +2 -4
- package/src/client/instruction/forms/update.tsx +15 -7
- package/src/locale/index.ts +3 -1
- package/src/locale/zh-CN.json +2 -1
- package/src/server/__tests__/form.test.ts +1 -0
package/dist/client/index.js
CHANGED
|
@@ -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":"
|
|
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:
|
|
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;
|
package/dist/externalVersion.js
CHANGED
|
@@ -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.
|
|
7
|
-
"@nocobase/plugin-workflow": "0.21.0-alpha.
|
|
6
|
+
"@nocobase/client": "0.21.0-alpha.10",
|
|
7
|
+
"@nocobase/plugin-workflow": "0.21.0-alpha.10",
|
|
8
8
|
"@ant-design/icons": "5.2.6",
|
|
9
9
|
"react-i18next": "11.18.6",
|
|
10
|
-
"@nocobase/utils": "0.21.0-alpha.
|
|
11
|
-
"@nocobase/server": "0.21.0-alpha.
|
|
12
|
-
"@nocobase/actions": "0.21.0-alpha.
|
|
13
|
-
"@nocobase/resourcer": "0.21.0-alpha.
|
|
14
|
-
"@nocobase/plugin-workflow-test": "0.21.0-alpha.
|
|
15
|
-
"@nocobase/test": "0.21.0-alpha.
|
|
10
|
+
"@nocobase/utils": "0.21.0-alpha.10",
|
|
11
|
+
"@nocobase/server": "0.21.0-alpha.10",
|
|
12
|
+
"@nocobase/actions": "0.21.0-alpha.10",
|
|
13
|
+
"@nocobase/resourcer": "0.21.0-alpha.10",
|
|
14
|
+
"@nocobase/plugin-workflow-test": "0.21.0-alpha.10",
|
|
15
|
+
"@nocobase/test": "0.21.0-alpha.10",
|
|
16
16
|
"@formily/core": "2.3.0",
|
|
17
17
|
"@formily/antd-v5": "1.1.9",
|
|
18
|
-
"@nocobase/database": "0.21.0-alpha.
|
|
18
|
+
"@nocobase/database": "0.21.0-alpha.10",
|
|
19
19
|
"lodash": "4.17.21"
|
|
20
20
|
};
|
package/dist/locale/index.d.ts
CHANGED
|
@@ -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
|
|
3
|
+
export declare const lang: typeof useLang;
|
|
4
|
+
export declare function usePluginTranslation(options?: any): import("react-i18next").UseTranslationResponse<"workflow-manual", undefined>;
|
package/dist/locale/index.js
CHANGED
|
@@ -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
|
});
|
package/dist/locale/zh-CN.json
CHANGED
|
@@ -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.
|
|
7
|
+
"version": "0.21.0-alpha.10",
|
|
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": "
|
|
33
|
+
"gitHead": "98adf5ec996a4f359c6ca1c4a6ac837c43b6e268",
|
|
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
|
|
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
|
|
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()
|
|
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
|
|
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()
|
|
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
|
|
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()
|
|
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
|
|
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()
|
|
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
|
|
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,
|
|
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('
|
|
94
|
-
manualFormTypes.register('
|
|
95
|
-
manualFormTypes.register('
|
|
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 =
|
|
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={
|
|
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': '
|
|
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
|
-
{
|
|
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;
|
package/src/locale/index.ts
CHANGED
|
@@ -7,6 +7,8 @@ export function useLang(key: string, options = {}) {
|
|
|
7
7
|
return t(key);
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
export
|
|
10
|
+
export const lang = useLang;
|
|
11
|
+
|
|
12
|
+
export function usePluginTranslation(options?) {
|
|
11
13
|
return useTranslation(NAMESPACE, options);
|
|
12
14
|
}
|
package/src/locale/zh-CN.json
CHANGED
|
@@ -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
|
}
|