@flatbiz/antd 4.5.33 → 4.5.35
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/esm/box-grid/index.js.map +1 -1
- package/esm/button-operate/index.js +1 -1
- package/esm/button-operate/index.js.map +1 -1
- package/esm/cascader-wrapper/index.css +1 -1
- package/esm/cascader-wrapper/index.js +1 -1
- package/esm/cascader-wrapper/index.js.map +1 -1
- package/esm/dropdown-menu-wrapper/index.js.map +1 -1
- package/esm/easy-table/index.js +1 -1
- package/esm/easy-table/index.js.map +1 -1
- package/esm/index.js +2 -1
- package/esm/label-value-render/index.css +1 -1
- package/esm/label-value-render/index.js +1 -1
- package/esm/label-value-render/index.js.map +1 -1
- package/esm/local-loading/index.css +1 -1
- package/esm/local-loading/index.js +1 -1
- package/esm/local-loading/index.js.map +1 -1
- package/esm/radio-group-wrapper/index.js +1 -1
- package/esm/radio-group-wrapper/index.js.map +1 -1
- package/esm/styles/index.css +1 -1
- package/esm/tabs-sticky/index.css +1 -0
- package/esm/tabs-sticky/index.js +5 -0
- package/esm/tabs-sticky/index.js.map +1 -0
- package/esm/tree-modal/index.js +1 -1
- package/esm/tree-modal/index.js.map +1 -1
- package/esm/tree-modal-selector/index.js +1 -1
- package/esm/tree-modal-selector/index.js.map +1 -1
- package/esm/tree-wrapper/index.js +1 -1
- package/esm/tree-wrapper/index.js.map +1 -1
- package/esm/upload-wrapper/index.css +1 -1
- package/esm/upload-wrapper/index.js +5 -1
- package/esm/upload-wrapper/index.js.map +1 -1
- package/index.d.ts +94 -30
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["@flatbiz/antd/src/upload-wrapper/upload-wrapper.tsx"],"sourcesContent":["import { PlusOutlined } from '@ant-design/icons';\nimport { isPlainObject } from '@dimjs/lang';\nimport { classNames, extend } from '@dimjs/utils';\nimport { isUndefinedOrNull, TAny, toArray, TPlainObject } from '@flatbiz/utils';\nimport { hooks } from '@wove/react';\nimport { Button, message, Upload, UploadProps } from 'antd';\nimport { UploadChangeParam } from 'antd/lib/upload';\nimport { UploadFile, UploadListType } from 'antd/lib/upload/interface';\nimport { Fragment, ReactNode, useMemo, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { fbaHooks } from '../fba-hooks';\nimport './style.less';\n\nexport type UploadWrapperFileItem = {\n uid: string;\n name: string;\n url?: string;\n};\n\nexport type UploadWrapperProps<T extends TPlainObject = TPlainObject> = {\n value?: T[] | T;\n onChange?: (value?: T[]) => void;\n onUploadError?: (message?: string) => void;\n onUploadChange?: (info: UploadChangeParam<UploadFile>) => void;\n /**\n * 属性取值映射\n */\n fieldNames?: {\n uid: string;\n name?: string;\n url?: string;\n };\n /**\n * 接口响应数据适配器,如果配置了fieldNames,适配器返回值会再进过fieldNames转换\n */\n onRequestResultAdapter?: (respData: TAny) => TPlainObject;\n /** 操作触发显示文本 */\n triggerText?: string;\n /** 超过maxCount 隐藏上传入口 */\n limitHidden?: boolean;\n /**\n * 自动提交,默认:true\n * ```\n * 1. 自定义beforeUpload配置后 autoSubmit 失效\n * ```\n */\n autoSubmit?: boolean;\n} & Omit<UploadProps, 'onChange' | 'fileList'>;\n\n/**\n * 文件上传\n * ```\n * demo: https://fex.qa.tcshuke.com/docs/admin/main/file/upload\n * 1. 可通过配置children替换默认上传触发布局\n * 2. 接口返回结构:\n * formData上传接口返回值\n * {\n * code: '0000',\n * data: {\n * uid: '唯一值,可使用fileKey值'\n * name: '文件名称'\n * url: '预览地址'\n * }\n * }\n * 3. 如果接口返回的不是上面的字段名称,可通过fieldNames配置接口返回字段名称映射\n *\n * 4. 最佳使用方式,与Form结合使用\n * <Form.Item name=\"attachmentList\" label=\"附件\">\n * <UploadWrapper action={uploadUrl} />\n * </Form.Item>\n *\n * 5. 回填数据结构\n * [{\n * uid: '唯一值',\n * name(非必填): 'image.png',\n * url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',\n * }]\n * 其中 uid、name、url 可为其他命名,通过 fieldNames 进行映射即可\n * ```\n *\n */\nexport const UploadWrapper = (props: UploadWrapperProps) => {\n const { onChange, onUploadError, value, triggerText, limitHidden, autoSubmit, ...otherProps } = props;\n const [uploadList, setUploadList] = useState<UploadWrapperFileItem[]>();\n const fieldNames = extend(\n {\n uid: 'uid',\n name: 'name',\n url: 'url',\n },\n props.fieldNames,\n ) as Required<UploadWrapperFileItem>;\n\n const valueList = useMemo(\n () => (isUndefinedOrNull(value) ? undefined : toArray<TPlainObject>(value)),\n [value],\n );\n\n fbaHooks.useEffectCustom(() => {\n const errorList = uploadList?.filter((item) => item['status'] === 'error') || [];\n let newList = [] as TAny[];\n valueList?.forEach((item) => {\n // 判断item 为 File类型\n if (item['lastModified']) {\n newList.push(item);\n } else {\n newList.push({\n uid: item[fieldNames.uid],\n name: item[fieldNames.name],\n url: item[fieldNames.url],\n status: 'done',\n isOriginal: true,\n responseData: item['responseData'],\n });\n }\n });\n if (errorList.length > 0) {\n const newErrorList = errorList.map((item) => {\n return {\n uid: item.uid,\n name: item.name,\n status: 'error',\n isOriginal: true,\n response: item['response'],\n };\n }) as TAny[];\n newList = newList.concat(newErrorList);\n }\n setUploadList(newList);\n }, [fieldNames.name, fieldNames.uid, fieldNames.url, valueList]);\n\n const handleResponse = (fileList: UploadFile<TAny>[]) => {\n const newFileList: TAny[] = [];\n let hasError = false;\n fileList.forEach((item) => {\n if (item['isOriginal']) {\n if (item['status'] !== 'error') {\n newFileList.push({\n [fieldNames.uid]: item.uid,\n [fieldNames.name]: item.name,\n [fieldNames.url]: item.url,\n });\n }\n } else if (isPlainObject(item.response)) {\n if (item.response.code === '0000') {\n const respData = item.response.data;\n const result = (props.onRequestResultAdapter?.(respData) || respData) as TPlainObject;\n newFileList.push({\n [fieldNames.uid]: result[fieldNames.uid] || item.uid,\n [fieldNames.name]: result[fieldNames.name] || item.name,\n [fieldNames.url]: result[fieldNames.url],\n responseData: respData,\n });\n } else {\n const errorMsg = item.response.message || '上传失败';\n hasError = true;\n item.status = 'error';\n item.response = item.response.message || '上传失败';\n if (onUploadError) {\n onUploadError?.(errorMsg);\n } else {\n void message.error('上传操作失败...');\n }\n }\n }\n });\n if (hasError) {\n setUploadList([...fileList] as UploadWrapperFileItem[]);\n }\n onChange?.(newFileList);\n };\n\n const onUploadChange = hooks.useCallbackRef((info) => {\n const fileList = info.fileList as TPlainObject[];\n if (info.file.status === 'done') {\n const newFileList = [...info.fileList];\n const donwList = newFileList.filter((item) => item.status === 'done' || item['isOriginal']);\n\n const allDone = donwList.length === newFileList.length;\n if (allDone) {\n handleResponse(newFileList);\n }\n flushSync(() => setUploadList(newFileList));\n return;\n } else if (info.file.status === 'removed') {\n const uid = info.file.uid;\n const targetList = valueList !== undefined ? [...valueList] : [];\n const targetIndex = targetList.findIndex((item) => {\n const tempUid = item[fieldNames.uid] || item.uid;\n return tempUid === uid;\n });\n if (targetIndex >= 0) {\n targetList.splice(targetIndex, 1);\n }\n onChange?.(targetList);\n } else if (info.file.status === 'error') {\n if (onUploadError) {\n onUploadError();\n } else {\n void message.error('上传操作失败...');\n }\n }\n // https://github.com/ant-design/ant-design/issues/2423\n setUploadList([...fileList] as UploadWrapperFileItem[]);\n props.onUploadChange?.(info);\n });\n\n const hiddenEmtry = useMemo(() => {\n if (otherProps.maxCount === undefined || !limitHidden) return false;\n if (otherProps.maxCount === 0) return true;\n if (uploadList && uploadList.length >= otherProps.maxCount) return true;\n return false;\n }, [limitHidden, otherProps.maxCount, uploadList]);\n\n const beforeUpload = (_file, fileList) => {\n if (autoSubmit === false) {\n const maxCount = otherProps.maxCount;\n let mergeList = [...(valueList || []), ...fileList];\n let uploadListMerge = [...(uploadList || []), ...fileList];\n if (maxCount !== undefined && maxCount !== null) {\n if (mergeList.length > maxCount) {\n mergeList = mergeList.slice(mergeList.length - maxCount);\n uploadListMerge = uploadListMerge.slice(uploadListMerge.length - maxCount);\n }\n }\n setUploadList(uploadListMerge);\n props.onChange?.(mergeList);\n return false;\n }\n return true;\n };\n\n return (\n <Upload\n beforeUpload={beforeUpload}\n {...otherProps}\n onChange={onUploadChange}\n fileList={uploadList}\n className={classNames('v-upload-wrapper', otherProps.className)}\n >\n {otherProps.disabled || hiddenEmtry ? null : (\n <UploadTrigger triggerText={triggerText} listType={otherProps.listType}>\n {props.children}\n </UploadTrigger>\n )}\n </Upload>\n );\n};\n\nconst UploadTrigger = (props: {\n listType?: UploadListType;\n children?: ReactNode | ReactNode[];\n triggerText?: string;\n}) => {\n if (props.children) return <Fragment>{props.children}</Fragment>;\n if (props.listType === 'picture-card') {\n return (\n <div>\n <PlusOutlined />\n <div style={{ marginTop: 8 }}>{props.triggerText || '上传图片'}</div>\n </div>\n );\n }\n if (props.listType === 'picture') {\n return (\n <Button type=\"primary\" ghost>\n {props.triggerText || '选择图片上传'}\n </Button>\n );\n }\n return (\n <Button type=\"primary\" ghost>\n {props.triggerText || '选择文件上传'}\n </Button>\n );\n};\n"],"names":["UploadWrapper","props","onChange","onUploadError","value","triggerText","limitHidden","autoSubmit","otherProps","_objectWithoutPropertiesLoose","_excluded","_useState","useState","uploadList","setUploadList","fieldNames","_extend","uid","name","url","valueList","useMemo","isUndefinedOrNull","undefined","toArray","fbaHooks","useEffectCustom","errorList","filter","item","newList","forEach","push","status","isOriginal","responseData","length","newErrorList","map","response","concat","handleResponse","fileList","newFileList","hasError","_newFileList$push","_isPlainObject","code","_newFileList$push2","respData","data","result","onRequestResultAdapter","errorMsg","message","error","onUploadChange","_hooks","useCallbackRef","info","file","donwList","allDone","flushSync","targetList","targetIndex","findIndex","tempUid","splice","hiddenEmtry","maxCount","beforeUpload","_file","mergeList","uploadListMerge","slice","_jsx","Upload","_extends","className","_classNames","children","disabled","UploadTrigger","listType","Fragment","_jsxs","_PlusOutlined","style","marginTop","Button","type","ghost"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["@flatbiz/antd/src/upload-wrapper/utils.ts","@flatbiz/antd/src/upload-wrapper/upload-wrapper.tsx"],"sourcesContent":["export const getBase64 = (file): Promise<string> =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n });\n","import { PlusOutlined } from '@ant-design/icons';\nimport { isPlainObject } from '@dimjs/lang';\nimport { classNames, extend } from '@dimjs/utils';\nimport type { TAny, TPlainObject } from '@flatbiz/utils';\nimport { isUndefinedOrNull, openNewWindow, toArray } from '@flatbiz/utils';\nimport { hooks } from '@wove/react';\nimport type { UploadProps } from 'antd';\nimport { Button, Image, message, Upload } from 'antd';\nimport type { UploadChangeParam } from 'antd/lib/upload';\nimport type { UploadFile, UploadListType } from 'antd/lib/upload/interface';\nimport type { ReactElement, ReactNode } from 'react';\nimport { cloneElement, Fragment, useMemo, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { ButtonWrapper } from '../button-wrapper';\nimport { fbaHooks } from '../fba-hooks';\nimport './style.less';\nimport { getBase64 } from './utils';\n\nexport type UploadWrapperFileItem = {\n uid: string;\n name: string;\n url?: string;\n};\n\nexport type UploadWrapperProps<T extends TPlainObject = TPlainObject> = {\n value?: T[] | T;\n onChange?: (value?: T[]) => void;\n onUploadError?: (message?: string) => void;\n onUploadChange?: (info: UploadChangeParam<UploadFile>) => void;\n /**\n * 属性取值映射\n */\n fieldNames?: {\n uid: string;\n name?: string;\n url?: string;\n /** 文件大小 */\n size?: string | number;\n };\n /**\n * 接口响应数据适配器,如果配置了fieldNames,适配器返回值会再进过fieldNames转换\n */\n onRequestResultAdapter?: (respData: TAny) => TPlainObject;\n /** 操作触发显示文本 */\n triggerText?: string;\n /** 超过maxCount 隐藏上传入口 */\n limitHidden?: boolean;\n /**\n * 自动提交,默认:true\n * ```\n * 1. 自定义beforeUpload配置后 autoSubmit 失效\n * ```\n */\n autoSubmit?: boolean;\n /** 图片预览开关, 重写 onPreview 方法后失效 */\n imagePreviewSwitch?: boolean;\n /** 图片预览文件类型,默认:['png', 'jpg', 'jpeg', 'gif'] */\n imagePreviewAccept?: string[];\n /**\n * 配置文件额外操作\n * ```\n * 额外操作超过两项后,listType为 picture-card、picture-circle 时会出现显示异常,需要自行修改覆盖样式\n * ```\n */\n extraOperate?: {\n icon: ReactElement;\n onClick: (file: UploadFile, fileList: UploadFile[], e) => void;\n }[];\n} & Omit<UploadProps, 'onChange' | 'fileList'>;\n\n/**\n * 文件上传\n * ```\n * demo: https://fex.qa.tcshuke.com/docs/admin/main/file/upload\n * 1. 可通过配置children替换默认上传触发布局\n * 2. 接口返回结构:\n * formData上传接口返回值\n * {\n * code: '0000',\n * data: {\n * uid: '唯一值,可使用fileKey值'\n * name: '文件名称'\n * url: '预览地址'\n * }\n * }\n * 3. 如果接口返回的不是上面的字段名称,可通过fieldNames配置接口返回字段名称映射\n *\n * 4. 最佳使用方式,与Form结合使用\n * <Form.Item name=\"attachmentList\" label=\"附件\">\n * <UploadWrapper action={uploadUrl} />\n * </Form.Item>\n *\n * 5. 回填数据结构\n * [{\n * uid: '唯一值',\n * name(非必填): 'image.png',\n * url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',\n * }]\n * 1. 其中 uid、name、url 可为其他命名,通过 fieldNames 进行映射即可,\n * 2. 其他需要的字段可在对象中添加 responseData 对象\n * 例如:\n * [{\n * uid: '唯一值',\n * name(非必填): 'image.png',\n * url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',\n * responseData: { 'xx':'xxx' }\n * }]\n * ```\n *\n */\nexport const UploadWrapper = (props: UploadWrapperProps) => {\n const {\n onChange,\n onUploadError,\n value,\n triggerText,\n limitHidden,\n autoSubmit,\n imagePreviewSwitch,\n imagePreviewAccept,\n extraOperate,\n ...otherProps\n } = props;\n const imagePreviewAcceptFt = isUndefinedOrNull(imagePreviewAccept)\n ? ['png', 'jpg', 'jpeg', 'gif']\n : imagePreviewAccept;\n const [previewImage, setPreviewImage] = useState<string>();\n const [uploadList, setUploadList] = useState<UploadWrapperFileItem[]>();\n const fieldNames = extend(\n {\n uid: 'uid',\n name: 'name',\n url: 'url',\n size: 'size',\n },\n props.fieldNames,\n );\n\n const valueList = useMemo(\n () => (isUndefinedOrNull(value) ? undefined : toArray<TPlainObject>(value)),\n [value],\n );\n\n fbaHooks.useEffectCustom(() => {\n const errorList = uploadList?.filter((item) => item['status'] === 'error') || [];\n let newList = [] as TAny[];\n valueList?.forEach((item) => {\n // 判断item 为 File类型\n if (item['lastModified']) {\n newList.push(item);\n } else {\n newList.push({\n uid: item[fieldNames.uid],\n name: item[fieldNames.name],\n url: item[fieldNames.url],\n size: item[fieldNames.size],\n responseData: item['responseData'],\n status: 'done',\n isOriginal: true,\n });\n }\n });\n if (errorList.length > 0) {\n const newErrorList = errorList.map((item) => {\n return {\n uid: item.uid,\n name: item.name,\n status: 'error',\n isOriginal: true,\n response: item['response'],\n };\n }) as TAny[];\n newList = newList.concat(newErrorList);\n }\n setUploadList(newList);\n }, [fieldNames.name, fieldNames.uid, fieldNames.url, valueList]);\n\n const handleResponse = (fileList: UploadFile<TAny>[]) => {\n const newFileList: TAny[] = [];\n let hasError = false;\n fileList.forEach((item) => {\n if (item['isOriginal']) {\n if (item['status'] !== 'error') {\n const target: TPlainObject = {\n [fieldNames.uid]: item.uid,\n [fieldNames.name]: item.name,\n [fieldNames.url]: item.url,\n };\n if (!isUndefinedOrNull(item.size)) {\n target[fieldNames.size] = item.size;\n }\n if (item['responseData']) {\n target.responseData = item['responseData'];\n }\n newFileList.push(target);\n }\n } else if (isPlainObject(item.response)) {\n if (item.response.code === '0000') {\n const respData = item.response.data;\n const result = (props.onRequestResultAdapter?.(respData) || respData) as TPlainObject;\n const target: TPlainObject = {\n [fieldNames.uid]: result[fieldNames.uid] || item.uid,\n [fieldNames.name]: result[fieldNames.name] || item.name,\n [fieldNames.url]: result[fieldNames.url],\n };\n if (!isUndefinedOrNull(result[fieldNames.size])) {\n target[fieldNames.size] = result[fieldNames.size];\n }\n newFileList.push({\n ...target,\n responseData: respData,\n });\n } else {\n const errorMsg = item.response.message || '上传失败';\n hasError = true;\n item.status = 'error';\n item.response = item.response.message || '上传失败';\n if (onUploadError) {\n onUploadError?.(errorMsg);\n } else {\n void message.error('上传操作失败...');\n }\n }\n }\n });\n if (hasError) {\n setUploadList([...fileList] as UploadWrapperFileItem[]);\n }\n onChange?.(newFileList);\n };\n\n const onUploadChange = hooks.useCallbackRef((info) => {\n const fileList = info.fileList as TPlainObject[];\n if (info.file.status === 'done') {\n const newFileList = [...info.fileList];\n const donwList = newFileList.filter((item) => item.status === 'done' || item['isOriginal']);\n\n const allDone = donwList.length === newFileList.length;\n if (allDone) {\n handleResponse(newFileList);\n }\n flushSync(() => setUploadList(newFileList));\n return;\n } else if (info.file.status === 'removed') {\n const uid = info.file.uid;\n const targetList = valueList !== undefined ? [...valueList] : [];\n const targetIndex = targetList.findIndex((item) => {\n const tempUid = item[fieldNames.uid] || item.uid;\n return tempUid === uid;\n });\n if (targetIndex >= 0) {\n targetList.splice(targetIndex, 1);\n }\n onChange?.(targetList);\n } else if (info.file.status === 'error') {\n if (onUploadError) {\n onUploadError();\n } else {\n void message.error('上传操作失败...');\n }\n }\n // https://github.com/ant-design/ant-design/issues/2423\n setUploadList([...fileList] as UploadWrapperFileItem[]);\n props.onUploadChange?.(info);\n });\n\n const hiddenEmtry = useMemo(() => {\n if (otherProps.maxCount === undefined || !limitHidden) return false;\n if (otherProps.maxCount === 0) return true;\n if (uploadList && uploadList.length >= otherProps.maxCount) return true;\n return false;\n }, [limitHidden, otherProps.maxCount, uploadList]);\n\n const beforeUpload = (_file, fileList) => {\n if (autoSubmit === false) {\n const maxCount = otherProps.maxCount;\n let mergeList = [...(valueList || []), ...fileList];\n let uploadListMerge = [...(uploadList || []), ...fileList];\n if (maxCount !== undefined && maxCount !== null) {\n if (mergeList.length > maxCount) {\n mergeList = mergeList.slice(mergeList.length - maxCount);\n uploadListMerge = uploadListMerge.slice(uploadListMerge.length - maxCount);\n }\n }\n setUploadList(uploadListMerge);\n props.onChange?.(mergeList);\n return false;\n }\n return true;\n };\n\n const handlePreview = async (file: UploadFile) => {\n const name = file.name || '';\n const extension = name.slice(name.lastIndexOf('.') + 1);\n const acceptTarget = imagePreviewAcceptFt?.find((item) => {\n return item.toLocaleLowerCase() === extension.toLocaleLowerCase();\n });\n if (acceptTarget) {\n if (!file.url && !file.preview) {\n file.preview = await getBase64(file.originFileObj);\n }\n setPreviewImage(file.url || (file.preview as string));\n } else {\n openNewWindow(file.url as string);\n }\n };\n\n return (\n <Fragment>\n <Upload\n beforeUpload={beforeUpload}\n onPreview={imagePreviewSwitch ? handlePreview : undefined}\n showUploadList\n itemRender={(originNode, file, fileList) => {\n if (!extraOperate || !extraOperate.length) return originNode;\n const countSign = `${otherProps.disabled ? 1 : 2}-${extraOperate.length}`;\n return (\n <div\n className={classNames(\n 'v-upload-list-item-actions-wrapper',\n `v-upload-list-item-extra-actions-${countSign}`,\n )}\n style={{ height: '100%' }}\n >\n {cloneElement(originNode, {\n children: [\n originNode.props.children,\n <div key=\"extra-actions\" className=\"v-upload-list-item-extra-actions\">\n {extraOperate.map((item, index) => {\n return (\n <ButtonWrapper\n key={index}\n size=\"small\"\n type=\"text\"\n icon={item.icon}\n onClick={item.onClick.bind(null, file, fileList)}\n />\n );\n })}\n </div>,\n ].filter(Boolean),\n })}\n </div>\n );\n }}\n {...otherProps}\n onChange={onUploadChange}\n fileList={uploadList}\n className={classNames('v-upload-wrapper', otherProps.className)}\n >\n {otherProps.disabled || hiddenEmtry ? null : (\n <UploadTrigger triggerText={triggerText} listType={otherProps.listType}>\n {props.children}\n </UploadTrigger>\n )}\n </Upload>\n {previewImage ? (\n <Image\n wrapperStyle={{ display: 'none' }}\n preview={{\n visible: !!previewImage,\n onVisibleChange: () => setPreviewImage(undefined),\n afterOpenChange: (visible) => !visible && setPreviewImage(''),\n }}\n src={previewImage}\n />\n ) : null}\n </Fragment>\n );\n};\n\nconst UploadTrigger = (props: {\n listType?: UploadListType;\n children?: ReactNode | ReactNode[];\n triggerText?: string;\n}) => {\n if (props.children) return <Fragment>{props.children}</Fragment>;\n if (props.listType === 'picture-card') {\n return (\n <div>\n <PlusOutlined />\n <div style={{ marginTop: 8 }}>{props.triggerText || '上传图片'}</div>\n </div>\n );\n }\n if (props.listType === 'picture') {\n return (\n <Button type=\"primary\" ghost>\n {props.triggerText || '选择图片上传'}\n </Button>\n );\n }\n return (\n <Button type=\"primary\" ghost>\n {props.triggerText || '选择文件上传'}\n </Button>\n );\n};\n"],"names":["getBase64","file","Promise","resolve","reject","reader","FileReader","readAsDataURL","onload","result","onerror","error","UploadWrapper","props","onChange","onUploadError","value","triggerText","limitHidden","autoSubmit","imagePreviewSwitch","imagePreviewAccept","extraOperate","otherProps","_objectWithoutPropertiesLoose","_excluded","imagePreviewAcceptFt","isUndefinedOrNull","_useState","useState","previewImage","setPreviewImage","_useState2","uploadList","setUploadList","fieldNames","_extend","uid","name","url","size","valueList","useMemo","undefined","toArray","fbaHooks","useEffectCustom","errorList","filter","item","newList","forEach","push","responseData","status","isOriginal","length","newErrorList","map","response","concat","handleResponse","fileList","newFileList","hasError","_target","target","_isPlainObject","code","_target3","respData","data","onRequestResultAdapter","_extends","errorMsg","message","onUploadChange","_hooks","useCallbackRef","info","donwList","allDone","flushSync","targetList","targetIndex","findIndex","tempUid","splice","hiddenEmtry","maxCount","beforeUpload","_file","mergeList","uploadListMerge","slice","handlePreview","$return","$error","extension","acceptTarget","lastIndexOf","find","toLocaleLowerCase","preview","originFileObj","then","$await_3","$If_2","call","this","$boundEx","bind","$If_1","openNewWindow","_jsxs","Fragment","children","_jsx","Upload","onPreview","showUploadList","itemRender","originNode","countSign","disabled","className","_classNames","style","height","cloneElement","index","ButtonWrapper","type","icon","onClick","Boolean","UploadTrigger","listType","Image","wrapperStyle","display","visible","onVisibleChange","afterOpenChange","src","_PlusOutlined","marginTop","Button","ghost"],"mappings":";w0CAAO,IAAMA,EAAY,SAAZA,EAAaC,GAAI,OAC5B,IAAIC,SAAQ,SAACC,EAASC,GACpB,IAAMC,EAAS,IAAIC,WACnBD,EAAOE,cAAcN,GACrBI,EAAOG,OAAS,WAAA,OAAML,EAAQE,EAAOI,OAAiB,EACtDJ,EAAOK,QAAU,SAACC,GAAK,OAAKP,EAAOO,EAAM,CAC3C,GAAE,mJCwGSC,EAAgB,SAAhBA,EAAiBC,GAC5B,IACEC,EAUED,EAVFC,SACAC,EASEF,EATFE,cACAC,EAQEH,EARFG,MACAC,EAOEJ,EAPFI,YACAC,EAMEL,EANFK,YACAC,EAKEN,EALFM,WACAC,EAIEP,EAJFO,mBACAC,EAGER,EAHFQ,mBACAC,EAEET,EAFFS,aACGC,EAAUC,EACXX,EAAKY,GACT,IAAMC,EAAuBC,EAAkBN,GAC3C,CAAC,MAAO,MAAO,OAAQ,OACvBA,EACJ,IAAAO,EAAwCC,IAAjCC,EAAYF,EAAA,GAAEG,EAAeH,EAAA,GACpC,IAAAI,EAAoCH,IAA7BI,EAAUD,EAAA,GAAEE,EAAaF,EAAA,GAChC,IAAMG,EAAaC,EACjB,CACEC,IAAK,MACLC,KAAM,OACNC,IAAK,MACLC,KAAM,QAER3B,EAAMsB,YAGR,IAAMM,EAAYC,GAChB,WAAA,OAAOf,EAAkBX,GAAS2B,UAAYC,EAAsB5B,EAAM,GAC1E,CAACA,IAGH6B,EAASC,iBAAgB,WACvB,IAAMC,GAAYd,GAAU,UAAA,EAAVA,EAAYe,QAAO,SAACC,GAAI,OAAKA,EAAK,YAAc,OAAO,MAAK,GAC9E,IAAIC,EAAU,GACdT,eAAAA,EAAWU,SAAQ,SAACF,GAElB,GAAIA,EAAK,gBAAiB,CACxBC,EAAQE,KAAKH,EACf,KAAO,CACLC,EAAQE,KAAK,CACXf,IAAKY,EAAKd,EAAWE,KACrBC,KAAMW,EAAKd,EAAWG,MACtBC,IAAKU,EAAKd,EAAWI,KACrBC,KAAMS,EAAKd,EAAWK,MACtBa,aAAcJ,EAAK,gBACnBK,OAAQ,OACRC,WAAY,MAEhB,CACF,IACA,GAAIR,EAAUS,OAAS,EAAG,CACxB,IAAMC,EAAeV,EAAUW,KAAI,SAACT,GAClC,MAAO,CACLZ,IAAKY,EAAKZ,IACVC,KAAMW,EAAKX,KACXgB,OAAQ,QACRC,WAAY,KACZI,SAAUV,EAAK,YAEnB,IACAC,EAAUA,EAAQU,OAAOH,EAC3B,CACAvB,EAAcgB,EAChB,GAAG,CAACf,EAAWG,KAAMH,EAAWE,IAAKF,EAAWI,IAAKE,IAErD,IAAMoB,EAAiB,SAAjBA,EAAkBC,GACtB,IAAMC,EAAsB,GAC5B,IAAIC,EAAW,MACfF,EAASX,SAAQ,SAACF,GAChB,GAAIA,EAAK,cAAe,CACtB,GAAIA,EAAK,YAAc,QAAS,CAAA,IAAAgB,EAC9B,IAAMC,GAAoBD,EAAA,CAAA,EAAAA,EACvB9B,EAAWE,KAAMY,EAAKZ,IAAG4B,EACzB9B,EAAWG,MAAOW,EAAKX,KAAI2B,EAC3B9B,EAAWI,KAAMU,EAAKV,IAAG0B,GAE5B,IAAKtC,EAAkBsB,EAAKT,MAAO,CACjC0B,EAAO/B,EAAWK,MAAQS,EAAKT,IACjC,CACA,GAAIS,EAAK,gBAAiB,CACxBiB,EAAOb,aAAeJ,EAAK,eAC7B,CACAc,EAAYX,KAAKc,EACnB,CACD,MAAM,GAAIC,EAAclB,EAAKU,UAAW,CACvC,GAAIV,EAAKU,SAASS,OAAS,OAAQ,CAAA,IAAAC,EACjC,IAAMC,EAAWrB,EAAKU,SAASY,KAC/B,IAAM9D,GAAUI,EAAM2D,wBAAsB,UAAA,EAA5B3D,EAAM2D,uBAAyBF,KAAaA,EAC5D,IAAMJ,GAAoBG,EAAAA,CAAAA,EAAAA,EACvBlC,EAAWE,KAAM5B,EAAO0B,EAAWE,MAAQY,EAAKZ,IAAGgC,EACnDlC,EAAWG,MAAO7B,EAAO0B,EAAWG,OAASW,EAAKX,KAAI+B,EACtDlC,EAAWI,KAAM9B,EAAO0B,EAAWI,KAAI8B,GAE1C,IAAK1C,EAAkBlB,EAAO0B,EAAWK,OAAQ,CAC/C0B,EAAO/B,EAAWK,MAAQ/B,EAAO0B,EAAWK,KAC9C,CACAuB,EAAYX,KAAIqB,KACXP,EAAM,CACTb,aAAciB,IAElB,KAAO,CACL,IAAMI,EAAWzB,EAAKU,SAASgB,SAAW,OAC1CX,EAAW,KACXf,EAAKK,OAAS,QACdL,EAAKU,SAAWV,EAAKU,SAASgB,SAAW,OACzC,GAAI5D,EAAe,CACjBA,GAAAA,UAAAA,EAAAA,EAAgB2D,EAClB,KAAO,MACAC,EAAQhE,MAAM,YACrB,CACF,CACF,CACF,IACA,GAAIqD,EAAU,CACZ9B,EAAa0B,GAAAA,OAAKE,GACpB,CACAhD,GAAAA,UAAAA,EAAAA,EAAWiD,IAGb,IAAMa,EAAiBC,EAAMC,gBAAe,SAACC,GAC3C,IAAMjB,EAAWiB,EAAKjB,SACtB,GAAIiB,EAAK9E,KAAKqD,SAAW,OAAQ,CAC/B,IAAMS,EAAWH,GAAAA,OAAOmB,EAAKjB,UAC7B,IAAMkB,EAAWjB,EAAYf,QAAO,SAACC,GAAI,OAAKA,EAAKK,SAAW,QAAUL,EAAK,iBAE7E,IAAMgC,EAAUD,EAASxB,SAAWO,EAAYP,OAChD,GAAIyB,EAAS,CACXpB,EAAeE,EACjB,CACAmB,GAAU,WAAA,OAAMhD,EAAc6B,MAC9B,MACD,MAAM,GAAIgB,EAAK9E,KAAKqD,SAAW,UAAW,CACzC,IAAMjB,EAAM0C,EAAK9E,KAAKoC,IACtB,IAAM8C,EAAa1C,IAAcE,aAASiB,OAAOnB,GAAa,GAC9D,IAAM2C,EAAcD,EAAWE,WAAU,SAACpC,GACxC,IAAMqC,EAAUrC,EAAKd,EAAWE,MAAQY,EAAKZ,IAC7C,OAAOiD,IAAYjD,CACrB,IACA,GAAI+C,GAAe,EAAG,CACpBD,EAAWI,OAAOH,EAAa,EACjC,CACAtE,GAAAA,UAAAA,EAAAA,EAAWqE,EACZ,MAAM,GAAIJ,EAAK9E,KAAKqD,SAAW,QAAS,CACvC,GAAIvC,EAAe,CACjBA,GACF,KAAO,MACA4D,EAAQhE,MAAM,YACrB,CACF,CAEAuB,EAAa0B,GAAAA,OAAKE,IAClBjD,EAAM+D,gBAAN/D,UAAAA,EAAAA,EAAM+D,eAAiBG,EACzB,IAEA,IAAMS,EAAc9C,GAAQ,WAC1B,GAAInB,EAAWkE,WAAa9C,YAAczB,EAAa,OAAO,MAC9D,GAAIK,EAAWkE,WAAa,EAAG,OAAO,KACtC,GAAIxD,GAAcA,EAAWuB,QAAUjC,EAAWkE,SAAU,OAAO,KACnE,OAAO,KACR,GAAE,CAACvE,EAAaK,EAAWkE,SAAUxD,IAEtC,IAAMyD,EAAe,SAAfA,EAAgBC,EAAO7B,GAC3B,GAAI3C,IAAe,MAAO,CACxB,IAAMsE,EAAWlE,EAAWkE,SAC5B,IAAIG,KAAShC,OAAQnB,GAAa,GAAQqB,GAC1C,IAAI+B,KAAejC,OAAQ3B,GAAc,GAAQ6B,GACjD,GAAI2B,IAAa9C,WAAa8C,IAAa,KAAM,CAC/C,GAAIG,EAAUpC,OAASiC,EAAU,CAC/BG,EAAYA,EAAUE,MAAMF,EAAUpC,OAASiC,GAC/CI,EAAkBA,EAAgBC,MAAMD,EAAgBrC,OAASiC,EACnE,CACF,CACAvD,EAAc2D,GACdhF,EAAMC,UAAND,UAAAA,EAAAA,EAAMC,SAAW8E,GACjB,OAAO,KACT,CACA,OAAO,MAGT,IAAMG,EAAgB,SAAhBA,EAAuB9F,GAAP,OAAA,IAAAC,SAAA,SAAA8F,EAAAC,GAAA,IACd3D,EACA4D,EACAC,EAFA7D,EAAOrC,EAAKqC,MAAQ,GACpB4D,EAAY5D,EAAKwD,MAAMxD,EAAK8D,YAAY,KAAO,GAC/CD,EAAezE,GAAAA,UAAAA,EAAAA,EAAsB2E,MAAK,SAACpD,GAC/C,OAAOA,EAAKqD,sBAAwBJ,EAAUI,mBAChD,IACA,GAAIH,EAAc,CAChB,IAAKlG,EAAKsC,MAAQtC,EAAKsG,QAAS,CACf,OAAArG,QAAAC,QAAMH,EAAUC,EAAKuG,gBAArBC,KA3SvB,SAAAC,GAAA,IA2SQzG,EAAKsG,QAAUG,EAAoC,OA3S3DC,EAAGC,KAAIC,KAAE,CAAC,MAAAC,GAAW,OAAOb,EAAAa,EAAM,CAAC,EAAhCC,KAAKF,MAAKZ,EA4SP,CAAC,SAAAU,IACD5E,EAAgB9B,EAAKsC,KAAQtC,EAAKsG,SAAoB,OA7S5DS,EAAGJ,KAAIC,KAAI,CAAA,OAAXF,EAAGC,KAAIC,KA8SH,KAAO,CACLI,EAAchH,EAAKsC,KAAe,OA/SxCyE,EAAGJ,KAAIC,KAgTH,CAAC,SAAAG,IAAA,OAAAhB,GAAA,CAAA,GACF,EAED,OACEkB,EAACC,EAAQ,CAAAC,SACPC,CAAAA,EAACC,EAAM7C,EAAA,CACLiB,aAAcA,EACd6B,UAAWnG,EAAqB2E,EAAgBpD,UAChD6E,eAAc,KACdC,WAAY,SAAAA,EAACC,EAAYzH,EAAM6D,GAC7B,IAAKxC,IAAiBA,EAAakC,OAAQ,OAAOkE,EAClD,IAAMC,GAAepG,EAAWqG,SAAW,EAAI,GAAC,IAAItG,EAAakC,OACjE,OACE6D,EAAA,MAAA,CACEQ,UAAWC,EACT,qCAAoC,oCACAH,GAEtCI,MAAO,CAAEC,OAAQ,QAASZ,SAEzBa,EAAaP,EAAY,CACxBN,SAAU,CACRM,EAAW7G,MAAMuG,SACjBC,EAAA,MAAA,CAAyBQ,UAAU,mCAAkCT,SAClE9F,EAAaoC,KAAI,SAACT,EAAMiF,GACvB,OACEb,EAACc,EAAa,CAEZ3F,KAAK,QACL4F,KAAK,OACLC,KAAMpF,EAAKoF,KACXC,QAASrF,EAAKqF,QAAQvB,KAAK,KAAM9G,EAAM6D,IAJlCoE,OAJJ,kBAaTlF,OAAOuF,YAIjB,GACIhH,EAAU,CACdT,SAAU8D,EACVd,SAAU7B,EACV4F,UAAWC,EAAW,mBAAoBvG,EAAWsG,WAAWT,SAE/D7F,EAAWqG,UAAYpC,EAAc,KACpC6B,EAACmB,EAAa,CAACvH,YAAaA,EAAawH,SAAUlH,EAAWkH,SAASrB,SACpEvG,EAAMuG,cAIZtF,EACCuF,EAACqB,EAAK,CACJC,aAAc,CAAEC,QAAS,QACzBrC,QAAS,CACPsC,UAAW/G,EACXgH,gBAAiB,SAAAA,IAAA,OAAM/G,EAAgBY,UAAU,EACjDoG,gBAAiB,SAAAA,EAACF,GAAO,OAAMA,GAAW9G,EAAgB,GAAG,GAE/DiH,IAAKlH,IAEL,OAGV,EAEA,IAAM0G,EAAgB,SAAhBA,EAAiB3H,GAKrB,GAAIA,EAAMuG,SAAU,OAAOC,EAACF,EAAQ,CAAAC,SAAEvG,EAAMuG,WAC5C,GAAIvG,EAAM4H,WAAa,eAAgB,CACrC,OACEvB,EAAA,MAAA,CAAAE,UACEC,EAAA4B,EAAe,CAAA,GACf5B,EAAA,MAAA,CAAKU,MAAO,CAAEmB,UAAW,GAAI9B,SAAEvG,EAAMI,aAAe,WAG1D,CACA,GAAIJ,EAAM4H,WAAa,UAAW,CAChC,OACEpB,EAAC8B,EAAM,CAACf,KAAK,UAAUgB,MAAK,KAAAhC,SACzBvG,EAAMI,aAAe,UAG5B,CACA,OACEoG,EAAC8B,EAAM,CAACf,KAAK,UAAUgB,MAAK,KAAAhC,SACzBvG,EAAMI,aAAe,UAG5B"}
|
package/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/// <reference types="scheduler" />
|
|
4
4
|
|
|
5
5
|
import { API, ModelType } from '@dimjs/model';
|
|
6
|
-
import { DateFormatType, TAny, TNoopDefine, TPlainObject } from '@flatbiz/utils';
|
|
6
|
+
import { DateFormatType, LabelValueItem, TAny, TNoopDefine, TPlainObject } from '@flatbiz/utils';
|
|
7
7
|
import { IAllProps } from '@tinymce/tinymce-react';
|
|
8
8
|
import { AlertProps, ButtonProps, CardProps, CascaderProps, CheckboxProps, CollapseProps, ColorPickerProps, DrawerProps, DropdownProps, FormInstance, FormItemProps, FormListFieldData, FormListOperation, FormProps, InputNumberProps, InputProps, MentionProps, ModalProps, PaginationProps, PopconfirmProps, PopoverProps, RadioGroupProps, RowProps, SelectProps, SpaceProps, SwitchProps, TableProps, TabsProps, TagProps, TimePickerProps, TimeRangePickerProps, TooltipProps, TreeProps, TreeSelectProps, UploadProps } from 'antd';
|
|
9
9
|
import { ConfigProviderProps } from 'antd/es/config-provider';
|
|
@@ -388,7 +388,10 @@ export declare const BoxGrid: {
|
|
|
388
388
|
*/
|
|
389
389
|
Row: import("react").FC<BoxRowProps & ICommonReact>;
|
|
390
390
|
/**
|
|
391
|
-
*
|
|
391
|
+
* 网格响应式布局,
|
|
392
|
+
* 默认值:
|
|
393
|
+
* { xs: 24, sm: 12, md: 12, lg: 8, xl: 8, xxl: 6 }
|
|
394
|
+
* xs={24} sm={12} md={12} lg={8} xl={8} xxl={6}
|
|
392
395
|
*```
|
|
393
396
|
* 1. 设置 span 栅格占位格数,0 ~ 24
|
|
394
397
|
* 2. grid 自定义响应式网格布局
|
|
@@ -510,7 +513,7 @@ export interface DropdownMenuItem extends ButtonProps {
|
|
|
510
513
|
onClick?: (event: React.MouseEvent<HTMLElement>) => void | Promise<void>;
|
|
511
514
|
permission?: string;
|
|
512
515
|
needConfirm?: boolean;
|
|
513
|
-
confirmMessage?:
|
|
516
|
+
confirmMessage?: ReactNode;
|
|
514
517
|
hidden?: boolean;
|
|
515
518
|
confirmModalProps?: DialogModalProps;
|
|
516
519
|
stopPropagation?: boolean;
|
|
@@ -542,7 +545,7 @@ export interface ButtonOperateItem extends ButtonWrapperProps {
|
|
|
542
545
|
/** 是否需要二次弹框确认 */
|
|
543
546
|
needConfirm?: boolean;
|
|
544
547
|
/** 二次弹框确认文案 */
|
|
545
|
-
confirmMessage?:
|
|
548
|
+
confirmMessage?: ReactNode;
|
|
546
549
|
popconfirmProps?: Pick<PopconfirmProps, "placement" | "okText" | "cancelText" | "trigger">;
|
|
547
550
|
/** 是否折叠合拢 */
|
|
548
551
|
isFold?: boolean;
|
|
@@ -696,22 +699,30 @@ export type CascaderWrapperProps = Omit<CascaderProps<TAny>, "loading" | "notFou
|
|
|
696
699
|
* 是否动态加载选项
|
|
697
700
|
*/
|
|
698
701
|
isDynamicLoad?: boolean;
|
|
699
|
-
value?: string | number;
|
|
700
|
-
onChange?: (value?: string | number
|
|
702
|
+
value?: string | number | Array<string | number> | LabelValueItem | LabelValueItem[];
|
|
703
|
+
onChange?: (value?: string | number | Array<string | number>, selectedList?: TPlainObject[]) => void;
|
|
701
704
|
requestMessageConfig?: TRequestStatusProps["messageConfig"];
|
|
705
|
+
/**
|
|
706
|
+
* 选择数据响应类型(当用户选中后响应数据),默认值:last
|
|
707
|
+
* ```
|
|
708
|
+
* 1. last 响应选中的最后一级数据
|
|
709
|
+
* 2. all 响应选中的多级数据
|
|
710
|
+
* ```
|
|
711
|
+
*/
|
|
712
|
+
responseType?: "last" | "all";
|
|
713
|
+
/** 响应数据是否包含label、value */
|
|
714
|
+
labelInValue?: boolean;
|
|
702
715
|
};
|
|
703
716
|
export type CascaderWrapperRefApi = {
|
|
704
717
|
getCascaderList: () => TPlainObject[];
|
|
705
718
|
};
|
|
706
719
|
/**
|
|
707
|
-
*
|
|
708
|
-
* @param props
|
|
709
|
-
* @returns
|
|
720
|
+
* 级联选择器包装组件
|
|
710
721
|
* ```
|
|
711
722
|
* 1. 数据源中 value 不能重复
|
|
712
723
|
* 2. 不支持多选
|
|
713
724
|
* 3. modelKey的配置是为了缓存数据,只缓存初始化数据,如果isDynamicLoad=true,动态获取的数据不再缓存
|
|
714
|
-
* 4. onChange操作第一个参数返回叶子节点value
|
|
725
|
+
* 4. onChange操作第一个参数返回叶子节点value(可配置返回多级),第二个参数返回选中的多级数据
|
|
715
726
|
* 5. isDynamicLoad=true 会在请求中添加当前选中option的fieldNames.value为key的数据
|
|
716
727
|
* ```
|
|
717
728
|
*/
|
|
@@ -742,9 +753,19 @@ export declare const CascaderWrapper: import("react").ForwardRefExoticComponent<
|
|
|
742
753
|
* 是否动态加载选项
|
|
743
754
|
*/
|
|
744
755
|
isDynamicLoad?: boolean | undefined;
|
|
745
|
-
value?: string | number | undefined;
|
|
746
|
-
onChange?: ((value?: string | number
|
|
756
|
+
value?: string | number | (string | number)[] | LabelValueItem | LabelValueItem[] | undefined;
|
|
757
|
+
onChange?: ((value?: string | number | Array<string | number>, selectedList?: TPlainObject[]) => void) | undefined;
|
|
747
758
|
requestMessageConfig?: TRequestStatusProps["messageConfig"];
|
|
759
|
+
/**
|
|
760
|
+
* 选择数据响应类型(当用户选中后响应数据),默认值:last
|
|
761
|
+
* ```
|
|
762
|
+
* 1. last 响应选中的最后一级数据
|
|
763
|
+
* 2. all 响应选中的多级数据
|
|
764
|
+
* ```
|
|
765
|
+
*/
|
|
766
|
+
responseType?: "all" | "last" | undefined;
|
|
767
|
+
/** 响应数据是否包含label、value */
|
|
768
|
+
labelInValue?: boolean | undefined;
|
|
748
769
|
} & import("react").RefAttributes<CascaderWrapperRefApi>>;
|
|
749
770
|
export interface CommonPropsWithChildren<S extends TPlainObject = TPlainObject> {
|
|
750
771
|
className?: string;
|
|
@@ -1907,6 +1928,8 @@ export type UploadWrapperProps<T extends TPlainObject = TPlainObject> = {
|
|
|
1907
1928
|
uid: string;
|
|
1908
1929
|
name?: string;
|
|
1909
1930
|
url?: string;
|
|
1931
|
+
/** 文件大小 */
|
|
1932
|
+
size?: string | number;
|
|
1910
1933
|
};
|
|
1911
1934
|
/**
|
|
1912
1935
|
* 接口响应数据适配器,如果配置了fieldNames,适配器返回值会再进过fieldNames转换
|
|
@@ -1923,6 +1946,20 @@ export type UploadWrapperProps<T extends TPlainObject = TPlainObject> = {
|
|
|
1923
1946
|
* ```
|
|
1924
1947
|
*/
|
|
1925
1948
|
autoSubmit?: boolean;
|
|
1949
|
+
/** 图片预览开关, 重写 onPreview 方法后失效 */
|
|
1950
|
+
imagePreviewSwitch?: boolean;
|
|
1951
|
+
/** 图片预览文件类型,默认:['png', 'jpg', 'jpeg', 'gif'] */
|
|
1952
|
+
imagePreviewAccept?: string[];
|
|
1953
|
+
/**
|
|
1954
|
+
* 配置文件额外操作
|
|
1955
|
+
* ```
|
|
1956
|
+
* 额外操作超过两项后,listType为 picture-card、picture-circle 时会出现显示异常,需要自行修改覆盖样式
|
|
1957
|
+
* ```
|
|
1958
|
+
*/
|
|
1959
|
+
extraOperate?: {
|
|
1960
|
+
icon: ReactElement;
|
|
1961
|
+
onClick: (file: UploadFile, fileList: UploadFile[], e: any) => void;
|
|
1962
|
+
}[];
|
|
1926
1963
|
} & Omit<UploadProps, "onChange" | "fileList">;
|
|
1927
1964
|
/**
|
|
1928
1965
|
* 文件上传
|
|
@@ -1952,7 +1989,15 @@ export type UploadWrapperProps<T extends TPlainObject = TPlainObject> = {
|
|
|
1952
1989
|
* name(非必填): 'image.png',
|
|
1953
1990
|
* url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
|
|
1954
1991
|
* }]
|
|
1955
|
-
* 其中 uid、name、url 可为其他命名,通过 fieldNames
|
|
1992
|
+
* 1. 其中 uid、name、url 可为其他命名,通过 fieldNames 进行映射即可,
|
|
1993
|
+
* 2. 其他需要的字段可在对象中添加 responseData 对象
|
|
1994
|
+
* 例如:
|
|
1995
|
+
* [{
|
|
1996
|
+
* uid: '唯一值',
|
|
1997
|
+
* name(非必填): 'image.png',
|
|
1998
|
+
* url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
|
|
1999
|
+
* responseData: { 'xx':'xxx' }
|
|
2000
|
+
* }]
|
|
1956
2001
|
* ```
|
|
1957
2002
|
*
|
|
1958
2003
|
*/
|
|
@@ -2709,6 +2754,8 @@ export type TEasyTableTableColumn<T> = ColumnsType<T>[0] & {
|
|
|
2709
2754
|
* ```
|
|
2710
2755
|
*/
|
|
2711
2756
|
asyncRender?: (value: TAny, record: T, index: number, respData?: TAny) => React.ReactNode;
|
|
2757
|
+
/** 设置默认值,当数据为undefined、null时显示;自定义render后失效 */
|
|
2758
|
+
defaultValue?: string;
|
|
2712
2759
|
};
|
|
2713
2760
|
export type EasyTableServiceConfig = {
|
|
2714
2761
|
/** 接口配置 */
|
|
@@ -2812,7 +2859,7 @@ export type EasyTableProps = {
|
|
|
2812
2859
|
onFormFinish?: (values?: TPlainObject) => void;
|
|
2813
2860
|
/** 在父节点高度下,上下铺满;默认值:true */
|
|
2814
2861
|
isFull?: boolean;
|
|
2815
|
-
/**
|
|
2862
|
+
/** 查询条件固定,不随滚动条滚动, 屏幕尺寸为xs时失效 */
|
|
2816
2863
|
filterFixed?: boolean;
|
|
2817
2864
|
/** 分页区域固定,不随滚动条滚动 */
|
|
2818
2865
|
paginationFixed?: boolean;
|
|
@@ -4090,6 +4137,8 @@ export type LabelValueRenderProps = {
|
|
|
4090
4137
|
number,
|
|
4091
4138
|
number
|
|
4092
4139
|
];
|
|
4140
|
+
/** 隐藏 value hover效果 */
|
|
4141
|
+
hiddenValueHover?: boolean;
|
|
4093
4142
|
};
|
|
4094
4143
|
/**
|
|
4095
4144
|
* label+value 列表布局
|
|
@@ -4143,6 +4192,10 @@ export interface LocalLoadingProps {
|
|
|
4143
4192
|
showRequiredError?: boolean;
|
|
4144
4193
|
/** 自定义异常渲染处理 */
|
|
4145
4194
|
errorRender?: (error?: TAny) => ReactElement;
|
|
4195
|
+
/** 设置内部滚动,需要设置 style.height 才能生效,@5.0.16 */
|
|
4196
|
+
contentScroll?: boolean;
|
|
4197
|
+
/** 设置高度 */
|
|
4198
|
+
height?: number | string;
|
|
4146
4199
|
}
|
|
4147
4200
|
export type LocalLoadingRefApi = {
|
|
4148
4201
|
onRefresh: (params?: TPlainObject) => void;
|
|
@@ -4553,6 +4606,8 @@ export type CustomRadioGroupProps = {
|
|
|
4553
4606
|
/** 是否可取消选中,默认:false */
|
|
4554
4607
|
isCancel?: boolean;
|
|
4555
4608
|
disabled?: boolean;
|
|
4609
|
+
/**方向,默认值 horizontal */
|
|
4610
|
+
direction?: "horizontal" | "vertical";
|
|
4556
4611
|
};
|
|
4557
4612
|
/**
|
|
4558
4613
|
* RadioGroupWrapper 为了解决 RadioGroup 组件不能取消选中问题
|
|
@@ -5468,6 +5523,20 @@ export type TableTitleTooltipProps = {
|
|
|
5468
5523
|
* @deprecated 已过期,请使用 TipsWrapper 组件
|
|
5469
5524
|
*/
|
|
5470
5525
|
export declare const TableTitleTooltip: (props: TableTitleTooltipProps) => import("react/jsx-runtime").JSX.Element;
|
|
5526
|
+
export type TabsStickyProps = {
|
|
5527
|
+
tabsProps: Omit<TabsProps, "tabPosition">;
|
|
5528
|
+
/** tabs头部布局 */
|
|
5529
|
+
headerRender?: ReactElement;
|
|
5530
|
+
/** 点击tabItem后,tab跳到顶部吸顶效果;默认值true */
|
|
5531
|
+
clickTabToTop?: boolean;
|
|
5532
|
+
};
|
|
5533
|
+
/**
|
|
5534
|
+
* Tabs吸顶组件
|
|
5535
|
+
* ```
|
|
5536
|
+
* 1. 组件根节点设置了 height: 100%、overflow: auto;所以外部包裹元素必须要有高度
|
|
5537
|
+
* ```
|
|
5538
|
+
*/
|
|
5539
|
+
export declare const TabsSticky: (props: TabsStickyProps) => import("react/jsx-runtime").JSX.Element;
|
|
5471
5540
|
export type TabsWrapperProps = TabsProps & {
|
|
5472
5541
|
/**
|
|
5473
5542
|
* Tabs Header 提供 Sticky 效果,默认值:true
|
|
@@ -6065,13 +6134,10 @@ export type TreeModelSelectItem = {
|
|
|
6065
6134
|
value: string | number;
|
|
6066
6135
|
};
|
|
6067
6136
|
export type TreeModelSelectValue = TreeModelSelectItem[] | Array<TreeModelSelectItem["value"]> | TreeModelSelectItem["value"];
|
|
6068
|
-
export type
|
|
6137
|
+
export type TreeModalContentProps = {
|
|
6069
6138
|
/** 是否多选,默认值:true */
|
|
6070
6139
|
isMultiple?: boolean;
|
|
6071
6140
|
forceRender?: boolean;
|
|
6072
|
-
children: ReactElement & {
|
|
6073
|
-
onClick?: (e: any) => void | Promise<void>;
|
|
6074
|
-
};
|
|
6075
6141
|
/**
|
|
6076
6142
|
* 内置尺寸,根据比例固定高度、宽度,默认:large
|
|
6077
6143
|
*/
|
|
@@ -6093,22 +6159,20 @@ export type TreeModalProps = {
|
|
|
6093
6159
|
/** 选择数量提示,例如:已选择{total}位用户 */
|
|
6094
6160
|
selectQuantityPrompt?: string;
|
|
6095
6161
|
};
|
|
6096
|
-
|
|
6097
|
-
|
|
6098
|
-
|
|
6162
|
+
onDataSourceChange?: (treeDataList: TPlainObject[], mapData: TPlainObject) => void;
|
|
6163
|
+
treeProps?: Pick<TreeWrapperProps, "showSearch" | "searchResultType" | "searchPlaceholder" | "searchValue" | "loadDataFlag" | "loadDataServiceConfig" | "icon" | "disabledCanUse" | "treeItemDataAdapter" | "searchExtraElement" | "initRootExpand" | "searchResultType" | "labelRender" | "customSearchRule" | "checkableType" | "checkStrictly" | "defaultExpandAll">;
|
|
6164
|
+
};
|
|
6165
|
+
export type TreeModalProps = TreeModalContentProps & {
|
|
6166
|
+
children: ReactElement & {
|
|
6167
|
+
onClick?: (e: any) => void | Promise<void>;
|
|
6168
|
+
};
|
|
6099
6169
|
modalClassName?: string;
|
|
6100
6170
|
modalWidth?: number;
|
|
6101
6171
|
modalBodyHeight?: number;
|
|
6102
|
-
treeProps?: Pick<TreeWrapperProps, "showSearch" | "searchResultType" | "searchPlaceholder" | "searchValue" | "loadDataFlag" | "loadDataServiceConfig" | "icon" | "disabledCanUse" | "treeItemDataAdapter" | "searchExtraElement" | "initRootExpand" | "searchResultType" | "labelRender" | "customSearchRule" | "checkableType">;
|
|
6103
6172
|
};
|
|
6104
|
-
|
|
6105
|
-
|
|
6106
|
-
|
|
6107
|
-
* 1. 可通过 treeProps.checkableType 配置多选节点模式(包括返回所有节点、只返回叶子节点、叶子节点&父节点全选只返回父节点),默认只返回叶子节点
|
|
6108
|
-
* 2. demo: https://fex.qa.tcshuke.com/docs/admin/main/selector/tree
|
|
6109
|
-
* ```
|
|
6110
|
-
*/
|
|
6111
|
-
export declare const TreeModal: (props: TreeModalProps) => import("react/jsx-runtime").JSX.Element;
|
|
6173
|
+
export declare const TreeModal: ((props: TreeModalProps) => import("react/jsx-runtime").JSX.Element) & {
|
|
6174
|
+
Content: (props: TreeModalContentProps) => import("react/jsx-runtime").JSX.Element;
|
|
6175
|
+
};
|
|
6112
6176
|
export type TreeModalSelectorProps = Omit<TreeModalProps, "children" | "forceRender" | "onChange"> & {
|
|
6113
6177
|
placeholder?: string;
|
|
6114
6178
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flatbiz/antd",
|
|
3
|
-
"version": "4.5.
|
|
3
|
+
"version": "4.5.35",
|
|
4
4
|
"description": "flat-biz ui components",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"typings": "index.d.ts",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"@dimjs/model": ">=1.2.3",
|
|
32
32
|
"@dimjs/model-react": ">=1.2.3",
|
|
33
33
|
"@dimjs/utils": ">=1.5.1",
|
|
34
|
-
"@flatbiz/utils": ">=4.0.
|
|
34
|
+
"@flatbiz/utils": ">=4.0.32",
|
|
35
35
|
"@wove/react": ">=1.2.23",
|
|
36
36
|
"antd": ">=5.11.0",
|
|
37
37
|
"dayjs": ">=1.11.9",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@dimjs/model": "^1.2.3",
|
|
46
46
|
"@dimjs/model-react": "^1.2.3",
|
|
47
47
|
"@dimjs/utils": "^1.5.1",
|
|
48
|
-
"@flatbiz/utils": "^4.0.
|
|
48
|
+
"@flatbiz/utils": "^4.0.32",
|
|
49
49
|
"@wove/react": "^1.2.23",
|
|
50
50
|
"antd": "5.11.0",
|
|
51
51
|
"dayjs": "1.11.9",
|