@jswork/react-ant-resource-form 1.0.32 → 1.0.34

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 R=Object.getOwnPropertySymbols;var I=Object.prototype.hasOwnProperty,x=Object.prototype.propertyIsEnumerable;var E=(a,i,e)=>i in a?w(a,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[i]=e,d=(a,i)=>{for(var e in i||(i={}))I.call(i,e)&&E(a,e,i[e]);if(R)for(var e of R(i))x.call(i,e)&&E(a,e,i[e]);return a};var h=(a,i)=>w(a,"name",{value:i,configurable:!0});var y=(a,i)=>{var e={};for(var t in a)I.call(a,t)&&i.indexOf(t)<0&&(e[t]=a[t]);if(a!=null&&R)for(var t of R(a))i.indexOf(t)<0&&x.call(a,t)&&(e[t]=a[t]);return e};var u=(a,i,e)=>E(a,typeof i!="symbol"?i+"":i,e);var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames);var _react = require('react'); var _react2 = _interopRequireDefault(_react);var _antd = require('antd');var _reactantformschema = require('@jswork/react-ant-form-schema'); var _reactantformschema2 = _interopRequireDefault(_reactantformschema);var _icons = require('@ant-design/icons');var 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 _reactrouterdom = require('react-router-dom');var _fastdeepequal = require('fast-deep-equal'); var _fastdeepequal2 = _interopRequireDefault(_fastdeepequal);var _fromentries = require('fromentries'); var _fromentries2 = _interopRequireDefault(_fromentries);var F="react-ant-resource-form",J=h((a,i)=>(_next2.default.forIn(a,e=>{i.includes(e)||delete a[e]}),a),"retainKeys"),f,N=(f=class extends _react.Component{constructor(e){var t;super(e);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(e=>{var t;this._initialValues=e||((t=this.formInstance)==null?void 0:t.getFieldsValue())||{}},"setInitialValues"));u(this,"handleFinish",h(e=>{if(!this.canSave){_antd.message.info(this.t("no_change"));return}this.isEdit?this.onResourceUpdate(e):this.onResourceCreate(e)},"handleFinish"));u(this,"onResourceUpdate",h(e=>{let{params:t,name:s,submitGuard:n,onMutate:r}=this.props,l=d(d({id:t.id},e),t),c=this.handleStateRequest({stage:"update",payload:l}),p={name:s,payload:c,isEdit:!0,values:e,params:t},g={name:s,payload:c,isEdit:!0,values:e};n==null||n(p).then(()=>{_next2.default.$api[`${s}_update`](c).then(m=>{_antd.message.success(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(e=>{let{params:t,name:s,submitGuard:n,onMutate:r}=this.props,l=d(d({},e),t),c=this.handleStateRequest({stage:"create",payload:l}),p={name:s,payload:c,isEdit:!1,values:e,params:t},g={name:s,payload:c,isEdit:!1,values:e};n==null||n(p).then(()=>{_next2.default.$api[`${s}_create`](c).then(m=>{var S;_antd.message.success(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(e=>{var n;let{disableHotkeySave:t}=this.props;(e.ctrlKey||e.metaKey)&&(e.key==="s"||e.key==="S")&&(e.preventDefault(),t||(n=this.formInstance)==null||n.submit())},"handleKeydown"));u(this,"handleValuesChange",h((e,t)=>{this.setState({touched:!_fastdeepequal2.default.call(void 0, this._initialValues,t)})},"handleValuesChange"));this.state={loading:e.loading,touched:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this),(t=e.onInit)==null||t.call(e,this)}get isEdit(){let{params:e}=this.props;return!!(e!=null&&e.id)}get canSave(){let{touched:e,loading:t}=this.state;return this.isEdit?e&&!t:!t}get titleView(){let{title:e}=this.props,t=e||(this.isEdit?this.t("update_title"):this.t("create_title"));return _react2.default.createElement(_antd.Space,null,t,_react2.default.createElement("span",null,this.touchedView))}get touchedView(){return this.isEdit&&this.state.touched?_react2.default.createElement("em",{style:{color:"#f60"}},_react2.default.createElement(_icons.DiffOutlined,null)):null}get extraView(){let{extra:e,backText:t,backProps:s}=this.props;return e||_react2.default.createElement(_antd.Button,d({size:"small",icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:this.handleBack},s),t||this.t("back"))}get childrenView(){let{okText:e,backText:t,okProps:s,backProps:n,children:r}=this.props,l=e||(this.isEdit?this.t("update"):this.t("create"));return r||_react2.default.createElement(_antd.Space,null,_react2.default.createElement(_antd.Button,d({disabled:!this.canSave,htmlType:"submit",type:"primary",icon:_react2.default.createElement(_icons.SaveOutlined,null)},s),l||this.t("submit")),_react2.default.createElement(_antd.Button,d({icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:this.handleBack},n),t||this.t("back")))}get formInstance(){var e;return(e=this.formRef)==null?void 0:e.current}t(e){let{lang:t}=this.props;return A[t][e]}handleStateRequest(e){var t,s;return this.setState({loading:!0}),((s=(t=this.props).transformRequest)==null?void 0:s.call(t,e))||e.payload}handleStateResponse(e){var s,n,r,l;let{name:t}=this.props;return this.setState({loading:!1}),(n=(s=_next2.default.$event)==null?void 0:s.emit)==null||n.call(s,`${t}:refetch`),((l=(r=this.props).transformResponse)==null?void 0:l.call(r,e))||e.data}componentDidMount(){this._isMounted=!0,window.addEventListener("keydown",this.handleKeydown),this.initDetailIfNeeded()}componentDidUpdate(e){var n,r;let t=(n=e.params)==null?void 0:n.id,s=(r=this.props.params)==null?void 0:r.id;t!==s&&this.initDetailIfNeeded(),e.loading!==this.props.loading&&this.setState({loading:this.props.loading})}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:e,name:t,initGuard:s}=this.props,n=`${t}_show`;if(this.isEdit){let r={id:e.id},l=this.handleStateRequest({stage:"show",payload:r}),c={name:t,payload:l,isEdit:!0,params:e};s==null||s(c).then(()=>{_next2.default.$api[n](l).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:t,payload:null,isEdit:!1,params:e};s==null||s(r).then(()=>{this.setInitialValues(),this.setState({loading:!1})})}}render(){let V=this.props,{className:e,name:t,meta:s,children:n,lang:r,title:l,extra:c,size:p,okText:g,backText:m,okProps:S,backProps:X,classNames:q,params:Y,transformRequest:Z,transformResponse:j,disableHotkeySave:ee,blocker:D,onInit:te,onMutate:se,initGuard:ae,submitGuard:ie,loading:ne}=V,L=y(V,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave","blocker","onInit","onMutate","initGuard","submitGuard","loading"]);return _react2.default.createElement(_antd.Card,{title:this.titleView,extra:this.extraView,size:p,classNames:q,"data-component":F,"data-blocker":D,className:_classnames2.default.call(void 0, F,e)},_react2.default.createElement(_antd.Spin,{spinning:this.state.loading},_react2.default.createElement(_reactantformschema2.default,d({meta:s,ref:this.formRef,onValuesChange:this.handleValuesChange,onFinish:this.handleFinish},L),this.childrenView)))}},h(f,"ReactAntResourceForm"),u(f,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1,blocker:!1,initGuard:h(()=>Promise.resolve(),"initGuard"),submitGuard:h(()=>Promise.resolve(),"submitGuard")}),f),Q= exports.ReactAntResourceFormFc =h(a=>{let c=a,{params:i,allowFields:e}=c,t=y(c,["params","allowFields"]),s=_reactrouterdom.useParams.call(void 0, ),[n]=_reactrouterdom.useSearchParams.call(void 0, ),r=_fromentries2.default.call(void 0, n),l=_next2.default.compactObject(d(d(d({},r),s),i));return e!=null&&e.length&&e.length>0&&J(l,e),_react2.default.createElement(N,d({params:l},t))},"ReactAntResourceFormFc"),P=N;var ke=P;exports.ReactAntResourceFormFc = Q; exports.default = ke;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var w=Object.defineProperty;var R=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(R)for(var t of R(i))x.call(i,t)&&k(a,t,i[t]);return a};var h=(a,i)=>w(a,"name",{value:i,configurable:!0});var _=(a,i)=>{var t={};for(var e in a)I.call(a,e)&&i.indexOf(e)<0&&(t[e]=a[e]);if(a!=null&&R)for(var e of R(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(t=>{var e;this._initialValues=t||((e=this.formInstance)==null?void 0:e.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.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=_(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=_(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;
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","retainKeys","__name","obj","keys","nx","forIn","key","includes","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","_initialValues","handleBack","history","setInitialValues","values","formInstance","getFieldsValue","handleFinish","canSave","message","info","t","isEdit","onResourceUpdate","onResourceCreate","params","name","submitGuard","onMutate","payload","__spreadValues","id","_payload","handleStateRequest","stage","submitGuardArgs","mutateArgs","then","$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, FC } from 'react';\nimport type { FormInstance } from 'antd';\nimport { Button, ButtonProps, Card, CardProps, message, Space, Spin } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, DiffOutlined, SaveOutlined } from '@ant-design/icons';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\nimport '@jswork/next-compact-object';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport deepEqual from 'fast-deep-equal';\nimport fromEntries from 'fromentries';\n\ndeclare global {\n interface NxStatic {\n $api: Record<string, any>;\n $event: any;\n }\n}\n\ntype StagePayload = {\n stage: 'show' | 'create' | 'update';\n payload: any;\n};\n\ntype StageData = {\n stage: 'show' | 'create' | 'update';\n data: any;\n};\n\ntype MutateArgs = {\n name?: string;\n params?: Record<string, any>;\n payload: any;\n isEdit: boolean;\n values: any;\n};\n\ntype InitGuardArgs = {\n name?: string;\n params?: Record<string, any>;\n payload: any;\n isEdit: boolean;\n};\n\ntype SubmitGuardArgs = {\n name?: string;\n params?: Record<string, any>;\n payload: any;\n isEdit: boolean;\n values: any;\n};\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 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\ntype IState = {\n loading: boolean;\n touched: boolean;\n};\n\nconst CLASS_NAME = 'react-ant-resource-form';\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/**\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\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n blocker: 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 handleBack = () => {\n history.back();\n };\n\n private setInitialValues = (values?: any) => {\n this._initialValues = values || 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 void message.info(this.t('no_change'));\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 void message.success(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 void message.success(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 this.setState({\n touched: !deepEqual(this._initialValues, allValues),\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 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\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 ReactAntResourceForm;\nexport { ReactAntResourceFormFc };\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"],"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","values","formInstance","getFieldsValue","handleFinish","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 = (values?: any) => {\n this._initialValues = values || 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 this.setState({\n touched: !deepEqual(this._initialValues, allValues),\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"]}
package/dist/main.d.mts CHANGED
@@ -3,12 +3,6 @@ import React, { Component, FC } from 'react';
3
3
  import { ButtonProps, CardProps, FormInstance } from 'antd';
4
4
  import { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';
5
5
 
6
- declare global {
7
- interface NxStatic {
8
- $api: Record<string, any>;
9
- $event: any;
10
- }
11
- }
12
6
  type StagePayload = {
13
7
  stage: 'show' | 'create' | 'update';
14
8
  payload: any;
@@ -37,6 +31,13 @@ type SubmitGuardArgs = {
37
31
  isEdit: boolean;
38
32
  values: any;
39
33
  };
34
+
35
+ declare global {
36
+ interface NxStatic {
37
+ $api: Record<string, any>;
38
+ $event: any;
39
+ }
40
+ }
40
41
  type ReactAntResourceFormProps = {
41
42
  lang?: string;
42
43
  loading?: boolean;
@@ -44,6 +45,7 @@ type ReactAntResourceFormProps = {
44
45
  backText?: string;
45
46
  params?: Record<string, any>;
46
47
  blocker?: boolean;
48
+ mute?: boolean;
47
49
  disableHotkeySave?: boolean;
48
50
  initGuard?: (args: InitGuardArgs) => Promise<void>;
49
51
  submitGuard?: (args: SubmitGuardArgs) => Promise<void>;
@@ -76,12 +78,17 @@ type IState = {
76
78
  *
77
79
  * onMutate:
78
80
  * 在 create/update 成功后,需要刷新列表,可以用 onMutate 继续后续处理。
81
+ *
82
+ * blocker:
83
+ * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。
84
+ * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor
79
85
  */
80
86
  declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {
81
87
  static defaultProps: {
82
88
  lang: string;
83
89
  disableHotkeySave: boolean;
84
90
  blocker: boolean;
91
+ mute: boolean;
85
92
  initGuard: () => Promise<void>;
86
93
  submitGuard: () => Promise<void>;
87
94
  };
@@ -97,6 +104,7 @@ declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps,
97
104
  get formInstance(): FormInstance<any> | null;
98
105
  constructor(props: ReactAntResourceFormProps);
99
106
  private t;
107
+ private msg;
100
108
  private handleBack;
101
109
  private setInitialValues;
102
110
  handleStateRequest(stagePayload: StagePayload): any;
@@ -112,9 +120,17 @@ declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps,
112
120
  initDetailIfNeeded(): void;
113
121
  render(): React.JSX.Element;
114
122
  }
123
+
124
+ /**
125
+ * @Author: aric 1290657123@qq.com
126
+ * @Date: 2025-10-31 13:20:41
127
+ * @LastEditors: aric 1290657123@qq.com
128
+ * @LastEditTime: 2025-10-31 13:24:38
129
+ */
130
+
115
131
  type ReactAntResourceFormFcProps = ReactAntResourceFormProps & {
116
132
  allowFields?: string[];
117
133
  };
118
134
  declare const ReactAntResourceFormFc: FC<ReactAntResourceFormFcProps>;
119
135
 
120
- export { ReactAntResourceFormFc, type ReactAntResourceFormProps, ReactAntResourceForm as default };
136
+ export { ReactAntResourceFormFc, type ReactAntResourceFormFcProps, type ReactAntResourceFormProps, ReactAntResourceForm as default };
package/dist/main.d.ts CHANGED
@@ -3,12 +3,6 @@ import React, { Component, FC } from 'react';
3
3
  import { ButtonProps, CardProps, FormInstance } from 'antd';
4
4
  import { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';
5
5
 
6
- declare global {
7
- interface NxStatic {
8
- $api: Record<string, any>;
9
- $event: any;
10
- }
11
- }
12
6
  type StagePayload = {
13
7
  stage: 'show' | 'create' | 'update';
14
8
  payload: any;
@@ -37,6 +31,13 @@ type SubmitGuardArgs = {
37
31
  isEdit: boolean;
38
32
  values: any;
39
33
  };
34
+
35
+ declare global {
36
+ interface NxStatic {
37
+ $api: Record<string, any>;
38
+ $event: any;
39
+ }
40
+ }
40
41
  type ReactAntResourceFormProps = {
41
42
  lang?: string;
42
43
  loading?: boolean;
@@ -44,6 +45,7 @@ type ReactAntResourceFormProps = {
44
45
  backText?: string;
45
46
  params?: Record<string, any>;
46
47
  blocker?: boolean;
48
+ mute?: boolean;
47
49
  disableHotkeySave?: boolean;
48
50
  initGuard?: (args: InitGuardArgs) => Promise<void>;
49
51
  submitGuard?: (args: SubmitGuardArgs) => Promise<void>;
@@ -76,12 +78,17 @@ type IState = {
76
78
  *
77
79
  * onMutate:
78
80
  * 在 create/update 成功后,需要刷新列表,可以用 onMutate 继续后续处理。
81
+ *
82
+ * blocker:
83
+ * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。
84
+ * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor
79
85
  */
80
86
  declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {
81
87
  static defaultProps: {
82
88
  lang: string;
83
89
  disableHotkeySave: boolean;
84
90
  blocker: boolean;
91
+ mute: boolean;
85
92
  initGuard: () => Promise<void>;
86
93
  submitGuard: () => Promise<void>;
87
94
  };
@@ -97,6 +104,7 @@ declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps,
97
104
  get formInstance(): FormInstance<any> | null;
98
105
  constructor(props: ReactAntResourceFormProps);
99
106
  private t;
107
+ private msg;
100
108
  private handleBack;
101
109
  private setInitialValues;
102
110
  handleStateRequest(stagePayload: StagePayload): any;
@@ -112,6 +120,14 @@ declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps,
112
120
  initDetailIfNeeded(): void;
113
121
  render(): React.JSX.Element;
114
122
  }
123
+
124
+ /**
125
+ * @Author: aric 1290657123@qq.com
126
+ * @Date: 2025-10-31 13:20:41
127
+ * @LastEditors: aric 1290657123@qq.com
128
+ * @LastEditTime: 2025-10-31 13:24:38
129
+ */
130
+
115
131
  type ReactAntResourceFormFcProps = ReactAntResourceFormProps & {
116
132
  allowFields?: string[];
117
133
  };
@@ -119,4 +135,4 @@ declare const ReactAntResourceFormFc: FC<ReactAntResourceFormFcProps>;
119
135
 
120
136
  // @ts-ignore
121
137
  export = ReactAntResourceForm;
122
- export { ReactAntResourceFormFc, type ReactAntResourceFormProps };
138
+ export { ReactAntResourceFormFc, type ReactAntResourceFormFcProps, type ReactAntResourceFormProps };
package/dist/main.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- var w=Object.defineProperty;var R=Object.getOwnPropertySymbols;var I=Object.prototype.hasOwnProperty,x=Object.prototype.propertyIsEnumerable;var E=(a,i,e)=>i in a?w(a,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[i]=e,d=(a,i)=>{for(var e in i||(i={}))I.call(i,e)&&E(a,e,i[e]);if(R)for(var e of R(i))x.call(i,e)&&E(a,e,i[e]);return a};var h=(a,i)=>w(a,"name",{value:i,configurable:!0});var y=(a,i)=>{var e={};for(var t in a)I.call(a,t)&&i.indexOf(t)<0&&(e[t]=a[t]);if(a!=null&&R)for(var t of R(a))i.indexOf(t)<0&&x.call(a,t)&&(e[t]=a[t]);return e};var u=(a,i,e)=>E(a,typeof i!="symbol"?i+"":i,e);import O from"classnames";import o,{Component as $}from"react";import{Button as k,Card as M,message as b,Space as C,Spin as T}from"antd";import U from"@jswork/react-ant-form-schema";import{ArrowLeftOutlined as v,DiffOutlined as B,SaveOutlined as K}from"@ant-design/icons";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 _ from"@jswork/next";import"@jswork/next-compact-object";import{useParams as z,useSearchParams as G}from"react-router-dom";import H from"fast-deep-equal";import W from"fromentries";var F="react-ant-resource-form",J=h((a,i)=>(_.forIn(a,e=>{i.includes(e)||delete a[e]}),a),"retainKeys"),f,N=(f=class extends ${constructor(e){var t;super(e);u(this,"formRef",o.createRef());u(this,"_isMounted",!1);u(this,"_initialValues",null);u(this,"handleBack",h(()=>{history.back()},"handleBack"));u(this,"setInitialValues",h(e=>{var t;this._initialValues=e||((t=this.formInstance)==null?void 0:t.getFieldsValue())||{}},"setInitialValues"));u(this,"handleFinish",h(e=>{if(!this.canSave){b.info(this.t("no_change"));return}this.isEdit?this.onResourceUpdate(e):this.onResourceCreate(e)},"handleFinish"));u(this,"onResourceUpdate",h(e=>{let{params:t,name:s,submitGuard:n,onMutate:r}=this.props,l=d(d({id:t.id},e),t),c=this.handleStateRequest({stage:"update",payload:l}),p={name:s,payload:c,isEdit:!0,values:e,params:t},g={name:s,payload:c,isEdit:!0,values:e};n==null||n(p).then(()=>{_.$api[`${s}_update`](c).then(m=>{b.success(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(e=>{let{params:t,name:s,submitGuard:n,onMutate:r}=this.props,l=d(d({},e),t),c=this.handleStateRequest({stage:"create",payload:l}),p={name:s,payload:c,isEdit:!1,values:e,params:t},g={name:s,payload:c,isEdit:!1,values:e};n==null||n(p).then(()=>{_.$api[`${s}_create`](c).then(m=>{var S;b.success(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(e=>{var n;let{disableHotkeySave:t}=this.props;(e.ctrlKey||e.metaKey)&&(e.key==="s"||e.key==="S")&&(e.preventDefault(),t||(n=this.formInstance)==null||n.submit())},"handleKeydown"));u(this,"handleValuesChange",h((e,t)=>{this.setState({touched:!H(this._initialValues,t)})},"handleValuesChange"));this.state={loading:e.loading,touched:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this),(t=e.onInit)==null||t.call(e,this)}get isEdit(){let{params:e}=this.props;return!!(e!=null&&e.id)}get canSave(){let{touched:e,loading:t}=this.state;return this.isEdit?e&&!t:!t}get titleView(){let{title:e}=this.props,t=e||(this.isEdit?this.t("update_title"):this.t("create_title"));return o.createElement(C,null,t,o.createElement("span",null,this.touchedView))}get touchedView(){return this.isEdit&&this.state.touched?o.createElement("em",{style:{color:"#f60"}},o.createElement(B,null)):null}get extraView(){let{extra:e,backText:t,backProps:s}=this.props;return e||o.createElement(k,d({size:"small",icon:o.createElement(v,null),onClick:this.handleBack},s),t||this.t("back"))}get childrenView(){let{okText:e,backText:t,okProps:s,backProps:n,children:r}=this.props,l=e||(this.isEdit?this.t("update"):this.t("create"));return r||o.createElement(C,null,o.createElement(k,d({disabled:!this.canSave,htmlType:"submit",type:"primary",icon:o.createElement(K,null)},s),l||this.t("submit")),o.createElement(k,d({icon:o.createElement(v,null),onClick:this.handleBack},n),t||this.t("back")))}get formInstance(){var e;return(e=this.formRef)==null?void 0:e.current}t(e){let{lang:t}=this.props;return A[t][e]}handleStateRequest(e){var t,s;return this.setState({loading:!0}),((s=(t=this.props).transformRequest)==null?void 0:s.call(t,e))||e.payload}handleStateResponse(e){var s,n,r,l;let{name:t}=this.props;return this.setState({loading:!1}),(n=(s=_.$event)==null?void 0:s.emit)==null||n.call(s,`${t}:refetch`),((l=(r=this.props).transformResponse)==null?void 0:l.call(r,e))||e.data}componentDidMount(){this._isMounted=!0,window.addEventListener("keydown",this.handleKeydown),this.initDetailIfNeeded()}componentDidUpdate(e){var n,r;let t=(n=e.params)==null?void 0:n.id,s=(r=this.props.params)==null?void 0:r.id;t!==s&&this.initDetailIfNeeded(),e.loading!==this.props.loading&&this.setState({loading:this.props.loading})}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:e,name:t,initGuard:s}=this.props,n=`${t}_show`;if(this.isEdit){let r={id:e.id},l=this.handleStateRequest({stage:"show",payload:r}),c={name:t,payload:l,isEdit:!0,params:e};s==null||s(c).then(()=>{_.$api[n](l).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:t,payload:null,isEdit:!1,params:e};s==null||s(r).then(()=>{this.setInitialValues(),this.setState({loading:!1})})}}render(){let V=this.props,{className:e,name:t,meta:s,children:n,lang:r,title:l,extra:c,size:p,okText:g,backText:m,okProps:S,backProps:X,classNames:q,params:Y,transformRequest:Z,transformResponse:j,disableHotkeySave:ee,blocker:D,onInit:te,onMutate:se,initGuard:ae,submitGuard:ie,loading:ne}=V,L=y(V,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave","blocker","onInit","onMutate","initGuard","submitGuard","loading"]);return o.createElement(M,{title:this.titleView,extra:this.extraView,size:p,classNames:q,"data-component":F,"data-blocker":D,className:O(F,e)},o.createElement(T,{spinning:this.state.loading},o.createElement(U,d({meta:s,ref:this.formRef,onValuesChange:this.handleValuesChange,onFinish:this.handleFinish},L),this.childrenView)))}},h(f,"ReactAntResourceForm"),u(f,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1,blocker:!1,initGuard:h(()=>Promise.resolve(),"initGuard"),submitGuard:h(()=>Promise.resolve(),"submitGuard")}),f),Q=h(a=>{let c=a,{params:i,allowFields:e}=c,t=y(c,["params","allowFields"]),s=z(),[n]=G(),r=W(n),l=_.compactObject(d(d(d({},r),s),i));return e!=null&&e.length&&e.length>0&&J(l,e),o.createElement(N,d({params:l},t))},"ReactAntResourceFormFc"),P=N;var ke=P;export{Q as ReactAntResourceFormFc,ke as default};
1
+ var w=Object.defineProperty;var R=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(R)for(var t of R(i))x.call(i,t)&&k(a,t,i[t]);return a};var h=(a,i)=>w(a,"name",{value:i,configurable:!0});var _=(a,i)=>{var t={};for(var e in a)I.call(a,e)&&i.indexOf(e)<0&&(t[e]=a[e]);if(a!=null&&R)for(var e of R(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 O}from"react";import{Button as b,Card as $,message as M,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 O{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(t=>{var e;this._initialValues=t||((e=this.formInstance)==null?void 0:e.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.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||M[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=_(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($,{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=_(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};
2
2
  //# sourceMappingURL=main.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/locales.ts","../src/main.tsx"],"sourcesContent":["// import noop from '@jswork/noop';\nimport cx from 'classnames';\nimport React, { Component, FC } from 'react';\nimport type { FormInstance } from 'antd';\nimport { Button, ButtonProps, Card, CardProps, message, Space, Spin } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, DiffOutlined, SaveOutlined } from '@ant-design/icons';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\nimport '@jswork/next-compact-object';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport deepEqual from 'fast-deep-equal';\nimport fromEntries from 'fromentries';\n\ndeclare global {\n interface NxStatic {\n $api: Record<string, any>;\n $event: any;\n }\n}\n\ntype StagePayload = {\n stage: 'show' | 'create' | 'update';\n payload: any;\n};\n\ntype StageData = {\n stage: 'show' | 'create' | 'update';\n data: any;\n};\n\ntype MutateArgs = {\n name?: string;\n params?: Record<string, any>;\n payload: any;\n isEdit: boolean;\n values: any;\n};\n\ntype InitGuardArgs = {\n name?: string;\n params?: Record<string, any>;\n payload: any;\n isEdit: boolean;\n};\n\ntype SubmitGuardArgs = {\n name?: string;\n params?: Record<string, any>;\n payload: any;\n isEdit: boolean;\n values: any;\n};\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 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\ntype IState = {\n loading: boolean;\n touched: boolean;\n};\n\nconst CLASS_NAME = 'react-ant-resource-form';\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/**\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\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n blocker: 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 handleBack = () => {\n history.back();\n };\n\n private setInitialValues = (values?: any) => {\n this._initialValues = values || 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 void message.info(this.t('no_change'));\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 void message.success(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 void message.success(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 this.setState({\n touched: !deepEqual(this._initialValues, allValues),\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 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\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 ReactAntResourceForm;\nexport { ReactAntResourceFormFc };\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","import ReactAntResourceForm, { ReactAntResourceFormFc } from '.';\nimport type { ReactAntResourceFormProps } from '.';\n\nexport default ReactAntResourceForm;\nexport { ReactAntResourceFormFc };\nexport type { ReactAntResourceFormProps };\n"],"mappings":"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","names":["cx","React","Component","Button","Card","message","Space","Spin","ReactAntdFormSchema","ArrowLeftOutlined","DiffOutlined","SaveOutlined","API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","submit","back","no_change","nx","useParams","useSearchParams","deepEqual","fromEntries","CLASS_NAME","retainKeys","__name","obj","keys","nx","forIn","key","includes","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","_initialValues","handleBack","history","back","setInitialValues","values","formInstance","getFieldsValue","handleFinish","canSave","message","info","t","isEdit","onResourceUpdate","onResourceCreate","params","name","submitGuard","onMutate","payload","__spreadValues","id","_payload","handleStateRequest","stage","submitGuardArgs","mutateArgs","then","$api","res","success","handleStateResponse","data","finally","setState","loading","handleValuesChange","resetFields","handleKeydown","e","disableHotkeySave","ctrlKey","metaKey","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","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","ReactAntResourceFormFc","overrideParams","allowFields","useParams","searchParams","useSearchParams","_searchParams","fromEntries","_params","compactObject","length","index_default","main_default","ReactAntResourceForm"]}
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 = (values?: any) => {\n this._initialValues = values || 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 this.setState({\n touched: !deepEqual(this._initialValues, allValues),\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","values","formInstance","getFieldsValue","handleFinish","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jswork/react-ant-resource-form",
3
- "version": "1.0.32",
3
+ "version": "1.0.34",
4
4
  "main": "dist/main.cjs.js",
5
5
  "module": "dist/main.esm.js",
6
6
  "types": "dist/main.d.ts",
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @Author: aric 1290657123@qq.com
3
+ * @Date: 2025-10-31 13:20:41
4
+ * @LastEditors: aric 1290657123@qq.com
5
+ * @LastEditTime: 2025-10-31 13:24:38
6
+ */
7
+ import React, { FC } from 'react';
8
+ import { useParams, useSearchParams } from 'react-router-dom';
9
+ import fromEntries from 'fromentries';
10
+ import nx from '@jswork/next';
11
+ import ReactAntResourceForm, { ReactAntResourceFormProps } from '.';
12
+
13
+ const retainKeys = (obj: Record<string, any>, keys: string[]) => {
14
+ nx.forIn(obj, (key) => {
15
+ if (!keys.includes(key)) {
16
+ delete obj[key];
17
+ }
18
+ });
19
+ return obj;
20
+ };
21
+
22
+
23
+ export type ReactAntResourceFormFcProps = ReactAntResourceFormProps & {
24
+ allowFields?: string[];
25
+ }
26
+
27
+ const ReactAntResourceFormFc: FC<ReactAntResourceFormFcProps> = (props) => {
28
+ const { params: overrideParams, allowFields, ...rest } = props;
29
+ const params = useParams();
30
+ const [searchParams] = useSearchParams();
31
+ const _searchParams = fromEntries(searchParams as any);
32
+ const _params = nx.compactObject({ ..._searchParams, ...params, ...overrideParams });
33
+ if (allowFields?.length && allowFields.length > 0) retainKeys(_params, allowFields);
34
+ return <ReactAntResourceForm params={_params} {...rest} />;
35
+ };
36
+
37
+ export default ReactAntResourceFormFc;
package/src/index.tsx CHANGED
@@ -1,16 +1,22 @@
1
1
  // import noop from '@jswork/noop';
2
2
  import cx from 'classnames';
3
- import React, { Component, FC } from 'react';
4
- import type { FormInstance } from 'antd';
5
- import { Button, ButtonProps, Card, CardProps, message, Space, Spin } from 'antd';
3
+ import React, { Component } from 'react';
4
+ import { ButtonProps, CardProps, FormInstance } from 'antd';
5
+ import { Button, Card, message, Space, Spin } from 'antd';
6
6
  import ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';
7
7
  import { ArrowLeftOutlined, DiffOutlined, SaveOutlined } from '@ant-design/icons';
8
+ import deepEqual from 'fast-deep-equal';
9
+ import {
10
+ InitGuardArgs,
11
+ MsgType,
12
+ MutateArgs,
13
+ StageData,
14
+ StagePayload,
15
+ SubmitGuardArgs,
16
+ } from './types';
8
17
  import { API_FORM_LOCALES } from './locales';
9
18
  import nx from '@jswork/next';
10
19
  import '@jswork/next-compact-object';
11
- import { useParams, useSearchParams } from 'react-router-dom';
12
- import deepEqual from 'fast-deep-equal';
13
- import fromEntries from 'fromentries';
14
20
 
15
21
  declare global {
16
22
  interface NxStatic {
@@ -19,38 +25,7 @@ declare global {
19
25
  }
20
26
  }
21
27
 
22
- type StagePayload = {
23
- stage: 'show' | 'create' | 'update';
24
- payload: any;
25
- };
26
-
27
- type StageData = {
28
- stage: 'show' | 'create' | 'update';
29
- data: any;
30
- };
31
-
32
- type MutateArgs = {
33
- name?: string;
34
- params?: Record<string, any>;
35
- payload: any;
36
- isEdit: boolean;
37
- values: any;
38
- };
39
-
40
- type InitGuardArgs = {
41
- name?: string;
42
- params?: Record<string, any>;
43
- payload: any;
44
- isEdit: boolean;
45
- };
46
-
47
- type SubmitGuardArgs = {
48
- name?: string;
49
- params?: Record<string, any>;
50
- payload: any;
51
- isEdit: boolean;
52
- values: any;
53
- };
28
+ const CLASS_NAME = 'react-ant-resource-form';
54
29
 
55
30
  export type ReactAntResourceFormProps = {
56
31
  lang?: string;
@@ -59,6 +34,7 @@ export type ReactAntResourceFormProps = {
59
34
  backText?: string;
60
35
  params?: Record<string, any>;
61
36
  blocker?: boolean;
37
+ mute?: boolean;
62
38
  disableHotkeySave?: boolean;
63
39
  initGuard?: (args: InitGuardArgs) => Promise<void>;
64
40
  submitGuard?: (args: SubmitGuardArgs) => Promise<void>;
@@ -74,22 +50,11 @@ export type ReactAntResourceFormProps = {
74
50
  onMutate?: (args: MutateArgs) => void;
75
51
  } & ReactAntdFormSchemaProps;
76
52
 
77
- type IState = {
53
+ export type IState = {
78
54
  loading: boolean;
79
55
  touched: boolean;
80
56
  };
81
57
 
82
- const CLASS_NAME = 'react-ant-resource-form';
83
-
84
- const retainKeys = (obj: Record<string, any>, keys: string[]) => {
85
- nx.forIn(obj, (key) => {
86
- if (!keys.includes(key)) {
87
- delete obj[key];
88
- }
89
- });
90
- return obj;
91
- };
92
-
93
58
  /**
94
59
  * 当前 card loading 不要直接使用,因为这个 loading 会导致 Card 里的 formRef 被设置成 null
95
60
  * 这个情况仅在 class component 里才会出现,function component 里不会:
@@ -104,6 +69,10 @@ const retainKeys = (obj: Record<string, any>, keys: string[]) => {
104
69
  *
105
70
  * onMutate:
106
71
  * 在 create/update 成功后,需要刷新列表,可以用 onMutate 继续后续处理。
72
+ *
73
+ * blocker:
74
+ * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。
75
+ * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor
107
76
  */
108
77
 
109
78
  class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {
@@ -111,6 +80,7 @@ class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState>
111
80
  lang: 'zh-CN',
112
81
  disableHotkeySave: false,
113
82
  blocker: false,
83
+ mute: false,
114
84
  initGuard: () => Promise.resolve(),
115
85
  submitGuard: () => Promise.resolve(),
116
86
  };
@@ -205,6 +175,11 @@ class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState>
205
175
  return API_FORM_LOCALES[lang!][key];
206
176
  }
207
177
 
178
+ private msg(msg: string, type: MsgType = 'success') {
179
+ const { mute } = this.props;
180
+ if (!mute) message[type](msg);
181
+ }
182
+
208
183
  private handleBack = () => {
209
184
  history.back();
210
185
  };
@@ -227,7 +202,7 @@ class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState>
227
202
 
228
203
  handleFinish = (values: any) => {
229
204
  if (!this.canSave) {
230
- void message.info(this.t('no_change'));
205
+ this.msg(this.t('no_change'), 'info');
231
206
  return;
232
207
  }
233
208
  this.isEdit ? this.onResourceUpdate(values) : this.onResourceCreate(values);
@@ -254,7 +229,7 @@ class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState>
254
229
  submitGuard?.(submitGuardArgs).then(() => {
255
230
  nx.$api[`${name}_update`](_payload)
256
231
  .then((res: any) => {
257
- void message.success(this.t('update_success'));
232
+ this.msg(this.t('update_success'));
258
233
  this.handleStateResponse({ stage: 'update', data: res });
259
234
  onMutate?.(mutateArgs);
260
235
  })
@@ -288,7 +263,7 @@ class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState>
288
263
  submitGuard?.(submitGuardArgs).then(() => {
289
264
  nx.$api[`${name}_create`](_payload)
290
265
  .then((res: any) => {
291
- void message.success(this.t('create_success'));
266
+ this.msg(this.t('create_success'));
292
267
  this.handleStateResponse({ stage: 'create', data: res });
293
268
  this.formInstance?.resetFields();
294
269
  onMutate?.(mutateArgs);
@@ -402,6 +377,7 @@ class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState>
402
377
  transformResponse,
403
378
  disableHotkeySave,
404
379
  blocker,
380
+ mute,
405
381
  onInit,
406
382
  onMutate,
407
383
  initGuard,
@@ -434,19 +410,5 @@ class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState>
434
410
  }
435
411
  }
436
412
 
437
- export type ReactAntResourceFormFcProps = ReactAntResourceFormProps & {
438
- allowFields?: string[];
439
- }
440
-
441
- const ReactAntResourceFormFc: FC<ReactAntResourceFormFcProps> = (props) => {
442
- const { params: overrideParams, allowFields, ...rest } = props;
443
- const params = useParams();
444
- const [searchParams] = useSearchParams();
445
- const _searchParams = fromEntries(searchParams as any);
446
- const _params = nx.compactObject({ ..._searchParams, ...params, ...overrideParams });
447
- if (allowFields?.length && allowFields.length > 0) retainKeys(_params, allowFields);
448
- return <ReactAntResourceForm params={_params} {...rest} />;
449
- };
450
413
 
451
414
  export default ReactAntResourceForm;
452
- export { ReactAntResourceFormFc };
package/src/main.tsx CHANGED
@@ -1,6 +1,8 @@
1
- import ReactAntResourceForm, { ReactAntResourceFormFc } from '.';
1
+ import ReactAntResourceForm from '.';
2
+ import ReactAntResourceFormFc from './index-rc';
2
3
  import type { ReactAntResourceFormProps } from '.';
4
+ import type { ReactAntResourceFormFcProps } from './index-rc';
3
5
 
4
6
  export default ReactAntResourceForm;
5
7
  export { ReactAntResourceFormFc };
6
- export type { ReactAntResourceFormProps };
8
+ export type { ReactAntResourceFormFcProps, ReactAntResourceFormProps };
package/src/types.ts ADDED
@@ -0,0 +1,35 @@
1
+ export type StagePayload = {
2
+ stage: 'show' | 'create' | 'update';
3
+ payload: any;
4
+ };
5
+
6
+ export type StageData = {
7
+ stage: 'show' | 'create' | 'update';
8
+ data: any;
9
+ };
10
+
11
+ export type MutateArgs = {
12
+ name?: string;
13
+ params?: Record<string, any>;
14
+ payload: any;
15
+ isEdit: boolean;
16
+ values: any;
17
+ };
18
+
19
+ export type MsgType = 'info' | 'success' | 'warning' | 'error';
20
+
21
+ export type InitGuardArgs = {
22
+ name?: string;
23
+ params?: Record<string, any>;
24
+ payload: any;
25
+ isEdit: boolean;
26
+ };
27
+
28
+ export type SubmitGuardArgs = {
29
+ name?: string;
30
+ params?: Record<string, any>;
31
+ payload: any;
32
+ isEdit: boolean;
33
+ values: any;
34
+ };
35
+