@jswork/react-ant-resource-form 1.0.37 → 1.0.38
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.map +1 -1
- package/dist/main.esm.js.map +1 -1
- package/package.json +4 -3
- package/src/utils.ts +3 -1
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/utils.ts"],"names":["API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","submit","back","no_change","filterPayload","payload","config","Array","isArray","include","exclude","result","__spreadValues","length","allowed","includeSet","i","key","hasOwnProperty","final","excludeSet","CLASS_NAME","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","_initialValues","handleBack","__name","history","setInitialValues","formInstance","getFieldsValue","handleFinish","values","canSave","msg","t","isEdit","onResourceUpdate","onResourceCreate","params","name","submitGuard","onMutate","id","_payload","handleStateRequest","stage","submitGuardArgs","mutateArgs","then","nx","$api"],"mappings":"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","file":"/Users/ap7/github/react-ant-resource-form/packages/lib/dist/main.cjs.js","sourcesContent":[null,"// import noop from '@jswork/noop';\nimport cx from 'classnames';\nimport React, { Component } from 'react';\nimport { ButtonProps, CardProps, FormInstance } from 'antd';\nimport { Button, Card, message, Space, Spin } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, DiffOutlined, SaveOutlined } from '@ant-design/icons';\nimport deepEqual from 'fast-deep-equal';\nimport {\n InitGuardArgs,\n MsgType,\n MutateArgs,\n StageData,\n StagePayload,\n SubmitGuardArgs,\n} from './types';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\nimport '@jswork/next-compact-object';\nimport { filterPayload } from './utils';\n\ndeclare global {\n interface NxStatic {\n $api: Record<string, any>;\n $event: any;\n }\n}\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nexport type ReactAntResourceFormProps = {\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n params?: Record<string, any>;\n blocker?: boolean;\n mute?: boolean;\n disableHotkeySave?: boolean;\n initGuard?: (args: InitGuardArgs) => Promise<void>;\n submitGuard?: (args: SubmitGuardArgs) => Promise<void>;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n classNames?: CardProps['classNames'];\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n onInit?: (ctx: ReactAntResourceForm) => void;\n onMutate?: (args: MutateArgs) => void;\n payloadFields?: { include?: string[]; exclude?: string[] }\n} & ReactAntdFormSchemaProps;\n\nexport type IState = {\n loading: boolean;\n touched: boolean;\n};\n\n/**\n * 当前 card loading 不要直接使用,因为这个 loading 会导致 Card 里的 formRef 被设置成 null\n * 这个情况仅在 class component 里才会出现,function component 里不会:\n * 报错示例:\n *\n * this.formRef?: null\n * index.tsx:229 this.formRef?: {getFieldValue: ƒ, getFieldsValue: ƒ, getFieldError: ƒ, getFieldWarning: ƒ, getFieldsError: ƒ, …}\n * index.tsx:229 this.formRef?: null\n *\n * initGuard | submitGuard:\n * https://chat.qwen.ai/c/60329863-0e5e-47f9-a075-a65ad30940cc\n *\n * onMutate:\n * 在 create/update 成功后,需要刷新列表,可以用 onMutate 继续后续处理。\n *\n * blocker:\n * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。\n * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor\n *\n * transformRequest:\n * 当你提交表单的时候,需要对参数进行一些预处理,比如加密,或者添加一些默认值,这个时候就可以用 transformRequest。\n */\n\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n blocker: false,\n mute: false,\n initGuard: () => Promise.resolve(),\n submitGuard: () => Promise.resolve(),\n payloadFields: { include: [], exclude: [] },\n };\n\n private formRef = React.createRef<FormInstance>(); // 注意类型\n private _isMounted = false;\n private _initialValues = null;\n\n get isEdit() {\n const { params } = this.props;\n return Boolean(params?.id);\n }\n\n get canSave() {\n const { touched, loading } = this.state;\n if (!this.isEdit) return !loading;\n return touched && !loading;\n }\n\n get titleView() {\n const { title } = this.props;\n const _title = title || (this.isEdit ? this.t('update_title') : this.t('create_title'));\n return (\n <Space>\n {_title}\n <span>{this.touchedView}</span>\n </Space>\n );\n }\n\n get touchedView() {\n if (!this.isEdit) return null;\n return this.state.touched ? (\n <em style={{ color: '#f60' }}>\n <DiffOutlined />\n </em>\n ) : null;\n }\n\n get extraView() {\n const { extra, backText, backProps } = this.props;\n if (extra) return extra;\n return (\n <Button size=\"small\" icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n );\n }\n\n get childrenView() {\n const { okText, backText, okProps, backProps, children } = this.props;\n const _okText = okText || (this.isEdit ? this.t('update') : this.t('create'));\n if (children) return children;\n\n return (\n <Space>\n <Button\n disabled={!this.canSave}\n htmlType=\"submit\"\n type=\"primary\"\n icon={<SaveOutlined />}\n {...okProps}>\n {_okText || this.t('submit')}\n </Button>\n <Button icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n </Space>\n );\n }\n\n get formInstance() {\n return this.formRef?.current;\n }\n\n constructor(props: ReactAntResourceFormProps) {\n super(props);\n this.state = {\n loading: props.loading!,\n touched: false,\n };\n\n this.handleStateRequest = this.handleStateRequest.bind(this);\n this.handleStateResponse = this.handleStateResponse.bind(this);\n this.initDetailIfNeeded = this.initDetailIfNeeded.bind(this);\n\n props.onInit?.(this);\n }\n\n private t(key: string) {\n const { lang } = this.props;\n return API_FORM_LOCALES[lang!][key];\n }\n\n private msg(msg: string, type: MsgType = 'success') {\n const { mute } = this.props;\n if (!mute) message[type](msg);\n }\n\n private handleBack = () => {\n history.back();\n };\n\n private setInitialValues = () => {\n this._initialValues = this.formInstance?.getFieldsValue();\n };\n\n handleStateRequest(stagePayload: StagePayload) {\n const { payloadFields, transformRequest } = this.props;\n this.setState({ loading: true });\n const rawPayload = transformRequest?.(stagePayload) || stagePayload.payload;\n return filterPayload(rawPayload, payloadFields);\n }\n\n handleStateResponse(res: StageData) {\n const { name } = this.props;\n this.setState({ loading: false });\n nx.$event?.emit?.(`${name}:refetch`);\n return this.props.transformResponse?.(res) || res.data;\n }\n\n handleFinish = (values: any) => {\n if (!this.canSave) {\n this.msg(this.t('no_change'), 'info');\n return;\n }\n this.isEdit ? this.onResourceUpdate(values) : this.onResourceCreate(values);\n };\n\n private onResourceUpdate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { id: params!.id, ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'update', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n params,\n };\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_update`](_payload)\n .then((res: any) => {\n this.msg(this.t('update_success'));\n this.handleStateResponse({ stage: 'update', data: res });\n onMutate?.(mutateArgs);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.handleValuesChange(null, this._initialValues);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'create', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n params,\n };\n\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_create`](_payload)\n .then((res: any) => {\n this.msg(this.t('create_success'));\n this.handleStateResponse({ stage: 'create', data: res });\n this.formInstance?.resetFields();\n onMutate?.(mutateArgs);\n history.back();\n })\n .finally(() => this.setState({ loading: false }));\n });\n };\n\n // hotkey save handler (replaces useKeyboardSave hook)\n handleKeydown = (e: KeyboardEvent) => {\n const { disableHotkeySave } = this.props;\n const isSave = (e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S');\n if (isSave) {\n e.preventDefault();\n if (!disableHotkeySave) {\n this.formInstance?.submit();\n }\n }\n };\n\n handleValuesChange = (_: any, allValues: any) => {\n if (this._isMounted && this._initialValues !== null) {\n this.setState({\n touched: !deepEqual(this._initialValues, allValues),\n });\n }\n };\n\n componentDidMount() {\n this._isMounted = true;\n // attach hotkey listener\n window.addEventListener('keydown', this.handleKeydown);\n // initialize detail if editing\n this.initDetailIfNeeded();\n }\n\n componentDidUpdate(prevProps: ReactAntResourceFormProps) {\n const prevId = prevProps.params?.id;\n const curId = this.props.params?.id;\n // re-init when id changed or from create -> edit\n if (prevId !== curId) {\n this.initDetailIfNeeded();\n }\n\n // loading update\n if (prevProps.loading !== this.props.loading) {\n this.setState({ loading: this.props.loading! });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeydown);\n this._isMounted = false;\n }\n\n initDetailIfNeeded() {\n const { params, name, initGuard } = this.props;\n const resourceShow = `${name}_show`;\n\n if (this.isEdit) {\n const payload = { id: params!.id };\n const _payload = this.handleStateRequest({ stage: 'show', payload });\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n nx.$api[resourceShow](_payload)\n .then((res: any) => {\n if (!this._isMounted) return; // 👈 关键:防止操作已卸载组件\n const data = this.handleStateResponse({ stage: 'show', data: res });\n this.formInstance?.setFieldsValue?.(data);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n });\n });\n } else {\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: null,\n isEdit: false,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n this.setInitialValues();\n this.setState({ loading: false });\n });\n }\n }\n\n render() {\n const {\n className,\n name,\n meta,\n children,\n lang,\n title,\n extra,\n size,\n okText,\n backText,\n okProps,\n backProps,\n classNames,\n params,\n transformRequest,\n transformResponse,\n disableHotkeySave,\n blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\n payloadFields,\n ...rest\n } = this.props;\n\n return (\n <Card\n title={this.titleView}\n extra={this.extraView}\n size={size}\n classNames={classNames}\n data-component={CLASS_NAME}\n data-blocker={blocker}\n className={cx(CLASS_NAME, className)}>\n <Spin spinning={this.state.loading}>\n <ReactAntdFormSchema\n meta={meta}\n ref={this.formRef}\n onValuesChange={this.handleValuesChange}\n onFinish={this.handleFinish}\n {...rest}>\n {this.childrenView}\n </ReactAntdFormSchema>\n </Spin>\n </Card>\n );\n }\n}\n\n\nexport default ReactAntResourceForm;\n","export const API_FORM_LOCALES = {\n 'zh-CN': {\n create: '创建',\n update: '保存',\n create_title: '创建',\n update_title: '更新',\n create_success: '创建成功',\n update_success: '更新成功',\n submit: '提交',\n back: '返回',\n no_change: '没有修改',\n },\n 'en-US': {\n create: 'Create',\n update: 'Save',\n create_title: 'Create',\n update_title: 'Update',\n create_success: 'Create success',\n update_success: 'Update success',\n submit: 'Submit',\n back: 'Back',\n no_change: 'No change',\n },\n};\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 16:46:34\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-10-31 16:46:47\n */\n\nexport interface PayloadFieldConfig {\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * 根据 include/exclude 规则过滤 payload 对象\n * @param payload 原始对象(会被浅拷贝,不修改原对象)\n * @param config 字段过滤配置\n * @returns 过滤后的新对象\n */\nexport function filterPayload(\n payload: Record<string, any> | null | undefined,\n config: PayloadFieldConfig = {},\n): Record<string, any> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return {};\n }\n\n const { include, exclude } = config;\n let result = { ...payload }; // 浅拷贝(ES5 兼容写法见下方备注)\n\n // --- include: 白名单 ---\n if (Array.isArray(include) && include.length > 0) {\n const allowed: Record<string, any> = {};\n const includeSet: Record<string, boolean> = {};\n for (let i = 0; i < include.length; i++) {\n includeSet[include[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && includeSet[key]) {\n allowed[key] = result[key];\n }\n }\n result = allowed;\n }\n\n // --- exclude: 黑名单 ---\n if (Array.isArray(exclude) && exclude.length > 0) {\n const final: Record<string, any> = {};\n const excludeSet: Record<string, boolean> = {};\n for (let i = 0; i < exclude.length; i++) {\n excludeSet[exclude[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && !excludeSet[key]) {\n final[key] = result[key];\n }\n }\n result = final;\n }\n\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/ap7/github/react-ant-resource-form/packages/lib/dist/main.cjs.js","../src/index.tsx","../src/locales.ts","../src/utils.ts"],"names":["API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","submit","back","no_change","filterPayload","payload","config","Array","isArray","include","exclude","result","__spreadValues","length","allowed","includeSet","i","key","hasOwnProperty","final","excludeSet","CLASS_NAME","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","_initialValues","handleBack","__name","history","setInitialValues","formInstance","getFieldsValue","handleFinish","values","canSave","msg","t","isEdit","onResourceUpdate","onResourceCreate","params","name","submitGuard","onMutate","id","_payload","handleStateRequest","stage","submitGuardArgs","mutateArgs","then","nx","$api"],"mappings":"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","file":"/Users/ap7/github/react-ant-resource-form/packages/lib/dist/main.cjs.js","sourcesContent":[null,"// import noop from '@jswork/noop';\nimport cx from 'classnames';\nimport React, { Component } from 'react';\nimport { ButtonProps, CardProps, FormInstance } from 'antd';\nimport { Button, Card, message, Space, Spin } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, DiffOutlined, SaveOutlined } from '@ant-design/icons';\nimport deepEqual from 'fast-deep-equal';\nimport {\n InitGuardArgs,\n MsgType,\n MutateArgs,\n StageData,\n StagePayload,\n SubmitGuardArgs,\n} from './types';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\nimport '@jswork/next-compact-object';\nimport { filterPayload } from './utils';\n\ndeclare global {\n interface NxStatic {\n $api: Record<string, any>;\n $event: any;\n }\n}\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nexport type ReactAntResourceFormProps = {\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n params?: Record<string, any>;\n blocker?: boolean;\n mute?: boolean;\n disableHotkeySave?: boolean;\n initGuard?: (args: InitGuardArgs) => Promise<void>;\n submitGuard?: (args: SubmitGuardArgs) => Promise<void>;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n classNames?: CardProps['classNames'];\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n onInit?: (ctx: ReactAntResourceForm) => void;\n onMutate?: (args: MutateArgs) => void;\n payloadFields?: { include?: string[]; exclude?: string[] }\n} & ReactAntdFormSchemaProps;\n\nexport type IState = {\n loading: boolean;\n touched: boolean;\n};\n\n/**\n * 当前 card loading 不要直接使用,因为这个 loading 会导致 Card 里的 formRef 被设置成 null\n * 这个情况仅在 class component 里才会出现,function component 里不会:\n * 报错示例:\n *\n * this.formRef?: null\n * index.tsx:229 this.formRef?: {getFieldValue: ƒ, getFieldsValue: ƒ, getFieldError: ƒ, getFieldWarning: ƒ, getFieldsError: ƒ, …}\n * index.tsx:229 this.formRef?: null\n *\n * initGuard | submitGuard:\n * https://chat.qwen.ai/c/60329863-0e5e-47f9-a075-a65ad30940cc\n *\n * onMutate:\n * 在 create/update 成功后,需要刷新列表,可以用 onMutate 继续后续处理。\n *\n * blocker:\n * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。\n * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor\n *\n * transformRequest:\n * 当你提交表单的时候,需要对参数进行一些预处理,比如加密,或者添加一些默认值,这个时候就可以用 transformRequest。\n */\n\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n blocker: false,\n mute: false,\n initGuard: () => Promise.resolve(),\n submitGuard: () => Promise.resolve(),\n payloadFields: { include: [], exclude: [] },\n };\n\n private formRef = React.createRef<FormInstance>(); // 注意类型\n private _isMounted = false;\n private _initialValues = null;\n\n get isEdit() {\n const { params } = this.props;\n return Boolean(params?.id);\n }\n\n get canSave() {\n const { touched, loading } = this.state;\n if (!this.isEdit) return !loading;\n return touched && !loading;\n }\n\n get titleView() {\n const { title } = this.props;\n const _title = title || (this.isEdit ? this.t('update_title') : this.t('create_title'));\n return (\n <Space>\n {_title}\n <span>{this.touchedView}</span>\n </Space>\n );\n }\n\n get touchedView() {\n if (!this.isEdit) return null;\n return this.state.touched ? (\n <em style={{ color: '#f60' }}>\n <DiffOutlined />\n </em>\n ) : null;\n }\n\n get extraView() {\n const { extra, backText, backProps } = this.props;\n if (extra) return extra;\n return (\n <Button size=\"small\" icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n );\n }\n\n get childrenView() {\n const { okText, backText, okProps, backProps, children } = this.props;\n const _okText = okText || (this.isEdit ? this.t('update') : this.t('create'));\n if (children) return children;\n\n return (\n <Space>\n <Button\n disabled={!this.canSave}\n htmlType=\"submit\"\n type=\"primary\"\n icon={<SaveOutlined />}\n {...okProps}>\n {_okText || this.t('submit')}\n </Button>\n <Button icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n </Space>\n );\n }\n\n get formInstance() {\n return this.formRef?.current;\n }\n\n constructor(props: ReactAntResourceFormProps) {\n super(props);\n this.state = {\n loading: props.loading!,\n touched: false,\n };\n\n this.handleStateRequest = this.handleStateRequest.bind(this);\n this.handleStateResponse = this.handleStateResponse.bind(this);\n this.initDetailIfNeeded = this.initDetailIfNeeded.bind(this);\n\n props.onInit?.(this);\n }\n\n private t(key: string) {\n const { lang } = this.props;\n return API_FORM_LOCALES[lang!][key];\n }\n\n private msg(msg: string, type: MsgType = 'success') {\n const { mute } = this.props;\n if (!mute) message[type](msg);\n }\n\n private handleBack = () => {\n history.back();\n };\n\n private setInitialValues = () => {\n this._initialValues = this.formInstance?.getFieldsValue();\n };\n\n handleStateRequest(stagePayload: StagePayload) {\n const { payloadFields, transformRequest } = this.props;\n this.setState({ loading: true });\n const rawPayload = transformRequest?.(stagePayload) || stagePayload.payload;\n return filterPayload(rawPayload, payloadFields);\n }\n\n handleStateResponse(res: StageData) {\n const { name } = this.props;\n this.setState({ loading: false });\n nx.$event?.emit?.(`${name}:refetch`);\n return this.props.transformResponse?.(res) || res.data;\n }\n\n handleFinish = (values: any) => {\n if (!this.canSave) {\n this.msg(this.t('no_change'), 'info');\n return;\n }\n this.isEdit ? this.onResourceUpdate(values) : this.onResourceCreate(values);\n };\n\n private onResourceUpdate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { id: params!.id, ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'update', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n params,\n };\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_update`](_payload)\n .then((res: any) => {\n this.msg(this.t('update_success'));\n this.handleStateResponse({ stage: 'update', data: res });\n onMutate?.(mutateArgs);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.handleValuesChange(null, this._initialValues);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'create', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n params,\n };\n\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_create`](_payload)\n .then((res: any) => {\n this.msg(this.t('create_success'));\n this.handleStateResponse({ stage: 'create', data: res });\n this.formInstance?.resetFields();\n onMutate?.(mutateArgs);\n history.back();\n })\n .finally(() => this.setState({ loading: false }));\n });\n };\n\n // hotkey save handler (replaces useKeyboardSave hook)\n handleKeydown = (e: KeyboardEvent) => {\n const { disableHotkeySave } = this.props;\n const isSave = (e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S');\n if (isSave) {\n e.preventDefault();\n if (!disableHotkeySave) {\n this.formInstance?.submit();\n }\n }\n };\n\n handleValuesChange = (_: any, allValues: any) => {\n if (this._isMounted && this._initialValues !== null) {\n this.setState({\n touched: !deepEqual(this._initialValues, allValues),\n });\n }\n };\n\n componentDidMount() {\n this._isMounted = true;\n // attach hotkey listener\n window.addEventListener('keydown', this.handleKeydown);\n // initialize detail if editing\n this.initDetailIfNeeded();\n }\n\n componentDidUpdate(prevProps: ReactAntResourceFormProps) {\n const prevId = prevProps.params?.id;\n const curId = this.props.params?.id;\n // re-init when id changed or from create -> edit\n if (prevId !== curId) {\n this.initDetailIfNeeded();\n }\n\n // loading update\n if (prevProps.loading !== this.props.loading) {\n this.setState({ loading: this.props.loading! });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeydown);\n this._isMounted = false;\n }\n\n initDetailIfNeeded() {\n const { params, name, initGuard } = this.props;\n const resourceShow = `${name}_show`;\n\n if (this.isEdit) {\n const payload = { id: params!.id };\n const _payload = this.handleStateRequest({ stage: 'show', payload });\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n nx.$api[resourceShow](_payload)\n .then((res: any) => {\n if (!this._isMounted) return; // 👈 关键:防止操作已卸载组件\n const data = this.handleStateResponse({ stage: 'show', data: res });\n this.formInstance?.setFieldsValue?.(data);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n });\n });\n } else {\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: null,\n isEdit: false,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n this.setInitialValues();\n this.setState({ loading: false });\n });\n }\n }\n\n render() {\n const {\n className,\n name,\n meta,\n children,\n lang,\n title,\n extra,\n size,\n okText,\n backText,\n okProps,\n backProps,\n classNames,\n params,\n transformRequest,\n transformResponse,\n disableHotkeySave,\n blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\n payloadFields,\n ...rest\n } = this.props;\n\n return (\n <Card\n title={this.titleView}\n extra={this.extraView}\n size={size}\n classNames={classNames}\n data-component={CLASS_NAME}\n data-blocker={blocker}\n className={cx(CLASS_NAME, className)}>\n <Spin spinning={this.state.loading}>\n <ReactAntdFormSchema\n meta={meta}\n ref={this.formRef}\n onValuesChange={this.handleValuesChange}\n onFinish={this.handleFinish}\n {...rest}>\n {this.childrenView}\n </ReactAntdFormSchema>\n </Spin>\n </Card>\n );\n }\n}\n\n\nexport default ReactAntResourceForm;\n","export const API_FORM_LOCALES = {\n 'zh-CN': {\n create: '创建',\n update: '保存',\n create_title: '创建',\n update_title: '更新',\n create_success: '创建成功',\n update_success: '更新成功',\n submit: '提交',\n back: '返回',\n no_change: '没有修改',\n },\n 'en-US': {\n create: 'Create',\n update: 'Save',\n create_title: 'Create',\n update_title: 'Update',\n create_success: 'Create success',\n update_success: 'Update success',\n submit: 'Submit',\n back: 'Back',\n no_change: 'No change',\n },\n};\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 16:46:34\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-10-31 16:51:16\n *\n * AI(filterPayload): https://chat.qwen.ai/c/5213efdf-e88d-4367-9bd1-bd4d23af6223\n */\n\nexport interface PayloadFieldConfig {\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * 根据 include/exclude 规则过滤 payload 对象\n * @param payload 原始对象(会被浅拷贝,不修改原对象)\n * @param config 字段过滤配置\n * @returns 过滤后的新对象\n */\nexport function filterPayload(\n payload: Record<string, any> | null | undefined,\n config: PayloadFieldConfig = {},\n): Record<string, any> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return {};\n }\n\n const { include, exclude } = config;\n let result = { ...payload }; // 浅拷贝(ES5 兼容写法见下方备注)\n\n // --- include: 白名单 ---\n if (Array.isArray(include) && include.length > 0) {\n const allowed: Record<string, any> = {};\n const includeSet: Record<string, boolean> = {};\n for (let i = 0; i < include.length; i++) {\n includeSet[include[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && includeSet[key]) {\n allowed[key] = result[key];\n }\n }\n result = allowed;\n }\n\n // --- exclude: 黑名单 ---\n if (Array.isArray(exclude) && exclude.length > 0) {\n const final: Record<string, any> = {};\n const excludeSet: Record<string, boolean> = {};\n for (let i = 0; i < exclude.length; i++) {\n excludeSet[exclude[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && !excludeSet[key]) {\n final[key] = result[key];\n }\n }\n result = final;\n }\n\n return result;\n}\n"]}
|
package/dist/main.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/locales.ts","../src/utils.ts","../src/index-rc.tsx","../src/main.tsx"],"sourcesContent":["// import noop from '@jswork/noop';\nimport cx from 'classnames';\nimport React, { Component } from 'react';\nimport { ButtonProps, CardProps, FormInstance } from 'antd';\nimport { Button, Card, message, Space, Spin } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, DiffOutlined, SaveOutlined } from '@ant-design/icons';\nimport deepEqual from 'fast-deep-equal';\nimport {\n InitGuardArgs,\n MsgType,\n MutateArgs,\n StageData,\n StagePayload,\n SubmitGuardArgs,\n} from './types';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\nimport '@jswork/next-compact-object';\nimport { filterPayload } from './utils';\n\ndeclare global {\n interface NxStatic {\n $api: Record<string, any>;\n $event: any;\n }\n}\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nexport type ReactAntResourceFormProps = {\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n params?: Record<string, any>;\n blocker?: boolean;\n mute?: boolean;\n disableHotkeySave?: boolean;\n initGuard?: (args: InitGuardArgs) => Promise<void>;\n submitGuard?: (args: SubmitGuardArgs) => Promise<void>;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n classNames?: CardProps['classNames'];\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n onInit?: (ctx: ReactAntResourceForm) => void;\n onMutate?: (args: MutateArgs) => void;\n payloadFields?: { include?: string[]; exclude?: string[] }\n} & ReactAntdFormSchemaProps;\n\nexport type IState = {\n loading: boolean;\n touched: boolean;\n};\n\n/**\n * 当前 card loading 不要直接使用,因为这个 loading 会导致 Card 里的 formRef 被设置成 null\n * 这个情况仅在 class component 里才会出现,function component 里不会:\n * 报错示例:\n *\n * this.formRef?: null\n * index.tsx:229 this.formRef?: {getFieldValue: ƒ, getFieldsValue: ƒ, getFieldError: ƒ, getFieldWarning: ƒ, getFieldsError: ƒ, …}\n * index.tsx:229 this.formRef?: null\n *\n * initGuard | submitGuard:\n * https://chat.qwen.ai/c/60329863-0e5e-47f9-a075-a65ad30940cc\n *\n * onMutate:\n * 在 create/update 成功后,需要刷新列表,可以用 onMutate 继续后续处理。\n *\n * blocker:\n * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。\n * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor\n *\n * transformRequest:\n * 当你提交表单的时候,需要对参数进行一些预处理,比如加密,或者添加一些默认值,这个时候就可以用 transformRequest。\n */\n\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n blocker: false,\n mute: false,\n initGuard: () => Promise.resolve(),\n submitGuard: () => Promise.resolve(),\n payloadFields: { include: [], exclude: [] },\n };\n\n private formRef = React.createRef<FormInstance>(); // 注意类型\n private _isMounted = false;\n private _initialValues = null;\n\n get isEdit() {\n const { params } = this.props;\n return Boolean(params?.id);\n }\n\n get canSave() {\n const { touched, loading } = this.state;\n if (!this.isEdit) return !loading;\n return touched && !loading;\n }\n\n get titleView() {\n const { title } = this.props;\n const _title = title || (this.isEdit ? this.t('update_title') : this.t('create_title'));\n return (\n <Space>\n {_title}\n <span>{this.touchedView}</span>\n </Space>\n );\n }\n\n get touchedView() {\n if (!this.isEdit) return null;\n return this.state.touched ? (\n <em style={{ color: '#f60' }}>\n <DiffOutlined />\n </em>\n ) : null;\n }\n\n get extraView() {\n const { extra, backText, backProps } = this.props;\n if (extra) return extra;\n return (\n <Button size=\"small\" icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n );\n }\n\n get childrenView() {\n const { okText, backText, okProps, backProps, children } = this.props;\n const _okText = okText || (this.isEdit ? this.t('update') : this.t('create'));\n if (children) return children;\n\n return (\n <Space>\n <Button\n disabled={!this.canSave}\n htmlType=\"submit\"\n type=\"primary\"\n icon={<SaveOutlined />}\n {...okProps}>\n {_okText || this.t('submit')}\n </Button>\n <Button icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n </Space>\n );\n }\n\n get formInstance() {\n return this.formRef?.current;\n }\n\n constructor(props: ReactAntResourceFormProps) {\n super(props);\n this.state = {\n loading: props.loading!,\n touched: false,\n };\n\n this.handleStateRequest = this.handleStateRequest.bind(this);\n this.handleStateResponse = this.handleStateResponse.bind(this);\n this.initDetailIfNeeded = this.initDetailIfNeeded.bind(this);\n\n props.onInit?.(this);\n }\n\n private t(key: string) {\n const { lang } = this.props;\n return API_FORM_LOCALES[lang!][key];\n }\n\n private msg(msg: string, type: MsgType = 'success') {\n const { mute } = this.props;\n if (!mute) message[type](msg);\n }\n\n private handleBack = () => {\n history.back();\n };\n\n private setInitialValues = () => {\n this._initialValues = this.formInstance?.getFieldsValue();\n };\n\n handleStateRequest(stagePayload: StagePayload) {\n const { payloadFields, transformRequest } = this.props;\n this.setState({ loading: true });\n const rawPayload = transformRequest?.(stagePayload) || stagePayload.payload;\n return filterPayload(rawPayload, payloadFields);\n }\n\n handleStateResponse(res: StageData) {\n const { name } = this.props;\n this.setState({ loading: false });\n nx.$event?.emit?.(`${name}:refetch`);\n return this.props.transformResponse?.(res) || res.data;\n }\n\n handleFinish = (values: any) => {\n if (!this.canSave) {\n this.msg(this.t('no_change'), 'info');\n return;\n }\n this.isEdit ? this.onResourceUpdate(values) : this.onResourceCreate(values);\n };\n\n private onResourceUpdate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { id: params!.id, ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'update', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n params,\n };\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_update`](_payload)\n .then((res: any) => {\n this.msg(this.t('update_success'));\n this.handleStateResponse({ stage: 'update', data: res });\n onMutate?.(mutateArgs);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.handleValuesChange(null, this._initialValues);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'create', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n params,\n };\n\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_create`](_payload)\n .then((res: any) => {\n this.msg(this.t('create_success'));\n this.handleStateResponse({ stage: 'create', data: res });\n this.formInstance?.resetFields();\n onMutate?.(mutateArgs);\n history.back();\n })\n .finally(() => this.setState({ loading: false }));\n });\n };\n\n // hotkey save handler (replaces useKeyboardSave hook)\n handleKeydown = (e: KeyboardEvent) => {\n const { disableHotkeySave } = this.props;\n const isSave = (e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S');\n if (isSave) {\n e.preventDefault();\n if (!disableHotkeySave) {\n this.formInstance?.submit();\n }\n }\n };\n\n handleValuesChange = (_: any, allValues: any) => {\n if (this._isMounted && this._initialValues !== null) {\n this.setState({\n touched: !deepEqual(this._initialValues, allValues),\n });\n }\n };\n\n componentDidMount() {\n this._isMounted = true;\n // attach hotkey listener\n window.addEventListener('keydown', this.handleKeydown);\n // initialize detail if editing\n this.initDetailIfNeeded();\n }\n\n componentDidUpdate(prevProps: ReactAntResourceFormProps) {\n const prevId = prevProps.params?.id;\n const curId = this.props.params?.id;\n // re-init when id changed or from create -> edit\n if (prevId !== curId) {\n this.initDetailIfNeeded();\n }\n\n // loading update\n if (prevProps.loading !== this.props.loading) {\n this.setState({ loading: this.props.loading! });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeydown);\n this._isMounted = false;\n }\n\n initDetailIfNeeded() {\n const { params, name, initGuard } = this.props;\n const resourceShow = `${name}_show`;\n\n if (this.isEdit) {\n const payload = { id: params!.id };\n const _payload = this.handleStateRequest({ stage: 'show', payload });\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n nx.$api[resourceShow](_payload)\n .then((res: any) => {\n if (!this._isMounted) return; // 👈 关键:防止操作已卸载组件\n const data = this.handleStateResponse({ stage: 'show', data: res });\n this.formInstance?.setFieldsValue?.(data);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n });\n });\n } else {\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: null,\n isEdit: false,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n this.setInitialValues();\n this.setState({ loading: false });\n });\n }\n }\n\n render() {\n const {\n className,\n name,\n meta,\n children,\n lang,\n title,\n extra,\n size,\n okText,\n backText,\n okProps,\n backProps,\n classNames,\n params,\n transformRequest,\n transformResponse,\n disableHotkeySave,\n blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\n payloadFields,\n ...rest\n } = this.props;\n\n return (\n <Card\n title={this.titleView}\n extra={this.extraView}\n size={size}\n classNames={classNames}\n data-component={CLASS_NAME}\n data-blocker={blocker}\n className={cx(CLASS_NAME, className)}>\n <Spin spinning={this.state.loading}>\n <ReactAntdFormSchema\n meta={meta}\n ref={this.formRef}\n onValuesChange={this.handleValuesChange}\n onFinish={this.handleFinish}\n {...rest}>\n {this.childrenView}\n </ReactAntdFormSchema>\n </Spin>\n </Card>\n );\n }\n}\n\n\nexport default ReactAntResourceForm;\n","export const API_FORM_LOCALES = {\n 'zh-CN': {\n create: '创建',\n update: '保存',\n create_title: '创建',\n update_title: '更新',\n create_success: '创建成功',\n update_success: '更新成功',\n submit: '提交',\n back: '返回',\n no_change: '没有修改',\n },\n 'en-US': {\n create: 'Create',\n update: 'Save',\n create_title: 'Create',\n update_title: 'Update',\n create_success: 'Create success',\n update_success: 'Update success',\n submit: 'Submit',\n back: 'Back',\n no_change: 'No change',\n },\n};\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 16:46:34\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-10-31 16:46:47\n */\n\nexport interface PayloadFieldConfig {\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * 根据 include/exclude 规则过滤 payload 对象\n * @param payload 原始对象(会被浅拷贝,不修改原对象)\n * @param config 字段过滤配置\n * @returns 过滤后的新对象\n */\nexport function filterPayload(\n payload: Record<string, any> | null | undefined,\n config: PayloadFieldConfig = {},\n): Record<string, any> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return {};\n }\n\n const { include, exclude } = config;\n let result = { ...payload }; // 浅拷贝(ES5 兼容写法见下方备注)\n\n // --- include: 白名单 ---\n if (Array.isArray(include) && include.length > 0) {\n const allowed: Record<string, any> = {};\n const includeSet: Record<string, boolean> = {};\n for (let i = 0; i < include.length; i++) {\n includeSet[include[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && includeSet[key]) {\n allowed[key] = result[key];\n }\n }\n result = allowed;\n }\n\n // --- exclude: 黑名单 ---\n if (Array.isArray(exclude) && exclude.length > 0) {\n const final: Record<string, any> = {};\n const excludeSet: Record<string, boolean> = {};\n for (let i = 0; i < exclude.length; i++) {\n excludeSet[exclude[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && !excludeSet[key]) {\n final[key] = result[key];\n }\n }\n result = final;\n }\n\n return result;\n}\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 13:20:41\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-10-31 13:24:38\n */\nimport React, { FC } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport fromEntries from 'fromentries';\nimport nx from '@jswork/next';\nimport ReactAntResourceForm, { ReactAntResourceFormProps } from '.';\n\nconst retainKeys = (obj: Record<string, any>, keys: string[]) => {\n nx.forIn(obj, (key) => {\n if (!keys.includes(key)) {\n delete obj[key];\n }\n });\n return obj;\n};\n\n\nexport type ReactAntResourceFormFcProps = ReactAntResourceFormProps & {\n allowFields?: string[];\n}\n\nconst ReactAntResourceFormFc: FC<ReactAntResourceFormFcProps> = (props) => {\n const { params: overrideParams, allowFields, ...rest } = props;\n const params = useParams();\n const [searchParams] = useSearchParams();\n const _searchParams = fromEntries(searchParams as any);\n const _params = nx.compactObject({ ..._searchParams, ...params, ...overrideParams });\n if (allowFields?.length && allowFields.length > 0) retainKeys(_params, allowFields);\n return <ReactAntResourceForm params={_params} {...rest} />;\n};\n\nexport default ReactAntResourceFormFc;\n","import ReactAntResourceForm from '.';\nimport ReactAntResourceFormFc from './index-rc';\nimport type { ReactAntResourceFormProps } from '.';\nimport type { ReactAntResourceFormFcProps } from './index-rc';\n\nexport default ReactAntResourceForm;\nexport { ReactAntResourceFormFc };\nexport type { ReactAntResourceFormFcProps, ReactAntResourceFormProps };\n"],"mappings":"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","names":["cx","React","Component","Button","Card","message","Space","Spin","ReactAntdFormSchema","ArrowLeftOutlined","DiffOutlined","SaveOutlined","deepEqual","API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","submit","back","no_change","nx","filterPayload","payload","config","Array","isArray","include","exclude","result","__spreadValues","length","allowed","includeSet","i","key","hasOwnProperty","final","excludeSet","CLASS_NAME","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","_initialValues","handleBack","__name","history","back","setInitialValues","formInstance","getFieldsValue","handleFinish","values","canSave","msg","t","isEdit","onResourceUpdate","onResourceCreate","params","name","submitGuard","onMutate","payload","__spreadValues","id","_payload","handleStateRequest","stage","submitGuardArgs","mutateArgs","then","nx","$api","res","handleStateResponse","data","finally","setState","loading","handleValuesChange","resetFields","handleKeydown","e","disableHotkeySave","ctrlKey","metaKey","key","preventDefault","submit","_","allValues","touched","deepEqual","state","bind","initDetailIfNeeded","onInit","Boolean","titleView","title","_title","Space","span","touchedView","em","style","color","DiffOutlined","extraView","extra","backText","backProps","Button","size","icon","ArrowLeftOutlined","onClick","childrenView","okText","okProps","children","_okText","disabled","htmlType","type","SaveOutlined","current","lang","API_FORM_LOCALES","mute","message","stagePayload","payloadFields","transformRequest","rawPayload","filterPayload","_b","_c","_d","$event","emit","transformResponse","componentDidMount","window","addEventListener","componentDidUpdate","prevProps","prevId","curId","componentWillUnmount","removeEventListener","initGuard","resourceShow","initGuardArgs","setFieldsValue","render","className","meta","classNames","blocker","rest","Card","data-component","data-blocker","cx","Spin","spinning","ReactAntdFormSchema","ref","onValuesChange","onFinish","__publicField","defaultProps","Promise","resolve","include","exclude","index_default","React","useParams","useSearchParams","fromEntries","nx","retainKeys","__name","obj","keys","nx","forIn","key","includes","ReactAntResourceFormFc","props","params","overrideParams","allowFields","rest","useParams","searchParams","useSearchParams","_searchParams","fromEntries","_params","compactObject","__spreadValues","length","React","ReactAntResourceForm","index_rc_default","main_default","ReactAntResourceForm"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/locales.ts","../src/utils.ts","../src/index-rc.tsx","../src/main.tsx"],"sourcesContent":["// import noop from '@jswork/noop';\nimport cx from 'classnames';\nimport React, { Component } from 'react';\nimport { ButtonProps, CardProps, FormInstance } from 'antd';\nimport { Button, Card, message, Space, Spin } from 'antd';\nimport ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';\nimport { ArrowLeftOutlined, DiffOutlined, SaveOutlined } from '@ant-design/icons';\nimport deepEqual from 'fast-deep-equal';\nimport {\n InitGuardArgs,\n MsgType,\n MutateArgs,\n StageData,\n StagePayload,\n SubmitGuardArgs,\n} from './types';\nimport { API_FORM_LOCALES } from './locales';\nimport nx from '@jswork/next';\nimport '@jswork/next-compact-object';\nimport { filterPayload } from './utils';\n\ndeclare global {\n interface NxStatic {\n $api: Record<string, any>;\n $event: any;\n }\n}\n\nconst CLASS_NAME = 'react-ant-resource-form';\n\nexport type ReactAntResourceFormProps = {\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n params?: Record<string, any>;\n blocker?: boolean;\n mute?: boolean;\n disableHotkeySave?: boolean;\n initGuard?: (args: InitGuardArgs) => Promise<void>;\n submitGuard?: (args: SubmitGuardArgs) => Promise<void>;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n classNames?: CardProps['classNames'];\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n onInit?: (ctx: ReactAntResourceForm) => void;\n onMutate?: (args: MutateArgs) => void;\n payloadFields?: { include?: string[]; exclude?: string[] }\n} & ReactAntdFormSchemaProps;\n\nexport type IState = {\n loading: boolean;\n touched: boolean;\n};\n\n/**\n * 当前 card loading 不要直接使用,因为这个 loading 会导致 Card 里的 formRef 被设置成 null\n * 这个情况仅在 class component 里才会出现,function component 里不会:\n * 报错示例:\n *\n * this.formRef?: null\n * index.tsx:229 this.formRef?: {getFieldValue: ƒ, getFieldsValue: ƒ, getFieldError: ƒ, getFieldWarning: ƒ, getFieldsError: ƒ, …}\n * index.tsx:229 this.formRef?: null\n *\n * initGuard | submitGuard:\n * https://chat.qwen.ai/c/60329863-0e5e-47f9-a075-a65ad30940cc\n *\n * onMutate:\n * 在 create/update 成功后,需要刷新列表,可以用 onMutate 继续后续处理。\n *\n * blocker:\n * 这个解决的问题是,目前 nice-form 里默认是 grid layout,导致部分情况下,卡片内部的 style 表现很不正常。\n * 特别是有非 antd 组件的情况下,比如我自己的 react-ckeditor\n *\n * transformRequest:\n * 当你提交表单的时候,需要对参数进行一些预处理,比如加密,或者添加一些默认值,这个时候就可以用 transformRequest。\n */\n\nclass ReactAntResourceForm extends Component<ReactAntResourceFormProps, IState> {\n public static defaultProps = {\n lang: 'zh-CN',\n disableHotkeySave: false,\n blocker: false,\n mute: false,\n initGuard: () => Promise.resolve(),\n submitGuard: () => Promise.resolve(),\n payloadFields: { include: [], exclude: [] },\n };\n\n private formRef = React.createRef<FormInstance>(); // 注意类型\n private _isMounted = false;\n private _initialValues = null;\n\n get isEdit() {\n const { params } = this.props;\n return Boolean(params?.id);\n }\n\n get canSave() {\n const { touched, loading } = this.state;\n if (!this.isEdit) return !loading;\n return touched && !loading;\n }\n\n get titleView() {\n const { title } = this.props;\n const _title = title || (this.isEdit ? this.t('update_title') : this.t('create_title'));\n return (\n <Space>\n {_title}\n <span>{this.touchedView}</span>\n </Space>\n );\n }\n\n get touchedView() {\n if (!this.isEdit) return null;\n return this.state.touched ? (\n <em style={{ color: '#f60' }}>\n <DiffOutlined />\n </em>\n ) : null;\n }\n\n get extraView() {\n const { extra, backText, backProps } = this.props;\n if (extra) return extra;\n return (\n <Button size=\"small\" icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n );\n }\n\n get childrenView() {\n const { okText, backText, okProps, backProps, children } = this.props;\n const _okText = okText || (this.isEdit ? this.t('update') : this.t('create'));\n if (children) return children;\n\n return (\n <Space>\n <Button\n disabled={!this.canSave}\n htmlType=\"submit\"\n type=\"primary\"\n icon={<SaveOutlined />}\n {...okProps}>\n {_okText || this.t('submit')}\n </Button>\n <Button icon={<ArrowLeftOutlined />} onClick={this.handleBack} {...backProps}>\n {backText || this.t('back')}\n </Button>\n </Space>\n );\n }\n\n get formInstance() {\n return this.formRef?.current;\n }\n\n constructor(props: ReactAntResourceFormProps) {\n super(props);\n this.state = {\n loading: props.loading!,\n touched: false,\n };\n\n this.handleStateRequest = this.handleStateRequest.bind(this);\n this.handleStateResponse = this.handleStateResponse.bind(this);\n this.initDetailIfNeeded = this.initDetailIfNeeded.bind(this);\n\n props.onInit?.(this);\n }\n\n private t(key: string) {\n const { lang } = this.props;\n return API_FORM_LOCALES[lang!][key];\n }\n\n private msg(msg: string, type: MsgType = 'success') {\n const { mute } = this.props;\n if (!mute) message[type](msg);\n }\n\n private handleBack = () => {\n history.back();\n };\n\n private setInitialValues = () => {\n this._initialValues = this.formInstance?.getFieldsValue();\n };\n\n handleStateRequest(stagePayload: StagePayload) {\n const { payloadFields, transformRequest } = this.props;\n this.setState({ loading: true });\n const rawPayload = transformRequest?.(stagePayload) || stagePayload.payload;\n return filterPayload(rawPayload, payloadFields);\n }\n\n handleStateResponse(res: StageData) {\n const { name } = this.props;\n this.setState({ loading: false });\n nx.$event?.emit?.(`${name}:refetch`);\n return this.props.transformResponse?.(res) || res.data;\n }\n\n handleFinish = (values: any) => {\n if (!this.canSave) {\n this.msg(this.t('no_change'), 'info');\n return;\n }\n this.isEdit ? this.onResourceUpdate(values) : this.onResourceCreate(values);\n };\n\n private onResourceUpdate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { id: params!.id, ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'update', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n params,\n };\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: true,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_update`](_payload)\n .then((res: any) => {\n this.msg(this.t('update_success'));\n this.handleStateResponse({ stage: 'update', data: res });\n onMutate?.(mutateArgs);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n this.handleValuesChange(null, this._initialValues);\n });\n });\n };\n\n private onResourceCreate = (values: any) => {\n const { params, name, submitGuard, onMutate } = this.props;\n const payload = { ...values, ...params };\n const _payload = this.handleStateRequest({ stage: 'create', payload });\n const submitGuardArgs: SubmitGuardArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n params,\n };\n\n const mutateArgs: MutateArgs = {\n name,\n payload: _payload,\n isEdit: false,\n values,\n };\n\n submitGuard?.(submitGuardArgs).then(() => {\n nx.$api[`${name}_create`](_payload)\n .then((res: any) => {\n this.msg(this.t('create_success'));\n this.handleStateResponse({ stage: 'create', data: res });\n this.formInstance?.resetFields();\n onMutate?.(mutateArgs);\n history.back();\n })\n .finally(() => this.setState({ loading: false }));\n });\n };\n\n // hotkey save handler (replaces useKeyboardSave hook)\n handleKeydown = (e: KeyboardEvent) => {\n const { disableHotkeySave } = this.props;\n const isSave = (e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S');\n if (isSave) {\n e.preventDefault();\n if (!disableHotkeySave) {\n this.formInstance?.submit();\n }\n }\n };\n\n handleValuesChange = (_: any, allValues: any) => {\n if (this._isMounted && this._initialValues !== null) {\n this.setState({\n touched: !deepEqual(this._initialValues, allValues),\n });\n }\n };\n\n componentDidMount() {\n this._isMounted = true;\n // attach hotkey listener\n window.addEventListener('keydown', this.handleKeydown);\n // initialize detail if editing\n this.initDetailIfNeeded();\n }\n\n componentDidUpdate(prevProps: ReactAntResourceFormProps) {\n const prevId = prevProps.params?.id;\n const curId = this.props.params?.id;\n // re-init when id changed or from create -> edit\n if (prevId !== curId) {\n this.initDetailIfNeeded();\n }\n\n // loading update\n if (prevProps.loading !== this.props.loading) {\n this.setState({ loading: this.props.loading! });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeydown);\n this._isMounted = false;\n }\n\n initDetailIfNeeded() {\n const { params, name, initGuard } = this.props;\n const resourceShow = `${name}_show`;\n\n if (this.isEdit) {\n const payload = { id: params!.id };\n const _payload = this.handleStateRequest({ stage: 'show', payload });\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: _payload,\n isEdit: true,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n nx.$api[resourceShow](_payload)\n .then((res: any) => {\n if (!this._isMounted) return; // 👈 关键:防止操作已卸载组件\n const data = this.handleStateResponse({ stage: 'show', data: res });\n this.formInstance?.setFieldsValue?.(data);\n })\n .finally(() => {\n this.setState({ loading: false });\n this.setInitialValues();\n });\n });\n } else {\n const initGuardArgs: InitGuardArgs = {\n name,\n payload: null,\n isEdit: false,\n params,\n };\n initGuard?.(initGuardArgs).then(() => {\n this.setInitialValues();\n this.setState({ loading: false });\n });\n }\n }\n\n render() {\n const {\n className,\n name,\n meta,\n children,\n lang,\n title,\n extra,\n size,\n okText,\n backText,\n okProps,\n backProps,\n classNames,\n params,\n transformRequest,\n transformResponse,\n disableHotkeySave,\n blocker,\n mute,\n onInit,\n onMutate,\n initGuard,\n submitGuard,\n loading,\n payloadFields,\n ...rest\n } = this.props;\n\n return (\n <Card\n title={this.titleView}\n extra={this.extraView}\n size={size}\n classNames={classNames}\n data-component={CLASS_NAME}\n data-blocker={blocker}\n className={cx(CLASS_NAME, className)}>\n <Spin spinning={this.state.loading}>\n <ReactAntdFormSchema\n meta={meta}\n ref={this.formRef}\n onValuesChange={this.handleValuesChange}\n onFinish={this.handleFinish}\n {...rest}>\n {this.childrenView}\n </ReactAntdFormSchema>\n </Spin>\n </Card>\n );\n }\n}\n\n\nexport default ReactAntResourceForm;\n","export const API_FORM_LOCALES = {\n 'zh-CN': {\n create: '创建',\n update: '保存',\n create_title: '创建',\n update_title: '更新',\n create_success: '创建成功',\n update_success: '更新成功',\n submit: '提交',\n back: '返回',\n no_change: '没有修改',\n },\n 'en-US': {\n create: 'Create',\n update: 'Save',\n create_title: 'Create',\n update_title: 'Update',\n create_success: 'Create success',\n update_success: 'Update success',\n submit: 'Submit',\n back: 'Back',\n no_change: 'No change',\n },\n};\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 16:46:34\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-10-31 16:51:16\n *\n * AI(filterPayload): https://chat.qwen.ai/c/5213efdf-e88d-4367-9bd1-bd4d23af6223\n */\n\nexport interface PayloadFieldConfig {\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * 根据 include/exclude 规则过滤 payload 对象\n * @param payload 原始对象(会被浅拷贝,不修改原对象)\n * @param config 字段过滤配置\n * @returns 过滤后的新对象\n */\nexport function filterPayload(\n payload: Record<string, any> | null | undefined,\n config: PayloadFieldConfig = {},\n): Record<string, any> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return {};\n }\n\n const { include, exclude } = config;\n let result = { ...payload }; // 浅拷贝(ES5 兼容写法见下方备注)\n\n // --- include: 白名单 ---\n if (Array.isArray(include) && include.length > 0) {\n const allowed: Record<string, any> = {};\n const includeSet: Record<string, boolean> = {};\n for (let i = 0; i < include.length; i++) {\n includeSet[include[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && includeSet[key]) {\n allowed[key] = result[key];\n }\n }\n result = allowed;\n }\n\n // --- exclude: 黑名单 ---\n if (Array.isArray(exclude) && exclude.length > 0) {\n const final: Record<string, any> = {};\n const excludeSet: Record<string, boolean> = {};\n for (let i = 0; i < exclude.length; i++) {\n excludeSet[exclude[i]] = true;\n }\n for (const key in result) {\n if (result.hasOwnProperty(key) && !excludeSet[key]) {\n final[key] = result[key];\n }\n }\n result = final;\n }\n\n return result;\n}\n","/**\n * @Author: aric 1290657123@qq.com\n * @Date: 2025-10-31 13:20:41\n * @LastEditors: aric 1290657123@qq.com\n * @LastEditTime: 2025-10-31 13:24:38\n */\nimport React, { FC } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport fromEntries from 'fromentries';\nimport nx from '@jswork/next';\nimport ReactAntResourceForm, { ReactAntResourceFormProps } from '.';\n\nconst retainKeys = (obj: Record<string, any>, keys: string[]) => {\n nx.forIn(obj, (key) => {\n if (!keys.includes(key)) {\n delete obj[key];\n }\n });\n return obj;\n};\n\n\nexport type ReactAntResourceFormFcProps = ReactAntResourceFormProps & {\n allowFields?: string[];\n}\n\nconst ReactAntResourceFormFc: FC<ReactAntResourceFormFcProps> = (props) => {\n const { params: overrideParams, allowFields, ...rest } = props;\n const params = useParams();\n const [searchParams] = useSearchParams();\n const _searchParams = fromEntries(searchParams as any);\n const _params = nx.compactObject({ ..._searchParams, ...params, ...overrideParams });\n if (allowFields?.length && allowFields.length > 0) retainKeys(_params, allowFields);\n return <ReactAntResourceForm params={_params} {...rest} />;\n};\n\nexport default ReactAntResourceFormFc;\n","import ReactAntResourceForm from '.';\nimport ReactAntResourceFormFc from './index-rc';\nimport type { ReactAntResourceFormProps } from '.';\nimport type { ReactAntResourceFormFcProps } from './index-rc';\n\nexport default ReactAntResourceForm;\nexport { ReactAntResourceFormFc };\nexport type { ReactAntResourceFormFcProps, ReactAntResourceFormProps };\n"],"mappings":"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","names":["cx","React","Component","Button","Card","message","Space","Spin","ReactAntdFormSchema","ArrowLeftOutlined","DiffOutlined","SaveOutlined","deepEqual","API_FORM_LOCALES","create","update","create_title","update_title","create_success","update_success","submit","back","no_change","nx","filterPayload","payload","config","Array","isArray","include","exclude","result","__spreadValues","length","allowed","includeSet","i","key","hasOwnProperty","final","excludeSet","CLASS_NAME","_a","ReactAntResourceForm","Component","props","formRef","React","createRef","_isMounted","_initialValues","handleBack","__name","history","back","setInitialValues","formInstance","getFieldsValue","handleFinish","values","canSave","msg","t","isEdit","onResourceUpdate","onResourceCreate","params","name","submitGuard","onMutate","payload","__spreadValues","id","_payload","handleStateRequest","stage","submitGuardArgs","mutateArgs","then","nx","$api","res","handleStateResponse","data","finally","setState","loading","handleValuesChange","resetFields","handleKeydown","e","disableHotkeySave","ctrlKey","metaKey","key","preventDefault","submit","_","allValues","touched","deepEqual","state","bind","initDetailIfNeeded","onInit","Boolean","titleView","title","_title","Space","span","touchedView","em","style","color","DiffOutlined","extraView","extra","backText","backProps","Button","size","icon","ArrowLeftOutlined","onClick","childrenView","okText","okProps","children","_okText","disabled","htmlType","type","SaveOutlined","current","lang","API_FORM_LOCALES","mute","message","stagePayload","payloadFields","transformRequest","rawPayload","filterPayload","_b","_c","_d","$event","emit","transformResponse","componentDidMount","window","addEventListener","componentDidUpdate","prevProps","prevId","curId","componentWillUnmount","removeEventListener","initGuard","resourceShow","initGuardArgs","setFieldsValue","render","className","meta","classNames","blocker","rest","Card","data-component","data-blocker","cx","Spin","spinning","ReactAntdFormSchema","ref","onValuesChange","onFinish","__publicField","defaultProps","Promise","resolve","include","exclude","index_default","React","useParams","useSearchParams","fromEntries","nx","retainKeys","__name","obj","keys","nx","forIn","key","includes","ReactAntResourceFormFc","props","params","overrideParams","allowFields","rest","useParams","searchParams","useSearchParams","_searchParams","fromEntries","_params","compactObject","__spreadValues","length","React","ReactAntResourceForm","index_rc_default","main_default","ReactAntResourceForm"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jswork/react-ant-resource-form",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.38",
|
|
4
4
|
"main": "dist/main.cjs.js",
|
|
5
5
|
"module": "dist/main.esm.js",
|
|
6
6
|
"types": "dist/main.d.ts",
|
|
@@ -17,13 +17,12 @@
|
|
|
17
17
|
"release": "release-it"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@jswork/next-compact-object": "^1.0.7",
|
|
21
|
-
"fast-deep-equal": "^3.1.3",
|
|
22
20
|
"fromentries": "^1.3.2"
|
|
23
21
|
},
|
|
24
22
|
"devDependencies": {
|
|
25
23
|
"@ant-design/icons": "^6.1.0",
|
|
26
24
|
"@jswork/next": "^1.4.2",
|
|
25
|
+
"@jswork/next-compact-object": "^1.0.7",
|
|
27
26
|
"@jswork/react-ant-form-schema": "^1.0.21",
|
|
28
27
|
"@swc/core": "^1.3.93",
|
|
29
28
|
"@types/react": "^18.2.28",
|
|
@@ -41,8 +40,10 @@
|
|
|
41
40
|
"peerDependencies": {
|
|
42
41
|
"@ant-design/icons": "*",
|
|
43
42
|
"@jswork/next": "*",
|
|
43
|
+
"@jswork/next-compact-object": "*",
|
|
44
44
|
"@jswork/react-ant-form-schema": "*",
|
|
45
45
|
"antd": "*",
|
|
46
|
+
"fast-deep-equal": "*",
|
|
46
47
|
"classnames": "*",
|
|
47
48
|
"react": "*",
|
|
48
49
|
"react-dom": "*",
|
package/src/utils.ts
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
* @Author: aric 1290657123@qq.com
|
|
3
3
|
* @Date: 2025-10-31 16:46:34
|
|
4
4
|
* @LastEditors: aric 1290657123@qq.com
|
|
5
|
-
* @LastEditTime: 2025-10-31 16:
|
|
5
|
+
* @LastEditTime: 2025-10-31 16:51:16
|
|
6
|
+
*
|
|
7
|
+
* AI(filterPayload): https://chat.qwen.ai/c/5213efdf-e88d-4367-9bd1-bd4d23af6223
|
|
6
8
|
*/
|
|
7
9
|
|
|
8
10
|
export interface PayloadFieldConfig {
|