@jswork/react-ant-resource-form 1.0.43 → 1.0.44
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/main.cjs.js +1 -1
- package/dist/main.cjs.js.map +1 -1
- package/dist/main.d.mts +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.esm.js +1 -1
- package/dist/main.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +2 -1
package/dist/main.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var $=Object.defineProperty,J=Object.defineProperties;var Q=Object.getOwnPropertyDescriptors;var x=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable;var P=(i,r,e)=>r in i?$(i,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[r]=e,c=(i,r)=>{for(var e in r||(r={}))q.call(r,e)&&P(i,e,r[e]);if(x)for(var e of x(r))z.call(r,e)&&P(i,e,r[e]);return i},T=(i,r)=>J(i,Q(r)),d=(i,r)=>$(i,"name",{value:r,configurable:!0});var A=(i,r)=>{var e={};for(var t in i)q.call(i,t)&&r.indexOf(t)<0&&(e[t]=i[t]);if(i!=null&&x)for(var t of x(i))r.indexOf(t)<0&&z.call(i,t)&&(e[t]=i[t]);return e};var k=(i,r,e)=>P(i,typeof r!="symbol"?r+"":r,e);var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames);var _react = require('react'); var _react2 = _interopRequireDefault(_react);var _antd = require('antd');var _reactantformschema = require('@jswork/react-ant-form-schema'); var _reactantformschema2 = _interopRequireDefault(_reactantformschema);var _icons = require('@ant-design/icons');var _fastdeepequal = require('fast-deep-equal'); var _fastdeepequal2 = _interopRequireDefault(_fastdeepequal);var w={"zh-CN":{create:"\u521B\u5EFA",update:"\u4FDD\u5B58",create_title:"\u521B\u5EFA",update_title:"\u66F4\u65B0",create_success:"\u521B\u5EFA\u6210\u529F",update_success:"\u66F4\u65B0\u6210\u529F",submit:"\u63D0\u4EA4",back:"\u8FD4\u56DE",no_change:"\u6CA1\u6709\u4FEE\u6539",blocker_title:"\u786E\u8BA4\u79BB\u5F00",blocker_message:"\u60A8\u6709\u672A\u4FDD\u5B58\u7684\u66F4\u6539\uFF0C\u786E\u5B9A\u8981\u79BB\u5F00\u5417\uFF1F",blocker_confirm:"\u79BB\u5F00",blocker_cancel:"\u53D6\u6D88"},"en-US":{create:"Create",update:"Save",create_title:"Create",update_title:"Update",create_success:"Create success",update_success:"Update success",submit:"Submit",back:"Back",no_change:"No change",blocker_title:"Confirm Leave",blocker_message:"You have unsaved changes. Are you sure you want to leave?",blocker_confirm:"Leave",blocker_cancel:"Cancel"}};var _next = require('@jswork/next'); var _next2 = _interopRequireDefault(_next);require('@jswork/next-compact-object');function U(i,r={}){if(!i||typeof i!="object"||Array.isArray(i))return{};let{include:e,exclude:t}=r,s=c({},i);if(Array.isArray(e)&&e.length>0){let n={},o={};for(let a=0;a<e.length;a++)o[e[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&o[a]&&(n[a]=s[a]);s=n}if(Array.isArray(t)&&t.length>0){let n={},o={};for(let a=0;a<t.length;a++)o[t[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&!o[a]&&(n[a]=s[a]);s=n}return s}d(U,"filterPayload");var G="react-ant-resource-form",E,re=(E=class extends _react.Component{constructor(e){var t;super(e);k(this,"formRef",_react2.default.createRef());k(this,"_isMounted",!1);k(this,"_initialValues",null);k(this,"handleBack",d(()=>{history.back()},"handleBack"));k(this,"setInitialValues",d(()=>{var e;this._initialValues=(e=this.formInstance)==null?void 0:e.getFieldsValue()},"setInitialValues"));k(this,"handleFinish",d(e=>{if(!this.canSave){this.msg(this.t("no_change"),"info");return}this.isEdit?this.onResourceUpdate(e):this.onResourceCreate(e)},"handleFinish"));k(this,"onResourceUpdate",d(e=>{let{params:t,name:s,submitGuard:n,onMutate:o}=this.props,a=c(c({id:t.id},e),t),f=this.handleStateRequest({stage:"update",payload:a}),u={name:s,payload:f,isEdit:!0,values:e,params:t},_={name:s,payload:f,isEdit:!0,values:e};n==null||n(u).then(()=>{_next2.default.$api[`${s}_update`](f).then(l=>{this.msg(this.t("update_success")),this.handleStateResponse({stage:"update",data:l}),o==null||o(T(c({},_),{data:l}))}).finally(()=>{var l,g;this.setState({loading:!1}),this.setInitialValues(),(g=(l=this.props).onTouchedChange)==null||g.call(l,!1)})})},"onResourceUpdate"));k(this,"onResourceCreate",d(e=>{let{params:t,name:s,disableBackWhenEdit:n,submitGuard:o,onMutate:a}=this.props,f=c(c({},e),t),u=this.handleStateRequest({stage:"create",payload:f}),_={name:s,payload:u,isEdit:!1,values:e,params:t},l={name:s,payload:u,isEdit:!1,values:e};o==null||o(_).then(()=>{_next2.default.$api[`${s}_create`](u).then(g=>{var C,b,y;this.msg(this.t("create_success")),this.handleStateResponse({stage:"create",data:g}),(C=this.formInstance)==null||C.resetFields(),a==null||a(T(c({},l),{data:g})),(y=(b=this.props).onTouchedChange)==null||y.call(b,!1),n||history.back()}).finally(()=>this.setState({loading:!1}))})},"onResourceCreate"));k(this,"handleKeydown",d(e=>{var n;let{disableHotkeySave:t}=this.props;(e.ctrlKey||e.metaKey)&&(e.key==="s"||e.key==="S")&&(e.preventDefault(),t||(n=this.formInstance)==null||n.submit())},"handleKeydown"));k(this,"handleValuesChange",d((e,t)=>{var s,n;if(this._isMounted&&this._initialValues!==null){let o=!_fastdeepequal2.default.call(void 0, this._initialValues,t);this.setState({touched:o}),(n=(s=this.props).onTouchedChange)==null||n.call(s,o)}},"handleValuesChange"));this.state={loading:e.loading,touched:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this),(t=e.onInit)==null||t.call(e,this)}get isEdit(){let{params:e}=this.props;return!!(e!=null&&e.id)}get canSave(){let{touched:e,loading:t}=this.state;return this.isEdit?e&&!t:!t}get titleView(){let{title:e}=this.props,t=e||(this.isEdit?this.t("update_title"):this.t("create_title"));return _react2.default.createElement(_antd.Space,null,t,_react2.default.createElement("span",null,this.touchedView))}get touchedView(){return this.isEdit&&this.state.touched?_react2.default.createElement("em",{style:{color:"#f60"}},_react2.default.createElement(_icons.DiffOutlined,null)):null}get extraView(){let{extra:e,backText:t,backProps:s}=this.props;return e||_react2.default.createElement(_antd.Button,c({size:"small",icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:this.handleBack},s),t||this.t("back"))}get childrenView(){let{okText:e,backText:t,okProps:s,backProps:n,children:o}=this.props,a=e||(this.isEdit?this.t("update"):this.t("create"));return o||_react2.default.createElement(_antd.Space,null,_react2.default.createElement(_antd.Button,c({disabled:!this.canSave,htmlType:"submit",type:"primary",icon:_react2.default.createElement(_icons.SaveOutlined,null)},s),a||this.t("submit")),_react2.default.createElement(_antd.Button,c({icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:this.handleBack},n),t||this.t("back")))}get formInstance(){var e;return(e=this.formRef)==null?void 0:e.current}t(e){let{lang:t}=this.props;return w[t][e]}msg(e,t="success"){let{mute:s}=this.props;s||_antd.message[t](e)}handleStateRequest(e){let{payloadFields:t,transformRequest:s}=this.props;this.setState({loading:!0});let n=(s==null?void 0:s(e))||e.payload;return U(n,t)}handleStateResponse(e){var s,n,o,a;let{name:t}=this.props;return this.setState({loading:!1}),(n=(s=_next2.default.$event)==null?void 0:s.emit)==null||n.call(s,`${t}:refetch`),((a=(o=this.props).transformResponse)==null?void 0:a.call(o,e))||e.data}componentDidMount(){this._isMounted=!0,window.addEventListener("keydown",this.handleKeydown),this.initDetailIfNeeded()}componentDidUpdate(e){var n,o;let t=(n=e.params)==null?void 0:n.id,s=(o=this.props.params)==null?void 0:o.id;t!==s&&this.initDetailIfNeeded(),e.loading!==this.props.loading&&this.setState({loading:this.props.loading})}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:e,name:t,initGuard:s}=this.props,n=`${t}_show`;if(this.isEdit){let o={id:e.id},a=this.handleStateRequest({stage:"show",payload:o}),f={name:t,payload:a,isEdit:!0,params:e};s==null||s(f).then(()=>{_next2.default.$api[n](a).then(u=>{var l,g;if(!this._isMounted)return;let _=this.handleStateResponse({stage:"show",data:u});(g=(l=this.formInstance)==null?void 0:l.setFieldsValue)==null||g.call(l,_)}).finally(()=>{var u,_;this.setState({loading:!1}),this.setInitialValues(),(_=(u=this.props).onTouchedChange)==null||_.call(u,!1)})})}else{let o={name:t,payload:null,isEdit:!1,params:e};s==null||s(o).then(()=>{var a,f;this.setInitialValues(),this.setState({loading:!1}),(f=(a=this.props).onTouchedChange)==null||f.call(a,!1)})}}render(){let D=this.props,{className:e,name:t,meta:s,children:n,lang:o,title:a,extra:f,size:u,okText:_,backText:l,okProps:g,backProps:C,classNames:b,params:y,transformRequest:h,transformResponse:B,disableHotkeySave:L,disableBackWhenEdit:F,blocker:m,mute:S,onInit:M,onMutate:O,initGuard:ge,submitGuard:ke,loading:_e,payloadFields:ye,onTouchedChange:Se}=D,j=A(D,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave","disableBackWhenEdit","blocker","mute","onInit","onMutate","initGuard","submitGuard","loading","payloadFields","onTouchedChange"]);return _react2.default.createElement(_antd.Card,{title:this.titleView,extra:this.extraView,size:u,classNames:b,"data-component":G,"data-blocker":m,className:_classnames2.default.call(void 0, G,e)},_react2.default.createElement(_antd.Spin,{spinning:this.state.loading},_react2.default.createElement(_reactantformschema2.default,c({meta:s,ref:this.formRef,onValuesChange:this.handleValuesChange,onFinish:this.handleFinish},j),this.childrenView)))}},d(E,"ReactAntResourceForm"),k(E,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1,disableBackWhenEdit:!1,blocker:!1,mute:!1,initGuard:d(()=>Promise.resolve(),"initGuard"),submitGuard:d(()=>Promise.resolve(),"submitGuard"),payloadFields:{include:[],exclude:[]}}),E),V=re;var _reactrouterdom = require('react-router-dom');var _fromentries = require('fromentries'); var _fromentries2 = _interopRequireDefault(_fromentries);var me=d((i,r)=>(_next2.default.forIn(i,e=>{r.includes(e)||delete i[e]}),i),"retainKeys"),pe=d(i=>{let F=i,{params:r,allowFields:e,disableBlocker:t,blockerMessage:s,lang:n="zh-CN"}=F,o=A(F,["params","allowFields","disableBlocker","blockerMessage","lang"]),a=_reactrouterdom.useParams.call(void 0, ),[f]=_reactrouterdom.useSearchParams.call(void 0, ),[u,_]=_react.useState.call(void 0, !1),[l,g]=_react.useState.call(void 0, !1),C=_fromentries2.default.call(void 0, f),b=_next2.default.compactObject(c(c(c({},C),a),r));e!=null&&e.length&&me(b,e);let y=_react.useCallback.call(void 0, m=>{var S;return((S=w[n])==null?void 0:S[m])||w["zh-CN"][m]},[n]),h=_reactrouterdom.useBlocker.call(void 0, _react.useCallback.call(void 0, ({currentLocation:m,nextLocation:S})=>{let M=!!u,O=m.pathname!==S.pathname;return t!==!0&&M&&O},[u,t]));_react2.default.useEffect(()=>{h.state==="blocked"&&!l?g(!0):(h.state==="proceeding"||h.state==="unblocked")&&l&&g(!1)},[h.state,l]);let B=_react.useCallback.call(void 0, ()=>{var m;(m=h.proceed)==null||m.call(h)},[h]),L=_react.useCallback.call(void 0, ()=>{var m;(m=h.reset)==null||m.call(h)},[h]);return _react2.default.createElement(_react2.default.Fragment,null,_react2.default.createElement(V,c({params:b,lang:n,onTouchedChange:d(m=>{var S;_(m),!m&&h.state==="blocked"&&((S=h.proceed)==null||S.call(h))},"onTouchedChange")},o)),_react2.default.createElement(_antd.Modal,{title:y("blocker_title"),open:l,onOk:B,onCancel:L,okText:y("blocker_confirm"),cancelText:y("blocker_cancel")},_react2.default.createElement("p",null,s||y("blocker_message"))))},"ReactAntResourceFormFc"),fe= exports.ReactAntResourceFormFc =pe;var Ye=V;exports.ReactAntResourceFormFc = fe; exports.default = Ye;
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var $=Object.defineProperty,J=Object.defineProperties;var Q=Object.getOwnPropertyDescriptors;var A=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable;var P=(i,r,e)=>r in i?$(i,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[r]=e,c=(i,r)=>{for(var e in r||(r={}))q.call(r,e)&&P(i,e,r[e]);if(A)for(var e of A(r))z.call(r,e)&&P(i,e,r[e]);return i},T=(i,r)=>J(i,Q(r)),h=(i,r)=>$(i,"name",{value:r,configurable:!0});var I=(i,r)=>{var e={};for(var t in i)q.call(i,t)&&r.indexOf(t)<0&&(e[t]=i[t]);if(i!=null&&A)for(var t of A(i))r.indexOf(t)<0&&z.call(i,t)&&(e[t]=i[t]);return e};var k=(i,r,e)=>P(i,typeof r!="symbol"?r+"":r,e);var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames);var _react = require('react'); var _react2 = _interopRequireDefault(_react);var _antd = require('antd');var _reactantformschema = require('@jswork/react-ant-form-schema'); var _reactantformschema2 = _interopRequireDefault(_reactantformschema);var _icons = require('@ant-design/icons');var _fastdeepequal = require('fast-deep-equal'); var _fastdeepequal2 = _interopRequireDefault(_fastdeepequal);var w={"zh-CN":{create:"\u521B\u5EFA",update:"\u4FDD\u5B58",create_title:"\u521B\u5EFA",update_title:"\u66F4\u65B0",create_success:"\u521B\u5EFA\u6210\u529F",update_success:"\u66F4\u65B0\u6210\u529F",submit:"\u63D0\u4EA4",back:"\u8FD4\u56DE",no_change:"\u6CA1\u6709\u4FEE\u6539",blocker_title:"\u786E\u8BA4\u79BB\u5F00",blocker_message:"\u60A8\u6709\u672A\u4FDD\u5B58\u7684\u66F4\u6539\uFF0C\u786E\u5B9A\u8981\u79BB\u5F00\u5417\uFF1F",blocker_confirm:"\u79BB\u5F00",blocker_cancel:"\u53D6\u6D88"},"en-US":{create:"Create",update:"Save",create_title:"Create",update_title:"Update",create_success:"Create success",update_success:"Update success",submit:"Submit",back:"Back",no_change:"No change",blocker_title:"Confirm Leave",blocker_message:"You have unsaved changes. Are you sure you want to leave?",blocker_confirm:"Leave",blocker_cancel:"Cancel"}};var _next = require('@jswork/next'); var _next2 = _interopRequireDefault(_next);require('@jswork/next-compact-object');function U(i,r={}){if(!i||typeof i!="object"||Array.isArray(i))return{};let{include:e,exclude:t}=r,s=c({},i);if(Array.isArray(e)&&e.length>0){let n={},o={};for(let a=0;a<e.length;a++)o[e[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&o[a]&&(n[a]=s[a]);s=n}if(Array.isArray(t)&&t.length>0){let n={},o={};for(let a=0;a<t.length;a++)o[t[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&!o[a]&&(n[a]=s[a]);s=n}return s}h(U,"filterPayload");var G="react-ant-resource-form",E,re=(E=class extends _react.Component{constructor(e){var t;super(e);k(this,"formRef",_react2.default.createRef());k(this,"_isMounted",!1);k(this,"_initialValues",null);k(this,"handleBack",h(()=>{_next2.default.$nav(-1)},"handleBack"));k(this,"setInitialValues",h(()=>{var e;this._initialValues=(e=this.formInstance)==null?void 0:e.getFieldsValue()},"setInitialValues"));k(this,"handleFinish",h(e=>{if(!this.canSave){this.msg(this.t("no_change"),"info");return}this.isEdit?this.onResourceUpdate(e):this.onResourceCreate(e)},"handleFinish"));k(this,"onResourceUpdate",h(e=>{let{params:t,name:s,submitGuard:n,onMutate:o}=this.props,a=c(c({id:t.id},e),t),f=this.handleStateRequest({stage:"update",payload:a}),u={name:s,payload:f,isEdit:!0,values:e,params:t},_={name:s,payload:f,isEdit:!0,values:e};n==null||n(u).then(()=>{_next2.default.$api[`${s}_update`](f).then(l=>{this.msg(this.t("update_success")),this.handleStateResponse({stage:"update",data:l}),o==null||o(T(c({},_),{data:l}))}).finally(()=>{var l,g;this.setState({loading:!1}),this.setInitialValues(),(g=(l=this.props).onTouchedChange)==null||g.call(l,!1)})})},"onResourceUpdate"));k(this,"onResourceCreate",h(e=>{let{params:t,name:s,disableBackWhenEdit:n,submitGuard:o,onMutate:a}=this.props,f=c(c({},e),t),u=this.handleStateRequest({stage:"create",payload:f}),_={name:s,payload:u,isEdit:!1,values:e,params:t},l={name:s,payload:u,isEdit:!1,values:e};o==null||o(_).then(()=>{_next2.default.$api[`${s}_create`](u).then(g=>{var C,b,y;this.msg(this.t("create_success")),this.handleStateResponse({stage:"create",data:g}),(C=this.formInstance)==null||C.resetFields(),a==null||a(T(c({},l),{data:g})),(y=(b=this.props).onTouchedChange)==null||y.call(b,!1),n||history.back()}).finally(()=>this.setState({loading:!1}))})},"onResourceCreate"));k(this,"handleKeydown",h(e=>{var n;let{disableHotkeySave:t}=this.props;(e.ctrlKey||e.metaKey)&&(e.key==="s"||e.key==="S")&&(e.preventDefault(),t||(n=this.formInstance)==null||n.submit())},"handleKeydown"));k(this,"handleValuesChange",h((e,t)=>{var s,n;if(this._isMounted&&this._initialValues!==null){let o=!_fastdeepequal2.default.call(void 0, this._initialValues,t);this.setState({touched:o}),(n=(s=this.props).onTouchedChange)==null||n.call(s,o)}},"handleValuesChange"));this.state={loading:e.loading,touched:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this),(t=e.onInit)==null||t.call(e,this)}get isEdit(){let{params:e}=this.props;return!!(e!=null&&e.id)}get canSave(){let{touched:e,loading:t}=this.state;return this.isEdit?e&&!t:!t}get titleView(){let{title:e}=this.props,t=e||(this.isEdit?this.t("update_title"):this.t("create_title"));return _react2.default.createElement(_antd.Space,null,t,_react2.default.createElement("span",null,this.touchedView))}get touchedView(){return this.isEdit&&this.state.touched?_react2.default.createElement("em",{style:{color:"#f60"}},_react2.default.createElement(_icons.DiffOutlined,null)):null}get extraView(){let{extra:e,backText:t,backProps:s}=this.props;return e||_react2.default.createElement(_antd.Button,c({size:"small",icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:this.handleBack},s),t||this.t("back"))}get childrenView(){let{okText:e,backText:t,okProps:s,backProps:n,children:o}=this.props,a=e||(this.isEdit?this.t("update"):this.t("create"));return o||_react2.default.createElement(_antd.Space,null,_react2.default.createElement(_antd.Button,c({disabled:!this.canSave,htmlType:"submit",type:"primary",icon:_react2.default.createElement(_icons.SaveOutlined,null)},s),a||this.t("submit")),_react2.default.createElement(_antd.Button,c({icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:this.handleBack},n),t||this.t("back")))}get formInstance(){var e;return(e=this.formRef)==null?void 0:e.current}t(e){let{lang:t}=this.props;return w[t][e]}msg(e,t="success"){let{mute:s}=this.props;s||_antd.message[t](e)}handleStateRequest(e){let{payloadFields:t,transformRequest:s}=this.props;this.setState({loading:!0});let n=(s==null?void 0:s(e))||e.payload;return U(n,t)}handleStateResponse(e){var s,n,o,a;let{name:t}=this.props;return this.setState({loading:!1}),(n=(s=_next2.default.$event)==null?void 0:s.emit)==null||n.call(s,`${t}:refetch`),((a=(o=this.props).transformResponse)==null?void 0:a.call(o,e))||e.data}componentDidMount(){this._isMounted=!0,window.addEventListener("keydown",this.handleKeydown),this.initDetailIfNeeded()}componentDidUpdate(e){var n,o;let t=(n=e.params)==null?void 0:n.id,s=(o=this.props.params)==null?void 0:o.id;t!==s&&this.initDetailIfNeeded(),e.loading!==this.props.loading&&this.setState({loading:this.props.loading})}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:e,name:t,initGuard:s}=this.props,n=`${t}_show`;if(this.isEdit){let o={id:e.id},a=this.handleStateRequest({stage:"show",payload:o}),f={name:t,payload:a,isEdit:!0,params:e};s==null||s(f).then(()=>{_next2.default.$api[n](a).then(u=>{var l,g;if(!this._isMounted)return;let _=this.handleStateResponse({stage:"show",data:u});(g=(l=this.formInstance)==null?void 0:l.setFieldsValue)==null||g.call(l,_)}).finally(()=>{var u,_;this.setState({loading:!1}),this.setInitialValues(),(_=(u=this.props).onTouchedChange)==null||_.call(u,!1)})})}else{let o={name:t,payload:null,isEdit:!1,params:e};s==null||s(o).then(()=>{var a,f;this.setInitialValues(),this.setState({loading:!1}),(f=(a=this.props).onTouchedChange)==null||f.call(a,!1)})}}render(){let D=this.props,{className:e,name:t,meta:s,children:n,lang:o,title:a,extra:f,size:u,okText:_,backText:l,okProps:g,backProps:C,classNames:b,params:y,transformRequest:d,transformResponse:B,disableHotkeySave:L,disableBackWhenEdit:F,blocker:m,mute:S,onInit:M,onMutate:O,initGuard:ge,submitGuard:ke,loading:_e,payloadFields:ye,onTouchedChange:Se}=D,j=I(D,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave","disableBackWhenEdit","blocker","mute","onInit","onMutate","initGuard","submitGuard","loading","payloadFields","onTouchedChange"]);return _react2.default.createElement(_antd.Card,{title:this.titleView,extra:this.extraView,size:u,classNames:b,"data-component":G,"data-blocker":m,className:_classnames2.default.call(void 0, G,e)},_react2.default.createElement(_antd.Spin,{spinning:this.state.loading},_react2.default.createElement(_reactantformschema2.default,c({meta:s,ref:this.formRef,onValuesChange:this.handleValuesChange,onFinish:this.handleFinish},j),this.childrenView)))}},h(E,"ReactAntResourceForm"),k(E,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1,disableBackWhenEdit:!1,blocker:!1,mute:!1,initGuard:h(()=>Promise.resolve(),"initGuard"),submitGuard:h(()=>Promise.resolve(),"submitGuard"),payloadFields:{include:[],exclude:[]}}),E),v=re;var _reactrouterdom = require('react-router-dom');var _fromentries = require('fromentries'); var _fromentries2 = _interopRequireDefault(_fromentries);var me=h((i,r)=>(_next2.default.forIn(i,e=>{r.includes(e)||delete i[e]}),i),"retainKeys"),pe=h(i=>{let F=i,{params:r,allowFields:e,disableBlocker:t,blockerMessage:s,lang:n="zh-CN"}=F,o=I(F,["params","allowFields","disableBlocker","blockerMessage","lang"]),a=_reactrouterdom.useParams.call(void 0, ),[f]=_reactrouterdom.useSearchParams.call(void 0, ),[u,_]=_react.useState.call(void 0, !1),[l,g]=_react.useState.call(void 0, !1),C=_fromentries2.default.call(void 0, f),b=_next2.default.compactObject(c(c(c({},C),a),r));e!=null&&e.length&&me(b,e);let y=_react.useCallback.call(void 0, m=>{var S;return((S=w[n])==null?void 0:S[m])||w["zh-CN"][m]},[n]),d=_reactrouterdom.useBlocker.call(void 0, _react.useCallback.call(void 0, ({currentLocation:m,nextLocation:S})=>{let M=!!u,O=m.pathname!==S.pathname;return t!==!0&&M&&O},[u,t]));_react2.default.useEffect(()=>{d.state==="blocked"&&!l?g(!0):(d.state==="proceeding"||d.state==="unblocked")&&l&&g(!1)},[d.state,l]);let B=_react.useCallback.call(void 0, ()=>{var m;(m=d.proceed)==null||m.call(d)},[d]),L=_react.useCallback.call(void 0, ()=>{var m;(m=d.reset)==null||m.call(d)},[d]);return _react2.default.createElement(_react2.default.Fragment,null,_react2.default.createElement(v,c({params:b,lang:n,onTouchedChange:h(m=>{var S;_(m),!m&&d.state==="blocked"&&((S=d.proceed)==null||S.call(d))},"onTouchedChange")},o)),_react2.default.createElement(_antd.Modal,{title:y("blocker_title"),open:l,onOk:B,onCancel:L,okText:y("blocker_confirm"),cancelText:y("blocker_cancel")},_react2.default.createElement("p",null,s||y("blocker_message"))))},"ReactAntResourceFormFc"),fe= exports.ReactAntResourceFormFc =pe;var Ye=v;exports.ReactAntResourceFormFc = fe; exports.default = Ye;
|
|
2
2
|
//# sourceMappingURL=main.cjs.js.map
|
package/dist/main.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/feizheng/github/react-ant-resource-form/packages/lib/dist/main.cjs.js","../src/index.tsx","../src/locales.ts","../src/utils.ts"],"names":["API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","submit","back","no_change","blocker_title","blocker_message","blocker_confirm","blocker_cancel","filterPayload","payload","config","Array","isArray","include","exclude","result","__spreadValues","length","allowed","includeSet","i","key","hasOwnProperty","final","excludeSet","CLASS_NAME","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","_initialValues","handleBack","__name","history","setInitialValues","formInstance","getFieldsValue","handleFinish","values","canSave","msg","t","isEdit","onResourceUpdate","onResourceCreate","params","name","submitGuard","onMutate","id","_payload","handleStateRequest","stage","submitGuardArgs","mutateArgs","then","nx","$api"],"mappings":"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","file":"/Users/feizheng/github/react-ant-resource-form/packages/lib/dist/main.cjs.js","sourcesContent":[null,"// import noop from '@jswork/noop';\nimport cx from 'classnames';\nimport React, { Component } from 'react';\nimport { ButtonProps, CardProps, FormInstance } from 'antd';\nimport { Button, Card, message, Space, Spin } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, DiffOutlined, SaveOutlined } from '@ant-design/icons';\nimport deepEqual from 'fast-deep-equal';\nimport {\n InitGuardArgs,\n MsgType,\n MutateArgs,\n StageData,\n StagePayload,\n SubmitGuardArgs,\n} from './types';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\nimport '@jswork/next-compact-object';\nimport { filterPayload } from './utils';\n\ndeclare global {\n interface NxStatic {\n $api: Record<string, any>;\n $event: any;\n }\n}\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nexport type ReactAntResourceFormProps = {\n name?: string;\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n params?: Record<string, any>;\n blocker?: boolean;\n mute?: boolean;\n disableHotkeySave?: boolean;\n disableBackWhenEdit?: boolean;\n initGuard?: (args: InitGuardArgs) => Promise<void>;\n submitGuard?: (args: SubmitGuardArgs) => Promise<void>;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n classNames?: CardProps['classNames'];\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n onInit?: (ctx: ReactAntResourceForm) => void;\n onMutate?: (args: MutateArgs) => void;\n onTouchedChange?: (touched: boolean) => void;\n payloadFields?: { include?: string[]; exclude?: string[] }\n} & ReactAntdFormSchemaProps;\n\nexport type IState = {\n loading: boolean;\n touched: boolean;\n};\n\n/**\n * 当前 card loading 不要直接使用,因为这个 loading 会导致 Card 里的 formRef 被设置成 null\n * 这个情况仅在 class component 里才会出现,function component 里不会:\n * 报错示例:\n *\n * this.formRef?: null\n * index.tsx:229 this.formRef?: {getFieldValue: ƒ, getFieldsValue: ƒ, getFieldError: ƒ, getFieldWarning: ƒ, getFieldsError: ƒ, …}\n * index.tsx:229 this.formRef?: null\n *\n * initGuard | submitGuard:\n * https://chat.qwen.ai/c/60329863-0e5e-47f9-a075-a65ad30940cc\n *\n * onMutate:\n * 在 create/update 成功后,需要刷新列表,可以用 onMutate 继续后续处理。\n *\n * blocker:\n * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。\n * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor\n *\n * transformRequest:\n * 当你提交表单的时候,需要对参数进行一些预处理,比如加密,或者添加一些默认值,这个时候就可以用 transformRequest。\n */\n\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n disableBackWhenEdit: false,\n blocker: false,\n mute: false,\n initGuard: () => Promise.resolve(),\n submitGuard: () => Promise.resolve(),\n payloadFields: { include: [], exclude: [] },\n };\n\n private formRef = React.createRef<FormInstance>(); // 注意类型\n private _isMounted = false;\n private _initialValues = null;\n\n get isEdit() {\n const { params } = this.props;\n return Boolean(params?.id);\n }\n\n get canSave() {\n const { touched, loading } = this.state;\n if (!this.isEdit) return !loading;\n return touched && !loading;\n }\n\n get titleView() {\n const { title } = this.props;\n const _title = title || (this.isEdit ? this.t('update_title') : this.t('create_title'));\n return (\n <Space>\n {_title}\n <span>{this.touchedView}</span>\n </Space>\n );\n }\n\n get touchedView() {\n if (!this.isEdit) return null;\n return this.state.touched ? (\n <em style={{ color: '#f60' }}>\n <DiffOutlined />\n </em>\n ) : null;\n }\n\n get extraView() {\n const { extra, backText, backProps } = this.props;\n if (extra) return extra;\n return (\n <Button size=\"small\" icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n );\n }\n\n get childrenView() {\n const { okText, backText, okProps, backProps, children } = this.props;\n const _okText = okText || (this.isEdit ? this.t('update') : this.t('create'));\n if (children) return children;\n\n return (\n <Space>\n <Button\n disabled={!this.canSave}\n htmlType=\"submit\"\n type=\"primary\"\n icon={<SaveOutlined />}\n {...okProps}>\n {_okText || this.t('submit')}\n </Button>\n <Button icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n </Space>\n );\n }\n\n get formInstance() {\n return this.formRef?.current;\n }\n\n constructor(props: ReactAntResourceFormProps) {\n super(props);\n this.state = {\n loading: props.loading!,\n touched: false,\n };\n\n this.handleStateRequest = this.handleStateRequest.bind(this);\n this.handleStateResponse = this.handleStateResponse.bind(this);\n this.initDetailIfNeeded = this.initDetailIfNeeded.bind(this);\n\n props.onInit?.(this);\n }\n\n private t(key: string) {\n const { lang } = this.props;\n return API_FORM_LOCALES[lang!][key];\n }\n\n private msg(msg: string, type: MsgType = 'success') {\n const { mute } = this.props;\n if (!mute) message[type](msg);\n }\n\n private handleBack = () => {\n history.back();\n };\n\n private setInitialValues = () => {\n this._initialValues = this.formInstance?.getFieldsValue();\n };\n\n handleStateRequest(stagePayload: StagePayload) {\n const { payloadFields, transformRequest } = this.props;\n this.setState({ loading: true });\n const rawPayload = transformRequest?.(stagePayload) || stagePayload.payload;\n return filterPayload(rawPayload, payloadFields);\n }\n\n handleStateResponse(res: StageData) {\n const { name } = this.props;\n this.setState({ loading: false });\n nx.$event?.emit?.(`${name}:refetch`);\n return this.props.transformResponse?.(res) || res.data;\n }\n\n handleFinish = (values: any) => {\n if (!this.canSave) {\n this.msg(this.t('no_change'), 'info');\n return;\n }\n this.isEdit ? this.onResourceUpdate(values) : this.onResourceCreate(values);\n };\n\n private onResourceUpdate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { id: params!.id, ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'update', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n params,\n };\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_update`](_payload)\n .then((res: any) => {\n this.msg(this.t('update_success'));\n this.handleStateResponse({ stage: 'update', data: res });\n onMutate?.({ ...mutateArgs, data: res });\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.props.onTouchedChange?.(false);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, disableBackWhenEdit, submitGuard, onMutate } = this.props;\n const payload = { ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'create', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n params,\n };\n\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_create`](_payload)\n .then((res: any) => {\n this.msg(this.t('create_success'));\n this.handleStateResponse({ stage: 'create', data: res });\n this.formInstance?.resetFields();\n onMutate?.({ ...mutateArgs, data: res });\n this.props.onTouchedChange?.(false);\n if (!disableBackWhenEdit) history.back();\n })\n .finally(() => this.setState({ loading: false }));\n });\n };\n\n // hotkey save handler (replaces useKeyboardSave hook)\n handleKeydown = (e: KeyboardEvent) => {\n const { disableHotkeySave } = this.props;\n const isSave = (e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S');\n if (isSave) {\n e.preventDefault();\n if (!disableHotkeySave) {\n this.formInstance?.submit();\n }\n }\n };\n\n handleValuesChange = (_: any, allValues: any) => {\n if (this._isMounted && this._initialValues !== null) {\n const newTouched = !deepEqual(this._initialValues, allValues);\n this.setState({\n touched: newTouched,\n });\n this.props.onTouchedChange?.(newTouched);\n }\n };\n\n componentDidMount() {\n this._isMounted = true;\n // attach hotkey listener\n window.addEventListener('keydown', this.handleKeydown);\n // initialize detail if editing\n this.initDetailIfNeeded();\n }\n\n componentDidUpdate(prevProps: ReactAntResourceFormProps) {\n const prevId = prevProps.params?.id;\n const curId = this.props.params?.id;\n // re-init when id changed or from create -> edit\n if (prevId !== curId) {\n this.initDetailIfNeeded();\n }\n\n // loading update\n if (prevProps.loading !== this.props.loading) {\n this.setState({ loading: this.props.loading! });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeydown);\n this._isMounted = false;\n }\n\n initDetailIfNeeded() {\n const { params, name, initGuard } = this.props;\n const resourceShow = `${name}_show`;\n\n if (this.isEdit) {\n const payload = { id: params!.id };\n const _payload = this.handleStateRequest({ stage: 'show', payload });\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n nx.$api[resourceShow](_payload)\n .then((res: any) => {\n if (!this._isMounted) return; // 👈 关键:防止操作已卸载组件\n const data = this.handleStateResponse({ stage: 'show', data: res });\n this.formInstance?.setFieldsValue?.(data);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.props.onTouchedChange?.(false);\n });\n });\n } else {\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: null,\n isEdit: false,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n this.setInitialValues();\n this.setState({ loading: false });\n this.props.onTouchedChange?.(false);\n });\n }\n }\n\n render() {\n const {\n className,\n name,\n meta,\n children,\n lang,\n title,\n extra,\n size,\n okText,\n backText,\n okProps,\n backProps,\n classNames,\n params,\n transformRequest,\n transformResponse,\n disableHotkeySave,\n disableBackWhenEdit,\n blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\n payloadFields,\n onTouchedChange,\n ...rest\n } = this.props;\n\n return (\n <Card\n title={this.titleView}\n extra={this.extraView}\n size={size}\n classNames={classNames}\n data-component={CLASS_NAME}\n data-blocker={blocker}\n className={cx(CLASS_NAME, className)}>\n <Spin spinning={this.state.loading}>\n <ReactAntdFormSchema\n meta={meta}\n ref={this.formRef}\n onValuesChange={this.handleValuesChange}\n onFinish={this.handleFinish}\n {...rest}>\n {this.childrenView}\n </ReactAntdFormSchema>\n </Spin>\n </Card>\n );\n }\n}\n\n\nexport default ReactAntResourceForm;\n","export const API_FORM_LOCALES = {\n 'zh-CN': {\n create: '创建',\n update: '保存',\n create_title: '创建',\n update_title: '更新',\n create_success: '创建成功',\n update_success: '更新成功',\n submit: '提交',\n back: '返回',\n no_change: '没有修改',\n blocker_title: '确认离开',\n blocker_message: '您有未保存的更改,确定要离开吗?',\n blocker_confirm: '离开',\n blocker_cancel: '取消',\n },\n 'en-US': {\n create: 'Create',\n update: 'Save',\n create_title: 'Create',\n update_title: 'Update',\n create_success: 'Create success',\n update_success: 'Update success',\n submit: 'Submit',\n back: 'Back',\n no_change: 'No change',\n blocker_title: 'Confirm Leave',\n blocker_message: 'You have unsaved changes. Are you sure you want to leave?',\n blocker_confirm: 'Leave',\n blocker_cancel: 'Cancel',\n },\n};\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 16:46:34\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-10-31 16:51:16\n *\n * AI(filterPayload): https://chat.qwen.ai/c/5213efdf-e88d-4367-9bd1-bd4d23af6223\n */\n\nexport interface PayloadFieldConfig {\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * 根据 include/exclude 规则过滤 payload 对象\n * @param payload 原始对象(会被浅拷贝,不修改原对象)\n * @param config 字段过滤配置\n * @returns 过滤后的新对象\n */\nexport function filterPayload(\n payload: Record<string, any> | null | undefined,\n config: PayloadFieldConfig = {},\n): Record<string, any> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return {};\n }\n\n const { include, exclude } = config;\n let result = { ...payload }; // 浅拷贝(ES5 兼容写法见下方备注)\n\n // --- include: 白名单 ---\n if (Array.isArray(include) && include.length > 0) {\n const allowed: Record<string, any> = {};\n const includeSet: Record<string, boolean> = {};\n for (let i = 0; i < include.length; i++) {\n includeSet[include[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && includeSet[key]) {\n allowed[key] = result[key];\n }\n }\n result = allowed;\n }\n\n // --- exclude: 黑名单 ---\n if (Array.isArray(exclude) && exclude.length > 0) {\n const final: Record<string, any> = {};\n const excludeSet: Record<string, boolean> = {};\n for (let i = 0; i < exclude.length; i++) {\n excludeSet[exclude[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && !excludeSet[key]) {\n final[key] = result[key];\n }\n }\n result = final;\n }\n\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/feizheng/github/react-ant-resource-form/packages/lib/dist/main.cjs.js","../src/index.tsx","../src/locales.ts","../src/utils.ts"],"names":["API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","submit","back","no_change","blocker_title","blocker_message","blocker_confirm","blocker_cancel","filterPayload","payload","config","Array","isArray","include","exclude","result","__spreadValues","length","allowed","includeSet","i","key","hasOwnProperty","final","excludeSet","CLASS_NAME","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","_initialValues","handleBack","__name","nx","$nav","setInitialValues","formInstance","getFieldsValue","handleFinish","values","canSave","msg","t","isEdit","onResourceUpdate","onResourceCreate","params","name","submitGuard","onMutate","id","_payload","handleStateRequest","stage","submitGuardArgs","mutateArgs","then","$api"],"mappings":"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","file":"/Users/feizheng/github/react-ant-resource-form/packages/lib/dist/main.cjs.js","sourcesContent":[null,"// import noop from '@jswork/noop';\nimport cx from 'classnames';\nimport React, { Component } from 'react';\nimport { ButtonProps, CardProps, FormInstance } from 'antd';\nimport { Button, Card, message, Space, Spin } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, DiffOutlined, SaveOutlined } from '@ant-design/icons';\nimport deepEqual from 'fast-deep-equal';\nimport {\n InitGuardArgs,\n MsgType,\n MutateArgs,\n StageData,\n StagePayload,\n SubmitGuardArgs,\n} from './types';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\nimport '@jswork/next-compact-object';\nimport { filterPayload } from './utils';\n\ndeclare global {\n interface NxStatic {\n $api: Record<string, any>;\n $event: any;\n $nav: any;\n }\n}\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nexport type ReactAntResourceFormProps = {\n name?: string;\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n params?: Record<string, any>;\n blocker?: boolean;\n mute?: boolean;\n disableHotkeySave?: boolean;\n disableBackWhenEdit?: boolean;\n initGuard?: (args: InitGuardArgs) => Promise<void>;\n submitGuard?: (args: SubmitGuardArgs) => Promise<void>;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n classNames?: CardProps['classNames'];\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n onInit?: (ctx: ReactAntResourceForm) => void;\n onMutate?: (args: MutateArgs) => void;\n onTouchedChange?: (touched: boolean) => void;\n payloadFields?: { include?: string[]; exclude?: string[] }\n} & ReactAntdFormSchemaProps;\n\nexport type IState = {\n loading: boolean;\n touched: boolean;\n};\n\n/**\n * 当前 card loading 不要直接使用,因为这个 loading 会导致 Card 里的 formRef 被设置成 null\n * 这个情况仅在 class component 里才会出现,function component 里不会:\n * 报错示例:\n *\n * this.formRef?: null\n * index.tsx:229 this.formRef?: {getFieldValue: ƒ, getFieldsValue: ƒ, getFieldError: ƒ, getFieldWarning: ƒ, getFieldsError: ƒ, …}\n * index.tsx:229 this.formRef?: null\n *\n * initGuard | submitGuard:\n * https://chat.qwen.ai/c/60329863-0e5e-47f9-a075-a65ad30940cc\n *\n * onMutate:\n * 在 create/update 成功后,需要刷新列表,可以用 onMutate 继续后续处理。\n *\n * blocker:\n * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。\n * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor\n *\n * transformRequest:\n * 当你提交表单的时候,需要对参数进行一些预处理,比如加密,或者添加一些默认值,这个时候就可以用 transformRequest。\n */\n\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n disableBackWhenEdit: false,\n blocker: false,\n mute: false,\n initGuard: () => Promise.resolve(),\n submitGuard: () => Promise.resolve(),\n payloadFields: { include: [], exclude: [] },\n };\n\n private formRef = React.createRef<FormInstance>(); // 注意类型\n private _isMounted = false;\n private _initialValues = null;\n\n get isEdit() {\n const { params } = this.props;\n return Boolean(params?.id);\n }\n\n get canSave() {\n const { touched, loading } = this.state;\n if (!this.isEdit) return !loading;\n return touched && !loading;\n }\n\n get titleView() {\n const { title } = this.props;\n const _title = title || (this.isEdit ? this.t('update_title') : this.t('create_title'));\n return (\n <Space>\n {_title}\n <span>{this.touchedView}</span>\n </Space>\n );\n }\n\n get touchedView() {\n if (!this.isEdit) return null;\n return this.state.touched ? (\n <em style={{ color: '#f60' }}>\n <DiffOutlined />\n </em>\n ) : null;\n }\n\n get extraView() {\n const { extra, backText, backProps } = this.props;\n if (extra) return extra;\n return (\n <Button size=\"small\" icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n );\n }\n\n get childrenView() {\n const { okText, backText, okProps, backProps, children } = this.props;\n const _okText = okText || (this.isEdit ? this.t('update') : this.t('create'));\n if (children) return children;\n\n return (\n <Space>\n <Button\n disabled={!this.canSave}\n htmlType=\"submit\"\n type=\"primary\"\n icon={<SaveOutlined />}\n {...okProps}>\n {_okText || this.t('submit')}\n </Button>\n <Button icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n </Space>\n );\n }\n\n get formInstance() {\n return this.formRef?.current;\n }\n\n constructor(props: ReactAntResourceFormProps) {\n super(props);\n this.state = {\n loading: props.loading!,\n touched: false,\n };\n\n this.handleStateRequest = this.handleStateRequest.bind(this);\n this.handleStateResponse = this.handleStateResponse.bind(this);\n this.initDetailIfNeeded = this.initDetailIfNeeded.bind(this);\n\n props.onInit?.(this);\n }\n\n private t(key: string) {\n const { lang } = this.props;\n return API_FORM_LOCALES[lang!][key];\n }\n\n private msg(msg: string, type: MsgType = 'success') {\n const { mute } = this.props;\n if (!mute) message[type](msg);\n }\n\n private handleBack = () => {\n nx.$nav(-1);\n };\n\n private setInitialValues = () => {\n this._initialValues = this.formInstance?.getFieldsValue();\n };\n\n handleStateRequest(stagePayload: StagePayload) {\n const { payloadFields, transformRequest } = this.props;\n this.setState({ loading: true });\n const rawPayload = transformRequest?.(stagePayload) || stagePayload.payload;\n return filterPayload(rawPayload, payloadFields);\n }\n\n handleStateResponse(res: StageData) {\n const { name } = this.props;\n this.setState({ loading: false });\n nx.$event?.emit?.(`${name}:refetch`);\n return this.props.transformResponse?.(res) || res.data;\n }\n\n handleFinish = (values: any) => {\n if (!this.canSave) {\n this.msg(this.t('no_change'), 'info');\n return;\n }\n this.isEdit ? this.onResourceUpdate(values) : this.onResourceCreate(values);\n };\n\n private onResourceUpdate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { id: params!.id, ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'update', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n params,\n };\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_update`](_payload)\n .then((res: any) => {\n this.msg(this.t('update_success'));\n this.handleStateResponse({ stage: 'update', data: res });\n onMutate?.({ ...mutateArgs, data: res });\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.props.onTouchedChange?.(false);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, disableBackWhenEdit, submitGuard, onMutate } = this.props;\n const payload = { ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'create', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n params,\n };\n\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_create`](_payload)\n .then((res: any) => {\n this.msg(this.t('create_success'));\n this.handleStateResponse({ stage: 'create', data: res });\n this.formInstance?.resetFields();\n onMutate?.({ ...mutateArgs, data: res });\n this.props.onTouchedChange?.(false);\n if (!disableBackWhenEdit) history.back();\n })\n .finally(() => this.setState({ loading: false }));\n });\n };\n\n // hotkey save handler (replaces useKeyboardSave hook)\n handleKeydown = (e: KeyboardEvent) => {\n const { disableHotkeySave } = this.props;\n const isSave = (e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S');\n if (isSave) {\n e.preventDefault();\n if (!disableHotkeySave) {\n this.formInstance?.submit();\n }\n }\n };\n\n handleValuesChange = (_: any, allValues: any) => {\n if (this._isMounted && this._initialValues !== null) {\n const newTouched = !deepEqual(this._initialValues, allValues);\n this.setState({\n touched: newTouched,\n });\n this.props.onTouchedChange?.(newTouched);\n }\n };\n\n componentDidMount() {\n this._isMounted = true;\n // attach hotkey listener\n window.addEventListener('keydown', this.handleKeydown);\n // initialize detail if editing\n this.initDetailIfNeeded();\n }\n\n componentDidUpdate(prevProps: ReactAntResourceFormProps) {\n const prevId = prevProps.params?.id;\n const curId = this.props.params?.id;\n // re-init when id changed or from create -> edit\n if (prevId !== curId) {\n this.initDetailIfNeeded();\n }\n\n // loading update\n if (prevProps.loading !== this.props.loading) {\n this.setState({ loading: this.props.loading! });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeydown);\n this._isMounted = false;\n }\n\n initDetailIfNeeded() {\n const { params, name, initGuard } = this.props;\n const resourceShow = `${name}_show`;\n\n if (this.isEdit) {\n const payload = { id: params!.id };\n const _payload = this.handleStateRequest({ stage: 'show', payload });\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n nx.$api[resourceShow](_payload)\n .then((res: any) => {\n if (!this._isMounted) return; // 👈 关键:防止操作已卸载组件\n const data = this.handleStateResponse({ stage: 'show', data: res });\n this.formInstance?.setFieldsValue?.(data);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.props.onTouchedChange?.(false);\n });\n });\n } else {\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: null,\n isEdit: false,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n this.setInitialValues();\n this.setState({ loading: false });\n this.props.onTouchedChange?.(false);\n });\n }\n }\n\n render() {\n const {\n className,\n name,\n meta,\n children,\n lang,\n title,\n extra,\n size,\n okText,\n backText,\n okProps,\n backProps,\n classNames,\n params,\n transformRequest,\n transformResponse,\n disableHotkeySave,\n disableBackWhenEdit,\n blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\n payloadFields,\n onTouchedChange,\n ...rest\n } = this.props;\n\n return (\n <Card\n title={this.titleView}\n extra={this.extraView}\n size={size}\n classNames={classNames}\n data-component={CLASS_NAME}\n data-blocker={blocker}\n className={cx(CLASS_NAME, className)}>\n <Spin spinning={this.state.loading}>\n <ReactAntdFormSchema\n meta={meta}\n ref={this.formRef}\n onValuesChange={this.handleValuesChange}\n onFinish={this.handleFinish}\n {...rest}>\n {this.childrenView}\n </ReactAntdFormSchema>\n </Spin>\n </Card>\n );\n }\n}\n\n\nexport default ReactAntResourceForm;\n","export const API_FORM_LOCALES = {\n 'zh-CN': {\n create: '创建',\n update: '保存',\n create_title: '创建',\n update_title: '更新',\n create_success: '创建成功',\n update_success: '更新成功',\n submit: '提交',\n back: '返回',\n no_change: '没有修改',\n blocker_title: '确认离开',\n blocker_message: '您有未保存的更改,确定要离开吗?',\n blocker_confirm: '离开',\n blocker_cancel: '取消',\n },\n 'en-US': {\n create: 'Create',\n update: 'Save',\n create_title: 'Create',\n update_title: 'Update',\n create_success: 'Create success',\n update_success: 'Update success',\n submit: 'Submit',\n back: 'Back',\n no_change: 'No change',\n blocker_title: 'Confirm Leave',\n blocker_message: 'You have unsaved changes. Are you sure you want to leave?',\n blocker_confirm: 'Leave',\n blocker_cancel: 'Cancel',\n },\n};\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 16:46:34\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-10-31 16:51:16\n *\n * AI(filterPayload): https://chat.qwen.ai/c/5213efdf-e88d-4367-9bd1-bd4d23af6223\n */\n\nexport interface PayloadFieldConfig {\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * 根据 include/exclude 规则过滤 payload 对象\n * @param payload 原始对象(会被浅拷贝,不修改原对象)\n * @param config 字段过滤配置\n * @returns 过滤后的新对象\n */\nexport function filterPayload(\n payload: Record<string, any> | null | undefined,\n config: PayloadFieldConfig = {},\n): Record<string, any> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return {};\n }\n\n const { include, exclude } = config;\n let result = { ...payload }; // 浅拷贝(ES5 兼容写法见下方备注)\n\n // --- include: 白名单 ---\n if (Array.isArray(include) && include.length > 0) {\n const allowed: Record<string, any> = {};\n const includeSet: Record<string, boolean> = {};\n for (let i = 0; i < include.length; i++) {\n includeSet[include[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && includeSet[key]) {\n allowed[key] = result[key];\n }\n }\n result = allowed;\n }\n\n // --- exclude: 黑名单 ---\n if (Array.isArray(exclude) && exclude.length > 0) {\n const final: Record<string, any> = {};\n const excludeSet: Record<string, boolean> = {};\n for (let i = 0; i < exclude.length; i++) {\n excludeSet[exclude[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && !excludeSet[key]) {\n final[key] = result[key];\n }\n }\n result = final;\n }\n\n return result;\n}\n"]}
|
package/dist/main.d.mts
CHANGED
package/dist/main.d.ts
CHANGED
package/dist/main.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var $=Object.defineProperty,J=Object.defineProperties;var Q=Object.getOwnPropertyDescriptors;var x=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable;var P=(i,r,e)=>r in i?$(i,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[r]=e,c=(i,r)=>{for(var e in r||(r={}))q.call(r,e)&&P(i,e,r[e]);if(x)for(var e of x(r))z.call(r,e)&&P(i,e,r[e]);return i},T=(i,r)=>J(i,Q(r)),d=(i,r)=>$(i,"name",{value:r,configurable:!0});var A=(i,r)=>{var e={};for(var t in i)q.call(i,t)&&r.indexOf(t)<0&&(e[t]=i[t]);if(i!=null&&x)for(var t of x(i))r.indexOf(t)<0&&z.call(i,t)&&(e[t]=i[t]);return e};var k=(i,r,e)=>P(i,typeof r!="symbol"?r+"":r,e);import X from"classnames";import p,{Component as Z}from"react";import{Button as N,Card as ee,message as te,Space as K,Spin as se}from"antd";import ae from"@jswork/react-ant-form-schema";import{ArrowLeftOutlined as W,DiffOutlined as ne,SaveOutlined as ie}from"@ant-design/icons";import oe from"fast-deep-equal";var w={"zh-CN":{create:"\u521B\u5EFA",update:"\u4FDD\u5B58",create_title:"\u521B\u5EFA",update_title:"\u66F4\u65B0",create_success:"\u521B\u5EFA\u6210\u529F",update_success:"\u66F4\u65B0\u6210\u529F",submit:"\u63D0\u4EA4",back:"\u8FD4\u56DE",no_change:"\u6CA1\u6709\u4FEE\u6539",blocker_title:"\u786E\u8BA4\u79BB\u5F00",blocker_message:"\u60A8\u6709\u672A\u4FDD\u5B58\u7684\u66F4\u6539\uFF0C\u786E\u5B9A\u8981\u79BB\u5F00\u5417\uFF1F",blocker_confirm:"\u79BB\u5F00",blocker_cancel:"\u53D6\u6D88"},"en-US":{create:"Create",update:"Save",create_title:"Create",update_title:"Update",create_success:"Create success",update_success:"Update success",submit:"Submit",back:"Back",no_change:"No change",blocker_title:"Confirm Leave",blocker_message:"You have unsaved changes. Are you sure you want to leave?",blocker_confirm:"Leave",blocker_cancel:"Cancel"}};import I from"@jswork/next";import"@jswork/next-compact-object";function U(i,r={}){if(!i||typeof i!="object"||Array.isArray(i))return{};let{include:e,exclude:t}=r,s=c({},i);if(Array.isArray(e)&&e.length>0){let n={},o={};for(let a=0;a<e.length;a++)o[e[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&o[a]&&(n[a]=s[a]);s=n}if(Array.isArray(t)&&t.length>0){let n={},o={};for(let a=0;a<t.length;a++)o[t[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&!o[a]&&(n[a]=s[a]);s=n}return s}d(U,"filterPayload");var G="react-ant-resource-form",E,re=(E=class extends Z{constructor(e){var t;super(e);k(this,"formRef",p.createRef());k(this,"_isMounted",!1);k(this,"_initialValues",null);k(this,"handleBack",d(()=>{history.back()},"handleBack"));k(this,"setInitialValues",d(()=>{var e;this._initialValues=(e=this.formInstance)==null?void 0:e.getFieldsValue()},"setInitialValues"));k(this,"handleFinish",d(e=>{if(!this.canSave){this.msg(this.t("no_change"),"info");return}this.isEdit?this.onResourceUpdate(e):this.onResourceCreate(e)},"handleFinish"));k(this,"onResourceUpdate",d(e=>{let{params:t,name:s,submitGuard:n,onMutate:o}=this.props,a=c(c({id:t.id},e),t),f=this.handleStateRequest({stage:"update",payload:a}),u={name:s,payload:f,isEdit:!0,values:e,params:t},_={name:s,payload:f,isEdit:!0,values:e};n==null||n(u).then(()=>{I.$api[`${s}_update`](f).then(l=>{this.msg(this.t("update_success")),this.handleStateResponse({stage:"update",data:l}),o==null||o(T(c({},_),{data:l}))}).finally(()=>{var l,g;this.setState({loading:!1}),this.setInitialValues(),(g=(l=this.props).onTouchedChange)==null||g.call(l,!1)})})},"onResourceUpdate"));k(this,"onResourceCreate",d(e=>{let{params:t,name:s,disableBackWhenEdit:n,submitGuard:o,onMutate:a}=this.props,f=c(c({},e),t),u=this.handleStateRequest({stage:"create",payload:f}),_={name:s,payload:u,isEdit:!1,values:e,params:t},l={name:s,payload:u,isEdit:!1,values:e};o==null||o(_).then(()=>{I.$api[`${s}_create`](u).then(g=>{var C,b,y;this.msg(this.t("create_success")),this.handleStateResponse({stage:"create",data:g}),(C=this.formInstance)==null||C.resetFields(),a==null||a(T(c({},l),{data:g})),(y=(b=this.props).onTouchedChange)==null||y.call(b,!1),n||history.back()}).finally(()=>this.setState({loading:!1}))})},"onResourceCreate"));k(this,"handleKeydown",d(e=>{var n;let{disableHotkeySave:t}=this.props;(e.ctrlKey||e.metaKey)&&(e.key==="s"||e.key==="S")&&(e.preventDefault(),t||(n=this.formInstance)==null||n.submit())},"handleKeydown"));k(this,"handleValuesChange",d((e,t)=>{var s,n;if(this._isMounted&&this._initialValues!==null){let o=!oe(this._initialValues,t);this.setState({touched:o}),(n=(s=this.props).onTouchedChange)==null||n.call(s,o)}},"handleValuesChange"));this.state={loading:e.loading,touched:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this),(t=e.onInit)==null||t.call(e,this)}get isEdit(){let{params:e}=this.props;return!!(e!=null&&e.id)}get canSave(){let{touched:e,loading:t}=this.state;return this.isEdit?e&&!t:!t}get titleView(){let{title:e}=this.props,t=e||(this.isEdit?this.t("update_title"):this.t("create_title"));return p.createElement(K,null,t,p.createElement("span",null,this.touchedView))}get touchedView(){return this.isEdit&&this.state.touched?p.createElement("em",{style:{color:"#f60"}},p.createElement(ne,null)):null}get extraView(){let{extra:e,backText:t,backProps:s}=this.props;return e||p.createElement(N,c({size:"small",icon:p.createElement(W,null),onClick:this.handleBack},s),t||this.t("back"))}get childrenView(){let{okText:e,backText:t,okProps:s,backProps:n,children:o}=this.props,a=e||(this.isEdit?this.t("update"):this.t("create"));return o||p.createElement(K,null,p.createElement(N,c({disabled:!this.canSave,htmlType:"submit",type:"primary",icon:p.createElement(ie,null)},s),a||this.t("submit")),p.createElement(N,c({icon:p.createElement(W,null),onClick:this.handleBack},n),t||this.t("back")))}get formInstance(){var e;return(e=this.formRef)==null?void 0:e.current}t(e){let{lang:t}=this.props;return w[t][e]}msg(e,t="success"){let{mute:s}=this.props;s||te[t](e)}handleStateRequest(e){let{payloadFields:t,transformRequest:s}=this.props;this.setState({loading:!0});let n=(s==null?void 0:s(e))||e.payload;return U(n,t)}handleStateResponse(e){var s,n,o,a;let{name:t}=this.props;return this.setState({loading:!1}),(n=(s=I.$event)==null?void 0:s.emit)==null||n.call(s,`${t}:refetch`),((a=(o=this.props).transformResponse)==null?void 0:a.call(o,e))||e.data}componentDidMount(){this._isMounted=!0,window.addEventListener("keydown",this.handleKeydown),this.initDetailIfNeeded()}componentDidUpdate(e){var n,o;let t=(n=e.params)==null?void 0:n.id,s=(o=this.props.params)==null?void 0:o.id;t!==s&&this.initDetailIfNeeded(),e.loading!==this.props.loading&&this.setState({loading:this.props.loading})}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:e,name:t,initGuard:s}=this.props,n=`${t}_show`;if(this.isEdit){let o={id:e.id},a=this.handleStateRequest({stage:"show",payload:o}),f={name:t,payload:a,isEdit:!0,params:e};s==null||s(f).then(()=>{I.$api[n](a).then(u=>{var l,g;if(!this._isMounted)return;let _=this.handleStateResponse({stage:"show",data:u});(g=(l=this.formInstance)==null?void 0:l.setFieldsValue)==null||g.call(l,_)}).finally(()=>{var u,_;this.setState({loading:!1}),this.setInitialValues(),(_=(u=this.props).onTouchedChange)==null||_.call(u,!1)})})}else{let o={name:t,payload:null,isEdit:!1,params:e};s==null||s(o).then(()=>{var a,f;this.setInitialValues(),this.setState({loading:!1}),(f=(a=this.props).onTouchedChange)==null||f.call(a,!1)})}}render(){let D=this.props,{className:e,name:t,meta:s,children:n,lang:o,title:a,extra:f,size:u,okText:_,backText:l,okProps:g,backProps:C,classNames:b,params:y,transformRequest:h,transformResponse:B,disableHotkeySave:L,disableBackWhenEdit:F,blocker:m,mute:S,onInit:M,onMutate:O,initGuard:ge,submitGuard:ke,loading:_e,payloadFields:ye,onTouchedChange:Se}=D,j=A(D,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave","disableBackWhenEdit","blocker","mute","onInit","onMutate","initGuard","submitGuard","loading","payloadFields","onTouchedChange"]);return p.createElement(ee,{title:this.titleView,extra:this.extraView,size:u,classNames:b,"data-component":G,"data-blocker":m,className:X(G,e)},p.createElement(se,{spinning:this.state.loading},p.createElement(ae,c({meta:s,ref:this.formRef,onValuesChange:this.handleValuesChange,onFinish:this.handleFinish},j),this.childrenView)))}},d(E,"ReactAntResourceForm"),k(E,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1,disableBackWhenEdit:!1,blocker:!1,mute:!1,initGuard:d(()=>Promise.resolve(),"initGuard"),submitGuard:d(()=>Promise.resolve(),"submitGuard"),payloadFields:{include:[],exclude:[]}}),E),V=re;import R,{useState as H,useCallback as v}from"react";import{useBlocker as le,useParams as ce,useSearchParams as he}from"react-router-dom";import de from"fromentries";import Y from"@jswork/next";import{Modal as ue}from"antd";var me=d((i,r)=>(Y.forIn(i,e=>{r.includes(e)||delete i[e]}),i),"retainKeys"),pe=d(i=>{let F=i,{params:r,allowFields:e,disableBlocker:t,blockerMessage:s,lang:n="zh-CN"}=F,o=A(F,["params","allowFields","disableBlocker","blockerMessage","lang"]),a=ce(),[f]=he(),[u,_]=H(!1),[l,g]=H(!1),C=de(f),b=Y.compactObject(c(c(c({},C),a),r));e!=null&&e.length&&me(b,e);let y=v(m=>{var S;return((S=w[n])==null?void 0:S[m])||w["zh-CN"][m]},[n]),h=le(v(({currentLocation:m,nextLocation:S})=>{let M=!!u,O=m.pathname!==S.pathname;return t!==!0&&M&&O},[u,t]));R.useEffect(()=>{h.state==="blocked"&&!l?g(!0):(h.state==="proceeding"||h.state==="unblocked")&&l&&g(!1)},[h.state,l]);let B=v(()=>{var m;(m=h.proceed)==null||m.call(h)},[h]),L=v(()=>{var m;(m=h.reset)==null||m.call(h)},[h]);return R.createElement(R.Fragment,null,R.createElement(V,c({params:b,lang:n,onTouchedChange:d(m=>{var S;_(m),!m&&h.state==="blocked"&&((S=h.proceed)==null||S.call(h))},"onTouchedChange")},o)),R.createElement(ue,{title:y("blocker_title"),open:l,onOk:B,onCancel:L,okText:y("blocker_confirm"),cancelText:y("blocker_cancel")},R.createElement("p",null,s||y("blocker_message"))))},"ReactAntResourceFormFc"),fe=pe;var Ye=V;export{fe as ReactAntResourceFormFc,Ye as default};
|
|
1
|
+
var $=Object.defineProperty,J=Object.defineProperties;var Q=Object.getOwnPropertyDescriptors;var A=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable;var P=(i,r,e)=>r in i?$(i,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[r]=e,c=(i,r)=>{for(var e in r||(r={}))q.call(r,e)&&P(i,e,r[e]);if(A)for(var e of A(r))z.call(r,e)&&P(i,e,r[e]);return i},T=(i,r)=>J(i,Q(r)),h=(i,r)=>$(i,"name",{value:r,configurable:!0});var I=(i,r)=>{var e={};for(var t in i)q.call(i,t)&&r.indexOf(t)<0&&(e[t]=i[t]);if(i!=null&&A)for(var t of A(i))r.indexOf(t)<0&&z.call(i,t)&&(e[t]=i[t]);return e};var k=(i,r,e)=>P(i,typeof r!="symbol"?r+"":r,e);import X from"classnames";import p,{Component as Z}from"react";import{Button as N,Card as ee,message as te,Space as K,Spin as se}from"antd";import ae from"@jswork/react-ant-form-schema";import{ArrowLeftOutlined as W,DiffOutlined as ne,SaveOutlined as ie}from"@ant-design/icons";import oe from"fast-deep-equal";var w={"zh-CN":{create:"\u521B\u5EFA",update:"\u4FDD\u5B58",create_title:"\u521B\u5EFA",update_title:"\u66F4\u65B0",create_success:"\u521B\u5EFA\u6210\u529F",update_success:"\u66F4\u65B0\u6210\u529F",submit:"\u63D0\u4EA4",back:"\u8FD4\u56DE",no_change:"\u6CA1\u6709\u4FEE\u6539",blocker_title:"\u786E\u8BA4\u79BB\u5F00",blocker_message:"\u60A8\u6709\u672A\u4FDD\u5B58\u7684\u66F4\u6539\uFF0C\u786E\u5B9A\u8981\u79BB\u5F00\u5417\uFF1F",blocker_confirm:"\u79BB\u5F00",blocker_cancel:"\u53D6\u6D88"},"en-US":{create:"Create",update:"Save",create_title:"Create",update_title:"Update",create_success:"Create success",update_success:"Update success",submit:"Submit",back:"Back",no_change:"No change",blocker_title:"Confirm Leave",blocker_message:"You have unsaved changes. Are you sure you want to leave?",blocker_confirm:"Leave",blocker_cancel:"Cancel"}};import x from"@jswork/next";import"@jswork/next-compact-object";function U(i,r={}){if(!i||typeof i!="object"||Array.isArray(i))return{};let{include:e,exclude:t}=r,s=c({},i);if(Array.isArray(e)&&e.length>0){let n={},o={};for(let a=0;a<e.length;a++)o[e[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&o[a]&&(n[a]=s[a]);s=n}if(Array.isArray(t)&&t.length>0){let n={},o={};for(let a=0;a<t.length;a++)o[t[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&!o[a]&&(n[a]=s[a]);s=n}return s}h(U,"filterPayload");var G="react-ant-resource-form",E,re=(E=class extends Z{constructor(e){var t;super(e);k(this,"formRef",p.createRef());k(this,"_isMounted",!1);k(this,"_initialValues",null);k(this,"handleBack",h(()=>{x.$nav(-1)},"handleBack"));k(this,"setInitialValues",h(()=>{var e;this._initialValues=(e=this.formInstance)==null?void 0:e.getFieldsValue()},"setInitialValues"));k(this,"handleFinish",h(e=>{if(!this.canSave){this.msg(this.t("no_change"),"info");return}this.isEdit?this.onResourceUpdate(e):this.onResourceCreate(e)},"handleFinish"));k(this,"onResourceUpdate",h(e=>{let{params:t,name:s,submitGuard:n,onMutate:o}=this.props,a=c(c({id:t.id},e),t),f=this.handleStateRequest({stage:"update",payload:a}),u={name:s,payload:f,isEdit:!0,values:e,params:t},_={name:s,payload:f,isEdit:!0,values:e};n==null||n(u).then(()=>{x.$api[`${s}_update`](f).then(l=>{this.msg(this.t("update_success")),this.handleStateResponse({stage:"update",data:l}),o==null||o(T(c({},_),{data:l}))}).finally(()=>{var l,g;this.setState({loading:!1}),this.setInitialValues(),(g=(l=this.props).onTouchedChange)==null||g.call(l,!1)})})},"onResourceUpdate"));k(this,"onResourceCreate",h(e=>{let{params:t,name:s,disableBackWhenEdit:n,submitGuard:o,onMutate:a}=this.props,f=c(c({},e),t),u=this.handleStateRequest({stage:"create",payload:f}),_={name:s,payload:u,isEdit:!1,values:e,params:t},l={name:s,payload:u,isEdit:!1,values:e};o==null||o(_).then(()=>{x.$api[`${s}_create`](u).then(g=>{var C,b,y;this.msg(this.t("create_success")),this.handleStateResponse({stage:"create",data:g}),(C=this.formInstance)==null||C.resetFields(),a==null||a(T(c({},l),{data:g})),(y=(b=this.props).onTouchedChange)==null||y.call(b,!1),n||history.back()}).finally(()=>this.setState({loading:!1}))})},"onResourceCreate"));k(this,"handleKeydown",h(e=>{var n;let{disableHotkeySave:t}=this.props;(e.ctrlKey||e.metaKey)&&(e.key==="s"||e.key==="S")&&(e.preventDefault(),t||(n=this.formInstance)==null||n.submit())},"handleKeydown"));k(this,"handleValuesChange",h((e,t)=>{var s,n;if(this._isMounted&&this._initialValues!==null){let o=!oe(this._initialValues,t);this.setState({touched:o}),(n=(s=this.props).onTouchedChange)==null||n.call(s,o)}},"handleValuesChange"));this.state={loading:e.loading,touched:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this),(t=e.onInit)==null||t.call(e,this)}get isEdit(){let{params:e}=this.props;return!!(e!=null&&e.id)}get canSave(){let{touched:e,loading:t}=this.state;return this.isEdit?e&&!t:!t}get titleView(){let{title:e}=this.props,t=e||(this.isEdit?this.t("update_title"):this.t("create_title"));return p.createElement(K,null,t,p.createElement("span",null,this.touchedView))}get touchedView(){return this.isEdit&&this.state.touched?p.createElement("em",{style:{color:"#f60"}},p.createElement(ne,null)):null}get extraView(){let{extra:e,backText:t,backProps:s}=this.props;return e||p.createElement(N,c({size:"small",icon:p.createElement(W,null),onClick:this.handleBack},s),t||this.t("back"))}get childrenView(){let{okText:e,backText:t,okProps:s,backProps:n,children:o}=this.props,a=e||(this.isEdit?this.t("update"):this.t("create"));return o||p.createElement(K,null,p.createElement(N,c({disabled:!this.canSave,htmlType:"submit",type:"primary",icon:p.createElement(ie,null)},s),a||this.t("submit")),p.createElement(N,c({icon:p.createElement(W,null),onClick:this.handleBack},n),t||this.t("back")))}get formInstance(){var e;return(e=this.formRef)==null?void 0:e.current}t(e){let{lang:t}=this.props;return w[t][e]}msg(e,t="success"){let{mute:s}=this.props;s||te[t](e)}handleStateRequest(e){let{payloadFields:t,transformRequest:s}=this.props;this.setState({loading:!0});let n=(s==null?void 0:s(e))||e.payload;return U(n,t)}handleStateResponse(e){var s,n,o,a;let{name:t}=this.props;return this.setState({loading:!1}),(n=(s=x.$event)==null?void 0:s.emit)==null||n.call(s,`${t}:refetch`),((a=(o=this.props).transformResponse)==null?void 0:a.call(o,e))||e.data}componentDidMount(){this._isMounted=!0,window.addEventListener("keydown",this.handleKeydown),this.initDetailIfNeeded()}componentDidUpdate(e){var n,o;let t=(n=e.params)==null?void 0:n.id,s=(o=this.props.params)==null?void 0:o.id;t!==s&&this.initDetailIfNeeded(),e.loading!==this.props.loading&&this.setState({loading:this.props.loading})}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:e,name:t,initGuard:s}=this.props,n=`${t}_show`;if(this.isEdit){let o={id:e.id},a=this.handleStateRequest({stage:"show",payload:o}),f={name:t,payload:a,isEdit:!0,params:e};s==null||s(f).then(()=>{x.$api[n](a).then(u=>{var l,g;if(!this._isMounted)return;let _=this.handleStateResponse({stage:"show",data:u});(g=(l=this.formInstance)==null?void 0:l.setFieldsValue)==null||g.call(l,_)}).finally(()=>{var u,_;this.setState({loading:!1}),this.setInitialValues(),(_=(u=this.props).onTouchedChange)==null||_.call(u,!1)})})}else{let o={name:t,payload:null,isEdit:!1,params:e};s==null||s(o).then(()=>{var a,f;this.setInitialValues(),this.setState({loading:!1}),(f=(a=this.props).onTouchedChange)==null||f.call(a,!1)})}}render(){let D=this.props,{className:e,name:t,meta:s,children:n,lang:o,title:a,extra:f,size:u,okText:_,backText:l,okProps:g,backProps:C,classNames:b,params:y,transformRequest:d,transformResponse:B,disableHotkeySave:L,disableBackWhenEdit:F,blocker:m,mute:S,onInit:M,onMutate:O,initGuard:ge,submitGuard:ke,loading:_e,payloadFields:ye,onTouchedChange:Se}=D,j=I(D,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave","disableBackWhenEdit","blocker","mute","onInit","onMutate","initGuard","submitGuard","loading","payloadFields","onTouchedChange"]);return p.createElement(ee,{title:this.titleView,extra:this.extraView,size:u,classNames:b,"data-component":G,"data-blocker":m,className:X(G,e)},p.createElement(se,{spinning:this.state.loading},p.createElement(ae,c({meta:s,ref:this.formRef,onValuesChange:this.handleValuesChange,onFinish:this.handleFinish},j),this.childrenView)))}},h(E,"ReactAntResourceForm"),k(E,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1,disableBackWhenEdit:!1,blocker:!1,mute:!1,initGuard:h(()=>Promise.resolve(),"initGuard"),submitGuard:h(()=>Promise.resolve(),"submitGuard"),payloadFields:{include:[],exclude:[]}}),E),v=re;import R,{useState as H,useCallback as V}from"react";import{useBlocker as le,useParams as ce,useSearchParams as de}from"react-router-dom";import he from"fromentries";import Y from"@jswork/next";import{Modal as ue}from"antd";var me=h((i,r)=>(Y.forIn(i,e=>{r.includes(e)||delete i[e]}),i),"retainKeys"),pe=h(i=>{let F=i,{params:r,allowFields:e,disableBlocker:t,blockerMessage:s,lang:n="zh-CN"}=F,o=I(F,["params","allowFields","disableBlocker","blockerMessage","lang"]),a=ce(),[f]=de(),[u,_]=H(!1),[l,g]=H(!1),C=he(f),b=Y.compactObject(c(c(c({},C),a),r));e!=null&&e.length&&me(b,e);let y=V(m=>{var S;return((S=w[n])==null?void 0:S[m])||w["zh-CN"][m]},[n]),d=le(V(({currentLocation:m,nextLocation:S})=>{let M=!!u,O=m.pathname!==S.pathname;return t!==!0&&M&&O},[u,t]));R.useEffect(()=>{d.state==="blocked"&&!l?g(!0):(d.state==="proceeding"||d.state==="unblocked")&&l&&g(!1)},[d.state,l]);let B=V(()=>{var m;(m=d.proceed)==null||m.call(d)},[d]),L=V(()=>{var m;(m=d.reset)==null||m.call(d)},[d]);return R.createElement(R.Fragment,null,R.createElement(v,c({params:b,lang:n,onTouchedChange:h(m=>{var S;_(m),!m&&d.state==="blocked"&&((S=d.proceed)==null||S.call(d))},"onTouchedChange")},o)),R.createElement(ue,{title:y("blocker_title"),open:l,onOk:B,onCancel:L,okText:y("blocker_confirm"),cancelText:y("blocker_cancel")},R.createElement("p",null,s||y("blocker_message"))))},"ReactAntResourceFormFc"),fe=pe;var Ye=v;export{fe as ReactAntResourceFormFc,Ye as default};
|
|
2
2
|
//# sourceMappingURL=main.esm.js.map
|
package/dist/main.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/locales.ts","../src/utils.ts","../src/index-rc.tsx","../src/main.tsx"],"sourcesContent":["// import noop from '@jswork/noop';\nimport cx from 'classnames';\nimport React, { Component } from 'react';\nimport { ButtonProps, CardProps, FormInstance } from 'antd';\nimport { Button, Card, message, Space, Spin } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, DiffOutlined, SaveOutlined } from '@ant-design/icons';\nimport deepEqual from 'fast-deep-equal';\nimport {\n InitGuardArgs,\n MsgType,\n MutateArgs,\n StageData,\n StagePayload,\n SubmitGuardArgs,\n} from './types';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\nimport '@jswork/next-compact-object';\nimport { filterPayload } from './utils';\n\ndeclare global {\n interface NxStatic {\n $api: Record<string, any>;\n $event: any;\n }\n}\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nexport type ReactAntResourceFormProps = {\n name?: string;\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n params?: Record<string, any>;\n blocker?: boolean;\n mute?: boolean;\n disableHotkeySave?: boolean;\n disableBackWhenEdit?: boolean;\n initGuard?: (args: InitGuardArgs) => Promise<void>;\n submitGuard?: (args: SubmitGuardArgs) => Promise<void>;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n classNames?: CardProps['classNames'];\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n onInit?: (ctx: ReactAntResourceForm) => void;\n onMutate?: (args: MutateArgs) => void;\n onTouchedChange?: (touched: boolean) => void;\n payloadFields?: { include?: string[]; exclude?: string[] }\n} & ReactAntdFormSchemaProps;\n\nexport type IState = {\n loading: boolean;\n touched: boolean;\n};\n\n/**\n * 当前 card loading 不要直接使用,因为这个 loading 会导致 Card 里的 formRef 被设置成 null\n * 这个情况仅在 class component 里才会出现,function component 里不会:\n * 报错示例:\n *\n * this.formRef?: null\n * index.tsx:229 this.formRef?: {getFieldValue: ƒ, getFieldsValue: ƒ, getFieldError: ƒ, getFieldWarning: ƒ, getFieldsError: ƒ, …}\n * index.tsx:229 this.formRef?: null\n *\n * initGuard | submitGuard:\n * https://chat.qwen.ai/c/60329863-0e5e-47f9-a075-a65ad30940cc\n *\n * onMutate:\n * 在 create/update 成功后,需要刷新列表,可以用 onMutate 继续后续处理。\n *\n * blocker:\n * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。\n * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor\n *\n * transformRequest:\n * 当你提交表单的时候,需要对参数进行一些预处理,比如加密,或者添加一些默认值,这个时候就可以用 transformRequest。\n */\n\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n disableBackWhenEdit: false,\n blocker: false,\n mute: false,\n initGuard: () => Promise.resolve(),\n submitGuard: () => Promise.resolve(),\n payloadFields: { include: [], exclude: [] },\n };\n\n private formRef = React.createRef<FormInstance>(); // 注意类型\n private _isMounted = false;\n private _initialValues = null;\n\n get isEdit() {\n const { params } = this.props;\n return Boolean(params?.id);\n }\n\n get canSave() {\n const { touched, loading } = this.state;\n if (!this.isEdit) return !loading;\n return touched && !loading;\n }\n\n get titleView() {\n const { title } = this.props;\n const _title = title || (this.isEdit ? this.t('update_title') : this.t('create_title'));\n return (\n <Space>\n {_title}\n <span>{this.touchedView}</span>\n </Space>\n );\n }\n\n get touchedView() {\n if (!this.isEdit) return null;\n return this.state.touched ? (\n <em style={{ color: '#f60' }}>\n <DiffOutlined />\n </em>\n ) : null;\n }\n\n get extraView() {\n const { extra, backText, backProps } = this.props;\n if (extra) return extra;\n return (\n <Button size=\"small\" icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n );\n }\n\n get childrenView() {\n const { okText, backText, okProps, backProps, children } = this.props;\n const _okText = okText || (this.isEdit ? this.t('update') : this.t('create'));\n if (children) return children;\n\n return (\n <Space>\n <Button\n disabled={!this.canSave}\n htmlType=\"submit\"\n type=\"primary\"\n icon={<SaveOutlined />}\n {...okProps}>\n {_okText || this.t('submit')}\n </Button>\n <Button icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n </Space>\n );\n }\n\n get formInstance() {\n return this.formRef?.current;\n }\n\n constructor(props: ReactAntResourceFormProps) {\n super(props);\n this.state = {\n loading: props.loading!,\n touched: false,\n };\n\n this.handleStateRequest = this.handleStateRequest.bind(this);\n this.handleStateResponse = this.handleStateResponse.bind(this);\n this.initDetailIfNeeded = this.initDetailIfNeeded.bind(this);\n\n props.onInit?.(this);\n }\n\n private t(key: string) {\n const { lang } = this.props;\n return API_FORM_LOCALES[lang!][key];\n }\n\n private msg(msg: string, type: MsgType = 'success') {\n const { mute } = this.props;\n if (!mute) message[type](msg);\n }\n\n private handleBack = () => {\n history.back();\n };\n\n private setInitialValues = () => {\n this._initialValues = this.formInstance?.getFieldsValue();\n };\n\n handleStateRequest(stagePayload: StagePayload) {\n const { payloadFields, transformRequest } = this.props;\n this.setState({ loading: true });\n const rawPayload = transformRequest?.(stagePayload) || stagePayload.payload;\n return filterPayload(rawPayload, payloadFields);\n }\n\n handleStateResponse(res: StageData) {\n const { name } = this.props;\n this.setState({ loading: false });\n nx.$event?.emit?.(`${name}:refetch`);\n return this.props.transformResponse?.(res) || res.data;\n }\n\n handleFinish = (values: any) => {\n if (!this.canSave) {\n this.msg(this.t('no_change'), 'info');\n return;\n }\n this.isEdit ? this.onResourceUpdate(values) : this.onResourceCreate(values);\n };\n\n private onResourceUpdate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { id: params!.id, ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'update', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n params,\n };\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_update`](_payload)\n .then((res: any) => {\n this.msg(this.t('update_success'));\n this.handleStateResponse({ stage: 'update', data: res });\n onMutate?.({ ...mutateArgs, data: res });\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.props.onTouchedChange?.(false);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, disableBackWhenEdit, submitGuard, onMutate } = this.props;\n const payload = { ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'create', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n params,\n };\n\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_create`](_payload)\n .then((res: any) => {\n this.msg(this.t('create_success'));\n this.handleStateResponse({ stage: 'create', data: res });\n this.formInstance?.resetFields();\n onMutate?.({ ...mutateArgs, data: res });\n this.props.onTouchedChange?.(false);\n if (!disableBackWhenEdit) history.back();\n })\n .finally(() => this.setState({ loading: false }));\n });\n };\n\n // hotkey save handler (replaces useKeyboardSave hook)\n handleKeydown = (e: KeyboardEvent) => {\n const { disableHotkeySave } = this.props;\n const isSave = (e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S');\n if (isSave) {\n e.preventDefault();\n if (!disableHotkeySave) {\n this.formInstance?.submit();\n }\n }\n };\n\n handleValuesChange = (_: any, allValues: any) => {\n if (this._isMounted && this._initialValues !== null) {\n const newTouched = !deepEqual(this._initialValues, allValues);\n this.setState({\n touched: newTouched,\n });\n this.props.onTouchedChange?.(newTouched);\n }\n };\n\n componentDidMount() {\n this._isMounted = true;\n // attach hotkey listener\n window.addEventListener('keydown', this.handleKeydown);\n // initialize detail if editing\n this.initDetailIfNeeded();\n }\n\n componentDidUpdate(prevProps: ReactAntResourceFormProps) {\n const prevId = prevProps.params?.id;\n const curId = this.props.params?.id;\n // re-init when id changed or from create -> edit\n if (prevId !== curId) {\n this.initDetailIfNeeded();\n }\n\n // loading update\n if (prevProps.loading !== this.props.loading) {\n this.setState({ loading: this.props.loading! });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeydown);\n this._isMounted = false;\n }\n\n initDetailIfNeeded() {\n const { params, name, initGuard } = this.props;\n const resourceShow = `${name}_show`;\n\n if (this.isEdit) {\n const payload = { id: params!.id };\n const _payload = this.handleStateRequest({ stage: 'show', payload });\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n nx.$api[resourceShow](_payload)\n .then((res: any) => {\n if (!this._isMounted) return; // 👈 关键:防止操作已卸载组件\n const data = this.handleStateResponse({ stage: 'show', data: res });\n this.formInstance?.setFieldsValue?.(data);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.props.onTouchedChange?.(false);\n });\n });\n } else {\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: null,\n isEdit: false,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n this.setInitialValues();\n this.setState({ loading: false });\n this.props.onTouchedChange?.(false);\n });\n }\n }\n\n render() {\n const {\n className,\n name,\n meta,\n children,\n lang,\n title,\n extra,\n size,\n okText,\n backText,\n okProps,\n backProps,\n classNames,\n params,\n transformRequest,\n transformResponse,\n disableHotkeySave,\n disableBackWhenEdit,\n blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\n payloadFields,\n onTouchedChange,\n ...rest\n } = this.props;\n\n return (\n <Card\n title={this.titleView}\n extra={this.extraView}\n size={size}\n classNames={classNames}\n data-component={CLASS_NAME}\n data-blocker={blocker}\n className={cx(CLASS_NAME, className)}>\n <Spin spinning={this.state.loading}>\n <ReactAntdFormSchema\n meta={meta}\n ref={this.formRef}\n onValuesChange={this.handleValuesChange}\n onFinish={this.handleFinish}\n {...rest}>\n {this.childrenView}\n </ReactAntdFormSchema>\n </Spin>\n </Card>\n );\n }\n}\n\n\nexport default ReactAntResourceForm;\n","export const API_FORM_LOCALES = {\n 'zh-CN': {\n create: '创建',\n update: '保存',\n create_title: '创建',\n update_title: '更新',\n create_success: '创建成功',\n update_success: '更新成功',\n submit: '提交',\n back: '返回',\n no_change: '没有修改',\n blocker_title: '确认离开',\n blocker_message: '您有未保存的更改,确定要离开吗?',\n blocker_confirm: '离开',\n blocker_cancel: '取消',\n },\n 'en-US': {\n create: 'Create',\n update: 'Save',\n create_title: 'Create',\n update_title: 'Update',\n create_success: 'Create success',\n update_success: 'Update success',\n submit: 'Submit',\n back: 'Back',\n no_change: 'No change',\n blocker_title: 'Confirm Leave',\n blocker_message: 'You have unsaved changes. Are you sure you want to leave?',\n blocker_confirm: 'Leave',\n blocker_cancel: 'Cancel',\n },\n};\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 16:46:34\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-10-31 16:51:16\n *\n * AI(filterPayload): https://chat.qwen.ai/c/5213efdf-e88d-4367-9bd1-bd4d23af6223\n */\n\nexport interface PayloadFieldConfig {\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * 根据 include/exclude 规则过滤 payload 对象\n * @param payload 原始对象(会被浅拷贝,不修改原对象)\n * @param config 字段过滤配置\n * @returns 过滤后的新对象\n */\nexport function filterPayload(\n payload: Record<string, any> | null | undefined,\n config: PayloadFieldConfig = {},\n): Record<string, any> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return {};\n }\n\n const { include, exclude } = config;\n let result = { ...payload }; // 浅拷贝(ES5 兼容写法见下方备注)\n\n // --- include: 白名单 ---\n if (Array.isArray(include) && include.length > 0) {\n const allowed: Record<string, any> = {};\n const includeSet: Record<string, boolean> = {};\n for (let i = 0; i < include.length; i++) {\n includeSet[include[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && includeSet[key]) {\n allowed[key] = result[key];\n }\n }\n result = allowed;\n }\n\n // --- exclude: 黑名单 ---\n if (Array.isArray(exclude) && exclude.length > 0) {\n const final: Record<string, any> = {};\n const excludeSet: Record<string, boolean> = {};\n for (let i = 0; i < exclude.length; i++) {\n excludeSet[exclude[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && !excludeSet[key]) {\n final[key] = result[key];\n }\n }\n result = final;\n }\n\n return result;\n}\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 13:20:41\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-11-02 14:42:32\n */\nimport React, { FC, useState, useCallback } from 'react';\nimport { useBlocker, useParams, useSearchParams } from 'react-router-dom';\nimport fromEntries from 'fromentries';\nimport nx from '@jswork/next';\nimport ReactAntResourceForm, { ReactAntResourceFormProps } from '.';\nimport { Modal } from 'antd';\nimport { API_FORM_LOCALES } from './locales';\n\nconst retainKeys = (obj: Record<string, any>, keys: string[]) => {\n nx.forIn(obj, (key) => {\n if (!keys.includes(key)) {\n delete obj[key];\n }\n });\n return obj;\n};\n\nexport type ReactAntResourceFormFcProps = ReactAntResourceFormProps & {\n allowFields?: string[];\n /** 禁用路由离开拦截(当表单有未保存更改时) */\n disableBlocker?: boolean;\n /** 拦截确认消息 */\n blockerMessage?: string;\n}\n\nconst ReactAntResourceFormFc: FC<ReactAntResourceFormFcProps> = (props) => {\n const { params: overrideParams, allowFields, disableBlocker, blockerMessage, lang = 'zh-CN', ...rest } = props;\n const params = useParams();\n const [searchParams] = useSearchParams();\n const [touched, setTouched] = useState(false);\n const [showBlockerModal, setShowBlockerModal] = useState(false);\n\n const _searchParams = fromEntries(searchParams as any);\n const _params = nx.compactObject({ ..._searchParams, ...params, ...overrideParams });\n if (allowFields?.length) retainKeys(_params, allowFields);\n\n // 获取翻译文本\n const t = useCallback((key: string) => {\n return API_FORM_LOCALES[lang]?.[key] || API_FORM_LOCALES['zh-CN'][key];\n }, [lang]);\n\n // 路由拦截器(默认启用,disableBlocker=true 时禁用)\n const blocker = useBlocker(\n useCallback(({ currentLocation, nextLocation }: any) => {\n const hasChanges = Boolean(touched);\n const isDifferentPath = currentLocation.pathname !== nextLocation.pathname;\n return disableBlocker !== true && hasChanges && isDifferentPath;\n }, [touched, disableBlocker]),\n );\n\n // 使用 useEffect 处理拦截状态变化(避免在 render 中 setState)\n React.useEffect(() => {\n if (blocker.state === 'blocked' && !showBlockerModal) {\n setShowBlockerModal(true);\n } else if ((blocker.state === 'proceeding' || blocker.state === 'unblocked') && showBlockerModal) {\n // 当 blocker 进入 proceeding 或 unblocked 状态时,关闭 Modal\n setShowBlockerModal(false);\n }\n }, [blocker.state, showBlockerModal]);\n\n // 确认离开\n const handleConfirmLeave = useCallback(() => {\n blocker.proceed?.();\n }, [blocker]);\n\n // 取消离开\n const handleCancelLeave = useCallback(() => {\n blocker.reset?.();\n }, [blocker]);\n\n return (\n <>\n <ReactAntResourceForm\n params={_params}\n lang={lang}\n onTouchedChange={(touched) => {\n setTouched(touched);\n // 当表单保存成功后,如果有被拦截的导航且表单不再有更改,继续导航\n if (!touched && blocker.state === 'blocked') {\n blocker.proceed?.();\n }\n }}\n {...rest}\n />\n <Modal\n title={t('blocker_title')}\n open={showBlockerModal}\n onOk={handleConfirmLeave}\n onCancel={handleCancelLeave}\n okText={t('blocker_confirm')}\n cancelText={t('blocker_cancel')}>\n <p>{blockerMessage || t('blocker_message')}</p>\n </Modal>\n </>\n );\n};\n\nexport default ReactAntResourceFormFc;\n","import ReactAntResourceForm from '.';\nimport ReactAntResourceFormFc from './index-rc';\nimport type { ReactAntResourceFormProps } from '.';\nimport type { ReactAntResourceFormFcProps } from './index-rc';\n\nexport default ReactAntResourceForm;\nexport { ReactAntResourceFormFc };\nexport type { ReactAntResourceFormFcProps, ReactAntResourceFormProps };\nexport * from './types';\n"],"mappings":"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","names":["cx","React","Component","Button","Card","message","Space","Spin","ReactAntdFormSchema","ArrowLeftOutlined","DiffOutlined","SaveOutlined","deepEqual","API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","submit","back","no_change","blocker_title","blocker_message","blocker_confirm","blocker_cancel","nx","filterPayload","payload","config","Array","isArray","include","exclude","result","__spreadValues","length","allowed","includeSet","i","key","hasOwnProperty","final","excludeSet","CLASS_NAME","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","_initialValues","handleBack","__name","history","back","setInitialValues","formInstance","getFieldsValue","handleFinish","values","canSave","msg","t","isEdit","onResourceUpdate","onResourceCreate","params","name","submitGuard","onMutate","payload","__spreadValues","id","_payload","handleStateRequest","stage","submitGuardArgs","mutateArgs","then","nx","$api","res","handleStateResponse","data","__spreadProps","finally","_b","setState","loading","onTouchedChange","disableBackWhenEdit","_c","resetFields","handleKeydown","e","disableHotkeySave","ctrlKey","metaKey","key","preventDefault","submit","handleValuesChange","_","allValues","newTouched","deepEqual","touched","state","bind","initDetailIfNeeded","onInit","Boolean","titleView","title","_title","Space","span","touchedView","em","style","color","DiffOutlined","extraView","extra","backText","backProps","Button","size","icon","ArrowLeftOutlined","onClick","childrenView","okText","okProps","children","_okText","disabled","htmlType","type","SaveOutlined","current","lang","API_FORM_LOCALES","mute","message","stagePayload","payloadFields","transformRequest","rawPayload","filterPayload","_d","$event","emit","transformResponse","componentDidMount","window","addEventListener","componentDidUpdate","prevProps","prevId","curId","componentWillUnmount","removeEventListener","initGuard","resourceShow","initGuardArgs","setFieldsValue","render","className","meta","classNames","blocker","rest","Card","data-component","data-blocker","cx","Spin","spinning","ReactAntdFormSchema","ref","onValuesChange","onFinish","__publicField","defaultProps","Promise","resolve","include","exclude","index_default","React","useState","useCallback","useBlocker","useParams","useSearchParams","fromEntries","nx","Modal","retainKeys","__name","obj","keys","nx","forIn","key","includes","ReactAntResourceFormFc","props","params","overrideParams","allowFields","disableBlocker","blockerMessage","lang","rest","useParams","searchParams","useSearchParams","touched","setTouched","useState","showBlockerModal","setShowBlockerModal","_searchParams","fromEntries","_params","compactObject","__spreadValues","length","t","useCallback","_a","API_FORM_LOCALES","blocker","useBlocker","currentLocation","nextLocation","hasChanges","Boolean","isDifferentPath","pathname","React","useEffect","state","handleConfirmLeave","proceed","handleCancelLeave","reset","ReactAntResourceForm","onTouchedChange","Modal","title","open","onOk","onCancel","okText","cancelText","p","index_rc_default","main_default","ReactAntResourceForm"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/locales.ts","../src/utils.ts","../src/index-rc.tsx","../src/main.tsx"],"sourcesContent":["// import noop from '@jswork/noop';\nimport cx from 'classnames';\nimport React, { Component } from 'react';\nimport { ButtonProps, CardProps, FormInstance } from 'antd';\nimport { Button, Card, message, Space, Spin } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, DiffOutlined, SaveOutlined } from '@ant-design/icons';\nimport deepEqual from 'fast-deep-equal';\nimport {\n InitGuardArgs,\n MsgType,\n MutateArgs,\n StageData,\n StagePayload,\n SubmitGuardArgs,\n} from './types';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\nimport '@jswork/next-compact-object';\nimport { filterPayload } from './utils';\n\ndeclare global {\n interface NxStatic {\n $api: Record<string, any>;\n $event: any;\n $nav: any;\n }\n}\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nexport type ReactAntResourceFormProps = {\n name?: string;\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n params?: Record<string, any>;\n blocker?: boolean;\n mute?: boolean;\n disableHotkeySave?: boolean;\n disableBackWhenEdit?: boolean;\n initGuard?: (args: InitGuardArgs) => Promise<void>;\n submitGuard?: (args: SubmitGuardArgs) => Promise<void>;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n classNames?: CardProps['classNames'];\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n onInit?: (ctx: ReactAntResourceForm) => void;\n onMutate?: (args: MutateArgs) => void;\n onTouchedChange?: (touched: boolean) => void;\n payloadFields?: { include?: string[]; exclude?: string[] }\n} & ReactAntdFormSchemaProps;\n\nexport type IState = {\n loading: boolean;\n touched: boolean;\n};\n\n/**\n * 当前 card loading 不要直接使用,因为这个 loading 会导致 Card 里的 formRef 被设置成 null\n * 这个情况仅在 class component 里才会出现,function component 里不会:\n * 报错示例:\n *\n * this.formRef?: null\n * index.tsx:229 this.formRef?: {getFieldValue: ƒ, getFieldsValue: ƒ, getFieldError: ƒ, getFieldWarning: ƒ, getFieldsError: ƒ, …}\n * index.tsx:229 this.formRef?: null\n *\n * initGuard | submitGuard:\n * https://chat.qwen.ai/c/60329863-0e5e-47f9-a075-a65ad30940cc\n *\n * onMutate:\n * 在 create/update 成功后,需要刷新列表,可以用 onMutate 继续后续处理。\n *\n * blocker:\n * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。\n * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor\n *\n * transformRequest:\n * 当你提交表单的时候,需要对参数进行一些预处理,比如加密,或者添加一些默认值,这个时候就可以用 transformRequest。\n */\n\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n disableBackWhenEdit: false,\n blocker: false,\n mute: false,\n initGuard: () => Promise.resolve(),\n submitGuard: () => Promise.resolve(),\n payloadFields: { include: [], exclude: [] },\n };\n\n private formRef = React.createRef<FormInstance>(); // 注意类型\n private _isMounted = false;\n private _initialValues = null;\n\n get isEdit() {\n const { params } = this.props;\n return Boolean(params?.id);\n }\n\n get canSave() {\n const { touched, loading } = this.state;\n if (!this.isEdit) return !loading;\n return touched && !loading;\n }\n\n get titleView() {\n const { title } = this.props;\n const _title = title || (this.isEdit ? this.t('update_title') : this.t('create_title'));\n return (\n <Space>\n {_title}\n <span>{this.touchedView}</span>\n </Space>\n );\n }\n\n get touchedView() {\n if (!this.isEdit) return null;\n return this.state.touched ? (\n <em style={{ color: '#f60' }}>\n <DiffOutlined />\n </em>\n ) : null;\n }\n\n get extraView() {\n const { extra, backText, backProps } = this.props;\n if (extra) return extra;\n return (\n <Button size=\"small\" icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n );\n }\n\n get childrenView() {\n const { okText, backText, okProps, backProps, children } = this.props;\n const _okText = okText || (this.isEdit ? this.t('update') : this.t('create'));\n if (children) return children;\n\n return (\n <Space>\n <Button\n disabled={!this.canSave}\n htmlType=\"submit\"\n type=\"primary\"\n icon={<SaveOutlined />}\n {...okProps}>\n {_okText || this.t('submit')}\n </Button>\n <Button icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n </Space>\n );\n }\n\n get formInstance() {\n return this.formRef?.current;\n }\n\n constructor(props: ReactAntResourceFormProps) {\n super(props);\n this.state = {\n loading: props.loading!,\n touched: false,\n };\n\n this.handleStateRequest = this.handleStateRequest.bind(this);\n this.handleStateResponse = this.handleStateResponse.bind(this);\n this.initDetailIfNeeded = this.initDetailIfNeeded.bind(this);\n\n props.onInit?.(this);\n }\n\n private t(key: string) {\n const { lang } = this.props;\n return API_FORM_LOCALES[lang!][key];\n }\n\n private msg(msg: string, type: MsgType = 'success') {\n const { mute } = this.props;\n if (!mute) message[type](msg);\n }\n\n private handleBack = () => {\n nx.$nav(-1);\n };\n\n private setInitialValues = () => {\n this._initialValues = this.formInstance?.getFieldsValue();\n };\n\n handleStateRequest(stagePayload: StagePayload) {\n const { payloadFields, transformRequest } = this.props;\n this.setState({ loading: true });\n const rawPayload = transformRequest?.(stagePayload) || stagePayload.payload;\n return filterPayload(rawPayload, payloadFields);\n }\n\n handleStateResponse(res: StageData) {\n const { name } = this.props;\n this.setState({ loading: false });\n nx.$event?.emit?.(`${name}:refetch`);\n return this.props.transformResponse?.(res) || res.data;\n }\n\n handleFinish = (values: any) => {\n if (!this.canSave) {\n this.msg(this.t('no_change'), 'info');\n return;\n }\n this.isEdit ? this.onResourceUpdate(values) : this.onResourceCreate(values);\n };\n\n private onResourceUpdate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { id: params!.id, ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'update', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n params,\n };\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_update`](_payload)\n .then((res: any) => {\n this.msg(this.t('update_success'));\n this.handleStateResponse({ stage: 'update', data: res });\n onMutate?.({ ...mutateArgs, data: res });\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.props.onTouchedChange?.(false);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, disableBackWhenEdit, submitGuard, onMutate } = this.props;\n const payload = { ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'create', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n params,\n };\n\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_create`](_payload)\n .then((res: any) => {\n this.msg(this.t('create_success'));\n this.handleStateResponse({ stage: 'create', data: res });\n this.formInstance?.resetFields();\n onMutate?.({ ...mutateArgs, data: res });\n this.props.onTouchedChange?.(false);\n if (!disableBackWhenEdit) history.back();\n })\n .finally(() => this.setState({ loading: false }));\n });\n };\n\n // hotkey save handler (replaces useKeyboardSave hook)\n handleKeydown = (e: KeyboardEvent) => {\n const { disableHotkeySave } = this.props;\n const isSave = (e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S');\n if (isSave) {\n e.preventDefault();\n if (!disableHotkeySave) {\n this.formInstance?.submit();\n }\n }\n };\n\n handleValuesChange = (_: any, allValues: any) => {\n if (this._isMounted && this._initialValues !== null) {\n const newTouched = !deepEqual(this._initialValues, allValues);\n this.setState({\n touched: newTouched,\n });\n this.props.onTouchedChange?.(newTouched);\n }\n };\n\n componentDidMount() {\n this._isMounted = true;\n // attach hotkey listener\n window.addEventListener('keydown', this.handleKeydown);\n // initialize detail if editing\n this.initDetailIfNeeded();\n }\n\n componentDidUpdate(prevProps: ReactAntResourceFormProps) {\n const prevId = prevProps.params?.id;\n const curId = this.props.params?.id;\n // re-init when id changed or from create -> edit\n if (prevId !== curId) {\n this.initDetailIfNeeded();\n }\n\n // loading update\n if (prevProps.loading !== this.props.loading) {\n this.setState({ loading: this.props.loading! });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeydown);\n this._isMounted = false;\n }\n\n initDetailIfNeeded() {\n const { params, name, initGuard } = this.props;\n const resourceShow = `${name}_show`;\n\n if (this.isEdit) {\n const payload = { id: params!.id };\n const _payload = this.handleStateRequest({ stage: 'show', payload });\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n nx.$api[resourceShow](_payload)\n .then((res: any) => {\n if (!this._isMounted) return; // 👈 关键:防止操作已卸载组件\n const data = this.handleStateResponse({ stage: 'show', data: res });\n this.formInstance?.setFieldsValue?.(data);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.props.onTouchedChange?.(false);\n });\n });\n } else {\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: null,\n isEdit: false,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n this.setInitialValues();\n this.setState({ loading: false });\n this.props.onTouchedChange?.(false);\n });\n }\n }\n\n render() {\n const {\n className,\n name,\n meta,\n children,\n lang,\n title,\n extra,\n size,\n okText,\n backText,\n okProps,\n backProps,\n classNames,\n params,\n transformRequest,\n transformResponse,\n disableHotkeySave,\n disableBackWhenEdit,\n blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\n payloadFields,\n onTouchedChange,\n ...rest\n } = this.props;\n\n return (\n <Card\n title={this.titleView}\n extra={this.extraView}\n size={size}\n classNames={classNames}\n data-component={CLASS_NAME}\n data-blocker={blocker}\n className={cx(CLASS_NAME, className)}>\n <Spin spinning={this.state.loading}>\n <ReactAntdFormSchema\n meta={meta}\n ref={this.formRef}\n onValuesChange={this.handleValuesChange}\n onFinish={this.handleFinish}\n {...rest}>\n {this.childrenView}\n </ReactAntdFormSchema>\n </Spin>\n </Card>\n );\n }\n}\n\n\nexport default ReactAntResourceForm;\n","export const API_FORM_LOCALES = {\n 'zh-CN': {\n create: '创建',\n update: '保存',\n create_title: '创建',\n update_title: '更新',\n create_success: '创建成功',\n update_success: '更新成功',\n submit: '提交',\n back: '返回',\n no_change: '没有修改',\n blocker_title: '确认离开',\n blocker_message: '您有未保存的更改,确定要离开吗?',\n blocker_confirm: '离开',\n blocker_cancel: '取消',\n },\n 'en-US': {\n create: 'Create',\n update: 'Save',\n create_title: 'Create',\n update_title: 'Update',\n create_success: 'Create success',\n update_success: 'Update success',\n submit: 'Submit',\n back: 'Back',\n no_change: 'No change',\n blocker_title: 'Confirm Leave',\n blocker_message: 'You have unsaved changes. Are you sure you want to leave?',\n blocker_confirm: 'Leave',\n blocker_cancel: 'Cancel',\n },\n};\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 16:46:34\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-10-31 16:51:16\n *\n * AI(filterPayload): https://chat.qwen.ai/c/5213efdf-e88d-4367-9bd1-bd4d23af6223\n */\n\nexport interface PayloadFieldConfig {\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * 根据 include/exclude 规则过滤 payload 对象\n * @param payload 原始对象(会被浅拷贝,不修改原对象)\n * @param config 字段过滤配置\n * @returns 过滤后的新对象\n */\nexport function filterPayload(\n payload: Record<string, any> | null | undefined,\n config: PayloadFieldConfig = {},\n): Record<string, any> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return {};\n }\n\n const { include, exclude } = config;\n let result = { ...payload }; // 浅拷贝(ES5 兼容写法见下方备注)\n\n // --- include: 白名单 ---\n if (Array.isArray(include) && include.length > 0) {\n const allowed: Record<string, any> = {};\n const includeSet: Record<string, boolean> = {};\n for (let i = 0; i < include.length; i++) {\n includeSet[include[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && includeSet[key]) {\n allowed[key] = result[key];\n }\n }\n result = allowed;\n }\n\n // --- exclude: 黑名单 ---\n if (Array.isArray(exclude) && exclude.length > 0) {\n const final: Record<string, any> = {};\n const excludeSet: Record<string, boolean> = {};\n for (let i = 0; i < exclude.length; i++) {\n excludeSet[exclude[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && !excludeSet[key]) {\n final[key] = result[key];\n }\n }\n result = final;\n }\n\n return result;\n}\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 13:20:41\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-11-02 14:42:32\n */\nimport React, { FC, useState, useCallback } from 'react';\nimport { useBlocker, useParams, useSearchParams } from 'react-router-dom';\nimport fromEntries from 'fromentries';\nimport nx from '@jswork/next';\nimport ReactAntResourceForm, { ReactAntResourceFormProps } from '.';\nimport { Modal } from 'antd';\nimport { API_FORM_LOCALES } from './locales';\n\nconst retainKeys = (obj: Record<string, any>, keys: string[]) => {\n nx.forIn(obj, (key) => {\n if (!keys.includes(key)) {\n delete obj[key];\n }\n });\n return obj;\n};\n\nexport type ReactAntResourceFormFcProps = ReactAntResourceFormProps & {\n allowFields?: string[];\n /** 禁用路由离开拦截(当表单有未保存更改时) */\n disableBlocker?: boolean;\n /** 拦截确认消息 */\n blockerMessage?: string;\n}\n\nconst ReactAntResourceFormFc: FC<ReactAntResourceFormFcProps> = (props) => {\n const { params: overrideParams, allowFields, disableBlocker, blockerMessage, lang = 'zh-CN', ...rest } = props;\n const params = useParams();\n const [searchParams] = useSearchParams();\n const [touched, setTouched] = useState(false);\n const [showBlockerModal, setShowBlockerModal] = useState(false);\n\n const _searchParams = fromEntries(searchParams as any);\n const _params = nx.compactObject({ ..._searchParams, ...params, ...overrideParams });\n if (allowFields?.length) retainKeys(_params, allowFields);\n\n // 获取翻译文本\n const t = useCallback((key: string) => {\n return API_FORM_LOCALES[lang]?.[key] || API_FORM_LOCALES['zh-CN'][key];\n }, [lang]);\n\n // 路由拦截器(默认启用,disableBlocker=true 时禁用)\n const blocker = useBlocker(\n useCallback(({ currentLocation, nextLocation }: any) => {\n const hasChanges = Boolean(touched);\n const isDifferentPath = currentLocation.pathname !== nextLocation.pathname;\n return disableBlocker !== true && hasChanges && isDifferentPath;\n }, [touched, disableBlocker]),\n );\n\n // 使用 useEffect 处理拦截状态变化(避免在 render 中 setState)\n React.useEffect(() => {\n if (blocker.state === 'blocked' && !showBlockerModal) {\n setShowBlockerModal(true);\n } else if ((blocker.state === 'proceeding' || blocker.state === 'unblocked') && showBlockerModal) {\n // 当 blocker 进入 proceeding 或 unblocked 状态时,关闭 Modal\n setShowBlockerModal(false);\n }\n }, [blocker.state, showBlockerModal]);\n\n // 确认离开\n const handleConfirmLeave = useCallback(() => {\n blocker.proceed?.();\n }, [blocker]);\n\n // 取消离开\n const handleCancelLeave = useCallback(() => {\n blocker.reset?.();\n }, [blocker]);\n\n return (\n <>\n <ReactAntResourceForm\n params={_params}\n lang={lang}\n onTouchedChange={(touched) => {\n setTouched(touched);\n // 当表单保存成功后,如果有被拦截的导航且表单不再有更改,继续导航\n if (!touched && blocker.state === 'blocked') {\n blocker.proceed?.();\n }\n }}\n {...rest}\n />\n <Modal\n title={t('blocker_title')}\n open={showBlockerModal}\n onOk={handleConfirmLeave}\n onCancel={handleCancelLeave}\n okText={t('blocker_confirm')}\n cancelText={t('blocker_cancel')}>\n <p>{blockerMessage || t('blocker_message')}</p>\n </Modal>\n </>\n );\n};\n\nexport default ReactAntResourceFormFc;\n","import ReactAntResourceForm from '.';\nimport ReactAntResourceFormFc from './index-rc';\nimport type { ReactAntResourceFormProps } from '.';\nimport type { ReactAntResourceFormFcProps } from './index-rc';\n\nexport default ReactAntResourceForm;\nexport { ReactAntResourceFormFc };\nexport type { ReactAntResourceFormFcProps, ReactAntResourceFormProps };\nexport * from './types';\n"],"mappings":"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","names":["cx","React","Component","Button","Card","message","Space","Spin","ReactAntdFormSchema","ArrowLeftOutlined","DiffOutlined","SaveOutlined","deepEqual","API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","submit","back","no_change","blocker_title","blocker_message","blocker_confirm","blocker_cancel","nx","filterPayload","payload","config","Array","isArray","include","exclude","result","__spreadValues","length","allowed","includeSet","i","key","hasOwnProperty","final","excludeSet","CLASS_NAME","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","_initialValues","handleBack","__name","nx","$nav","setInitialValues","formInstance","getFieldsValue","handleFinish","values","canSave","msg","t","isEdit","onResourceUpdate","onResourceCreate","params","name","submitGuard","onMutate","payload","__spreadValues","id","_payload","handleStateRequest","stage","submitGuardArgs","mutateArgs","then","$api","res","handleStateResponse","data","__spreadProps","finally","_b","setState","loading","onTouchedChange","disableBackWhenEdit","_c","resetFields","history","back","handleKeydown","e","disableHotkeySave","ctrlKey","metaKey","key","preventDefault","submit","handleValuesChange","_","allValues","newTouched","deepEqual","touched","state","bind","initDetailIfNeeded","onInit","Boolean","titleView","title","_title","Space","span","touchedView","em","style","color","DiffOutlined","extraView","extra","backText","backProps","Button","size","icon","ArrowLeftOutlined","onClick","childrenView","okText","okProps","children","_okText","disabled","htmlType","type","SaveOutlined","current","lang","API_FORM_LOCALES","mute","message","stagePayload","payloadFields","transformRequest","rawPayload","filterPayload","_d","$event","emit","transformResponse","componentDidMount","window","addEventListener","componentDidUpdate","prevProps","prevId","curId","componentWillUnmount","removeEventListener","initGuard","resourceShow","initGuardArgs","setFieldsValue","render","className","meta","classNames","blocker","rest","Card","data-component","data-blocker","cx","Spin","spinning","ReactAntdFormSchema","ref","onValuesChange","onFinish","__publicField","defaultProps","Promise","resolve","include","exclude","index_default","React","useState","useCallback","useBlocker","useParams","useSearchParams","fromEntries","nx","Modal","retainKeys","__name","obj","keys","nx","forIn","key","includes","ReactAntResourceFormFc","props","params","overrideParams","allowFields","disableBlocker","blockerMessage","lang","rest","useParams","searchParams","useSearchParams","touched","setTouched","useState","showBlockerModal","setShowBlockerModal","_searchParams","fromEntries","_params","compactObject","__spreadValues","length","t","useCallback","_a","API_FORM_LOCALES","blocker","useBlocker","currentLocation","nextLocation","hasChanges","Boolean","isDifferentPath","pathname","React","useEffect","state","handleConfirmLeave","proceed","handleCancelLeave","reset","ReactAntResourceForm","onTouchedChange","Modal","title","open","onOk","onCancel","okText","cancelText","p","index_rc_default","main_default","ReactAntResourceForm"]}
|
package/package.json
CHANGED
package/src/index.tsx
CHANGED
|
@@ -23,6 +23,7 @@ declare global {
|
|
|
23
23
|
interface NxStatic {
|
|
24
24
|
$api: Record<string, any>;
|
|
25
25
|
$event: any;
|
|
26
|
+
$nav: any;
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
|
|
@@ -191,7 +192,7 @@ class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState>
|
|
|
191
192
|
}
|
|
192
193
|
|
|
193
194
|
private handleBack = () => {
|
|
194
|
-
|
|
195
|
+
nx.$nav(-1);
|
|
195
196
|
};
|
|
196
197
|
|
|
197
198
|
private setInitialValues = () => {
|