@jswork/react-ant-resource-form 1.0.36 → 1.0.37

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 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 w=Object.defineProperty;var _=Object.getOwnPropertySymbols;var I=Object.prototype.hasOwnProperty,x=Object.prototype.propertyIsEnumerable;var k=(a,i,t)=>i in a?w(a,i,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[i]=t,c=(a,i)=>{for(var t in i||(i={}))I.call(i,t)&&k(a,t,i[t]);if(_)for(var t of _(i))x.call(i,t)&&k(a,t,i[t]);return a};var h=(a,i)=>w(a,"name",{value:i,configurable:!0});var R=(a,i)=>{var t={};for(var e in a)I.call(a,e)&&i.indexOf(e)<0&&(t[e]=a[e]);if(a!=null&&_)for(var e of _(a))i.indexOf(e)<0&&x.call(a,e)&&(t[e]=a[e]);return t};var u=(a,i,t)=>k(a,typeof i!="symbol"?i+"":i,t);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 A={"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"},"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"}};var _next = require('@jswork/next'); var _next2 = _interopRequireDefault(_next);require('@jswork/next-compact-object');var v="react-ant-resource-form",f,G=(f=class extends _react.Component{constructor(t){var e;super(t);u(this,"formRef",_react2.default.createRef());u(this,"_isMounted",!1);u(this,"_initialValues",null);u(this,"handleBack",h(()=>{history.back()},"handleBack"));u(this,"setInitialValues",h(()=>{var t;this._initialValues=(t=this.formInstance)==null?void 0:t.getFieldsValue()},"setInitialValues"));u(this,"handleFinish",h(t=>{if(!this.canSave){this.msg(this.t("no_change"),"info");return}this.isEdit?this.onResourceUpdate(t):this.onResourceCreate(t)},"handleFinish"));u(this,"onResourceUpdate",h(t=>{let{params:e,name:s,submitGuard:n,onMutate:r}=this.props,o=c(c({id:e.id},t),e),d=this.handleStateRequest({stage:"update",payload:o}),p={name:s,payload:d,isEdit:!0,values:t,params:e},g={name:s,payload:d,isEdit:!0,values:t};n==null||n(p).then(()=>{_next2.default.$api[`${s}_update`](d).then(m=>{this.msg(this.t("update_success")),this.handleStateResponse({stage:"update",data:m}),r==null||r(g)}).finally(()=>{this.setState({loading:!1}),this.setInitialValues(),this.handleValuesChange(null,this._initialValues)})})},"onResourceUpdate"));u(this,"onResourceCreate",h(t=>{let{params:e,name:s,submitGuard:n,onMutate:r}=this.props,o=c(c({},t),e),d=this.handleStateRequest({stage:"create",payload:o}),p={name:s,payload:d,isEdit:!1,values:t,params:e},g={name:s,payload:d,isEdit:!1,values:t};n==null||n(p).then(()=>{_next2.default.$api[`${s}_create`](d).then(m=>{var S;this.msg(this.t("create_success")),this.handleStateResponse({stage:"create",data:m}),(S=this.formInstance)==null||S.resetFields(),r==null||r(g),history.back()}).finally(()=>this.setState({loading:!1}))})},"onResourceCreate"));u(this,"handleKeydown",h(t=>{var n;let{disableHotkeySave:e}=this.props;(t.ctrlKey||t.metaKey)&&(t.key==="s"||t.key==="S")&&(t.preventDefault(),e||(n=this.formInstance)==null||n.submit())},"handleKeydown"));u(this,"handleValuesChange",h((t,e)=>{this._isMounted&&this._initialValues!==null&&this.setState({touched:!_fastdeepequal2.default.call(void 0, this._initialValues,e)})},"handleValuesChange"));this.state={loading:t.loading,touched:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this),(e=t.onInit)==null||e.call(t,this)}get isEdit(){let{params:t}=this.props;return!!(t!=null&&t.id)}get canSave(){let{touched:t,loading:e}=this.state;return this.isEdit?t&&!e:!e}get titleView(){let{title:t}=this.props,e=t||(this.isEdit?this.t("update_title"):this.t("create_title"));return _react2.default.createElement(_antd.Space,null,e,_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:t,backText:e,backProps:s}=this.props;return t||_react2.default.createElement(_antd.Button,c({size:"small",icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:this.handleBack},s),e||this.t("back"))}get childrenView(){let{okText:t,backText:e,okProps:s,backProps:n,children:r}=this.props,o=t||(this.isEdit?this.t("update"):this.t("create"));return r||_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),o||this.t("submit")),_react2.default.createElement(_antd.Button,c({icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:this.handleBack},n),e||this.t("back")))}get formInstance(){var t;return(t=this.formRef)==null?void 0:t.current}t(t){let{lang:e}=this.props;return A[e][t]}msg(t,e="success"){let{mute:s}=this.props;s||_antd.message[e](t)}handleStateRequest(t){var e,s;return this.setState({loading:!0}),((s=(e=this.props).transformRequest)==null?void 0:s.call(e,t))||t.payload}handleStateResponse(t){var s,n,r,o;let{name:e}=this.props;return this.setState({loading:!1}),(n=(s=_next2.default.$event)==null?void 0:s.emit)==null||n.call(s,`${e}:refetch`),((o=(r=this.props).transformResponse)==null?void 0:o.call(r,t))||t.data}componentDidMount(){this._isMounted=!0,window.addEventListener("keydown",this.handleKeydown),this.initDetailIfNeeded()}componentDidUpdate(t){var n,r;let e=(n=t.params)==null?void 0:n.id,s=(r=this.props.params)==null?void 0:r.id;e!==s&&this.initDetailIfNeeded(),t.loading!==this.props.loading&&this.setState({loading:this.props.loading})}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:t,name:e,initGuard:s}=this.props,n=`${e}_show`;if(this.isEdit){let r={id:t.id},o=this.handleStateRequest({stage:"show",payload:r}),d={name:e,payload:o,isEdit:!0,params:t};s==null||s(d).then(()=>{_next2.default.$api[n](o).then(p=>{var m,S;if(!this._isMounted)return;let g=this.handleStateResponse({stage:"show",data:p});(S=(m=this.formInstance)==null?void 0:m.setFieldsValue)==null||S.call(m,g)}).finally(()=>{this.setState({loading:!1}),this.setInitialValues()})})}else{let r={name:e,payload:null,isEdit:!1,params:t};s==null||s(r).then(()=>{this.setInitialValues(),this.setState({loading:!1})})}}render(){let V=this.props,{className:t,name:e,meta:s,children:n,lang:r,title:o,extra:d,size:p,okText:g,backText:m,okProps:S,backProps:j,classNames:P,params:tt,transformRequest:et,transformResponse:st,disableHotkeySave:at,blocker:q,mute:it,onInit:nt,onMutate:rt,initGuard:ot,submitGuard:lt,loading:ct}=V,D=R(V,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave","blocker","mute","onInit","onMutate","initGuard","submitGuard","loading"]);return _react2.default.createElement(_antd.Card,{title:this.titleView,extra:this.extraView,size:p,classNames:P,"data-component":v,"data-blocker":q,className:_classnames2.default.call(void 0, v,t)},_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},D),this.childrenView)))}},h(f,"ReactAntResourceForm"),u(f,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1,blocker:!1,mute:!1,initGuard:h(()=>Promise.resolve(),"initGuard"),submitGuard:h(()=>Promise.resolve(),"submitGuard")}),f),y=G;var _reactrouterdom = require('react-router-dom');var _fromentries = require('fromentries'); var _fromentries2 = _interopRequireDefault(_fromentries);var X=h((a,i)=>(_next2.default.forIn(a,t=>{i.includes(t)||delete a[t]}),a),"retainKeys"),Y=h(a=>{let d=a,{params:i,allowFields:t}=d,e=R(d,["params","allowFields"]),s=_reactrouterdom.useParams.call(void 0, ),[n]=_reactrouterdom.useSearchParams.call(void 0, ),r=_fromentries2.default.call(void 0, n),o=_next2.default.compactObject(c(c(c({},r),s),i));return t!=null&&t.length&&t.length>0&&X(o,t),_react2.default.createElement(y,c({params:o},e))},"ReactAntResourceFormFc"),Z= exports.ReactAntResourceFormFc =Y;var Nt=y;exports.ReactAntResourceFormFc = Z; exports.default = Nt;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var A=Object.defineProperty;var S=Object.getOwnPropertySymbols;var x=Object.prototype.hasOwnProperty,V=Object.prototype.propertyIsEnumerable;var k=(n,o,t)=>o in n?A(n,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[o]=t,l=(n,o)=>{for(var t in o||(o={}))x.call(o,t)&&k(n,t,o[t]);if(S)for(var t of S(o))V.call(o,t)&&k(n,t,o[t]);return n};var c=(n,o)=>A(n,"name",{value:o,configurable:!0});var _=(n,o)=>{var t={};for(var e in n)x.call(n,e)&&o.indexOf(e)<0&&(t[e]=n[e]);if(n!=null&&S)for(var e of S(n))o.indexOf(e)<0&&V.call(n,e)&&(t[e]=n[e]);return t};var u=(n,o,t)=>k(n,typeof o!="symbol"?o+"":o,t);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 I={"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"},"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"}};var _next = require('@jswork/next'); var _next2 = _interopRequireDefault(_next);require('@jswork/next-compact-object');function C(n,o={}){if(!n||typeof n!="object"||Array.isArray(n))return{};let{include:t,exclude:e}=o,s=l({},n);if(Array.isArray(t)&&t.length>0){let i={},r={};for(let a=0;a<t.length;a++)r[t[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&r[a]&&(i[a]=s[a]);s=i}if(Array.isArray(e)&&e.length>0){let i={},r={};for(let a=0;a<e.length;a++)r[e[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&!r[a]&&(i[a]=s[a]);s=i}return s}c(C,"filterPayload");var v="react-ant-resource-form",f,H=(f=class extends _react.Component{constructor(t){var e;super(t);u(this,"formRef",_react2.default.createRef());u(this,"_isMounted",!1);u(this,"_initialValues",null);u(this,"handleBack",c(()=>{history.back()},"handleBack"));u(this,"setInitialValues",c(()=>{var t;this._initialValues=(t=this.formInstance)==null?void 0:t.getFieldsValue()},"setInitialValues"));u(this,"handleFinish",c(t=>{if(!this.canSave){this.msg(this.t("no_change"),"info");return}this.isEdit?this.onResourceUpdate(t):this.onResourceCreate(t)},"handleFinish"));u(this,"onResourceUpdate",c(t=>{let{params:e,name:s,submitGuard:i,onMutate:r}=this.props,a=l(l({id:e.id},t),e),h=this.handleStateRequest({stage:"update",payload:a}),p={name:s,payload:h,isEdit:!0,values:t,params:e},g={name:s,payload:h,isEdit:!0,values:t};i==null||i(p).then(()=>{_next2.default.$api[`${s}_update`](h).then(m=>{this.msg(this.t("update_success")),this.handleStateResponse({stage:"update",data:m}),r==null||r(g)}).finally(()=>{this.setState({loading:!1}),this.setInitialValues(),this.handleValuesChange(null,this._initialValues)})})},"onResourceUpdate"));u(this,"onResourceCreate",c(t=>{let{params:e,name:s,submitGuard:i,onMutate:r}=this.props,a=l(l({},t),e),h=this.handleStateRequest({stage:"create",payload:a}),p={name:s,payload:h,isEdit:!1,values:t,params:e},g={name:s,payload:h,isEdit:!1,values:t};i==null||i(p).then(()=>{_next2.default.$api[`${s}_create`](h).then(m=>{var y;this.msg(this.t("create_success")),this.handleStateResponse({stage:"create",data:m}),(y=this.formInstance)==null||y.resetFields(),r==null||r(g),history.back()}).finally(()=>this.setState({loading:!1}))})},"onResourceCreate"));u(this,"handleKeydown",c(t=>{var i;let{disableHotkeySave:e}=this.props;(t.ctrlKey||t.metaKey)&&(t.key==="s"||t.key==="S")&&(t.preventDefault(),e||(i=this.formInstance)==null||i.submit())},"handleKeydown"));u(this,"handleValuesChange",c((t,e)=>{this._isMounted&&this._initialValues!==null&&this.setState({touched:!_fastdeepequal2.default.call(void 0, this._initialValues,e)})},"handleValuesChange"));this.state={loading:t.loading,touched:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this),(e=t.onInit)==null||e.call(t,this)}get isEdit(){let{params:t}=this.props;return!!(t!=null&&t.id)}get canSave(){let{touched:t,loading:e}=this.state;return this.isEdit?t&&!e:!e}get titleView(){let{title:t}=this.props,e=t||(this.isEdit?this.t("update_title"):this.t("create_title"));return _react2.default.createElement(_antd.Space,null,e,_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:t,backText:e,backProps:s}=this.props;return t||_react2.default.createElement(_antd.Button,l({size:"small",icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:this.handleBack},s),e||this.t("back"))}get childrenView(){let{okText:t,backText:e,okProps:s,backProps:i,children:r}=this.props,a=t||(this.isEdit?this.t("update"):this.t("create"));return r||_react2.default.createElement(_antd.Space,null,_react2.default.createElement(_antd.Button,l({disabled:!this.canSave,htmlType:"submit",type:"primary",icon:_react2.default.createElement(_icons.SaveOutlined,null)},s),a||this.t("submit")),_react2.default.createElement(_antd.Button,l({icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:this.handleBack},i),e||this.t("back")))}get formInstance(){var t;return(t=this.formRef)==null?void 0:t.current}t(t){let{lang:e}=this.props;return I[e][t]}msg(t,e="success"){let{mute:s}=this.props;s||_antd.message[e](t)}handleStateRequest(t){let{payloadFields:e,transformRequest:s}=this.props;this.setState({loading:!0});let i=(s==null?void 0:s(t))||t.payload;return C(i,e)}handleStateResponse(t){var s,i,r,a;let{name:e}=this.props;return this.setState({loading:!1}),(i=(s=_next2.default.$event)==null?void 0:s.emit)==null||i.call(s,`${e}:refetch`),((a=(r=this.props).transformResponse)==null?void 0:a.call(r,t))||t.data}componentDidMount(){this._isMounted=!0,window.addEventListener("keydown",this.handleKeydown),this.initDetailIfNeeded()}componentDidUpdate(t){var i,r;let e=(i=t.params)==null?void 0:i.id,s=(r=this.props.params)==null?void 0:r.id;e!==s&&this.initDetailIfNeeded(),t.loading!==this.props.loading&&this.setState({loading:this.props.loading})}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:t,name:e,initGuard:s}=this.props,i=`${e}_show`;if(this.isEdit){let r={id:t.id},a=this.handleStateRequest({stage:"show",payload:r}),h={name:e,payload:a,isEdit:!0,params:t};s==null||s(h).then(()=>{_next2.default.$api[i](a).then(p=>{var m,y;if(!this._isMounted)return;let g=this.handleStateResponse({stage:"show",data:p});(y=(m=this.formInstance)==null?void 0:m.setFieldsValue)==null||y.call(m,g)}).finally(()=>{this.setState({loading:!1}),this.setInitialValues()})})}else{let r={name:e,payload:null,isEdit:!1,params:t};s==null||s(r).then(()=>{this.setInitialValues(),this.setState({loading:!1})})}}render(){let w=this.props,{className:t,name:e,meta:s,children:i,lang:r,title:a,extra:h,size:p,okText:g,backText:m,okProps:y,backProps:tt,classNames:O,params:et,transformRequest:st,transformResponse:at,disableHotkeySave:it,blocker:D,mute:nt,onInit:rt,onMutate:ot,initGuard:lt,submitGuard:ct,loading:dt,payloadFields:ht}=w,L=_(w,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave","blocker","mute","onInit","onMutate","initGuard","submitGuard","loading","payloadFields"]);return _react2.default.createElement(_antd.Card,{title:this.titleView,extra:this.extraView,size:p,classNames:O,"data-component":v,"data-blocker":D,className:_classnames2.default.call(void 0, v,t)},_react2.default.createElement(_antd.Spin,{spinning:this.state.loading},_react2.default.createElement(_reactantformschema2.default,l({meta:s,ref:this.formRef,onValuesChange:this.handleValuesChange,onFinish:this.handleFinish},L),this.childrenView)))}},c(f,"ReactAntResourceForm"),u(f,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1,blocker:!1,mute:!1,initGuard:c(()=>Promise.resolve(),"initGuard"),submitGuard:c(()=>Promise.resolve(),"submitGuard"),payloadFields:{include:[],exclude:[]}}),f),E=H;var _reactrouterdom = require('react-router-dom');var _fromentries = require('fromentries'); var _fromentries2 = _interopRequireDefault(_fromentries);var X=c((n,o)=>(_next2.default.forIn(n,t=>{o.includes(t)||delete n[t]}),n),"retainKeys"),Y=c(n=>{let h=n,{params:o,allowFields:t}=h,e=_(h,["params","allowFields"]),s=_reactrouterdom.useParams.call(void 0, ),[i]=_reactrouterdom.useSearchParams.call(void 0, ),r=_fromentries2.default.call(void 0, i),a=_next2.default.compactObject(l(l(l({},r),s),o));return t!=null&&t.length&&t.length>0&&X(a,t),_react2.default.createElement(E,l({params:a},e))},"ReactAntResourceFormFc"),Z= exports.ReactAntResourceFormFc =Y;var Mt=E;exports.ReactAntResourceFormFc = Z; exports.default = Mt;
2
2
  //# sourceMappingURL=main.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/ap7/github/react-ant-resource-form/packages/lib/dist/main.cjs.js","../src/index.tsx","../src/locales.ts"],"names":["API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","submit","back","no_change","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","payload","__spreadValues","id","_payload","handleStateRequest","stage","submitGuardArgs","mutateArgs","then","nx","$api"],"mappings":"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","file":"/Users/ap7/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';\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 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 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} & 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\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n blocker: false,\n mute: false,\n initGuard: () => Promise.resolve(),\n submitGuard: () => Promise.resolve(),\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 this.setState({ loading: true });\n return this.props.transformRequest?.(stagePayload) || stagePayload.payload;\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);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.handleValuesChange(null, this._initialValues);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, 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);\n 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 this.setState({\n touched: !deepEqual(this._initialValues, allValues),\n });\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 });\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 });\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 blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\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 },\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 },\n};\n"]}
1
+ {"version":3,"sources":["/Users/ap7/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","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/ap7/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 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 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 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 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);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.handleValuesChange(null, this._initialValues);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, 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);\n 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 this.setState({\n touched: !deepEqual(this._initialValues, allValues),\n });\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 });\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 });\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 blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\n payloadFields,\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 },\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 },\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:46:47\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
@@ -59,6 +59,10 @@ type ReactAntResourceFormProps = {
59
59
  title?: CardProps['title'];
60
60
  onInit?: (ctx: ReactAntResourceForm) => void;
61
61
  onMutate?: (args: MutateArgs) => void;
62
+ payloadFields?: {
63
+ include?: string[];
64
+ exclude?: string[];
65
+ };
62
66
  } & ReactAntdFormSchemaProps;
63
67
  type IState = {
64
68
  loading: boolean;
@@ -82,6 +86,9 @@ type IState = {
82
86
  * blocker:
83
87
  * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。
84
88
  * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor
89
+ *
90
+ * transformRequest:
91
+ * 当你提交表单的时候,需要对参数进行一些预处理,比如加密,或者添加一些默认值,这个时候就可以用 transformRequest。
85
92
  */
86
93
  declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {
87
94
  static defaultProps: {
@@ -91,6 +98,10 @@ declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps,
91
98
  mute: boolean;
92
99
  initGuard: () => Promise<void>;
93
100
  submitGuard: () => Promise<void>;
101
+ payloadFields: {
102
+ include: never[];
103
+ exclude: never[];
104
+ };
94
105
  };
95
106
  private formRef;
96
107
  private _isMounted;
@@ -107,7 +118,7 @@ declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps,
107
118
  private msg;
108
119
  private handleBack;
109
120
  private setInitialValues;
110
- handleStateRequest(stagePayload: StagePayload): any;
121
+ handleStateRequest(stagePayload: StagePayload): Record<string, any>;
111
122
  handleStateResponse(res: StageData): any;
112
123
  handleFinish: (values: any) => void;
113
124
  private onResourceUpdate;
package/dist/main.d.ts CHANGED
@@ -59,6 +59,10 @@ type ReactAntResourceFormProps = {
59
59
  title?: CardProps['title'];
60
60
  onInit?: (ctx: ReactAntResourceForm) => void;
61
61
  onMutate?: (args: MutateArgs) => void;
62
+ payloadFields?: {
63
+ include?: string[];
64
+ exclude?: string[];
65
+ };
62
66
  } & ReactAntdFormSchemaProps;
63
67
  type IState = {
64
68
  loading: boolean;
@@ -82,6 +86,9 @@ type IState = {
82
86
  * blocker:
83
87
  * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。
84
88
  * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor
89
+ *
90
+ * transformRequest:
91
+ * 当你提交表单的时候,需要对参数进行一些预处理,比如加密,或者添加一些默认值,这个时候就可以用 transformRequest。
85
92
  */
86
93
  declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {
87
94
  static defaultProps: {
@@ -91,6 +98,10 @@ declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps,
91
98
  mute: boolean;
92
99
  initGuard: () => Promise<void>;
93
100
  submitGuard: () => Promise<void>;
101
+ payloadFields: {
102
+ include: never[];
103
+ exclude: never[];
104
+ };
94
105
  };
95
106
  private formRef;
96
107
  private _isMounted;
@@ -107,7 +118,7 @@ declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps,
107
118
  private msg;
108
119
  private handleBack;
109
120
  private setInitialValues;
110
- handleStateRequest(stagePayload: StagePayload): any;
121
+ handleStateRequest(stagePayload: StagePayload): Record<string, any>;
111
122
  handleStateResponse(res: StageData): any;
112
123
  handleFinish: (values: any) => void;
113
124
  private onResourceUpdate;
package/dist/main.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- var w=Object.defineProperty;var _=Object.getOwnPropertySymbols;var I=Object.prototype.hasOwnProperty,x=Object.prototype.propertyIsEnumerable;var k=(a,i,t)=>i in a?w(a,i,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[i]=t,c=(a,i)=>{for(var t in i||(i={}))I.call(i,t)&&k(a,t,i[t]);if(_)for(var t of _(i))x.call(i,t)&&k(a,t,i[t]);return a};var h=(a,i)=>w(a,"name",{value:i,configurable:!0});var R=(a,i)=>{var t={};for(var e in a)I.call(a,e)&&i.indexOf(e)<0&&(t[e]=a[e]);if(a!=null&&_)for(var e of _(a))i.indexOf(e)<0&&x.call(a,e)&&(t[e]=a[e]);return t};var u=(a,i,t)=>k(a,typeof i!="symbol"?i+"":i,t);import L from"classnames";import l,{Component as M}from"react";import{Button as b,Card as O,message as $,Space as C,Spin as T}from"antd";import U from"@jswork/react-ant-form-schema";import{ArrowLeftOutlined as F,DiffOutlined as B,SaveOutlined as K}from"@ant-design/icons";import z from"fast-deep-equal";var A={"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"},"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"}};import E from"@jswork/next";import"@jswork/next-compact-object";var v="react-ant-resource-form",f,G=(f=class extends M{constructor(t){var e;super(t);u(this,"formRef",l.createRef());u(this,"_isMounted",!1);u(this,"_initialValues",null);u(this,"handleBack",h(()=>{history.back()},"handleBack"));u(this,"setInitialValues",h(()=>{var t;this._initialValues=(t=this.formInstance)==null?void 0:t.getFieldsValue()},"setInitialValues"));u(this,"handleFinish",h(t=>{if(!this.canSave){this.msg(this.t("no_change"),"info");return}this.isEdit?this.onResourceUpdate(t):this.onResourceCreate(t)},"handleFinish"));u(this,"onResourceUpdate",h(t=>{let{params:e,name:s,submitGuard:n,onMutate:r}=this.props,o=c(c({id:e.id},t),e),d=this.handleStateRequest({stage:"update",payload:o}),p={name:s,payload:d,isEdit:!0,values:t,params:e},g={name:s,payload:d,isEdit:!0,values:t};n==null||n(p).then(()=>{E.$api[`${s}_update`](d).then(m=>{this.msg(this.t("update_success")),this.handleStateResponse({stage:"update",data:m}),r==null||r(g)}).finally(()=>{this.setState({loading:!1}),this.setInitialValues(),this.handleValuesChange(null,this._initialValues)})})},"onResourceUpdate"));u(this,"onResourceCreate",h(t=>{let{params:e,name:s,submitGuard:n,onMutate:r}=this.props,o=c(c({},t),e),d=this.handleStateRequest({stage:"create",payload:o}),p={name:s,payload:d,isEdit:!1,values:t,params:e},g={name:s,payload:d,isEdit:!1,values:t};n==null||n(p).then(()=>{E.$api[`${s}_create`](d).then(m=>{var S;this.msg(this.t("create_success")),this.handleStateResponse({stage:"create",data:m}),(S=this.formInstance)==null||S.resetFields(),r==null||r(g),history.back()}).finally(()=>this.setState({loading:!1}))})},"onResourceCreate"));u(this,"handleKeydown",h(t=>{var n;let{disableHotkeySave:e}=this.props;(t.ctrlKey||t.metaKey)&&(t.key==="s"||t.key==="S")&&(t.preventDefault(),e||(n=this.formInstance)==null||n.submit())},"handleKeydown"));u(this,"handleValuesChange",h((t,e)=>{this._isMounted&&this._initialValues!==null&&this.setState({touched:!z(this._initialValues,e)})},"handleValuesChange"));this.state={loading:t.loading,touched:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this),(e=t.onInit)==null||e.call(t,this)}get isEdit(){let{params:t}=this.props;return!!(t!=null&&t.id)}get canSave(){let{touched:t,loading:e}=this.state;return this.isEdit?t&&!e:!e}get titleView(){let{title:t}=this.props,e=t||(this.isEdit?this.t("update_title"):this.t("create_title"));return l.createElement(C,null,e,l.createElement("span",null,this.touchedView))}get touchedView(){return this.isEdit&&this.state.touched?l.createElement("em",{style:{color:"#f60"}},l.createElement(B,null)):null}get extraView(){let{extra:t,backText:e,backProps:s}=this.props;return t||l.createElement(b,c({size:"small",icon:l.createElement(F,null),onClick:this.handleBack},s),e||this.t("back"))}get childrenView(){let{okText:t,backText:e,okProps:s,backProps:n,children:r}=this.props,o=t||(this.isEdit?this.t("update"):this.t("create"));return r||l.createElement(C,null,l.createElement(b,c({disabled:!this.canSave,htmlType:"submit",type:"primary",icon:l.createElement(K,null)},s),o||this.t("submit")),l.createElement(b,c({icon:l.createElement(F,null),onClick:this.handleBack},n),e||this.t("back")))}get formInstance(){var t;return(t=this.formRef)==null?void 0:t.current}t(t){let{lang:e}=this.props;return A[e][t]}msg(t,e="success"){let{mute:s}=this.props;s||$[e](t)}handleStateRequest(t){var e,s;return this.setState({loading:!0}),((s=(e=this.props).transformRequest)==null?void 0:s.call(e,t))||t.payload}handleStateResponse(t){var s,n,r,o;let{name:e}=this.props;return this.setState({loading:!1}),(n=(s=E.$event)==null?void 0:s.emit)==null||n.call(s,`${e}:refetch`),((o=(r=this.props).transformResponse)==null?void 0:o.call(r,t))||t.data}componentDidMount(){this._isMounted=!0,window.addEventListener("keydown",this.handleKeydown),this.initDetailIfNeeded()}componentDidUpdate(t){var n,r;let e=(n=t.params)==null?void 0:n.id,s=(r=this.props.params)==null?void 0:r.id;e!==s&&this.initDetailIfNeeded(),t.loading!==this.props.loading&&this.setState({loading:this.props.loading})}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:t,name:e,initGuard:s}=this.props,n=`${e}_show`;if(this.isEdit){let r={id:t.id},o=this.handleStateRequest({stage:"show",payload:r}),d={name:e,payload:o,isEdit:!0,params:t};s==null||s(d).then(()=>{E.$api[n](o).then(p=>{var m,S;if(!this._isMounted)return;let g=this.handleStateResponse({stage:"show",data:p});(S=(m=this.formInstance)==null?void 0:m.setFieldsValue)==null||S.call(m,g)}).finally(()=>{this.setState({loading:!1}),this.setInitialValues()})})}else{let r={name:e,payload:null,isEdit:!1,params:t};s==null||s(r).then(()=>{this.setInitialValues(),this.setState({loading:!1})})}}render(){let V=this.props,{className:t,name:e,meta:s,children:n,lang:r,title:o,extra:d,size:p,okText:g,backText:m,okProps:S,backProps:j,classNames:P,params:tt,transformRequest:et,transformResponse:st,disableHotkeySave:at,blocker:q,mute:it,onInit:nt,onMutate:rt,initGuard:ot,submitGuard:lt,loading:ct}=V,D=R(V,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave","blocker","mute","onInit","onMutate","initGuard","submitGuard","loading"]);return l.createElement(O,{title:this.titleView,extra:this.extraView,size:p,classNames:P,"data-component":v,"data-blocker":q,className:L(v,t)},l.createElement(T,{spinning:this.state.loading},l.createElement(U,c({meta:s,ref:this.formRef,onValuesChange:this.handleValuesChange,onFinish:this.handleFinish},D),this.childrenView)))}},h(f,"ReactAntResourceForm"),u(f,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1,blocker:!1,mute:!1,initGuard:h(()=>Promise.resolve(),"initGuard"),submitGuard:h(()=>Promise.resolve(),"submitGuard")}),f),y=G;import H from"react";import{useParams as W,useSearchParams as J}from"react-router-dom";import Q from"fromentries";import N from"@jswork/next";var X=h((a,i)=>(N.forIn(a,t=>{i.includes(t)||delete a[t]}),a),"retainKeys"),Y=h(a=>{let d=a,{params:i,allowFields:t}=d,e=R(d,["params","allowFields"]),s=W(),[n]=J(),r=Q(n),o=N.compactObject(c(c(c({},r),s),i));return t!=null&&t.length&&t.length>0&&X(o,t),H.createElement(y,c({params:o},e))},"ReactAntResourceFormFc"),Z=Y;var Nt=y;export{Z as ReactAntResourceFormFc,Nt as default};
1
+ var A=Object.defineProperty;var S=Object.getOwnPropertySymbols;var x=Object.prototype.hasOwnProperty,V=Object.prototype.propertyIsEnumerable;var k=(n,o,t)=>o in n?A(n,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[o]=t,l=(n,o)=>{for(var t in o||(o={}))x.call(o,t)&&k(n,t,o[t]);if(S)for(var t of S(o))V.call(o,t)&&k(n,t,o[t]);return n};var c=(n,o)=>A(n,"name",{value:o,configurable:!0});var _=(n,o)=>{var t={};for(var e in n)x.call(n,e)&&o.indexOf(e)<0&&(t[e]=n[e]);if(n!=null&&S)for(var e of S(n))o.indexOf(e)<0&&V.call(n,e)&&(t[e]=n[e]);return t};var u=(n,o,t)=>k(n,typeof o!="symbol"?o+"":o,t);import M from"classnames";import d,{Component as $}from"react";import{Button as b,Card as q,message as T,Space as F,Spin as U}from"antd";import B from"@jswork/react-ant-form-schema";import{ArrowLeftOutlined as P,DiffOutlined as K,SaveOutlined as z}from"@ant-design/icons";import G from"fast-deep-equal";var I={"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"},"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"}};import R from"@jswork/next";import"@jswork/next-compact-object";function C(n,o={}){if(!n||typeof n!="object"||Array.isArray(n))return{};let{include:t,exclude:e}=o,s=l({},n);if(Array.isArray(t)&&t.length>0){let i={},r={};for(let a=0;a<t.length;a++)r[t[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&r[a]&&(i[a]=s[a]);s=i}if(Array.isArray(e)&&e.length>0){let i={},r={};for(let a=0;a<e.length;a++)r[e[a]]=!0;for(let a in s)s.hasOwnProperty(a)&&!r[a]&&(i[a]=s[a]);s=i}return s}c(C,"filterPayload");var v="react-ant-resource-form",f,H=(f=class extends ${constructor(t){var e;super(t);u(this,"formRef",d.createRef());u(this,"_isMounted",!1);u(this,"_initialValues",null);u(this,"handleBack",c(()=>{history.back()},"handleBack"));u(this,"setInitialValues",c(()=>{var t;this._initialValues=(t=this.formInstance)==null?void 0:t.getFieldsValue()},"setInitialValues"));u(this,"handleFinish",c(t=>{if(!this.canSave){this.msg(this.t("no_change"),"info");return}this.isEdit?this.onResourceUpdate(t):this.onResourceCreate(t)},"handleFinish"));u(this,"onResourceUpdate",c(t=>{let{params:e,name:s,submitGuard:i,onMutate:r}=this.props,a=l(l({id:e.id},t),e),h=this.handleStateRequest({stage:"update",payload:a}),p={name:s,payload:h,isEdit:!0,values:t,params:e},g={name:s,payload:h,isEdit:!0,values:t};i==null||i(p).then(()=>{R.$api[`${s}_update`](h).then(m=>{this.msg(this.t("update_success")),this.handleStateResponse({stage:"update",data:m}),r==null||r(g)}).finally(()=>{this.setState({loading:!1}),this.setInitialValues(),this.handleValuesChange(null,this._initialValues)})})},"onResourceUpdate"));u(this,"onResourceCreate",c(t=>{let{params:e,name:s,submitGuard:i,onMutate:r}=this.props,a=l(l({},t),e),h=this.handleStateRequest({stage:"create",payload:a}),p={name:s,payload:h,isEdit:!1,values:t,params:e},g={name:s,payload:h,isEdit:!1,values:t};i==null||i(p).then(()=>{R.$api[`${s}_create`](h).then(m=>{var y;this.msg(this.t("create_success")),this.handleStateResponse({stage:"create",data:m}),(y=this.formInstance)==null||y.resetFields(),r==null||r(g),history.back()}).finally(()=>this.setState({loading:!1}))})},"onResourceCreate"));u(this,"handleKeydown",c(t=>{var i;let{disableHotkeySave:e}=this.props;(t.ctrlKey||t.metaKey)&&(t.key==="s"||t.key==="S")&&(t.preventDefault(),e||(i=this.formInstance)==null||i.submit())},"handleKeydown"));u(this,"handleValuesChange",c((t,e)=>{this._isMounted&&this._initialValues!==null&&this.setState({touched:!G(this._initialValues,e)})},"handleValuesChange"));this.state={loading:t.loading,touched:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this),(e=t.onInit)==null||e.call(t,this)}get isEdit(){let{params:t}=this.props;return!!(t!=null&&t.id)}get canSave(){let{touched:t,loading:e}=this.state;return this.isEdit?t&&!e:!e}get titleView(){let{title:t}=this.props,e=t||(this.isEdit?this.t("update_title"):this.t("create_title"));return d.createElement(F,null,e,d.createElement("span",null,this.touchedView))}get touchedView(){return this.isEdit&&this.state.touched?d.createElement("em",{style:{color:"#f60"}},d.createElement(K,null)):null}get extraView(){let{extra:t,backText:e,backProps:s}=this.props;return t||d.createElement(b,l({size:"small",icon:d.createElement(P,null),onClick:this.handleBack},s),e||this.t("back"))}get childrenView(){let{okText:t,backText:e,okProps:s,backProps:i,children:r}=this.props,a=t||(this.isEdit?this.t("update"):this.t("create"));return r||d.createElement(F,null,d.createElement(b,l({disabled:!this.canSave,htmlType:"submit",type:"primary",icon:d.createElement(z,null)},s),a||this.t("submit")),d.createElement(b,l({icon:d.createElement(P,null),onClick:this.handleBack},i),e||this.t("back")))}get formInstance(){var t;return(t=this.formRef)==null?void 0:t.current}t(t){let{lang:e}=this.props;return I[e][t]}msg(t,e="success"){let{mute:s}=this.props;s||T[e](t)}handleStateRequest(t){let{payloadFields:e,transformRequest:s}=this.props;this.setState({loading:!0});let i=(s==null?void 0:s(t))||t.payload;return C(i,e)}handleStateResponse(t){var s,i,r,a;let{name:e}=this.props;return this.setState({loading:!1}),(i=(s=R.$event)==null?void 0:s.emit)==null||i.call(s,`${e}:refetch`),((a=(r=this.props).transformResponse)==null?void 0:a.call(r,t))||t.data}componentDidMount(){this._isMounted=!0,window.addEventListener("keydown",this.handleKeydown),this.initDetailIfNeeded()}componentDidUpdate(t){var i,r;let e=(i=t.params)==null?void 0:i.id,s=(r=this.props.params)==null?void 0:r.id;e!==s&&this.initDetailIfNeeded(),t.loading!==this.props.loading&&this.setState({loading:this.props.loading})}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:t,name:e,initGuard:s}=this.props,i=`${e}_show`;if(this.isEdit){let r={id:t.id},a=this.handleStateRequest({stage:"show",payload:r}),h={name:e,payload:a,isEdit:!0,params:t};s==null||s(h).then(()=>{R.$api[i](a).then(p=>{var m,y;if(!this._isMounted)return;let g=this.handleStateResponse({stage:"show",data:p});(y=(m=this.formInstance)==null?void 0:m.setFieldsValue)==null||y.call(m,g)}).finally(()=>{this.setState({loading:!1}),this.setInitialValues()})})}else{let r={name:e,payload:null,isEdit:!1,params:t};s==null||s(r).then(()=>{this.setInitialValues(),this.setState({loading:!1})})}}render(){let w=this.props,{className:t,name:e,meta:s,children:i,lang:r,title:a,extra:h,size:p,okText:g,backText:m,okProps:y,backProps:tt,classNames:O,params:et,transformRequest:st,transformResponse:at,disableHotkeySave:it,blocker:D,mute:nt,onInit:rt,onMutate:ot,initGuard:lt,submitGuard:ct,loading:dt,payloadFields:ht}=w,L=_(w,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave","blocker","mute","onInit","onMutate","initGuard","submitGuard","loading","payloadFields"]);return d.createElement(q,{title:this.titleView,extra:this.extraView,size:p,classNames:O,"data-component":v,"data-blocker":D,className:M(v,t)},d.createElement(U,{spinning:this.state.loading},d.createElement(B,l({meta:s,ref:this.formRef,onValuesChange:this.handleValuesChange,onFinish:this.handleFinish},L),this.childrenView)))}},c(f,"ReactAntResourceForm"),u(f,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1,blocker:!1,mute:!1,initGuard:c(()=>Promise.resolve(),"initGuard"),submitGuard:c(()=>Promise.resolve(),"submitGuard"),payloadFields:{include:[],exclude:[]}}),f),E=H;import W from"react";import{useParams as j,useSearchParams as J}from"react-router-dom";import Q from"fromentries";import N from"@jswork/next";var X=c((n,o)=>(N.forIn(n,t=>{o.includes(t)||delete n[t]}),n),"retainKeys"),Y=c(n=>{let h=n,{params:o,allowFields:t}=h,e=_(h,["params","allowFields"]),s=j(),[i]=J(),r=Q(i),a=N.compactObject(l(l(l({},r),s),o));return t!=null&&t.length&&t.length>0&&X(a,t),W.createElement(E,l({params:a},e))},"ReactAntResourceFormFc"),Z=Y;var Mt=E;export{Z as ReactAntResourceFormFc,Mt as default};
2
2
  //# sourceMappingURL=main.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/locales.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';\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 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 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} & 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\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n blocker: false,\n mute: false,\n initGuard: () => Promise.resolve(),\n submitGuard: () => Promise.resolve(),\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 this.setState({ loading: true });\n return this.props.transformRequest?.(stagePayload) || stagePayload.payload;\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);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.handleValuesChange(null, this._initialValues);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, 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);\n 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 this.setState({\n touched: !deepEqual(this._initialValues, allValues),\n });\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 });\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 });\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 blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\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 },\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 },\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-10-31 13:24:38\n */\nimport React, { FC } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport fromEntries from 'fromentries';\nimport nx from '@jswork/next';\nimport ReactAntResourceForm, { ReactAntResourceFormProps } from '.';\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\n\nexport type ReactAntResourceFormFcProps = ReactAntResourceFormProps & {\n allowFields?: string[];\n}\n\nconst ReactAntResourceFormFc: FC<ReactAntResourceFormFcProps> = (props) => {\n const { params: overrideParams, allowFields, ...rest } = props;\n const params = useParams();\n const [searchParams] = useSearchParams();\n const _searchParams = fromEntries(searchParams as any);\n const _params = nx.compactObject({ ..._searchParams, ...params, ...overrideParams });\n if (allowFields?.length && allowFields.length > 0) retainKeys(_params, allowFields);\n return <ReactAntResourceForm params={_params} {...rest} />;\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 };\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","nx","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","finally","setState","loading","handleValuesChange","resetFields","handleKeydown","e","disableHotkeySave","ctrlKey","metaKey","key","preventDefault","submit","_","allValues","touched","deepEqual","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","_b","transformRequest","_c","_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","index_default","React","useParams","useSearchParams","fromEntries","nx","retainKeys","__name","obj","keys","nx","forIn","key","includes","ReactAntResourceFormFc","props","params","overrideParams","allowFields","rest","useParams","searchParams","useSearchParams","_searchParams","fromEntries","_params","compactObject","__spreadValues","length","React","ReactAntResourceForm","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 }\n}\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nexport type ReactAntResourceFormProps = {\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 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 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 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);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.handleValuesChange(null, this._initialValues);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, 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);\n 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 this.setState({\n touched: !deepEqual(this._initialValues, allValues),\n });\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 });\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 });\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 blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\n payloadFields,\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 },\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 },\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:46:47\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-10-31 13:24:38\n */\nimport React, { FC } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport fromEntries from 'fromentries';\nimport nx from '@jswork/next';\nimport ReactAntResourceForm, { ReactAntResourceFormProps } from '.';\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\n\nexport type ReactAntResourceFormFcProps = ReactAntResourceFormProps & {\n allowFields?: string[];\n}\n\nconst ReactAntResourceFormFc: FC<ReactAntResourceFormFcProps> = (props) => {\n const { params: overrideParams, allowFields, ...rest } = props;\n const params = useParams();\n const [searchParams] = useSearchParams();\n const _searchParams = fromEntries(searchParams as any);\n const _params = nx.compactObject({ ..._searchParams, ...params, ...overrideParams });\n if (allowFields?.length && allowFields.length > 0) retainKeys(_params, allowFields);\n return <ReactAntResourceForm params={_params} {...rest} />;\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 };\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","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","finally","setState","loading","handleValuesChange","resetFields","handleKeydown","e","disableHotkeySave","ctrlKey","metaKey","key","preventDefault","submit","_","allValues","touched","deepEqual","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","_b","_c","_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","useParams","useSearchParams","fromEntries","nx","retainKeys","__name","obj","keys","nx","forIn","key","includes","ReactAntResourceFormFc","props","params","overrideParams","allowFields","rest","useParams","searchParams","useSearchParams","_searchParams","fromEntries","_params","compactObject","__spreadValues","length","React","ReactAntResourceForm","index_rc_default","main_default","ReactAntResourceForm"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jswork/react-ant-resource-form",
3
- "version": "1.0.36",
3
+ "version": "1.0.37",
4
4
  "main": "dist/main.cjs.js",
5
5
  "module": "dist/main.esm.js",
6
6
  "types": "dist/main.d.ts",
package/src/index.tsx CHANGED
@@ -17,6 +17,7 @@ import {
17
17
  import { API_FORM_LOCALES } from './locales';
18
18
  import nx from '@jswork/next';
19
19
  import '@jswork/next-compact-object';
20
+ import { filterPayload } from './utils';
20
21
 
21
22
  declare global {
22
23
  interface NxStatic {
@@ -48,6 +49,7 @@ export type ReactAntResourceFormProps = {
48
49
  title?: CardProps['title'];
49
50
  onInit?: (ctx: ReactAntResourceForm) => void;
50
51
  onMutate?: (args: MutateArgs) => void;
52
+ payloadFields?: { include?: string[]; exclude?: string[] }
51
53
  } & ReactAntdFormSchemaProps;
52
54
 
53
55
  export type IState = {
@@ -73,6 +75,9 @@ export type IState = {
73
75
  * blocker:
74
76
  * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。
75
77
  * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor
78
+ *
79
+ * transformRequest:
80
+ * 当你提交表单的时候,需要对参数进行一些预处理,比如加密,或者添加一些默认值,这个时候就可以用 transformRequest。
76
81
  */
77
82
 
78
83
  class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {
@@ -83,6 +88,7 @@ class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState>
83
88
  mute: false,
84
89
  initGuard: () => Promise.resolve(),
85
90
  submitGuard: () => Promise.resolve(),
91
+ payloadFields: { include: [], exclude: [] },
86
92
  };
87
93
 
88
94
  private formRef = React.createRef<FormInstance>(); // 注意类型
@@ -189,8 +195,10 @@ class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState>
189
195
  };
190
196
 
191
197
  handleStateRequest(stagePayload: StagePayload) {
198
+ const { payloadFields, transformRequest } = this.props;
192
199
  this.setState({ loading: true });
193
- return this.props.transformRequest?.(stagePayload) || stagePayload.payload;
200
+ const rawPayload = transformRequest?.(stagePayload) || stagePayload.payload;
201
+ return filterPayload(rawPayload, payloadFields);
194
202
  }
195
203
 
196
204
  handleStateResponse(res: StageData) {
@@ -385,6 +393,7 @@ class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState>
385
393
  initGuard,
386
394
  submitGuard,
387
395
  loading,
396
+ payloadFields,
388
397
  ...rest
389
398
  } = this.props;
390
399
 
package/src/utils.ts ADDED
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @Author: aric 1290657123@qq.com
3
+ * @Date: 2025-10-31 16:46:34
4
+ * @LastEditors: aric 1290657123@qq.com
5
+ * @LastEditTime: 2025-10-31 16:46:47
6
+ */
7
+
8
+ export interface PayloadFieldConfig {
9
+ include?: string[];
10
+ exclude?: string[];
11
+ }
12
+
13
+ /**
14
+ * 根据 include/exclude 规则过滤 payload 对象
15
+ * @param payload 原始对象(会被浅拷贝,不修改原对象)
16
+ * @param config 字段过滤配置
17
+ * @returns 过滤后的新对象
18
+ */
19
+ export function filterPayload(
20
+ payload: Record<string, any> | null | undefined,
21
+ config: PayloadFieldConfig = {},
22
+ ): Record<string, any> {
23
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
24
+ return {};
25
+ }
26
+
27
+ const { include, exclude } = config;
28
+ let result = { ...payload }; // 浅拷贝(ES5 兼容写法见下方备注)
29
+
30
+ // --- include: 白名单 ---
31
+ if (Array.isArray(include) && include.length > 0) {
32
+ const allowed: Record<string, any> = {};
33
+ const includeSet: Record<string, boolean> = {};
34
+ for (let i = 0; i < include.length; i++) {
35
+ includeSet[include[i]] = true;
36
+ }
37
+ for (const key in result) {
38
+ if (result.hasOwnProperty(key) && includeSet[key]) {
39
+ allowed[key] = result[key];
40
+ }
41
+ }
42
+ result = allowed;
43
+ }
44
+
45
+ // --- exclude: 黑名单 ---
46
+ if (Array.isArray(exclude) && exclude.length > 0) {
47
+ const final: Record<string, any> = {};
48
+ const excludeSet: Record<string, boolean> = {};
49
+ for (let i = 0; i < exclude.length; i++) {
50
+ excludeSet[exclude[i]] = true;
51
+ }
52
+ for (const key in result) {
53
+ if (result.hasOwnProperty(key) && !excludeSet[key]) {
54
+ final[key] = result[key];
55
+ }
56
+ }
57
+ result = final;
58
+ }
59
+
60
+ return result;
61
+ }