@nocobase/client-v2 2.2.26 → 2.2.28

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.
@@ -16,6 +16,7 @@ export declare function handleLinkNavigation(options: {
16
16
  }) => void;
17
17
  };
18
18
  isExternalLink: boolean;
19
+ replace?: boolean;
19
20
  setLocationHref?: (url: string) => void;
20
21
  openWindow?: (url?: string, target?: string) => Window | null;
21
22
  }): void;
package/es/index.mjs CHANGED
@@ -828,7 +828,7 @@ if (!ctx.record) {
828
828
  } else {
829
829
  ctx.message.success('Record ID: ' + (ctx.filterByTk ?? ctx.record?.id));
830
830
  }
831
- `}),async handler(e,t){let{code:l,version:o}=dh(e,t);await e.runjs(l,void 0,{version:o})}}}});class dA extends s1{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Popup"),icon:"ExportOutlined"}}}dA.scene=aQ.s5.all,dA.define({label:(0,f.tExpr)("Popup"),sort:30});class dP extends aQ.S0{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Refresh"),icon:"ReloadOutlined"}}}dP.scene=aQ.s5.collection,dP.define({label:(0,f.tExpr)("Refresh"),toggleable:!0}),dP.registerFlow({key:"refreshSettings",title:(0,f.tExpr)("Refresh settings"),on:"click",steps:{refresh:{async handler(e,t){var l;let o=null==(l=e.blockModel)?void 0:l.resource;o?(o.loading=!0,await o.refresh()):e.message.error(e.t("No resource selected for refresh"))}}}});var dT=__webpack_require__(7093);async function dj(e){var t,l,o;let n=(null==e?void 0:e.blockModel)||(null==e||null==(l=e.model)||null==(t=l.context)?void 0:t.blockModel)||(null==e?void 0:e.model),i=null==e?void 0:e.model,r=e=>{var t;(null==e||null==(t=e.context)?void 0:t.defineProperty)&&"function"==typeof(null==n?void 0:n.getCurrentRecord)&&e.context.defineProperty("record",{get:()=>n.getCurrentRecord(),cache:!1})};if(r(null==e?void 0:e.model),(null==e||null==(o=e.model)?void 0:o.forks)&&"function"==typeof e.model.forks.forEach&&e.model.forks.forEach(e=>r(e)),"function"==typeof(null==n?void 0:n.getCurrentRecord)){let t=n.getCurrentRecord();"function"==typeof(null==e?void 0:e.defineProperty)?e.defineProperty("record",{get:()=>n.getCurrentRecord(),cache:!1}):e.record=t}i&&await (0,dT.Xi)(i,"paginationChange"),n&&n!==i&&await (0,dT.Xi)(n,"paginationChange")}async function dI(e,t,l){var o,n,i;let r=(null==l?void 0:l.settingsFlowKey)||"assignSettings",a=e.model.getStepParams(r,"confirm"),s=a&&"object"==typeof a?a:{enable:!1};await e.runAction("confirm",s);let d=await (0,dv.eu)(e,null==t?void 0:t.assignedValues,"UpdateRecordAction");if(!d)return!1;if(!d||"object"!=typeof d||!Object.keys(d).length)return e.message.warning(e.t("No assigned fields configured")),!1;let u=null==(o=e.collection)?void 0:o.name,c=null==(i=e.collection)||null==(n=i.getFilterByTK)?void 0:n.call(i,e.record);if(!u||null==c)return e.message.error(e.t("Record is required to perform this action")),!1;let p=!1;return e.resource instanceof f.SingleRecordResource?(await e.resource.save(d,t.requestConfig),p=!0):e.resource instanceof f.MultiRecordResource&&(await e.resource.update(c,d,t.requestConfig),p=!0),!!p&&(await dj(e),!0)}let dL="assignSettings",dR={successMessage:(0,f.tExpr)("Saved successfully"),manualClose:!1,actionAfterSuccess:"stay"};function dD(){let e=(0,f.useFlowSettingsContext)();return(0,m.jsx)(b.Alert,{type:"info",showIcon:!0,message:e.t("After clicking the custom button, the following fields of the current record will be saved according to the following form.")})}class dE extends aQ.S0{getAclActionName(){return"update"}setSaveRequestConfig(e){this.setStepParams("apply","apply",{requestConfig:e})}constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Update record"),type:"link",icon:"EditOutlined"}}}dE.scene=aQ.s5.record,dE.define({label:(0,f.tExpr)("Update record"),sort:50,createModelOptions:e=>({subModels:{assignForm:(0,dv.nF)(e)}})}),dE.registerFlow({key:dL,title:(0,f.tExpr)("Action settings"),manual:!0,steps:{confirm:{title:(0,f.tExpr)("Secondary confirmation"),use:"confirm",defaultParams:{enable:!1,title:(0,f.tExpr)("Perform the Update record"),content:(0,f.tExpr)("Are you sure you want to perform the Update record action?")}},assignFieldValues:(0,dv.KW)({settingsFlowKey:dL,title:(0,f.tExpr)("Field values"),tipComponent:dD,validateBeforeSave:!0}),afterSuccess:{use:"afterSuccess",defaultParams:dR}}}),dE.registerFlow({key:"apply",on:"click",steps:{apply:{defaultParams:async e=>(0,dv.Z1)(e,dL),async handler(e,t){if(!await dI(e,t,{settingsFlowKey:dL}))return;let l=e.model.getStepParams(dL,"afterSuccess")||{};await e.runAction("afterSuccess",{...dR,...l})}}}});class dY extends s1{getAclActionName(){return"view"}constructor(...e){super(...e),this.defaultProps={type:"link",title:(0,f.tExpr)("View"),icon:"EyeOutlined"}}}function dN(e,t){let l=e.indexOf("?"),o=l>=0?e.slice(0,l):e,n=new URLSearchParams(l>=0?e.slice(l+1):"");for(let{name:e,value:l}of t)n.set(e,String(l));let i=n.toString();return i?`${o}?${i}`:o}function dO(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(!(null==t?void 0:t.length))return e;let l=t.filter(e=>e.name&&void 0!==e.value&&null!==e.value&&""!==e.value);if(!l.length)return e;let o=e.indexOf("#"),n=o>=0,i=n?e.slice(0,o):e,r=n?e.slice(o+1):"",a=r.startsWith("/")||r.startsWith("!/");if(n&&a)return`${i}#${dN(r,l)}`;let s=dN(i,l);return n?`${s}#${r}`:s}function dB(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:window.location.origin;return e?(0,I.isURL)(e)?e:e.startsWith("/")?`${t}${e}`:`${t}/${e}`:""}function dV(e){let{link:t,openInNewWindow:l,router:o,isExternalLink:n}=e,i=e.setLocationHref??(e=>window.location.href=e),r=e.openWindow??((e,t)=>window.open(e,t));l?r(dB(t),"_blank"):n?i(t):o.navigate(t,{replace:!0})}function dH(e){let{openInNewWindow:t,isExternalLink:l,viewType:o}=e;return!t&&!l&&"embed"!==o}dY.scene=aQ.s5.record,dY.define({label:(0,f.tExpr)("View"),sort:10});class dq extends aQ.S0{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Link"),icon:"LinkOutlined"}}}dq.scene=aQ.s5.all,dq.define({label:(0,f.tExpr)("Link")}),dq.registerFlow({key:"actionPanelLinkSettings",on:"click",steps:{click:{async handler(e,t){let{url:l,searchParams:o,openInNewWindow:n}=e.model.props,i=e.t;if(!l)return void e.message.warning(i("Please configure the URL"));let r=dO(l,o);if(r){let t=(0,I.isURL)(r);dV({link:r,openInNewWindow:n,router:e.router,isExternalLink:t}),e.view&&dH({openInNewWindow:n,isExternalLink:t,viewType:e.view.type})&&e.view.destroy()}else console.error("link should be a string")}}}}),dq.registerFlow({key:"linkButtonSettings",title:(0,f.tExpr)("Link action settings"),steps:{editLink:{title:(0,f.tExpr)("Edit link"),uiSchema(e){let t=e.t;return{url:{title:(0,f.tExpr)("URL"),type:"string","x-decorator":"FormItem","x-component":rP.n,description:t("Do not concatenate search params in the URL"),"x-reactions":{dependencies:["mode"],fulfill:{state:{hidden:'{{$deps[0] === "html"}}'}}},required:!0},searchParams:{type:"array","x-component":"ArrayItems","x-decorator":"FormItem",title:'{{t("Search parameters")}}',items:{type:"object",properties:{space:{type:"void","x-component":"Space","x-component-props":{style:{flexWrap:"nowrap",maxWidth:"100%",display:"flex"},className:(0,A.css)`
831
+ `}),async handler(e,t){let{code:l,version:o}=dh(e,t);await e.runjs(l,void 0,{version:o})}}}});class dA extends s1{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Popup"),icon:"ExportOutlined"}}}dA.scene=aQ.s5.all,dA.define({label:(0,f.tExpr)("Popup"),sort:30});class dP extends aQ.S0{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Refresh"),icon:"ReloadOutlined"}}}dP.scene=aQ.s5.collection,dP.define({label:(0,f.tExpr)("Refresh"),toggleable:!0}),dP.registerFlow({key:"refreshSettings",title:(0,f.tExpr)("Refresh settings"),on:"click",steps:{refresh:{async handler(e,t){var l;let o=null==(l=e.blockModel)?void 0:l.resource;o?(o.loading=!0,await o.refresh()):e.message.error(e.t("No resource selected for refresh"))}}}});var dT=__webpack_require__(7093);async function dj(e){var t,l,o;let n=(null==e?void 0:e.blockModel)||(null==e||null==(l=e.model)||null==(t=l.context)?void 0:t.blockModel)||(null==e?void 0:e.model),i=null==e?void 0:e.model,r=e=>{var t;(null==e||null==(t=e.context)?void 0:t.defineProperty)&&"function"==typeof(null==n?void 0:n.getCurrentRecord)&&e.context.defineProperty("record",{get:()=>n.getCurrentRecord(),cache:!1})};if(r(null==e?void 0:e.model),(null==e||null==(o=e.model)?void 0:o.forks)&&"function"==typeof e.model.forks.forEach&&e.model.forks.forEach(e=>r(e)),"function"==typeof(null==n?void 0:n.getCurrentRecord)){let t=n.getCurrentRecord();"function"==typeof(null==e?void 0:e.defineProperty)?e.defineProperty("record",{get:()=>n.getCurrentRecord(),cache:!1}):e.record=t}i&&await (0,dT.Xi)(i,"paginationChange"),n&&n!==i&&await (0,dT.Xi)(n,"paginationChange")}async function dI(e,t,l){var o,n,i;let r=(null==l?void 0:l.settingsFlowKey)||"assignSettings",a=e.model.getStepParams(r,"confirm"),s=a&&"object"==typeof a?a:{enable:!1};await e.runAction("confirm",s);let d=await (0,dv.eu)(e,null==t?void 0:t.assignedValues,"UpdateRecordAction");if(!d)return!1;if(!d||"object"!=typeof d||!Object.keys(d).length)return e.message.warning(e.t("No assigned fields configured")),!1;let u=null==(o=e.collection)?void 0:o.name,c=null==(i=e.collection)||null==(n=i.getFilterByTK)?void 0:n.call(i,e.record);if(!u||null==c)return e.message.error(e.t("Record is required to perform this action")),!1;let p=!1;return e.resource instanceof f.SingleRecordResource?(await e.resource.save(d,t.requestConfig),p=!0):e.resource instanceof f.MultiRecordResource&&(await e.resource.update(c,d,t.requestConfig),p=!0),!!p&&(await dj(e),!0)}let dL="assignSettings",dR={successMessage:(0,f.tExpr)("Saved successfully"),manualClose:!1,actionAfterSuccess:"stay"};function dD(){let e=(0,f.useFlowSettingsContext)();return(0,m.jsx)(b.Alert,{type:"info",showIcon:!0,message:e.t("After clicking the custom button, the following fields of the current record will be saved according to the following form.")})}class dE extends aQ.S0{getAclActionName(){return"update"}setSaveRequestConfig(e){this.setStepParams("apply","apply",{requestConfig:e})}constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Update record"),type:"link",icon:"EditOutlined"}}}dE.scene=aQ.s5.record,dE.define({label:(0,f.tExpr)("Update record"),sort:50,createModelOptions:e=>({subModels:{assignForm:(0,dv.nF)(e)}})}),dE.registerFlow({key:dL,title:(0,f.tExpr)("Action settings"),manual:!0,steps:{confirm:{title:(0,f.tExpr)("Secondary confirmation"),use:"confirm",defaultParams:{enable:!1,title:(0,f.tExpr)("Perform the Update record"),content:(0,f.tExpr)("Are you sure you want to perform the Update record action?")}},assignFieldValues:(0,dv.KW)({settingsFlowKey:dL,title:(0,f.tExpr)("Field values"),tipComponent:dD,validateBeforeSave:!0}),afterSuccess:{use:"afterSuccess",defaultParams:dR}}}),dE.registerFlow({key:"apply",on:"click",steps:{apply:{defaultParams:async e=>(0,dv.Z1)(e,dL),async handler(e,t){if(!await dI(e,t,{settingsFlowKey:dL}))return;let l=e.model.getStepParams(dL,"afterSuccess")||{};await e.runAction("afterSuccess",{...dR,...l})}}}});class dY extends s1{getAclActionName(){return"view"}constructor(...e){super(...e),this.defaultProps={type:"link",title:(0,f.tExpr)("View"),icon:"EyeOutlined"}}}function dN(e,t){let l=e.indexOf("?"),o=l>=0?e.slice(0,l):e,n=new URLSearchParams(l>=0?e.slice(l+1):"");for(let{name:e,value:l}of t)n.set(e,String(l));let i=n.toString();return i?`${o}?${i}`:o}function dO(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(!(null==t?void 0:t.length))return e;let l=t.filter(e=>e.name&&void 0!==e.value&&null!==e.value&&""!==e.value);if(!l.length)return e;let o=e.indexOf("#"),n=o>=0,i=n?e.slice(0,o):e,r=n?e.slice(o+1):"",a=r.startsWith("/")||r.startsWith("!/");if(n&&a)return`${i}#${dN(r,l)}`;let s=dN(i,l);return n?`${s}#${r}`:s}function dB(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:window.location.origin;return e?(0,I.isURL)(e)?e:e.startsWith("/")?`${t}${e}`:`${t}/${e}`:""}function dV(e){let{link:t,openInNewWindow:l,router:o,isExternalLink:n,replace:i=!1}=e,r=e.setLocationHref??(e=>window.location.href=e),a=e.openWindow??((e,t)=>window.open(e,t));l?a(dB(t),"_blank"):n?r(t):o.navigate(t,{replace:i})}function dH(e){let{openInNewWindow:t,isExternalLink:l,viewType:o}=e;return!t&&!l&&"embed"!==o}dY.scene=aQ.s5.record,dY.define({label:(0,f.tExpr)("View"),sort:10});class dq extends aQ.S0{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Link"),icon:"LinkOutlined"}}}dq.scene=aQ.s5.all,dq.define({label:(0,f.tExpr)("Link")}),dq.registerFlow({key:"actionPanelLinkSettings",on:"click",steps:{click:{async handler(e,t){let{url:l,searchParams:o,openInNewWindow:n}=e.model.props,i=e.t;if(!l)return void e.message.warning(i("Please configure the URL"));let r=dO(l,o);if(r){let t=(0,I.isURL)(r),l=!!e.view&&dH({openInNewWindow:n,isExternalLink:t,viewType:e.view.type});dV({link:r,openInNewWindow:n,router:e.router,isExternalLink:t,replace:l}),l&&e.view.destroy()}else console.error("link should be a string")}}}}),dq.registerFlow({key:"linkButtonSettings",title:(0,f.tExpr)("Link action settings"),steps:{editLink:{title:(0,f.tExpr)("Edit link"),uiSchema(e){let t=e.t;return{url:{title:(0,f.tExpr)("URL"),type:"string","x-decorator":"FormItem","x-component":rP.n,description:t("Do not concatenate search params in the URL"),"x-reactions":{dependencies:["mode"],fulfill:{state:{hidden:'{{$deps[0] === "html"}}'}}},required:!0},searchParams:{type:"array","x-component":"ArrayItems","x-decorator":"FormItem",title:'{{t("Search parameters")}}',items:{type:"object",properties:{space:{type:"void","x-component":"Space","x-component-props":{style:{flexWrap:"nowrap",maxWidth:"100%",display:"flex"},className:(0,A.css)`
832
832
  & > .ant-space-item:first-child {
833
833
  flex: 3;
834
834
  }
package/lib/index.js CHANGED
@@ -828,7 +828,7 @@ if (!ctx.record) {
828
828
  } else {
829
829
  ctx.message.success('Record ID: ' + (ctx.filterByTk ?? ctx.record?.id));
830
830
  }
831
- `}),async handler(e,t){let{code:l,version:o}=dh(e,t);await e.runjs(l,void 0,{version:o})}}}});class dA extends s1{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Popup"),icon:"ExportOutlined"}}}dA.scene=aQ.s5.all,dA.define({label:(0,f.tExpr)("Popup"),sort:30});class dP extends aQ.S0{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Refresh"),icon:"ReloadOutlined"}}}dP.scene=aQ.s5.collection,dP.define({label:(0,f.tExpr)("Refresh"),toggleable:!0}),dP.registerFlow({key:"refreshSettings",title:(0,f.tExpr)("Refresh settings"),on:"click",steps:{refresh:{async handler(e,t){var l;let o=null==(l=e.blockModel)?void 0:l.resource;o?(o.loading=!0,await o.refresh()):e.message.error(e.t("No resource selected for refresh"))}}}});var dT=__nested_rspack_require_1264766__(7093);async function dI(e){var t,l,o;let i=(null==e?void 0:e.blockModel)||(null==e||null==(l=e.model)||null==(t=l.context)?void 0:t.blockModel)||(null==e?void 0:e.model),n=null==e?void 0:e.model,r=e=>{var t;(null==e||null==(t=e.context)?void 0:t.defineProperty)&&"function"==typeof(null==i?void 0:i.getCurrentRecord)&&e.context.defineProperty("record",{get:()=>i.getCurrentRecord(),cache:!1})};if(r(null==e?void 0:e.model),(null==e||null==(o=e.model)?void 0:o.forks)&&"function"==typeof e.model.forks.forEach&&e.model.forks.forEach(e=>r(e)),"function"==typeof(null==i?void 0:i.getCurrentRecord)){let t=i.getCurrentRecord();"function"==typeof(null==e?void 0:e.defineProperty)?e.defineProperty("record",{get:()=>i.getCurrentRecord(),cache:!1}):e.record=t}n&&await (0,dT.Xi)(n,"paginationChange"),i&&i!==n&&await (0,dT.Xi)(i,"paginationChange")}async function dL(e,t,l){var o,i,n;let r=(null==l?void 0:l.settingsFlowKey)||"assignSettings",a=e.model.getStepParams(r,"confirm"),s=a&&"object"==typeof a?a:{enable:!1};await e.runAction("confirm",s);let d=await (0,dv.eu)(e,null==t?void 0:t.assignedValues,"UpdateRecordAction");if(!d)return!1;if(!d||"object"!=typeof d||!Object.keys(d).length)return e.message.warning(e.t("No assigned fields configured")),!1;let u=null==(o=e.collection)?void 0:o.name,c=null==(n=e.collection)||null==(i=n.getFilterByTK)?void 0:i.call(n,e.record);if(!u||null==c)return e.message.error(e.t("Record is required to perform this action")),!1;let p=!1;return e.resource instanceof f.SingleRecordResource?(await e.resource.save(d,t.requestConfig),p=!0):e.resource instanceof f.MultiRecordResource&&(await e.resource.update(c,d,t.requestConfig),p=!0),!!p&&(await dI(e),!0)}let dR="assignSettings",dj={successMessage:(0,f.tExpr)("Saved successfully"),manualClose:!1,actionAfterSuccess:"stay"};function dD(){let e=(0,f.useFlowSettingsContext)();return(0,m.jsx)(x.Alert,{type:"info",showIcon:!0,message:e.t("After clicking the custom button, the following fields of the current record will be saved according to the following form.")})}class dE extends aQ.S0{getAclActionName(){return"update"}setSaveRequestConfig(e){this.setStepParams("apply","apply",{requestConfig:e})}constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Update record"),type:"link",icon:"EditOutlined"}}}dE.scene=aQ.s5.record,dE.define({label:(0,f.tExpr)("Update record"),sort:50,createModelOptions:e=>({subModels:{assignForm:(0,dv.nF)(e)}})}),dE.registerFlow({key:dR,title:(0,f.tExpr)("Action settings"),manual:!0,steps:{confirm:{title:(0,f.tExpr)("Secondary confirmation"),use:"confirm",defaultParams:{enable:!1,title:(0,f.tExpr)("Perform the Update record"),content:(0,f.tExpr)("Are you sure you want to perform the Update record action?")}},assignFieldValues:(0,dv.KW)({settingsFlowKey:dR,title:(0,f.tExpr)("Field values"),tipComponent:dD,validateBeforeSave:!0}),afterSuccess:{use:"afterSuccess",defaultParams:dj}}}),dE.registerFlow({key:"apply",on:"click",steps:{apply:{defaultParams:async e=>(0,dv.Z1)(e,dR),async handler(e,t){if(!await dL(e,t,{settingsFlowKey:dR}))return;let l=e.model.getStepParams(dR,"afterSuccess")||{};await e.runAction("afterSuccess",{...dj,...l})}}}});class dY extends s1{getAclActionName(){return"view"}constructor(...e){super(...e),this.defaultProps={type:"link",title:(0,f.tExpr)("View"),icon:"EyeOutlined"}}}function dN(e,t){let l=e.indexOf("?"),o=l>=0?e.slice(0,l):e,i=new URLSearchParams(l>=0?e.slice(l+1):"");for(let{name:e,value:l}of t)i.set(e,String(l));let n=i.toString();return n?`${o}?${n}`:o}function dO(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(!(null==t?void 0:t.length))return e;let l=t.filter(e=>e.name&&void 0!==e.value&&null!==e.value&&""!==e.value);if(!l.length)return e;let o=e.indexOf("#"),i=o>=0,n=i?e.slice(0,o):e,r=i?e.slice(o+1):"",a=r.startsWith("/")||r.startsWith("!/");if(i&&a)return`${n}#${dN(r,l)}`;let s=dN(n,l);return i?`${s}#${r}`:s}function dB(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:window.location.origin;return e?(0,L.isURL)(e)?e:e.startsWith("/")?`${t}${e}`:`${t}/${e}`:""}function dV(e){let{link:t,openInNewWindow:l,router:o,isExternalLink:i}=e,n=e.setLocationHref??(e=>window.location.href=e),r=e.openWindow??((e,t)=>window.open(e,t));l?r(dB(t),"_blank"):i?n(t):o.navigate(t,{replace:!0})}function dH(e){let{openInNewWindow:t,isExternalLink:l,viewType:o}=e;return!t&&!l&&"embed"!==o}dY.scene=aQ.s5.record,dY.define({label:(0,f.tExpr)("View"),sort:10});class dq extends aQ.S0{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Link"),icon:"LinkOutlined"}}}dq.scene=aQ.s5.all,dq.define({label:(0,f.tExpr)("Link")}),dq.registerFlow({key:"actionPanelLinkSettings",on:"click",steps:{click:{async handler(e,t){let{url:l,searchParams:o,openInNewWindow:i}=e.model.props,n=e.t;if(!l)return void e.message.warning(n("Please configure the URL"));let r=dO(l,o);if(r){let t=(0,L.isURL)(r);dV({link:r,openInNewWindow:i,router:e.router,isExternalLink:t}),e.view&&dH({openInNewWindow:i,isExternalLink:t,viewType:e.view.type})&&e.view.destroy()}else console.error("link should be a string")}}}}),dq.registerFlow({key:"linkButtonSettings",title:(0,f.tExpr)("Link action settings"),steps:{editLink:{title:(0,f.tExpr)("Edit link"),uiSchema(e){let t=e.t;return{url:{title:(0,f.tExpr)("URL"),type:"string","x-decorator":"FormItem","x-component":rP.n,description:t("Do not concatenate search params in the URL"),"x-reactions":{dependencies:["mode"],fulfill:{state:{hidden:'{{$deps[0] === "html"}}'}}},required:!0},searchParams:{type:"array","x-component":"ArrayItems","x-decorator":"FormItem",title:'{{t("Search parameters")}}',items:{type:"object",properties:{space:{type:"void","x-component":"Space","x-component-props":{style:{flexWrap:"nowrap",maxWidth:"100%",display:"flex"},className:(0,A.css)`
831
+ `}),async handler(e,t){let{code:l,version:o}=dh(e,t);await e.runjs(l,void 0,{version:o})}}}});class dA extends s1{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Popup"),icon:"ExportOutlined"}}}dA.scene=aQ.s5.all,dA.define({label:(0,f.tExpr)("Popup"),sort:30});class dP extends aQ.S0{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Refresh"),icon:"ReloadOutlined"}}}dP.scene=aQ.s5.collection,dP.define({label:(0,f.tExpr)("Refresh"),toggleable:!0}),dP.registerFlow({key:"refreshSettings",title:(0,f.tExpr)("Refresh settings"),on:"click",steps:{refresh:{async handler(e,t){var l;let o=null==(l=e.blockModel)?void 0:l.resource;o?(o.loading=!0,await o.refresh()):e.message.error(e.t("No resource selected for refresh"))}}}});var dT=__nested_rspack_require_1264766__(7093);async function dI(e){var t,l,o;let i=(null==e?void 0:e.blockModel)||(null==e||null==(l=e.model)||null==(t=l.context)?void 0:t.blockModel)||(null==e?void 0:e.model),n=null==e?void 0:e.model,r=e=>{var t;(null==e||null==(t=e.context)?void 0:t.defineProperty)&&"function"==typeof(null==i?void 0:i.getCurrentRecord)&&e.context.defineProperty("record",{get:()=>i.getCurrentRecord(),cache:!1})};if(r(null==e?void 0:e.model),(null==e||null==(o=e.model)?void 0:o.forks)&&"function"==typeof e.model.forks.forEach&&e.model.forks.forEach(e=>r(e)),"function"==typeof(null==i?void 0:i.getCurrentRecord)){let t=i.getCurrentRecord();"function"==typeof(null==e?void 0:e.defineProperty)?e.defineProperty("record",{get:()=>i.getCurrentRecord(),cache:!1}):e.record=t}n&&await (0,dT.Xi)(n,"paginationChange"),i&&i!==n&&await (0,dT.Xi)(i,"paginationChange")}async function dL(e,t,l){var o,i,n;let r=(null==l?void 0:l.settingsFlowKey)||"assignSettings",a=e.model.getStepParams(r,"confirm"),s=a&&"object"==typeof a?a:{enable:!1};await e.runAction("confirm",s);let d=await (0,dv.eu)(e,null==t?void 0:t.assignedValues,"UpdateRecordAction");if(!d)return!1;if(!d||"object"!=typeof d||!Object.keys(d).length)return e.message.warning(e.t("No assigned fields configured")),!1;let u=null==(o=e.collection)?void 0:o.name,c=null==(n=e.collection)||null==(i=n.getFilterByTK)?void 0:i.call(n,e.record);if(!u||null==c)return e.message.error(e.t("Record is required to perform this action")),!1;let p=!1;return e.resource instanceof f.SingleRecordResource?(await e.resource.save(d,t.requestConfig),p=!0):e.resource instanceof f.MultiRecordResource&&(await e.resource.update(c,d,t.requestConfig),p=!0),!!p&&(await dI(e),!0)}let dR="assignSettings",dj={successMessage:(0,f.tExpr)("Saved successfully"),manualClose:!1,actionAfterSuccess:"stay"};function dD(){let e=(0,f.useFlowSettingsContext)();return(0,m.jsx)(x.Alert,{type:"info",showIcon:!0,message:e.t("After clicking the custom button, the following fields of the current record will be saved according to the following form.")})}class dE extends aQ.S0{getAclActionName(){return"update"}setSaveRequestConfig(e){this.setStepParams("apply","apply",{requestConfig:e})}constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Update record"),type:"link",icon:"EditOutlined"}}}dE.scene=aQ.s5.record,dE.define({label:(0,f.tExpr)("Update record"),sort:50,createModelOptions:e=>({subModels:{assignForm:(0,dv.nF)(e)}})}),dE.registerFlow({key:dR,title:(0,f.tExpr)("Action settings"),manual:!0,steps:{confirm:{title:(0,f.tExpr)("Secondary confirmation"),use:"confirm",defaultParams:{enable:!1,title:(0,f.tExpr)("Perform the Update record"),content:(0,f.tExpr)("Are you sure you want to perform the Update record action?")}},assignFieldValues:(0,dv.KW)({settingsFlowKey:dR,title:(0,f.tExpr)("Field values"),tipComponent:dD,validateBeforeSave:!0}),afterSuccess:{use:"afterSuccess",defaultParams:dj}}}),dE.registerFlow({key:"apply",on:"click",steps:{apply:{defaultParams:async e=>(0,dv.Z1)(e,dR),async handler(e,t){if(!await dL(e,t,{settingsFlowKey:dR}))return;let l=e.model.getStepParams(dR,"afterSuccess")||{};await e.runAction("afterSuccess",{...dj,...l})}}}});class dY extends s1{getAclActionName(){return"view"}constructor(...e){super(...e),this.defaultProps={type:"link",title:(0,f.tExpr)("View"),icon:"EyeOutlined"}}}function dN(e,t){let l=e.indexOf("?"),o=l>=0?e.slice(0,l):e,i=new URLSearchParams(l>=0?e.slice(l+1):"");for(let{name:e,value:l}of t)i.set(e,String(l));let n=i.toString();return n?`${o}?${n}`:o}function dO(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(!(null==t?void 0:t.length))return e;let l=t.filter(e=>e.name&&void 0!==e.value&&null!==e.value&&""!==e.value);if(!l.length)return e;let o=e.indexOf("#"),i=o>=0,n=i?e.slice(0,o):e,r=i?e.slice(o+1):"",a=r.startsWith("/")||r.startsWith("!/");if(i&&a)return`${n}#${dN(r,l)}`;let s=dN(n,l);return i?`${s}#${r}`:s}function dB(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:window.location.origin;return e?(0,L.isURL)(e)?e:e.startsWith("/")?`${t}${e}`:`${t}/${e}`:""}function dV(e){let{link:t,openInNewWindow:l,router:o,isExternalLink:i,replace:n=!1}=e,r=e.setLocationHref??(e=>window.location.href=e),a=e.openWindow??((e,t)=>window.open(e,t));l?a(dB(t),"_blank"):i?r(t):o.navigate(t,{replace:n})}function dH(e){let{openInNewWindow:t,isExternalLink:l,viewType:o}=e;return!t&&!l&&"embed"!==o}dY.scene=aQ.s5.record,dY.define({label:(0,f.tExpr)("View"),sort:10});class dq extends aQ.S0{constructor(...e){super(...e),this.defaultProps={title:(0,f.tExpr)("Link"),icon:"LinkOutlined"}}}dq.scene=aQ.s5.all,dq.define({label:(0,f.tExpr)("Link")}),dq.registerFlow({key:"actionPanelLinkSettings",on:"click",steps:{click:{async handler(e,t){let{url:l,searchParams:o,openInNewWindow:i}=e.model.props,n=e.t;if(!l)return void e.message.warning(n("Please configure the URL"));let r=dO(l,o);if(r){let t=(0,L.isURL)(r),l=!!e.view&&dH({openInNewWindow:i,isExternalLink:t,viewType:e.view.type});dV({link:r,openInNewWindow:i,router:e.router,isExternalLink:t,replace:l}),l&&e.view.destroy()}else console.error("link should be a string")}}}}),dq.registerFlow({key:"linkButtonSettings",title:(0,f.tExpr)("Link action settings"),steps:{editLink:{title:(0,f.tExpr)("Edit link"),uiSchema(e){let t=e.t;return{url:{title:(0,f.tExpr)("URL"),type:"string","x-decorator":"FormItem","x-component":rP.n,description:t("Do not concatenate search params in the URL"),"x-reactions":{dependencies:["mode"],fulfill:{state:{hidden:'{{$deps[0] === "html"}}'}}},required:!0},searchParams:{type:"array","x-component":"ArrayItems","x-decorator":"FormItem",title:'{{t("Search parameters")}}',items:{type:"object",properties:{space:{type:"void","x-component":"Space","x-component-props":{style:{flexWrap:"nowrap",maxWidth:"100%",display:"flex"},className:(0,A.css)`
832
832
  & > .ant-space-item:first-child {
833
833
  flex: 3;
834
834
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/client-v2",
3
- "version": "2.2.26",
3
+ "version": "2.2.28",
4
4
  "license": "Apache-2.0",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.mjs",
@@ -27,11 +27,11 @@
27
27
  "@formily/antd-v5": "1.2.3",
28
28
  "@formily/react": "^2.2.27",
29
29
  "@formily/shared": "^2.2.27",
30
- "@nocobase/evaluators": "2.2.26",
31
- "@nocobase/flow-engine": "2.2.26",
32
- "@nocobase/sdk": "2.2.26",
33
- "@nocobase/shared": "2.2.26",
34
- "@nocobase/utils": "2.2.26",
30
+ "@nocobase/evaluators": "2.2.28",
31
+ "@nocobase/flow-engine": "2.2.28",
32
+ "@nocobase/sdk": "2.2.28",
33
+ "@nocobase/shared": "2.2.28",
34
+ "@nocobase/utils": "2.2.28",
35
35
  "ahooks": "^3.7.2",
36
36
  "antd": "5.24.2",
37
37
  "antd-style": "3.7.1",
@@ -49,5 +49,5 @@
49
49
  "react-router-dom": "^6.30.1",
50
50
  "zxing-wasm": "^3.1.3"
51
51
  },
52
- "gitHead": "6397a429659acd0c6be68866d5ce3e0088ad7235"
52
+ "gitHead": "10c2e583e426fc6f7b8918a817febad6354190b6"
53
53
  }
@@ -46,21 +46,23 @@ LinkActionModel.registerFlow({
46
46
 
47
47
  if (link) {
48
48
  const isExternalLink = isURL(link);
49
+ // embed 是页面容器,不应销毁;仅弹窗视图在站内同窗口跳转后销毁。
50
+ const shouldDestroyView =
51
+ !!ctx.view &&
52
+ shouldDestroyViewAfterLinkNavigation({
53
+ openInNewWindow,
54
+ isExternalLink,
55
+ viewType: ctx.view.type,
56
+ });
49
57
  handleLinkNavigation({
50
58
  link,
51
59
  openInNewWindow,
52
60
  router: ctx.router,
53
61
  isExternalLink,
62
+ // 弹窗会被销毁,用 replace 丢弃弹窗路由;页面(含移动端 embed)跳转需保留历史,以便逐级返回。
63
+ replace: shouldDestroyView,
54
64
  });
55
- // embed 是页面容器,不应销毁;仅弹窗视图在站内同窗口跳转后销毁。
56
- if (
57
- ctx.view &&
58
- shouldDestroyViewAfterLinkNavigation({
59
- openInNewWindow,
60
- isExternalLink,
61
- viewType: ctx.view.type,
62
- })
63
- ) {
65
+ if (shouldDestroyView) {
64
66
  ctx.view.destroy();
65
67
  }
66
68
  } else {
@@ -25,10 +25,11 @@ export function handleLinkNavigation(options: {
25
25
  openInNewWindow?: boolean;
26
26
  router: { navigate: (to: string, options?: { replace?: boolean }) => void };
27
27
  isExternalLink: boolean;
28
+ replace?: boolean;
28
29
  setLocationHref?: (url: string) => void;
29
30
  openWindow?: (url?: string, target?: string) => Window | null;
30
31
  }) {
31
- const { link, openInNewWindow, router, isExternalLink } = options;
32
+ const { link, openInNewWindow, router, isExternalLink, replace = false } = options;
32
33
  const setLocationHref = options.setLocationHref ?? ((url: string) => (window.location.href = url));
33
34
  const openWindow = options.openWindow ?? ((url?: string, target?: string) => window.open(url, target));
34
35
 
@@ -44,7 +45,8 @@ export function handleLinkNavigation(options: {
44
45
 
45
46
  // 该辅助方法仅负责导航,是否关闭弹窗由调用方按场景决定;
46
47
  // 在弹窗上下文中,错误的关闭时机会把新路由回滚为原页面。
47
- router.navigate(link, { replace: true });
48
+ // 默认 push 新的历史记录,保证浏览器/手机右滑返回能逐级回退;仅在需要丢弃当前弹窗路由时由调用方传 replace。
49
+ router.navigate(link, { replace });
48
50
  }
49
51
 
50
52
  /**
@@ -22,6 +22,20 @@ describe('handleLinkNavigation', () => {
22
22
  isExternalLink: false,
23
23
  });
24
24
 
25
+ expect(navigate).toHaveBeenCalledWith('/target-page', { replace: false });
26
+ });
27
+
28
+ it('should replace history entry when caller requests replace', () => {
29
+ const navigate = vi.fn();
30
+
31
+ handleLinkNavigation({
32
+ link: '/target-page',
33
+ openInNewWindow: false,
34
+ router: { navigate },
35
+ isExternalLink: false,
36
+ replace: true,
37
+ });
38
+
25
39
  expect(navigate).toHaveBeenCalledWith('/target-page', { replace: true });
26
40
  });
27
41