@jswork/react-ant-resource-form 1.0.10 → 1.0.11
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 +3 -1
- package/dist/main.cjs.js.map +1 -1
- package/dist/main.d.mts +42 -21
- package/dist/main.d.ts +44 -21
- package/dist/main.esm.js +1 -1
- package/dist/main.esm.js.map +1 -1
- package/package.json +5 -5
- package/src/index.tsx +241 -59
- package/src/locales.ts +2 -9
- package/src/main.tsx +2 -5
- package/src/api.tsx +0 -120
package/dist/main.cjs.js
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var b=Object.defineProperty;var f=Object.getOwnPropertySymbols;var g=Object.prototype.hasOwnProperty,E=Object.prototype.propertyIsEnumerable;var R=(i,a,e)=>a in i?b(i,a,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[a]=e,l=(i,a)=>{for(var e in a||(a={}))g.call(a,e)&&R(i,e,a[e]);if(f)for(var e of f(a))E.call(a,e)&&R(i,e,a[e]);return i};var m=(i,a)=>b(i,"name",{value:a,configurable:!0});var w=(i,a)=>{var e={};for(var t in i)g.call(i,t)&&a.indexOf(t)<0&&(e[t]=i[t]);if(i!=null&&f)for(var t of f(i))a.indexOf(t)<0&&E.call(i,t)&&(e[t]=i[t]);return e};var h=(i,a,e)=>R(i,typeof a!="symbol"?a+"":a,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 x={"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"},"en-US":{create:"Create",update:"Save",create_title:"Create",update_title:"Update",create_success:"Create success",update_success:"Update success",submit:"Submit",back:"Back"}};var _next = require('@jswork/next'); var _next2 = _interopRequireDefault(_next);var I="react-ant-resource-form",p,B=(p=class extends _react.Component{constructor(e){super(e);h(this,"formRef",_react2.default.createRef());h(this,"_isMounted",!1);h(this,"handleBack",m(()=>{history.back()},"handleBack"));h(this,"handleFinish",m(e=>{let{params:t,name:s}=this.props,n=`${s}_update`,r=`${s}_create`;if(this.isEdit){let o=l({id:t.id},e),u=this.handleStateRequest({stage:"update",payload:o});_next2.default.$api[n](u).then(d=>{_antd.message.success(this.t("update_success")),this.handleStateResponse({stage:"update",data:d})}).finally(()=>this.setState({loading:!1}))}else{let o=l({},e),u=this.handleStateRequest({stage:"create",payload:o});_next2.default.$api[r](u).then(d=>{_antd.message.success(this.t("create_success")),this.handleStateResponse({stage:"create",data:d})}).finally(()=>this.setState({loading:!1}))}},"handleFinish"));h(this,"handleKeydown",m(e=>{var s;if((e.ctrlKey||e.metaKey)&&(e.key==="s"||e.key==="S")&&(e.preventDefault(),!this.props.disableHotkeySave))try{(s=this.formInstance)==null||s.submit()}catch(n){}},"handleKeydown"));this.state={loading:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this)}get isEdit(){let{params:e}=this.props;return!!(e!=null&&e.id)}get titleView(){let{title:e}=this.props;return e||(this.isEdit?this.t("update_title"):this.t("create_title"))}get extraView(){let{extra:e,backText:t,backProps:s}=this.props;return e||_react2.default.createElement(_antd.Button,l({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,o=e||(this.isEdit?this.t("update"):this.t("create"));return r||_react2.default.createElement(_antd.Space,null,_react2.default.createElement(_antd.Button,l({htmlType:"submit",type:"primary",icon:_react2.default.createElement(_icons.SaveOutlined,null)},s),o||this.t("submit")),_react2.default.createElement(_antd.Button,l({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 x[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,o;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`),((o=(r=this.props).transformResponse)==null?void 0:o.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()}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:e,name:t}=this.props,s=`${t}_show`;if(this.isEdit){let n={id:e.id},r=this.handleStateRequest({stage:"show",payload:n});_next2.default.$api[s](r).then(o=>{var d,k;if(!this._isMounted)return;let u=this.handleStateResponse({stage:"show",data:o});try{(k=(d=this.formInstance)==null?void 0:d.setFieldsValue)==null||k.call(d,u)}catch(A){}}).finally(()=>this.setState({loading:!1}))}}render(){let _=this.props,{className:e,name:t,meta:s,children:n,lang:r,title:o,extra:u,size:d,okText:k,backText:A,okProps:O,backProps:z,classNames:F,params:K,transformRequest:U,transformResponse:H,disableHotkeySave:W}=_,q=w(_,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave"]);return _react2.default.createElement(_antd.Card,{title:this.titleView,extra:this.extraView,size:d,classNames:F,"data-component":I,className:_classnames2.default.call(void 0, I,e)},_react2.default.createElement(_antd.Spin,{spinning:this.state.loading},_react2.default.createElement(_reactantformschema2.default,l({meta:s,ref:this.formRef,onFinish:this.handleFinish},q),this.childrenView)))}},m(p,"ReactAntResourceForm"),h(p,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1}),p),N=B;var ne=N;exports.default = ne;
|
|
2
|
+
|
|
3
|
+
module.exports = exports.default;
|
|
2
4
|
//# sourceMappingURL=main.cjs.js.map
|
package/dist/main.cjs.js.map
CHANGED
|
@@ -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","../src/api.tsx","../src/hooks.ts"],"names":["API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","BASIC_FORM_LOCALES","submit","back","CLASS_NAME","defaultProps","lang","ReactAntResourceForm","__name","props","_a","__spreadValues","className","meta","children","title","loading","extra","size","okText","backText","okProps","backProps","classNames","rest","t","key","handleBack","history","_extra","React","Button","icon","ArrowLeftOutlined","onClick","_children","Space","htmlType","type","SaveOutlined","Card","data-component","cx","ReactAntdFormSchema","index_default","useKeyboardSave","callback","handler","useCallback","e","ctrlKey","metaKey","code","preventDefault","useEffect","document","addEventListener","removeEventListener","disableHotkeySave","ReactAntResourceFormApi","name","params","transformRequest","transformResponse","resourceEdit"],"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, { FC } from 'react';\nimport { Button, ButtonProps, Card, CardProps, Space } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, SaveOutlined } from '@ant-design/icons';\nimport { BASIC_FORM_LOCALES } from './locales';\n\nexport type ReactAntResourceFormProps = {\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n classNames?: CardProps['classNames'];\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n} & ReactAntdFormSchemaProps;\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nconst defaultProps = {\n lang: 'zh-CN',\n};\n\nconst ReactAntResourceForm: FC<ReactAntResourceFormProps> = (props) => {\n const {\n className,\n meta,\n children,\n lang,\n title,\n loading,\n extra,\n size,\n okText,\n backText,\n okProps,\n backProps,\n classNames,\n ...rest\n } = {\n ...defaultProps,\n ...props,\n };\n\n const t = (key: string) => BASIC_FORM_LOCALES[lang][key];\n const handleBack = () => history.back();\n const _extra = extra || (\n <Button size=\"small\" icon={<ArrowLeftOutlined />} onClick={handleBack} {...backProps}>\n {backText || t('back')}\n </Button>\n );\n\n const _children = children || (\n <Space>\n <Button htmlType=\"submit\" type=\"primary\" icon={<SaveOutlined />} {...okProps}>\n {okText || t('submit')}\n </Button>\n <Button icon={<ArrowLeftOutlined />} onClick={handleBack} {...backProps}>\n {backText || t('back')}\n </Button>\n </Space>\n );\n\n return (\n <Card\n title={title}\n size={size}\n loading={loading}\n classNames={classNames}\n data-component={CLASS_NAME}\n className={cx(CLASS_NAME, className)}\n extra={_extra}>\n <ReactAntdFormSchema meta={meta} {...rest}>\n {_children}\n </ReactAntdFormSchema>\n </Card>\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 },\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 },\n};\n\nexport const BASIC_FORM_LOCALES = {\n 'zh-CN': {\n submit: '提交',\n back: '返回',\n },\n 'en-US': {\n submit: 'Submit',\n back: 'Back',\n },\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport ReactAntResourceForm, { ReactAntResourceFormProps } from '.';\nimport { Form, message } from 'antd';\nimport nx from '@jswork/next';\nimport { useKeyboardSave } from './hooks';\nimport { API_FORM_LOCALES } from './locales';\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\nexport type ReactAntResourceFormApiProps = ReactAntResourceFormProps & {\n lang?: string;\n params?: Record<string, any>;\n disableHotkeySave?: boolean;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n};\n\nconst defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n};\n\nconst ReactAntResourceFormApi: FC<ReactAntResourceFormApiProps> = (props) => {\n const { name, params, lang, transformRequest, transformResponse, disableHotkeySave, ...rest } = {\n ...defaultProps,\n ...props,\n };\n\n const resourceEdit = `${name}_update`;\n const resourceCreate = `${name}_create`;\n const resourceShow = `${name}_show`;\n const [form] = Form.useForm();\n const isEdit = Boolean(params?.id);\n const t = (key: string) => API_FORM_LOCALES[lang!][key];\n const [loading, setLoading] = useState(false);\n const handleStateRequest = (stagePayload: StagePayload) => {\n setLoading(true);\n return transformRequest?.(stagePayload) || stagePayload.payload;\n };\n\n const handleStateResponse = (res: StageData) => {\n setLoading(false);\n nx.$event?.emit?.(`${name}:refetch`);\n return transformResponse?.(res) || res.data;\n };\n\n const handleFinish = (values) => {\n if (isEdit) {\n const payload = { id: params!.id, ...values };\n const _payload = handleStateRequest({ stage: 'update', payload });\n\n nx.$api[resourceEdit](_payload)\n .then((res) => {\n message.success(t('update_success'));\n handleStateResponse({ stage: 'update', data: res });\n })\n .finally(() => setLoading(false));\n } else {\n const payload = { ...values };\n const _payload = handleStateRequest({ stage: 'create', payload });\n\n nx.$api[resourceCreate](_payload)\n .then((res) => {\n message.success(t('create_success'));\n handleStateResponse({ stage: 'create', data: res });\n })\n .finally(() => setLoading(false));\n }\n };\n\n // hotkey save\n useKeyboardSave(() => {\n if (!disableHotkeySave) form.submit();\n });\n\n // init detail\n useEffect(() => {\n if (isEdit) {\n const payload = { id: params!.id };\n const _payload = handleStateRequest({ stage: 'show', payload });\n nx.$api[resourceShow](_payload)\n .then((res) => {\n const data = handleStateResponse({ stage: 'show', data: res });\n form.setFieldsValue(data);\n })\n .finally(() => setLoading(false));\n }\n }, [isEdit, params?.id]);\n\n const okText = isEdit ? t('update') : t('create');\n const title = isEdit ? t('update_title') : t('create_title');\n\n return (\n <ReactAntResourceForm\n loading={loading}\n form={form}\n onFinish={handleFinish}\n okText={okText}\n title={title}\n {...rest}\n />\n );\n};\n\nexport default ReactAntResourceFormApi;\n","import { useEffect, useCallback } from 'react';\n\nexport const useKeyboardSave = (callback: (e: KeyboardEvent) => void) => {\n const handler = useCallback(\n (e: KeyboardEvent) => {\n // 使用 code 更可靠(不受键盘布局或大小写影响)\n if ((e.ctrlKey || e.metaKey) && e.code === 'KeyS') {\n e.preventDefault();\n callback(e);\n }\n },\n [callback] // 确保 handler 随 callback 更新而更新\n );\n\n useEffect(() => {\n document.addEventListener('keydown', handler);\n return () => {\n document.removeEventListener('keydown', handler);\n };\n }, [handler]); // handler 是 useCallback 包装的,稳定依赖\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","CLASS_NAME","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","handleBack","__name","history","handleFinish","values","params","name","resourceEdit"],"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 { Button, ButtonProps, Card, CardProps, Space, message, Spin } from 'antd';\nimport type { FormInstance } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, SaveOutlined } from '@ant-design/icons';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\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\nexport type ReactAntResourceFormProps = {\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n params?: Record<string, any>;\n disableHotkeySave?: boolean;\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} & ReactAntdFormSchemaProps;\n\ntype IState = {\n loading: boolean;\n};\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n };\n\n private formRef = React.createRef<FormInstance>(); // 注意类型\n private _isMounted = false;\n\n get isEdit() {\n const { params } = this.props;\n return Boolean(params?.id);\n }\n\n get titleView() {\n const { title } = this.props;\n return title || (this.isEdit ? this.t('update_title') : this.t('create_title'));\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 htmlType=\"submit\" type=\"primary\" icon={<SaveOutlined />} {...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: 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\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 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 const { params, name } = this.props;\n const resourceEdit = `${name}_update`;\n const resourceCreate = `${name}_create`;\n\n if (this.isEdit) {\n const payload = { id: params!.id, ...values };\n const _payload = this.handleStateRequest({ stage: 'update', payload });\n\n nx.$api[resourceEdit](_payload)\n .then((res: any) => {\n message.success(this.t('update_success'));\n this.handleStateResponse({ stage: 'update', data: res });\n })\n .finally(() => this.setState({ loading: false }));\n } else {\n const payload = { ...values };\n const _payload = this.handleStateRequest({ stage: 'create', payload });\n\n nx.$api[resourceCreate](_payload)\n .then((res: any) => {\n message.success(this.t('create_success'));\n this.handleStateResponse({ stage: 'create', data: res });\n })\n .finally(() => this.setState({ loading: false }));\n }\n };\n\n // hotkey save handler (replaces useKeyboardSave hook)\n handleKeydown = (e: KeyboardEvent) => {\n const isSave = (e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S');\n if (isSave) {\n e.preventDefault();\n if (!this.props.disableHotkeySave) {\n // submit the form via ref\n try {\n this.formInstance?.submit();\n } catch (err) {\n // ignore if submit not available yet\n }\n }\n }\n };\n\n componentDidMount() {\n this._isMounted = true;\n // attach hotkey listener\n window.addEventListener('keydown', this.handleKeydown);\n // initialize detail if editing\n this.initDetailIfNeeded();\n }\n\n componentDidUpdate(prevProps: ReactAntResourceFormProps) {\n const prevId = prevProps.params?.id;\n const curId = this.props.params?.id;\n // re-init when id changed or from create -> edit\n if (prevId !== curId) {\n this.initDetailIfNeeded();\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeydown);\n this._isMounted = false;\n }\n\n initDetailIfNeeded() {\n const { params, name } = 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\n nx.$api[resourceShow](_payload)\n .then((res: any) => {\n if (!this._isMounted) return; // 👈 关键:防止操作已卸载组件\n const data = this.handleStateResponse({ stage: 'show', data: res });\n // set fields value on the form via ref\n try {\n this.formInstance?.setFieldsValue?.(data);\n } catch (err) {\n // ignore if not available yet\n }\n })\n .finally(() => this.setState({ loading: false }));\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 ...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 className={cx(CLASS_NAME, className)}>\n <Spin spinning={this.state.loading}>\n <ReactAntdFormSchema\n meta={meta}\n ref={this.formRef}\n onFinish={this.handleFinish}\n {...rest}>\n {this.childrenView}\n </ReactAntdFormSchema>\n </Spin>\n </Card>\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 },\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 },\n};\n"]}
|
package/dist/main.d.mts
CHANGED
|
@@ -1,21 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import * as rc_field_form_lib_interface from 'rc-field-form/lib/interface';
|
|
2
|
+
import React, { Component } from 'react';
|
|
3
|
+
import { ButtonProps, CardProps, FormInstance } from 'antd';
|
|
3
4
|
import { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';
|
|
4
5
|
|
|
5
|
-
type ReactAntResourceFormProps = {
|
|
6
|
-
lang?: string;
|
|
7
|
-
loading?: boolean;
|
|
8
|
-
okText?: string;
|
|
9
|
-
backText?: string;
|
|
10
|
-
okProps?: ButtonProps;
|
|
11
|
-
backProps?: ButtonProps;
|
|
12
|
-
classNames?: CardProps['classNames'];
|
|
13
|
-
size?: CardProps['size'];
|
|
14
|
-
extra?: CardProps['extra'];
|
|
15
|
-
title?: CardProps['title'];
|
|
16
|
-
} & ReactAntdFormSchemaProps;
|
|
17
|
-
declare const ReactAntResourceForm: FC<ReactAntResourceFormProps>;
|
|
18
|
-
|
|
19
6
|
declare global {
|
|
20
7
|
interface NxStatic {
|
|
21
8
|
$api: Record<string, any>;
|
|
@@ -30,15 +17,49 @@ type StageData = {
|
|
|
30
17
|
stage: 'show' | 'create' | 'update';
|
|
31
18
|
data: any;
|
|
32
19
|
};
|
|
33
|
-
type
|
|
20
|
+
type ReactAntResourceFormProps = {
|
|
34
21
|
lang?: string;
|
|
22
|
+
loading?: boolean;
|
|
23
|
+
okText?: string;
|
|
24
|
+
backText?: string;
|
|
35
25
|
params?: Record<string, any>;
|
|
36
26
|
disableHotkeySave?: boolean;
|
|
37
27
|
transformRequest?: (payload: StagePayload) => any;
|
|
38
28
|
transformResponse?: (res: StageData) => any;
|
|
29
|
+
okProps?: ButtonProps;
|
|
30
|
+
backProps?: ButtonProps;
|
|
31
|
+
classNames?: CardProps['classNames'];
|
|
32
|
+
size?: CardProps['size'];
|
|
33
|
+
extra?: CardProps['extra'];
|
|
34
|
+
title?: CardProps['title'];
|
|
35
|
+
} & ReactAntdFormSchemaProps;
|
|
36
|
+
type IState = {
|
|
37
|
+
loading: boolean;
|
|
39
38
|
};
|
|
40
|
-
declare
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {
|
|
40
|
+
static defaultProps: {
|
|
41
|
+
lang: string;
|
|
42
|
+
disableHotkeySave: boolean;
|
|
43
|
+
};
|
|
44
|
+
private formRef;
|
|
45
|
+
private _isMounted;
|
|
46
|
+
get isEdit(): boolean;
|
|
47
|
+
get titleView(): any;
|
|
48
|
+
get extraView(): string | number | true | Iterable<React.ReactNode> | React.JSX.Element;
|
|
49
|
+
get childrenView(): string | number | true | Iterable<React.ReactNode> | React.JSX.Element | ((values: rc_field_form_lib_interface.Store, form: rc_field_form_lib_interface.FormInstance) => JSX.Element | React.ReactNode);
|
|
50
|
+
get formInstance(): FormInstance<any> | null;
|
|
51
|
+
constructor(props: ReactAntResourceFormProps);
|
|
52
|
+
private t;
|
|
53
|
+
private handleBack;
|
|
54
|
+
handleStateRequest(stagePayload: StagePayload): any;
|
|
55
|
+
handleStateResponse(res: StageData): any;
|
|
56
|
+
handleFinish: (values: any) => void;
|
|
57
|
+
handleKeydown: (e: KeyboardEvent) => void;
|
|
58
|
+
componentDidMount(): void;
|
|
59
|
+
componentDidUpdate(prevProps: ReactAntResourceFormProps): void;
|
|
60
|
+
componentWillUnmount(): void;
|
|
61
|
+
initDetailIfNeeded(): void;
|
|
62
|
+
render(): React.JSX.Element;
|
|
63
|
+
}
|
|
43
64
|
|
|
44
|
-
export {
|
|
65
|
+
export { type ReactAntResourceFormProps, ReactAntResourceForm as default };
|
package/dist/main.d.ts
CHANGED
|
@@ -1,21 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import * as rc_field_form_lib_interface from 'rc-field-form/lib/interface';
|
|
2
|
+
import React, { Component } from 'react';
|
|
3
|
+
import { ButtonProps, CardProps, FormInstance } from 'antd';
|
|
3
4
|
import { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';
|
|
4
5
|
|
|
5
|
-
type ReactAntResourceFormProps = {
|
|
6
|
-
lang?: string;
|
|
7
|
-
loading?: boolean;
|
|
8
|
-
okText?: string;
|
|
9
|
-
backText?: string;
|
|
10
|
-
okProps?: ButtonProps;
|
|
11
|
-
backProps?: ButtonProps;
|
|
12
|
-
classNames?: CardProps['classNames'];
|
|
13
|
-
size?: CardProps['size'];
|
|
14
|
-
extra?: CardProps['extra'];
|
|
15
|
-
title?: CardProps['title'];
|
|
16
|
-
} & ReactAntdFormSchemaProps;
|
|
17
|
-
declare const ReactAntResourceForm: FC<ReactAntResourceFormProps>;
|
|
18
|
-
|
|
19
6
|
declare global {
|
|
20
7
|
interface NxStatic {
|
|
21
8
|
$api: Record<string, any>;
|
|
@@ -30,15 +17,51 @@ type StageData = {
|
|
|
30
17
|
stage: 'show' | 'create' | 'update';
|
|
31
18
|
data: any;
|
|
32
19
|
};
|
|
33
|
-
type
|
|
20
|
+
type ReactAntResourceFormProps = {
|
|
34
21
|
lang?: string;
|
|
22
|
+
loading?: boolean;
|
|
23
|
+
okText?: string;
|
|
24
|
+
backText?: string;
|
|
35
25
|
params?: Record<string, any>;
|
|
36
26
|
disableHotkeySave?: boolean;
|
|
37
27
|
transformRequest?: (payload: StagePayload) => any;
|
|
38
28
|
transformResponse?: (res: StageData) => any;
|
|
29
|
+
okProps?: ButtonProps;
|
|
30
|
+
backProps?: ButtonProps;
|
|
31
|
+
classNames?: CardProps['classNames'];
|
|
32
|
+
size?: CardProps['size'];
|
|
33
|
+
extra?: CardProps['extra'];
|
|
34
|
+
title?: CardProps['title'];
|
|
35
|
+
} & ReactAntdFormSchemaProps;
|
|
36
|
+
type IState = {
|
|
37
|
+
loading: boolean;
|
|
39
38
|
};
|
|
40
|
-
declare
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
declare class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {
|
|
40
|
+
static defaultProps: {
|
|
41
|
+
lang: string;
|
|
42
|
+
disableHotkeySave: boolean;
|
|
43
|
+
};
|
|
44
|
+
private formRef;
|
|
45
|
+
private _isMounted;
|
|
46
|
+
get isEdit(): boolean;
|
|
47
|
+
get titleView(): any;
|
|
48
|
+
get extraView(): string | number | true | Iterable<React.ReactNode> | React.JSX.Element;
|
|
49
|
+
get childrenView(): string | number | true | Iterable<React.ReactNode> | React.JSX.Element | ((values: rc_field_form_lib_interface.Store, form: rc_field_form_lib_interface.FormInstance) => JSX.Element | React.ReactNode);
|
|
50
|
+
get formInstance(): FormInstance<any> | null;
|
|
51
|
+
constructor(props: ReactAntResourceFormProps);
|
|
52
|
+
private t;
|
|
53
|
+
private handleBack;
|
|
54
|
+
handleStateRequest(stagePayload: StagePayload): any;
|
|
55
|
+
handleStateResponse(res: StageData): any;
|
|
56
|
+
handleFinish: (values: any) => void;
|
|
57
|
+
handleKeydown: (e: KeyboardEvent) => void;
|
|
58
|
+
componentDidMount(): void;
|
|
59
|
+
componentDidUpdate(prevProps: ReactAntResourceFormProps): void;
|
|
60
|
+
componentWillUnmount(): void;
|
|
61
|
+
initDetailIfNeeded(): void;
|
|
62
|
+
render(): React.JSX.Element;
|
|
63
|
+
}
|
|
43
64
|
|
|
44
|
-
|
|
65
|
+
// @ts-ignore
|
|
66
|
+
export = ReactAntResourceForm;
|
|
67
|
+
export type { ReactAntResourceFormProps };
|
package/dist/main.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var b=Object.defineProperty;var f=Object.getOwnPropertySymbols;var g=Object.prototype.hasOwnProperty,E=Object.prototype.propertyIsEnumerable;var R=(i,a,e)=>a in i?b(i,a,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[a]=e,l=(i,a)=>{for(var e in a||(a={}))g.call(a,e)&&R(i,e,a[e]);if(f)for(var e of f(a))E.call(a,e)&&R(i,e,a[e]);return i};var m=(i,a)=>b(i,"name",{value:a,configurable:!0});var w=(i,a)=>{var e={};for(var t in i)g.call(i,t)&&a.indexOf(t)<0&&(e[t]=i[t]);if(i!=null&&f)for(var t of f(i))a.indexOf(t)<0&&E.call(i,t)&&(e[t]=i[t]);return e};var h=(i,a,e)=>R(i,typeof a!="symbol"?a+"":a,e);import D from"classnames";import c,{Component as L}from"react";import{Button as y,Card as M,Space as $,message as C,Spin as P}from"antd";import T from"@jswork/react-ant-form-schema";import{ArrowLeftOutlined as v,SaveOutlined as V}from"@ant-design/icons";var x={"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"},"en-US":{create:"Create",update:"Save",create_title:"Create",update_title:"Update",create_success:"Create success",update_success:"Update success",submit:"Submit",back:"Back"}};import S from"@jswork/next";var I="react-ant-resource-form",p,B=(p=class extends L{constructor(e){super(e);h(this,"formRef",c.createRef());h(this,"_isMounted",!1);h(this,"handleBack",m(()=>{history.back()},"handleBack"));h(this,"handleFinish",m(e=>{let{params:t,name:s}=this.props,n=`${s}_update`,r=`${s}_create`;if(this.isEdit){let o=l({id:t.id},e),u=this.handleStateRequest({stage:"update",payload:o});S.$api[n](u).then(d=>{C.success(this.t("update_success")),this.handleStateResponse({stage:"update",data:d})}).finally(()=>this.setState({loading:!1}))}else{let o=l({},e),u=this.handleStateRequest({stage:"create",payload:o});S.$api[r](u).then(d=>{C.success(this.t("create_success")),this.handleStateResponse({stage:"create",data:d})}).finally(()=>this.setState({loading:!1}))}},"handleFinish"));h(this,"handleKeydown",m(e=>{var s;if((e.ctrlKey||e.metaKey)&&(e.key==="s"||e.key==="S")&&(e.preventDefault(),!this.props.disableHotkeySave))try{(s=this.formInstance)==null||s.submit()}catch(n){}},"handleKeydown"));this.state={loading:!1},this.handleStateRequest=this.handleStateRequest.bind(this),this.handleStateResponse=this.handleStateResponse.bind(this),this.initDetailIfNeeded=this.initDetailIfNeeded.bind(this)}get isEdit(){let{params:e}=this.props;return!!(e!=null&&e.id)}get titleView(){let{title:e}=this.props;return e||(this.isEdit?this.t("update_title"):this.t("create_title"))}get extraView(){let{extra:e,backText:t,backProps:s}=this.props;return e||c.createElement(y,l({size:"small",icon:c.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,o=e||(this.isEdit?this.t("update"):this.t("create"));return r||c.createElement($,null,c.createElement(y,l({htmlType:"submit",type:"primary",icon:c.createElement(V,null)},s),o||this.t("submit")),c.createElement(y,l({icon:c.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 x[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,o;let{name:t}=this.props;return this.setState({loading:!1}),(n=(s=S.$event)==null?void 0:s.emit)==null||n.call(s,`${t}:refetch`),((o=(r=this.props).transformResponse)==null?void 0:o.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()}componentWillUnmount(){window.removeEventListener("keydown",this.handleKeydown),this._isMounted=!1}initDetailIfNeeded(){let{params:e,name:t}=this.props,s=`${t}_show`;if(this.isEdit){let n={id:e.id},r=this.handleStateRequest({stage:"show",payload:n});S.$api[s](r).then(o=>{var d,k;if(!this._isMounted)return;let u=this.handleStateResponse({stage:"show",data:o});try{(k=(d=this.formInstance)==null?void 0:d.setFieldsValue)==null||k.call(d,u)}catch(A){}}).finally(()=>this.setState({loading:!1}))}}render(){let _=this.props,{className:e,name:t,meta:s,children:n,lang:r,title:o,extra:u,size:d,okText:k,backText:A,okProps:O,backProps:z,classNames:F,params:K,transformRequest:U,transformResponse:H,disableHotkeySave:W}=_,q=w(_,["className","name","meta","children","lang","title","extra","size","okText","backText","okProps","backProps","classNames","params","transformRequest","transformResponse","disableHotkeySave"]);return c.createElement(M,{title:this.titleView,extra:this.extraView,size:d,classNames:F,"data-component":I,className:D(I,e)},c.createElement(P,{spinning:this.state.loading},c.createElement(T,l({meta:s,ref:this.formRef,onFinish:this.handleFinish},q),this.childrenView)))}},m(p,"ReactAntResourceForm"),h(p,"defaultProps",{lang:"zh-CN",disableHotkeySave:!1}),p),N=B;var ne=N;export{ne as default};
|
|
2
2
|
//# sourceMappingURL=main.esm.js.map
|
package/dist/main.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/locales.ts","../src/api.tsx","../src/hooks.ts"],"sourcesContent":["// import noop from '@jswork/noop';\nimport cx from 'classnames';\nimport React, { FC } from 'react';\nimport { Button, ButtonProps, Card, CardProps, Space } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, SaveOutlined } from '@ant-design/icons';\nimport { BASIC_FORM_LOCALES } from './locales';\n\nexport type ReactAntResourceFormProps = {\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n classNames?: CardProps['classNames'];\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n} & ReactAntdFormSchemaProps;\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nconst defaultProps = {\n lang: 'zh-CN',\n};\n\nconst ReactAntResourceForm: FC<ReactAntResourceFormProps> = (props) => {\n const {\n className,\n meta,\n children,\n lang,\n title,\n loading,\n extra,\n size,\n okText,\n backText,\n okProps,\n backProps,\n classNames,\n ...rest\n } = {\n ...defaultProps,\n ...props,\n };\n\n const t = (key: string) => BASIC_FORM_LOCALES[lang][key];\n const handleBack = () => history.back();\n const _extra = extra || (\n <Button size=\"small\" icon={<ArrowLeftOutlined />} onClick={handleBack} {...backProps}>\n {backText || t('back')}\n </Button>\n );\n\n const _children = children || (\n <Space>\n <Button htmlType=\"submit\" type=\"primary\" icon={<SaveOutlined />} {...okProps}>\n {okText || t('submit')}\n </Button>\n <Button icon={<ArrowLeftOutlined />} onClick={handleBack} {...backProps}>\n {backText || t('back')}\n </Button>\n </Space>\n );\n\n return (\n <Card\n title={title}\n size={size}\n loading={loading}\n classNames={classNames}\n data-component={CLASS_NAME}\n className={cx(CLASS_NAME, className)}\n extra={_extra}>\n <ReactAntdFormSchema meta={meta} {...rest}>\n {_children}\n </ReactAntdFormSchema>\n </Card>\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 },\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 },\n};\n\nexport const BASIC_FORM_LOCALES = {\n 'zh-CN': {\n submit: '提交',\n back: '返回',\n },\n 'en-US': {\n submit: 'Submit',\n back: 'Back',\n },\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport ReactAntResourceForm, { ReactAntResourceFormProps } from '.';\nimport { Form, message } from 'antd';\nimport nx from '@jswork/next';\nimport { useKeyboardSave } from './hooks';\nimport { API_FORM_LOCALES } from './locales';\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\nexport type ReactAntResourceFormApiProps = ReactAntResourceFormProps & {\n lang?: string;\n params?: Record<string, any>;\n disableHotkeySave?: boolean;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n};\n\nconst defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n};\n\nconst ReactAntResourceFormApi: FC<ReactAntResourceFormApiProps> = (props) => {\n const { name, params, lang, transformRequest, transformResponse, disableHotkeySave, ...rest } = {\n ...defaultProps,\n ...props,\n };\n\n const resourceEdit = `${name}_update`;\n const resourceCreate = `${name}_create`;\n const resourceShow = `${name}_show`;\n const [form] = Form.useForm();\n const isEdit = Boolean(params?.id);\n const t = (key: string) => API_FORM_LOCALES[lang!][key];\n const [loading, setLoading] = useState(false);\n const handleStateRequest = (stagePayload: StagePayload) => {\n setLoading(true);\n return transformRequest?.(stagePayload) || stagePayload.payload;\n };\n\n const handleStateResponse = (res: StageData) => {\n setLoading(false);\n nx.$event?.emit?.(`${name}:refetch`);\n return transformResponse?.(res) || res.data;\n };\n\n const handleFinish = (values) => {\n if (isEdit) {\n const payload = { id: params!.id, ...values };\n const _payload = handleStateRequest({ stage: 'update', payload });\n\n nx.$api[resourceEdit](_payload)\n .then((res) => {\n message.success(t('update_success'));\n handleStateResponse({ stage: 'update', data: res });\n })\n .finally(() => setLoading(false));\n } else {\n const payload = { ...values };\n const _payload = handleStateRequest({ stage: 'create', payload });\n\n nx.$api[resourceCreate](_payload)\n .then((res) => {\n message.success(t('create_success'));\n handleStateResponse({ stage: 'create', data: res });\n })\n .finally(() => setLoading(false));\n }\n };\n\n // hotkey save\n useKeyboardSave(() => {\n if (!disableHotkeySave) form.submit();\n });\n\n // init detail\n useEffect(() => {\n if (isEdit) {\n const payload = { id: params!.id };\n const _payload = handleStateRequest({ stage: 'show', payload });\n nx.$api[resourceShow](_payload)\n .then((res) => {\n const data = handleStateResponse({ stage: 'show', data: res });\n form.setFieldsValue(data);\n })\n .finally(() => setLoading(false));\n }\n }, [isEdit, params?.id]);\n\n const okText = isEdit ? t('update') : t('create');\n const title = isEdit ? t('update_title') : t('create_title');\n\n return (\n <ReactAntResourceForm\n loading={loading}\n form={form}\n onFinish={handleFinish}\n okText={okText}\n title={title}\n {...rest}\n />\n );\n};\n\nexport default ReactAntResourceFormApi;\n","import { useEffect, useCallback } from 'react';\n\nexport const useKeyboardSave = (callback: (e: KeyboardEvent) => void) => {\n const handler = useCallback(\n (e: KeyboardEvent) => {\n // 使用 code 更可靠(不受键盘布局或大小写影响)\n if ((e.ctrlKey || e.metaKey) && e.code === 'KeyS') {\n e.preventDefault();\n callback(e);\n }\n },\n [callback] // 确保 handler 随 callback 更新而更新\n );\n\n useEffect(() => {\n document.addEventListener('keydown', handler);\n return () => {\n document.removeEventListener('keydown', handler);\n };\n }, [handler]); // handler 是 useCallback 包装的,稳定依赖\n};\n"],"mappings":"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","names":["cx","React","Button","Card","Space","ReactAntdFormSchema","ArrowLeftOutlined","SaveOutlined","API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","BASIC_FORM_LOCALES","submit","back","CLASS_NAME","defaultProps","lang","ReactAntResourceForm","__name","props","_a","__spreadValues","className","meta","children","title","loading","extra","size","okText","backText","okProps","backProps","classNames","rest","t","key","BASIC_FORM_LOCALES","handleBack","history","back","_extra","React","Button","icon","ArrowLeftOutlined","onClick","_children","Space","htmlType","type","SaveOutlined","Card","data-component","cx","ReactAntdFormSchema","index_default","React","useEffect","useState","Form","message","nx","useEffect","useCallback","useKeyboardSave","__name","callback","handler","useCallback","e","ctrlKey","metaKey","code","preventDefault","useEffect","document","addEventListener","removeEventListener","defaultProps","lang","disableHotkeySave","ReactAntResourceFormApi","__name","props","_a","__spreadValues","name","params","transformRequest","transformResponse","rest","resourceEdit","resourceCreate","resourceShow","form","Form","useForm","isEdit","Boolean","id","t","key","API_FORM_LOCALES","loading","setLoading","useState","handleStateRequest","stagePayload","payload","handleStateResponse","res","_b","nx","$event","emit","data","handleFinish","values","_payload","stage","$api","then","message","success","finally","useKeyboardSave","submit","useEffect","setFieldsValue","okText","title","React","ReactAntResourceForm","onFinish","api_default"]}
|
|
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 } from 'react';\nimport { Button, ButtonProps, Card, CardProps, Space, message, Spin } from 'antd';\nimport type { FormInstance } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, SaveOutlined } from '@ant-design/icons';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\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\nexport type ReactAntResourceFormProps = {\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n params?: Record<string, any>;\n disableHotkeySave?: boolean;\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} & ReactAntdFormSchemaProps;\n\ntype IState = {\n loading: boolean;\n};\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n };\n\n private formRef = React.createRef<FormInstance>(); // 注意类型\n private _isMounted = false;\n\n get isEdit() {\n const { params } = this.props;\n return Boolean(params?.id);\n }\n\n get titleView() {\n const { title } = this.props;\n return title || (this.isEdit ? this.t('update_title') : this.t('create_title'));\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 htmlType=\"submit\" type=\"primary\" icon={<SaveOutlined />} {...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: 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\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 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 const { params, name } = this.props;\n const resourceEdit = `${name}_update`;\n const resourceCreate = `${name}_create`;\n\n if (this.isEdit) {\n const payload = { id: params!.id, ...values };\n const _payload = this.handleStateRequest({ stage: 'update', payload });\n\n nx.$api[resourceEdit](_payload)\n .then((res: any) => {\n message.success(this.t('update_success'));\n this.handleStateResponse({ stage: 'update', data: res });\n })\n .finally(() => this.setState({ loading: false }));\n } else {\n const payload = { ...values };\n const _payload = this.handleStateRequest({ stage: 'create', payload });\n\n nx.$api[resourceCreate](_payload)\n .then((res: any) => {\n message.success(this.t('create_success'));\n this.handleStateResponse({ stage: 'create', data: res });\n })\n .finally(() => this.setState({ loading: false }));\n }\n };\n\n // hotkey save handler (replaces useKeyboardSave hook)\n handleKeydown = (e: KeyboardEvent) => {\n const isSave = (e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S');\n if (isSave) {\n e.preventDefault();\n if (!this.props.disableHotkeySave) {\n // submit the form via ref\n try {\n this.formInstance?.submit();\n } catch (err) {\n // ignore if submit not available yet\n }\n }\n }\n };\n\n componentDidMount() {\n this._isMounted = true;\n // attach hotkey listener\n window.addEventListener('keydown', this.handleKeydown);\n // initialize detail if editing\n this.initDetailIfNeeded();\n }\n\n componentDidUpdate(prevProps: ReactAntResourceFormProps) {\n const prevId = prevProps.params?.id;\n const curId = this.props.params?.id;\n // re-init when id changed or from create -> edit\n if (prevId !== curId) {\n this.initDetailIfNeeded();\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeydown);\n this._isMounted = false;\n }\n\n initDetailIfNeeded() {\n const { params, name } = 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\n nx.$api[resourceShow](_payload)\n .then((res: any) => {\n if (!this._isMounted) return; // 👈 关键:防止操作已卸载组件\n const data = this.handleStateResponse({ stage: 'show', data: res });\n // set fields value on the form via ref\n try {\n this.formInstance?.setFieldsValue?.(data);\n } catch (err) {\n // ignore if not available yet\n }\n })\n .finally(() => this.setState({ loading: false }));\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 ...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 className={cx(CLASS_NAME, className)}>\n <Spin spinning={this.state.loading}>\n <ReactAntdFormSchema\n meta={meta}\n ref={this.formRef}\n onFinish={this.handleFinish}\n {...rest}>\n {this.childrenView}\n </ReactAntdFormSchema>\n </Spin>\n </Card>\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 },\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 },\n};\n","import ReactAntResourceForm from '.';\nimport type { ReactAntResourceFormProps } from '.';\n\nexport default ReactAntResourceForm;\nexport type { ReactAntResourceFormProps };\n"],"mappings":"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","names":["cx","React","Component","Button","Card","Space","message","Spin","ReactAntdFormSchema","ArrowLeftOutlined","SaveOutlined","API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","submit","back","nx","CLASS_NAME","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","handleBack","__name","history","back","handleFinish","values","params","name","resourceEdit","resourceCreate","isEdit","payload","__spreadValues","id","_payload","handleStateRequest","stage","nx","$api","then","res","message","success","t","handleStateResponse","data","finally","setState","loading","handleKeydown","e","ctrlKey","metaKey","key","preventDefault","disableHotkeySave","formInstance","submit","err","state","bind","initDetailIfNeeded","Boolean","titleView","title","extraView","extra","backText","backProps","Button","size","icon","ArrowLeftOutlined","onClick","childrenView","okText","okProps","children","_okText","Space","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","resourceShow","setFieldsValue","render","className","meta","classNames","rest","Card","data-component","cx","Spin","spinning","ReactAntdFormSchema","ref","onFinish","__publicField","defaultProps","index_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.
|
|
3
|
+
"version": "1.0.11",
|
|
4
4
|
"main": "dist/main.cjs.js",
|
|
5
5
|
"module": "dist/main.esm.js",
|
|
6
6
|
"types": "dist/main.d.ts",
|
|
@@ -35,12 +35,12 @@
|
|
|
35
35
|
"typescript": "^5.2.2"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
|
-
"
|
|
39
|
-
"react": "*",
|
|
40
|
-
"react-dom": "*",
|
|
38
|
+
"@ant-design/icons": "*",
|
|
41
39
|
"@jswork/next": "*",
|
|
42
40
|
"antd": "*",
|
|
43
|
-
"
|
|
41
|
+
"classnames": "*",
|
|
42
|
+
"react": "*",
|
|
43
|
+
"react-dom": "*"
|
|
44
44
|
},
|
|
45
45
|
"publishConfig": {
|
|
46
46
|
"access": "public",
|
package/src/index.tsx
CHANGED
|
@@ -1,16 +1,39 @@
|
|
|
1
1
|
// import noop from '@jswork/noop';
|
|
2
2
|
import cx from 'classnames';
|
|
3
|
-
import React, {
|
|
4
|
-
import { Button, ButtonProps, Card, CardProps, Space } from 'antd';
|
|
3
|
+
import React, { Component } from 'react';
|
|
4
|
+
import { Button, ButtonProps, Card, CardProps, Space, message, Spin } from 'antd';
|
|
5
|
+
import type { FormInstance } from 'antd';
|
|
5
6
|
import ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';
|
|
6
7
|
import { ArrowLeftOutlined, SaveOutlined } from '@ant-design/icons';
|
|
7
|
-
import {
|
|
8
|
+
import { API_FORM_LOCALES } from './locales';
|
|
9
|
+
import nx from '@jswork/next';
|
|
10
|
+
|
|
11
|
+
declare global {
|
|
12
|
+
interface NxStatic {
|
|
13
|
+
$api: Record<string, any>;
|
|
14
|
+
$event: any;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
type StagePayload = {
|
|
19
|
+
stage: 'show' | 'create' | 'update';
|
|
20
|
+
payload: any;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
type StageData = {
|
|
24
|
+
stage: 'show' | 'create' | 'update';
|
|
25
|
+
data: any;
|
|
26
|
+
};
|
|
8
27
|
|
|
9
28
|
export type ReactAntResourceFormProps = {
|
|
10
29
|
lang?: string;
|
|
11
30
|
loading?: boolean;
|
|
12
31
|
okText?: string;
|
|
13
32
|
backText?: string;
|
|
33
|
+
params?: Record<string, any>;
|
|
34
|
+
disableHotkeySave?: boolean;
|
|
35
|
+
transformRequest?: (payload: StagePayload) => any;
|
|
36
|
+
transformResponse?: (res: StageData) => any;
|
|
14
37
|
okProps?: ButtonProps;
|
|
15
38
|
backProps?: ButtonProps;
|
|
16
39
|
classNames?: CardProps['classNames'];
|
|
@@ -19,66 +42,225 @@ export type ReactAntResourceFormProps = {
|
|
|
19
42
|
title?: CardProps['title'];
|
|
20
43
|
} & ReactAntdFormSchemaProps;
|
|
21
44
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const defaultProps = {
|
|
25
|
-
lang: 'zh-CN',
|
|
45
|
+
type IState = {
|
|
46
|
+
loading: boolean;
|
|
26
47
|
};
|
|
27
48
|
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
title,
|
|
35
|
-
loading,
|
|
36
|
-
extra,
|
|
37
|
-
size,
|
|
38
|
-
okText,
|
|
39
|
-
backText,
|
|
40
|
-
okProps,
|
|
41
|
-
backProps,
|
|
42
|
-
classNames,
|
|
43
|
-
...rest
|
|
44
|
-
} = {
|
|
45
|
-
...defaultProps,
|
|
46
|
-
...props,
|
|
49
|
+
const CLASS_NAME = 'react-ant-resource-form';
|
|
50
|
+
|
|
51
|
+
class ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {
|
|
52
|
+
public static defaultProps = {
|
|
53
|
+
lang: 'zh-CN',
|
|
54
|
+
disableHotkeySave: false,
|
|
47
55
|
};
|
|
48
56
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
private formRef = React.createRef<FormInstance>(); // 注意类型
|
|
58
|
+
private _isMounted = false;
|
|
59
|
+
|
|
60
|
+
get isEdit() {
|
|
61
|
+
const { params } = this.props;
|
|
62
|
+
return Boolean(params?.id);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
get titleView() {
|
|
66
|
+
const { title } = this.props;
|
|
67
|
+
return title || (this.isEdit ? this.t('update_title') : this.t('create_title'));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
get extraView() {
|
|
71
|
+
const { extra, backText, backProps } = this.props;
|
|
72
|
+
if (extra) return extra;
|
|
73
|
+
return (
|
|
74
|
+
<Button size="small" icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>
|
|
75
|
+
{backText || this.t('back')}
|
|
64
76
|
</Button>
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
{
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
get childrenView() {
|
|
81
|
+
const { okText, backText, okProps, backProps, children } = this.props;
|
|
82
|
+
const _okText = okText || (this.isEdit ? this.t('update') : this.t('create'));
|
|
83
|
+
if (children) return children;
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<Space>
|
|
87
|
+
<Button htmlType="submit" type="primary" icon={<SaveOutlined />} {...okProps}>
|
|
88
|
+
{_okText || this.t('submit')}
|
|
89
|
+
</Button>
|
|
90
|
+
<Button icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>
|
|
91
|
+
{backText || this.t('back')}
|
|
92
|
+
</Button>
|
|
93
|
+
</Space>
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
get formInstance() {
|
|
98
|
+
return this.formRef?.current;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
constructor(props: ReactAntResourceFormProps) {
|
|
102
|
+
super(props);
|
|
103
|
+
this.state = {
|
|
104
|
+
loading: false,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
this.handleStateRequest = this.handleStateRequest.bind(this);
|
|
108
|
+
this.handleStateResponse = this.handleStateResponse.bind(this);
|
|
109
|
+
this.initDetailIfNeeded = this.initDetailIfNeeded.bind(this);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private t(key: string) {
|
|
113
|
+
const { lang } = this.props;
|
|
114
|
+
return API_FORM_LOCALES[lang!][key];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private handleBack = () => {
|
|
118
|
+
history.back();
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
handleStateRequest(stagePayload: StagePayload) {
|
|
122
|
+
this.setState({ loading: true });
|
|
123
|
+
return this.props.transformRequest?.(stagePayload) || stagePayload.payload;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
handleStateResponse(res: StageData) {
|
|
127
|
+
const { name } = this.props;
|
|
128
|
+
this.setState({ loading: false });
|
|
129
|
+
nx.$event?.emit?.(`${name}:refetch`);
|
|
130
|
+
return this.props.transformResponse?.(res) || res.data;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
handleFinish = (values: any) => {
|
|
134
|
+
const { params, name } = this.props;
|
|
135
|
+
const resourceEdit = `${name}_update`;
|
|
136
|
+
const resourceCreate = `${name}_create`;
|
|
137
|
+
|
|
138
|
+
if (this.isEdit) {
|
|
139
|
+
const payload = { id: params!.id, ...values };
|
|
140
|
+
const _payload = this.handleStateRequest({ stage: 'update', payload });
|
|
141
|
+
|
|
142
|
+
nx.$api[resourceEdit](_payload)
|
|
143
|
+
.then((res: any) => {
|
|
144
|
+
message.success(this.t('update_success'));
|
|
145
|
+
this.handleStateResponse({ stage: 'update', data: res });
|
|
146
|
+
})
|
|
147
|
+
.finally(() => this.setState({ loading: false }));
|
|
148
|
+
} else {
|
|
149
|
+
const payload = { ...values };
|
|
150
|
+
const _payload = this.handleStateRequest({ stage: 'create', payload });
|
|
151
|
+
|
|
152
|
+
nx.$api[resourceCreate](_payload)
|
|
153
|
+
.then((res: any) => {
|
|
154
|
+
message.success(this.t('create_success'));
|
|
155
|
+
this.handleStateResponse({ stage: 'create', data: res });
|
|
156
|
+
})
|
|
157
|
+
.finally(() => this.setState({ loading: false }));
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
// hotkey save handler (replaces useKeyboardSave hook)
|
|
162
|
+
handleKeydown = (e: KeyboardEvent) => {
|
|
163
|
+
const isSave = (e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S');
|
|
164
|
+
if (isSave) {
|
|
165
|
+
e.preventDefault();
|
|
166
|
+
if (!this.props.disableHotkeySave) {
|
|
167
|
+
// submit the form via ref
|
|
168
|
+
try {
|
|
169
|
+
this.formInstance?.submit();
|
|
170
|
+
} catch (err) {
|
|
171
|
+
// ignore if submit not available yet
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
componentDidMount() {
|
|
178
|
+
this._isMounted = true;
|
|
179
|
+
// attach hotkey listener
|
|
180
|
+
window.addEventListener('keydown', this.handleKeydown);
|
|
181
|
+
// initialize detail if editing
|
|
182
|
+
this.initDetailIfNeeded();
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
componentDidUpdate(prevProps: ReactAntResourceFormProps) {
|
|
186
|
+
const prevId = prevProps.params?.id;
|
|
187
|
+
const curId = this.props.params?.id;
|
|
188
|
+
// re-init when id changed or from create -> edit
|
|
189
|
+
if (prevId !== curId) {
|
|
190
|
+
this.initDetailIfNeeded();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
componentWillUnmount() {
|
|
195
|
+
window.removeEventListener('keydown', this.handleKeydown);
|
|
196
|
+
this._isMounted = false;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
initDetailIfNeeded() {
|
|
200
|
+
const { params, name } = this.props;
|
|
201
|
+
const resourceShow = `${name}_show`;
|
|
202
|
+
|
|
203
|
+
if (this.isEdit) {
|
|
204
|
+
const payload = { id: params!.id };
|
|
205
|
+
const _payload = this.handleStateRequest({ stage: 'show', payload });
|
|
206
|
+
|
|
207
|
+
nx.$api[resourceShow](_payload)
|
|
208
|
+
.then((res: any) => {
|
|
209
|
+
if (!this._isMounted) return; // 👈 关键:防止操作已卸载组件
|
|
210
|
+
const data = this.handleStateResponse({ stage: 'show', data: res });
|
|
211
|
+
// set fields value on the form via ref
|
|
212
|
+
try {
|
|
213
|
+
this.formInstance?.setFieldsValue?.(data);
|
|
214
|
+
} catch (err) {
|
|
215
|
+
// ignore if not available yet
|
|
216
|
+
}
|
|
217
|
+
})
|
|
218
|
+
.finally(() => this.setState({ loading: false }));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
render() {
|
|
223
|
+
const {
|
|
224
|
+
className,
|
|
225
|
+
name,
|
|
226
|
+
meta,
|
|
227
|
+
children,
|
|
228
|
+
lang,
|
|
229
|
+
title,
|
|
230
|
+
extra,
|
|
231
|
+
size,
|
|
232
|
+
okText,
|
|
233
|
+
backText,
|
|
234
|
+
okProps,
|
|
235
|
+
backProps,
|
|
236
|
+
classNames,
|
|
237
|
+
params,
|
|
238
|
+
transformRequest,
|
|
239
|
+
transformResponse,
|
|
240
|
+
disableHotkeySave,
|
|
241
|
+
...rest
|
|
242
|
+
} = this.props;
|
|
243
|
+
|
|
244
|
+
return (
|
|
245
|
+
<Card
|
|
246
|
+
title={this.titleView}
|
|
247
|
+
extra={this.extraView}
|
|
248
|
+
size={size}
|
|
249
|
+
classNames={classNames}
|
|
250
|
+
data-component={CLASS_NAME}
|
|
251
|
+
className={cx(CLASS_NAME, className)}>
|
|
252
|
+
<Spin spinning={this.state.loading}>
|
|
253
|
+
<ReactAntdFormSchema
|
|
254
|
+
meta={meta}
|
|
255
|
+
ref={this.formRef}
|
|
256
|
+
onFinish={this.handleFinish}
|
|
257
|
+
{...rest}>
|
|
258
|
+
{this.childrenView}
|
|
259
|
+
</ReactAntdFormSchema>
|
|
260
|
+
</Spin>
|
|
261
|
+
</Card>
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
83
265
|
|
|
84
266
|
export default ReactAntResourceForm;
|
package/src/locales.ts
CHANGED
|
@@ -6,6 +6,8 @@ export const API_FORM_LOCALES = {
|
|
|
6
6
|
update_title: '更新',
|
|
7
7
|
create_success: '创建成功',
|
|
8
8
|
update_success: '更新成功',
|
|
9
|
+
submit: '提交',
|
|
10
|
+
back: '返回',
|
|
9
11
|
},
|
|
10
12
|
'en-US': {
|
|
11
13
|
create: 'Create',
|
|
@@ -14,15 +16,6 @@ export const API_FORM_LOCALES = {
|
|
|
14
16
|
update_title: 'Update',
|
|
15
17
|
create_success: 'Create success',
|
|
16
18
|
update_success: 'Update success',
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export const BASIC_FORM_LOCALES = {
|
|
21
|
-
'zh-CN': {
|
|
22
|
-
submit: '提交',
|
|
23
|
-
back: '返回',
|
|
24
|
-
},
|
|
25
|
-
'en-US': {
|
|
26
19
|
submit: 'Submit',
|
|
27
20
|
back: 'Back',
|
|
28
21
|
},
|
package/src/main.tsx
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import ReactAntResourceForm from '.';
|
|
2
|
-
import ReactAntResourceFormApi from './api';
|
|
3
|
-
import { useKeyboardSave } from './hooks';
|
|
4
2
|
import type { ReactAntResourceFormProps } from '.';
|
|
5
|
-
import type { ReactAntResourceFormApiProps } from './api';
|
|
6
3
|
|
|
7
|
-
export
|
|
8
|
-
export type { ReactAntResourceFormProps
|
|
4
|
+
export default ReactAntResourceForm;
|
|
5
|
+
export type { ReactAntResourceFormProps };
|
package/src/api.tsx
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import React, { FC, useEffect, useState } from 'react';
|
|
2
|
-
import ReactAntResourceForm, { ReactAntResourceFormProps } from '.';
|
|
3
|
-
import { Form, message } from 'antd';
|
|
4
|
-
import nx from '@jswork/next';
|
|
5
|
-
import { useKeyboardSave } from './hooks';
|
|
6
|
-
import { API_FORM_LOCALES } from './locales';
|
|
7
|
-
|
|
8
|
-
declare global {
|
|
9
|
-
interface NxStatic {
|
|
10
|
-
$api: Record<string, any>;
|
|
11
|
-
$event: any;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
type StagePayload = {
|
|
16
|
-
stage: 'show' | 'create' | 'update';
|
|
17
|
-
payload: any;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
type StageData = {
|
|
21
|
-
stage: 'show' | 'create' | 'update';
|
|
22
|
-
data: any;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export type ReactAntResourceFormApiProps = ReactAntResourceFormProps & {
|
|
26
|
-
lang?: string;
|
|
27
|
-
params?: Record<string, any>;
|
|
28
|
-
disableHotkeySave?: boolean;
|
|
29
|
-
transformRequest?: (payload: StagePayload) => any;
|
|
30
|
-
transformResponse?: (res: StageData) => any;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const defaultProps = {
|
|
34
|
-
lang: 'zh-CN',
|
|
35
|
-
disableHotkeySave: false,
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const ReactAntResourceFormApi: FC<ReactAntResourceFormApiProps> = (props) => {
|
|
39
|
-
const { name, params, lang, transformRequest, transformResponse, disableHotkeySave, ...rest } = {
|
|
40
|
-
...defaultProps,
|
|
41
|
-
...props,
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
const resourceEdit = `${name}_update`;
|
|
45
|
-
const resourceCreate = `${name}_create`;
|
|
46
|
-
const resourceShow = `${name}_show`;
|
|
47
|
-
const [form] = Form.useForm();
|
|
48
|
-
const isEdit = Boolean(params?.id);
|
|
49
|
-
const t = (key: string) => API_FORM_LOCALES[lang!][key];
|
|
50
|
-
const [loading, setLoading] = useState(false);
|
|
51
|
-
const handleStateRequest = (stagePayload: StagePayload) => {
|
|
52
|
-
setLoading(true);
|
|
53
|
-
return transformRequest?.(stagePayload) || stagePayload.payload;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const handleStateResponse = (res: StageData) => {
|
|
57
|
-
setLoading(false);
|
|
58
|
-
nx.$event?.emit?.(`${name}:refetch`);
|
|
59
|
-
return transformResponse?.(res) || res.data;
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
const handleFinish = (values) => {
|
|
63
|
-
if (isEdit) {
|
|
64
|
-
const payload = { id: params!.id, ...values };
|
|
65
|
-
const _payload = handleStateRequest({ stage: 'update', payload });
|
|
66
|
-
|
|
67
|
-
nx.$api[resourceEdit](_payload)
|
|
68
|
-
.then((res) => {
|
|
69
|
-
message.success(t('update_success'));
|
|
70
|
-
handleStateResponse({ stage: 'update', data: res });
|
|
71
|
-
})
|
|
72
|
-
.finally(() => setLoading(false));
|
|
73
|
-
} else {
|
|
74
|
-
const payload = { ...values };
|
|
75
|
-
const _payload = handleStateRequest({ stage: 'create', payload });
|
|
76
|
-
|
|
77
|
-
nx.$api[resourceCreate](_payload)
|
|
78
|
-
.then((res) => {
|
|
79
|
-
message.success(t('create_success'));
|
|
80
|
-
handleStateResponse({ stage: 'create', data: res });
|
|
81
|
-
})
|
|
82
|
-
.finally(() => setLoading(false));
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
// hotkey save
|
|
87
|
-
useKeyboardSave(() => {
|
|
88
|
-
if (!disableHotkeySave) form.submit();
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
// init detail
|
|
92
|
-
useEffect(() => {
|
|
93
|
-
if (isEdit) {
|
|
94
|
-
const payload = { id: params!.id };
|
|
95
|
-
const _payload = handleStateRequest({ stage: 'show', payload });
|
|
96
|
-
nx.$api[resourceShow](_payload)
|
|
97
|
-
.then((res) => {
|
|
98
|
-
const data = handleStateResponse({ stage: 'show', data: res });
|
|
99
|
-
form.setFieldsValue(data);
|
|
100
|
-
})
|
|
101
|
-
.finally(() => setLoading(false));
|
|
102
|
-
}
|
|
103
|
-
}, [isEdit, params?.id]);
|
|
104
|
-
|
|
105
|
-
const okText = isEdit ? t('update') : t('create');
|
|
106
|
-
const title = isEdit ? t('update_title') : t('create_title');
|
|
107
|
-
|
|
108
|
-
return (
|
|
109
|
-
<ReactAntResourceForm
|
|
110
|
-
loading={loading}
|
|
111
|
-
form={form}
|
|
112
|
-
onFinish={handleFinish}
|
|
113
|
-
okText={okText}
|
|
114
|
-
title={title}
|
|
115
|
-
{...rest}
|
|
116
|
-
/>
|
|
117
|
-
);
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
export default ReactAntResourceFormApi;
|