@jswork/react-ant-resource-form 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.cjs.js +1 -1
- package/dist/main.cjs.js.map +1 -1
- package/dist/main.d.mts +4 -1
- package/dist/main.d.ts +4 -1
- package/dist/main.esm.js +1 -1
- package/dist/main.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/api.tsx +12 -21
- package/src/hooks.ts +18 -0
- package/src/index.tsx +4 -11
- package/src/locales.ts +29 -0
- package/src/main.tsx +2 -1
package/dist/main.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var B=Object.defineProperty;var b=Object.getOwnPropertySymbols;var K=Object.prototype.hasOwnProperty,M=Object.prototype.propertyIsEnumerable;var N=(a,t,e)=>t in a?B(a,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[t]=e,c=(a,t)=>{for(var e in t||(t={}))K.call(t,e)&&N(a,e,t[e]);if(b)for(var e of b(t))M.call(t,e)&&N(a,e,t[e]);return a};var s=(a,t)=>B(a,"name",{value:t,configurable:!0});var C=(a,t)=>{var e={};for(var o in a)K.call(a,o)&&t.indexOf(o)<0&&(e[o]=a[o]);if(a!=null&&b)for(var o of b(a))t.indexOf(o)<0&&M.call(a,o)&&(e[o]=a[o]);return 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 P={"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"},"en-US":{create:"Create",update:"Save",create_title:"Create",update_title:"Update",create_success:"Create success",update_success:"Update success"}},T={"zh-CN":{submit:"\u63D0\u4EA4",back:"\u8FD4\u56DE"},"en-US":{submit:"Submit",back:"Back"}};var U="react-ant-resource-form",Q={lang:"zh-CN"},W=s(a=>{let A=c(c({},Q),a),{className:t,meta:e,children:o,lang:p,title:f,loading:g,extra:x,size:F,okText:L,backText:k,okProps:_,backProps:l}=A,m=C(A,["className","meta","children","lang","title","loading","extra","size","okText","backText","okProps","backProps"]),h=s(v=>T[p][v],"t"),d=s(()=>history.back(),"handleBack"),S=x||_react2.default.createElement(_antd.Button,c({size:"small",icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:d},l),k||h("back")),y=o||_react2.default.createElement(_antd.Space,null,_react2.default.createElement(_antd.Button,c({htmlType:"submit",type:"primary",icon:_react2.default.createElement(_icons.SaveOutlined,null)},_),L||h("submit")),_react2.default.createElement(_antd.Button,c({icon:_react2.default.createElement(_icons.ArrowLeftOutlined,null),onClick:d},l),k||h("back")));return _react2.default.createElement(_antd.Card,{title:f,size:F,loading:g,"data-component":U,className:_classnames2.default.call(void 0, U,t),extra:S},_react2.default.createElement(_reactantformschema2.default,c({meta:e},m),y))},"ReactAntResourceForm"),$= exports.ReactAntResourceForm =W;var _next = require('@jswork/next'); var _next2 = _interopRequireDefault(_next);var w=s(a=>{let t=s(function(e){(e.ctrlKey||e.metaKey)&&e.key==="s"&&(e.preventDefault(),a(e))},"handler");_react.useEffect.call(void 0, ()=>(document.addEventListener("keydown",t),()=>{document.removeEventListener("keydown",t)}),[])},"useKeyboardSave");var ae={lang:"zh-CN",disableHotkeySave:!1},oe=s(a=>{let z=c(c({},ae),a),{name:t,params:e,lang:o,transformRequest:p,transformResponse:f,disableHotkeySave:g}=z,x=C(z,["name","params","lang","transformRequest","transformResponse","disableHotkeySave"]),F=`${t}_update`,L=`${t}_create`,k=`${t}_show`,[_]=_antd.Form.useForm(),l=!!(e!=null&&e.id),m=s(r=>P[o][r],"t"),[h,d]=_react.useState.call(void 0, !1),S=s(r=>(d(!0),(p==null?void 0:p(r))||r.payload),"handleStateRequest"),y=s(r=>{var n,u;return d(!1),(u=(n=_next2.default.$event)==null?void 0:n.emit)==null||u.call(n,`${t}:refetch`),(f==null?void 0:f(r))||r.data},"handleStateResponse"),A=s(r=>{if(l){let n=c({id:e.id},r),u=S({stage:"update",payload:n});_next2.default.$api[F](u).then(E=>{_antd.message.success(m("update_success")),y({stage:"update",data:E})}).finally(()=>d(!1))}else{let n=c({},r),u=S({stage:"create",payload:n});_next2.default.$api[L](u).then(E=>{_antd.message.success(m("create_success")),y({stage:"create",data:E})}).finally(()=>d(!1))}},"handleFinish");w(()=>{g||_.submit()}),_react.useEffect.call(void 0, ()=>{if(l){let r={id:e.id},n=S({stage:"show",payload:r});_next2.default.$api[k](n).then(u=>{let E=y({stage:"show",data:u});_.setFieldsValue(E)}).finally(()=>d(!1))}},[l,e==null?void 0:e.id]);let v=m(l?"update":"create"),D=m(l?"update_title":"create_title");return _react2.default.createElement($,c({loading:h,form:_,onFinish:A,okText:v,title:D},x))},"ReactAntResourceFormApi"),ce= exports.ReactAntResourceFormApi =oe;exports.ReactAntResourceForm = $; exports.ReactAntResourceFormApi = ce; exports.useKeyboardSave = w;
|
|
2
2
|
//# 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/api.tsx"],"names":["CLASS_NAME","locales","submit","back","defaultProps","lang","ReactAntResourceForm","__name","props","_a","__spreadValues","className","meta","children","title","loading","extra","size","okText","backText","okProps","backProps","rest","t","key","handleBack","history","_extra","React","Button","icon","ArrowLeftOutlined","onClick","_children","Space","htmlType","type","SaveOutlined","Card","data-component","cx","ReactAntdFormSchema","index_default","create","update","create_title","update_title","create_success","update_success","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';\n\nexport type ReactAntResourceFormProps = {\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n} & ReactAntdFormSchemaProps;\n\nconst CLASS_NAME = 'react-ant-resource-form';\nconst locales = {\n 'zh-CN': {\n submit: '提交',\n back: '返回',\n },\n 'en-US': {\n submit: 'Submit',\n back: 'Back',\n },\n};\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 ...rest\n } = {\n ...defaultProps,\n ...props,\n };\n const t = (key: string) => 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 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 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","import React, { FC, useEffect, useState } from 'react';\nimport ReactAntResourceForm, { ReactAntResourceFormProps } from '.';\nimport { Form, message } from 'antd';\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 ReactAntResourceFormApiProps = ReactAntResourceFormProps & {\n lang?: string;\n params?: Record<string, any>;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n};\n\nconst 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\nconst defaultProps = {\n lang: 'zh-CN',\n};\n\nconst ReactAntResourceFormApi: FC<ReactAntResourceFormApiProps> = (props) => {\n const { name, params, lang, transformRequest, transformResponse, ...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) => 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 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 // 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"]}
|
|
1
|
+
{"version":3,"sources":["/Users/aric/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","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","e","ctrlKey","metaKey","preventDefault","useEffect","document","addEventListener","removeEventListener","disableHotkeySave","ReactAntResourceFormApi","name","params","transformRequest","transformResponse","resourceEdit"],"mappings":"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","file":"/Users/aric/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 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 ...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 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 } from 'react';\n\nexport const useKeyboardSave = (callback: (e: KeyboardEvent) => void) => {\n const handler = function (e: KeyboardEvent) {\n // 检查是否按下了 Ctrl+S (Windows/Linux) 或 Cmd+S (macOS)\n if ((e.ctrlKey || e.metaKey) && e.key === 's') {\n e.preventDefault();\n callback(e);\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', handler);\n return () => {\n document.removeEventListener('keydown', handler);\n };\n }, []);\n};\n"]}
|
package/dist/main.d.mts
CHANGED
|
@@ -32,9 +32,12 @@ type StageData = {
|
|
|
32
32
|
type ReactAntResourceFormApiProps = ReactAntResourceFormProps & {
|
|
33
33
|
lang?: string;
|
|
34
34
|
params?: Record<string, any>;
|
|
35
|
+
disableHotkeySave?: boolean;
|
|
35
36
|
transformRequest?: (payload: StagePayload) => any;
|
|
36
37
|
transformResponse?: (res: StageData) => any;
|
|
37
38
|
};
|
|
38
39
|
declare const ReactAntResourceFormApi: FC<ReactAntResourceFormApiProps>;
|
|
39
40
|
|
|
40
|
-
|
|
41
|
+
declare const useKeyboardSave: (callback: (e: KeyboardEvent) => void) => void;
|
|
42
|
+
|
|
43
|
+
export { ReactAntResourceForm, ReactAntResourceFormApi, type ReactAntResourceFormApiProps, type ReactAntResourceFormProps, useKeyboardSave };
|
package/dist/main.d.ts
CHANGED
|
@@ -32,9 +32,12 @@ type StageData = {
|
|
|
32
32
|
type ReactAntResourceFormApiProps = ReactAntResourceFormProps & {
|
|
33
33
|
lang?: string;
|
|
34
34
|
params?: Record<string, any>;
|
|
35
|
+
disableHotkeySave?: boolean;
|
|
35
36
|
transformRequest?: (payload: StagePayload) => any;
|
|
36
37
|
transformResponse?: (res: StageData) => any;
|
|
37
38
|
};
|
|
38
39
|
declare const ReactAntResourceFormApi: FC<ReactAntResourceFormApiProps>;
|
|
39
40
|
|
|
40
|
-
|
|
41
|
+
declare const useKeyboardSave: (callback: (e: KeyboardEvent) => void) => void;
|
|
42
|
+
|
|
43
|
+
export { ReactAntResourceForm, ReactAntResourceFormApi, type ReactAntResourceFormApiProps, type ReactAntResourceFormProps, useKeyboardSave };
|
package/dist/main.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var B=Object.defineProperty;var b=Object.getOwnPropertySymbols;var K=Object.prototype.hasOwnProperty,M=Object.prototype.propertyIsEnumerable;var N=(a,t,e)=>t in a?B(a,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[t]=e,c=(a,t)=>{for(var e in t||(t={}))K.call(t,e)&&N(a,e,t[e]);if(b)for(var e of b(t))M.call(t,e)&&N(a,e,t[e]);return a};var s=(a,t)=>B(a,"name",{value:t,configurable:!0});var C=(a,t)=>{var e={};for(var o in a)K.call(a,o)&&t.indexOf(o)<0&&(e[o]=a[o]);if(a!=null&&b)for(var o of b(a))t.indexOf(o)<0&&M.call(a,o)&&(e[o]=a[o]);return e};import V from"classnames";import i from"react";import{Button as O,Card as j,Space as q}from"antd";import G from"@jswork/react-ant-form-schema";import{ArrowLeftOutlined as I,SaveOutlined as J}from"@ant-design/icons";var P={"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"},"en-US":{create:"Create",update:"Save",create_title:"Create",update_title:"Update",create_success:"Create success",update_success:"Update success"}},T={"zh-CN":{submit:"\u63D0\u4EA4",back:"\u8FD4\u56DE"},"en-US":{submit:"Submit",back:"Back"}};var U="react-ant-resource-form",Q={lang:"zh-CN"},W=s(a=>{let A=c(c({},Q),a),{className:t,meta:e,children:o,lang:p,title:f,loading:g,extra:x,size:F,okText:L,backText:k,okProps:_,backProps:l}=A,m=C(A,["className","meta","children","lang","title","loading","extra","size","okText","backText","okProps","backProps"]),h=s(v=>T[p][v],"t"),d=s(()=>history.back(),"handleBack"),S=x||i.createElement(O,c({size:"small",icon:i.createElement(I,null),onClick:d},l),k||h("back")),y=o||i.createElement(q,null,i.createElement(O,c({htmlType:"submit",type:"primary",icon:i.createElement(J,null)},_),L||h("submit")),i.createElement(O,c({icon:i.createElement(I,null),onClick:d},l),k||h("back")));return i.createElement(j,{title:f,size:F,loading:g,"data-component":U,className:V(U,t),extra:S},i.createElement(G,c({meta:e},m),y))},"ReactAntResourceForm"),$=W;import Y,{useEffect as Z,useState as ee}from"react";import{Form as te,message as H}from"antd";import R from"@jswork/next";import{useEffect as X}from"react";var w=s(a=>{let t=s(function(e){(e.ctrlKey||e.metaKey)&&e.key==="s"&&(e.preventDefault(),a(e))},"handler");X(()=>(document.addEventListener("keydown",t),()=>{document.removeEventListener("keydown",t)}),[])},"useKeyboardSave");var ae={lang:"zh-CN",disableHotkeySave:!1},oe=s(a=>{let z=c(c({},ae),a),{name:t,params:e,lang:o,transformRequest:p,transformResponse:f,disableHotkeySave:g}=z,x=C(z,["name","params","lang","transformRequest","transformResponse","disableHotkeySave"]),F=`${t}_update`,L=`${t}_create`,k=`${t}_show`,[_]=te.useForm(),l=!!(e!=null&&e.id),m=s(r=>P[o][r],"t"),[h,d]=ee(!1),S=s(r=>(d(!0),(p==null?void 0:p(r))||r.payload),"handleStateRequest"),y=s(r=>{var n,u;return d(!1),(u=(n=R.$event)==null?void 0:n.emit)==null||u.call(n,`${t}:refetch`),(f==null?void 0:f(r))||r.data},"handleStateResponse"),A=s(r=>{if(l){let n=c({id:e.id},r),u=S({stage:"update",payload:n});R.$api[F](u).then(E=>{H.success(m("update_success")),y({stage:"update",data:E})}).finally(()=>d(!1))}else{let n=c({},r),u=S({stage:"create",payload:n});R.$api[L](u).then(E=>{H.success(m("create_success")),y({stage:"create",data:E})}).finally(()=>d(!1))}},"handleFinish");w(()=>{g||_.submit()}),Z(()=>{if(l){let r={id:e.id},n=S({stage:"show",payload:r});R.$api[k](n).then(u=>{let E=y({stage:"show",data:u});_.setFieldsValue(E)}).finally(()=>d(!1))}},[l,e==null?void 0:e.id]);let v=m(l?"update":"create"),D=m(l?"update_title":"create_title");return Y.createElement($,c({loading:h,form:_,onFinish:A,okText:v,title:D},x))},"ReactAntResourceFormApi"),ce=oe;export{$ as ReactAntResourceForm,ce as ReactAntResourceFormApi,w as useKeyboardSave};
|
|
2
2
|
//# sourceMappingURL=main.esm.js.map
|
package/dist/main.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/api.tsx"],"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';\n\nexport type ReactAntResourceFormProps = {\n lang?: string;\n loading?: boolean;\n okText?: string;\n backText?: string;\n okProps?: ButtonProps;\n backProps?: ButtonProps;\n size?: CardProps['size'];\n extra?: CardProps['extra'];\n title?: CardProps['title'];\n} & ReactAntdFormSchemaProps;\n\nconst CLASS_NAME = 'react-ant-resource-form';\nconst locales = {\n 'zh-CN': {\n submit: '提交',\n back: '返回',\n },\n 'en-US': {\n submit: 'Submit',\n back: 'Back',\n },\n};\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 ...rest\n } = {\n ...defaultProps,\n ...props,\n };\n const t = (key: string) => 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 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 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","import React, { FC, useEffect, useState } from 'react';\nimport ReactAntResourceForm, { ReactAntResourceFormProps } from '.';\nimport { Form, message } from 'antd';\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 ReactAntResourceFormApiProps = ReactAntResourceFormProps & {\n lang?: string;\n params?: Record<string, any>;\n transformRequest?: (payload: StagePayload) => any;\n transformResponse?: (res: StageData) => any;\n};\n\nconst 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\nconst defaultProps = {\n lang: 'zh-CN',\n};\n\nconst ReactAntResourceFormApi: FC<ReactAntResourceFormApiProps> = (props) => {\n const { name, params, lang, transformRequest, transformResponse, ...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) => 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 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 // 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"],"mappings":"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","names":["cx","React","Button","Card","Space","ReactAntdFormSchema","ArrowLeftOutlined","SaveOutlined","CLASS_NAME","locales","submit","back","defaultProps","lang","ReactAntResourceForm","__name","props","_a","__spreadValues","className","meta","children","title","loading","extra","size","okText","backText","okProps","backProps","rest","t","key","handleBack","history","_extra","React","Button","icon","ArrowLeftOutlined","onClick","_children","Space","htmlType","type","SaveOutlined","Card","data-component","cx","ReactAntdFormSchema","index_default","React","useEffect","useState","Form","message","nx","locales","create","update","create_title","update_title","create_success","update_success","defaultProps","lang","ReactAntResourceFormApi","__name","props","_a","__spreadValues","name","params","transformRequest","transformResponse","rest","resourceEdit","resourceCreate","resourceShow","form","Form","useForm","isEdit","Boolean","id","t","key","loading","setLoading","useState","handleStateRequest","stagePayload","payload","handleStateResponse","res","_b","nx","$event","emit","data","handleFinish","values","_payload","stage","$api","then","message","success","finally","useEffect","setFieldsValue","okText","title","React","ReactAntResourceForm","onFinish","api_default"]}
|
|
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 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 ...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 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 } from 'react';\n\nexport const useKeyboardSave = (callback: (e: KeyboardEvent) => void) => {\n const handler = function (e: KeyboardEvent) {\n // 检查是否按下了 Ctrl+S (Windows/Linux) 或 Cmd+S (macOS)\n if ((e.ctrlKey || e.metaKey) && e.key === 's') {\n e.preventDefault();\n callback(e);\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', handler);\n return () => {\n document.removeEventListener('keydown', handler);\n };\n }, []);\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","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","useKeyboardSave","__name","callback","handler","e","ctrlKey","metaKey","key","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"]}
|
package/package.json
CHANGED
package/src/api.tsx
CHANGED
|
@@ -2,6 +2,8 @@ import React, { FC, useEffect, useState } from 'react';
|
|
|
2
2
|
import ReactAntResourceForm, { ReactAntResourceFormProps } from '.';
|
|
3
3
|
import { Form, message } from 'antd';
|
|
4
4
|
import nx from '@jswork/next';
|
|
5
|
+
import { useKeyboardSave } from './hooks';
|
|
6
|
+
import { API_FORM_LOCALES } from './locales';
|
|
5
7
|
|
|
6
8
|
declare global {
|
|
7
9
|
interface NxStatic {
|
|
@@ -23,35 +25,18 @@ type StageData = {
|
|
|
23
25
|
export type ReactAntResourceFormApiProps = ReactAntResourceFormProps & {
|
|
24
26
|
lang?: string;
|
|
25
27
|
params?: Record<string, any>;
|
|
28
|
+
disableHotkeySave?: boolean;
|
|
26
29
|
transformRequest?: (payload: StagePayload) => any;
|
|
27
30
|
transformResponse?: (res: StageData) => any;
|
|
28
31
|
};
|
|
29
32
|
|
|
30
|
-
const locales = {
|
|
31
|
-
'zh-CN': {
|
|
32
|
-
create: '创建',
|
|
33
|
-
update: '保存',
|
|
34
|
-
create_title: '创建',
|
|
35
|
-
update_title: '更新',
|
|
36
|
-
create_success: '创建成功',
|
|
37
|
-
update_success: '更新成功',
|
|
38
|
-
},
|
|
39
|
-
'en-US': {
|
|
40
|
-
create: 'Create',
|
|
41
|
-
update: 'Save',
|
|
42
|
-
create_title: 'Create',
|
|
43
|
-
update_title: 'Update',
|
|
44
|
-
create_success: 'Create success',
|
|
45
|
-
update_success: 'Update success',
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
|
|
49
33
|
const defaultProps = {
|
|
50
34
|
lang: 'zh-CN',
|
|
35
|
+
disableHotkeySave: false,
|
|
51
36
|
};
|
|
52
37
|
|
|
53
38
|
const ReactAntResourceFormApi: FC<ReactAntResourceFormApiProps> = (props) => {
|
|
54
|
-
const { name, params, lang, transformRequest, transformResponse, ...rest } = {
|
|
39
|
+
const { name, params, lang, transformRequest, transformResponse, disableHotkeySave, ...rest } = {
|
|
55
40
|
...defaultProps,
|
|
56
41
|
...props,
|
|
57
42
|
};
|
|
@@ -61,12 +46,13 @@ const ReactAntResourceFormApi: FC<ReactAntResourceFormApiProps> = (props) => {
|
|
|
61
46
|
const resourceShow = `${name}_show`;
|
|
62
47
|
const [form] = Form.useForm();
|
|
63
48
|
const isEdit = Boolean(params?.id);
|
|
64
|
-
const t = (key: string) =>
|
|
49
|
+
const t = (key: string) => API_FORM_LOCALES[lang!][key];
|
|
65
50
|
const [loading, setLoading] = useState(false);
|
|
66
51
|
const handleStateRequest = (stagePayload: StagePayload) => {
|
|
67
52
|
setLoading(true);
|
|
68
53
|
return transformRequest?.(stagePayload) || stagePayload.payload;
|
|
69
54
|
};
|
|
55
|
+
|
|
70
56
|
const handleStateResponse = (res: StageData) => {
|
|
71
57
|
setLoading(false);
|
|
72
58
|
nx.$event?.emit?.(`${name}:refetch`);
|
|
@@ -97,6 +83,11 @@ const ReactAntResourceFormApi: FC<ReactAntResourceFormApiProps> = (props) => {
|
|
|
97
83
|
}
|
|
98
84
|
};
|
|
99
85
|
|
|
86
|
+
// hotkey save
|
|
87
|
+
useKeyboardSave(() => {
|
|
88
|
+
if (!disableHotkeySave) form.submit();
|
|
89
|
+
});
|
|
90
|
+
|
|
100
91
|
// init detail
|
|
101
92
|
useEffect(() => {
|
|
102
93
|
if (isEdit) {
|
package/src/hooks.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
export const useKeyboardSave = (callback: (e: KeyboardEvent) => void) => {
|
|
4
|
+
const handler = function (e: KeyboardEvent) {
|
|
5
|
+
// 检查是否按下了 Ctrl+S (Windows/Linux) 或 Cmd+S (macOS)
|
|
6
|
+
if ((e.ctrlKey || e.metaKey) && e.key === 's') {
|
|
7
|
+
e.preventDefault();
|
|
8
|
+
callback(e);
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
document.addEventListener('keydown', handler);
|
|
14
|
+
return () => {
|
|
15
|
+
document.removeEventListener('keydown', handler);
|
|
16
|
+
};
|
|
17
|
+
}, []);
|
|
18
|
+
};
|
package/src/index.tsx
CHANGED
|
@@ -4,6 +4,7 @@ import React, { FC } from 'react';
|
|
|
4
4
|
import { Button, ButtonProps, Card, CardProps, Space } from 'antd';
|
|
5
5
|
import ReactAntdFormSchema, { ReactAntdFormSchemaProps } from '@jswork/react-ant-form-schema';
|
|
6
6
|
import { ArrowLeftOutlined, SaveOutlined } from '@ant-design/icons';
|
|
7
|
+
import { BASIC_FORM_LOCALES } from './locales';
|
|
7
8
|
|
|
8
9
|
export type ReactAntResourceFormProps = {
|
|
9
10
|
lang?: string;
|
|
@@ -18,16 +19,6 @@ export type ReactAntResourceFormProps = {
|
|
|
18
19
|
} & ReactAntdFormSchemaProps;
|
|
19
20
|
|
|
20
21
|
const CLASS_NAME = 'react-ant-resource-form';
|
|
21
|
-
const locales = {
|
|
22
|
-
'zh-CN': {
|
|
23
|
-
submit: '提交',
|
|
24
|
-
back: '返回',
|
|
25
|
-
},
|
|
26
|
-
'en-US': {
|
|
27
|
-
submit: 'Submit',
|
|
28
|
-
back: 'Back',
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
22
|
|
|
32
23
|
const defaultProps = {
|
|
33
24
|
lang: 'zh-CN',
|
|
@@ -52,13 +43,15 @@ const ReactAntResourceForm: FC<ReactAntResourceFormProps> = (props) => {
|
|
|
52
43
|
...defaultProps,
|
|
53
44
|
...props,
|
|
54
45
|
};
|
|
55
|
-
|
|
46
|
+
|
|
47
|
+
const t = (key: string) => BASIC_FORM_LOCALES[lang][key];
|
|
56
48
|
const handleBack = () => history.back();
|
|
57
49
|
const _extra = extra || (
|
|
58
50
|
<Button size="small" icon={<ArrowLeftOutlined />} onClick={handleBack} {...backProps}>
|
|
59
51
|
{backText || t('back')}
|
|
60
52
|
</Button>
|
|
61
53
|
);
|
|
54
|
+
|
|
62
55
|
const _children = children || (
|
|
63
56
|
<Space>
|
|
64
57
|
<Button htmlType="submit" type="primary" icon={<SaveOutlined />} {...okProps}>
|
package/src/locales.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export const API_FORM_LOCALES = {
|
|
2
|
+
'zh-CN': {
|
|
3
|
+
create: '创建',
|
|
4
|
+
update: '保存',
|
|
5
|
+
create_title: '创建',
|
|
6
|
+
update_title: '更新',
|
|
7
|
+
create_success: '创建成功',
|
|
8
|
+
update_success: '更新成功',
|
|
9
|
+
},
|
|
10
|
+
'en-US': {
|
|
11
|
+
create: 'Create',
|
|
12
|
+
update: 'Save',
|
|
13
|
+
create_title: 'Create',
|
|
14
|
+
update_title: 'Update',
|
|
15
|
+
create_success: 'Create success',
|
|
16
|
+
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
|
+
submit: 'Submit',
|
|
27
|
+
back: 'Back',
|
|
28
|
+
},
|
|
29
|
+
};
|
package/src/main.tsx
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import ReactAntResourceForm from '.';
|
|
2
2
|
import ReactAntResourceFormApi from './api';
|
|
3
|
+
import { useKeyboardSave } from './hooks';
|
|
3
4
|
import type { ReactAntResourceFormProps } from '.';
|
|
4
5
|
import type { ReactAntResourceFormApiProps } from './api';
|
|
5
6
|
|
|
6
|
-
export { ReactAntResourceForm, ReactAntResourceFormApi };
|
|
7
|
+
export { ReactAntResourceForm, ReactAntResourceFormApi, useKeyboardSave };
|
|
7
8
|
export type { ReactAntResourceFormProps, ReactAntResourceFormApiProps };
|