hlyc-web-pack 4.0.0-beta.3 → 4.0.0-beta.4
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/lib/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../components/brother/hooks/useUpdateEffect/index.ts","../components/brother/hooks/index.ts","../components/brother/hooks/useSetState/index.ts","../components/brother/hooks/useDeepCompareEffect/index.ts","../components/brother/hooks/useMount/index.ts","../components/brother/hooks/useUnmount/index.ts","../components/brother/hooks/useMethods/index.ts","../components/brother/hooks/useToggle/index.ts","../components/brother/hooks/useLatest/index.ts","../components/Affix/index.tsx","../components/brother/utils/index.ts","../components/brother/ConfigProvider/index.tsx","../components/Dialog/index.tsx","../components/GaoDeMap/index.tsx","../components/Upload/index.tsx","../components/TreeNode/index.tsx","../components/GenerateForm/index.tsx","../node_modules/.pnpm/immutability-helper@3.1.1/node_modules/immutability-helper/index.js","../components/GenerateTable/ResizableTitle/index.tsx","../components/GenerateTable/EditableCell/index.tsx","../components/brother/DndWrap/index.tsx","../components/GenerateTable/index.tsx","../components/Empty/index.tsx","../components/LayoutTableModal/index.tsx","../components/QuicklyProcessForms/index.tsx","../components/LayoutFormModal/index.tsx","../components/IconSelectionModal/index.tsx","../components/VirtualList/index.tsx","../components/ButtonGroup/index.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef } from 'react';\n\ntype effectHookType = typeof useEffect | typeof useLayoutEffect;\n\nconst createUpdateEffect: (hook: effectHookType) => effectHookType = (hook) => (effect, deps) => {\n const isMounted = useRef(false);\n\n // for react-refresh\n hook(() => {\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n hook(() => {\n if (!isMounted.current) {\n isMounted.current = true;\n } else {\n return effect();\n }\n }, deps);\n};\n\nexport default createUpdateEffect(useEffect);\n","import useSetState from './useSetState';\nimport useDeepCompareEffect from './useDeepCompareEffect';\nimport useUpdateEffect from './useUpdateEffect';\nimport useMemoizedFn from './useUpdateEffect';\nimport useMount from './useMount';\nimport useUnmount from './useUnmount';\nimport useMethods from './useMethods';\nimport useToggle from './useToggle';\nimport useLatest from './useLatest';\n\nexport default {\n useSetState,\n useDeepCompareEffect,\n useUpdateEffect,\n useMemoizedFn,\n useMount,\n useUnmount,\n useMethods,\n useToggle,\n useLatest,\n};\n","import { useCallback, useState } from 'react';\n\nconst useSetState = <T extends object>(\n initialState: T = {} as T,\n): [T, (patch: Partial<T> | ((prevState: T) => Partial<T>)) => void] => {\n const [state, setState] = useState<T>(initialState);\n const setMergeState = useCallback((patch: Partial<T> | ((prevState: T) => Partial<T>)) => {\n setState((prevState) => {\n return Object.assign({}, prevState, patch instanceof Function ? patch(prevState) : patch);\n });\n }, []);\n return [state, setMergeState];\n};\n\nexport default useSetState;\n","import * as React from 'react';\nimport _ from 'lodash';\n\ntype UseEffectParams = Parameters<typeof React.useEffect>;\ntype EffectCallback = UseEffectParams[0];\ntype DependencyList = UseEffectParams[1];\ntype UseEffectReturn = ReturnType<typeof React.useEffect>;\n\nfunction checkDeps(deps: DependencyList) {\n if (!deps || !deps.length) {\n throw new Error('useDeepCompareEffect不应在没有依赖性的情况下使用。 使用React.useEffect代替。');\n }\n if (deps.every(isPrimitive)) {\n throw new Error(\n 'useDeepCompareEffect不应与都是原始值的依赖项一起使用。 使用React.useEffect代替。',\n );\n }\n}\n\nfunction isPrimitive(val: unknown) {\n return val == null || /^[sbn]/.test(typeof val);\n}\n\nfunction useDeepCompareMemoize(value: DependencyList) {\n const ref = React.useRef<DependencyList>();\n const signalRef = React.useRef<number>(0);\n\n if (!_.isEqual(value, ref.current)) {\n ref.current = value;\n signalRef.current += 1;\n }\n\n return [signalRef.current];\n}\n\nconst __DEV__ = process.env.NODE_ENV === 'development';\n\nfunction useDeepCompareEffect(\n callback: EffectCallback,\n dependencies: DependencyList,\n): UseEffectReturn {\n\n if (__DEV__) {\n checkDeps(dependencies);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return React.useEffect(callback, useDeepCompareMemoize(dependencies));\n}\n\nexport default useDeepCompareEffect;\n","import { useEffect } from 'react';\n\nconst __DEV__ = process.env.NODE_ENV === 'development';\n\nconst useMount = (fn: () => void) => {\n if (__DEV__) {\n if (typeof fn !== 'function') {\n console.error(\n `useMount: parameter \\`fn\\` expected to be a function, but got \"${typeof fn}\".`,\n );\n }\n }\n\n useEffect(() => {\n fn();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n};\n\nexport default useMount;\n","import { useEffect, useRef } from 'react';\n\nconst __DEV__ = process.env.NODE_ENV === 'development';\n\nconst useUnmount = (fn: () => void) => {\n if (__DEV__) {\n if (typeof fn !== 'function') {\n console.error(`useUnmount expected parameter is a function, got ${typeof fn}`);\n }\n }\n\n const fnRef = useRef(fn);\n\n useEffect(\n () => () => {\n fnRef.current();\n },\n [],\n );\n};\n\nexport default useUnmount;\n","import React from 'react';\n\nfunction useMethods<T extends Record<string, (...args: any[]) => any>>(methods: T) {\n const { current } = React.useRef({\n methods,\n func: undefined as T | undefined,\n });\n current.methods = methods;\n\n // 只初始化一次\n if (!current.func) {\n const func = Object.create(null);\n Object.keys(methods).forEach((key) => {\n // 包裹 function 转发调用最新的 methods\n func[key] = (...args: unknown[]) => current.methods[key].call(current.methods, ...args);\n });\n // 返回给使用方的变量\n current.func = func;\n }\n\n return current.func as T;\n}\n\nexport default useMethods;\n","import { useMemo, useState } from 'react';\n\nexport interface Actions<T> {\n setLeft: () => void;\n setRight: () => void;\n set: (value: T) => void;\n toggle: () => void;\n}\n\nfunction useToggle<T = boolean>(): [boolean, Actions<T>];\n\nfunction useToggle<T>(defaultValue: T): [T, Actions<T>];\n\nfunction useToggle<T, U>(defaultValue: T, reverseValue: U): [T | U, Actions<T | U>];\n\nfunction useToggle<D, R>(defaultValue: D = false as unknown as D, reverseValue?: R) {\n const [state, setState] = useState<D | R>(defaultValue);\n\n const actions = useMemo(() => {\n const reverseValueOrigin = (reverseValue === undefined ? !defaultValue : reverseValue) as D | R;\n\n const toggle = () => setState((s) => (s === defaultValue ? reverseValueOrigin : defaultValue));\n const set = (value: D | R) => setState(value);\n const setLeft = () => setState(defaultValue);\n const setRight = () => setState(reverseValueOrigin);\n\n return {\n toggle,\n set,\n setLeft,\n setRight,\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return [state, actions];\n}\n\nexport default useToggle;\n","import { useRef } from 'react';\n\nfunction useLatest<T>(value: T) {\n const ref = useRef(value);\n ref.current = value;\n\n return ref;\n}\n\nexport default useLatest;\n","/*\n * @Description 固钉\n * @Author bihongbin\n * @Date 2021-07-01 11:44:07\n * @LastEditors bihongbin\n * @LastEditTime 2023-04-11 14:22:35\n */\nimport React from 'react';\nimport { Affix as AffixBox } from 'antd';\nimport { AffixProps } from 'antd/es/affix';\n\ntype PropType = AffixProps & {\n targetId?: string;\n};\n\n/** 固钉,当内容区域比较长,需要滚动页面时,这部分内容对应的操作或者导航需要在滚动范围内始终展现 */\nconst Affix = (props: PropType) => {\n let formatProps = { ...props };\n let targetId = '';\n if (formatProps.targetId) {\n targetId = formatProps.targetId;\n delete formatProps.targetId;\n }\n\n return (\n <AffixBox\n target={() => {\n return document.getElementById(targetId || 'router-render') || window;\n }}\n {...formatProps}\n />\n );\n};\n\nexport default Affix;\n","import _ from 'lodash';\nimport { FormListType } from '../../GenerateForm';\nimport { SelectType, AnyObjectType } from '../../brother/typings';\n\n/**\n * @description 获取localStorage\n * @author bihongbin\n * @param {any} key\n * @return {*}\n * @Date 2023-07-12 10:37:20\n */\nexport const getStorage = (key: any) => {\n if (!key) {\n return null;\n }\n key = key.toString();\n const data = window.localStorage.getItem(key);\n try {\n return JSON.parse(data as any);\n } catch (error) {\n return data;\n }\n};\n\n/**\n * @description 设置localStorage\n * @author bihongbin\n * @param {any} key\n * @param {any} value\n * @return {*}\n * @Date 2023-07-12 10:37:33\n */\nexport const setStorage = (key: any, value: any) => {\n if (!key || !value) {\n return null;\n }\n key = key.toString();\n window.localStorage.setItem(key, JSON.stringify(value));\n};\n\n/**\n * @description 比较2个对象是否相等\n * @Author bihongbin\n * @return {*}\n * @Date 2023-07-07 14:11:02\n */\nexport const isEqualWithFunc = (o1: AnyObjectType, o2: AnyObjectType) => {\n return _.isEqualWith(o1, o2, (val1, val2) => {\n if (_.isFunction(val1) && _.isFunction(val2)) {\n return val1.toString() === val2.toString();\n }\n });\n};\n\n/**\n * @Description 组件是否重新渲染比较\n * @Author bihongbin\n * @Date 2021-08-26 14:10:48\n */\nexport const isEqualWith = (prevProps: any, nextProps: any) => {\n return isEqualWithFunc(prevProps, nextProps);\n};\n\n/**\n * @Description 检查数据类型是否符合\n * @Author bihongbin\n * @Date 2021-011-09 11:26:15\n */\nexport const typeofEqual = (data: {\n data: any;\n type: 'Object' | 'Array' | 'String' | 'Number';\n}) => {\n return Object.prototype.toString.call(data.data) === `[object ${data.type}]`;\n};\n\n/**\n * @Description 获取下拉菜单的对应值\n * @Author bihongbin\n * @Date 2021-11-11 15:00:30\n */\nexport const getSelectValue = (list: SelectType[], value: string | number) => {\n for (let item of list) {\n let v = item.value;\n if (typeof value === 'number') {\n v = parseInt(item.value as string);\n }\n if (v === value) {\n return item.label;\n }\n }\n return value;\n};\n\n/**\n * @Description 默认下拉菜单增加全部这一选项\n * @Author bihongbin\n * @Date 2020-11-06 13:57:22\n */\nexport const dropDownMenuPushAll = (data: FormListType[] | undefined) => {\n if (data) {\n return data.map((item) => {\n if (item.componentName === 'Select' && item.selectData && item.selectData.length) {\n if (!item.selectData.some((s) => s.label === '全部')) {\n item.selectData = [{ label: '全部', value: '' }, ...item.selectData];\n }\n }\n return item;\n });\n } else {\n return [];\n }\n};\n","import React, { useEffect } from 'react';\nimport { ConfigProvider } from 'antd';\nimport dayjs from 'dayjs';\nimport 'dayjs/locale/zh-cn';\nimport 'dayjs/locale/zh-hk';\nimport { getStorage } from '../../brother/utils';\n\ninterface PropTypes {\n children: React.ReactNode;\n}\n\ndayjs.locale('zh-cn');\n\nconst mapAntLocaleToDayjs = (antLocaleCode?: string) => {\n switch (antLocaleCode) {\n case 'zh_CN':\n dayjs.locale('zh-cn');\n break;\n case 'zh_HK':\n dayjs.locale('zh-hk');\n break;\n case 'en_US':\n dayjs.locale('en');\n break;\n default:\n // 保持现有或回退到中文\n dayjs.locale('zh-cn');\n break;\n }\n};\n\nconst mapStoreLangToDayjs = (lng?: string) => {\n switch (lng) {\n case 'zh-CN':\n dayjs.locale('zh-cn');\n break;\n case 'zh-HK':\n dayjs.locale('zh-hk');\n break;\n case 'en':\n dayjs.locale('en');\n break;\n default:\n break;\n }\n};\n\nconst Config = (props: PropTypes) => {\n // 从上层 antd ConfigProvider 读取上下文以继承 locale/theme\n const parentConfig = React.useContext(ConfigProvider.ConfigContext);\n\n // 初始化:若上层未提供,尝试根据存储设置 dayjs 语言\n useEffect(() => {\n if (parentConfig?.locale?.locale) {\n mapAntLocaleToDayjs(parentConfig.locale.locale as string);\n } else {\n mapStoreLangToDayjs(getStorage('i18nextLng'));\n }\n }, [parentConfig?.locale]);\n\n // 监听外部事件,仅同步 dayjs 语言,不覆盖 antd 配置\n useEffect(() => {\n const handler = (e: any) => {\n mapStoreLangToDayjs(e?.language);\n };\n window.addEventListener('web_pack:language', handler);\n return () => window.removeEventListener('web_pack:language', handler);\n }, []);\n\n // 不再包裹自己的 antd ConfigProvider,避免覆盖宿主项目设置\n return <>{props.children}</>;\n};\n\nexport default Config;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport Draggable, { DraggableEvent, DraggableData } from 'react-draggable';\nimport { Modal } from 'antd';\nimport ConfigProvider from '../brother/ConfigProvider';\nimport './index.less';\n\nlet dialogIndex = 1;\n\nexport type DialogPropType = any;\n\ninterface StateType {\n disabled: boolean;\n bounds: {\n left: number;\n top: number;\n bottom: number;\n right: number;\n };\n}\n\n/** 弹窗 */\nclass Dialog extends React.Component<DialogPropType, StateType> {\n static show(props: any): Dialog {\n let body = document.body;\n let host = document.createElement('div');\n let onOk = props && props.onOk;\n let onCancel = props && props.onCancel;\n let dialog;\n\n host.id = 'dialog-' + dialogIndex++;\n host.style.cssText = 'position:absolute;top:0;left:0;';\n body.appendChild(host);\n\n props = props || {};\n props.visible = true;\n props.getContainer = false;\n props.destroyOnClose = true;\n\n props.onOk = () => {\n onOk && onOk();\n body.removeChild(host);\n };\n\n props.onCancel = () => {\n onCancel && onCancel();\n body.removeChild(host);\n };\n\n ReactDOM.render(<Dialog {...props} ref={(ref) => (dialog = ref)}></Dialog>, host);\n\n return dialog as any;\n }\n\n static confirm(title: string, children: React.ReactNode, onOk: Function) {\n return Dialog.show({\n title,\n children,\n onOk,\n });\n }\n\n draggleRef: any;\n\n constructor(props: DialogPropType) {\n super(props);\n\n this.state = {\n disabled: true,\n bounds: { left: 0, top: 0, bottom: 0, right: 0 },\n };\n }\n\n onStart(event: DraggableEvent, uiData: DraggableData) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = this.draggleRef?.current?.getBoundingClientRect();\n\n this.setState({\n bounds: {\n left: -targetRect?.left + uiData?.x,\n right: clientWidth - (targetRect?.right - uiData?.x),\n top: -targetRect?.top + uiData?.y,\n bottom: clientHeight - (targetRect?.bottom - uiData?.y),\n },\n });\n }\n\n render() {\n let props = { ...this.props };\n let state = this.state;\n let open = props.visible;\n\n delete props.visible;\n\n return (\n <ConfigProvider>\n <Modal\n className=\"dialog\"\n maskClosable={false}\n {...props}\n open={open}\n title={\n <div\n style={{ cursor: 'move' }}\n onMouseOver={() => {\n this.setState({\n disabled: false,\n });\n }}\n onMouseOut={() => {\n this.setState({\n disabled: true,\n });\n }}\n // fix eslintjsx-a11y/mouse-events-have-key-events\n // https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/mouse-events-have-key-events.md\n onFocus={() => {}}\n onBlur={() => {}}\n // end\n >\n {props.title}\n </div>\n }\n modalRender={(modal) => (\n <Draggable\n disabled={state.disabled}\n bounds={state.bounds}\n onStart={(event, uiData) => this.onStart(event, uiData)}\n >\n <div ref={this.draggleRef}>{modal}</div>\n </Draggable>\n )}\n >\n {props.children}\n </Modal>\n </ConfigProvider>\n );\n }\n\n close(onOk?: boolean) {\n let props = this.props;\n\n if (onOk) {\n props.onOk && props.onOk();\n } else {\n props.onCancel && props.onCancel();\n }\n }\n}\n\nexport default Dialog;\n","/*\n * @Description 地图组件\n * @Author bihongbin\n * @Date 2020-12-03 16:34:09\n * @LastEditors liangjiaming\n * @LastEditTime 2024-12-10 15:17:35\n */\n\nimport React, {\n useEffect,\n useCallback,\n useMemo,\n useRef,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { v4 as uuidV4 } from 'uuid';\nimport './index.less';\n\ndeclare const BMap: any;\ndeclare const window: Window & { onMapInit?: () => void };\n\ninterface PropType {\n /** className */\n className?: string;\n /** style内联样式 */\n style?: React.CSSProperties;\n /** 关键字选中回调 */\n onChange?: (data: MapType) => void;\n}\n\nexport type positionType = [number, number];\n\nexport interface MapCallType {\n setMapCenter: (data: positionType, zoom?: number) => void;\n}\n\nexport interface MapType {\n address?: string;\n // 必要属性\n location: {\n lat: number;\n lng: number;\n };\n}\n\n/** 地图 */\nconst GaoDeMap = (props: PropType, ref: any) => {\n const mapRef = useRef<any>(null);\n const mapCenterLocRef = useRef<any>(null);\n const storageConversion = useRef<any>(null);\n\n /**\n * @Description 缓存生成的随机容器id\n * @Author bihongbin\n * @Date 2020-12-03 15:36:38\n */\n const uid = useMemo(() => uuidV4(), []);\n\n /**\n * @Description 缓存随机生成的搜索id\n * @Author bihongbin\n * @Date 2021-09-08 15:02:19\n */\n const suggestId = useMemo(() => uuidV4(), []);\n\n /**\n * @Description 百度和谷歌坐标相互转换\n * @Author bihongbin\n * @Date 2021-09-14 14:59:15\n */\n const coordinateConversion = (data: {\n point: any;\n target: 'baidu' | 'google';\n callback?: (data: { lat: number; lng: number }) => void;\n }) => {\n const COORDINATES_GCJ02 = 3; // GCJ02坐标\n const COORDINATES_BD09 = 5; // 百度bd09经纬度坐标\n let forward = 0;\n let rear = 0;\n const convertor = new BMap.Convertor();\n const pointArr = [];\n pointArr.push(data.point);\n // 谷歌转百度\n if (data.target === 'baidu') {\n forward = COORDINATES_GCJ02;\n rear = COORDINATES_BD09;\n }\n // 百度转谷歌\n if (data.target === 'google') {\n forward = COORDINATES_BD09;\n rear = COORDINATES_GCJ02;\n }\n convertor.translate(pointArr, forward, rear, (d: any) => {\n if (d.status === 0) {\n if (data.callback) {\n data.callback(d.points[0]);\n }\n }\n });\n };\n\n /**\n * @Description 创建添加覆盖物\n * @Author bihongbin\n * @Date 2021-09-09 10:01:42\n */\n const addMark = (point: any) => {\n mapRef.current.addOverlay(\n new BMap.Marker(point, {\n icon: new BMap.Icon(\n 'https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png',\n new BMap.Size(20, 32),\n ),\n }),\n );\n };\n\n /**\n * @Description 设置地图中心位置和层级\n * @Author bihongbin\n * @Date 2020-12-04 09:57:32\n */\n const setMapCenterLocation = useCallback((location: positionType, zoom?: number) => {\n if (mapRef.current) {\n // 坐标系\n const point = new BMap.Point(location[0], location[1]);\n // 添加覆盖物\n addMark(point);\n // 设置中心点和层级\n mapRef.current.centerAndZoom(point, zoom ? zoom : 18);\n } else {\n // 当地图实例不存在,记忆中心点和坐标\n mapCenterLocRef.current = {\n location,\n zoom,\n };\n }\n }, []);\n\n /**\n * @Description 设置地图选中地址以后的onChange回调\n * @Author bihongbin\n * @Date 2021-09-08 17:04:22\n */\n const setPropsOnChange = useCallback(\n (data: MapType) => {\n console.log('转换为google坐标前:', data.location);\n const point = new BMap.Point(data.location.lng, data.location.lat);\n // 转换为google坐标\n coordinateConversion({\n target: 'google',\n point,\n callback: (d) => {\n data.location.lng = d.lng;\n data.location.lat = d.lat;\n console.log('转换为google坐标后:', data.location);\n if (props.onChange) {\n props.onChange(data);\n }\n },\n });\n },\n [props],\n );\n\n /**\n * @Description 智能搜索设置地址\n * @Author bihongbin\n * @Date 2021-09-08 15:26:45\n * @param {*} useCallback\n */\n const setPlace = useCallback(\n (value: string) => {\n // 清除地图覆盖物\n mapRef.current.clearOverlays();\n // 智能搜索\n const local = new BMap.LocalSearch(mapRef.current, {\n onSearchComplete: () => {\n // 获取第一个智能搜索的结果\n let pp = local.getResults().getPoi(0);\n if (pp) {\n const point = pp.point;\n setMapCenterLocation([point.lng, point.lat]);\n setPropsOnChange({\n ...pp,\n location: {\n lng: point.lng,\n lat: point.lat,\n },\n });\n }\n },\n });\n local.search(value);\n },\n [setMapCenterLocation, setPropsOnChange],\n );\n\n /**\n * @Description 加载地图文件\n * @Author bihongbin\n * @Date 2020-12-03 15:44:04\n */\n useEffect(() => {\n const loadMap = () => {\n mapRef.current = new BMap.Map(uid, { enableMapClick: false });\n mapRef.current.enableScrollWheelZoom(true);\n\n // 注册关键字查询事件\n const ac = new BMap.Autocomplete({\n input: suggestId,\n location: mapRef.current,\n });\n\n // 关键字查询结果下拉列表点击事件\n ac.addEventListener('onconfirm', (e: any) => {\n const { province, city, district, street, business } = e.item.value;\n setPlace(province + city + district + street + business);\n });\n\n // 地图点击事件\n mapRef.current.addEventListener('click', (e: any) => {\n // 清除地图覆盖物\n mapRef.current.clearOverlays();\n // 添加覆盖物\n addMark(new BMap.Point(e.point.lng, e.point.lat));\n setPropsOnChange({\n location: {\n lng: e.point.lng,\n lat: e.point.lat,\n },\n });\n });\n\n if (storageConversion.current) {\n storageConversion.current();\n }\n\n if (mapCenterLocRef.current) {\n // 使用记忆的中心点和坐标\n setMapCenterLocation(mapCenterLocRef.current.location, mapCenterLocRef.current.zoom);\n } else {\n // 默认中国北京市天安门坐标\n setMapCenterLocation([116.404, 39.915]);\n }\n };\n if (document.getElementById('lbs')) {\n loadMap();\n } else {\n window.onMapInit = function () {\n loadMap();\n };\n let url =\n 'https://api.map.baidu.com/api?v=3.0&ak=1IzhwXLOwlEnencZUoSnMkSkMVADfT3s&callback=onMapInit';\n let jsApi = document.createElement('script');\n jsApi.src = url;\n jsApi.id = 'lbs';\n document.head.appendChild(jsApi);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uid]);\n\n /**\n * @Description 暴露方法给父组件使用\n * @Author bihongbin\n * @Date 2020-12-04 10:02:19\n */\n useImperativeHandle<any, MapCallType>(ref, () => ({\n // 根据经纬度设置地图中心点 data=[longitude, latitude]\n setMapCenter: (data, zoom) => {\n console.log('转换为百度坐标前:', {\n lng: data[0],\n lat: data[1],\n });\n const func = () => {\n const point = new BMap.Point(data[0], data[1]);\n // 转换为百度坐标\n coordinateConversion({\n target: 'baidu',\n point,\n callback: (d) => {\n console.log('转换为百度坐标后:', {\n lng: d.lng,\n lat: d.lat,\n });\n setMapCenterLocation([d.lng, d.lat], zoom);\n },\n });\n };\n // 这里写try catch防止BMap没有初始完成,就访问了BMap报错问题,把操作放在loadMap里执行\n try {\n func();\n } catch (error) {\n console.log('error', error);\n storageConversion.current = func;\n }\n },\n }));\n\n return (\n <div className={`gaoDe-container ${props.className}`}>\n <div id={uid} style={props.style ? props.style : { width: '100%', height: 365 }} />\n <div className=\"input-item-prepend\">\n <span className=\"input-group-wrapper\">\n <span className=\"input-group-addon\">关键字</span>\n <span className=\"input-affix-wrapper\">\n <input id={suggestId} className=\"ant-input\" type=\"text\" placeholder=\"请输入关键字\" />\n </span>\n </span>\n </div>\n </div>\n );\n};\n\nexport default forwardRef(GaoDeMap);\n","import React, { useState, forwardRef, useImperativeHandle } from 'react';\nimport { Upload as UploadAntd, message } from 'antd';\nimport { UploadChangeParam, UploadProps } from 'antd/es/upload';\nimport { UploadFile } from 'antd/es/upload/interface';\nimport { AnyObjectType } from '../brother/typings';\nimport './index.less';\n\nexport interface UploadCallType {\n /** 设置文件列表 */\n setFileList: (data: UploadProps['fileList']) => void;\n}\n\nexport type PropsType = {\n /** 选择文件按钮 */\n children: JSX.Element;\n /** 设置上传的请求头部 */\n headers?: AnyObjectType;\n /** 上传成功回调 */\n uploadSuccess?: (data: UploadFile<any>[]) => void;\n} & UploadProps;\n\n/**\n * 上传文件组件\n */\nfunction Upload(props: PropsType, ref: any) {\n const [fileList, setFileList] = useState<UploadProps['fileList']>([]);\n\n // 移除 removeFile、handleChange、handlePreview 等函数上的 JSDoc 注释\n const removeFile = (file: UploadFile<any>) => {\n setFileList((prev) => {\n if (prev) {\n prev = prev.filter((item) => {\n return item.uid !== file.uid;\n });\n if (props.uploadSuccess) {\n props.uploadSuccess(\n prev.filter((item) => {\n return item.status === 'done';\n }),\n );\n }\n }\n return prev;\n });\n };\n\n const handleChange = (fileObject: UploadChangeParam) => {\n const { response } = fileObject.file;\n let code = response && parseInt(response.code);\n message.destroy();\n console.log('上传的文件对象:', fileObject);\n\n if (typeof response === 'string' || (typeof response === 'object' && response.status === 500)) {\n code = -1;\n }\n\n console.log('fileObject', fileObject);\n\n if (\n fileObject.file.status !== 'removed' &&\n (code === -1 || code === 400 || code === 404 || code === 500)\n ) {\n const errorMsg = response.msg || '上传失败';\n fileObject.file.status = 'error';\n fileObject.file.response = errorMsg;\n // 上传失败提示\n message.warning({\n content: <span dangerouslySetInnerHTML={{ __html: errorMsg }}></span>,\n duration: 1.5,\n });\n }\n\n if (fileObject.file.status === 'done') {\n message.success('上传成功', 1.5);\n }\n\n setFileList(fileObject.fileList);\n if (fileObject.file.status === 'done' && props.uploadSuccess) {\n props.uploadSuccess(\n fileObject.fileList.filter((item) => {\n return item.status === 'done';\n }),\n );\n }\n };\n\n // const handlePreview = async (file: AnyObjectType) => {\n // let src = file.url;\n // if (!src) {\n // src = await new Promise((resolve) => {\n // const reader = new FileReader();\n // reader.readAsDataURL(file.originFileObj);\n // reader.onload = () => resolve(reader.result);\n // });\n // }\n // const image = new Image();\n // image.src = src;\n // const imgWindow = window.open(src);\n // if (imgWindow) {\n // imgWindow.document.write(image.outerHTML);\n // }\n // };\n\n // 暴漏给父组件调用\n useImperativeHandle<any, UploadCallType>(ref, () => ({\n // 设置文件列表\n setFileList: (data) => {\n setFileList(data);\n },\n }));\n\n return (\n <UploadAntd\n onChange={handleChange}\n fileList={fileList}\n onRemove={removeFile}\n // onPreview={handlePreview}\n {...props}\n beforeUpload={(file, fileList) => {\n if (props.beforeUpload) {\n return props.beforeUpload(file, fileList) || UploadAntd.LIST_IGNORE;\n }\n return true;\n }}\n >\n {props.children}\n </UploadAntd>\n );\n}\n\nexport default forwardRef(Upload);\n","import React, { useEffect, useCallback, useImperativeHandle, forwardRef } from 'react';\nimport { Tree, Input, Row, Col, Empty, Spin, message } from 'antd';\nimport { TreeProps } from 'antd/es/tree';\nimport _ from 'lodash';\nimport hooks from '../brother/hooks';\nimport { AnyObjectType } from '../brother/typings';\nimport './index.less';\n\nconst { Search } = Input;\n\nexport interface TreeNodeCallType {\n setLoading: (data: boolean) => void;\n getSelectNode: () => string[];\n getSelectCurrent: () => TreeType[];\n getCheckedNode: () => string[];\n getCheckedCurrent: () => TreeType[];\n setSelectNode: (data: string[]) => void;\n setCheckedNode: (data: string[]) => void;\n}\n\nexport interface PropTypes {\n /** 树结构数据 */\n data?: TreeType[];\n /** 是否打开搜索功能 */\n searchOpen?: boolean;\n /** 是否打开拖拽节点功能 */\n draggableOpen?: boolean;\n /** 是否打开右侧额外操作按钮功能 */\n processOpen?: boolean;\n /** 自定义每项右侧操作按钮 */\n customAction?: (item: TreeType) => React.ReactNode;\n /** 是否打开复选框功能 */\n checkedOpen?: boolean;\n /** 选中节点触发回调 */\n onSelect?: (data: React.Key[], e: AnyObjectType) => void;\n /** 拖拽完成回调 */\n onDropCallBack?: (info: AnyObjectType, data: TreeType[]) => void;\n /** 验证是否可以拖拽 */\n onVerificationDropCallBack?: (info: AnyObjectType, data: TreeType[]) => boolean;\n /** 支持antd tree组件全部传参 */\n treeConfig?: TreeProps;\n}\n\nexport interface TreeType {\n id?: string;\n title: string | JSX.Element;\n key: string;\n disabled?: boolean; // 禁用\n processOpen?: boolean; // 控制单个数据是否打开右侧额外操作按钮功能(true关闭)\n noDrag?: boolean; // 某个节点是否可以拖拽(true不能拖拽)\n status?: 0 | 1 | 2; // 0-无效,1-有效,2-挂起\n children?: TreeType[];\n [key: string]: any;\n}\n\ninterface StateType {\n loading: boolean;\n searchOpen: boolean;\n searchValue: string;\n treeList: TreeType[];\n draggableOpen: boolean;\n processOpen: boolean;\n checkedOpen: boolean;\n firstLevelCollection: TreeType[];\n expandedKeys: string[];\n autoExpandParent: boolean;\n selectNode: string[];\n selectCurrent: TreeType[];\n checkedNode: string[];\n checkedCurrent: TreeType[];\n}\n\n/** 树组件 */\nconst TreeNode = (props: PropTypes, ref: any) => {\n const [state, setState] = hooks.useSetState<StateType>({\n loading: false, // 加载loading\n searchOpen: false, // 是否打开搜索功能(默认打开)\n searchValue: '', // 搜索值\n treeList: [], // 存放树结构数据\n draggableOpen: false, // 是否打开节点拖拽功能(默认打开)\n processOpen: false, // 是否打开挂起、启用、删除功能(默认打开)\n checkedOpen: false, // 是否打开复选框功能(默认不打开)\n firstLevelCollection: [], // 一级树结构(treeList拆分)\n expandedKeys: [], // 指定展开的节点(string[])\n autoExpandParent: false, // 是否自动展开父节点\n selectNode: [], // 点击选中的节点key(string[])\n selectCurrent: [], // 点击选中的节点数组\n checkedNode: [], // 复选框选中的节点key(string[])\n checkedCurrent: [], // 复选框选中的节点数组\n });\n\n /**\n * @Description 一级树结构(treeList拆分)\n * @Author bihongbin\n * @Date 2020-07-30 14:20:54\n */\n const generateList = useCallback(\n (data: TreeType[]): void => {\n const arr: TreeType[] = [];\n const eachData = (_data: TreeType[]) => {\n for (let i = 0; i < _data.length; i++) {\n const node = _data[i];\n arr.push(_data[i]);\n if (node.children) {\n eachData(node.children);\n }\n }\n };\n eachData(data);\n setState({\n firstLevelCollection: arr,\n });\n },\n [setState],\n );\n\n /**\n * @Description 拖拽触发时调用\n * @Author bihongbin\n * @Date 2020-07-30 15:17:58\n */\n const handleDrop = (info: AnyObjectType) => {\n const dropKey = info.node.key;\n const dragKey = info.dragNode.key;\n const dropPos = info.node.pos.split('-');\n const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);\n const loop = (data: any, key: string, callback: any) => {\n for (let i = 0; i < data.length; i++) {\n if (data[i].key === key) {\n return callback(data[i], i, data);\n }\n if (data[i].children) {\n loop(data[i].children, key, callback);\n }\n }\n };\n // 父级传入的拖拽验证\n if (\n props.onVerificationDropCallBack &&\n props.onVerificationDropCallBack(info, state.treeList)\n ) {\n return;\n }\n // 当节点noDrag=true,不允许修改\n if (info.dragNode.noDrag) {\n message.warning('此节点不支持修改', 1.5);\n return;\n }\n const data = [...state.treeList];\n // 找到拖拽对象\n let dragObj: TreeType = {\n title: '',\n key: '',\n };\n loop(data, dragKey, (item: TreeType, index: number, arr: TreeType[]) => {\n arr.splice(index, 1);\n dragObj = item;\n });\n if (!info.dropToGap) {\n // 放下内容\n loop(data, dropKey, (item: TreeType) => {\n item.children = item.children || [];\n // 示例添加到尾部,可以是随意位置\n item.children.push(dragObj);\n });\n } else if (\n (info.node.children || []).length > 0 && // 有子级\n info.node.expanded && // 扩大\n dropPosition === 1 // 在底部间隙\n ) {\n loop(data, dropKey, (item: TreeType) => {\n item.children = item.children || [];\n // 示例添加到头部,可以是随意位置\n item.children.unshift(dragObj);\n });\n } else {\n let ar: TreeType[] = [];\n let i = 0;\n loop(data, dropKey, (item: TreeType, index: number, arr: TreeType[]) => {\n ar = arr;\n i = index;\n });\n if (dropPosition === -1) {\n ar.splice(i, 0, dragObj);\n } else {\n ar.splice(i + 1, 0, dragObj);\n }\n }\n // 推拽完成以后回调\n if (props.onDropCallBack) {\n props.onDropCallBack(info, data);\n }\n setState({\n treeList: data,\n });\n };\n\n /**\n * @Description 选择树节点\n * @Author bihongbin\n * @Date 2020-07-30 13:47:29\n */\n const handleSelectTreeNode = useCallback(\n (selectedKeys: React.Key[], e: AnyObjectType): void => {\n if (_.isArray(selectedKeys)) {\n setState({\n selectNode: selectedKeys.map(String),\n });\n if (props.onSelect) {\n props.onSelect(selectedKeys.map(String), e);\n }\n }\n },\n [props, setState],\n );\n\n /**\n * @Description 展开树节点\n * @Author bihongbin\n * @Date 2020-07-30 13:49:01\n */\n const handleExpandTreeNode = useCallback(\n (expandedKeys: React.Key[]): void => {\n setState({\n autoExpandParent: false, // 设置树不展开\n expandedKeys: expandedKeys.map(String), // 设置树需要展开的节点\n });\n },\n [setState],\n );\n\n /**\n * @Description 获取父级节点key\n * @Author bihongbin\n * @Date 2020-07-30 11:49:20\n */\n const getParentKey = useCallback((key: string, tree: TreeType[]): string | undefined => {\n let parentKey;\n for (let i = 0; i < tree.length; i++) {\n const node = tree[i];\n if (node.children) {\n if (node.children.some((item: TreeType) => item.key === key)) {\n parentKey = node.key;\n } else if (getParentKey(key, node.children)) {\n parentKey = getParentKey(key, node.children);\n }\n }\n }\n return parentKey;\n }, []);\n\n /**\n * @Description 搜索树节点\n * @Author bihongbin\n * @Date 2020-07-30 10:29:25\n */\n const searchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = e.target;\n const _expandedKeys = state.firstLevelCollection\n .map((item: TreeType) => {\n let t = item.title as string;\n if (t.indexOf(value) > -1) {\n return getParentKey(item.key, state.treeList);\n }\n return null;\n })\n .filter((item, i, self) => item && self.indexOf(item) === i)\n .map(String);\n setState({\n searchValue: value, // 设置搜索的值\n expandedKeys: _expandedKeys.map(String), // 设置树需要展开的节点\n autoExpandParent: true, // 设置树自动展开\n });\n },\n [getParentKey, setState, state.firstLevelCollection, state.treeList],\n );\n\n /**\n * @Description 点击复选框触发\n * @Author bihongbin\n * @Date 2020-07-31 09:14:36\n */\n const handleCheckNode = useCallback(\n (checked: string[] | { checked: string[]; halfChecked: string[] }) => {\n let checkedArr: string[] = [];\n if (Array.isArray(checked)) {\n checkedArr = checked.map(String);\n } else if (checked && Array.isArray(checked.checked)) {\n checkedArr = checked.checked.map(String);\n }\n setState({\n checkedNode: checkedArr.map(String),\n });\n },\n [setState],\n );\n\n /**\n * @Description 渲染最终树结构\n * @Author bihongbin\n * @Date 2020-07-30 11:22:02\n */\n const loopTree = useCallback(\n (data: TreeType[]): TreeType[] => {\n return data.map((item) => {\n const t = item.title as string;\n const index = t.indexOf(state.searchValue);\n const beforeStr = t.substr(0, index); // 用来区分搜索结果的数据\n const afterStr = t.substr(index + state.searchValue.length); // 用来区分搜索结果的数据\n // 是否显示右侧操作按钮\n const isRightButton = props.processOpen && !item.processOpen && !item.disabled;\n // 右侧操作按钮\n const treeRightButton = isRightButton ? (\n <Col className=\"tree-handle-box\">{props.customAction && props.customAction(item)}</Col>\n ) : null;\n const title =\n index > -1 ? (\n <Row justify=\"space-between\" align=\"middle\">\n <Col>\n {beforeStr}\n <span className=\"text-error\">{state.searchValue}</span>\n {afterStr}\n </Col>\n {treeRightButton}\n </Row>\n ) : (\n <Row justify=\"space-between\" align=\"middle\">\n <Col>{item.title}</Col>\n {treeRightButton}\n </Row>\n );\n if (item.children) {\n return {\n ...item,\n title,\n children: loopTree(item.children),\n };\n }\n return {\n ...item,\n title,\n };\n });\n },\n [props, state.searchValue],\n );\n\n /**\n * @Description 复选框选中节点更新的时候(checkedNode),同步到复选框选中的数组(checkedCurrent)\n * @Author bihongbin\n * @Date 2020-10-19 18:53:49\n */\n useEffect(() => {\n const deep = (data: TreeType[]) => {\n let arr: TreeType[] = [];\n const getDeep = (data: TreeType[]) => {\n for (let item of data) {\n if (state.checkedNode.some((i) => i === item.key)) {\n arr.push(item);\n }\n if (item.children) {\n getDeep(item.children);\n }\n }\n };\n getDeep(data);\n return arr;\n };\n setState((prev) => ({\n ...prev,\n checkedCurrent: deep(state.treeList),\n expandedKeys: prev.expandedKeys ? prev.expandedKeys.map(String) : [],\n }));\n }, [setState, state.checkedNode, state.treeList]);\n\n /**\n * @Description 点击选中节点更新的时候(selectNode),同步到点击选中的数组(selectCurrent)\n * @Author bihongbin\n * @Date 2020-10-19 18:58:42\n */\n useEffect(() => {\n const deep = (data: TreeType[]) => {\n let arr: TreeType[] = [];\n const getDeep = (data: TreeType[]) => {\n for (let item of data) {\n if (state.selectNode.some((i) => i === item.key)) {\n arr.push(item);\n }\n if (item.children) {\n getDeep(item.children);\n }\n }\n };\n getDeep(data);\n return arr;\n };\n setState((prev) => ({\n ...prev,\n selectCurrent: deep(state.treeList),\n expandedKeys: prev.expandedKeys ? prev.expandedKeys.map(String) : [],\n }));\n }, [setState, state.selectNode, state.treeList]);\n\n /**\n * @Description 树结构数据赋值\n * @Author bihongbin\n * @Date 2020-07-31 15:57:46\n */\n useEffect(() => {\n if (_.isArray(props.data)) {\n // 设置树结构数据\n setState({\n treeList: props.data,\n });\n // 一级树结构(treeList拆分)\n generateList(props.data);\n }\n }, [generateList, props.data, setState]);\n\n /**\n * @Description 打开或关闭一些默认功能\n * @Author bihongbin\n * @Date 2020-07-31 15:57:57\n */\n useEffect(() => {\n let data: AnyObjectType = {};\n // 打开搜索功能\n if (props.searchOpen) {\n data.searchOpen = props.searchOpen;\n }\n // 打开拖拽功能\n if (props.draggableOpen) {\n data.draggableOpen = props.draggableOpen;\n }\n // 打开右侧额外操作按钮功能功能\n if (props.processOpen) {\n data.processOpen = props.processOpen;\n }\n // 打开复选框功能\n if (props.checkedOpen) {\n data.checkedOpen = props.checkedOpen;\n }\n if (Object.keys(data).length) {\n if (data.expandedKeys) data.expandedKeys = data.expandedKeys.map(String);\n setState(data);\n }\n }, [props.checkedOpen, props.draggableOpen, props.processOpen, props.searchOpen, setState]);\n\n /**\n * @Description 暴漏组件方法给父级\n * @Author bihongbin\n * @Date 2020-08-04 15:35:55\n */\n useImperativeHandle<any, TreeNodeCallType>(ref, () => ({\n // 设置loading\n setLoading: (data) => {\n setState({\n loading: data,\n });\n },\n // 获取当前点击选中的节点key\n getSelectNode: () => state.selectNode,\n // 获取当前点击选中的节点数组\n getSelectCurrent: () => state.selectCurrent,\n // 获取复选框选中的节点key\n getCheckedNode: () => state.checkedNode,\n // 获取复选框选中的节点数组\n getCheckedCurrent: () => state.checkedCurrent,\n // 设置当前点击选中的节点\n setSelectNode: (data) => {\n setState({\n selectNode: data,\n });\n },\n // 设置复选框选中的节点\n setCheckedNode: (data) => {\n setState({\n checkedNode: data,\n });\n },\n }));\n\n return (\n <div className=\"tree-wrap\">\n <Spin spinning={state.loading}>\n {state.searchOpen ? (\n <Search className=\"tree-search\" placeholder=\"输入名称搜索\" onChange={searchChange} />\n ) : null}\n {state.treeList.length ? (\n <Tree\n blockNode\n height={500}\n showLine={{ showLeafIcon: false }}\n checkable={state.checkedOpen}\n treeData={loopTree(state.treeList)}\n expandedKeys={state.expandedKeys.map(String)}\n selectedKeys={state.selectNode.map(String)}\n checkedKeys={state.checkedNode.map(String)}\n autoExpandParent={state.autoExpandParent}\n onSelect={(keys, e) => handleSelectTreeNode(keys.map(String), e)}\n onExpand={(keys) => handleExpandTreeNode(keys.map(String))}\n onCheck={(checked) => handleCheckNode(Array.isArray(checked) ? checked.map(String) : { checked: checked.checked.map(String), halfChecked: checked.halfChecked.map(String) })}\n draggable={state.draggableOpen}\n onDrop={handleDrop}\n onDragEnter={(info) => {\n setState({\n expandedKeys: info.expandedKeys.map(String),\n });\n }}\n {...props.treeConfig}\n />\n ) : (\n <Empty />\n )}\n </Spin>\n </div>\n );\n};\n\nexport default forwardRef(TreeNode);\n","import React, {\n useImperativeHandle,\n forwardRef,\n useMemo,\n useRef,\n useEffect,\n useCallback,\n} from 'react';\nimport {\n Row,\n Col,\n Empty,\n message,\n Form,\n Input,\n InputNumber,\n Select,\n Cascader,\n DatePicker,\n TimePicker,\n Switch,\n Spin,\n Radio,\n Checkbox,\n TreeSelect,\n Rate,\n RadioChangeEvent,\n InputNumberProps,\n AutoCompleteProps,\n AutoComplete,\n InputProps,\n Tooltip,\n} from 'antd';\nimport dayjs from 'dayjs';\nimport _ from 'lodash';\nimport { RowProps } from 'antd/es/row';\nimport { ColProps } from 'antd/es/col';\nimport { FormProps, Rule, FormItemProps, FormInstance } from 'antd/es/form';\nimport type { RangePickerProps, DatePickerProps } from 'antd/es/date-picker';\nimport type { PickerProps } from 'antd/es/date-picker/generatePicker';\nimport { TimePickerProps } from 'antd/es/time-picker';\nimport { RateProps } from 'antd/es/rate';\nimport { TreeSelectProps } from 'antd/es/tree-select';\nimport { TimeRangePickerProps } from 'antd/es/time-picker';\nimport { SelectProps } from 'antd/es/select';\nimport { v4 as uuidV4 } from 'uuid';\nimport { typeofEqual } from '../brother/utils';\nimport hooks from '../brother/hooks';\nimport ConfigProvider from '../brother/ConfigProvider';\nimport { AnyObjectType, SelectType } from '../brother/typings';\nimport './index.less';\n\nexport type NamePath = any;\nexport type DataNode = any;\nexport type DefaultValueType = any;\ntype CheckboxValueType = any;\n\nexport interface DefaultOptionType {\n value?: string | number;\n label?: React.ReactNode;\n disabled?: boolean;\n isLeaf?: boolean;\n loading?: boolean;\n children?: Array<DefaultOptionType>;\n [key: string]: any;\n}\n\ntype remoteValueType = string | undefined;\ntype remotePromiseType = (value: remoteValueType, other?: any) => Promise<SelectType[]>;\ntype inputConfig = Omit<InputProps, 'inputMode'> & {\n inputMode?: InputProps['type'];\n};\n\ninterface UnionType {\n componentName: 'Input' | 'Select' | 'DatePicker' | 'TimePicker' | 'RemoteSearch';\n name: FormListType['name']; // 字段名\n placeholder?: FormListType['placeholder'];\n selectData?: FormListType['selectData'];\n inputConfig?: FormListType['inputConfig'];\n remoteConfig?: FormListType['remoteConfig'];\n datePickerConfig?: FormListType['datePickerConfig'];\n rangePickerConfig?: FormListType['rangePickerConfig'];\n timeRangePickerConfig?: FormListType['timeRangePickerConfig'];\n timePickerConfig?: FormListType['timePickerConfig'];\n rules?: FormListType['rules']; // 表单验证\n}\n\n// 表单参数配置\nexport type FormListType = {\n colProps?: ColProps; // 用来控制单个表单元素宽度\n visible?: boolean; // 用来控制显示隐藏\n // 组件显示类型\n componentName:\n | 'Input'\n | 'InputNumber'\n | 'HideInput'\n | 'TextArea'\n | 'AutoComplete'\n | 'InputAutoComplete'\n | 'Select'\n | 'Multiple'\n | 'MultipleTag'\n | 'RemoteSearch'\n | 'DatePicker'\n | 'RangePicker'\n | 'TimeRangePicker'\n | 'TimePicker'\n | 'Switch'\n | 'Radio'\n | 'Checkbox'\n | 'TreeSelect'\n | 'Union'\n | 'RegionSelection'\n | 'Rate'\n | 'Null';\n name?: string; // 字段名\n label?: string | React.ReactNode; // 标题\n dependencies?: (string | number)[]; // 依赖字段\n placeholder?: string;\n rangePickerPlaceholder?: [string, string]; // 开始时间和结束时间提示文字\n timeRangePickerPlaceholder?: [string, string]; // 开始时间和结束时间提示文字\n disabled?: boolean; // 是否禁用\n maxLength?: number; // 可输入长度\n valuePropName?: string; // 子节点的值的属性,如 Switch 的是 'checked'\n inputConfig?: inputConfig;\n inputNumberConfig?: InputNumberProps & { alignRight?: boolean };\n datePickerConfig?: DatePickerProps; // datePicker 可选类型\n rangePickerConfig?: RangePickerProps; // RangePicker 可选类型\n timeRangePickerConfig?: TimeRangePickerProps; // TimeRangePicker 可选类型\n timePickerConfig?: TimePickerProps; // timePicker 可选类型\n inputAutoCompleteConfig?: AutoCompleteProps;\n unionConfig?: {\n // 要显示n个表单的类型\n unionItems: UnionType[];\n divide?: string; // 分隔符\n };\n selectConfig?: SelectProps<string>;\n selectIsHideAll?: boolean; // 下拉菜单是否显示“全部”选项 true-隐藏下拉菜单全部选项\n selectData?: SelectType[]; // 下拉菜单数据\n remoteConfig?: {\n initLoad?: false; // 是否默认加载 false(不加载)\n reLoad?: boolean; // 更新表单值后,RemoteSearch类型表单是否重新查询\n remoteApi: remotePromiseType; // 远程搜索的api\n remoteMode?: 'multiple' | 'tags'; // 远程搜索模式为多选或标签\n allowClear?: boolean; // 是否可清除内容\n showSearch?: boolean; // 使单选模式可搜索\n };\n // 级联选择\n regionSelectionConfig?: {\n loadData: DefaultOptionType[]; // 级联数据\n selectLoad?: (parentId: string) => Promise<DefaultOptionType[]>;\n };\n // 评分\n rateConfig?: RateProps;\n // 树选择\n treeSelectConfig?: {\n data?: {\n title: string;\n value: string;\n children?: string;\n api: (value?: string) => Promise<AnyObjectType[]>;\n onChange?: (value: DataNode[], formItem: FormListType) => FormListType | void;\n };\n extra?: TreeSelectProps<DefaultValueType>;\n };\n rows?: number; // TextArea高度\n rules?: Rule[]; // 表单验证\n inputAutoCompleteChange?: AutoCompleteProps['onChange'];\n inputChange?: (e: React.ChangeEvent<HTMLInputElement>, other?: any) => void;\n inputNumberChange?: InputNumberProps['onChange'];\n inputEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n textAreaChange?: (e: React.ChangeEvent<HTMLTextAreaElement>, other?: any) => void;\n autoCompleteChange?: (e: string, other?: any) => void;\n selectChange?: (e: string, other?: any) => void;\n multipleChange?: (e: string, other?: any) => void;\n remoteSearchChange?: (e: string, other?: any) => void;\n datePickerChange?: PickerProps<any>['onChange'];\n rangePickerChange?: RangePickerProps['onChange'];\n timeRangePickerChange?: RangePickerProps['onChange'];\n timePickerChange?: PickerProps<any>['onChange'];\n switchChange?: (e: boolean, other?: any) => void;\n radioChange?: (e: RadioChangeEvent, other?: any) => void;\n checkboxChange?: (e: CheckboxValueType[], other?: any) => void;\n cascaderChange?: (e: any, other?: any) => void;\n rateChange?: (e: number, other?: any) => void;\n render?: () => React.ReactElement; // 动态渲染插入额外元素\n} & FormItemProps;\n\n// 导出该组件可调用的方法类型\nexport interface FormCallType {\n getFormValues: (data: string[]) => AnyObjectType;\n setFormFields: FormInstance['setFields'];\n setFormValues: (values: AnyObjectType) => void;\n formSubmit: (nameList?: NamePath[]) => Promise<AnyObjectType>;\n formReset: (fields?: string[]) => void;\n}\n\n// 组件传参配置props\nexport interface GenerateFormPropType {\n /** 组件类名 */\n className?: string;\n /** 渲染的表单元素 */\n list?: FormListType[];\n /** 支持antd Form组件官方传参所有类型 */\n formConfig?: FormProps;\n /** 支持antd Row组件官方传参所有类型 */\n rowGridConfig?: RowProps;\n /** 支持antd Col组件官方传参所有类型 */\n colGirdConfig?: ColProps;\n /** 动态渲染操作按钮或其他元素 */\n render?: () => React.ReactElement;\n}\n\nconst { Option } = Select;\nconst { RangePicker } = DatePicker;\nconst { RangePicker: TimeRangePicker } = TimePicker;\n\ninterface StateType {\n update: boolean;\n remoteFetching: boolean;\n remoteData: {\n [key: string]: SelectType[];\n };\n treeSelectData: {\n [key: string]: DataNode[];\n };\n treeSelectFlattenData: {\n [key: string]: DataNode[];\n };\n selectMultiple: {\n [key: string]: any;\n };\n}\n\n/** 动态表单 */\nfunction GenerateForm(props: GenerateFormPropType, ref: any) {\n const [form] = Form.useForm();\n let { className, formConfig, rowGridConfig, colGirdConfig, render } = props;\n const remoteRef = useRef<StateType['remoteData']>({});\n const debounceMapRef = useRef<{ [key: string]: (value: string) => void }>({});\n const treeSelectRef = useRef<StateType['treeSelectData']>({});\n const [state, setState] = hooks.useSetState<StateType>({\n update: false, // 取反值强制渲染dom\n remoteFetching: false, // 远程搜索loading\n remoteData: {}, // 远程搜索数据结果\n treeSelectData: {}, // 树选择数据\n treeSelectFlattenData: {}, // 树选择打平后数据\n selectMultiple: {}, // 多选下拉菜单存值\n });\n\n /**\n * @Description 渲染的表单元素\n * @Author bihongbin\n * @Date 2021-03-16 09:35:24\n */\n let list = useMemo(() => (props.list ? [...props.list] : []), [props.list]);\n\n /**\n * @Description 缓存生成的随机id\n * @Author bihongbin\n * @Date 2020-08-29 15:36:38\n */\n const uid = useMemo(() => uuidV4(), []);\n\n /**\n * @Description 下拉菜单远程数据查询\n * @Author bihongbin\n * @Date 2020-07-25 10:01:02\n */\n const fetchRemote = useCallback(\n (value: remoteValueType, item: FormListType) => {\n const config = item.remoteConfig;\n const names = item.name as string;\n let current = remoteRef.current[names];\n if (config && config.remoteApi) {\n setState((prev) => {\n prev.remoteFetching = true;\n remoteRef.current[names] = [];\n prev.remoteData[names] = [];\n return prev;\n });\n config\n .remoteApi(value)\n .then((res) => {\n const deb = () => {\n if (current === undefined) {\n remoteRef.current[names] = [];\n }\n if (names) {\n setState((prev) => {\n prev.remoteFetching = false;\n remoteRef.current[names] = res;\n prev.remoteData[names] = res;\n\n console.log('remoteRef.curren', remoteRef.current);\n console.log('prev.remoteData', prev.remoteData);\n return prev;\n });\n }\n };\n setTimeout(deb, 100);\n })\n .catch(() => {\n setState((prev) => {\n prev.remoteFetching = false;\n remoteRef.current[names] = [];\n prev.remoteData[names] = [];\n return prev;\n });\n });\n }\n },\n [setState],\n );\n\n /**\n * @Description 树选择查询\n * @Author bihongbin\n * @Date 2021-04-17 10:03:36\n * @param {*} useCallback\n */\n const fetchTreeSelect = useCallback(\n (item: FormListType, value?: string) => {\n const config = item.treeSelectConfig;\n if (config && config.data) {\n config.data.api(value).then((res) => {\n const names = item.name;\n if (names) {\n treeSelectRef.current[names] = [];\n let transformTreeSelect: DataNode[] = [];\n let flattenTreeSelect: DataNode[] = [];\n // 递归\n const deep = (original: AnyObjectType[], rear: DataNode[]) => {\n for (let [i, e] of original.entries()) {\n const children = config.data?.children || 'children';\n rear[i] = {};\n rear[i].title = e[config.data?.title as string];\n rear[i].value = e[config.data?.value as string];\n rear[i].key = rear[i].value;\n flattenTreeSelect.push(e); // 添加打平数据\n if (Array.isArray(e[children])) {\n rear[i].children = [];\n deep(e[children], rear[i].children as DataNode[]);\n }\n }\n };\n deep(res, transformTreeSelect);\n setState((prev) => {\n prev.treeSelectData[names] = transformTreeSelect;\n prev.treeSelectFlattenData[names] = flattenTreeSelect;\n return prev;\n });\n }\n });\n }\n },\n [setState],\n );\n\n /**\n * @Description 级联选择数据查询\n * @Author bihongbin\n * @Date 2021-01-27 15:00:34\n */\n const regionLoadData = useCallback(\n async (item: FormListType, selectedOptions: DefaultOptionType[] | undefined) => {\n if (selectedOptions) {\n const targetOption = selectedOptions[selectedOptions.length - 1];\n let result: DefaultOptionType[] = [];\n if (item.regionSelectionConfig?.selectLoad) {\n targetOption.loading = true;\n result = await item.regionSelectionConfig?.selectLoad(targetOption.id);\n } else {\n return;\n }\n targetOption.loading = false;\n if (result.length) {\n targetOption.children = result;\n } else {\n targetOption.isLeaf = true;\n }\n setState({\n update: !state.update, // 强制更新\n });\n }\n },\n [setState, state.update],\n );\n\n /**\n * @Description 渲染组件\n * @Author bihongbin\n * @Date 2020-07-06 10:12:51\n */\n const formRender = useCallback(() => {\n // 多选下拉菜单是否全选(稳定引用)\n const setMultipleCheckbox = (item: FormListType, bool: boolean) => {\n setState((prev) => {\n if (item.name) {\n prev.selectMultiple[item.name] = bool;\n }\n return prev;\n });\n };\n\n // 多选下拉菜单自定义渲染(稳定引用)\n const multipleSelectRender = (allSelect: any, item: FormListType) => {\n const selectData = item.selectData || [];\n return (\n <div className=\"multiple-checkbox\">\n <Checkbox\n checked={item.name ? state.selectMultiple[item.name] : undefined}\n onChange={(e) => {\n const editObj: any = {};\n if (e.target.checked) {\n if (item.name) {\n editObj[item.name] = selectData.map((v) => v.value);\n }\n } else {\n if (item.name) {\n editObj[item.name] = [];\n }\n }\n setMultipleCheckbox(item, e.target.checked);\n form.setFieldsValue(editObj);\n item.multipleChange && item.multipleChange(editObj[item.name || '']);\n }}\n >\n 全选\n </Checkbox>\n {allSelect}\n </div>\n );\n };\n if (!list) {\n return;\n }\n // Input\n const inputRender = (item: FormListType) => {\n const { inputMode, ...arg } = item.inputConfig || {};\n\n return (\n <Input\n disabled={item.disabled}\n type={inputMode || 'text'}\n maxLength={item.maxLength}\n placeholder={item.placeholder || `请输入${item.label}`}\n onChange={item.inputChange}\n onPressEnter={item.inputEnter}\n {...arg}\n />\n );\n };\n // InputNumber\n const InputNumberRender = (item: FormListType) => {\n const { alignRight, ...otherConfig } = item.inputNumberConfig || {};\n return (\n <InputNumber\n disabled={item.disabled}\n style={{ width: '100%' }}\n placeholder={item.placeholder || `请输入${item.label}`}\n onChange={item.inputNumberChange}\n className={alignRight ? 'hlyc-web-com-align-right' : ''}\n {...otherConfig}\n />\n );\n };\n // HideInput\n const hideInputRender = (item: FormListType) => {\n return (\n <Input\n style={{ display: 'none' }}\n maxLength={item.maxLength}\n disabled={item.disabled}\n type=\"text\"\n placeholder={item.placeholder || `请输入${item.label}`}\n onChange={item.inputChange}\n onPressEnter={item.inputEnter}\n />\n );\n };\n // TextArea\n const textAreaRender = (item: FormListType) => {\n return (\n <Input.TextArea\n rows={item.rows}\n disabled={item.disabled}\n maxLength={item.maxLength}\n placeholder={item.placeholder || `请输入${item.label}`}\n onChange={item.textAreaChange}\n />\n );\n };\n // InputAutoComplete\n const inputAutoCompleteRender = (item: FormListType) => {\n return (\n <AutoComplete\n filterOption={(inputValue, option) =>\n ((option!.value || '') as string).toUpperCase().includes(inputValue.toUpperCase())\n }\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={item.inputAutoCompleteChange}\n {...item.inputAutoCompleteConfig}\n />\n );\n };\n // AutoComplete\n const autoCompleteRender = (item: FormListType) => {\n return (\n <Select\n allowClear\n showSearch\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n optionFilterProp=\"children\"\n filterOption={(inputValue, option) =>\n option\n ? ((option.children ?? '') as string).toLowerCase().includes(inputValue.toLowerCase())\n : false\n }\n onChange={item.autoCompleteChange}\n {...item.selectConfig}\n >\n {item.selectData\n ? item.selectData.map((s, k) => (\n <Option value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Option>\n ))\n : null}\n </Select>\n );\n };\n // Select\n const selectRender = (item: FormListType) => {\n return (\n <Select\n allowClear\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={item.selectChange}\n {...item.selectConfig}\n >\n {item.selectData\n ? item.selectData.map((s, k) => (\n <Option value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Option>\n ))\n : null}\n </Select>\n );\n };\n // Multiple\n const multipleRender = (item: FormListType) => {\n const selectData = item.selectData || [];\n return (\n <Select\n mode=\"multiple\"\n allowClear\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={(e) => {\n setMultipleCheckbox(item, e.length === selectData.length);\n if (item.multipleChange) {\n item.multipleChange(e);\n }\n }}\n filterOption={(inputValue, option) =>\n option\n ? ((option.children ?? '') as string).toLowerCase().includes(inputValue.toLowerCase())\n : false\n }\n popupRender={(allSelect) => multipleSelectRender(allSelect, item)}\n maxTagPlaceholder={(omittedValues) => {\n const labels = omittedValues?.map((i) => i.label)?.join('、') || '';\n return (\n <Tooltip title={labels} placement=\"top\">\n +{omittedValues?.length}\n </Tooltip>\n );\n }}\n {...item.selectConfig}\n >\n {selectData.map((s, k) => (\n <Option value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Option>\n ))}\n </Select>\n );\n };\n // MultipleTag\n const multipleTagRender = (item: FormListType) => {\n return (\n <Select\n mode=\"tags\"\n allowClear\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={item.multipleChange}\n {...item.selectConfig}\n >\n {item.selectData\n ? item.selectData.map((s, k) => (\n <Option value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Option>\n ))\n : null}\n </Select>\n );\n };\n // RemoteSearch\n const remoteSearchRender = (item: FormListType) => {\n const remoteConfig = item.remoteConfig;\n const isMode = remoteConfig && remoteConfig.remoteMode;\n const allowClear = remoteConfig && remoteConfig.allowClear;\n const showSearch = remoteConfig && remoteConfig.showSearch;\n const nameKey = (item.name as string) || '';\n if (showSearch !== false && nameKey) {\n if (!debounceMapRef.current[nameKey]) {\n debounceMapRef.current[nameKey] = _.debounce(\n (value: string) => fetchRemote(value, item),\n 300,\n );\n }\n }\n return (\n <Select\n mode={isMode || undefined}\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n notFoundContent={\n state.remoteFetching ? (\n <Spin size=\"small\" />\n ) : (\n <Empty\n style={{ marginTop: 8, marginBottom: 8 }}\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n )\n }\n filterOption={false}\n allowClear={allowClear === false ? false : true}\n showSearch={showSearch === false ? false : true}\n // 当获取焦点查询全部\n onFocus={() => fetchRemote(undefined, item)}\n onSearch={showSearch === false ? undefined : debounceMapRef.current[nameKey]}\n onChange={item.remoteSearchChange}\n {...item.selectConfig}\n >\n {item.name && state.remoteData[item.name]\n ? state.remoteData[item.name].map((s: SelectType, k) => (\n <Option value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Option>\n ))\n : null}\n </Select>\n );\n };\n // DatePicker\n const datePickerRender = (item: FormListType) => {\n return (\n <DatePicker\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={item.datePickerChange}\n {...item.datePickerConfig}\n />\n );\n };\n // RangePicker\n const rangePickerRender = (item: FormListType) => {\n return (\n <RangePicker\n disabled={item.disabled}\n placeholder={item.rangePickerPlaceholder}\n onChange={item.rangePickerChange}\n {...item.rangePickerConfig}\n />\n );\n };\n // TimeRangePicker\n const TimeRangePickerRender = (item: FormListType) => {\n return (\n <TimeRangePicker\n disabled={item.disabled}\n placeholder={item.timeRangePickerPlaceholder}\n onChange={item.timeRangePickerChange}\n {...item.timeRangePickerConfig}\n />\n );\n };\n // TimePicker\n const timePickerRender = (item: FormListType) => {\n return (\n <TimePicker\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={item.timePickerChange}\n {...item.timePickerConfig}\n />\n );\n };\n // Switch\n const switchRender = (item: FormListType) => {\n return (\n <Switch\n defaultChecked={false}\n checkedChildren=\"ON\"\n unCheckedChildren=\"OFF\"\n disabled={item.disabled}\n onChange={item.switchChange}\n />\n );\n };\n // Radio\n const radioRender = (item: FormListType) => {\n return (\n <Radio.Group onChange={item.radioChange}>\n {item.selectData\n ? item.selectData.map((s: SelectType, k) => (\n <Radio disabled={item.disabled} value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Radio>\n ))\n : null}\n </Radio.Group>\n );\n };\n // Checkbox\n const checkboxRender = (item: FormListType) => {\n return (\n <Checkbox.Group onChange={item.checkboxChange}>\n {item.selectData\n ? item.selectData.map((s: SelectType, k) => (\n <Checkbox disabled={item.disabled} value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Checkbox>\n ))\n : null}\n </Checkbox.Group>\n );\n };\n // TreeSelect\n const treeSelectRender = (item: FormListType, index: number) => {\n const names = item.name as string;\n return (\n <TreeSelect\n disabled={item.disabled}\n style={{ width: '100%' }}\n styles={{ root: { maxHeight: 400, overflow: 'auto' } }}\n treeData={state.treeSelectData[names]}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={(value) => {\n if (item.treeSelectConfig && item.treeSelectConfig.data) {\n const configData = item.treeSelectConfig.data;\n const onChange = configData.onChange;\n const flatten = state.treeSelectFlattenData[names];\n const type = Object.prototype.toString.call(value);\n let changeChild: any[] = [];\n let newItem = { ...item };\n if (type === '[object String]') {\n changeChild = flatten.filter((t) => t[configData.value] === value);\n }\n if (type === '[object Array]' && Array.isArray(value)) {\n for (let i = flatten.length; i--; ) {\n if (value.some((t) => t === flatten[i][configData.value])) {\n changeChild.push(flatten[i]);\n }\n }\n }\n if (onChange) {\n const changeVal = onChange(changeChild, { ...item }) as FormListType;\n if (changeVal) {\n newItem = changeVal;\n }\n if (newItem) {\n list[index] = newItem;\n }\n }\n form.setFieldsValue({\n [newItem.name as string]: value, // 设置对应字段值\n });\n fetchTreeSelect(newItem); // 查询树选择数据\n }\n }}\n allowClear\n treeDefaultExpandAll\n {...item.treeSelectConfig?.extra}\n />\n );\n };\n // RegionSelection\n const regionSelectionRender = (item: FormListType) => {\n const propsRegionConfig = item.regionSelectionConfig;\n return (\n <Cascader\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n options={(propsRegionConfig && propsRegionConfig.loadData) || []}\n loadData={(selectedOptions) => regionLoadData(item, selectedOptions)}\n changeOnSelect\n onChange={item.cascaderChange}\n />\n );\n };\n // Rate\n const rateRender = (item: FormListType) => {\n return <Rate disabled={item.disabled} onChange={item.rateChange} {...item.rateConfig} />;\n };\n // 渲染Union类型表单\n const unionRender = (m: UnionType) => {\n if (m.componentName === 'Input') {\n return inputRender(m);\n }\n if (m.componentName === 'Select') {\n return selectRender(m);\n }\n if (m.componentName === 'DatePicker') {\n return datePickerRender(m);\n }\n if (m.componentName === 'TimePicker') {\n return timePickerRender(m);\n }\n if (m.componentName === 'RemoteSearch') {\n return remoteSearchRender(m);\n }\n return null;\n };\n // 类型是Union,有rule,添加必选项*号\n const unionRuleStyle = (i: Partial<FormListType>) => {\n let node = i.label;\n if (i.componentName === 'Union' && i.rules) {\n node = (\n <span>\n <i\n style={{\n marginRight: 4,\n color: '#ff4d4f',\n fontStyle: 'normal',\n fontFamily: 'SimSun, sans-serif',\n }}\n >\n *\n </i>\n {i.label}\n </span>\n );\n }\n return node;\n };\n return list.map((item: FormListType, index: number) => {\n let childForm: React.ReactNode = null;\n\n // 移除下拉菜单“全部”选项\n if (item.selectData && item.selectIsHideAll) {\n item.selectData = item.selectData.filter((e) => {\n return item.selectIsHideAll ? e.label !== '全部' && e.value !== '' : true;\n });\n }\n\n switch (item.componentName) {\n case 'Input':\n childForm = inputRender(item);\n break;\n case 'InputNumber':\n childForm = InputNumberRender(item);\n break;\n case 'HideInput':\n childForm = hideInputRender(item);\n break;\n case 'TextArea':\n childForm = textAreaRender(item);\n break;\n case 'AutoComplete':\n childForm = autoCompleteRender(item);\n break;\n case 'InputAutoComplete':\n childForm = inputAutoCompleteRender(item);\n break;\n case 'Select':\n childForm = selectRender(item);\n break;\n case 'Multiple':\n childForm = multipleRender(item);\n break;\n case 'MultipleTag':\n childForm = multipleTagRender(item);\n break;\n case 'RemoteSearch':\n childForm = remoteSearchRender(item);\n break;\n case 'DatePicker':\n childForm = datePickerRender(item);\n break;\n case 'RangePicker':\n childForm = rangePickerRender(item);\n break;\n case 'TimeRangePicker':\n childForm = TimeRangePickerRender(item);\n break;\n case 'TimePicker':\n childForm = timePickerRender(item);\n break;\n case 'Switch':\n childForm = switchRender(item);\n break;\n case 'Radio':\n childForm = radioRender(item);\n break;\n case 'Checkbox':\n childForm = checkboxRender(item);\n break;\n case 'TreeSelect':\n childForm = treeSelectRender(item, index);\n break;\n case 'Union':\n let width: string;\n let len = 0;\n if (item.unionConfig) {\n len = item.unionConfig.unionItems.length;\n width = `${100 / len}%`;\n }\n childForm = (\n <Row className=\"form-item-divide\" gutter={16}>\n {item.unionConfig?.unionItems.map((m, k) => (\n <Col\n style={{\n width: width,\n }}\n key={k}\n >\n <Form.Item name={m.name} rules={m.rules} noStyle>\n {unionRender(m)}\n </Form.Item>\n {k < len - 1 ? (\n <span className=\"divide\">\n {item.unionConfig &&\n (item.unionConfig.divide ? item.unionConfig.divide : '~')}\n </span>\n ) : null}\n </Col>\n ))}\n </Row>\n );\n break;\n case 'RegionSelection': // 级联选择(可实现地区选择)\n childForm = regionSelectionRender(item);\n break;\n case 'Rate':\n childForm = rateRender(item);\n break;\n default:\n return null;\n }\n let resetItem: Partial<FormListType> = {\n ...item,\n };\n // 类型是Union,有rule,添加必选项*号\n resetItem.label = unionRuleStyle(resetItem);\n // 移除Form.Item不需要的属性\n resetItem = _.omit(resetItem, [\n 'colProps',\n 'componentName',\n 'selectData',\n 'inputConfig',\n 'inputNumberConfig',\n 'datePickerConfig',\n 'rangePickerConfig',\n 'timeRangePickerConfig',\n 'timePickerConfig',\n 'inputAutoCompleteConfig',\n 'unionConfig',\n 'remoteConfig',\n 'selectConfig',\n 'regionSelectionConfig',\n 'treeSelectConfig',\n 'rows',\n 'render',\n 'rangePickerPlaceholder',\n 'timeRangePickerPlaceholder',\n 'visible',\n 'selectIsHideAll',\n 'rateConfig',\n 'inputChange',\n 'inputNumberChange',\n 'inputAutoCompleteChange',\n 'inputEnter',\n 'textAreaChange',\n 'autoCompleteChange',\n 'selectChange',\n 'multipleChange',\n 'remoteSearchChange',\n 'datePickerChange',\n 'rangePickerChange',\n 'timeRangePickerChange',\n 'timePickerChange',\n 'switchChange',\n 'radioChange',\n 'checkboxChange',\n 'cascaderChange',\n 'rateChange',\n ]);\n // Form.Item内有多个表单(Union类型),如果有设置name移除name\n if (item.componentName === 'Union') {\n resetItem = _.omit(resetItem, ['name']);\n }\n // 为防止colProps和colGirdConfig重叠,优先显示colProps\n let grid: any = undefined;\n if (item.colProps) {\n grid = item.colProps;\n } else {\n grid = colGirdConfig;\n }\n return (\n <Col {...grid} key={index} style={{ display: item.visible === false ? 'none' : 'block' }}>\n <Form.Item\n className={item.componentName === 'HideInput' ? 'hide-item' : undefined}\n {...resetItem}\n >\n {childForm}\n </Form.Item>\n {item.render && item.render()}\n </Col>\n );\n });\n }, [\n list,\n state.selectMultiple,\n state.remoteFetching,\n state.remoteData,\n state.treeSelectData,\n state.treeSelectFlattenData,\n colGirdConfig,\n setState,\n fetchRemote,\n fetchTreeSelect,\n form,\n regionLoadData,\n ]);\n\n // 缓存渲染列表,减少重复计算\n const renderedList = useMemo(() => formRender(), [formRender]);\n\n /**\n * @Description 设置全局表单默认查询\n * @Author bihongbin\n * @Date 2020-10-14 14:25:54\n */\n useEffect(() => {\n if (list) {\n let obj: AnyObjectType = {};\n for (let item of list) {\n // 远程搜索默认查询\n if (item.componentName === 'RemoteSearch') {\n if (item.name && !remoteRef.current[item.name]) {\n if (item.remoteConfig && item.remoteConfig.initLoad !== false) {\n fetchRemote(undefined, item);\n }\n }\n }\n // 设置树数据\n if (item.componentName === 'TreeSelect') {\n if (item.name && !treeSelectRef.current[item.name]) {\n if (item.treeSelectConfig && item.treeSelectConfig.data) {\n fetchTreeSelect(item); // 查询树选择数据\n }\n }\n }\n }\n form.setFieldsValue(obj);\n }\n }, [fetchRemote, fetchTreeSelect, form, list]);\n\n // 暴漏给父组件调用\n useImperativeHandle<any, FormCallType>(ref, () => ({\n // 获取对应的字段值\n getFormValues: (data) => {\n return form.getFieldsValue(data);\n },\n // 设置一组字段状态\n setFormFields: (fields) => {\n form.setFields(fields);\n },\n // 设置表单值\n setFormValues: (values) => {\n form.setFieldsValue(values);\n setTimeout(() => {\n // 设置表单值后,远程搜索数据需要重新查一遍\n list.forEach((item) => {\n if (item.componentName === 'RemoteSearch') {\n if (item.remoteConfig && item.remoteConfig.reLoad) {\n fetchRemote(undefined, item);\n }\n }\n });\n }, 100);\n },\n // 提交表单\n formSubmit: (nameList) => {\n return new Promise((resolve, reject) => {\n form\n .validateFields(nameList)\n .then((values) => {\n for (let item in values) {\n // String类型去掉前后空格\n if (\n typeofEqual({\n data: values[item],\n type: 'String',\n })\n ) {\n values[item] = values[item].replace(/(^\\s*)|(\\s*$)/g, '');\n }\n }\n resolve(values);\n })\n .catch((err) => {\n if (err.errorFields && err.errorFields.length) {\n console.warn('请输入或选择表单必填项:', err);\n message.warning('请输入或选择表单必填项', 1.5);\n }\n reject(new Error('false'));\n });\n });\n },\n // 重置表单\n formReset: (fields) => {\n form.resetFields(fields);\n return form.getFieldsValue();\n },\n }));\n\n return (\n <ConfigProvider>\n <Form\n name={uid}\n className={`generate-form ${className ? className : ''}`}\n form={form}\n {...formConfig}\n initialValues={{\n sortSeq: 10,\n startTime: dayjs(`${new Date().getFullYear()}-01-01`),\n endTime: dayjs('2099-12-31'),\n ...(formConfig ? formConfig.initialValues : undefined),\n }}\n >\n <Row {...rowGridConfig}>\n {renderedList}\n {render ? (\n <Col>\n <Form.Item>{render && render()}</Form.Item>\n </Col>\n ) : null}\n </Row>\n </Form>\n </ConfigProvider>\n );\n}\n\nexport default forwardRef(GenerateForm);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction stringifiable(obj) {\n // Safely stringify Object.create(null)\n /* istanbul ignore next */\n return typeof obj === 'object' && !('toString' in obj) ?\n Object.prototype.toString.call(obj).slice(8, -1) :\n obj;\n}\nvar isProduction = typeof process === 'object' && process.env.NODE_ENV === 'production';\nfunction invariant(condition, message) {\n if (!condition) {\n /* istanbul ignore next */\n if (isProduction) {\n throw new Error('Invariant failed');\n }\n throw new Error(message());\n }\n}\nexports.invariant = invariant;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar splice = Array.prototype.splice;\nvar toString = Object.prototype.toString;\nfunction type(obj) {\n return toString.call(obj).slice(8, -1);\n}\nvar assign = Object.assign || /* istanbul ignore next */ (function (target, source) {\n getAllKeys(source).forEach(function (key) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n });\n return target;\n});\nvar getAllKeys = typeof Object.getOwnPropertySymbols === 'function'\n ? function (obj) { return Object.keys(obj).concat(Object.getOwnPropertySymbols(obj)); }\n /* istanbul ignore next */\n : function (obj) { return Object.keys(obj); };\nfunction copy(object) {\n return Array.isArray(object)\n ? assign(object.constructor(object.length), object)\n : (type(object) === 'Map')\n ? new Map(object)\n : (type(object) === 'Set')\n ? new Set(object)\n : (object && typeof object === 'object')\n ? assign(Object.create(Object.getPrototypeOf(object)), object)\n /* istanbul ignore next */\n : object;\n}\nvar Context = /** @class */ (function () {\n function Context() {\n this.commands = assign({}, defaultCommands);\n this.update = this.update.bind(this);\n // Deprecated: update.extend, update.isEquals and update.newContext\n this.update.extend = this.extend = this.extend.bind(this);\n this.update.isEquals = function (x, y) { return x === y; };\n this.update.newContext = function () { return new Context().update; };\n }\n Object.defineProperty(Context.prototype, \"isEquals\", {\n get: function () {\n return this.update.isEquals;\n },\n set: function (value) {\n this.update.isEquals = value;\n },\n enumerable: true,\n configurable: true\n });\n Context.prototype.extend = function (directive, fn) {\n this.commands[directive] = fn;\n };\n Context.prototype.update = function (object, $spec) {\n var _this = this;\n var spec = (typeof $spec === 'function') ? { $apply: $spec } : $spec;\n if (!(Array.isArray(object) && Array.isArray(spec))) {\n invariant(!Array.isArray(spec), function () { return \"update(): You provided an invalid spec to update(). The spec may \" +\n \"not contain an array except as the value of $set, $push, $unshift, \" +\n \"$splice or any custom command allowing an array value.\"; });\n }\n invariant(typeof spec === 'object' && spec !== null, function () { return \"update(): You provided an invalid spec to update(). The spec and \" +\n \"every included key path must be plain objects containing one of the \" +\n (\"following commands: \" + Object.keys(_this.commands).join(', ') + \".\"); });\n var nextObject = object;\n getAllKeys(spec).forEach(function (key) {\n if (hasOwnProperty.call(_this.commands, key)) {\n var objectWasNextObject = object === nextObject;\n nextObject = _this.commands[key](spec[key], nextObject, spec, object);\n if (objectWasNextObject && _this.isEquals(nextObject, object)) {\n nextObject = object;\n }\n }\n else {\n var nextValueForKey = type(object) === 'Map'\n ? _this.update(object.get(key), spec[key])\n : _this.update(object[key], spec[key]);\n var nextObjectValue = type(nextObject) === 'Map'\n ? nextObject.get(key)\n : nextObject[key];\n if (!_this.isEquals(nextValueForKey, nextObjectValue)\n || typeof nextValueForKey === 'undefined'\n && !hasOwnProperty.call(object, key)) {\n if (nextObject === object) {\n nextObject = copy(object);\n }\n if (type(nextObject) === 'Map') {\n nextObject.set(key, nextValueForKey);\n }\n else {\n nextObject[key] = nextValueForKey;\n }\n }\n }\n });\n return nextObject;\n };\n return Context;\n}());\nexports.Context = Context;\nvar defaultCommands = {\n $push: function (value, nextObject, spec) {\n invariantPushAndUnshift(nextObject, spec, '$push');\n return value.length ? nextObject.concat(value) : nextObject;\n },\n $unshift: function (value, nextObject, spec) {\n invariantPushAndUnshift(nextObject, spec, '$unshift');\n return value.length ? value.concat(nextObject) : nextObject;\n },\n $splice: function (value, nextObject, spec, originalObject) {\n invariantSplices(nextObject, spec);\n value.forEach(function (args) {\n invariantSplice(args);\n if (nextObject === originalObject && args.length) {\n nextObject = copy(originalObject);\n }\n splice.apply(nextObject, args);\n });\n return nextObject;\n },\n $set: function (value, _nextObject, spec) {\n invariantSet(spec);\n return value;\n },\n $toggle: function (targets, nextObject) {\n invariantSpecArray(targets, '$toggle');\n var nextObjectCopy = targets.length ? copy(nextObject) : nextObject;\n targets.forEach(function (target) {\n nextObjectCopy[target] = !nextObject[target];\n });\n return nextObjectCopy;\n },\n $unset: function (value, nextObject, _spec, originalObject) {\n invariantSpecArray(value, '$unset');\n value.forEach(function (key) {\n if (Object.hasOwnProperty.call(nextObject, key)) {\n if (nextObject === originalObject) {\n nextObject = copy(originalObject);\n }\n delete nextObject[key];\n }\n });\n return nextObject;\n },\n $add: function (values, nextObject, _spec, originalObject) {\n invariantMapOrSet(nextObject, '$add');\n invariantSpecArray(values, '$add');\n if (type(nextObject) === 'Map') {\n values.forEach(function (_a) {\n var key = _a[0], value = _a[1];\n if (nextObject === originalObject && nextObject.get(key) !== value) {\n nextObject = copy(originalObject);\n }\n nextObject.set(key, value);\n });\n }\n else {\n values.forEach(function (value) {\n if (nextObject === originalObject && !nextObject.has(value)) {\n nextObject = copy(originalObject);\n }\n nextObject.add(value);\n });\n }\n return nextObject;\n },\n $remove: function (value, nextObject, _spec, originalObject) {\n invariantMapOrSet(nextObject, '$remove');\n invariantSpecArray(value, '$remove');\n value.forEach(function (key) {\n if (nextObject === originalObject && nextObject.has(key)) {\n nextObject = copy(originalObject);\n }\n nextObject.delete(key);\n });\n return nextObject;\n },\n $merge: function (value, nextObject, _spec, originalObject) {\n invariantMerge(nextObject, value);\n getAllKeys(value).forEach(function (key) {\n if (value[key] !== nextObject[key]) {\n if (nextObject === originalObject) {\n nextObject = copy(originalObject);\n }\n nextObject[key] = value[key];\n }\n });\n return nextObject;\n },\n $apply: function (value, original) {\n invariantApply(value);\n return value(original);\n },\n};\nvar defaultContext = new Context();\nexports.isEquals = defaultContext.update.isEquals;\nexports.extend = defaultContext.extend;\nexports.default = defaultContext.update;\n// @ts-ignore\nexports.default.default = module.exports = assign(exports.default, exports);\n// invariants\nfunction invariantPushAndUnshift(value, spec, command) {\n invariant(Array.isArray(value), function () { return \"update(): expected target of \" + stringifiable(command) + \" to be an array; got \" + stringifiable(value) + \".\"; });\n invariantSpecArray(spec[command], command);\n}\nfunction invariantSpecArray(spec, command) {\n invariant(Array.isArray(spec), function () { return \"update(): expected spec of \" + stringifiable(command) + \" to be an array; got \" + stringifiable(spec) + \". \" +\n \"Did you forget to wrap your parameter in an array?\"; });\n}\nfunction invariantSplices(value, spec) {\n invariant(Array.isArray(value), function () { return \"Expected $splice target to be an array; got \" + stringifiable(value); });\n invariantSplice(spec.$splice);\n}\nfunction invariantSplice(value) {\n invariant(Array.isArray(value), function () { return \"update(): expected spec of $splice to be an array of arrays; got \" + stringifiable(value) + \". \" +\n \"Did you forget to wrap your parameters in an array?\"; });\n}\nfunction invariantApply(fn) {\n invariant(typeof fn === 'function', function () { return \"update(): expected spec of $apply to be a function; got \" + stringifiable(fn) + \".\"; });\n}\nfunction invariantSet(spec) {\n invariant(Object.keys(spec).length === 1, function () { return \"Cannot have more than one key in an object with $set\"; });\n}\nfunction invariantMerge(target, specValue) {\n invariant(specValue && typeof specValue === 'object', function () { return \"update(): $merge expects a spec of type 'object'; got \" + stringifiable(specValue); });\n invariant(target && typeof target === 'object', function () { return \"update(): $merge expects a target of type 'object'; got \" + stringifiable(target); });\n}\nfunction invariantMapOrSet(target, command) {\n var typeOfTarget = type(target);\n invariant(typeOfTarget === 'Map' || typeOfTarget === 'Set', function () { return \"update(): \" + stringifiable(command) + \" expects a target of type Set or Map; got \" + stringifiable(typeOfTarget); });\n}\n","import React, { memo, useCallback, useMemo, useState, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Resizable } from 'react-resizable';\n\nconst ResizableTitle = ({ onResize, width, ...restProps }: any) => {\n const stopClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n }, []);\n\n // 本地宽度状态:拖拽过程中即时更新,结束后再提交给父级\n const [localWidth, setLocalWidth] = useState<number>(typeof width === 'number' ? width : 0);\n useEffect(() => {\n if (typeof width === 'number') {\n setLocalWidth(width);\n }\n }, [width]);\n\n const draggableOpts = useMemo(() => ({ enableUserSelectHack: false }), []);\n\n // Always render Resizable to avoid switching wrapper during drag\n const safeWidth = localWidth;\n const handleNode =\n localWidth > 0 ? (\n <span className=\"react-resizable-handle\" onMouseDown={stopClick} onClick={stopClick} />\n ) : undefined;\n const thRef = useRef<HTMLElement | null>(null);\n const containerElRef = useRef<HTMLElement | null>(null);\n const [containerRect, setContainerRect] = useState<DOMRect | null>(null);\n\n // 当未提供数值型 width 时,首次渲染后测量实际宽度作为初始拖拽宽度\n useEffect(() => {\n if (typeof width !== 'number' && thRef.current) {\n const measured = thRef.current.offsetWidth;\n if (measured > 0) {\n setLocalWidth(measured);\n }\n }\n }, [width]);\n\n const MIN_WIDTH = 80;\n const MAX_WIDTH = 10000;\n\n const clamp = (val: number) => Math.min(Math.max(val, MIN_WIDTH), MAX_WIDTH);\n const rafIdRef = useRef<number | null>(null);\n const onResizeSafe =\n localWidth > 0\n ? (e: React.SyntheticEvent, data: any) => {\n const evt = e as unknown as MouseEvent;\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n rafIdRef.current = requestAnimationFrame(() => {\n setDragX(evt.clientX);\n setLocalWidth(clamp(data.size.width));\n rafIdRef.current = null;\n });\n }\n : undefined;\n const onResizeStopSafe =\n localWidth > 0\n ? (e: React.SyntheticEvent, data: any) => {\n setIsResizing(false);\n const finalWidth = clamp(data.size.width);\n onResize && onResize(e, { ...data, size: { ...data.size, width: finalWidth } });\n setDragX(null);\n setContainerRect(null);\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n }\n : undefined;\n\n // 拖拽中的虚线指示\n const [isResizing, setIsResizing] = useState(false);\n const [dragX, setDragX] = useState<number | null>(null);\n const onResizeStartSafe =\n localWidth > 0\n ? (e: React.SyntheticEvent) => {\n setIsResizing(true);\n const evt = e as unknown as MouseEvent;\n setDragX(evt.clientX);\n // 计算并缓存容器信息(限定在表格容器内显示虚线)\n const thEl = thRef.current;\n if (thEl) {\n const container = thEl.closest('.ant-table-container') as HTMLElement | null;\n containerElRef.current = container ?? null;\n if (container) {\n setContainerRect(container.getBoundingClientRect());\n } else {\n setContainerRect(null);\n }\n }\n }\n : undefined;\n\n return (\n <Resizable\n width={safeWidth}\n height={0}\n handle={handleNode}\n onResizeStart={onResizeStartSafe}\n onResize={onResizeSafe}\n onResizeStop={onResizeStopSafe}\n draggableOpts={draggableOpts}\n >\n <th\n {...restProps}\n ref={thRef}\n style={{ position: 'relative', width: safeWidth, ...restProps.style }}\n >\n {isResizing && (\n <>\n {/* 跨列虚线(限定在表格容器内)*/}\n {dragX !== null &&\n containerElRef.current &&\n containerRect &&\n createPortal(\n <span\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: dragX - containerRect.left,\n width: 0,\n borderLeft: '1px dashed #ccc',\n pointerEvents: 'none',\n zIndex: 9,\n }}\n />,\n containerElRef.current,\n )}\n </>\n )}\n {restProps.children}\n </th>\n </Resizable>\n );\n};\nexport default memo(ResizableTitle);\n","import React, {\n useState,\n useContext,\n useEffect,\n useRef,\n useCallback,\n useMemo,\n memo,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport _ from 'lodash';\nimport dayjs from 'dayjs';\nimport { Form, Input, Select, DatePicker, Spin } from 'antd';\nimport { FormItemProps } from 'antd/es/form';\nimport { useDrag, useDrop } from 'react-dnd';\nimport { SelectType, AnyObjectType } from '../../brother/typings';\nimport { typeofEqual, getSelectValue } from '../../brother/utils';\nimport { TableColumns } from '..';\nimport './index.less';\n\nconst { Option } = Select;\nconst EditableContext = React.createContext<any>(null);\n\ntype remoteValueType = string | undefined;\ntype remotePromiseType = (value: remoteValueType, record: AnyObjectType) => Promise<SelectType[]>;\n\ntype SpanType = number | undefined;\n\ntype CellType = {\n rowSpan?: SpanType;\n colSpan?: SpanType;\n};\n\nexport interface EditableColumnsType {\n /** 纵向合并单元格 */\n rowSpanNum: SpanType | ((record: AnyObjectType, index: number) => SpanType);\n /** 横向向合并单元格 */\n colSpanNum: SpanType | ((record: AnyObjectType, index: number) => SpanType);\n /** 是否打开可编辑单元格 */\n editable: boolean | ((record: AnyObjectType, index: number) => boolean);\n /** 整数输入框 */\n inputType: 'number';\n /** 单元格表单类型 */\n valueType:\n | 'Select'\n | 'AutoComplete'\n | 'RecordSelect'\n | 'RemoteSearch'\n | 'DatePicker'\n | 'DateTimePicker';\n /** 单元格select值 */\n valueEnum: SelectType[];\n recordSelectField: string;\n /** 表单值改变触发 */\n formChange: (record: AnyObjectType) => AnyObjectType | void;\n remoteConfig: {\n /** 远程搜索的api */\n remoteApi: remotePromiseType;\n /** 远程搜索模式为多选或标签 */\n remoteMode?: 'multiple' | 'tags';\n };\n /** 可编辑单元格表单验证 */\n formItemProps: {\n rules: FormItemProps['rules'];\n };\n /** 自定义渲染值(在原有的内容上增加新的结构),childNode是原有的内容 */\n controlRender: (record: AnyObjectType, childNode: React.ReactNode) => React.ReactNode;\n /** 表单项placeholder */\n placeholder?: string;\n /** 表单值变化是否触发远程搜索下拉数据更新 */\n triggerRemoteSearch?: boolean;\n}\n\n/** 可编辑单元格 */\nexport type EditableCellProps<T = AnyObjectType> = {\n className?: string;\n title: React.ReactNode;\n children: React.ReactNode;\n dataIndex: string;\n recordIndex: number;\n record: T;\n render?: (value: any, record: T, index: number) => React.ReactNode;\n /** 保存表单的值 */\n handleSave: (record: T, dataIndex: string) => void;\n columns: TableColumns[];\n} & EditableColumnsType;\n\nexport type EditableCellVC = EditableCellProps & CellType;\n\nexport interface DraggableBodyRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n /** 是否打开拖拽功能 */\n open: boolean;\n /** 拖拽事件 */\n moveRow: (dragIndex: number, hoverIndex: number) => void;\n /** 索引 */\n index: number;\n}\n// 移除 virtuallist-antd 的 vc 相关类型\n\nexport const EditableRow = memo(\n forwardRef<HTMLTableRowElement, DraggableBodyRowProps>(\n ({ open, index, moveRow, className, style, ...restProps }, forwardedRef) => {\n const [form] = Form.useForm();\n const innerRef = useRef<HTMLTableRowElement>(null);\n\n // 将内部 DOM 节点暴露给外部 RefObject(避免直接赋值 readonly 的 current)\n useImperativeHandle(forwardedRef, () => innerRef.current as HTMLTableRowElement, []);\n\n const [{ isOver, dropClassName }, drop] = useDrop({\n accept: 'DraggableBodyRow',\n collect: (monitor) => {\n const { index: dragIndex } = monitor.getItem() || ({} as any);\n if (dragIndex === index) {\n return {} as any;\n }\n return {\n isOver: monitor.isOver(),\n dropClassName: dragIndex < index ? ' drop-over-downward' : ' drop-over-upward',\n } as any;\n },\n drop: (item: { index: number }) => {\n moveRow(item.index, index);\n },\n });\n\n const [, drag] = useDrag({\n type: 'DraggableBodyRow',\n item: { index },\n collect: (monitor) => ({\n isDragging: monitor.isDragging(),\n }),\n });\n\n if (open) {\n drop(drag(innerRef));\n }\n\n const tempProps = {\n ref: innerRef,\n className: `${className}${isOver ? dropClassName : ''}`,\n style: { cursor: open ? 'move' : 'auto', ...style },\n ...restProps,\n } as React.HTMLAttributes<HTMLTableRowElement> & { ref: React.Ref<HTMLTableRowElement> };\n\n return (\n <Form size=\"small\" component={false} form={form}>\n <EditableContext.Provider value={form}>\n <tr {...(tempProps as any)} />\n </EditableContext.Provider>\n </Form>\n );\n },\n ),\n (prev: DraggableBodyRowProps, next: DraggableBodyRowProps) => {\n return (\n prev.index === next.index &&\n prev.open === next.open &&\n prev.className === next.className &&\n prev.style === next.style &&\n prev.moveRow === next.moveRow\n );\n },\n);\nconst EditableCell: React.FC<EditableCellProps & CellType> = ({\n columns,\n record,\n recordIndex,\n dataIndex,\n title,\n rowSpanNum,\n colSpanNum,\n rowSpan,\n colSpan,\n editable,\n inputType,\n valueType,\n valueEnum,\n recordSelectField,\n controlRender,\n render,\n formChange,\n remoteConfig,\n children,\n formItemProps,\n handleSave,\n placeholder,\n triggerRemoteSearch,\n ...restProps\n}) => {\n const form = useContext(EditableContext);\n // 打开关闭表单\n const [editing, setEditing] = useState(false);\n // 远程搜索loading\n const [remoteFetching, setRemoteFetching] = useState(false);\n // 远程搜索数据结果\n const [remoteData, setRemoteData] = useState<{ [key: string]: SelectType[] }>({});\n // 表单项\n const formItemRef = useRef<any>(null);\n\n useEffect(() => {\n if (editing) {\n formItemRef.current!.focus();\n }\n }, [editing]);\n\n useEffect(() => {\n if (\n valueType === 'RemoteSearch' &&\n record &&\n record[dataIndex] &&\n remoteConfig?.remoteApi &&\n triggerRemoteSearch\n ) {\n fetchRemote(undefined, dataIndex, record, remoteConfig?.remoteApi);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [remoteConfig?.remoteApi, record?.[dataIndex], triggerRemoteSearch]);\n\n /**\n * @Description 远程数据搜索\n * @Author bihongbin\n * @Date 2021-01-05 11:14:45\n */\n const fetchRemote = (\n value: remoteValueType,\n fieldName: string | undefined,\n record: AnyObjectType,\n remoteApi?: remotePromiseType,\n ) => {\n if (remoteApi) {\n setRemoteFetching(true);\n remoteApi(value, record).then((res) => {\n setRemoteFetching(false);\n if (fieldName) {\n setRemoteData((prev) => ({\n ...prev,\n [fieldName]: res,\n }));\n }\n });\n }\n };\n\n // 表单失去焦点\n const blurEditing = () => {\n closeEdit();\n };\n\n // 关闭表单显示\n const closeEdit = () => {\n setEditing(false);\n };\n\n // 表单和文本切换\n const toggleEdit = () => {\n let curVal = record[dataIndex];\n if (curVal !== undefined && curVal !== null && curVal !== '') {\n if (valueType === 'DatePicker' || valueType === 'DateTimePicker') {\n curVal = dayjs(curVal);\n }\n if (dataIndex === 'status') {\n curVal = String(curVal);\n }\n }\n setEditing(!editing);\n form.setFieldsValue({ [dataIndex]: curVal });\n };\n\n // 处理时间组件值转为filed格式\n const filterTime = useCallback(\n (data: AnyObjectType) => {\n const filed = {\n DateTimePicker: 'YYYY-MM-DD HH:mm:ss',\n DatePicker: 'YYYY-MM-DD',\n };\n if (Object.keys(filed).includes(valueType) && data[dataIndex]) {\n data[dataIndex] = data[dataIndex].format(filed[valueType as keyof typeof filed]);\n }\n return data;\n },\n [valueType, dataIndex],\n );\n\n // 处理显示结果\n const filterContent = useMemo(() => {\n if (valueType && dataIndex) {\n if (valueEnum && (valueType === 'Select' || valueType === 'AutoComplete')) {\n return getSelectValue(valueEnum, record[dataIndex]);\n }\n if (valueType === 'RemoteSearch') {\n if (remoteData[dataIndex]) {\n return getSelectValue(remoteData[dataIndex], record[dataIndex]);\n }\n }\n if (record[recordSelectField] && valueType === 'RecordSelect') {\n return getSelectValue(record[recordSelectField], record[dataIndex]);\n }\n if (dayjs.isDayjs(record[dataIndex])) {\n return filterTime({ ...record })[dataIndex];\n }\n }\n return children;\n }, [\n valueType,\n dataIndex,\n valueEnum,\n remoteData,\n record,\n children,\n recordSelectField,\n filterTime,\n ]);\n\n // 显示不同类型的表单\n const filterFormType = (type: EditableCellProps['valueType'], title: string) => {\n let node: React.ReactNode = null;\n const filterOption = (input: string, option: any) => {\n let str = '';\n // 递归\n const deep = function (o: any) {\n for (let i of o) {\n // 节点值可能为undefined或null\n if (i) {\n if (typeofEqual({ data: i, type: 'String' })) {\n str += i;\n } else {\n const children = i.props.children;\n if (typeofEqual({ data: children, type: 'Object' })) {\n deep([children]);\n }\n if (typeofEqual({ data: children, type: 'Array' })) {\n deep(children);\n }\n if (typeofEqual({ data: children, type: 'String' })) {\n str += children;\n }\n }\n }\n }\n };\n deep([option.children]);\n return str.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n };\n // 渲染option\n const optionNode = (data: SelectType[]) => {\n if (_.isArray(data)) {\n return data.map((m, i: number) => (\n <Option key={i} value={m.value}>\n {m.label}\n </Option>\n ));\n }\n return null;\n };\n switch (type) {\n case 'RecordSelect':\n node = (\n <Select\n ref={formItemRef}\n open={editing}\n allowClear\n showSearch\n popupMatchSelectWidth={false}\n placeholder={placeholder || title}\n onChange={save}\n onBlur={blurEditing}\n optionFilterProp=\"children\"\n filterOption={filterOption}\n >\n {optionNode(record[recordSelectField])}\n </Select>\n );\n break;\n case 'Select':\n node = (\n <Select\n ref={formItemRef}\n open={editing}\n popupMatchSelectWidth={false}\n onChange={save}\n onBlur={blurEditing}\n placeholder={placeholder || title}\n >\n {optionNode(valueEnum)}\n </Select>\n );\n break;\n\n case 'DatePicker':\n node = (\n <DatePicker\n ref={formItemRef}\n open={editing}\n onChange={save}\n onBlur={blurEditing}\n placeholder={placeholder || title}\n />\n );\n break;\n case 'DateTimePicker':\n node = (\n <DatePicker\n ref={formItemRef}\n open={editing}\n onChange={save}\n onBlur={blurEditing}\n placeholder={placeholder || title}\n showTime\n />\n );\n break;\n case 'AutoComplete':\n node = (\n <Select\n ref={formItemRef}\n open={editing}\n allowClear\n showSearch\n popupMatchSelectWidth={false}\n placeholder={placeholder || title}\n onChange={save}\n onBlur={blurEditing}\n optionFilterProp=\"children\"\n filterOption={filterOption}\n >\n {optionNode(valueEnum)}\n </Select>\n );\n break;\n case 'RemoteSearch':\n let selectData = valueEnum;\n if (remoteData[dataIndex]) {\n selectData = remoteData[dataIndex];\n }\n node = (\n <Select\n ref={formItemRef}\n open={editing}\n mode={remoteConfig.remoteMode}\n placeholder={placeholder || title}\n notFoundContent={remoteFetching ? <Spin size=\"small\" /> : null}\n popupMatchSelectWidth={false}\n filterOption={false}\n allowClear\n showSearch\n onChange={save}\n onBlur={blurEditing}\n // 当获取焦点查询全部\n onFocus={() => fetchRemote(undefined, dataIndex, record, remoteConfig.remoteApi)}\n onSearch={(value) => fetchRemote(value, dataIndex, record, remoteConfig.remoteApi)}\n >\n {dataIndex && optionNode(selectData)}\n </Select>\n );\n break;\n default:\n node = (\n <Input\n ref={formItemRef}\n onPressEnter={save}\n onBlur={save}\n placeholder={placeholder || title}\n type={inputType ? inputType : 'text'}\n />\n );\n break;\n }\n return node;\n };\n\n // 更新值到record\n const save = async () => {\n try {\n const values = await form.validateFields();\n let data = { ...record, ...values };\n\n data[dataIndex] = data[dataIndex] || undefined;\n\n data = filterTime(data);\n\n if (formChange) {\n data = (await formChange(data)) || data; // 单元格值改变触发\n }\n\n if (record[dataIndex] !== data[dataIndex]) {\n handleSave(data, dataIndex);\n }\n\n closeEdit();\n } catch (errInfo) {\n console.log('保存表单字段失败:', errInfo);\n }\n };\n\n let childNode = children;\n const filterResult = useMemo(\n () => (render ? render(record[dataIndex], record, recordIndex) : filterContent),\n [render, record, recordIndex, dataIndex, filterContent],\n );\n\n if (editable) {\n childNode = editing ? (\n <div className=\"editable-form-item-wrap\">\n <Form.Item\n style={{ margin: 0 }}\n name={dataIndex}\n rules={formItemProps ? formItemProps.rules : undefined}\n >\n {filterFormType(valueType, title as string)}\n </Form.Item>\n </div>\n ) : (\n <div className=\"editable-cell-value-wrap\" onClick={toggleEdit}>\n {filterResult}\n </div>\n );\n } else {\n childNode = filterResult;\n }\n\n if (controlRender) {\n childNode = controlRender(record, childNode);\n }\n\n const vcRender = useCallback((rest: any, dom: React.ReactNode) => {\n return <td {...rest}>{dom}</td>;\n }, []);\n\n if (rowSpan || colSpan) {\n return vcRender(\n {\n ...restProps,\n rowSpan: rowSpan,\n colSpan: colSpan,\n title: record && record[dataIndex],\n },\n childNode,\n );\n }\n\n if (rowSpanNum !== 0 && colSpanNum !== 0) {\n return vcRender(\n {\n ...restProps,\n rowSpan: rowSpanNum,\n colSpan: rowSpan,\n title: record && record[dataIndex],\n },\n childNode,\n );\n }\n\n return null;\n};\n\nexport default memo(EditableCell);\n","import React from 'react';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\n\nconst DndContext = HTML5Backend;\n\n/** 使用react-dnd外层嵌套 */\nconst DndContainer: React.FC<{ children: React.ReactNode }> = (props) => {\n return (\n <DndProvider backend={DndContext} context={window}>\n {props.children}\n </DndProvider>\n );\n};\n\nexport default DndContainer;\n","import React, {\n useState,\n useRef,\n useImperativeHandle,\n useMemo,\n useCallback,\n useEffect,\n forwardRef,\n} from 'react';\nimport { memo } from 'react';\nimport _ from 'lodash';\nimport { Table } from 'antd';\nimport { TablePaginationConfig, TableProps, ColumnType } from 'antd/es/table';\nimport { TableRowSelection } from 'antd/es/table/interface';\nimport update from 'immutability-helper';\nimport ConfigProvider from '../brother/ConfigProvider';\nimport ResizableTitle from './ResizableTitle';\nimport EditableCell, { EditableRow, EditableColumnsType, EditableCellProps } from './EditableCell';\nimport { AnyObjectType, PromiseAxiosResultType } from '../brother/typings';\nimport hooks from '../brother/hooks';\nimport DndWrap from '../brother/DndWrap';\nimport './index.less';\n\n// 导出表格头类型\nexport type TableColumns<T = AnyObjectType> = ColumnType<T> & Partial<EditableColumnsType>;\n\nexport interface getTableListQueryType {\n /** 分页值 */\n current?: number;\n /** 是否清空选中项(ids和rows) */\n clearSelectIds?: boolean;\n /** 传此参数不重置分页 */\n pagination?: 'not-reset';\n [key: string]: any;\n}\n\n// 导出该组件可调用的方法类型\nexport interface TableCallType {\n // 设置加载loading\n setTableLoading: (data: boolean) => void;\n /** 调用接口手动加载数据 */\n getTableList: (values?: getTableListQueryType, callBack?: () => void) => void;\n /** 获取分页数据 */\n getPages: () => TablePaginationType | undefined;\n /** 设置选中id,当设置original=true时,不会重置selectRowIds,会在原有的selectRowIds扩展 */\n setRowSelected: (selectedRowKeys: any[], original?: true) => void;\n /** 设置选中列数据[{}] */\n setRowSelectedBy: (data: AnyObjectType[]) => void;\n /** 获取选中id */\n getSelectIds: () => any[];\n /** 清空选中 */\n clearSelectIds: () => void;\n /** 获取选中的数据项 */\n getSelectRowsArray: () => AnyObjectType[];\n /** 删除选中id */\n removeSelectIds: (data: string[]) => void;\n /** 获取表格静态数据 */\n getStaticDataList: () => AnyObjectType[];\n /** 设置表格静态数据 */\n setStaticDataList: (row: AnyObjectType | AnyObjectType[], callback?: () => void) => void;\n}\n\nexport type ScrollXYType = {\n x?: string | number | true | undefined;\n y?: string | number | undefined;\n};\n\n// 虚拟滚动配置\nexport interface VirtualProps {\n /** 虚拟滚动高度,该高度必须和table.scroll.y值一样,否则会出现滚动条不显示的问题 */\n height: number | string;\n onReachEnd?: () => void;\n onScroll?: () => void;\n onListRender?: (listInfo: { start: number; renderLen: number }) => void;\n debounceListRenderMS?: number;\n vid?: string;\n resetTopWhenDataChange?: boolean;\n}\n\n// 组件传参配置\nexport interface GenerateTableProp {\n extra: {\n /** 支持antd Table组件官方传参所有类型 */\n tableConfig?: TableProps<any>;\n /** 是否开启表格行选中 checkbox多选 radio单选 */\n rowType?: 'checkbox' | 'radio' | undefined;\n /** 开启固定列参数 */\n scroll?: ScrollXYType;\n /** 列表请求函数 */\n apiMethod?: (data: any) => PromiseAxiosResultType;\n /** 表格头 */\n columns: TableColumns<AnyObjectType>[];\n /** 静态表格数据 */\n data?: AnyObjectType[];\n /** 表格数据编辑是否是受控组件(该参数已丢弃) */\n controlled?: boolean;\n /** 列拖动功能 */\n drag?: {\n /** 打开与关闭 */\n open: boolean;\n /** 拖动回调 */\n moveRow: (\n /** 目标终点位置 */\n dragIndex: number,\n /** 目标开始位置 */\n hoverIndex: number,\n /** 拖拽完成后数据 */\n data: AnyObjectType[],\n /** 原数据 */\n prevData: AnyObjectType[],\n /** 拖拽范围数据 */\n range: AnyObjectType[],\n ) => Promise<boolean> | void;\n };\n /** 虚拟滚动功能 */\n virtual?: {\n /** 打开与关闭 */\n open: boolean;\n /** 虚拟滚动配置 */\n config: VirtualProps;\n };\n /**隐藏排序列 */\n hidSortColumn?: boolean;\n /** 行选中回调 */\n onSelect?: (selectedRows: AnyObjectType[], selectedRowKeys: any[]) => void;\n /** 控制分页格式 */\n paginationConfig?: false | TablePaginationConfig;\n /** 选择框的默认属性配置 */\n getCheckboxProps?: (record: AnyObjectType) => AnyObjectType;\n /** 数据结果过滤 */\n resultFilter?: (data: any) => Promise<AnyObjectType[]> | AnyObjectType[];\n /** 数据调用成功回调 */\n getTableSuccessData?: (data: AnyObjectType) => void;\n };\n}\n\ntype TablePaginationType = TablePaginationConfig & { pages: number; [key: string]: any };\n\ninterface StateType {\n /** 列表数据 */\n listData: AnyObjectType[];\n /** 表格选中行的key */\n selectRowIds: string[];\n /** 表格选中的所有数组 */\n selectRowArray: AnyObjectType[];\n}\n\n/** 动态表格 */\nconst GenerateTable = (props: GenerateTableProp, ref: any) => {\n // 父级props\n const extraProps = useMemo<GenerateTableProp['extra']>(() => {\n const extra = (props.extra || {}) as GenerateTableProp['extra'];\n\n return {\n tableConfig: extra.tableConfig,\n virtual: extra.virtual,\n rowType: extra.rowType,\n scroll: extra.scroll,\n apiMethod: extra.apiMethod,\n columns: extra.columns || [],\n data: extra.data,\n drag: extra.drag,\n onSelect: extra.onSelect,\n hidSortColumn: extra.hidSortColumn,\n paginationConfig: extra.paginationConfig,\n getCheckboxProps: extra.getCheckboxProps,\n resultFilter: extra.resultFilter,\n getTableSuccessData: extra.getTableSuccessData,\n };\n }, [props.extra]);\n\n const queryParameters = useRef<AnyObjectType>(); // 额外查询参数\n const isShowPagination = useRef<boolean>(true); // 是否显示分页,默认显示\n const queryPagination = useRef<TablePaginationType>({\n position: ['bottomCenter'], // 分页位置\n size: 'small', // 分页显示大小\n current: 1, // 当前第几页\n total: 0, // 总共多少条\n pages: 0, // 总共多少页\n pageSize: 10, // 每页显示多少条数据\n showSizeChanger: true, // 显示分页总数量\n orderByInfo: undefined, // 排序 1升序 -1降序\n });\n const columnsCacheRef = useRef<any[]>([]); // 缓存表格头拖拽以后的数据\n const [formatColumns, setFormatColumns] = useState<any[]>(extraProps.columns); // 表格头\n const [listLoading, setListLoading] = useState(false); // 列表loading\n const [state, setState] = hooks.useSetState<StateType>({\n listData: [],\n selectRowIds: [],\n selectRowArray: [],\n });\n // 表格横向纵向滚动条\n const [scrollXY, setScrollXY] = useState<ScrollXYType>({\n x: undefined,\n y: 330,\n });\n\n // rowKey\n const key = useMemo(() => {\n if (extraProps.tableConfig && extraProps.tableConfig.rowKey) {\n return extraProps.tableConfig.rowKey as string;\n } else {\n return 'id';\n }\n }, [extraProps.tableConfig]);\n\n // 自定义表格头和内容\n const VirtualEditableRow = React.forwardRef<any, any>((props, ref) => (\n <EditableRow {...props} ref={ref} />\n ));\n const VirtualEditableCell = React.forwardRef<any, any>((props, ref) => (\n <EditableCell {...props} ref={ref} />\n ));\n const components = useMemo(() => {\n return {\n header: {\n cell: ResizableTitle,\n },\n body: {\n row: VirtualEditableRow,\n cell: VirtualEditableCell,\n },\n };\n }, [VirtualEditableRow, VirtualEditableCell]);\n\n // 分页配置\n const paginationConfig: false | TablePaginationConfig =\n _.isFunction(extraProps.apiMethod) && isShowPagination.current\n ? {\n size: 'small',\n position: ['bottomCenter'],\n showTotal: (total) => `共${total}条`,\n showSizeChanger: true,\n showQuickJumper: true,\n ...queryPagination.current,\n }\n : false;\n\n /**\n * 合并去重([{ a: 9, id: 2 }], [{ a: 10, id: 2 }, { a: 12, id: 3 }]) => [{ a: 10, id: 2 }, { a: 12, id: 3 }]\n */\n const keyOriginPlace = useCallback(\n (prevData: AnyObjectType[], newData: AnyObjectType[]) => {\n // 创建一个Map用于存储合并后的数据\n const mergedMap = new Map();\n\n // 首先添加prevData中的数据\n prevData.forEach((item) => {\n mergedMap.set(item[key], item);\n });\n\n // 然后用newData中的数据覆盖或添加\n newData.forEach((item) => {\n mergedMap.set(item[key], item);\n });\n\n // 将Map转换回数组\n return Array.from(mergedMap.values());\n },\n [key],\n );\n\n /**\n * @Description 获取表格数据 values包含{ updateSelected: false }时,不会更新复选框和单选选中的值\n * @Author bihongbin\n * @Date 2020-06-24 14:43:05\n */\n const getList = useCallback(\n async (values?: AnyObjectType) => {\n let updateSelected = true; // 加载列表时,是否更新复选框和单选选中的值(默认更新)\n setListLoading(true);\n if (values) {\n if (values.updateSelected !== undefined) {\n updateSelected = values.updateSelected;\n delete values.updateSelected;\n }\n if (values.pagination === 'not-reset') {\n delete values.pagination;\n }\n queryParameters.current = {\n ...queryParameters.current,\n ...values,\n };\n }\n try {\n const queryParams: AnyObjectType = {\n ...queryParameters.current,\n };\n for (let item in queryPagination.current) {\n const itemValue = queryPagination.current[item];\n // 排序\n if (item === 'orderByInfo') {\n queryParams.orderByInfo = itemValue;\n }\n // 当前页\n if (item === 'current') {\n queryParams.page = itemValue;\n }\n // 当前条数\n if (item === 'pageSize') {\n queryParams.size = queryParams.size || itemValue;\n }\n }\n // 查询时,分页重置到第一页\n if (values && values.current) {\n queryParams.page = values.current;\n queryPagination.current.current = values.current;\n }\n if (extraProps.apiMethod) {\n delete queryParams.current;\n const result = await extraProps.apiMethod(_.pickBy(queryParams, _.identity));\n let content: AnyObjectType[] = [];\n // 有分页数据\n if (_.isArray(result.data.content)) {\n if (extraProps.paginationConfig !== false) {\n // 显示分页\n isShowPagination.current = true;\n } else {\n // 隐藏分页\n isShowPagination.current = false;\n }\n content = result.data.content;\n queryPagination.current.total = result.data.total;\n queryPagination.current.pages = result.data.pages;\n }\n // 无分页数据\n if (_.isArray(result.data)) {\n // 隐藏分页\n isShowPagination.current = false;\n content = result.data;\n }\n // 数据结果过滤\n if (extraProps.resultFilter) {\n content = await extraProps.resultFilter(content);\n }\n // 更新表格选中的数据id\n if (updateSelected) {\n setState((prev) => {\n let rowIds: string[] = [...prev.selectRowIds];\n let rowData: AnyObjectType[] = [];\n // 递归\n const deepTable = (list: AnyObjectType[]) => {\n if (prev.selectRowIds.length) {\n for (let item of list) {\n for (let ids of prev.selectRowIds) {\n if (item[key] === ids) {\n rowIds.push(ids);\n rowData.push(item);\n }\n }\n if (item.children) {\n deepTable(item.children);\n }\n }\n }\n };\n\n deepTable(content);\n prev.selectRowIds = Array.from(new Set(rowIds));\n prev.selectRowArray = keyOriginPlace(prev.selectRowArray, rowData);\n return prev;\n });\n }\n setState((prev) => {\n prev.listData = content;\n return prev;\n });\n // 查询请求成功后回调\n if (extraProps.getTableSuccessData) {\n extraProps.getTableSuccessData(result);\n }\n }\n } catch (error) {\n console.error('error', error);\n }\n setListLoading(false);\n },\n [extraProps, key, keyOriginPlace, setState],\n );\n\n /**\n * @Description 分页切换\n * @Author bihongbin\n * @Date 2020-06-24 14:05:28\n */\n const changeEstimatesList = useCallback(\n (pagination: TablePaginationType) => {\n // 排序时,会导致分页onchange触发,值不相等时,说明分页参数变动,加载数据\n if (!_.isEqual(pagination, queryPagination.current) && isShowPagination.current) {\n queryPagination.current = {\n ...queryPagination.current,\n ...pagination,\n };\n // getList({ updateSelected: false });\n getList();\n }\n },\n [getList],\n );\n\n /**\n * 分页切换\n */\n const paginationChange = useCallback(\n (pagination: any, filter: any, sorter: any) => {\n const { order } = sorter;\n // 1升序 -1降序\n pagination['orderByInfo'] = undefined;\n if (order) {\n pagination['orderByInfo'] = `${sorter.field}:${order === 'ascend' ? 1 : -1}`;\n }\n changeEstimatesList(pagination as TablePaginationType);\n },\n [changeEstimatesList],\n );\n\n /**\n * @Description 行选择\n * @Author bihongbin\n * @Date 2020-06-24 15:16:07\n */\n const rowSelection: TableRowSelection<any> = {\n fixed: true,\n type: extraProps.rowType,\n selectedRowKeys: state.selectRowIds,\n getCheckboxProps: extraProps.getCheckboxProps,\n onSelectAll: (selected, selectedRows, changeRows) => {\n setState((prev) => {\n let ids = [...prev.selectRowIds];\n let rows = [...prev.selectRowArray];\n\n if (selected) {\n ids = _.uniq([...ids, ...changeRows.map((item) => item[key])]);\n rows = _.uniqBy([...rows, ...changeRows], key);\n } else {\n // 取消全选时,去掉取消选择的数据\n ids = ids.filter((item) => {\n return !changeRows.some((changeItem) => changeItem[key] === item);\n });\n rows = rows.filter((item) => {\n return !changeRows.some((changeItem) => changeItem[key] === item[key]);\n });\n }\n extraProps.onSelect && extraProps.onSelect(rows, ids);\n\n prev.selectRowIds = ids;\n prev.selectRowArray = rows;\n return prev;\n });\n },\n onSelect: (record, selected) => {\n setState((prev) => {\n let ids = [...prev.selectRowIds];\n let rows = [...prev.selectRowArray];\n\n if (extraProps.rowType === 'checkbox') {\n if (selected) {\n ids.push(record[key]);\n rows.push(record);\n } else {\n ids = ids.filter((item) => item !== record[key]);\n rows = rows.filter((item) => item[key] !== record[key]);\n }\n }\n if (extraProps.rowType === 'radio') {\n if (selected) {\n ids = [record[key]];\n rows = [record];\n }\n }\n extraProps.onSelect && extraProps.onSelect(rows, ids);\n\n prev.selectRowIds = ids;\n prev.selectRowArray = rows;\n return prev;\n });\n },\n };\n\n /**\n * @Description 表头拖动重置宽度\n * @Author bihongbin\n * @Date 2020-07-21 10:36:35\n */\n const handleResize =\n (index: number) =>\n (e: any, { size }: any) => {\n setFormatColumns((prev) => {\n const nextColumns = [...prev];\n nextColumns[index] = {\n ...nextColumns[index],\n width: size.width,\n };\n // 缓存表格头拖拽以后的数据\n columnsCacheRef.current = nextColumns;\n return nextColumns;\n });\n };\n\n /**\n * @Description 保存input数据\n * @Author bihongbin\n * @Date 2020-09-24 12:04:56\n */\n const handleSave = useCallback<EditableCellProps['handleSave']>(\n (row) => {\n setState((prev) => {\n let newData = JSON.parse(JSON.stringify(prev.listData));\n for (let [index, item] of newData.entries()) {\n if (item[key] === row[key]) {\n newData[index] = {\n ...newData[index],\n ...row,\n };\n break;\n }\n }\n prev.listData = newData;\n return prev;\n });\n },\n [key, setState],\n );\n\n /**\n * @Description 列拖动功能\n * @Author bihongbin\n * @Date 2020-12-14 11:54:23\n */\n const moveRow = useCallback(\n async (dragIndex: number, hoverIndex: number) => {\n const dragRow = state.listData[dragIndex];\n const list = update(state.listData, {\n $splice: [\n [dragIndex, 1],\n [hoverIndex, 0, dragRow],\n ],\n });\n\n setListLoading(true);\n try {\n // 拖动列回调\n if (extraProps.drag) {\n const data = JSON.parse(JSON.stringify(list));\n const prevData = JSON.parse(JSON.stringify(state.listData));\n const i = [dragIndex, hoverIndex].sort();\n\n const res = await extraProps.drag.moveRow(\n dragIndex, // 目标终点位置\n hoverIndex, // 目标开始位置\n data, // 拖拽完成后数据\n prevData, // 原数据\n data.slice(i[0], i[1] + 1), // 拖拽范围数据\n );\n // 只有在false情况下才不允许拖动列\n if (res !== false) {\n setState((prev) => {\n prev.listData = data;\n return prev;\n });\n }\n }\n } finally {\n setListLoading(false);\n }\n },\n [extraProps.drag, setState, state.listData],\n );\n\n /**\n * 拖拽\n */\n const moveChange = useCallback(\n (_: any, index: number | undefined) => {\n const attr = {\n index,\n moveRow,\n open: extraProps.drag && extraProps.drag.open,\n };\n return attr as React.HTMLAttributes<any>;\n },\n [extraProps.drag, moveRow],\n );\n\n /**\n * 通过选中id更新选中项rows\n */\n const filterSelectRows = useCallback(\n (tableList: AnyObjectType[]) => {\n let rows: AnyObjectType[] = [];\n // 递归\n const deepTable = (list: AnyObjectType[]) => {\n for (let item of list) {\n for (let ids of state.selectRowIds) {\n if (item[key] === ids) {\n rows.push(item);\n }\n }\n if (item.children) {\n deepTable(item.children);\n }\n }\n };\n deepTable(tableList);\n return rows;\n },\n [key, state.selectRowIds],\n );\n\n /**\n * @Description 设置表头\n * @Author bihongbin\n * @Date 2020-07-21 09:31:16\n */\n useEffect(() => {\n const filterColumns = async () => {\n let columns = [...extraProps.columns];\n\n // 添加序号\n if (!extraProps.hidSortColumn) {\n columns.unshift({\n width: 55,\n fixed: 'left',\n title: '序号',\n dataIndex: 'sequence',\n render: (text: any, record: any, index: number) => {\n const pages = queryPagination.current;\n if (Object.keys(pages).length) {\n return ((pages.current || 0) - 1) * (pages.pageSize || 0) + index + 1;\n } else {\n return index + 1;\n }\n },\n });\n }\n\n for (let [index, col] of columns.entries()) {\n let obj: AnyObjectType = {\n ...col,\n onHeaderCell: (column: any) => ({\n width: column.width,\n onResize: handleResize(index),\n }),\n onCell: (record: AnyObjectType, i: number) => ({\n record,\n recordIndex: i,\n dataIndex: col.dataIndex,\n title: col.title,\n rowSpanNum:\n typeof col.rowSpanNum === 'function' ? col.rowSpanNum(record, i) : col.rowSpanNum,\n colSpanNum:\n typeof col.colSpanNum === 'function' ? col.colSpanNum(record, i) : col.colSpanNum,\n editable: typeof col.editable === 'function' ? col.editable(record, i) : col.editable,\n inputType: col.inputType,\n valueType: col.valueType,\n valueEnum: col.valueEnum,\n recordSelectField: col.recordSelectField,\n controlRender: col.controlRender,\n render: col.render,\n formChange: col.formChange,\n remoteConfig: col.remoteConfig,\n formItemProps: col.formItemProps,\n handleSave: handleSave,\n placeholder: col.placeholder,\n triggerRemoteSearch: col.triggerRemoteSearch,\n }),\n };\n\n // 找到缓存中的columns,并且设置width,让其拖拽后宽度不变\n let currentColumns = columnsCacheRef.current.find(\n (t) => t.dataIndex === col.dataIndex && t.title === col.title,\n );\n\n if (currentColumns) {\n obj.width = currentColumns.width;\n }\n\n columns[index] = obj;\n }\n\n setFormatColumns(columns);\n };\n\n filterColumns();\n }, [extraProps.columns, extraProps.hidSortColumn, handleSave]);\n\n /**\n * @Description 初始化静态表格数据\n * @Author bihongbin\n * @Date 2020-07-13 09:16:45\n */\n useEffect(() => {\n if (_.isArray(extraProps.data)) {\n setState((prev) => {\n prev.listData = JSON.parse(JSON.stringify(extraProps.data));\n return prev;\n });\n }\n }, [extraProps.data, setState]);\n\n /**\n * @Description 固定列\n * @Author bihongbin\n * @Date 2020-06-28 10:33:20\n */\n useEffect(() => {\n const sliderMenu = document.getElementById('slider-menu');\n const routerRender = document.getElementById('router-render');\n\n if (extraProps.scroll?.x !== undefined || extraProps.scroll?.y !== undefined) {\n setScrollXY((prev) => ({ ...prev, ...extraProps.scroll }));\n } else {\n // 计算宽度 body.width - 左侧边栏宽度 - 右侧内容区padding*2\n if (sliderMenu && routerRender) {\n let pad = parseInt(window.getComputedStyle(routerRender, null)['paddingLeft']);\n setScrollXY((prev) => {\n prev.x = document.body.clientWidth - sliderMenu.clientWidth - (pad * 2 + 43);\n return prev;\n });\n }\n }\n }, [extraProps.scroll]);\n\n /**\n * @Description 分页初始查询值修改\n * @Author bihongbin\n * @Date 2021-08-24 16:06:14\n */\n useEffect(() => {\n if (extraProps.paginationConfig) {\n queryPagination.current = {\n ...queryPagination.current,\n ...extraProps.paginationConfig,\n };\n }\n }, [extraProps.paginationConfig]);\n\n // 暴漏给父组件调用\n useImperativeHandle<any, TableCallType>(ref, () => ({\n /** 设置loading */\n setTableLoading: (data) => {\n setListLoading(data);\n },\n /** 分页参数 */\n getPages: () => {\n return { ...queryPagination.current };\n },\n /** 调用接口获取表格数据 */\n getTableList: async (values, callback) => {\n if (values) {\n // 分页是否重置\n if (values.pagination === 'not-reset') {\n values.current = queryPagination.current.current;\n } else {\n if (values.current === undefined) {\n values.current = 1;\n }\n }\n // 清空选中项\n if (values.clearSelectIds) {\n delete values.clearSelectIds;\n setState((prev) => {\n prev.selectRowArray = [];\n prev.selectRowIds = [];\n return prev;\n });\n }\n }\n await getList(values);\n // 查询回调\n if (callback) {\n callback();\n }\n },\n /** 设置表格选中行id */\n setRowSelected: (selectedRowKeys, original) => {\n let ids = selectedRowKeys;\n if (original === true) {\n // set 合并去重\n ids = Array.from(new Set([...state.selectRowIds, ...selectedRowKeys]));\n }\n setState({\n selectRowIds: ids,\n });\n },\n /** 设置选中列数据[{}] */\n setRowSelectedBy: (data) => {\n setState({\n selectRowArray: data,\n });\n },\n /** 获取表格选中的id */\n getSelectIds: () => state.selectRowIds,\n /** 清空表格选中 */\n clearSelectIds: () => {\n setState({\n selectRowIds: [],\n selectRowArray: [],\n });\n },\n /** 获取表格选中的数组对象 */\n getSelectRowsArray: () => {\n const data = filterSelectRows(state.listData);\n return _.cloneDeep(keyOriginPlace(state.selectRowArray, data));\n },\n /** 移除表格选中的id和项 */\n removeSelectIds: (ids) => {\n if (!Array.isArray(ids) || ids.length === 0) return;\n const filterByIds = (array: any[], keyName: string) => {\n return array.filter((item) => {\n return typeof item === 'string' ? !ids.includes(item) : !ids.includes(item[keyName]);\n });\n };\n setState({\n selectRowIds: filterByIds(state.selectRowIds, key),\n selectRowArray: filterByIds(state.selectRowArray, key),\n });\n },\n /** 获取表格所有数据 */\n getStaticDataList: () => {\n try {\n return _.cloneDeep(state.listData || []);\n } catch (error) {\n console.error('error', error);\n return [];\n }\n },\n /** 设置表格静态数据 */\n setStaticDataList: (row, callback) => {\n if (!row) {\n return;\n }\n try {\n if (typeof row === 'object' && !Array.isArray(row)) {\n const data = row as AnyObjectType;\n setState((prev) => {\n prev.listData = state.listData.map((item) => {\n if (item[key] === data[key]) {\n return { ...item, ...data }; // 创建新对象\n }\n return item;\n });\n return prev;\n });\n } else if (Array.isArray(row)) {\n setState((prev) => {\n prev.listData = _.cloneDeep(row) as AnyObjectType[];\n return prev;\n });\n }\n\n if (callback) {\n callback();\n }\n } catch (error) {\n console.error('error', error);\n }\n },\n }));\n\n return (\n <ConfigProvider>\n <DndWrap>\n <Table\n bordered\n rowKey=\"id\"\n rowClassName=\"editable-row\"\n virtual={extraProps.virtual?.open}\n loading={listLoading}\n components={components}\n onRow={moveChange}\n columns={formatColumns}\n dataSource={state.listData}\n rowSelection={extraProps.rowType ? rowSelection : undefined}\n pagination={paginationConfig}\n onChange={paginationChange}\n scroll={scrollXY}\n {...extraProps.tableConfig}\n />\n </DndWrap>\n </ConfigProvider>\n );\n};\n\n// 当 props 未变化时跳过重渲染\nconst areEqual = (prev: GenerateTableProp, next: GenerateTableProp) => {\n const p = prev.extra || {};\n const n = next.extra || {};\n\n // 先对函数字段做引用比较\n const funcsEqual =\n p.apiMethod === n.apiMethod &&\n p.onSelect === n.onSelect &&\n p.drag?.moveRow === n.drag?.moveRow &&\n p.getCheckboxProps === n.getCheckboxProps &&\n p.resultFilter === n.resultFilter &&\n p.getTableSuccessData === n.getTableSuccessData;\n\n if (!funcsEqual) return false;\n\n // 构造去除函数字段后的对象进行深比较\n const stripFuncs = (o: GenerateTableProp['extra']) => {\n if (!o) return o;\n const {\n apiMethod,\n onSelect,\n drag,\n getCheckboxProps,\n resultFilter,\n getTableSuccessData,\n ...rest\n } = o;\n // 保留 drag.open 但去除 drag.moveRow\n const restDrag = drag ? { ...drag, moveRow: undefined } : undefined;\n return { ...rest, drag: restDrag } as any;\n };\n\n try {\n return _.isEqual(stripFuncs(p), stripFuncs(n));\n } catch (e) {\n return stripFuncs(p) === stripFuncs(n);\n }\n};\n\nexport default memo(forwardRef(GenerateTable), areEqual);\n","/*\n * 空内容组件\n */\nimport React from 'react';\nimport { Empty as Em, Row } from 'antd';\nimport { EmptyProps } from 'antd/lib/empty';\nimport './index.less';\n\ntype Props = EmptyProps & {\n /** 区域高度 */\n outerHeight?: number;\n};\n\n/**\n * 空内容组件\n */\nconst Empty = (props?: Props) => {\n const params: Props = { ...props };\n delete params.outerHeight;\n\n return (\n <Row\n className=\"empty-wrap\"\n style={{\n minHeight: props && props.outerHeight ? props.outerHeight : 400,\n }}\n align=\"middle\"\n justify=\"center\"\n >\n <Em description=\"暂无数据\" {...params} />\n </Row>\n );\n};\n\nexport default Empty;\n","import React, {\n useRef,\n useEffect,\n useMemo,\n useCallback,\n useImperativeHandle,\n forwardRef,\n} from 'react';\nimport dayjs from 'dayjs';\nimport _ from 'lodash';\nimport { Row, Col, Space, Button, Card, Typography, message } from 'antd';\nimport { RowProps } from 'antd/lib/row';\nimport { ColProps } from 'antd/lib/col';\nimport { ModalProps } from 'antd/lib/modal';\nimport { TableProps } from 'antd/es/table';\nimport { FormProps } from 'antd/es/form';\nimport GenerateForm, { FormListType, FormCallType } from '../GenerateForm';\nimport GenerateTable, {\n TableCallType,\n GenerateTableProp,\n TableColumns,\n getTableListQueryType,\n} from '../GenerateTable';\nimport Dialog from '../Dialog';\nimport Empty from '../Empty';\nimport hooks from '../brother/hooks';\nimport { dropDownMenuPushAll } from '../brother/utils';\nimport { AnyObjectType, PromiseAxiosResultType } from '../brother/typings';\nimport './index.less';\n\nexport type LayoutTableModalCallType = TableCallType &\n FormCallType & {\n setSavaLoading: (data: boolean) => void;\n };\n\nexport interface SizeType {\n xs?: number; // 屏幕 < 576px 响应式栅格\n sm?: number; // 屏幕 ≥ 576px 响应式栅格\n md?: number; // 屏幕 ≥ 768px 响应式栅格\n lg?: number; // 屏幕 ≥ 992px 响应式栅格\n xl?: number; // 屏幕 ≥ 1200px 响应式栅格\n xxl?: number; // 屏幕 ≥ 1600px 响应式栅格\n}\n\nexport interface LayoutTableModalPropType {\n /** 打开或关闭 */\n visible: boolean;\n /** 弹窗标题 */\n title: React.ReactNode;\n /** 弹窗宽度 */\n width?: number;\n /** 自定义modal配置 */\n modalConfig?: ModalProps;\n /** 头部渲染额外元素 */\n topExtra?: React.ReactNode;\n /** 搜索表单数据 */\n searchFormList?: FormListType[];\n /** 表单方法 */\n formConfig?: FormProps;\n /** 查询时是否清除选中项 */\n clearSelectIds?: getTableListQueryType['clearSelectIds'];\n /** rowType=checkbox多选 radio单选 list=表格头 tableConfig=自定义配置,支持antd官方表格所有参数*/\n tableColumnsList: {\n /** checkbox多选 radio单选 */\n rowType?: 'checkbox' | 'radio' | undefined;\n /** 表格头 */\n list: TableColumns[];\n /** 自定义配置,支持antd官方表格所有参数 */\n tableConfig?: TableProps<any>;\n };\n /** 是否开启默认查询功能 */\n autoGetList?: boolean;\n /** 查询回调 */\n searchCallback?: (data: any) => Promise<boolean>;\n /** 不需要重置的表单字段 */\n searchNoResetFiled?: string[];\n /** 列表请求函数 */\n apiMethod?: (data: any) => PromiseAxiosResultType;\n /** 查询表单手动参数转换 */\n manualParameterChange?: (params: AnyObjectType) => AnyObjectType;\n /** 静态表格数据 */\n data?: AnyObjectType[];\n /** 已选列表 */\n openSelected?: {\n /** 是否打开 */\n visible: boolean;\n /** 默认已选中 */\n defaultValues?: AnyObjectType[];\n /** 显示的字段名 */\n fileName?: string;\n /** 内容区域高度 */\n height?: number;\n };\n /** 虚拟滚动功能 */\n virtual?: GenerateTableProp['extra']['virtual'];\n /** 排列方式布局Row */\n rowProps?: RowProps;\n /** 主内容Col */\n colProps?: ColProps;\n /** 左边插槽 */\n leftSlot?: {\n colProps: ColProps;\n jsx: React.ReactNode;\n };\n /** 右边插槽 */\n rightSlot?: {\n colProps: ColProps;\n jsx: React.ReactNode;\n };\n /** 右侧导出 */\n rightExport?: {\n /** 导出 */\n open: boolean;\n /** 文件名 */\n fileName: string;\n /** 表头配置 */\n headres: { key: string; title: string }[];\n };\n /** 数据调用成功回调 */\n getTableSuccessData?: (data: AnyObjectType) => void;\n /** 行选中回调 */\n onSelect?: GenerateTableProp['extra']['onSelect'];\n /** 关闭弹窗回调 */\n onCancel?: () => void;\n /** 确定弹窗回调 */\n onConfirm?: (\n rows: AnyObjectType[],\n ids: string[],\n tableList: AnyObjectType[],\n ) => Promise<boolean>;\n}\n\ninterface StateType {\n /** 保存按钮loading */\n saveLoading: boolean;\n /** 已选中列表 */\n selectedRows: AnyObjectType[];\n}\n\nconst { Link, Paragraph } = Typography;\n\n/** 弹窗表格组件,常用来选择数据 */\nfunction LayoutTableModal(props: LayoutTableModalPropType, ref: any) {\n const searchFormRef = useRef<FormCallType>(null);\n const tableRef = useRef<TableCallType>();\n const [state, setState] = hooks.useSetState<StateType>({\n saveLoading: false,\n selectedRows: [],\n });\n\n /**\n * @description table rowKey\n * @author bihongbin\n * @param {*}\n * @return {*}\n * @Date 2022-03-01 10:01:40\n */\n const rowKey = useMemo(\n () =>\n ((props.tableColumnsList &&\n props.tableColumnsList.tableConfig &&\n props.tableColumnsList.tableConfig.rowKey) ||\n 'id') as string,\n [props.tableColumnsList],\n );\n\n /**\n * @Description 搜索表单宽度\n * @Author bihongbin\n * @Date 2021-09-17 17:50:34\n * @param {*} useMemo\n */\n const colGirdWidth = useMemo(() => {\n const width = props.width || 0;\n if (width >= 500 && width <= 800) {\n return {\n span: 7,\n };\n }\n if (width > 800 && width <= 1000) {\n return {\n span: 6,\n };\n } else if (width > 1000 && width <= 1200) {\n return {\n span: 5,\n };\n } else if (width > 1200) {\n return {\n span: 4,\n };\n } else {\n return {\n span: 8,\n };\n }\n }, [props.width]);\n\n /**\n * 将数据导出为Excel文件(CSV格式)\n * @param {Array} data - 要导出的数据数组,每个元素是一个对象\n * @param {Array} headers - 表头配置,格式如[{key: 'name', title: '姓名'}, ...]\n * @param {string} fileName - 导出的文件名(不含扩展名)\n */\n const exportToExcel = () => {\n const fileName = props.rightExport?.fileName;\n const headers = props.rightExport?.headres;\n const data = state.selectedRows;\n\n if (data && data.length && headers && headers.length) {\n // 构建CSV内容\n let csvContent = '';\n\n // 添加表头\n const headerTitles = headers.map((header) => header.title);\n csvContent += headerTitles.join(',') + '\\n';\n\n // 添加数据行\n data.forEach((row) => {\n const rowData = headers.map((header) => {\n const value = row[header.key] !== undefined ? row[header.key] : '';\n // 处理包含逗号、引号或换行符的内容\n return `\"${String(value).replace(/\"/g, '\"\"')}\"`;\n });\n csvContent += rowData.join(',') + '\\n';\n });\n\n // 创建Blob对象\n const blob = new Blob(['\\uFEFF' + csvContent], {\n type: 'text/csv;charset=utf-8;',\n });\n\n // 创建下载链接\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n\n link.setAttribute('href', url);\n link.setAttribute('download', `${fileName}.csv`);\n link.style.visibility = 'hidden';\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else {\n message.warning('请选择导出数据', 1.5);\n }\n };\n\n /**\n * @description 移除已选列表项\n * @author bihongbin\n * @param {*} type all全部移除 odd单个移除\n * @param {AnyObjectType} item\n * @return {*}\n * @Date 2022-03-01 15:12:17\n */\n const onRemoveCol = (type: 'all' | 'odd', item?: AnyObjectType) => {\n if (tableRef.current) {\n let removeIds: string[] = [];\n let removeRows: AnyObjectType[] = [];\n if (type === 'all') {\n tableRef.current.clearSelectIds();\n }\n if (type === 'odd' && item) {\n removeIds = [item[rowKey]];\n removeRows = state.selectedRows.filter((rows) => rows[rowKey] !== item[rowKey]);\n tableRef.current.removeSelectIds(removeIds);\n }\n setState({\n selectedRows: removeRows,\n });\n }\n };\n\n /**\n * @description table-checkbox-onChange\n * @author bihongbin\n * @param {*}\n * @return {*}\n * @Date 2022-03-01 11:28:31\n */\n const onCheckChange = (selectedRows: AnyObjectType[], selectedRowKeys: string[]) => {\n setState({\n selectedRows: selectedRowKeys.map((key) => {\n let row: AnyObjectType = {};\n const currentSelected = selectedRows.find((t) => t[rowKey] === key);\n\n row[rowKey] = key;\n\n if (props.openSelected && props.openSelected.fileName) {\n row[props.openSelected.fileName] = key;\n }\n\n if (currentSelected) {\n row = currentSelected;\n }\n\n if (props.openSelected) {\n const fileName = props.openSelected.fileName;\n const defaultValues = props.openSelected.defaultValues;\n if (fileName) {\n if (defaultValues) {\n const find = defaultValues.find((t) => t[rowKey] === key);\n if (find) {\n row[fileName] = find[fileName];\n }\n }\n }\n }\n\n return row;\n }),\n });\n };\n\n /**\n * @Description 查询\n * @Author bihongbin\n * @Date 2021-03-05 09:52:56\n */\n const formSubmit = useCallback(async () => {\n if (searchFormRef.current && tableRef.current) {\n let result = await searchFormRef.current.formSubmit();\n if (result && Object.keys(result).length) {\n // 时间格式转换\n for (let o in result) {\n const formatStr = 'YYYY-MM-DD HH:mm:ss';\n if (dayjs(result[o], formatStr, true).isValid()) {\n result[o] = dayjs(result[o]).format(formatStr);\n }\n }\n result = {\n clearSelectIds: true,\n ...result,\n };\n if (props.clearSelectIds !== undefined) {\n result.clearSelectIds = props.clearSelectIds;\n }\n if (result.clearSelectIds) {\n setState((prev) => {\n // 清空选中\n prev.selectedRows = [];\n return prev;\n });\n }\n // 从父级手动转换参数\n if (props.manualParameterChange) {\n result = props.manualParameterChange(result);\n }\n if (props.searchCallback) {\n // 查询回调\n props.searchCallback(result).then((res) => {\n if (res) {\n tableRef.current?.getTableList(result);\n }\n });\n } else {\n tableRef.current.getTableList(result);\n }\n }\n } else {\n tableRef.current?.getTableList();\n }\n }, [props, setState]);\n\n /**\n *\n * @Description 重置\n * @Author bihongbin\n * @Date 2020-07-31 10:27:40\n */\n const formReset = () => {\n if (searchFormRef.current) {\n let fileName: string[] = [];\n const searchNoResetFiled = props.searchNoResetFiled || [];\n\n if (props.searchFormList) {\n for (let n of props.searchFormList) {\n // 处理表单嵌套的情况\n if (n.unionConfig) {\n for (let k of n.unionConfig.unionItems) {\n // 找出禁止重置的字段\n if (k.name && !searchNoResetFiled.includes(k.name)) {\n fileName.push(k.name);\n }\n }\n }\n // 找出禁止重置的字段\n if (n.name && !searchNoResetFiled.includes(n.name)) {\n fileName.push(n.name);\n }\n }\n }\n\n searchFormRef.current.formReset(fileName);\n }\n formSubmit();\n };\n\n /**\n * @Description 确定\n * @Author bihongbin\n * @Date 2020-08-07 13:48:41\n */\n const handleConfirm = () => {\n let rows: AnyObjectType[] = tableRef.current?.getSelectRowsArray() || [];\n let ids: string[] = [];\n const tableList = tableRef.current?.getStaticDataList() || [];\n\n if (props.onConfirm) {\n if (tableRef.current) {\n ids = tableRef.current.getSelectIds();\n }\n setState({\n saveLoading: true,\n });\n props\n .onConfirm(rows, ids, tableList)\n .then((res) => {\n setState({\n saveLoading: false,\n });\n if (res) {\n setTimeout(() => {\n props.onCancel && props.onCancel();\n }, 100);\n }\n })\n .catch((err) => {\n setState({\n saveLoading: false,\n });\n message.warning(err, 1.5);\n });\n }\n };\n\n /**\n * @Description 开启默认查询功能\n * @Author bihongbin\n * @Date 2020-08-05 14:09:53\n */\n useEffect(() => {\n if (props.visible) {\n if (props.autoGetList) {\n tableRef.current?.getTableList();\n }\n if (props.openSelected && props.openSelected.visible) {\n setState((prev) => {\n prev.selectedRows = props.openSelected?.defaultValues || [];\n tableRef.current?.setRowSelectedBy(prev.selectedRows);\n tableRef.current?.setRowSelected(prev.selectedRows.map((item) => item[rowKey]));\n return prev;\n });\n }\n }\n }, [props.autoGetList, props.openSelected, props.visible, rowKey, setState]);\n\n // 暴漏给父组件调用\n useImperativeHandle<any, LayoutTableModalCallType>(ref, () => ({\n // 搜索表单方法\n ...(searchFormRef.current as FormCallType),\n // 表格实例对象方法\n ...(tableRef.current as TableCallType),\n /** 设置保存loading */\n setSavaLoading: (data) => {\n setState({\n saveLoading: data,\n });\n },\n }));\n\n return (\n <Dialog\n className=\"from-table-modal\"\n forceRender\n maskClosable={false}\n footer={null}\n width={props.width}\n visible={props.visible}\n title={props.title || '弹窗'}\n onCancel={() => {\n props.onCancel && props.onCancel();\n }}\n {...props.modalConfig}\n >\n {props.topExtra}\n {props.searchFormList ? (\n <GenerateForm\n ref={searchFormRef}\n rowGridConfig={{ gutter: 10 }}\n colGirdConfig={colGirdWidth}\n list={dropDownMenuPushAll(props.searchFormList)}\n formConfig={props.formConfig}\n render={() => {\n if (props.searchFormList && props.searchFormList.length) {\n return (\n <Space size={10}>\n <Button\n type=\"primary\"\n onClick={() => {\n formSubmit();\n }}\n >\n 查询\n </Button>\n <Button className=\"btn-reset\" onClick={formReset}>\n 重置\n </Button>\n </Space>\n );\n }\n return <></>;\n }}\n />\n ) : null}\n <Row {...props.rowProps}>\n {props.leftSlot ? <Col {...props.leftSlot.colProps}>{props.leftSlot.jsx}</Col> : null}\n <Col span={24} {...props.colProps}>\n <Row gutter={10}>\n <Col span={props.openSelected && props.openSelected.visible ? 16 : 24}>\n <GenerateTable\n ref={tableRef}\n extra={{\n rowType: props.tableColumnsList.rowType,\n apiMethod: props.apiMethod,\n columns: props.tableColumnsList.list,\n data: props.data,\n onSelect: (selectedRows, selectedRowKeys) => {\n onCheckChange(selectedRows, selectedRowKeys);\n props.onSelect && props.onSelect(selectedRows, selectedRowKeys);\n },\n virtual: props.virtual,\n getTableSuccessData: props.getTableSuccessData,\n scroll: {\n x: props.virtual?.open ? undefined : 'max-content',\n },\n tableConfig: props.tableColumnsList.tableConfig,\n }}\n />\n </Col>\n {props.openSelected && props.openSelected.visible ? (\n <Col span={8}>\n <Card\n title=\"已选列表\"\n size=\"small\"\n styles={{\n body: {\n height: props.openSelected.height || 330,\n overflowY: 'auto',\n },\n }}\n extra={\n <>\n {props.rightExport && props.rightExport.open ? (\n <Link style={{ marginRight: '8px' }} onClick={() => exportToExcel()}>\n 导出\n </Link>\n ) : null}\n <Link onClick={() => onRemoveCol('all')}>全部移除</Link>\n </>\n }\n >\n {state.selectedRows.length ? (\n state.selectedRows.map((item) => {\n const key = rowKey;\n const id = item[key];\n const title = item[props.openSelected?.fileName as string];\n return (\n <Row key={id} gutter={12}>\n <Col span={11} title={title}>\n <Paragraph ellipsis>{title}</Paragraph>\n </Col>\n <Col span={8} title={id}>\n <Paragraph ellipsis>{id}</Paragraph>\n </Col>\n <Col span={5}>\n <Link onClick={() => onRemoveCol('odd', item)}>移除</Link>\n </Col>\n </Row>\n );\n })\n ) : (\n <Empty outerHeight={200} />\n )}\n </Card>\n </Col>\n ) : null}\n </Row>\n </Col>\n {props.rightSlot ? <Col {...props.rightSlot.colProps}>{props.rightSlot.jsx}</Col> : null}\n </Row>\n <Row className=\"from-table-modal-foot\" justify=\"center\">\n <Col>\n <Space size={20}>\n {props.onCancel ? (\n <Button onClick={() => props.onCancel && props.onCancel()}>关闭</Button>\n ) : null}\n {props.onConfirm ? (\n <Button type=\"primary\" loading={state.saveLoading} onClick={handleConfirm}>\n 确定\n </Button>\n ) : null}\n </Space>\n </Col>\n </Row>\n </Dialog>\n );\n}\n\nexport default forwardRef(LayoutTableModal);\n","import React, { useRef, useMemo, useEffect, useCallback } from 'react';\nimport { Row, Col, message } from 'antd';\nimport dayjs from 'dayjs';\nimport { LeftCircleFilled, RightCircleFilled } from '@ant-design/icons';\nimport GenerateForm, { FormCallType, FormListType } from '../GenerateForm';\nimport hooks from '../brother/hooks';\nimport Dialog from '../Dialog';\nimport { AjaxResultType, AnyObjectType, PromiseAxiosResultType } from '../brother/typings';\nimport './index.less';\n\nexport interface QuicklyProcessTypes {\n /** 打开或关闭 */\n visible: boolean;\n id?: string | null | undefined;\n /** 弹窗标题 */\n title?: string | null | undefined;\n /** 弹窗宽度 */\n width?: number;\n /** 需要转换成时间格式的参数 */\n transformTime?: string[];\n /** 处理数据 */\n data: AnyObjectType[];\n /** 表单数据 */\n formList: FormListType[];\n /** 分页请求的额外参数 */\n methodParams?: AnyObjectType;\n /** 分页列表请求函数 */\n apiMethod?: (data: any) => PromiseAxiosResultType;\n /** 提交表单的接口 */\n submitApi: (data: any, method: 'put' | 'post') => Promise<AjaxResultType>;\n /** 上一页下一页切换回调 */\n onChange?: (data: AnyObjectType, pageObj?: AnyObjectType) => void;\n /** 关闭弹窗回调 */\n onCancel?: (pageObj?: AnyObjectType) => void;\n}\n\ninterface StateType {\n id: QuicklyProcessTypes['id'];\n saveLoading: boolean;\n data: QuicklyProcessTypes['data'];\n}\n\n/** 批量编辑,用来编辑表格列表数据 */\nconst QuicklyProcessForms = (props: QuicklyProcessTypes) => {\n const formRef = useRef<FormCallType>(); // 表单实例\n const queryPagination = useRef<AnyObjectType>({\n page: 1, // 当前第几页\n pages: 1, // 总共多少条\n size: 10, // 每页显示多少条数据\\\n });\n const [state, setState] = hooks.useSetState<StateType>({\n id: undefined,\n saveLoading: false,\n data: [],\n });\n\n // 左右操作按钮样式\n const leftRightStyle = {\n fontSize: 24,\n };\n\n /**\n * @Description 转换json里面的时间\n * @Author yanwen\n * @Date 2021-01-06 16:27:58\n */\n const transformTime = useCallback(\n (data: QuicklyProcessTypes['data'], timeArray: QuicklyProcessTypes['transformTime']) => {\n return data.map((item) => {\n if (timeArray) {\n for (let date of timeArray) {\n if (item[date]) {\n item[date] = dayjs(item[date]);\n }\n }\n }\n return item;\n });\n },\n [],\n );\n\n /**\n * @Description 获取分页数据\n * @Author yanwen\n * @Date 2021-01-06 16:36:20\n * @param {*} useCallback\n */\n const getList = useCallback(\n async (type?: 'up' | 'down') => {\n if (props.apiMethod) {\n try {\n let id = '';\n const result = await props.apiMethod(queryPagination.current);\n console.log(\n 'getList useCallback',\n result,\n 'queryPagination.current',\n queryPagination.current,\n );\n const list = result.data.content;\n queryPagination.current.pages = result.data.pages;\n // 上一页\n if (type === 'up') {\n id = list[list.length - 1].id;\n }\n // 下一页\n if (type === 'down') {\n id = list[0].id;\n }\n setState({\n id: id ? id : props.id,\n data: list,\n });\n } catch (error) {\n console.error(error);\n }\n }\n },\n [props, setState],\n );\n\n /**\n * @Description 根据当前id找到数组对应的索引\n * @Author bihongbin\n * @Date 2020-11-29 11:00:13\n */\n const currentIndex = useMemo(() => {\n let k = 0;\n for (let [index, item] of state.data.entries()) {\n if (item.id === state.id) {\n k = index;\n break;\n }\n }\n return k;\n }, [state.data, state.id]);\n\n /**\n * @Description 保存\n * @Author bihongbin\n * @Date 2021-01-15 17:41:38\n */\n // const save = useCallback(async () => {\n // if (formRef.current) {\n // const formResult = await formRef.current.formSubmit();\n // formResult.id = state.data[currentIndex].id;\n // setState({\n // saveLoading: true,\n // });\n // try {\n // props.submitApi(formResult, 'put');\n // message.success('保存成功', 1.5);\n // } catch (error) {}\n // setState({\n // saveLoading: false,\n // });\n // }\n // }, [currentIndex, props, setState, state.data]);\n\n /**\n * @Description 上一页\n * @Author bihongbin\n * @Date 2020-11-29 10:57:43\n */\n const prev = useCallback(async () => {\n if (props.apiMethod) {\n // 第一页,第一条\n if (queryPagination.current.page === 1 && currentIndex === 0) {\n message.destroy();\n message.warning('已经是第一页啦~', 1.5);\n return;\n }\n // 第一页第一条以外的数据\n if (currentIndex - 1 < 0) {\n queryPagination.current.page = queryPagination.current.page - 1;\n getList('up');\n if (props.onChange) {\n props.onChange(state.data[currentIndex], queryPagination.current);\n }\n return;\n }\n } else {\n if (currentIndex === 0) {\n message.destroy();\n message.warning('已经是第一个啦~', 1.5);\n return;\n }\n }\n if (formRef.current) {\n const formResult = await formRef.current.formSubmit();\n if (formResult) {\n formResult.id = state.data[currentIndex].id;\n try {\n const cutIndexObj = state.data[currentIndex - 1];\n console.log('cutIndexObj', cutIndexObj);\n props.submitApi(formResult, 'put');\n // 回调\n if (props.onChange) {\n props.onChange(cutIndexObj, queryPagination.current);\n }\n setState((prev) => {\n prev.id = cutIndexObj.id;\n prev.data[currentIndex] = {\n ...prev.data[currentIndex],\n ...formResult,\n };\n return prev;\n });\n } catch (error) {\n console.error(error);\n }\n }\n }\n }, [currentIndex, getList, props, setState, state.data]);\n\n /**\n * @Description 下一页\n * @Author bihongbin\n * @Date 2020-11-29 10:57:58\n */\n const next = useCallback(async () => {\n if (props.apiMethod) {\n // 最后一页 最后最一页最后一条数据\n if (\n queryPagination.current.page === queryPagination.current.pages &&\n currentIndex === state.data.length - 1\n ) {\n message.destroy();\n message.warning('已经是最后一页啦~', 1.5);\n return;\n }\n // 本页最后一条\n if (currentIndex + 1 >= state.data.length) {\n queryPagination.current.page = queryPagination.current.page + 1;\n getList('down');\n // 回调\n if (props.onChange) {\n props.onChange(state.data[currentIndex], queryPagination.current);\n }\n return;\n }\n } else {\n if (state.data.length === 0 || currentIndex === state.data.length - 1) {\n message.destroy();\n message.warning('已经是最后一个啦~', 1.5);\n return;\n }\n }\n if (formRef.current) {\n const formResult = await formRef.current.formSubmit();\n if (formResult) {\n formResult.id = state.data[currentIndex].id;\n try {\n const plusIndexObj = state.data[currentIndex + 1];\n console.log('cutIndexObj', plusIndexObj);\n props.submitApi(formResult, 'put');\n // 回调\n if (props.onChange) {\n props.onChange(plusIndexObj, queryPagination.current);\n }\n // if (props.onCancel) {\n // props.onCancel(queryPagination.current)\n // }\n setState((prev) => {\n prev.id = plusIndexObj.id;\n prev.data[currentIndex] = {\n ...prev.data[currentIndex],\n ...formResult,\n };\n return prev;\n });\n } catch (error) {\n console.error(error);\n }\n }\n }\n }, [currentIndex, getList, props, setState, state.data]);\n\n /**\n * @Description 键盘按下\n * @Author bihongbin\n * @Date 2020-11-29 14:07:47\n */\n const keyDown = useCallback(\n async (e: KeyboardEvent) => {\n // 上一页\n if (e.key === 'PageUp') {\n prev();\n e.preventDefault();\n }\n // 下一页\n if (e.key === 'PageDown') {\n next();\n e.preventDefault();\n }\n // 回车\n if (e.key === 'Enter') {\n if (formRef.current) {\n const formResult = await formRef.current.formSubmit();\n formResult.id = state.data[currentIndex].id;\n try {\n props.submitApi(formResult, 'put');\n message.success('保存成功', 1.5);\n } catch (error) {\n console.error(error);\n }\n }\n }\n },\n [currentIndex, next, prev, props, state.data],\n );\n\n const HandleRequestParam = useCallback(async () => {\n if (props.methodParams) {\n let arr = ['page', 'pages', 'size'];\n let obj: AnyObjectType = {};\n let param = await props.methodParams;\n for (let i in queryPagination.current) {\n for (let r of arr) {\n if (i === r) {\n obj[r] = queryPagination.current[i];\n }\n }\n }\n\n obj = {\n ...obj,\n ...param,\n };\n obj.page = param.page ? param.page.current : 1;\n queryPagination.current = obj;\n }\n }, [props.methodParams]);\n\n /**\n * @Description 设置表单数据\n * @Author bihongbin\n * @Date 2020-11-29 11:55:48\n */\n useEffect(() => {\n if (props.visible) {\n setTimeout(() => {\n if (formRef.current) {\n formRef.current.setFormValues(state.data[currentIndex]);\n }\n }, 100);\n }\n }, [currentIndex, props.visible, state.data]);\n\n /**\n * @Description 如果表单参数用到时间选择组件,需要转换成dayjs对象\n * @Author bihongbin\n * @Date 2020-11-29 13:59:25\n */\n useEffect(() => {\n if (props.visible) {\n if (props.apiMethod) {\n HandleRequestParam().then(() => {\n getList();\n });\n } else {\n setState({\n id: props.id,\n data: transformTime(props.data, props.transformTime),\n });\n }\n }\n }, [\n HandleRequestParam,\n getList,\n props.apiMethod,\n props.data,\n props.id,\n props.transformTime,\n props.visible,\n setState,\n transformTime,\n ]);\n\n /**\n * @Description 键盘事件监听和移除\n * @Author bihongbin\n * @Date 2020-11-29 14:01:41\n */\n useEffect(() => {\n if (props.visible) {\n document.addEventListener('keydown', keyDown);\n } else {\n document.removeEventListener('keydown', keyDown);\n }\n return () => {\n document.removeEventListener('keydown', keyDown);\n };\n }, [keyDown, props.visible]);\n\n return (\n <Dialog\n className=\"quickly-form-modal\"\n width={props.width ? props.width : 960}\n visible={props.visible}\n title={props.title || '快速编辑信息'}\n onCancel={() => {\n props.onCancel && props.onCancel(queryPagination.current);\n }}\n maskClosable={false}\n destroyOnHidden\n footer={null}\n >\n <Row className=\"modal-form-height\" gutter={16} align=\"middle\" wrap={false}>\n <Col flex=\"60px\">\n <Row justify=\"center\">\n <Col>\n <LeftCircleFilled className=\"circle-filled\" style={leftRightStyle} onClick={prev} />\n </Col>\n </Row>\n </Col>\n <Col flex=\"auto\">\n <GenerateForm\n ref={formRef}\n formConfig={{\n labelCol: { span: 24 },\n }}\n rowGridConfig={{ gutter: [20, 0] }}\n colGirdConfig={{ span: 6 }}\n list={props.formList}\n />\n </Col>\n <Col flex=\"60px\">\n <Row justify=\"center\">\n <Col>\n <RightCircleFilled className=\"circle-filled\" style={leftRightStyle} onClick={next} />\n </Col>\n </Row>\n </Col>\n </Row>\n {/* <Row className=\"quickly-form-modal-foot\" justify=\"center\">\n <Col>\n <Space size={20}>\n <Button onClick={() => props.onCancel && props.onCancel()}>取消</Button>\n <Button type=\"primary\" loading={state.saveLoading} onClick={save}>\n 提交\n </Button>\n </Space>\n </Col>\n </Row> */}\n </Dialog>\n );\n};\n\nexport default QuicklyProcessForms;\n","import React, { useRef, useEffect, useImperativeHandle, forwardRef } from 'react';\nimport { Spin, Row, Col, Button, Space, message } from 'antd';\nimport { ButtonProps } from 'antd/es/button';\nimport dayjs from 'dayjs';\nimport _ from 'lodash';\nimport type { FormInstance } from 'antd/es/form';\nimport { FormProps } from 'antd/es/form';\nimport { ColProps } from 'antd/es/col';\nimport GenerateForm, { FormCallType, FormListType } from '../GenerateForm';\nimport hooks from '../brother/hooks';\nimport Dialog from '../Dialog';\nimport { AnyObjectType, SubmitApiType } from '../brother/typings';\nimport './index.less';\n\ntype NamePath = any;\n\nexport interface LayoutFormPropTypes {\n /** 类名 */\n className?: string;\n /** 打开或关闭 */\n visible: boolean;\n /** 表单是否禁用 */\n disable?: boolean;\n id?: string | null | undefined;\n /** 弹窗标题 */\n title: string | React.ReactNode | null | undefined;\n /** 弹窗宽度 */\n width?: number;\n\n /** 表单弹窗头部显示的额外dom元素 */\n topRender?: React.ReactElement;\n /** 组件子元素插槽 */\n children?: React.ReactNode;\n /** 底部操作按钮自定义HTML */\n footer?: React.ReactNode;\n /** 底部操作按钮自定义Array */\n footBtnList?: {\n model: 'new' | 'before' | 'after';\n data: ButtonProps[];\n };\n\n /** 手动参数转换 */\n manualParameterChange?: (params: AnyObjectType) => AnyObjectType;\n /** 手动验证表单 */\n manualVerification?: (params: AnyObjectType) => boolean;\n /** 提交表单需要移除的参数 */\n submitRemoveField?: string[];\n /** 需要提交表单的额外参数 */\n submitExtraParameters?: AnyObjectType;\n /** 开关组件值转换成0和1 */\n switchTransform?: string[];\n\n /** 提交表单的接口 */\n submitApi?: SubmitApiType;\n /** 关闭弹窗回调 */\n onCancel?: () => void;\n /** 确定或保存回调,返回false会阻止关闭 */\n onConfirm?: (data: AnyObjectType) => void | boolean | Promise<void | boolean>;\n /** 表单数据 */\n formList: FormListType[];\n /** 表单每行显示的数量 */\n colGirdConfig?: ColProps;\n /** 支持antd Form组件官方传参所有类型 */\n formConfig?: FormProps;\n}\n\n// 导出该组件可调用的方法类型\nexport interface LayoutFormModalCallType {\n /** 设置loading */\n setFormLoading: (data: boolean) => void;\n /** 设置保存loading */\n setFormSaveLoading: (data: boolean) => void;\n /** 设置一组字段状态 */\n setFormFields: FormInstance['setFields'];\n /** 读取表单值 */\n getFormValues: (data: string[]) => AnyObjectType | undefined;\n /** 设置表单值 */\n setFormValues: (values: AnyObjectType) => void;\n /** 排除指定表单后提交 */\n excludeFormSubmitValues: (nameList?: NamePath[]) => Promise<AnyObjectType | undefined>;\n /** 提交表单并验证 */\n getFormSubmitValues: (nameList?: NamePath[]) => Promise<AnyObjectType | undefined>;\n}\n\nexport type LayoutFormModalListType = FormListType;\n\ninterface StateType {\n loading: boolean;\n saveLoading: boolean;\n disabled: boolean;\n}\n\n/** 弹窗表单组件,支持多种表单类型,手动提交(设置onConfirm)和自动提交(设置submitApi)参数至服务器 */\nconst LayoutFormModal = (props: LayoutFormPropTypes, ref: any) => {\n const formRef = useRef<FormCallType>(); // 表单实例\n const [state, setState] = hooks.useSetState<StateType>({\n loading: false, // loading\n saveLoading: false, // 保存按钮loading\n disabled: false, // 表单是否可编辑,当不可编辑不能显示保存按钮\n });\n\n /**\n * @description Footer渲染\n * @author bihongbin\n * @return {*}\n * @Date 2023-04-13 11:53:45\n */\n const footerRender = () => {\n const initBtn = (() => {\n const buttons = [\n <Button onClick={() => props.onCancel && props.onCancel()} key={-1}>\n 关闭\n </Button>,\n ];\n if (!state.disabled) {\n buttons.push(\n <Button type=\"primary\" loading={state.saveLoading} onClick={formSubmit} key={-2}>\n 提交\n </Button>,\n );\n }\n return buttons;\n })();\n const row = (children: React.ReactNode) => {\n return (\n <Row className=\"form-modal-foot\" justify=\"center\">\n <Col>\n <Space size={20}>{children}</Space>\n </Col>\n </Row>\n );\n };\n if (props.footer) {\n return props.footer;\n }\n if (props.footBtnList) {\n const { model, data } = props.footBtnList;\n const laterBtn = data.map((item, index) => {\n const { children, ...rest } = item;\n return (\n <Button {...rest} key={index}>\n {children}\n </Button>\n );\n });\n if (model === 'new') {\n return row(laterBtn);\n }\n if (model === 'before') {\n return row([...laterBtn, ...initBtn]);\n }\n if (model === 'after') {\n return row([...initBtn, ...laterBtn]);\n }\n }\n return row(initBtn);\n };\n\n /**\n * @Description 提交表单\n * @Author bihongbin\n * @Date 2020-08-01 15:38:26\n */\n const formSubmit = async () => {\n let formParams = await formRef.current?.formSubmit();\n if (formParams) {\n if (\n formParams.endTime &&\n formParams.startTime &&\n dayjs(formParams.endTime).isBefore(formParams.startTime)\n ) {\n message.warning('生效日期不能大于失效日期', 1.5);\n return;\n }\n setState({\n saveLoading: true,\n });\n try {\n let result: AnyObjectType = {};\n // 合并父组件传过来的额外参数\n formParams = {\n ...formParams,\n ...props.submitExtraParameters,\n };\n // 转换开关组件的值是0或1\n if (props.switchTransform) {\n for (let i = 0; i < props.switchTransform.length; i++) {\n if (formParams[props.switchTransform[i]]) {\n formParams[props.switchTransform[i]] = '1';\n } else {\n formParams[props.switchTransform[i]] = '0';\n }\n }\n }\n // 额外指定参数移除\n if (props.submitRemoveField) {\n for (let i = 0; i < props.submitRemoveField.length; i++) {\n if (formParams[props.submitRemoveField[i]]) {\n delete formParams[props.submitRemoveField[i]];\n }\n }\n }\n // 时间格式转换\n for (let o in formParams) {\n const formatStr = 'YYYY-MM-DD HH:mm:ss';\n if (dayjs(formParams[o], formatStr, true).isValid()) {\n formParams[o] = dayjs(formParams[o]).format(formatStr);\n }\n }\n // 从父级手动转换参数\n if (props.manualParameterChange) {\n formParams = props.manualParameterChange(formParams);\n }\n // 手动验证表单\n if (props.manualVerification) {\n if (!props.manualVerification(formParams)) {\n console.warn('手动验证表单不通过');\n setState({\n saveLoading: false,\n });\n return;\n }\n }\n formParams = _.omitBy(formParams, _.isNil);\n if (props.submitApi && formParams) {\n if (props.id) {\n formParams.id = props.id;\n result = await props.submitApi(formParams, 'put');\n } else {\n result = await props.submitApi(formParams, 'post');\n }\n if (result.code === 1) {\n // 确定或保存回调\n if (props.onConfirm) {\n let next = props.onConfirm(result);\n if (next === false) {\n return;\n }\n }\n message.success('操作成功', 1.5);\n props.onCancel && props.onCancel();\n }\n setState({\n saveLoading: false,\n });\n } else {\n // 确定或保存回调\n if (props.onConfirm && formParams) {\n props.onConfirm(formParams);\n }\n }\n } catch (error) {\n setState({\n saveLoading: false,\n });\n console.error(error);\n }\n }\n };\n\n /**\n * @Description 关闭弹窗,自动关闭loading\n * @Author bihongbin\n * @Date 2021-03-15 18:32:02\n */\n useEffect(() => {\n if (props.visible === false) {\n setState({\n saveLoading: false,\n });\n }\n }, [props.visible, setState]);\n\n /**\n * @Description 表单是否是禁用状态\n * @Author bihongbin\n * @Date 2020-08-05 11:37:06\n */\n useEffect(() => {\n setState({\n disabled: props.disable,\n });\n }, [props.disable, setState]);\n\n /**\n * @Description 暴漏给父组件调用\n * @Author bihongbin\n * @Date 2020-08-01 15:59:36\n */\n useImperativeHandle<any, LayoutFormModalCallType>(ref, () => ({\n // 设置loading\n setFormLoading: (data) => {\n setState({\n loading: data,\n });\n },\n // 设置保存loading\n setFormSaveLoading: (data) => {\n setState({\n saveLoading: data,\n });\n },\n // 设置一组字段状态\n setFormFields: (fields) => {\n if (formRef.current) {\n formRef.current.setFormFields(fields);\n }\n },\n // 读取表单值\n getFormValues: (data) => {\n return formRef.current?.getFormValues(data);\n },\n // 设置表单值\n setFormValues: (data) => {\n if (formRef.current) {\n formRef.current.setFormValues(data);\n }\n },\n // 排除指定表单后提交\n excludeFormSubmitValues: async (nameList) => {\n if (formRef.current) {\n const f = props.formList.filter((item) => {\n return !(nameList as string[])?.includes(item.name as string);\n });\n return await formRef.current?.formSubmit(f.map((item) => item.name) as NamePath[]);\n } else {\n return {};\n }\n },\n // 提交表单并验证\n getFormSubmitValues: async (nameList) => {\n if (formRef.current) {\n return await formRef.current?.formSubmit(nameList);\n } else {\n return {};\n }\n },\n }));\n\n return (\n <Dialog\n className={`form-modal ${props.className}`}\n width={props.width ? props.width : 600}\n visible={props.visible}\n title={props.title || '对话框'}\n onCancel={props.onCancel}\n destroyOnHidden\n maskClosable={false}\n footer={null}\n >\n <Spin spinning={state.loading}>\n <div className=\"modal-form-height\">\n {props.topRender ? props.topRender : null}\n <GenerateForm\n ref={formRef}\n formConfig={{\n labelCol: { span: 24 },\n ...props.formConfig,\n }}\n rowGridConfig={{ gutter: [20, 0] }}\n colGirdConfig={props.colGirdConfig || { span: 12 }}\n list={props.formList}\n />\n {props.children}\n </div>\n {footerRender()}\n </Spin>\n </Dialog>\n );\n};\n\nexport default forwardRef(LayoutFormModal);\n\n","import React from 'react';\nimport { Row, Col, Button, Space } from 'antd';\nimport hooks from '../brother/hooks';\nimport Dialog from '../Dialog';\nimport './index.less';\n\ninterface Props {\n /** 打开关闭 */\n visible: boolean;\n /** 弹窗宽度 */\n width?: number;\n /** 弹窗标题 */\n title?: string;\n /** 取消回调 */\n onCancel: () => void;\n /** 选择图标回调 */\n onConfirm?: (item: string) => void;\n}\n\ninterface StateType {\n iconModal: {\n selected: number;\n list: string[];\n };\n}\n\n/** 选择图标弹窗 */\nconst IconSelectionModal = (props: Props) => {\n const [state, setState] = hooks.useSetState<StateType>({\n iconModal: {\n selected: -1,\n list: [\n 'iconmove',\n 'iconmap',\n 'iconnotice',\n 'iconpassword',\n 'iconNotvisible1',\n 'iconphone',\n 'iconpic1',\n 'iconpin',\n 'iconproduct',\n 'iconQRcode1',\n 'iconreeor',\n 'iconreduce',\n 'iconresonserate',\n 'iconremind',\n 'iconrising1',\n 'iconRightarrow',\n 'iconrmb1',\n 'iconsave',\n 'iconscanning',\n 'iconseleted',\n 'iconsearchcart',\n 'iconshare',\n 'iconRightbutton',\n 'iconsorting',\n 'iconsound-Mute',\n 'iconsound-filling',\n 'iconsuggest',\n 'iconsuccess',\n 'iconsupplier-features',\n 'iconswitch',\n 'iconsuspended',\n 'iconTop',\n 'iconsmile',\n 'icontradealert',\n 'icontopsales',\n 'icontradingvolume',\n 'iconupload',\n 'iconviewlarger',\n 'iconwarning',\n 'iconset',\n 'iconDaytimemode',\n 'iconunlock',\n 'iconexchangerate',\n 'iconall',\n 'iconbussiness-man',\n 'iconcomponent',\n 'iconcode',\n 'iconcopy',\n 'icondollar',\n 'iconhistory',\n 'iconeditor',\n 'icondata',\n 'icongift',\n 'iconintegral',\n 'iconnav-list',\n 'iconpic',\n 'iconNotvisible',\n 'iconplay',\n 'iconQRcode',\n 'iconrmb',\n 'iconsimilar-product',\n 'iconExportservices',\n 'iconsendinquiry',\n 'iconcolumn',\n 'iconadd-account',\n 'iconcolumn1',\n 'iconadd',\n 'iconadd-cart',\n 'iconarrow-right',\n 'iconarrow-left',\n 'iconall1',\n 'iconarrow-up',\n 'iconashbin',\n 'iconatm',\n 'iconbad',\n 'iconattachent',\n 'iconbrowse',\n 'iconcalendar',\n 'iconcart-full',\n 'iconcalculator',\n 'iconcameraswitching',\n 'iconcecurity-protection',\n 'iconcategory',\n 'iconclose',\n 'iconcertified-supplier',\n 'iconcart-Empty',\n 'iconcode1',\n 'iconcopy1',\n 'iconcoupons',\n 'iconconnections',\n 'iconcry',\n 'iconclock',\n 'iconCurrencyConverter',\n 'iconcut',\n 'icondata1',\n 'iconCustomermanagement',\n 'icondouble-arro-right',\n 'iconcustomization',\n 'icondouble-arrow-left',\n 'icondiscount',\n 'icondownload',\n 'icondollar1',\n 'icondefault-template',\n 'iconeditor1',\n 'iconetrical-equipm',\n 'iconellipsis',\n 'iconemail',\n 'iconfalling',\n 'iconfilter',\n 'iconfolder',\n 'iconhelp',\n 'icongood',\n 'icongift1',\n 'iconhot',\n 'iconinspection',\n 'iconleftbutton',\n 'iconleftarrow',\n 'iconlink',\n 'iconloading',\n 'iconphone1',\n ],\n },\n });\n\n const iconStyle: React.CSSProperties = {\n height: 34,\n fontSize: 22,\n };\n\n /**\n * @Description 确定\n * @Author bihongbin\n * @Date 2020-08-18 17:34:47\n */\n const handleIconSave = () => {\n // 暂时不做限制\n // if (state.iconModal.selected === -1) {\n // message.warn('请选择图标', 1.5);\n // return;\n // }\n const item = state.iconModal.list[state.iconModal.selected];\n if (props.onConfirm) {\n props.onConfirm(item);\n }\n };\n\n return (\n <Dialog\n className=\"icon-selected-modal\"\n width={props.width ? props.width : 590}\n visible={props.visible}\n title={props.title ? props.title : '图标选择'}\n onCancel={props.onCancel}\n destroyOnHidden\n maskClosable={false}\n footer={null}\n >\n <Row gutter={[10, 10]}>\n {state.iconModal.list.map((item, index) => (\n <Col key={index}>\n <div\n className={`avatar-selected ${\n index === state.iconModal.selected ? 'avatar-selected-bg' : null\n }`}\n onClick={() => {\n setState((prev) => {\n prev.iconModal.selected = index;\n return prev;\n });\n }}\n >\n <i className={`iconfont ${item}`} title={item} style={iconStyle} />\n </div>\n </Col>\n ))}\n </Row>\n <Row className=\"icon-selected-foot\" justify=\"center\">\n <Col>\n <Space size={20}>\n <Button onClick={props.onCancel}>关闭</Button>\n <Button type=\"primary\" onClick={handleIconSave}>\n 确定\n </Button>\n </Space>\n </Col>\n </Row>\n </Dialog>\n );\n};\n\nexport default IconSelectionModal;\n","import React, { useMemo, useRef, useState, useEffect, useCallback } from 'react';\nimport { Table } from 'antd';\nimport { TableProps } from 'antd/es/table';\nimport ConfigProvider from '../brother/ConfigProvider';\nimport { isEqualWithFunc } from '../brother/utils';\nimport ResizableTitle from '../GenerateTable/ResizableTitle';\n\nexport type VirtualListProp<RecordType extends object = any> = {\n /** 虚拟列表参数 */\n vl: {\n /** (必填) 对应scrollY */\n height: number | string;\n /** (可选) 滚动条滚到底部触发api */\n onReachEnd?: () => void;\n /** (可选) 滚动时触发的api */\n onScroll?: () => void;\n onListRender?: (listInfo: { start: number; renderLen: number }) => void;\n debounceListRenderMS?: number;\n /** (可选, 如果同一页面存在多个虚拟表格时必填.) 唯一标识 */\n vid?: string;\n /** 默认为true. 是否数据变更后重置滚动条 */\n resetTopWhenDataChange?: boolean;\n };\n} & TableProps<RecordType>;\n\n/** 虚拟列表 */\nconst VirtualList = (props: VirtualListProp) => {\n const { vl, columns, ...rest } = props;\n const vlRef = useRef(vl);\n\n if (isEqualWithFunc(vl, vlRef.current)) {\n vlRef.current = vl;\n }\n\n const [colState, setColState] = useState(columns || []);\n\n useEffect(() => {\n setColState(columns || []);\n }, [columns]);\n\n const handleResize = useCallback(\n (index: number) =>\n (e: any, { size }: { size: { width: number } }) => {\n const newCols = [...colState];\n newCols[index] = { ...newCols[index], width: size.width };\n setColState(newCols);\n },\n [colState],\n );\n\n const mergedColumns = useMemo(() => {\n return colState.map((col: any, index: number) => ({\n ...col,\n onHeaderCell: (column: any) => ({\n width: column.width,\n onResize: handleResize(index),\n }),\n }));\n }, [colState, handleResize]);\n\n const mergedComponents = useMemo(\n () => ({\n header: { cell: ResizableTitle },\n }),\n [],\n );\n\n // 处理 onScroll/onReachEnd/onListRender\n const handleBodyScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n const { onScroll, onReachEnd, onListRender } = vl || {};\n if (onScroll) onScroll();\n const target = e.currentTarget;\n // 判断是否滚动到底部\n if (onReachEnd && target.scrollTop + target.clientHeight >= target.scrollHeight - 2) {\n onReachEnd();\n }\n // 触发 onListRender(无法精确获取渲染区间,只能简单模拟)\n if (onListRender) {\n // 这里只能大致估算\n onListRender({ start: 0, renderLen: 0 });\n }\n },\n [vl],\n );\n\n // antd Table 没有直接暴露 bodyRef,只能用 className 选择\n useEffect(() => {\n if (!vl) return;\n const timer = setTimeout(() => {\n const body = document.querySelector('.ant-table-body') as HTMLDivElement;\n if (body && vl.onScroll) {\n body.onscroll = () => {\n // 兼容原生 Event,转换为 React 事件参数结构\n handleBodyScroll({ currentTarget: body } as unknown as React.UIEvent<HTMLDivElement>);\n };\n }\n }, 500);\n return () => clearTimeout(timer);\n }, [vl, handleBodyScroll]);\n\n let scrollY = vl.height;\n try {\n scrollY = parseInt(vl.height as string);\n } catch (error) {\n scrollY = vl.height;\n }\n\n return (\n <ConfigProvider>\n <Table\n virtual\n bordered\n components={mergedComponents}\n rowKey=\"id\"\n pagination={false}\n scroll={{ y: scrollY, x: undefined }}\n columns={mergedColumns}\n {...rest}\n />\n </ConfigProvider>\n );\n};\n\nexport default VirtualList;\n","/*\n * @Description 按钮组\n * @Author bihongbin\n * @Date 2021-03-01 14:22:57\n * @LastEditors bihongbin\n * @LastEditTime 2023-04-12 14:56:32\n */\n\nimport React, { useEffect, useImperativeHandle, forwardRef } from 'react';\nimport { Row, Col } from 'antd';\nimport { CloseOutlined } from '@ant-design/icons';\nimport hooks from '../brother/hooks';\nimport './index.less';\n\nexport interface ButtonGroupListType {\n name: string;\n value: string | number;\n selected?: boolean;\n disabled?: boolean;\n [key: string]: any;\n}\n\nexport interface ButtonGroupTypeProps {\n /** 按钮组数据 */\n data: ButtonGroupListType[];\n className?: string;\n /** button的className */\n buttonClassName?: string;\n /** 按钮大小 */\n size?: 'large' | 'middle' | 'small';\n /** 单选和多选 */\n checkType?: 'checkbox' | 'radio';\n /** 是否打开删除功能 */\n deleteOpen?: boolean;\n /** 按钮删除和选中的回调 */\n onChange?: (data: ButtonGroupListType[]) => void;\n}\n\nexport interface ButtonGroupCallType {\n getButtonGroupSelected: () => ButtonGroupListType[];\n}\n\ninterface StateType {\n type: ButtonGroupTypeProps['checkType'];\n deleteOpen: boolean;\n data: ButtonGroupListType[];\n}\n\nconst baseStr = 'button-group';\n\n/** 按钮组,包含组件单选、多选和按钮组删除功能 */\nconst ButtonGroup = (props: ButtonGroupTypeProps, ref: any) => {\n const [state, setState] = hooks.useSetState<StateType>({\n type: 'checkbox', // 选择类型(单选和多选)\n deleteOpen: false, // 是否开启删除功能\n data: [], // 按钮数据\n });\n\n /**\n * @Description 渲染按钮样式\n * @Author bihongbin\n * @Date 2021-03-01 14:48:43\n */\n const buttonClassName = (item: ButtonGroupListType) => {\n let str = baseStr;\n if (props.buttonClassName) {\n str = `${str} ${props.buttonClassName}`;\n }\n if (props.size) {\n str = `${str} ${baseStr}-${props.size}`;\n }\n if (item.selected) {\n str = `${str} ${baseStr}-primary`;\n }\n return str;\n };\n\n /**\n * @Description 设置按钮状态选中\n * @Author bihongbin\n * @Date 2021-03-01 14:34:56\n */\n const handleSelected = (item: ButtonGroupListType, index: number) => {\n let formatList: ButtonGroupListType[] = [];\n // 当打开删除功能的时候,不能进行单选和多选\n if (props.deleteOpen) {\n return;\n }\n if (state.data) {\n // 多选\n if (state.type === 'checkbox') {\n state.data[index].selected = !item.selected;\n formatList = state.data;\n }\n // 单选\n if (state.type === 'radio') {\n formatList = state.data.map((t, i) => {\n let bool = false;\n if (index === i) {\n bool = !item.selected;\n }\n return {\n ...t,\n selected: bool,\n };\n });\n }\n }\n if (props.onChange) {\n props.onChange(formatList);\n }\n setState({\n data: formatList,\n });\n };\n\n /**\n * @Description 删除\n * @Author bihongbin\n * @Date 2021-03-01 14:36:22\n */\n const handleDelete = (index: number) => {\n if (state.data) {\n const formatList = state.data.filter((m, i) => index !== i);\n if (props.onChange) {\n props.onChange(formatList);\n }\n setState({\n data: formatList,\n });\n }\n };\n\n /**\n * @Description 父级设置状态\n * @Author bihongbin\n * @Date 2021-03-01 14:37:26\n */\n useEffect(() => {\n if (props.checkType) {\n setState({\n type: props.checkType,\n });\n }\n if (props.deleteOpen) {\n setState({\n deleteOpen: props.deleteOpen,\n });\n }\n if (props.data) {\n const data = props.data.map((item) => {\n if (item.selected === undefined) {\n item.selected = false;\n }\n return item;\n });\n setState({\n data: data,\n });\n }\n }, [props, setState]);\n\n /**\n * @Description 暴漏方法给父组件调用\n * @Author bihongbin\n * @Date 2020-08-04 11:51:33\n */\n useImperativeHandle<any, ButtonGroupCallType>(ref, () => ({\n // 当前选中的按钮\n getButtonGroupSelected: () => state.data.filter((item) => item.selected),\n }));\n\n return (\n <Row className={props.className} gutter={[10, 10]}>\n {state.data.map((item, index) => (\n <Col key={index}>\n <div className={buttonClassName(item)} onClick={() => handleSelected(item, index)}>\n {item.name}\n {state.deleteOpen ? <CloseOutlined onClick={() => handleDelete(index)} /> : null}\n </div>\n </Col>\n ))}\n </Row>\n );\n};\n\nexport default forwardRef(ButtonGroup);\n"],"names":["hook","useMemoizedFn","useEffect","effect","deps","isMounted","useRef","current","hooks","useSetState","initialState","state","setState","useState","useCallback","patch","prevState","Object","assign","Function","useDeepCompareEffect","callback","dependencies","React","value","ref","signalRef","_","isEqual","useDeepCompareMemoize","useUpdateEffect","useMount","fn","useUnmount","fnRef","useMethods","methods","func","undefined","create","keys","forEach","key","args","call","useToggle","defaultValue","reverseValue","useMemo","reverseValueOrigin","toggle","s","set","setLeft","setRight","useLatest","Affix","props","formatProps","targetId","_jsx","AffixBox","target","document","getElementById","window","typeofEqual","data","prototype","toString","type","getSelectValue","list","item","v","parseInt","label","dayjs","locale","mapStoreLangToDayjs","lng","Config","parentConfig","useContext","ConfigProvider","ConfigContext","antLocaleCode","mapAntLocaleToDayjs","localStorage","getItem","JSON","parse","error","getStorage","handler","e","language","addEventListener","removeEventListener","_Fragment","children","dialogIndex","Dialog","Component","show","dialog","body","host","createElement","onOk","onCancel","id","style","cssText","appendChild","visible","getContainer","destroyOnClose","removeChild","ReactDOM","render","confirm","title","draggleRef","constructor","super","this","disabled","bounds","left","top","bottom","right","onStart","event","uiData","clientWidth","clientHeight","documentElement","targetRect","getBoundingClientRect","x","y","open","Modal","className","maskClosable","cursor","onMouseOver","onMouseOut","onFocus","onBlur","modalRender","modal","Draggable","close","index$5","forwardRef","mapRef","mapCenterLocRef","storageConversion","uid","uuidV4","suggestId","coordinateConversion","forward","rear","convertor","BMap","Convertor","pointArr","push","point","translate","d","status","points","addMark","addOverlay","Marker","icon","Icon","Size","setMapCenterLocation","location","zoom","Point","centerAndZoom","setPropsOnChange","console","log","lat","onChange","setPlace","clearOverlays","local","LocalSearch","onSearchComplete","pp","getResults","getPoi","search","loadMap","Map","enableMapClick","enableScrollWheelZoom","Autocomplete","input","province","city","district","street","business","onMapInit","url","jsApi","src","head","useImperativeHandle","setMapCenter","_jsxs","width","height","placeholder","index$4","fileList","setFileList","UploadAntd","fileObject","response","file","code","message","destroy","errorMsg","msg","warning","content","dangerouslySetInnerHTML","__html","duration","success","uploadSuccess","filter","onRemove","prev","beforeUpload","LIST_IGNORE","Search","Input","index$3","loading","searchOpen","searchValue","treeList","draggableOpen","processOpen","checkedOpen","firstLevelCollection","expandedKeys","autoExpandParent","selectNode","selectCurrent","checkedNode","checkedCurrent","generateList","arr","eachData","_data","i","length","node","handleSelectTreeNode","selectedKeys","isArray","map","String","onSelect","handleExpandTreeNode","getParentKey","tree","parentKey","some","searchChange","_expandedKeys","indexOf","self","handleCheckNode","checked","checkedArr","Array","loopTree","t","index","beforeStr","substr","afterStr","treeRightButton","Col","customAction","Row","justify","align","deep","getDeep","setLoading","getSelectNode","getSelectCurrent","getCheckedNode","getCheckedCurrent","setSelectNode","setCheckedNode","Spin","spinning","Tree","blockNode","showLine","showLeafIcon","checkable","treeData","checkedKeys","onExpand","onCheck","halfChecked","draggable","onDrop","info","dropKey","dragKey","dragNode","dropPos","pos","split","dropPosition","Number","loop","onVerificationDropCallBack","noDrag","dragObj","splice","dropToGap","expanded","unshift","ar","onDropCallBack","onDragEnter","treeConfig","Empty","Option","Select","RangePicker","DatePicker","TimeRangePicker","TimePicker","GenerateForm$1","form","Form","useForm","formConfig","rowGridConfig","colGirdConfig","remoteRef","debounceMapRef","treeSelectRef","update","remoteFetching","remoteData","treeSelectData","treeSelectFlattenData","selectMultiple","fetchRemote","config","remoteConfig","names","name","remoteApi","then","res","setTimeout","catch","fetchTreeSelect","treeSelectConfig","api","transformTreeSelect","flattenTreeSelect","original","entries","regionLoadData","async","selectedOptions","targetOption","result","regionSelectionConfig","selectLoad","isLeaf","formRender","setMultipleCheckbox","bool","inputRender","inputMode","arg","inputConfig","maxLength","inputChange","onPressEnter","inputEnter","selectRender","allowClear","selectChange","selectConfig","selectData","k","multipleRender","mode","multipleChange","filterOption","inputValue","option","toLowerCase","includes","popupRender","allSelect","Checkbox","editObj","setFieldsValue","multipleSelectRender","maxTagPlaceholder","omittedValues","labels","join","Tooltip","placement","remoteSearchRender","isMode","remoteMode","showSearch","nameKey","debounce","notFoundContent","size","marginTop","marginBottom","image","PRESENTED_IMAGE_SIMPLE","onSearch","remoteSearchChange","datePickerRender","datePickerChange","datePickerConfig","timePickerRender","timePickerChange","timePickerConfig","unionRender","m","componentName","childForm","selectIsHideAll","alignRight","otherConfig","inputNumberConfig","InputNumber","inputNumberChange","InputNumberRender","display","hideInputRender","TextArea","rows","textAreaChange","textAreaRender","optionFilterProp","autoCompleteChange","autoCompleteRender","AutoComplete","toUpperCase","inputAutoCompleteChange","inputAutoCompleteConfig","inputAutoCompleteRender","multipleTagRender","rangePickerPlaceholder","rangePickerChange","rangePickerConfig","rangePickerRender","timeRangePickerPlaceholder","timeRangePickerChange","timeRangePickerConfig","TimeRangePickerRender","Switch","defaultChecked","checkedChildren","unCheckedChildren","switchChange","switchRender","Radio","Group","radioChange","radioRender","checkboxChange","checkboxRender","TreeSelect","styles","root","maxHeight","overflow","configData","flatten","changeChild","newItem","changeVal","treeDefaultExpandAll","extra","treeSelectRender","len","unionConfig","unionItems","gutter","Item","rules","noStyle","divide","propsRegionConfig","Cascader","options","loadData","changeOnSelect","cascaderChange","regionSelectionRender","Rate","rateChange","rateConfig","rateRender","grid","resetItem","marginRight","color","fontStyle","fontFamily","unionRuleStyle","omit","colProps","_createElement","renderedList","obj","initLoad","getFormValues","getFieldsValue","setFormFields","fields","setFields","setFormValues","values","reLoad","formSubmit","nameList","Promise","resolve","reject","validateFields","replace","err","errorFields","warn","Error","formReset","resetFields","initialValues","sortSeq","startTime","Date","getFullYear","endTime","stringifiable","slice","defineProperty","exports","isProduction","process","invariant","condition","hasOwnProperty","source","getAllKeys","getOwnPropertySymbols","concat","copy","object","Set","getPrototypeOf","Context","commands","defaultCommands","bind","extend","isEquals","newContext","get","enumerable","configurable","directive","$spec","_this","spec","$apply","nextObject","objectWasNextObject","nextValueForKey","nextObjectValue","$push","invariantPushAndUnshift","$unshift","$splice","originalObject","invariantSplice","invariantSplices","apply","$set","_nextObject","invariantSet","$toggle","targets","invariantSpecArray","nextObjectCopy","$unset","_spec","$add","invariantMapOrSet","_a","has","add","$remove","delete","$merge","specValue","defaultContext","command","typeOfTarget","default","module","ResizableTitle$1","memo","onResize","restProps","stopClick","stopPropagation","preventDefault","localWidth","setLocalWidth","draggableOpts","enableUserSelectHack","safeWidth","handleNode","onMouseDown","onClick","thRef","containerElRef","containerRect","setContainerRect","measured","offsetWidth","clamp","val","Math","min","max","rafIdRef","onResizeSafe","evt","cancelAnimationFrame","requestAnimationFrame","setDragX","clientX","onResizeStopSafe","setIsResizing","finalWidth","isResizing","dragX","Resizable","handle","onResizeStart","thEl","container","closest","onResizeStop","position","createPortal","borderLeft","pointerEvents","zIndex","EditableContext","createContext","EditableRow","moveRow","forwardedRef","innerRef","isOver","dropClassName","drop","useDrop","accept","collect","monitor","dragIndex","drag","useDrag","isDragging","tempProps","component","Provider","next","EditableCell$1","columns","record","recordIndex","dataIndex","rowSpanNum","colSpanNum","rowSpan","colSpan","editable","inputType","valueType","valueEnum","recordSelectField","controlRender","formChange","formItemProps","handleSave","triggerRemoteSearch","editing","setEditing","setRemoteFetching","setRemoteData","formItemRef","focus","fieldName","blurEditing","closeEdit","toggleEdit","curVal","filterTime","filed","DateTimePicker","format","filterContent","isDayjs","filterFormType","str","o","optionNode","popupMatchSelectWidth","save","showTime","errInfo","childNode","filterResult","margin","vcRender","rest","dom","DndContext","HTML5Backend","DndContainer","DndProvider","backend","context","GenerateTable$1","extraProps","tableConfig","virtual","rowType","scroll","apiMethod","hidSortColumn","paginationConfig","getCheckboxProps","resultFilter","getTableSuccessData","queryParameters","isShowPagination","queryPagination","total","pages","pageSize","showSizeChanger","orderByInfo","columnsCacheRef","formatColumns","setFormatColumns","listLoading","setListLoading","listData","selectRowIds","selectRowArray","scrollXY","setScrollXY","rowKey","VirtualEditableRow","VirtualEditableCell","EditableCell","components","header","cell","ResizableTitle","row","isFunction","showTotal","showQuickJumper","keyOriginPlace","prevData","newData","mergedMap","from","getList","updateSelected","pagination","queryParams","itemValue","page","pickBy","identity","rowIds","rowData","deepTable","ids","changeEstimatesList","paginationChange","sorter","order","field","rowSelection","fixed","selectedRowKeys","onSelectAll","selected","selectedRows","changeRows","uniq","uniqBy","changeItem","handleResize","nextColumns","stringify","hoverIndex","dragRow","sort","moveChange","filterSelectRows","tableList","text","col","onHeaderCell","column","onCell","currentColumns","find","filterColumns","sliderMenu","routerRender","pad","getComputedStyle","setTableLoading","getPages","getTableList","clearSelectIds","setRowSelected","setRowSelectedBy","getSelectIds","getSelectRowsArray","cloneDeep","removeSelectIds","filterByIds","array","keyName","getStaticDataList","setStaticDataList","DndWrap","Table","bordered","rowClassName","onRow","dataSource","p","n","stripFuncs","params","outerHeight","minHeight","Em","description","Link","Paragraph","Typography","index$2","searchFormRef","tableRef","saveLoading","tableColumnsList","colGirdWidth","span","onRemoveCol","removeIds","removeRows","formatStr","isValid","manualParameterChange","searchCallback","fileName","searchNoResetFiled","searchFormList","autoGetList","openSelected","defaultValues","setSavaLoading","forceRender","footer","modalConfig","topExtra","GenerateForm","Space","Button","rowProps","leftSlot","jsx","GenerateTable","currentSelected","onCheckChange","Card","overflowY","rightExport","headers","headres","csvContent","headerTitles","blob","Blob","link","URL","createObjectURL","setAttribute","visibility","click","exportToExcel","ellipsis","rightSlot","onConfirm","QuicklyProcessForms","formRef","leftRightStyle","fontSize","transformTime","timeArray","date","currentIndex","formResult","cutIndexObj","submitApi","plusIndexObj","keyDown","HandleRequestParam","methodParams","param","r","destroyOnHidden","wrap","flex","LeftCircleFilled","labelCol","formList","RightCircleFilled","index$1","formParams","isBefore","submitExtraParameters","switchTransform","submitRemoveField","manualVerification","omitBy","isNil","disable","setFormLoading","setFormSaveLoading","excludeFormSubmitValues","f","getFormSubmitValues","topRender","initBtn","buttons","footBtnList","model","laterBtn","footerRender","IconSelectionModal","iconModal","iconStyle","VirtualList","vl","vlRef","o1","o2","isEqualWith","val1","val2","colState","setColState","newCols","mergedColumns","mergedComponents","handleBodyScroll","onScroll","onReachEnd","onListRender","currentTarget","scrollTop","scrollHeight","start","renderLen","timer","querySelector","onscroll","clearTimeout","scrollY","baseStr","deleteOpen","buttonClassName","checkType","getButtonGroupSelected","formatList","handleSelected","CloseOutlined","handleDelete"],"mappings":"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,SAAEA,KAAagpB,GAAS3qB,EAC9B,OACEkd,EAAC2X,EAAM,IAAKlK,EAAM1sB,IAAK2P,GACpBjM,KAIP,GAAc,QAAVu3B,EACF,OAAOzL,EAAI0L,GAEb,GAAc,WAAVD,EACF,OAAOzL,EAAI,IAAI0L,KAAaJ,IAE9B,GAAc,UAAVG,EACF,OAAOzL,EAAI,IAAIsL,KAAYI,GAE/B,CACA,OAAO1L,EAAIsL,IAkNNK,UClVT,MAAMC,GAAsBr6B,IAC1B,MAAO9C,EAAOC,GAAYJ,GAAMC,YAAuB,CACrDs9B,UAAW,CACT/J,UAAU,EACVxvB,KAAM,CACJ,WACA,UACA,aACA,eACA,kBACA,YACA,WACA,UACA,cACA,cACA,YACA,aACA,kBACA,aACA,cACA,iBACA,WACA,WACA,eACA,cACA,iBACA,YACA,kBACA,cACA,iBACA,oBACA,cACA,cACA,wBACA,aACA,gBACA,UACA,YACA,iBACA,eACA,oBACA,aACA,iBACA,cACA,UACA,kBACA,aACA,mBACA,UACA,oBACA,gBACA,WACA,WACA,aACA,cACA,aACA,WACA,WACA,eACA,eACA,UACA,iBACA,WACA,aACA,UACA,sBACA,qBACA,kBACA,aACA,kBACA,cACA,UACA,eACA,kBACA,iBACA,WACA,eACA,aACA,UACA,UACA,gBACA,aACA,eACA,gBACA,iBACA,sBACA,0BACA,eACA,YACA,yBACA,iBACA,YACA,YACA,cACA,kBACA,UACA,YACA,wBACA,UACA,YACA,yBACA,wBACA,oBACA,wBACA,eACA,eACA,cACA,uBACA,cACA,qBACA,eACA,YACA,cACA,aACA,aACA,WACA,WACA,YACA,UACA,iBACA,iBACA,gBACA,WACA,cACA,iBAKAw5B,EAAiC,CACrClwB,OAAQ,GACRqtB,SAAU,IAoBZ,OACEvtB,EAACtH,GAAM,CACL2C,UAAU,sBACV4E,MAAOpK,EAAMoK,MAAQpK,EAAMoK,MAAQ,IACnC1G,QAAS1D,EAAM0D,QACfO,MAAOjE,EAAMiE,MAAQjE,EAAMiE,MAAQ,OACnCZ,SAAUrD,EAAMqD,SAChBm1B,iBAAe,EACf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","x_google_ignoreList":[17]}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../components/brother/hooks/useUpdateEffect/index.ts","../components/brother/hooks/index.ts","../components/brother/hooks/useSetState/index.ts","../components/brother/hooks/useDeepCompareEffect/index.ts","../components/brother/hooks/useMount/index.ts","../components/brother/hooks/useUnmount/index.ts","../components/brother/hooks/useMethods/index.ts","../components/brother/hooks/useToggle/index.ts","../components/brother/hooks/useLatest/index.ts","../components/Affix/index.tsx","../components/brother/utils/index.ts","../components/brother/ConfigProvider/index.tsx","../components/Dialog/index.tsx","../components/GaoDeMap/index.tsx","../components/Upload/index.tsx","../components/TreeNode/index.tsx","../components/GenerateForm/index.tsx","../node_modules/.pnpm/immutability-helper@3.1.1/node_modules/immutability-helper/index.js","../components/GenerateTable/ResizableTitle/index.tsx","../components/GenerateTable/EditableCell/index.tsx","../components/brother/DndWrap/index.tsx","../components/GenerateTable/index.tsx","../components/Empty/index.tsx","../components/LayoutTableModal/index.tsx","../components/QuicklyProcessForms/index.tsx","../components/LayoutFormModal/index.tsx","../components/IconSelectionModal/index.tsx","../components/VirtualList/index.tsx","../components/ButtonGroup/index.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef } from 'react';\n\ntype effectHookType = typeof useEffect | typeof useLayoutEffect;\n\nconst createUpdateEffect: (hook: effectHookType) => effectHookType = (hook) => (effect, deps) => {\n const isMounted = useRef(false);\n\n // for react-refresh\n hook(() => {\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n hook(() => {\n if (!isMounted.current) {\n isMounted.current = true;\n } else {\n return effect();\n }\n }, deps);\n};\n\nexport default createUpdateEffect(useEffect);\n","import useSetState from './useSetState';\nimport useDeepCompareEffect from './useDeepCompareEffect';\nimport useUpdateEffect from './useUpdateEffect';\nimport useMemoizedFn from './useUpdateEffect';\nimport useMount from './useMount';\nimport useUnmount from './useUnmount';\nimport useMethods from './useMethods';\nimport useToggle from './useToggle';\nimport useLatest from './useLatest';\n\nexport default {\n useSetState,\n useDeepCompareEffect,\n useUpdateEffect,\n useMemoizedFn,\n useMount,\n useUnmount,\n useMethods,\n useToggle,\n useLatest,\n};\n","import { useCallback, useState } from 'react';\n\nconst useSetState = <T extends object>(\n initialState: T = {} as T,\n): [T, (patch: Partial<T> | ((prevState: T) => Partial<T>)) => void] => {\n const [state, setState] = useState<T>(initialState);\n const setMergeState = useCallback((patch: Partial<T> | ((prevState: T) => Partial<T>)) => {\n setState((prevState) => {\n return Object.assign({}, prevState, patch instanceof Function ? patch(prevState) : patch);\n });\n }, []);\n return [state, setMergeState];\n};\n\nexport default useSetState;\n","import * as React from 'react';\nimport _ from 'lodash';\n\ntype UseEffectParams = Parameters<typeof React.useEffect>;\ntype EffectCallback = UseEffectParams[0];\ntype DependencyList = UseEffectParams[1];\ntype UseEffectReturn = ReturnType<typeof React.useEffect>;\n\nfunction checkDeps(deps: DependencyList) {\n if (!deps || !deps.length) {\n throw new Error('useDeepCompareEffect不应在没有依赖性的情况下使用。 使用React.useEffect代替。');\n }\n if (deps.every(isPrimitive)) {\n throw new Error(\n 'useDeepCompareEffect不应与都是原始值的依赖项一起使用。 使用React.useEffect代替。',\n );\n }\n}\n\nfunction isPrimitive(val: unknown) {\n return val == null || /^[sbn]/.test(typeof val);\n}\n\nfunction useDeepCompareMemoize(value: DependencyList) {\n const ref = React.useRef<DependencyList>();\n const signalRef = React.useRef<number>(0);\n\n if (!_.isEqual(value, ref.current)) {\n ref.current = value;\n signalRef.current += 1;\n }\n\n return [signalRef.current];\n}\n\nconst __DEV__ = process.env.NODE_ENV === 'development';\n\nfunction useDeepCompareEffect(\n callback: EffectCallback,\n dependencies: DependencyList,\n): UseEffectReturn {\n\n if (__DEV__) {\n checkDeps(dependencies);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return React.useEffect(callback, useDeepCompareMemoize(dependencies));\n}\n\nexport default useDeepCompareEffect;\n","import { useEffect } from 'react';\n\nconst __DEV__ = process.env.NODE_ENV === 'development';\n\nconst useMount = (fn: () => void) => {\n if (__DEV__) {\n if (typeof fn !== 'function') {\n console.error(\n `useMount: parameter \\`fn\\` expected to be a function, but got \"${typeof fn}\".`,\n );\n }\n }\n\n useEffect(() => {\n fn();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n};\n\nexport default useMount;\n","import { useEffect, useRef } from 'react';\n\nconst __DEV__ = process.env.NODE_ENV === 'development';\n\nconst useUnmount = (fn: () => void) => {\n if (__DEV__) {\n if (typeof fn !== 'function') {\n console.error(`useUnmount expected parameter is a function, got ${typeof fn}`);\n }\n }\n\n const fnRef = useRef(fn);\n\n useEffect(\n () => () => {\n fnRef.current();\n },\n [],\n );\n};\n\nexport default useUnmount;\n","import React from 'react';\n\nfunction useMethods<T extends Record<string, (...args: any[]) => any>>(methods: T) {\n const { current } = React.useRef({\n methods,\n func: undefined as T | undefined,\n });\n current.methods = methods;\n\n // 只初始化一次\n if (!current.func) {\n const func = Object.create(null);\n Object.keys(methods).forEach((key) => {\n // 包裹 function 转发调用最新的 methods\n func[key] = (...args: unknown[]) => current.methods[key].call(current.methods, ...args);\n });\n // 返回给使用方的变量\n current.func = func;\n }\n\n return current.func as T;\n}\n\nexport default useMethods;\n","import { useMemo, useState } from 'react';\n\nexport interface Actions<T> {\n setLeft: () => void;\n setRight: () => void;\n set: (value: T) => void;\n toggle: () => void;\n}\n\nfunction useToggle<T = boolean>(): [boolean, Actions<T>];\n\nfunction useToggle<T>(defaultValue: T): [T, Actions<T>];\n\nfunction useToggle<T, U>(defaultValue: T, reverseValue: U): [T | U, Actions<T | U>];\n\nfunction useToggle<D, R>(defaultValue: D = false as unknown as D, reverseValue?: R) {\n const [state, setState] = useState<D | R>(defaultValue);\n\n const actions = useMemo(() => {\n const reverseValueOrigin = (reverseValue === undefined ? !defaultValue : reverseValue) as D | R;\n\n const toggle = () => setState((s) => (s === defaultValue ? reverseValueOrigin : defaultValue));\n const set = (value: D | R) => setState(value);\n const setLeft = () => setState(defaultValue);\n const setRight = () => setState(reverseValueOrigin);\n\n return {\n toggle,\n set,\n setLeft,\n setRight,\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return [state, actions];\n}\n\nexport default useToggle;\n","import { useRef } from 'react';\n\nfunction useLatest<T>(value: T) {\n const ref = useRef(value);\n ref.current = value;\n\n return ref;\n}\n\nexport default useLatest;\n","/*\n * @Description 固钉\n * @Author bihongbin\n * @Date 2021-07-01 11:44:07\n * @LastEditors bihongbin\n * @LastEditTime 2023-04-11 14:22:35\n */\nimport React from 'react';\nimport { Affix as AffixBox } from 'antd';\nimport { AffixProps } from 'antd/es/affix';\n\ntype PropType = AffixProps & {\n targetId?: string;\n};\n\n/** 固钉,当内容区域比较长,需要滚动页面时,这部分内容对应的操作或者导航需要在滚动范围内始终展现 */\nconst Affix = (props: PropType) => {\n let formatProps = { ...props };\n let targetId = '';\n if (formatProps.targetId) {\n targetId = formatProps.targetId;\n delete formatProps.targetId;\n }\n\n return (\n <AffixBox\n target={() => {\n return document.getElementById(targetId || 'router-render') || window;\n }}\n {...formatProps}\n />\n );\n};\n\nexport default Affix;\n","import _ from 'lodash';\nimport { FormListType } from '../../GenerateForm';\nimport { SelectType, AnyObjectType } from '../../brother/typings';\n\n/**\n * @description 获取localStorage\n * @author bihongbin\n * @param {any} key\n * @return {*}\n * @Date 2023-07-12 10:37:20\n */\nexport const getStorage = (key: any) => {\n if (!key) {\n return null;\n }\n key = key.toString();\n const data = window.localStorage.getItem(key);\n try {\n return JSON.parse(data as any);\n } catch (error) {\n return data;\n }\n};\n\n/**\n * @description 设置localStorage\n * @author bihongbin\n * @param {any} key\n * @param {any} value\n * @return {*}\n * @Date 2023-07-12 10:37:33\n */\nexport const setStorage = (key: any, value: any) => {\n if (!key || !value) {\n return null;\n }\n key = key.toString();\n window.localStorage.setItem(key, JSON.stringify(value));\n};\n\n/**\n * @description 比较2个对象是否相等\n * @Author bihongbin\n * @return {*}\n * @Date 2023-07-07 14:11:02\n */\nexport const isEqualWithFunc = (o1: AnyObjectType, o2: AnyObjectType) => {\n return _.isEqualWith(o1, o2, (val1, val2) => {\n if (_.isFunction(val1) && _.isFunction(val2)) {\n return val1.toString() === val2.toString();\n }\n });\n};\n\n/**\n * @Description 组件是否重新渲染比较\n * @Author bihongbin\n * @Date 2021-08-26 14:10:48\n */\nexport const isEqualWith = (prevProps: any, nextProps: any) => {\n return isEqualWithFunc(prevProps, nextProps);\n};\n\n/**\n * @Description 检查数据类型是否符合\n * @Author bihongbin\n * @Date 2021-011-09 11:26:15\n */\nexport const typeofEqual = (data: {\n data: any;\n type: 'Object' | 'Array' | 'String' | 'Number';\n}) => {\n return Object.prototype.toString.call(data.data) === `[object ${data.type}]`;\n};\n\n/**\n * @Description 获取下拉菜单的对应值\n * @Author bihongbin\n * @Date 2021-11-11 15:00:30\n */\nexport const getSelectValue = (list: SelectType[], value: string | number) => {\n for (let item of list) {\n let v = item.value;\n if (typeof value === 'number') {\n v = parseInt(item.value as string);\n }\n if (v === value) {\n return item.label;\n }\n }\n return value;\n};\n\n/**\n * @Description 默认下拉菜单增加全部这一选项\n * @Author bihongbin\n * @Date 2020-11-06 13:57:22\n */\nexport const dropDownMenuPushAll = (data: FormListType[] | undefined) => {\n if (data) {\n return data.map((item) => {\n if (item.componentName === 'Select' && item.selectData && item.selectData.length) {\n if (!item.selectData.some((s) => s.label === '全部')) {\n item.selectData = [{ label: '全部', value: '' }, ...item.selectData];\n }\n }\n return item;\n });\n } else {\n return [];\n }\n};\n","import React, { useEffect } from 'react';\nimport { ConfigProvider } from 'antd';\nimport dayjs from 'dayjs';\nimport 'dayjs/locale/zh-cn';\nimport 'dayjs/locale/zh-hk';\nimport { getStorage } from '../../brother/utils';\n\ninterface PropTypes {\n children: React.ReactNode;\n}\n\ndayjs.locale('zh-cn');\n\nconst mapAntLocaleToDayjs = (antLocaleCode?: string) => {\n switch (antLocaleCode) {\n case 'zh_CN':\n dayjs.locale('zh-cn');\n break;\n case 'zh_HK':\n dayjs.locale('zh-hk');\n break;\n case 'en_US':\n dayjs.locale('en');\n break;\n default:\n // 保持现有或回退到中文\n dayjs.locale('zh-cn');\n break;\n }\n};\n\nconst mapStoreLangToDayjs = (lng?: string) => {\n switch (lng) {\n case 'zh-CN':\n dayjs.locale('zh-cn');\n break;\n case 'zh-HK':\n dayjs.locale('zh-hk');\n break;\n case 'en':\n dayjs.locale('en');\n break;\n default:\n break;\n }\n};\n\nconst Config = (props: PropTypes) => {\n // 从上层 antd ConfigProvider 读取上下文以继承 locale/theme\n const parentConfig = React.useContext(ConfigProvider.ConfigContext);\n\n // 初始化:若上层未提供,尝试根据存储设置 dayjs 语言\n useEffect(() => {\n if (parentConfig?.locale?.locale) {\n mapAntLocaleToDayjs(parentConfig.locale.locale as string);\n } else {\n mapStoreLangToDayjs(getStorage('i18nextLng'));\n }\n }, [parentConfig?.locale]);\n\n // 监听外部事件,仅同步 dayjs 语言,不覆盖 antd 配置\n useEffect(() => {\n const handler = (e: any) => {\n mapStoreLangToDayjs(e?.language);\n };\n window.addEventListener('web_pack:language', handler);\n return () => window.removeEventListener('web_pack:language', handler);\n }, []);\n\n // 不再包裹自己的 antd ConfigProvider,避免覆盖宿主项目设置\n return <>{props.children}</>;\n};\n\nexport default Config;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport Draggable, { DraggableEvent, DraggableData } from 'react-draggable';\nimport { Modal } from 'antd';\nimport ConfigProvider from '../brother/ConfigProvider';\nimport './index.less';\n\nlet dialogIndex = 1;\n\nexport type DialogPropType = any;\n\ninterface StateType {\n disabled: boolean;\n bounds: {\n left: number;\n top: number;\n bottom: number;\n right: number;\n };\n}\n\n/** 弹窗 */\nclass Dialog extends React.Component<DialogPropType, StateType> {\n static show(props: any): Dialog {\n let body = document.body;\n let host = document.createElement('div');\n let onOk = props && props.onOk;\n let onCancel = props && props.onCancel;\n let dialog;\n\n host.id = 'dialog-' + dialogIndex++;\n host.style.cssText = 'position:absolute;top:0;left:0;';\n body.appendChild(host);\n\n props = props || {};\n props.visible = true;\n props.getContainer = false;\n props.destroyOnClose = true;\n\n props.onOk = () => {\n onOk && onOk();\n body.removeChild(host);\n };\n\n props.onCancel = () => {\n onCancel && onCancel();\n body.removeChild(host);\n };\n\n ReactDOM.render(<Dialog {...props} ref={(ref) => (dialog = ref)}></Dialog>, host);\n\n return dialog as any;\n }\n\n static confirm(title: string, children: React.ReactNode, onOk: Function) {\n return Dialog.show({\n title,\n children,\n onOk,\n });\n }\n\n draggleRef: any;\n\n constructor(props: DialogPropType) {\n super(props);\n\n this.state = {\n disabled: true,\n bounds: { left: 0, top: 0, bottom: 0, right: 0 },\n };\n }\n\n onStart(event: DraggableEvent, uiData: DraggableData) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = this.draggleRef?.current?.getBoundingClientRect();\n\n this.setState({\n bounds: {\n left: -targetRect?.left + uiData?.x,\n right: clientWidth - (targetRect?.right - uiData?.x),\n top: -targetRect?.top + uiData?.y,\n bottom: clientHeight - (targetRect?.bottom - uiData?.y),\n },\n });\n }\n\n render() {\n let props = { ...this.props };\n let state = this.state;\n let open = props.visible;\n\n delete props.visible;\n\n return (\n <ConfigProvider>\n <Modal\n className=\"dialog\"\n maskClosable={false}\n {...props}\n open={open}\n title={\n <div\n style={{ cursor: 'move' }}\n onMouseOver={() => {\n this.setState({\n disabled: false,\n });\n }}\n onMouseOut={() => {\n this.setState({\n disabled: true,\n });\n }}\n // fix eslintjsx-a11y/mouse-events-have-key-events\n // https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/mouse-events-have-key-events.md\n onFocus={() => {}}\n onBlur={() => {}}\n // end\n >\n {props.title}\n </div>\n }\n modalRender={(modal) => (\n <Draggable\n disabled={state.disabled}\n bounds={state.bounds}\n onStart={(event, uiData) => this.onStart(event, uiData)}\n >\n <div ref={this.draggleRef}>{modal}</div>\n </Draggable>\n )}\n >\n {props.children}\n </Modal>\n </ConfigProvider>\n );\n }\n\n close(onOk?: boolean) {\n let props = this.props;\n\n if (onOk) {\n props.onOk && props.onOk();\n } else {\n props.onCancel && props.onCancel();\n }\n }\n}\n\nexport default Dialog;\n","/*\n * @Description 地图组件\n * @Author bihongbin\n * @Date 2020-12-03 16:34:09\n * @LastEditors liangjiaming\n * @LastEditTime 2024-12-10 15:17:35\n */\n\nimport React, {\n useEffect,\n useCallback,\n useMemo,\n useRef,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { v4 as uuidV4 } from 'uuid';\nimport './index.less';\n\ndeclare const BMap: any;\ndeclare const window: Window & { onMapInit?: () => void };\n\ninterface PropType {\n /** className */\n className?: string;\n /** style内联样式 */\n style?: React.CSSProperties;\n /** 关键字选中回调 */\n onChange?: (data: MapType) => void;\n}\n\nexport type positionType = [number, number];\n\nexport interface MapCallType {\n setMapCenter: (data: positionType, zoom?: number) => void;\n}\n\nexport interface MapType {\n address?: string;\n // 必要属性\n location: {\n lat: number;\n lng: number;\n };\n}\n\n/** 地图 */\nconst GaoDeMap = (props: PropType, ref: any) => {\n const mapRef = useRef<any>(null);\n const mapCenterLocRef = useRef<any>(null);\n const storageConversion = useRef<any>(null);\n\n /**\n * @Description 缓存生成的随机容器id\n * @Author bihongbin\n * @Date 2020-12-03 15:36:38\n */\n const uid = useMemo(() => uuidV4(), []);\n\n /**\n * @Description 缓存随机生成的搜索id\n * @Author bihongbin\n * @Date 2021-09-08 15:02:19\n */\n const suggestId = useMemo(() => uuidV4(), []);\n\n /**\n * @Description 百度和谷歌坐标相互转换\n * @Author bihongbin\n * @Date 2021-09-14 14:59:15\n */\n const coordinateConversion = (data: {\n point: any;\n target: 'baidu' | 'google';\n callback?: (data: { lat: number; lng: number }) => void;\n }) => {\n const COORDINATES_GCJ02 = 3; // GCJ02坐标\n const COORDINATES_BD09 = 5; // 百度bd09经纬度坐标\n let forward = 0;\n let rear = 0;\n const convertor = new BMap.Convertor();\n const pointArr = [];\n pointArr.push(data.point);\n // 谷歌转百度\n if (data.target === 'baidu') {\n forward = COORDINATES_GCJ02;\n rear = COORDINATES_BD09;\n }\n // 百度转谷歌\n if (data.target === 'google') {\n forward = COORDINATES_BD09;\n rear = COORDINATES_GCJ02;\n }\n convertor.translate(pointArr, forward, rear, (d: any) => {\n if (d.status === 0) {\n if (data.callback) {\n data.callback(d.points[0]);\n }\n }\n });\n };\n\n /**\n * @Description 创建添加覆盖物\n * @Author bihongbin\n * @Date 2021-09-09 10:01:42\n */\n const addMark = (point: any) => {\n mapRef.current.addOverlay(\n new BMap.Marker(point, {\n icon: new BMap.Icon(\n 'https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png',\n new BMap.Size(20, 32),\n ),\n }),\n );\n };\n\n /**\n * @Description 设置地图中心位置和层级\n * @Author bihongbin\n * @Date 2020-12-04 09:57:32\n */\n const setMapCenterLocation = useCallback((location: positionType, zoom?: number) => {\n if (mapRef.current) {\n // 坐标系\n const point = new BMap.Point(location[0], location[1]);\n // 添加覆盖物\n addMark(point);\n // 设置中心点和层级\n mapRef.current.centerAndZoom(point, zoom ? zoom : 18);\n } else {\n // 当地图实例不存在,记忆中心点和坐标\n mapCenterLocRef.current = {\n location,\n zoom,\n };\n }\n }, []);\n\n /**\n * @Description 设置地图选中地址以后的onChange回调\n * @Author bihongbin\n * @Date 2021-09-08 17:04:22\n */\n const setPropsOnChange = useCallback(\n (data: MapType) => {\n console.log('转换为google坐标前:', data.location);\n const point = new BMap.Point(data.location.lng, data.location.lat);\n // 转换为google坐标\n coordinateConversion({\n target: 'google',\n point,\n callback: (d) => {\n data.location.lng = d.lng;\n data.location.lat = d.lat;\n console.log('转换为google坐标后:', data.location);\n if (props.onChange) {\n props.onChange(data);\n }\n },\n });\n },\n [props],\n );\n\n /**\n * @Description 智能搜索设置地址\n * @Author bihongbin\n * @Date 2021-09-08 15:26:45\n * @param {*} useCallback\n */\n const setPlace = useCallback(\n (value: string) => {\n // 清除地图覆盖物\n mapRef.current.clearOverlays();\n // 智能搜索\n const local = new BMap.LocalSearch(mapRef.current, {\n onSearchComplete: () => {\n // 获取第一个智能搜索的结果\n let pp = local.getResults().getPoi(0);\n if (pp) {\n const point = pp.point;\n setMapCenterLocation([point.lng, point.lat]);\n setPropsOnChange({\n ...pp,\n location: {\n lng: point.lng,\n lat: point.lat,\n },\n });\n }\n },\n });\n local.search(value);\n },\n [setMapCenterLocation, setPropsOnChange],\n );\n\n /**\n * @Description 加载地图文件\n * @Author bihongbin\n * @Date 2020-12-03 15:44:04\n */\n useEffect(() => {\n const loadMap = () => {\n mapRef.current = new BMap.Map(uid, { enableMapClick: false });\n mapRef.current.enableScrollWheelZoom(true);\n\n // 注册关键字查询事件\n const ac = new BMap.Autocomplete({\n input: suggestId,\n location: mapRef.current,\n });\n\n // 关键字查询结果下拉列表点击事件\n ac.addEventListener('onconfirm', (e: any) => {\n const { province, city, district, street, business } = e.item.value;\n setPlace(province + city + district + street + business);\n });\n\n // 地图点击事件\n mapRef.current.addEventListener('click', (e: any) => {\n // 清除地图覆盖物\n mapRef.current.clearOverlays();\n // 添加覆盖物\n addMark(new BMap.Point(e.point.lng, e.point.lat));\n setPropsOnChange({\n location: {\n lng: e.point.lng,\n lat: e.point.lat,\n },\n });\n });\n\n if (storageConversion.current) {\n storageConversion.current();\n }\n\n if (mapCenterLocRef.current) {\n // 使用记忆的中心点和坐标\n setMapCenterLocation(mapCenterLocRef.current.location, mapCenterLocRef.current.zoom);\n } else {\n // 默认中国北京市天安门坐标\n setMapCenterLocation([116.404, 39.915]);\n }\n };\n if (document.getElementById('lbs')) {\n loadMap();\n } else {\n window.onMapInit = function () {\n loadMap();\n };\n let url =\n 'https://api.map.baidu.com/api?v=3.0&ak=1IzhwXLOwlEnencZUoSnMkSkMVADfT3s&callback=onMapInit';\n let jsApi = document.createElement('script');\n jsApi.src = url;\n jsApi.id = 'lbs';\n document.head.appendChild(jsApi);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uid]);\n\n /**\n * @Description 暴露方法给父组件使用\n * @Author bihongbin\n * @Date 2020-12-04 10:02:19\n */\n useImperativeHandle<any, MapCallType>(ref, () => ({\n // 根据经纬度设置地图中心点 data=[longitude, latitude]\n setMapCenter: (data, zoom) => {\n console.log('转换为百度坐标前:', {\n lng: data[0],\n lat: data[1],\n });\n const func = () => {\n const point = new BMap.Point(data[0], data[1]);\n // 转换为百度坐标\n coordinateConversion({\n target: 'baidu',\n point,\n callback: (d) => {\n console.log('转换为百度坐标后:', {\n lng: d.lng,\n lat: d.lat,\n });\n setMapCenterLocation([d.lng, d.lat], zoom);\n },\n });\n };\n // 这里写try catch防止BMap没有初始完成,就访问了BMap报错问题,把操作放在loadMap里执行\n try {\n func();\n } catch (error) {\n console.log('error', error);\n storageConversion.current = func;\n }\n },\n }));\n\n return (\n <div className={`gaoDe-container ${props.className}`}>\n <div id={uid} style={props.style ? props.style : { width: '100%', height: 365 }} />\n <div className=\"input-item-prepend\">\n <span className=\"input-group-wrapper\">\n <span className=\"input-group-addon\">关键字</span>\n <span className=\"input-affix-wrapper\">\n <input id={suggestId} className=\"ant-input\" type=\"text\" placeholder=\"请输入关键字\" />\n </span>\n </span>\n </div>\n </div>\n );\n};\n\nexport default forwardRef(GaoDeMap);\n","import React, { useState, forwardRef, useImperativeHandle } from 'react';\nimport { Upload as UploadAntd, message } from 'antd';\nimport { UploadChangeParam, UploadProps } from 'antd/es/upload';\nimport { UploadFile } from 'antd/es/upload/interface';\nimport { AnyObjectType } from '../brother/typings';\nimport './index.less';\n\nexport interface UploadCallType {\n /** 设置文件列表 */\n setFileList: (data: UploadProps['fileList']) => void;\n}\n\nexport type PropsType = {\n /** 选择文件按钮 */\n children: JSX.Element;\n /** 设置上传的请求头部 */\n headers?: AnyObjectType;\n /** 上传成功回调 */\n uploadSuccess?: (data: UploadFile<any>[]) => void;\n} & UploadProps;\n\n/**\n * 上传文件组件\n */\nfunction Upload(props: PropsType, ref: any) {\n const [fileList, setFileList] = useState<UploadProps['fileList']>([]);\n\n // 移除 removeFile、handleChange、handlePreview 等函数上的 JSDoc 注释\n const removeFile = (file: UploadFile<any>) => {\n setFileList((prev) => {\n if (prev) {\n prev = prev.filter((item) => {\n return item.uid !== file.uid;\n });\n if (props.uploadSuccess) {\n props.uploadSuccess(\n prev.filter((item) => {\n return item.status === 'done';\n }),\n );\n }\n }\n return prev;\n });\n };\n\n const handleChange = (fileObject: UploadChangeParam) => {\n const { response } = fileObject.file;\n let code = response && parseInt(response.code);\n message.destroy();\n console.log('上传的文件对象:', fileObject);\n\n if (typeof response === 'string' || (typeof response === 'object' && response.status === 500)) {\n code = -1;\n }\n\n console.log('fileObject', fileObject);\n\n if (\n fileObject.file.status !== 'removed' &&\n (code === -1 || code === 400 || code === 404 || code === 500)\n ) {\n const errorMsg = response.msg || '上传失败';\n fileObject.file.status = 'error';\n fileObject.file.response = errorMsg;\n // 上传失败提示\n message.warning({\n content: <span dangerouslySetInnerHTML={{ __html: errorMsg }}></span>,\n duration: 1.5,\n });\n }\n\n if (fileObject.file.status === 'done') {\n message.success('上传成功', 1.5);\n }\n\n setFileList(fileObject.fileList);\n if (fileObject.file.status === 'done' && props.uploadSuccess) {\n props.uploadSuccess(\n fileObject.fileList.filter((item) => {\n return item.status === 'done';\n }),\n );\n }\n };\n\n // const handlePreview = async (file: AnyObjectType) => {\n // let src = file.url;\n // if (!src) {\n // src = await new Promise((resolve) => {\n // const reader = new FileReader();\n // reader.readAsDataURL(file.originFileObj);\n // reader.onload = () => resolve(reader.result);\n // });\n // }\n // const image = new Image();\n // image.src = src;\n // const imgWindow = window.open(src);\n // if (imgWindow) {\n // imgWindow.document.write(image.outerHTML);\n // }\n // };\n\n // 暴漏给父组件调用\n useImperativeHandle<any, UploadCallType>(ref, () => ({\n // 设置文件列表\n setFileList: (data) => {\n setFileList(data);\n },\n }));\n\n return (\n <UploadAntd\n onChange={handleChange}\n fileList={fileList}\n onRemove={removeFile}\n // onPreview={handlePreview}\n {...props}\n beforeUpload={(file, fileList) => {\n if (props.beforeUpload) {\n return props.beforeUpload(file, fileList) || UploadAntd.LIST_IGNORE;\n }\n return true;\n }}\n >\n {props.children}\n </UploadAntd>\n );\n}\n\nexport default forwardRef(Upload);\n","import React, { useEffect, useCallback, useImperativeHandle, forwardRef } from 'react';\nimport { Tree, Input, Row, Col, Empty, Spin, message } from 'antd';\nimport { TreeProps } from 'antd/es/tree';\nimport _ from 'lodash';\nimport hooks from '../brother/hooks';\nimport { AnyObjectType } from '../brother/typings';\nimport './index.less';\n\nconst { Search } = Input;\n\nexport interface TreeNodeCallType {\n setLoading: (data: boolean) => void;\n getSelectNode: () => string[];\n getSelectCurrent: () => TreeType[];\n getCheckedNode: () => string[];\n getCheckedCurrent: () => TreeType[];\n setSelectNode: (data: string[]) => void;\n setCheckedNode: (data: string[]) => void;\n}\n\nexport interface PropTypes {\n /** 树结构数据 */\n data?: TreeType[];\n /** 是否打开搜索功能 */\n searchOpen?: boolean;\n /** 是否打开拖拽节点功能 */\n draggableOpen?: boolean;\n /** 是否打开右侧额外操作按钮功能 */\n processOpen?: boolean;\n /** 自定义每项右侧操作按钮 */\n customAction?: (item: TreeType) => React.ReactNode;\n /** 是否打开复选框功能 */\n checkedOpen?: boolean;\n /** 选中节点触发回调 */\n onSelect?: (data: React.Key[], e: AnyObjectType) => void;\n /** 拖拽完成回调 */\n onDropCallBack?: (info: AnyObjectType, data: TreeType[]) => void;\n /** 验证是否可以拖拽 */\n onVerificationDropCallBack?: (info: AnyObjectType, data: TreeType[]) => boolean;\n /** 支持antd tree组件全部传参 */\n treeConfig?: TreeProps;\n}\n\nexport interface TreeType {\n id?: string;\n title: string | JSX.Element;\n key: string;\n disabled?: boolean; // 禁用\n processOpen?: boolean; // 控制单个数据是否打开右侧额外操作按钮功能(true关闭)\n noDrag?: boolean; // 某个节点是否可以拖拽(true不能拖拽)\n status?: 0 | 1 | 2; // 0-无效,1-有效,2-挂起\n children?: TreeType[];\n [key: string]: any;\n}\n\ninterface StateType {\n loading: boolean;\n searchOpen: boolean;\n searchValue: string;\n treeList: TreeType[];\n draggableOpen: boolean;\n processOpen: boolean;\n checkedOpen: boolean;\n firstLevelCollection: TreeType[];\n expandedKeys: string[];\n autoExpandParent: boolean;\n selectNode: string[];\n selectCurrent: TreeType[];\n checkedNode: string[];\n checkedCurrent: TreeType[];\n}\n\n/** 树组件 */\nconst TreeNode = (props: PropTypes, ref: any) => {\n const [state, setState] = hooks.useSetState<StateType>({\n loading: false, // 加载loading\n searchOpen: false, // 是否打开搜索功能(默认打开)\n searchValue: '', // 搜索值\n treeList: [], // 存放树结构数据\n draggableOpen: false, // 是否打开节点拖拽功能(默认打开)\n processOpen: false, // 是否打开挂起、启用、删除功能(默认打开)\n checkedOpen: false, // 是否打开复选框功能(默认不打开)\n firstLevelCollection: [], // 一级树结构(treeList拆分)\n expandedKeys: [], // 指定展开的节点(string[])\n autoExpandParent: false, // 是否自动展开父节点\n selectNode: [], // 点击选中的节点key(string[])\n selectCurrent: [], // 点击选中的节点数组\n checkedNode: [], // 复选框选中的节点key(string[])\n checkedCurrent: [], // 复选框选中的节点数组\n });\n\n /**\n * @Description 一级树结构(treeList拆分)\n * @Author bihongbin\n * @Date 2020-07-30 14:20:54\n */\n const generateList = useCallback(\n (data: TreeType[]): void => {\n const arr: TreeType[] = [];\n const eachData = (_data: TreeType[]) => {\n for (let i = 0; i < _data.length; i++) {\n const node = _data[i];\n arr.push(_data[i]);\n if (node.children) {\n eachData(node.children);\n }\n }\n };\n eachData(data);\n setState({\n firstLevelCollection: arr,\n });\n },\n [setState],\n );\n\n /**\n * @Description 拖拽触发时调用\n * @Author bihongbin\n * @Date 2020-07-30 15:17:58\n */\n const handleDrop = (info: AnyObjectType) => {\n const dropKey = info.node.key;\n const dragKey = info.dragNode.key;\n const dropPos = info.node.pos.split('-');\n const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);\n const loop = (data: any, key: string, callback: any) => {\n for (let i = 0; i < data.length; i++) {\n if (data[i].key === key) {\n return callback(data[i], i, data);\n }\n if (data[i].children) {\n loop(data[i].children, key, callback);\n }\n }\n };\n // 父级传入的拖拽验证\n if (\n props.onVerificationDropCallBack &&\n props.onVerificationDropCallBack(info, state.treeList)\n ) {\n return;\n }\n // 当节点noDrag=true,不允许修改\n if (info.dragNode.noDrag) {\n message.warning('此节点不支持修改', 1.5);\n return;\n }\n const data = [...state.treeList];\n // 找到拖拽对象\n let dragObj: TreeType = {\n title: '',\n key: '',\n };\n loop(data, dragKey, (item: TreeType, index: number, arr: TreeType[]) => {\n arr.splice(index, 1);\n dragObj = item;\n });\n if (!info.dropToGap) {\n // 放下内容\n loop(data, dropKey, (item: TreeType) => {\n item.children = item.children || [];\n // 示例添加到尾部,可以是随意位置\n item.children.push(dragObj);\n });\n } else if (\n (info.node.children || []).length > 0 && // 有子级\n info.node.expanded && // 扩大\n dropPosition === 1 // 在底部间隙\n ) {\n loop(data, dropKey, (item: TreeType) => {\n item.children = item.children || [];\n // 示例添加到头部,可以是随意位置\n item.children.unshift(dragObj);\n });\n } else {\n let ar: TreeType[] = [];\n let i = 0;\n loop(data, dropKey, (item: TreeType, index: number, arr: TreeType[]) => {\n ar = arr;\n i = index;\n });\n if (dropPosition === -1) {\n ar.splice(i, 0, dragObj);\n } else {\n ar.splice(i + 1, 0, dragObj);\n }\n }\n // 推拽完成以后回调\n if (props.onDropCallBack) {\n props.onDropCallBack(info, data);\n }\n setState({\n treeList: data,\n });\n };\n\n /**\n * @Description 选择树节点\n * @Author bihongbin\n * @Date 2020-07-30 13:47:29\n */\n const handleSelectTreeNode = useCallback(\n (selectedKeys: React.Key[], e: AnyObjectType): void => {\n if (_.isArray(selectedKeys)) {\n setState({\n selectNode: selectedKeys.map(String),\n });\n if (props.onSelect) {\n props.onSelect(selectedKeys.map(String), e);\n }\n }\n },\n [props, setState],\n );\n\n /**\n * @Description 展开树节点\n * @Author bihongbin\n * @Date 2020-07-30 13:49:01\n */\n const handleExpandTreeNode = useCallback(\n (expandedKeys: React.Key[]): void => {\n setState({\n autoExpandParent: false, // 设置树不展开\n expandedKeys: expandedKeys.map(String), // 设置树需要展开的节点\n });\n },\n [setState],\n );\n\n /**\n * @Description 获取父级节点key\n * @Author bihongbin\n * @Date 2020-07-30 11:49:20\n */\n const getParentKey = useCallback((key: string, tree: TreeType[]): string | undefined => {\n let parentKey;\n for (let i = 0; i < tree.length; i++) {\n const node = tree[i];\n if (node.children) {\n if (node.children.some((item: TreeType) => item.key === key)) {\n parentKey = node.key;\n } else if (getParentKey(key, node.children)) {\n parentKey = getParentKey(key, node.children);\n }\n }\n }\n return parentKey;\n }, []);\n\n /**\n * @Description 搜索树节点\n * @Author bihongbin\n * @Date 2020-07-30 10:29:25\n */\n const searchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = e.target;\n const _expandedKeys = state.firstLevelCollection\n .map((item: TreeType) => {\n let t = item.title as string;\n if (t.indexOf(value) > -1) {\n return getParentKey(item.key, state.treeList);\n }\n return null;\n })\n .filter((item, i, self) => item && self.indexOf(item) === i)\n .map(String);\n setState({\n searchValue: value, // 设置搜索的值\n expandedKeys: _expandedKeys.map(String), // 设置树需要展开的节点\n autoExpandParent: true, // 设置树自动展开\n });\n },\n [getParentKey, setState, state.firstLevelCollection, state.treeList],\n );\n\n /**\n * @Description 点击复选框触发\n * @Author bihongbin\n * @Date 2020-07-31 09:14:36\n */\n const handleCheckNode = useCallback(\n (checked: string[] | { checked: string[]; halfChecked: string[] }) => {\n let checkedArr: string[] = [];\n if (Array.isArray(checked)) {\n checkedArr = checked.map(String);\n } else if (checked && Array.isArray(checked.checked)) {\n checkedArr = checked.checked.map(String);\n }\n setState({\n checkedNode: checkedArr.map(String),\n });\n },\n [setState],\n );\n\n /**\n * @Description 渲染最终树结构\n * @Author bihongbin\n * @Date 2020-07-30 11:22:02\n */\n const loopTree = useCallback(\n (data: TreeType[]): TreeType[] => {\n return data.map((item) => {\n const t = item.title as string;\n const index = t.indexOf(state.searchValue);\n const beforeStr = t.substr(0, index); // 用来区分搜索结果的数据\n const afterStr = t.substr(index + state.searchValue.length); // 用来区分搜索结果的数据\n // 是否显示右侧操作按钮\n const isRightButton = props.processOpen && !item.processOpen && !item.disabled;\n // 右侧操作按钮\n const treeRightButton = isRightButton ? (\n <Col className=\"tree-handle-box\">{props.customAction && props.customAction(item)}</Col>\n ) : null;\n const title =\n index > -1 ? (\n <Row justify=\"space-between\" align=\"middle\">\n <Col>\n {beforeStr}\n <span className=\"text-error\">{state.searchValue}</span>\n {afterStr}\n </Col>\n {treeRightButton}\n </Row>\n ) : (\n <Row justify=\"space-between\" align=\"middle\">\n <Col>{item.title}</Col>\n {treeRightButton}\n </Row>\n );\n if (item.children) {\n return {\n ...item,\n title,\n children: loopTree(item.children),\n };\n }\n return {\n ...item,\n title,\n };\n });\n },\n [props, state.searchValue],\n );\n\n /**\n * @Description 复选框选中节点更新的时候(checkedNode),同步到复选框选中的数组(checkedCurrent)\n * @Author bihongbin\n * @Date 2020-10-19 18:53:49\n */\n useEffect(() => {\n const deep = (data: TreeType[]) => {\n let arr: TreeType[] = [];\n const getDeep = (data: TreeType[]) => {\n for (let item of data) {\n if (state.checkedNode.some((i) => i === item.key)) {\n arr.push(item);\n }\n if (item.children) {\n getDeep(item.children);\n }\n }\n };\n getDeep(data);\n return arr;\n };\n setState((prev) => ({\n ...prev,\n checkedCurrent: deep(state.treeList),\n expandedKeys: prev.expandedKeys ? prev.expandedKeys.map(String) : [],\n }));\n }, [setState, state.checkedNode, state.treeList]);\n\n /**\n * @Description 点击选中节点更新的时候(selectNode),同步到点击选中的数组(selectCurrent)\n * @Author bihongbin\n * @Date 2020-10-19 18:58:42\n */\n useEffect(() => {\n const deep = (data: TreeType[]) => {\n let arr: TreeType[] = [];\n const getDeep = (data: TreeType[]) => {\n for (let item of data) {\n if (state.selectNode.some((i) => i === item.key)) {\n arr.push(item);\n }\n if (item.children) {\n getDeep(item.children);\n }\n }\n };\n getDeep(data);\n return arr;\n };\n setState((prev) => ({\n ...prev,\n selectCurrent: deep(state.treeList),\n expandedKeys: prev.expandedKeys ? prev.expandedKeys.map(String) : [],\n }));\n }, [setState, state.selectNode, state.treeList]);\n\n /**\n * @Description 树结构数据赋值\n * @Author bihongbin\n * @Date 2020-07-31 15:57:46\n */\n useEffect(() => {\n if (_.isArray(props.data)) {\n // 设置树结构数据\n setState({\n treeList: props.data,\n });\n // 一级树结构(treeList拆分)\n generateList(props.data);\n }\n }, [generateList, props.data, setState]);\n\n /**\n * @Description 打开或关闭一些默认功能\n * @Author bihongbin\n * @Date 2020-07-31 15:57:57\n */\n useEffect(() => {\n let data: AnyObjectType = {};\n // 打开搜索功能\n if (props.searchOpen) {\n data.searchOpen = props.searchOpen;\n }\n // 打开拖拽功能\n if (props.draggableOpen) {\n data.draggableOpen = props.draggableOpen;\n }\n // 打开右侧额外操作按钮功能功能\n if (props.processOpen) {\n data.processOpen = props.processOpen;\n }\n // 打开复选框功能\n if (props.checkedOpen) {\n data.checkedOpen = props.checkedOpen;\n }\n if (Object.keys(data).length) {\n if (data.expandedKeys) data.expandedKeys = data.expandedKeys.map(String);\n setState(data);\n }\n }, [props.checkedOpen, props.draggableOpen, props.processOpen, props.searchOpen, setState]);\n\n /**\n * @Description 暴漏组件方法给父级\n * @Author bihongbin\n * @Date 2020-08-04 15:35:55\n */\n useImperativeHandle<any, TreeNodeCallType>(ref, () => ({\n // 设置loading\n setLoading: (data) => {\n setState({\n loading: data,\n });\n },\n // 获取当前点击选中的节点key\n getSelectNode: () => state.selectNode,\n // 获取当前点击选中的节点数组\n getSelectCurrent: () => state.selectCurrent,\n // 获取复选框选中的节点key\n getCheckedNode: () => state.checkedNode,\n // 获取复选框选中的节点数组\n getCheckedCurrent: () => state.checkedCurrent,\n // 设置当前点击选中的节点\n setSelectNode: (data) => {\n setState({\n selectNode: data,\n });\n },\n // 设置复选框选中的节点\n setCheckedNode: (data) => {\n setState({\n checkedNode: data,\n });\n },\n }));\n\n return (\n <div className=\"tree-wrap\">\n <Spin spinning={state.loading}>\n {state.searchOpen ? (\n <Search className=\"tree-search\" placeholder=\"输入名称搜索\" onChange={searchChange} />\n ) : null}\n {state.treeList.length ? (\n <Tree\n blockNode\n height={500}\n showLine={{ showLeafIcon: false }}\n checkable={state.checkedOpen}\n treeData={loopTree(state.treeList)}\n expandedKeys={state.expandedKeys.map(String)}\n selectedKeys={state.selectNode.map(String)}\n checkedKeys={state.checkedNode.map(String)}\n autoExpandParent={state.autoExpandParent}\n onSelect={(keys, e) => handleSelectTreeNode(keys.map(String), e)}\n onExpand={(keys) => handleExpandTreeNode(keys.map(String))}\n onCheck={(checked) => handleCheckNode(Array.isArray(checked) ? checked.map(String) : { checked: checked.checked.map(String), halfChecked: checked.halfChecked.map(String) })}\n draggable={state.draggableOpen}\n onDrop={handleDrop}\n onDragEnter={(info) => {\n setState({\n expandedKeys: info.expandedKeys.map(String),\n });\n }}\n {...props.treeConfig}\n />\n ) : (\n <Empty />\n )}\n </Spin>\n </div>\n );\n};\n\nexport default forwardRef(TreeNode);\n","import React, {\n useImperativeHandle,\n forwardRef,\n useMemo,\n useRef,\n useEffect,\n useCallback,\n} from 'react';\nimport {\n Row,\n Col,\n Empty,\n message,\n Form,\n Input,\n InputNumber,\n Select,\n Cascader,\n DatePicker,\n TimePicker,\n Switch,\n Spin,\n Radio,\n Checkbox,\n TreeSelect,\n Rate,\n RadioChangeEvent,\n InputNumberProps,\n AutoCompleteProps,\n AutoComplete,\n InputProps,\n Tooltip,\n} from 'antd';\nimport dayjs from 'dayjs';\nimport _ from 'lodash';\nimport { RowProps } from 'antd/es/row';\nimport { ColProps } from 'antd/es/col';\nimport { FormProps, Rule, FormItemProps, FormInstance } from 'antd/es/form';\nimport type { RangePickerProps, DatePickerProps } from 'antd/es/date-picker';\nimport type { PickerProps } from 'antd/es/date-picker/generatePicker';\nimport { TimePickerProps } from 'antd/es/time-picker';\nimport { RateProps } from 'antd/es/rate';\nimport { TreeSelectProps } from 'antd/es/tree-select';\nimport { TimeRangePickerProps } from 'antd/es/time-picker';\nimport { SelectProps } from 'antd/es/select';\nimport { v4 as uuidV4 } from 'uuid';\nimport { typeofEqual } from '../brother/utils';\nimport hooks from '../brother/hooks';\nimport ConfigProvider from '../brother/ConfigProvider';\nimport { AnyObjectType, SelectType } from '../brother/typings';\nimport './index.less';\n\nexport type NamePath = any;\nexport type DataNode = any;\nexport type DefaultValueType = any;\ntype CheckboxValueType = any;\n\nexport interface DefaultOptionType {\n value?: string | number;\n label?: React.ReactNode;\n disabled?: boolean;\n isLeaf?: boolean;\n loading?: boolean;\n children?: Array<DefaultOptionType>;\n [key: string]: any;\n}\n\ntype remoteValueType = string | undefined;\ntype remotePromiseType = (value: remoteValueType, other?: any) => Promise<SelectType[]>;\ntype inputConfig = Omit<InputProps, 'inputMode'> & {\n inputMode?: InputProps['type'];\n};\n\ninterface UnionType {\n componentName: 'Input' | 'Select' | 'DatePicker' | 'TimePicker' | 'RemoteSearch';\n name: FormListType['name']; // 字段名\n placeholder?: FormListType['placeholder'];\n selectData?: FormListType['selectData'];\n inputConfig?: FormListType['inputConfig'];\n remoteConfig?: FormListType['remoteConfig'];\n datePickerConfig?: FormListType['datePickerConfig'];\n rangePickerConfig?: FormListType['rangePickerConfig'];\n timeRangePickerConfig?: FormListType['timeRangePickerConfig'];\n timePickerConfig?: FormListType['timePickerConfig'];\n rules?: FormListType['rules']; // 表单验证\n}\n\n// 表单参数配置\nexport type FormListType = {\n colProps?: ColProps; // 用来控制单个表单元素宽度\n visible?: boolean; // 用来控制显示隐藏\n // 组件显示类型\n componentName:\n | 'Input'\n | 'InputNumber'\n | 'HideInput'\n | 'TextArea'\n | 'AutoComplete'\n | 'InputAutoComplete'\n | 'Select'\n | 'Multiple'\n | 'MultipleTag'\n | 'RemoteSearch'\n | 'DatePicker'\n | 'RangePicker'\n | 'TimeRangePicker'\n | 'TimePicker'\n | 'Switch'\n | 'Radio'\n | 'Checkbox'\n | 'TreeSelect'\n | 'Union'\n | 'RegionSelection'\n | 'Rate'\n | 'Null';\n name?: string; // 字段名\n label?: string | React.ReactNode; // 标题\n dependencies?: (string | number)[]; // 依赖字段\n placeholder?: string;\n rangePickerPlaceholder?: [string, string]; // 开始时间和结束时间提示文字\n timeRangePickerPlaceholder?: [string, string]; // 开始时间和结束时间提示文字\n disabled?: boolean; // 是否禁用\n maxLength?: number; // 可输入长度\n valuePropName?: string; // 子节点的值的属性,如 Switch 的是 'checked'\n inputConfig?: inputConfig;\n inputNumberConfig?: InputNumberProps & { alignRight?: boolean };\n datePickerConfig?: DatePickerProps; // datePicker 可选类型\n rangePickerConfig?: RangePickerProps; // RangePicker 可选类型\n timeRangePickerConfig?: TimeRangePickerProps; // TimeRangePicker 可选类型\n timePickerConfig?: TimePickerProps; // timePicker 可选类型\n inputAutoCompleteConfig?: AutoCompleteProps;\n unionConfig?: {\n // 要显示n个表单的类型\n unionItems: UnionType[];\n divide?: string; // 分隔符\n };\n selectConfig?: SelectProps<string>;\n selectIsHideAll?: boolean; // 下拉菜单是否显示“全部”选项 true-隐藏下拉菜单全部选项\n selectData?: SelectType[]; // 下拉菜单数据\n remoteConfig?: {\n initLoad?: false; // 是否默认加载 false(不加载)\n reLoad?: boolean; // 更新表单值后,RemoteSearch类型表单是否重新查询\n remoteApi: remotePromiseType; // 远程搜索的api\n remoteMode?: 'multiple' | 'tags'; // 远程搜索模式为多选或标签\n allowClear?: boolean; // 是否可清除内容\n showSearch?: boolean; // 使单选模式可搜索\n };\n // 级联选择\n regionSelectionConfig?: {\n loadData: DefaultOptionType[]; // 级联数据\n selectLoad?: (parentId: string) => Promise<DefaultOptionType[]>;\n };\n // 评分\n rateConfig?: RateProps;\n // 树选择\n treeSelectConfig?: {\n data?: {\n title: string;\n value: string;\n children?: string;\n api: (value?: string) => Promise<AnyObjectType[]>;\n onChange?: (value: DataNode[], formItem: FormListType) => FormListType | void;\n };\n extra?: TreeSelectProps<DefaultValueType>;\n };\n rows?: number; // TextArea高度\n rules?: Rule[]; // 表单验证\n inputAutoCompleteChange?: AutoCompleteProps['onChange'];\n inputChange?: (e: React.ChangeEvent<HTMLInputElement>, other?: any) => void;\n inputNumberChange?: InputNumberProps['onChange'];\n inputEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n textAreaChange?: (e: React.ChangeEvent<HTMLTextAreaElement>, other?: any) => void;\n autoCompleteChange?: (e: string, other?: any) => void;\n selectChange?: (e: string, other?: any) => void;\n multipleChange?: (e: string, other?: any) => void;\n remoteSearchChange?: (e: string, other?: any) => void;\n datePickerChange?: PickerProps<any>['onChange'];\n rangePickerChange?: RangePickerProps['onChange'];\n timeRangePickerChange?: RangePickerProps['onChange'];\n timePickerChange?: PickerProps<any>['onChange'];\n switchChange?: (e: boolean, other?: any) => void;\n radioChange?: (e: RadioChangeEvent, other?: any) => void;\n checkboxChange?: (e: CheckboxValueType[], other?: any) => void;\n cascaderChange?: (e: any, other?: any) => void;\n rateChange?: (e: number, other?: any) => void;\n render?: () => React.ReactElement; // 动态渲染插入额外元素\n} & FormItemProps;\n\n// 导出该组件可调用的方法类型\nexport interface FormCallType {\n getFormValues: (data: string[]) => AnyObjectType;\n setFormFields: FormInstance['setFields'];\n setFormValues: (values: AnyObjectType) => void;\n formSubmit: (nameList?: NamePath[]) => Promise<AnyObjectType>;\n formReset: (fields?: string[]) => void;\n}\n\n// 组件传参配置props\nexport interface GenerateFormPropType {\n /** 组件类名 */\n className?: string;\n /** 渲染的表单元素 */\n list?: FormListType[];\n /** 支持antd Form组件官方传参所有类型 */\n formConfig?: FormProps;\n /** 支持antd Row组件官方传参所有类型 */\n rowGridConfig?: RowProps;\n /** 支持antd Col组件官方传参所有类型 */\n colGirdConfig?: ColProps;\n /** 动态渲染操作按钮或其他元素 */\n render?: () => React.ReactElement;\n}\n\nconst { Option } = Select;\nconst { RangePicker } = DatePicker;\nconst { RangePicker: TimeRangePicker } = TimePicker;\n\ninterface StateType {\n update: boolean;\n remoteFetching: boolean;\n remoteData: {\n [key: string]: SelectType[];\n };\n treeSelectData: {\n [key: string]: DataNode[];\n };\n treeSelectFlattenData: {\n [key: string]: DataNode[];\n };\n selectMultiple: {\n [key: string]: any;\n };\n}\n\n/** 动态表单 */\nfunction GenerateForm(props: GenerateFormPropType, ref: any) {\n const [form] = Form.useForm();\n let { className, formConfig, rowGridConfig, colGirdConfig, render } = props;\n const remoteRef = useRef<StateType['remoteData']>({});\n const debounceMapRef = useRef<{ [key: string]: (value: string) => void }>({});\n const treeSelectRef = useRef<StateType['treeSelectData']>({});\n const [state, setState] = hooks.useSetState<StateType>({\n update: false, // 取反值强制渲染dom\n remoteFetching: false, // 远程搜索loading\n remoteData: {}, // 远程搜索数据结果\n treeSelectData: {}, // 树选择数据\n treeSelectFlattenData: {}, // 树选择打平后数据\n selectMultiple: {}, // 多选下拉菜单存值\n });\n\n /**\n * @Description 渲染的表单元素\n * @Author bihongbin\n * @Date 2021-03-16 09:35:24\n */\n let list = useMemo(() => (props.list ? [...props.list] : []), [props.list]);\n\n /**\n * @Description 缓存生成的随机id\n * @Author bihongbin\n * @Date 2020-08-29 15:36:38\n */\n const uid = useMemo(() => uuidV4(), []);\n\n /**\n * @Description 下拉菜单远程数据查询\n * @Author bihongbin\n * @Date 2020-07-25 10:01:02\n */\n const fetchRemote = useCallback(\n (value: remoteValueType, item: FormListType) => {\n const config = item.remoteConfig;\n const names = item.name as string;\n let current = remoteRef.current[names];\n if (config && config.remoteApi) {\n setState((prev) => {\n prev.remoteFetching = true;\n remoteRef.current[names] = [];\n prev.remoteData[names] = [];\n return prev;\n });\n config\n .remoteApi(value)\n .then((res) => {\n const deb = () => {\n if (current === undefined) {\n remoteRef.current[names] = [];\n }\n if (names) {\n setState((prev) => {\n prev.remoteFetching = false;\n remoteRef.current[names] = res;\n prev.remoteData[names] = res;\n\n console.log('remoteRef.curren', remoteRef.current);\n console.log('prev.remoteData', prev.remoteData);\n return prev;\n });\n }\n };\n setTimeout(deb, 100);\n })\n .catch(() => {\n setState((prev) => {\n prev.remoteFetching = false;\n remoteRef.current[names] = [];\n prev.remoteData[names] = [];\n return prev;\n });\n });\n }\n },\n [setState],\n );\n\n /**\n * @Description 树选择查询\n * @Author bihongbin\n * @Date 2021-04-17 10:03:36\n * @param {*} useCallback\n */\n const fetchTreeSelect = useCallback(\n (item: FormListType, value?: string) => {\n const config = item.treeSelectConfig;\n if (config && config.data) {\n config.data.api(value).then((res) => {\n const names = item.name;\n if (names) {\n treeSelectRef.current[names] = [];\n let transformTreeSelect: DataNode[] = [];\n let flattenTreeSelect: DataNode[] = [];\n // 递归\n const deep = (original: AnyObjectType[], rear: DataNode[]) => {\n for (let [i, e] of original.entries()) {\n const children = config.data?.children || 'children';\n rear[i] = {};\n rear[i].title = e[config.data?.title as string];\n rear[i].value = e[config.data?.value as string];\n rear[i].key = rear[i].value;\n flattenTreeSelect.push(e); // 添加打平数据\n if (Array.isArray(e[children])) {\n rear[i].children = [];\n deep(e[children], rear[i].children as DataNode[]);\n }\n }\n };\n deep(res, transformTreeSelect);\n setState((prev) => {\n prev.treeSelectData[names] = transformTreeSelect;\n prev.treeSelectFlattenData[names] = flattenTreeSelect;\n return prev;\n });\n }\n });\n }\n },\n [setState],\n );\n\n /**\n * @Description 级联选择数据查询\n * @Author bihongbin\n * @Date 2021-01-27 15:00:34\n */\n const regionLoadData = useCallback(\n async (item: FormListType, selectedOptions: DefaultOptionType[] | undefined) => {\n if (selectedOptions) {\n const targetOption = selectedOptions[selectedOptions.length - 1];\n let result: DefaultOptionType[] = [];\n if (item.regionSelectionConfig?.selectLoad) {\n targetOption.loading = true;\n result = await item.regionSelectionConfig?.selectLoad(targetOption.id);\n } else {\n return;\n }\n targetOption.loading = false;\n if (result.length) {\n targetOption.children = result;\n } else {\n targetOption.isLeaf = true;\n }\n setState({\n update: !state.update, // 强制更新\n });\n }\n },\n [setState, state.update],\n );\n\n /**\n * @Description 渲染组件\n * @Author bihongbin\n * @Date 2020-07-06 10:12:51\n */\n const formRender = useCallback(() => {\n // 多选下拉菜单是否全选(稳定引用)\n const setMultipleCheckbox = (item: FormListType, bool: boolean) => {\n setState((prev) => {\n if (item.name) {\n prev.selectMultiple[item.name] = bool;\n }\n return prev;\n });\n };\n\n // 多选下拉菜单自定义渲染(稳定引用)\n const multipleSelectRender = (allSelect: any, item: FormListType) => {\n const selectData = item.selectData || [];\n return (\n <div className=\"multiple-checkbox\">\n <Checkbox\n checked={item.name ? state.selectMultiple[item.name] : undefined}\n onChange={(e) => {\n const editObj: any = {};\n if (e.target.checked) {\n if (item.name) {\n editObj[item.name] = selectData.map((v) => v.value);\n }\n } else {\n if (item.name) {\n editObj[item.name] = [];\n }\n }\n setMultipleCheckbox(item, e.target.checked);\n form.setFieldsValue(editObj);\n item.multipleChange && item.multipleChange(editObj[item.name || '']);\n }}\n >\n 全选\n </Checkbox>\n {allSelect}\n </div>\n );\n };\n if (!list) {\n return;\n }\n // Input\n const inputRender = (item: FormListType) => {\n const { inputMode, ...arg } = item.inputConfig || {};\n\n return (\n <Input\n disabled={item.disabled}\n type={inputMode || 'text'}\n maxLength={item.maxLength}\n placeholder={item.placeholder || `请输入${item.label}`}\n onChange={item.inputChange}\n onPressEnter={item.inputEnter}\n {...arg}\n />\n );\n };\n // InputNumber\n const InputNumberRender = (item: FormListType) => {\n const { alignRight, ...otherConfig } = item.inputNumberConfig || {};\n return (\n <InputNumber\n disabled={item.disabled}\n style={{ width: '100%' }}\n placeholder={item.placeholder || `请输入${item.label}`}\n onChange={item.inputNumberChange}\n className={alignRight ? 'hlyc-web-com-align-right' : ''}\n {...otherConfig}\n />\n );\n };\n // HideInput\n const hideInputRender = (item: FormListType) => {\n return (\n <Input\n style={{ display: 'none' }}\n maxLength={item.maxLength}\n disabled={item.disabled}\n type=\"text\"\n placeholder={item.placeholder || `请输入${item.label}`}\n onChange={item.inputChange}\n onPressEnter={item.inputEnter}\n />\n );\n };\n // TextArea\n const textAreaRender = (item: FormListType) => {\n return (\n <Input.TextArea\n rows={item.rows}\n disabled={item.disabled}\n maxLength={item.maxLength}\n placeholder={item.placeholder || `请输入${item.label}`}\n onChange={item.textAreaChange}\n />\n );\n };\n // InputAutoComplete\n const inputAutoCompleteRender = (item: FormListType) => {\n return (\n <AutoComplete\n filterOption={(inputValue, option) =>\n ((option!.value || '') as string).toUpperCase().includes(inputValue.toUpperCase())\n }\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={item.inputAutoCompleteChange}\n {...item.inputAutoCompleteConfig}\n />\n );\n };\n // AutoComplete\n const autoCompleteRender = (item: FormListType) => {\n return (\n <Select\n allowClear\n showSearch\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n optionFilterProp=\"children\"\n filterOption={(inputValue, option) =>\n option\n ? ((option.children ?? '') as string).toLowerCase().includes(inputValue.toLowerCase())\n : false\n }\n onChange={item.autoCompleteChange}\n {...item.selectConfig}\n >\n {item.selectData\n ? item.selectData.map((s, k) => (\n <Option value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Option>\n ))\n : null}\n </Select>\n );\n };\n // Select\n const selectRender = (item: FormListType) => {\n return (\n <Select\n allowClear\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={item.selectChange}\n {...item.selectConfig}\n >\n {item.selectData\n ? item.selectData.map((s, k) => (\n <Option value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Option>\n ))\n : null}\n </Select>\n );\n };\n // Multiple\n const multipleRender = (item: FormListType) => {\n const selectData = item.selectData || [];\n return (\n <Select\n mode=\"multiple\"\n allowClear\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={(e) => {\n setMultipleCheckbox(item, e.length === selectData.length);\n if (item.multipleChange) {\n item.multipleChange(e);\n }\n }}\n filterOption={(inputValue, option) =>\n option\n ? ((option.children ?? '') as string).toLowerCase().includes(inputValue.toLowerCase())\n : false\n }\n popupRender={(allSelect) => multipleSelectRender(allSelect, item)}\n maxTagPlaceholder={(omittedValues) => {\n const labels = omittedValues?.map((i) => i.label)?.join('、') || '';\n return (\n <Tooltip title={labels} placement=\"top\">\n +{omittedValues?.length}\n </Tooltip>\n );\n }}\n {...item.selectConfig}\n >\n {selectData.map((s, k) => (\n <Option value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Option>\n ))}\n </Select>\n );\n };\n // MultipleTag\n const multipleTagRender = (item: FormListType) => {\n return (\n <Select\n mode=\"tags\"\n allowClear\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={item.multipleChange}\n {...item.selectConfig}\n >\n {item.selectData\n ? item.selectData.map((s, k) => (\n <Option value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Option>\n ))\n : null}\n </Select>\n );\n };\n // RemoteSearch\n const remoteSearchRender = (item: FormListType) => {\n const remoteConfig = item.remoteConfig;\n const isMode = remoteConfig && remoteConfig.remoteMode;\n const allowClear = remoteConfig && remoteConfig.allowClear;\n const showSearch = remoteConfig && remoteConfig.showSearch;\n const nameKey = (item.name as string) || '';\n if (showSearch !== false && nameKey) {\n if (!debounceMapRef.current[nameKey]) {\n debounceMapRef.current[nameKey] = _.debounce(\n (value: string) => fetchRemote(value, item),\n 300,\n );\n }\n }\n return (\n <Select\n mode={isMode || undefined}\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n notFoundContent={\n state.remoteFetching ? (\n <Spin size=\"small\" />\n ) : (\n <Empty\n style={{ marginTop: 8, marginBottom: 8 }}\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n )\n }\n filterOption={false}\n allowClear={allowClear === false ? false : true}\n showSearch={showSearch === false ? false : true}\n // 当获取焦点查询全部\n onFocus={() => fetchRemote(undefined, item)}\n onSearch={showSearch === false ? undefined : debounceMapRef.current[nameKey]}\n onChange={item.remoteSearchChange}\n {...item.selectConfig}\n >\n {item.name && state.remoteData[item.name]\n ? state.remoteData[item.name].map((s: SelectType, k) => (\n <Option value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Option>\n ))\n : null}\n </Select>\n );\n };\n // DatePicker\n const datePickerRender = (item: FormListType) => {\n return (\n <DatePicker\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={item.datePickerChange}\n {...item.datePickerConfig}\n />\n );\n };\n // RangePicker\n const rangePickerRender = (item: FormListType) => {\n return (\n <RangePicker\n disabled={item.disabled}\n placeholder={item.rangePickerPlaceholder}\n onChange={item.rangePickerChange}\n {...item.rangePickerConfig}\n />\n );\n };\n // TimeRangePicker\n const TimeRangePickerRender = (item: FormListType) => {\n return (\n <TimeRangePicker\n disabled={item.disabled}\n placeholder={item.timeRangePickerPlaceholder}\n onChange={item.timeRangePickerChange}\n {...item.timeRangePickerConfig}\n />\n );\n };\n // TimePicker\n const timePickerRender = (item: FormListType) => {\n return (\n <TimePicker\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={item.timePickerChange}\n {...item.timePickerConfig}\n />\n );\n };\n // Switch\n const switchRender = (item: FormListType) => {\n return (\n <Switch\n defaultChecked={false}\n checkedChildren=\"ON\"\n unCheckedChildren=\"OFF\"\n disabled={item.disabled}\n onChange={item.switchChange}\n />\n );\n };\n // Radio\n const radioRender = (item: FormListType) => {\n return (\n <Radio.Group onChange={item.radioChange}>\n {item.selectData\n ? item.selectData.map((s: SelectType, k) => (\n <Radio disabled={item.disabled} value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Radio>\n ))\n : null}\n </Radio.Group>\n );\n };\n // Checkbox\n const checkboxRender = (item: FormListType) => {\n return (\n <Checkbox.Group onChange={item.checkboxChange}>\n {item.selectData\n ? item.selectData.map((s: SelectType, k) => (\n <Checkbox disabled={item.disabled} value={s.value} key={`${s.value}-${k}`}>\n {s.label}\n </Checkbox>\n ))\n : null}\n </Checkbox.Group>\n );\n };\n // TreeSelect\n const treeSelectRender = (item: FormListType, index: number) => {\n const names = item.name as string;\n return (\n <TreeSelect\n disabled={item.disabled}\n style={{ width: '100%' }}\n styles={{ root: { maxHeight: 400, overflow: 'auto' } }}\n treeData={state.treeSelectData[names]}\n placeholder={item.placeholder || `请选择${item.label}`}\n onChange={(value) => {\n if (item.treeSelectConfig && item.treeSelectConfig.data) {\n const configData = item.treeSelectConfig.data;\n const onChange = configData.onChange;\n const flatten = state.treeSelectFlattenData[names];\n const type = Object.prototype.toString.call(value);\n let changeChild: any[] = [];\n let newItem = { ...item };\n if (type === '[object String]') {\n changeChild = flatten.filter((t) => t[configData.value] === value);\n }\n if (type === '[object Array]' && Array.isArray(value)) {\n for (let i = flatten.length; i--; ) {\n if (value.some((t) => t === flatten[i][configData.value])) {\n changeChild.push(flatten[i]);\n }\n }\n }\n if (onChange) {\n const changeVal = onChange(changeChild, { ...item }) as FormListType;\n if (changeVal) {\n newItem = changeVal;\n }\n if (newItem) {\n list[index] = newItem;\n }\n }\n form.setFieldsValue({\n [newItem.name as string]: value, // 设置对应字段值\n });\n fetchTreeSelect(newItem); // 查询树选择数据\n }\n }}\n allowClear\n treeDefaultExpandAll\n {...item.treeSelectConfig?.extra}\n />\n );\n };\n // RegionSelection\n const regionSelectionRender = (item: FormListType) => {\n const propsRegionConfig = item.regionSelectionConfig;\n return (\n <Cascader\n disabled={item.disabled}\n placeholder={item.placeholder || `请选择${item.label}`}\n options={(propsRegionConfig && propsRegionConfig.loadData) || []}\n loadData={(selectedOptions) => regionLoadData(item, selectedOptions)}\n changeOnSelect\n onChange={item.cascaderChange}\n />\n );\n };\n // Rate\n const rateRender = (item: FormListType) => {\n return <Rate disabled={item.disabled} onChange={item.rateChange} {...item.rateConfig} />;\n };\n // 渲染Union类型表单\n const unionRender = (m: UnionType) => {\n if (m.componentName === 'Input') {\n return inputRender(m);\n }\n if (m.componentName === 'Select') {\n return selectRender(m);\n }\n if (m.componentName === 'DatePicker') {\n return datePickerRender(m);\n }\n if (m.componentName === 'TimePicker') {\n return timePickerRender(m);\n }\n if (m.componentName === 'RemoteSearch') {\n return remoteSearchRender(m);\n }\n return null;\n };\n // 类型是Union,有rule,添加必选项*号\n const unionRuleStyle = (i: Partial<FormListType>) => {\n let node = i.label;\n if (i.componentName === 'Union' && i.rules) {\n node = (\n <span>\n <i\n style={{\n marginRight: 4,\n color: '#ff4d4f',\n fontStyle: 'normal',\n fontFamily: 'SimSun, sans-serif',\n }}\n >\n *\n </i>\n {i.label}\n </span>\n );\n }\n return node;\n };\n return list.map((item: FormListType, index: number) => {\n let childForm: React.ReactNode = null;\n\n // 移除下拉菜单“全部”选项\n if (item.selectData && item.selectIsHideAll) {\n item.selectData = item.selectData.filter((e) => {\n return item.selectIsHideAll ? e.label !== '全部' && e.value !== '' : true;\n });\n }\n\n switch (item.componentName) {\n case 'Input':\n childForm = inputRender(item);\n break;\n case 'InputNumber':\n childForm = InputNumberRender(item);\n break;\n case 'HideInput':\n childForm = hideInputRender(item);\n break;\n case 'TextArea':\n childForm = textAreaRender(item);\n break;\n case 'AutoComplete':\n childForm = autoCompleteRender(item);\n break;\n case 'InputAutoComplete':\n childForm = inputAutoCompleteRender(item);\n break;\n case 'Select':\n childForm = selectRender(item);\n break;\n case 'Multiple':\n childForm = multipleRender(item);\n break;\n case 'MultipleTag':\n childForm = multipleTagRender(item);\n break;\n case 'RemoteSearch':\n childForm = remoteSearchRender(item);\n break;\n case 'DatePicker':\n childForm = datePickerRender(item);\n break;\n case 'RangePicker':\n childForm = rangePickerRender(item);\n break;\n case 'TimeRangePicker':\n childForm = TimeRangePickerRender(item);\n break;\n case 'TimePicker':\n childForm = timePickerRender(item);\n break;\n case 'Switch':\n childForm = switchRender(item);\n break;\n case 'Radio':\n childForm = radioRender(item);\n break;\n case 'Checkbox':\n childForm = checkboxRender(item);\n break;\n case 'TreeSelect':\n childForm = treeSelectRender(item, index);\n break;\n case 'Union':\n let width: string;\n let len = 0;\n if (item.unionConfig) {\n len = item.unionConfig.unionItems.length;\n width = `${100 / len}%`;\n }\n childForm = (\n <Row className=\"form-item-divide\" gutter={16}>\n {item.unionConfig?.unionItems.map((m, k) => (\n <Col\n style={{\n width: width,\n }}\n key={k}\n >\n <Form.Item name={m.name} rules={m.rules} noStyle>\n {unionRender(m)}\n </Form.Item>\n {k < len - 1 ? (\n <span className=\"divide\">\n {item.unionConfig &&\n (item.unionConfig.divide ? item.unionConfig.divide : '~')}\n </span>\n ) : null}\n </Col>\n ))}\n </Row>\n );\n break;\n case 'RegionSelection': // 级联选择(可实现地区选择)\n childForm = regionSelectionRender(item);\n break;\n case 'Rate':\n childForm = rateRender(item);\n break;\n default:\n return null;\n }\n let resetItem: Partial<FormListType> = {\n ...item,\n };\n // 类型是Union,有rule,添加必选项*号\n resetItem.label = unionRuleStyle(resetItem);\n // 移除Form.Item不需要的属性\n resetItem = _.omit(resetItem, [\n 'colProps',\n 'componentName',\n 'selectData',\n 'inputConfig',\n 'inputNumberConfig',\n 'datePickerConfig',\n 'rangePickerConfig',\n 'timeRangePickerConfig',\n 'timePickerConfig',\n 'inputAutoCompleteConfig',\n 'unionConfig',\n 'remoteConfig',\n 'selectConfig',\n 'regionSelectionConfig',\n 'treeSelectConfig',\n 'rows',\n 'render',\n 'rangePickerPlaceholder',\n 'timeRangePickerPlaceholder',\n 'visible',\n 'selectIsHideAll',\n 'rateConfig',\n 'inputChange',\n 'inputNumberChange',\n 'inputAutoCompleteChange',\n 'inputEnter',\n 'textAreaChange',\n 'autoCompleteChange',\n 'selectChange',\n 'multipleChange',\n 'remoteSearchChange',\n 'datePickerChange',\n 'rangePickerChange',\n 'timeRangePickerChange',\n 'timePickerChange',\n 'switchChange',\n 'radioChange',\n 'checkboxChange',\n 'cascaderChange',\n 'rateChange',\n ]);\n // Form.Item内有多个表单(Union类型),如果有设置name移除name\n if (item.componentName === 'Union') {\n resetItem = _.omit(resetItem, ['name']);\n }\n // 为防止colProps和colGirdConfig重叠,优先显示colProps\n let grid: any = undefined;\n if (item.colProps) {\n grid = item.colProps;\n } else {\n grid = colGirdConfig;\n }\n return (\n <Col {...grid} key={index} style={{ display: item.visible === false ? 'none' : 'block' }}>\n <Form.Item\n className={item.componentName === 'HideInput' ? 'hide-item' : undefined}\n {...resetItem}\n >\n {childForm}\n </Form.Item>\n {item.render && item.render()}\n </Col>\n );\n });\n }, [\n list,\n state.selectMultiple,\n state.remoteFetching,\n state.remoteData,\n state.treeSelectData,\n state.treeSelectFlattenData,\n colGirdConfig,\n setState,\n fetchRemote,\n fetchTreeSelect,\n form,\n regionLoadData,\n ]);\n\n // 缓存渲染列表,减少重复计算\n const renderedList = useMemo(() => formRender(), [formRender]);\n\n /**\n * @Description 设置全局表单默认查询\n * @Author bihongbin\n * @Date 2020-10-14 14:25:54\n */\n useEffect(() => {\n if (list) {\n let obj: AnyObjectType = {};\n for (let item of list) {\n // 远程搜索默认查询\n if (item.componentName === 'RemoteSearch') {\n if (item.name && !remoteRef.current[item.name]) {\n if (item.remoteConfig && item.remoteConfig.initLoad !== false) {\n fetchRemote(undefined, item);\n }\n }\n }\n // 设置树数据\n if (item.componentName === 'TreeSelect') {\n if (item.name && !treeSelectRef.current[item.name]) {\n if (item.treeSelectConfig && item.treeSelectConfig.data) {\n fetchTreeSelect(item); // 查询树选择数据\n }\n }\n }\n }\n form.setFieldsValue(obj);\n }\n }, [fetchRemote, fetchTreeSelect, form, list]);\n\n // 暴漏给父组件调用\n useImperativeHandle<any, FormCallType>(ref, () => ({\n // 获取对应的字段值\n getFormValues: (data) => {\n return form.getFieldsValue(data);\n },\n // 设置一组字段状态\n setFormFields: (fields) => {\n form.setFields(fields);\n },\n // 设置表单值\n setFormValues: (values) => {\n form.setFieldsValue(values);\n setTimeout(() => {\n // 设置表单值后,远程搜索数据需要重新查一遍\n list.forEach((item) => {\n if (item.componentName === 'RemoteSearch') {\n if (item.remoteConfig && item.remoteConfig.reLoad) {\n fetchRemote(undefined, item);\n }\n }\n });\n }, 100);\n },\n // 提交表单\n formSubmit: (nameList) => {\n return new Promise((resolve, reject) => {\n form\n .validateFields(nameList)\n .then((values) => {\n for (let item in values) {\n // String类型去掉前后空格\n if (\n typeofEqual({\n data: values[item],\n type: 'String',\n })\n ) {\n values[item] = values[item].replace(/(^\\s*)|(\\s*$)/g, '');\n }\n }\n resolve(values);\n })\n .catch((err) => {\n if (err.errorFields && err.errorFields.length) {\n console.warn('请输入或选择表单必填项:', err);\n message.warning('请输入或选择表单必填项', 1.5);\n }\n reject(new Error('false'));\n });\n });\n },\n // 重置表单\n formReset: (fields) => {\n form.resetFields(fields);\n return form.getFieldsValue();\n },\n }));\n\n return (\n <ConfigProvider>\n <Form\n name={uid}\n className={`generate-form ${className ? className : ''}`}\n form={form}\n {...formConfig}\n initialValues={{\n sortSeq: 10,\n startTime: dayjs(`${new Date().getFullYear()}-01-01`),\n endTime: dayjs('2099-12-31'),\n ...(formConfig ? formConfig.initialValues : undefined),\n }}\n >\n <Row {...rowGridConfig}>\n {renderedList}\n {render ? (\n <Col>\n <Form.Item>{render && render()}</Form.Item>\n </Col>\n ) : null}\n </Row>\n </Form>\n </ConfigProvider>\n );\n}\n\nexport default forwardRef(GenerateForm);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction stringifiable(obj) {\n // Safely stringify Object.create(null)\n /* istanbul ignore next */\n return typeof obj === 'object' && !('toString' in obj) ?\n Object.prototype.toString.call(obj).slice(8, -1) :\n obj;\n}\nvar isProduction = typeof process === 'object' && process.env.NODE_ENV === 'production';\nfunction invariant(condition, message) {\n if (!condition) {\n /* istanbul ignore next */\n if (isProduction) {\n throw new Error('Invariant failed');\n }\n throw new Error(message());\n }\n}\nexports.invariant = invariant;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar splice = Array.prototype.splice;\nvar toString = Object.prototype.toString;\nfunction type(obj) {\n return toString.call(obj).slice(8, -1);\n}\nvar assign = Object.assign || /* istanbul ignore next */ (function (target, source) {\n getAllKeys(source).forEach(function (key) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n });\n return target;\n});\nvar getAllKeys = typeof Object.getOwnPropertySymbols === 'function'\n ? function (obj) { return Object.keys(obj).concat(Object.getOwnPropertySymbols(obj)); }\n /* istanbul ignore next */\n : function (obj) { return Object.keys(obj); };\nfunction copy(object) {\n return Array.isArray(object)\n ? assign(object.constructor(object.length), object)\n : (type(object) === 'Map')\n ? new Map(object)\n : (type(object) === 'Set')\n ? new Set(object)\n : (object && typeof object === 'object')\n ? assign(Object.create(Object.getPrototypeOf(object)), object)\n /* istanbul ignore next */\n : object;\n}\nvar Context = /** @class */ (function () {\n function Context() {\n this.commands = assign({}, defaultCommands);\n this.update = this.update.bind(this);\n // Deprecated: update.extend, update.isEquals and update.newContext\n this.update.extend = this.extend = this.extend.bind(this);\n this.update.isEquals = function (x, y) { return x === y; };\n this.update.newContext = function () { return new Context().update; };\n }\n Object.defineProperty(Context.prototype, \"isEquals\", {\n get: function () {\n return this.update.isEquals;\n },\n set: function (value) {\n this.update.isEquals = value;\n },\n enumerable: true,\n configurable: true\n });\n Context.prototype.extend = function (directive, fn) {\n this.commands[directive] = fn;\n };\n Context.prototype.update = function (object, $spec) {\n var _this = this;\n var spec = (typeof $spec === 'function') ? { $apply: $spec } : $spec;\n if (!(Array.isArray(object) && Array.isArray(spec))) {\n invariant(!Array.isArray(spec), function () { return \"update(): You provided an invalid spec to update(). The spec may \" +\n \"not contain an array except as the value of $set, $push, $unshift, \" +\n \"$splice or any custom command allowing an array value.\"; });\n }\n invariant(typeof spec === 'object' && spec !== null, function () { return \"update(): You provided an invalid spec to update(). The spec and \" +\n \"every included key path must be plain objects containing one of the \" +\n (\"following commands: \" + Object.keys(_this.commands).join(', ') + \".\"); });\n var nextObject = object;\n getAllKeys(spec).forEach(function (key) {\n if (hasOwnProperty.call(_this.commands, key)) {\n var objectWasNextObject = object === nextObject;\n nextObject = _this.commands[key](spec[key], nextObject, spec, object);\n if (objectWasNextObject && _this.isEquals(nextObject, object)) {\n nextObject = object;\n }\n }\n else {\n var nextValueForKey = type(object) === 'Map'\n ? _this.update(object.get(key), spec[key])\n : _this.update(object[key], spec[key]);\n var nextObjectValue = type(nextObject) === 'Map'\n ? nextObject.get(key)\n : nextObject[key];\n if (!_this.isEquals(nextValueForKey, nextObjectValue)\n || typeof nextValueForKey === 'undefined'\n && !hasOwnProperty.call(object, key)) {\n if (nextObject === object) {\n nextObject = copy(object);\n }\n if (type(nextObject) === 'Map') {\n nextObject.set(key, nextValueForKey);\n }\n else {\n nextObject[key] = nextValueForKey;\n }\n }\n }\n });\n return nextObject;\n };\n return Context;\n}());\nexports.Context = Context;\nvar defaultCommands = {\n $push: function (value, nextObject, spec) {\n invariantPushAndUnshift(nextObject, spec, '$push');\n return value.length ? nextObject.concat(value) : nextObject;\n },\n $unshift: function (value, nextObject, spec) {\n invariantPushAndUnshift(nextObject, spec, '$unshift');\n return value.length ? value.concat(nextObject) : nextObject;\n },\n $splice: function (value, nextObject, spec, originalObject) {\n invariantSplices(nextObject, spec);\n value.forEach(function (args) {\n invariantSplice(args);\n if (nextObject === originalObject && args.length) {\n nextObject = copy(originalObject);\n }\n splice.apply(nextObject, args);\n });\n return nextObject;\n },\n $set: function (value, _nextObject, spec) {\n invariantSet(spec);\n return value;\n },\n $toggle: function (targets, nextObject) {\n invariantSpecArray(targets, '$toggle');\n var nextObjectCopy = targets.length ? copy(nextObject) : nextObject;\n targets.forEach(function (target) {\n nextObjectCopy[target] = !nextObject[target];\n });\n return nextObjectCopy;\n },\n $unset: function (value, nextObject, _spec, originalObject) {\n invariantSpecArray(value, '$unset');\n value.forEach(function (key) {\n if (Object.hasOwnProperty.call(nextObject, key)) {\n if (nextObject === originalObject) {\n nextObject = copy(originalObject);\n }\n delete nextObject[key];\n }\n });\n return nextObject;\n },\n $add: function (values, nextObject, _spec, originalObject) {\n invariantMapOrSet(nextObject, '$add');\n invariantSpecArray(values, '$add');\n if (type(nextObject) === 'Map') {\n values.forEach(function (_a) {\n var key = _a[0], value = _a[1];\n if (nextObject === originalObject && nextObject.get(key) !== value) {\n nextObject = copy(originalObject);\n }\n nextObject.set(key, value);\n });\n }\n else {\n values.forEach(function (value) {\n if (nextObject === originalObject && !nextObject.has(value)) {\n nextObject = copy(originalObject);\n }\n nextObject.add(value);\n });\n }\n return nextObject;\n },\n $remove: function (value, nextObject, _spec, originalObject) {\n invariantMapOrSet(nextObject, '$remove');\n invariantSpecArray(value, '$remove');\n value.forEach(function (key) {\n if (nextObject === originalObject && nextObject.has(key)) {\n nextObject = copy(originalObject);\n }\n nextObject.delete(key);\n });\n return nextObject;\n },\n $merge: function (value, nextObject, _spec, originalObject) {\n invariantMerge(nextObject, value);\n getAllKeys(value).forEach(function (key) {\n if (value[key] !== nextObject[key]) {\n if (nextObject === originalObject) {\n nextObject = copy(originalObject);\n }\n nextObject[key] = value[key];\n }\n });\n return nextObject;\n },\n $apply: function (value, original) {\n invariantApply(value);\n return value(original);\n },\n};\nvar defaultContext = new Context();\nexports.isEquals = defaultContext.update.isEquals;\nexports.extend = defaultContext.extend;\nexports.default = defaultContext.update;\n// @ts-ignore\nexports.default.default = module.exports = assign(exports.default, exports);\n// invariants\nfunction invariantPushAndUnshift(value, spec, command) {\n invariant(Array.isArray(value), function () { return \"update(): expected target of \" + stringifiable(command) + \" to be an array; got \" + stringifiable(value) + \".\"; });\n invariantSpecArray(spec[command], command);\n}\nfunction invariantSpecArray(spec, command) {\n invariant(Array.isArray(spec), function () { return \"update(): expected spec of \" + stringifiable(command) + \" to be an array; got \" + stringifiable(spec) + \". \" +\n \"Did you forget to wrap your parameter in an array?\"; });\n}\nfunction invariantSplices(value, spec) {\n invariant(Array.isArray(value), function () { return \"Expected $splice target to be an array; got \" + stringifiable(value); });\n invariantSplice(spec.$splice);\n}\nfunction invariantSplice(value) {\n invariant(Array.isArray(value), function () { return \"update(): expected spec of $splice to be an array of arrays; got \" + stringifiable(value) + \". \" +\n \"Did you forget to wrap your parameters in an array?\"; });\n}\nfunction invariantApply(fn) {\n invariant(typeof fn === 'function', function () { return \"update(): expected spec of $apply to be a function; got \" + stringifiable(fn) + \".\"; });\n}\nfunction invariantSet(spec) {\n invariant(Object.keys(spec).length === 1, function () { return \"Cannot have more than one key in an object with $set\"; });\n}\nfunction invariantMerge(target, specValue) {\n invariant(specValue && typeof specValue === 'object', function () { return \"update(): $merge expects a spec of type 'object'; got \" + stringifiable(specValue); });\n invariant(target && typeof target === 'object', function () { return \"update(): $merge expects a target of type 'object'; got \" + stringifiable(target); });\n}\nfunction invariantMapOrSet(target, command) {\n var typeOfTarget = type(target);\n invariant(typeOfTarget === 'Map' || typeOfTarget === 'Set', function () { return \"update(): \" + stringifiable(command) + \" expects a target of type Set or Map; got \" + stringifiable(typeOfTarget); });\n}\n","import React, { memo, useCallback, useMemo, useState, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Resizable } from 'react-resizable';\n\nconst ResizableTitle = ({ onResize, width, ...restProps }: any) => {\n const stopClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n }, []);\n\n // 本地宽度状态:拖拽过程中即时更新,结束后再提交给父级\n const [localWidth, setLocalWidth] = useState<number>(typeof width === 'number' ? width : 0);\n useEffect(() => {\n if (typeof width === 'number') {\n setLocalWidth(width);\n }\n }, [width]);\n\n const draggableOpts = useMemo(() => ({ enableUserSelectHack: false }), []);\n\n // Always render Resizable to avoid switching wrapper during drag\n const safeWidth = localWidth;\n const handleNode =\n localWidth > 0 ? (\n <span className=\"react-resizable-handle\" onMouseDown={stopClick} onClick={stopClick} />\n ) : undefined;\n const thRef = useRef<HTMLElement | null>(null);\n const containerElRef = useRef<HTMLElement | null>(null);\n const [containerRect, setContainerRect] = useState<DOMRect | null>(null);\n\n // 当未提供数值型 width 时,首次渲染后测量实际宽度作为初始拖拽宽度\n useEffect(() => {\n if (typeof width !== 'number' && thRef.current) {\n const measured = thRef.current.offsetWidth;\n if (measured > 0) {\n setLocalWidth(measured);\n }\n }\n }, [width]);\n\n const MIN_WIDTH = 80;\n const MAX_WIDTH = 10000;\n\n const clamp = (val: number) => Math.min(Math.max(val, MIN_WIDTH), MAX_WIDTH);\n const rafIdRef = useRef<number | null>(null);\n const onResizeSafe =\n localWidth > 0\n ? (e: React.SyntheticEvent, data: any) => {\n const evt = e as unknown as MouseEvent;\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n rafIdRef.current = requestAnimationFrame(() => {\n setDragX(evt.clientX);\n setLocalWidth(clamp(data.size.width));\n rafIdRef.current = null;\n });\n }\n : undefined;\n const onResizeStopSafe =\n localWidth > 0\n ? (e: React.SyntheticEvent, data: any) => {\n setIsResizing(false);\n const finalWidth = clamp(data.size.width);\n onResize && onResize(e, { ...data, size: { ...data.size, width: finalWidth } });\n setDragX(null);\n setContainerRect(null);\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n }\n : undefined;\n\n // 拖拽中的虚线指示\n const [isResizing, setIsResizing] = useState(false);\n const [dragX, setDragX] = useState<number | null>(null);\n const onResizeStartSafe =\n localWidth > 0\n ? (e: React.SyntheticEvent) => {\n setIsResizing(true);\n const evt = e as unknown as MouseEvent;\n setDragX(evt.clientX);\n // 计算并缓存容器信息(限定在表格容器内显示虚线)\n const thEl = thRef.current;\n if (thEl) {\n const container = thEl.closest('.ant-table-container') as HTMLElement | null;\n containerElRef.current = container ?? null;\n if (container) {\n setContainerRect(container.getBoundingClientRect());\n } else {\n setContainerRect(null);\n }\n }\n }\n : undefined;\n\n return (\n <Resizable\n width={safeWidth}\n height={0}\n handle={handleNode}\n onResizeStart={onResizeStartSafe}\n onResize={onResizeSafe}\n onResizeStop={onResizeStopSafe}\n draggableOpts={draggableOpts}\n >\n <th\n {...restProps}\n ref={thRef}\n style={{ position: 'relative', width: safeWidth, ...restProps.style }}\n >\n {isResizing && (\n <>\n {/* 跨列虚线(限定在表格容器内)*/}\n {dragX !== null &&\n containerElRef.current &&\n containerRect &&\n createPortal(\n <span\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: dragX - containerRect.left,\n width: 0,\n borderLeft: '1px dashed #ccc',\n pointerEvents: 'none',\n zIndex: 9,\n }}\n />,\n containerElRef.current,\n )}\n </>\n )}\n {restProps.children}\n </th>\n </Resizable>\n );\n};\nexport default memo(ResizableTitle);\n","import React, {\n useState,\n useContext,\n useEffect,\n useRef,\n useCallback,\n useMemo,\n memo,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport _ from 'lodash';\nimport dayjs from 'dayjs';\nimport { Form, Input, Select, DatePicker, Spin } from 'antd';\nimport { FormItemProps } from 'antd/es/form';\nimport { useDrag, useDrop } from 'react-dnd';\nimport { SelectType, AnyObjectType } from '../../brother/typings';\nimport { typeofEqual, getSelectValue } from '../../brother/utils';\nimport { TableColumns } from '..';\nimport './index.less';\n\nconst { Option } = Select;\nconst EditableContext = React.createContext<any>(null);\n\ntype remoteValueType = string | undefined;\ntype remotePromiseType = (value: remoteValueType, record: AnyObjectType) => Promise<SelectType[]>;\n\ntype SpanType = number | undefined;\n\ntype CellType = {\n rowSpan?: SpanType;\n colSpan?: SpanType;\n};\n\nexport interface EditableColumnsType {\n /** 纵向合并单元格 */\n rowSpanNum: SpanType | ((record: AnyObjectType, index: number) => SpanType);\n /** 横向向合并单元格 */\n colSpanNum: SpanType | ((record: AnyObjectType, index: number) => SpanType);\n /** 是否打开可编辑单元格 */\n editable: boolean | ((record: AnyObjectType, index: number) => boolean);\n /** 整数输入框 */\n inputType: 'number';\n /** 单元格表单类型 */\n valueType:\n | 'Select'\n | 'AutoComplete'\n | 'RecordSelect'\n | 'RemoteSearch'\n | 'DatePicker'\n | 'DateTimePicker';\n /** 单元格select值 */\n valueEnum: SelectType[];\n recordSelectField: string;\n /** 表单值改变触发 */\n formChange: (record: AnyObjectType) => AnyObjectType | void;\n remoteConfig: {\n /** 远程搜索的api */\n remoteApi: remotePromiseType;\n /** 远程搜索模式为多选或标签 */\n remoteMode?: 'multiple' | 'tags';\n };\n /** 可编辑单元格表单验证 */\n formItemProps: {\n rules: FormItemProps['rules'];\n };\n /** 自定义渲染值(在原有的内容上增加新的结构),childNode是原有的内容 */\n controlRender: (record: AnyObjectType, childNode: React.ReactNode) => React.ReactNode;\n /** 表单项placeholder */\n placeholder?: string;\n /** 表单值变化是否触发远程搜索下拉数据更新 */\n triggerRemoteSearch?: boolean;\n}\n\n/** 可编辑单元格 */\nexport type EditableCellProps<T = AnyObjectType> = {\n className?: string;\n title: React.ReactNode;\n children: React.ReactNode;\n dataIndex: string;\n recordIndex: number;\n record: T;\n render?: (value: any, record: T, index: number) => React.ReactNode;\n /** 保存表单的值 */\n handleSave: (record: T, dataIndex: string) => void;\n columns: TableColumns[];\n} & EditableColumnsType;\n\nexport type EditableCellVC = EditableCellProps & CellType;\n\nexport interface DraggableBodyRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n /** 是否打开拖拽功能 */\n open: boolean;\n /** 拖拽事件 */\n moveRow: (dragIndex: number, hoverIndex: number) => void;\n /** 索引 */\n index: number;\n}\n// 移除 virtuallist-antd 的 vc 相关类型\n\nexport const EditableRow = memo(\n forwardRef<HTMLTableRowElement, DraggableBodyRowProps>(\n ({ open, index, moveRow, className, style, ...restProps }, forwardedRef) => {\n const [form] = Form.useForm();\n const innerRef = useRef<HTMLTableRowElement>(null);\n\n // 将内部 DOM 节点暴露给外部 RefObject(避免直接赋值 readonly 的 current)\n useImperativeHandle(forwardedRef, () => innerRef.current as HTMLTableRowElement, []);\n\n const [{ isOver, dropClassName }, drop] = useDrop({\n accept: 'DraggableBodyRow',\n collect: (monitor) => {\n const { index: dragIndex } = monitor.getItem() || ({} as any);\n if (dragIndex === index) {\n return {} as any;\n }\n return {\n isOver: monitor.isOver(),\n dropClassName: dragIndex < index ? ' drop-over-downward' : ' drop-over-upward',\n } as any;\n },\n drop: (item: { index: number }) => {\n moveRow(item.index, index);\n },\n });\n\n const [, drag] = useDrag({\n type: 'DraggableBodyRow',\n item: { index },\n collect: (monitor) => ({\n isDragging: monitor.isDragging(),\n }),\n });\n\n if (open) {\n drop(drag(innerRef));\n }\n\n const tempProps = {\n ref: innerRef,\n className: `${className}${isOver ? dropClassName : ''}`,\n style: { cursor: open ? 'move' : 'auto', ...style },\n ...restProps,\n } as React.HTMLAttributes<HTMLTableRowElement> & { ref: React.Ref<HTMLTableRowElement> };\n\n return (\n <Form size=\"small\" component={false} form={form}>\n <EditableContext.Provider value={form}>\n <tr {...(tempProps as any)} />\n </EditableContext.Provider>\n </Form>\n );\n },\n ),\n (prev: DraggableBodyRowProps, next: DraggableBodyRowProps) => {\n return (\n prev.index === next.index &&\n prev.open === next.open &&\n prev.className === next.className &&\n prev.style === next.style &&\n prev.moveRow === next.moveRow\n );\n },\n);\nconst EditableCell: React.FC<EditableCellProps & CellType> = ({\n columns,\n record,\n recordIndex,\n dataIndex,\n title,\n rowSpanNum,\n colSpanNum,\n rowSpan,\n colSpan,\n editable,\n inputType,\n valueType,\n valueEnum,\n recordSelectField,\n controlRender,\n render,\n formChange,\n remoteConfig,\n children,\n formItemProps,\n handleSave,\n placeholder,\n triggerRemoteSearch,\n ...restProps\n}) => {\n const form = useContext(EditableContext);\n // 打开关闭表单\n const [editing, setEditing] = useState(false);\n // 远程搜索loading\n const [remoteFetching, setRemoteFetching] = useState(false);\n // 远程搜索数据结果\n const [remoteData, setRemoteData] = useState<{ [key: string]: SelectType[] }>({});\n // 表单项\n const formItemRef = useRef<any>(null);\n\n useEffect(() => {\n if (editing) {\n formItemRef.current!.focus();\n }\n }, [editing]);\n\n useEffect(() => {\n if (\n valueType === 'RemoteSearch' &&\n record &&\n record[dataIndex] &&\n remoteConfig?.remoteApi &&\n triggerRemoteSearch\n ) {\n fetchRemote(undefined, dataIndex, record, remoteConfig?.remoteApi);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [remoteConfig?.remoteApi, record?.[dataIndex], triggerRemoteSearch]);\n\n /**\n * @Description 远程数据搜索\n * @Author bihongbin\n * @Date 2021-01-05 11:14:45\n */\n const fetchRemote = (\n value: remoteValueType,\n fieldName: string | undefined,\n record: AnyObjectType,\n remoteApi?: remotePromiseType,\n ) => {\n if (remoteApi) {\n setRemoteFetching(true);\n remoteApi(value, record).then((res) => {\n setRemoteFetching(false);\n if (fieldName) {\n setRemoteData((prev) => ({\n ...prev,\n [fieldName]: res,\n }));\n }\n });\n }\n };\n\n // 表单失去焦点\n const blurEditing = () => {\n closeEdit();\n };\n\n // 关闭表单显示\n const closeEdit = () => {\n setEditing(false);\n };\n\n // 表单和文本切换\n const toggleEdit = () => {\n let curVal = record[dataIndex];\n if (curVal !== undefined && curVal !== null && curVal !== '') {\n if (valueType === 'DatePicker' || valueType === 'DateTimePicker') {\n curVal = dayjs(curVal);\n }\n if (dataIndex === 'status') {\n curVal = String(curVal);\n }\n }\n setEditing(!editing);\n form.setFieldsValue({ [dataIndex]: curVal });\n };\n\n // 处理时间组件值转为filed格式\n const filterTime = useCallback(\n (data: AnyObjectType) => {\n const filed = {\n DateTimePicker: 'YYYY-MM-DD HH:mm:ss',\n DatePicker: 'YYYY-MM-DD',\n };\n if (Object.keys(filed).includes(valueType) && data[dataIndex]) {\n data[dataIndex] = data[dataIndex].format(filed[valueType as keyof typeof filed]);\n }\n return data;\n },\n [valueType, dataIndex],\n );\n\n // 处理显示结果\n const filterContent = useMemo(() => {\n if (valueType && dataIndex) {\n if (valueEnum && (valueType === 'Select' || valueType === 'AutoComplete')) {\n return getSelectValue(valueEnum, record[dataIndex]);\n }\n if (valueType === 'RemoteSearch') {\n if (remoteData[dataIndex]) {\n return getSelectValue(remoteData[dataIndex], record[dataIndex]);\n }\n }\n if (record[recordSelectField] && valueType === 'RecordSelect') {\n return getSelectValue(record[recordSelectField], record[dataIndex]);\n }\n if (dayjs.isDayjs(record[dataIndex])) {\n return filterTime({ ...record })[dataIndex];\n }\n }\n return children;\n }, [\n valueType,\n dataIndex,\n valueEnum,\n remoteData,\n record,\n children,\n recordSelectField,\n filterTime,\n ]);\n\n // 显示不同类型的表单\n const filterFormType = (type: EditableCellProps['valueType'], title: string) => {\n let node: React.ReactNode = null;\n const filterOption = (input: string, option: any) => {\n let str = '';\n // 递归\n const deep = function (o: any) {\n for (let i of o) {\n // 节点值可能为undefined或null\n if (i) {\n if (typeofEqual({ data: i, type: 'String' })) {\n str += i;\n } else {\n const children = i.props.children;\n if (typeofEqual({ data: children, type: 'Object' })) {\n deep([children]);\n }\n if (typeofEqual({ data: children, type: 'Array' })) {\n deep(children);\n }\n if (typeofEqual({ data: children, type: 'String' })) {\n str += children;\n }\n }\n }\n }\n };\n deep([option.children]);\n return str.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n };\n // 渲染option\n const optionNode = (data: SelectType[]) => {\n if (_.isArray(data)) {\n return data.map((m, i: number) => (\n <Option key={i} value={m.value}>\n {m.label}\n </Option>\n ));\n }\n return null;\n };\n switch (type) {\n case 'RecordSelect':\n node = (\n <Select\n ref={formItemRef}\n open={editing}\n allowClear\n showSearch\n popupMatchSelectWidth={false}\n placeholder={placeholder || title}\n onChange={save}\n onBlur={blurEditing}\n optionFilterProp=\"children\"\n filterOption={filterOption}\n >\n {optionNode(record[recordSelectField])}\n </Select>\n );\n break;\n case 'Select':\n node = (\n <Select\n ref={formItemRef}\n open={editing}\n popupMatchSelectWidth={false}\n onChange={save}\n onBlur={blurEditing}\n placeholder={placeholder || title}\n >\n {optionNode(valueEnum)}\n </Select>\n );\n break;\n\n case 'DatePicker':\n node = (\n <DatePicker\n ref={formItemRef}\n open={editing}\n onChange={save}\n onBlur={blurEditing}\n placeholder={placeholder || title}\n />\n );\n break;\n case 'DateTimePicker':\n node = (\n <DatePicker\n ref={formItemRef}\n open={editing}\n onChange={save}\n onBlur={blurEditing}\n placeholder={placeholder || title}\n showTime\n />\n );\n break;\n case 'AutoComplete':\n node = (\n <Select\n ref={formItemRef}\n open={editing}\n allowClear\n showSearch\n popupMatchSelectWidth={false}\n placeholder={placeholder || title}\n onChange={save}\n onBlur={blurEditing}\n optionFilterProp=\"children\"\n filterOption={filterOption}\n >\n {optionNode(valueEnum)}\n </Select>\n );\n break;\n case 'RemoteSearch':\n let selectData = valueEnum;\n if (remoteData[dataIndex]) {\n selectData = remoteData[dataIndex];\n }\n node = (\n <Select\n ref={formItemRef}\n open={editing}\n mode={remoteConfig.remoteMode}\n placeholder={placeholder || title}\n notFoundContent={remoteFetching ? <Spin size=\"small\" /> : null}\n popupMatchSelectWidth={false}\n filterOption={false}\n allowClear\n showSearch\n onChange={save}\n onBlur={blurEditing}\n // 当获取焦点查询全部\n onFocus={() => fetchRemote(undefined, dataIndex, record, remoteConfig.remoteApi)}\n onSearch={(value) => fetchRemote(value, dataIndex, record, remoteConfig.remoteApi)}\n >\n {dataIndex && optionNode(selectData)}\n </Select>\n );\n break;\n default:\n node = (\n <Input\n ref={formItemRef}\n onPressEnter={save}\n onBlur={save}\n placeholder={placeholder || title}\n type={inputType ? inputType : 'text'}\n />\n );\n break;\n }\n return node;\n };\n\n // 更新值到record\n const save = async () => {\n try {\n const values = await form.validateFields();\n let data = { ...record, ...values };\n\n data[dataIndex] = data[dataIndex] || undefined;\n\n data = filterTime(data);\n\n if (formChange) {\n data = (await formChange(data)) || data; // 单元格值改变触发\n }\n\n if (record[dataIndex] !== data[dataIndex]) {\n handleSave(data, dataIndex);\n }\n\n closeEdit();\n } catch (errInfo) {\n console.log('保存表单字段失败:', errInfo);\n }\n };\n\n let childNode = children;\n const filterResult = useMemo(\n () => (render ? render(record[dataIndex], record, recordIndex) : filterContent),\n [render, record, recordIndex, dataIndex, filterContent],\n );\n\n if (editable) {\n childNode = editing ? (\n <div className=\"editable-form-item-wrap\">\n <Form.Item\n style={{ margin: 0 }}\n name={dataIndex}\n rules={formItemProps ? formItemProps.rules : undefined}\n >\n {filterFormType(valueType, title as string)}\n </Form.Item>\n </div>\n ) : (\n <div className=\"editable-cell-value-wrap\" onClick={toggleEdit}>\n {filterResult}\n </div>\n );\n } else {\n childNode = filterResult;\n }\n\n if (controlRender) {\n childNode = controlRender(record, childNode);\n }\n\n const vcRender = useCallback((rest: any, dom: React.ReactNode) => {\n return <td {...rest}>{dom}</td>;\n }, []);\n\n if (rowSpan || colSpan) {\n return vcRender(\n {\n ...restProps,\n rowSpan: rowSpan,\n colSpan: colSpan,\n title: record && record[dataIndex],\n },\n childNode,\n );\n }\n\n if (rowSpanNum !== 0 && colSpanNum !== 0) {\n return vcRender(\n {\n ...restProps,\n rowSpan: rowSpanNum,\n colSpan: rowSpan,\n title: record && record[dataIndex],\n },\n childNode,\n );\n }\n\n return null;\n};\n\nexport default memo(EditableCell);\n","import React from 'react';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\n\nconst DndContext = HTML5Backend;\n\n/** 使用react-dnd外层嵌套 */\nconst DndContainer: React.FC<{ children: React.ReactNode }> = (props) => {\n return (\n <DndProvider backend={DndContext} context={window}>\n {props.children}\n </DndProvider>\n );\n};\n\nexport default DndContainer;\n","import React, {\n useState,\n useRef,\n useImperativeHandle,\n useMemo,\n useCallback,\n useEffect,\n forwardRef,\n} from 'react';\nimport { memo } from 'react';\nimport _ from 'lodash';\nimport { Table } from 'antd';\nimport { TablePaginationConfig, TableProps, ColumnType } from 'antd/es/table';\nimport { TableRowSelection } from 'antd/es/table/interface';\nimport update from 'immutability-helper';\nimport ConfigProvider from '../brother/ConfigProvider';\nimport ResizableTitle from './ResizableTitle';\nimport EditableCell, { EditableRow, EditableColumnsType, EditableCellProps } from './EditableCell';\nimport { AnyObjectType, PromiseAxiosResultType } from '../brother/typings';\nimport hooks from '../brother/hooks';\nimport DndWrap from '../brother/DndWrap';\nimport './index.less';\n\n// 导出表格头类型\nexport type TableColumns<T = AnyObjectType> = ColumnType<T> & Partial<EditableColumnsType>;\n\nexport interface getTableListQueryType {\n /** 分页值 */\n current?: number;\n /** 是否清空选中项(ids和rows) */\n clearSelectIds?: boolean;\n /** 传此参数不重置分页 */\n pagination?: 'not-reset';\n [key: string]: any;\n}\n\n// 导出该组件可调用的方法类型\nexport interface TableCallType {\n // 设置加载loading\n setTableLoading: (data: boolean) => void;\n /** 调用接口手动加载数据 */\n getTableList: (values?: getTableListQueryType, callBack?: () => void) => void;\n /** 获取分页数据 */\n getPages: () => TablePaginationType | undefined;\n /** 设置选中id,当设置original=true时,不会重置selectRowIds,会在原有的selectRowIds扩展 */\n setRowSelected: (selectedRowKeys: any[], original?: true) => void;\n /** 设置选中列数据[{}] */\n setRowSelectedBy: (data: AnyObjectType[]) => void;\n /** 获取选中id */\n getSelectIds: () => any[];\n /** 清空选中 */\n clearSelectIds: () => void;\n /** 获取选中的数据项 */\n getSelectRowsArray: () => AnyObjectType[];\n /** 删除选中id */\n removeSelectIds: (data: string[]) => void;\n /** 获取表格静态数据 */\n getStaticDataList: () => AnyObjectType[];\n /** 设置表格静态数据 */\n setStaticDataList: (row: AnyObjectType | AnyObjectType[], callback?: () => void) => void;\n}\n\nexport type ScrollXYType = {\n x?: string | number | true | undefined;\n y?: string | number | undefined;\n};\n\n// 虚拟滚动配置\nexport interface VirtualProps {\n /** 虚拟滚动高度,该高度必须和table.scroll.y值一样,否则会出现滚动条不显示的问题 */\n height: number | string;\n onReachEnd?: () => void;\n onScroll?: () => void;\n onListRender?: (listInfo: { start: number; renderLen: number }) => void;\n debounceListRenderMS?: number;\n vid?: string;\n resetTopWhenDataChange?: boolean;\n}\n\n// 组件传参配置\nexport interface GenerateTableProp {\n extra: {\n /** 支持antd Table组件官方传参所有类型 */\n tableConfig?: TableProps<any>;\n /** 是否开启表格行选中 checkbox多选 radio单选 */\n rowType?: 'checkbox' | 'radio' | undefined;\n /** 开启固定列参数 */\n scroll?: ScrollXYType;\n /** 列表请求函数 */\n apiMethod?: (data: any) => PromiseAxiosResultType;\n /** 表格头 */\n columns: TableColumns<AnyObjectType>[];\n /** 静态表格数据 */\n data?: AnyObjectType[];\n /** 表格数据编辑是否是受控组件(该参数已丢弃) */\n controlled?: boolean;\n /** 列拖动功能 */\n drag?: {\n /** 打开与关闭 */\n open: boolean;\n /** 拖动回调 */\n moveRow: (\n /** 目标终点位置 */\n dragIndex: number,\n /** 目标开始位置 */\n hoverIndex: number,\n /** 拖拽完成后数据 */\n data: AnyObjectType[],\n /** 原数据 */\n prevData: AnyObjectType[],\n /** 拖拽范围数据 */\n range: AnyObjectType[],\n ) => Promise<boolean> | void;\n };\n /** 虚拟滚动功能 */\n virtual?: {\n /** 打开与关闭 */\n open: boolean;\n /** 虚拟滚动配置 */\n config: VirtualProps;\n };\n /**隐藏排序列 */\n hidSortColumn?: boolean;\n /** 行选中回调 */\n onSelect?: (selectedRows: AnyObjectType[], selectedRowKeys: any[]) => void;\n /** 控制分页格式 */\n paginationConfig?: false | TablePaginationConfig;\n /** 选择框的默认属性配置 */\n getCheckboxProps?: (record: AnyObjectType) => AnyObjectType;\n /** 数据结果过滤 */\n resultFilter?: (data: any) => Promise<AnyObjectType[]> | AnyObjectType[];\n /** 数据调用成功回调 */\n getTableSuccessData?: (data: AnyObjectType) => void;\n };\n}\n\ntype TablePaginationType = TablePaginationConfig & { pages: number; [key: string]: any };\n\ninterface StateType {\n /** 列表数据 */\n listData: AnyObjectType[];\n /** 表格选中行的key */\n selectRowIds: string[];\n /** 表格选中的所有数组 */\n selectRowArray: AnyObjectType[];\n}\n\n/** 动态表格 */\nconst GenerateTable = (props: GenerateTableProp, ref: any) => {\n // 父级props\n const extraProps = useMemo<GenerateTableProp['extra']>(() => {\n const extra = (props.extra || {}) as GenerateTableProp['extra'];\n\n return {\n tableConfig: extra.tableConfig,\n virtual: extra.virtual,\n rowType: extra.rowType,\n scroll: extra.scroll,\n apiMethod: extra.apiMethod,\n columns: extra.columns || [],\n data: extra.data,\n drag: extra.drag,\n onSelect: extra.onSelect,\n hidSortColumn: extra.hidSortColumn,\n paginationConfig: extra.paginationConfig,\n getCheckboxProps: extra.getCheckboxProps,\n resultFilter: extra.resultFilter,\n getTableSuccessData: extra.getTableSuccessData,\n };\n }, [props.extra]);\n\n const queryParameters = useRef<AnyObjectType>(); // 额外查询参数\n const isShowPagination = useRef<boolean>(true); // 是否显示分页,默认显示\n const queryPagination = useRef<TablePaginationType>({\n position: ['bottomCenter'], // 分页位置\n size: 'small', // 分页显示大小\n current: 1, // 当前第几页\n total: 0, // 总共多少条\n pages: 0, // 总共多少页\n pageSize: 10, // 每页显示多少条数据\n showSizeChanger: true, // 显示分页总数量\n orderByInfo: undefined, // 排序 1升序 -1降序\n });\n const columnsCacheRef = useRef<any[]>([]); // 缓存表格头拖拽以后的数据\n const [formatColumns, setFormatColumns] = useState<any[]>(extraProps.columns); // 表格头\n const [listLoading, setListLoading] = useState(false); // 列表loading\n const [state, setState] = hooks.useSetState<StateType>({\n listData: [],\n selectRowIds: [],\n selectRowArray: [],\n });\n // 表格横向纵向滚动条\n const [scrollXY, setScrollXY] = useState<ScrollXYType>({\n x: undefined,\n y: 330,\n });\n\n // rowKey\n const key = useMemo(() => {\n if (extraProps.tableConfig && extraProps.tableConfig.rowKey) {\n return extraProps.tableConfig.rowKey as string;\n } else {\n return 'id';\n }\n }, [extraProps.tableConfig]);\n\n // 自定义表格头和内容\n const VirtualEditableRow = React.forwardRef<any, any>((props, ref) => (\n <EditableRow {...props} ref={ref} />\n ));\n const VirtualEditableCell = React.forwardRef<any, any>((props, ref) => (\n <EditableCell {...props} ref={ref} />\n ));\n const components = useMemo(() => {\n return {\n header: {\n cell: ResizableTitle,\n },\n body: {\n row: VirtualEditableRow,\n cell: VirtualEditableCell,\n },\n };\n }, [VirtualEditableRow, VirtualEditableCell]);\n\n // 分页配置\n const paginationConfig: false | TablePaginationConfig =\n _.isFunction(extraProps.apiMethod) && isShowPagination.current\n ? {\n size: 'small',\n position: ['bottomCenter'],\n showTotal: (total) => `共${total}条`,\n showSizeChanger: true,\n showQuickJumper: true,\n ...queryPagination.current,\n }\n : false;\n\n /**\n * 合并去重([{ a: 9, id: 2 }], [{ a: 10, id: 2 }, { a: 12, id: 3 }]) => [{ a: 10, id: 2 }, { a: 12, id: 3 }]\n */\n const keyOriginPlace = useCallback(\n (prevData: AnyObjectType[], newData: AnyObjectType[]) => {\n // 创建一个Map用于存储合并后的数据\n const mergedMap = new Map();\n\n // 首先添加prevData中的数据\n prevData.forEach((item) => {\n mergedMap.set(item[key], item);\n });\n\n // 然后用newData中的数据覆盖或添加\n newData.forEach((item) => {\n mergedMap.set(item[key], item);\n });\n\n // 将Map转换回数组\n return Array.from(mergedMap.values());\n },\n [key],\n );\n\n /**\n * @Description 获取表格数据 values包含{ updateSelected: false }时,不会更新复选框和单选选中的值\n * @Author bihongbin\n * @Date 2020-06-24 14:43:05\n */\n const getList = useCallback(\n async (values?: AnyObjectType) => {\n let updateSelected = true; // 加载列表时,是否更新复选框和单选选中的值(默认更新)\n setListLoading(true);\n if (values) {\n if (values.updateSelected !== undefined) {\n updateSelected = values.updateSelected;\n delete values.updateSelected;\n }\n if (values.pagination === 'not-reset') {\n delete values.pagination;\n }\n queryParameters.current = {\n ...queryParameters.current,\n ...values,\n };\n }\n try {\n const queryParams: AnyObjectType = {\n ...queryParameters.current,\n };\n for (let item in queryPagination.current) {\n const itemValue = queryPagination.current[item];\n // 排序\n if (item === 'orderByInfo') {\n queryParams.orderByInfo = itemValue;\n }\n // 当前页\n if (item === 'current') {\n queryParams.page = itemValue;\n }\n // 当前条数\n if (item === 'pageSize') {\n queryParams.size = queryParams.size || itemValue;\n }\n }\n // 查询时,分页重置到第一页\n if (values && values.current) {\n queryParams.page = values.current;\n queryPagination.current.current = values.current;\n }\n if (extraProps.apiMethod) {\n delete queryParams.current;\n const result = await extraProps.apiMethod(_.pickBy(queryParams, _.identity));\n let content: AnyObjectType[] = [];\n // 有分页数据\n if (_.isArray(result.data.content)) {\n if (extraProps.paginationConfig !== false) {\n // 显示分页\n isShowPagination.current = true;\n } else {\n // 隐藏分页\n isShowPagination.current = false;\n }\n content = result.data.content;\n queryPagination.current.total = result.data.total;\n queryPagination.current.pages = result.data.pages;\n }\n // 无分页数据\n if (_.isArray(result.data)) {\n // 隐藏分页\n isShowPagination.current = false;\n content = result.data;\n }\n // 数据结果过滤\n if (extraProps.resultFilter) {\n content = await extraProps.resultFilter(content);\n }\n // 更新表格选中的数据id\n if (updateSelected) {\n setState((prev) => {\n let rowIds: string[] = [...prev.selectRowIds];\n let rowData: AnyObjectType[] = [];\n // 递归\n const deepTable = (list: AnyObjectType[]) => {\n if (prev.selectRowIds.length) {\n for (let item of list) {\n for (let ids of prev.selectRowIds) {\n if (item[key] === ids) {\n rowIds.push(ids);\n rowData.push(item);\n }\n }\n if (item.children) {\n deepTable(item.children);\n }\n }\n }\n };\n\n deepTable(content);\n prev.selectRowIds = Array.from(new Set(rowIds));\n prev.selectRowArray = keyOriginPlace(prev.selectRowArray, rowData);\n return prev;\n });\n }\n setState((prev) => {\n prev.listData = content;\n return prev;\n });\n // 查询请求成功后回调\n if (extraProps.getTableSuccessData) {\n extraProps.getTableSuccessData(result);\n }\n }\n } catch (error) {\n console.error('error', error);\n }\n setListLoading(false);\n },\n [extraProps, key, keyOriginPlace, setState],\n );\n\n /**\n * @Description 分页切换\n * @Author bihongbin\n * @Date 2020-06-24 14:05:28\n */\n const changeEstimatesList = useCallback(\n (pagination: TablePaginationType) => {\n // 排序时,会导致分页onchange触发,值不相等时,说明分页参数变动,加载数据\n if (!_.isEqual(pagination, queryPagination.current) && isShowPagination.current) {\n queryPagination.current = {\n ...queryPagination.current,\n ...pagination,\n };\n // getList({ updateSelected: false });\n getList();\n }\n },\n [getList],\n );\n\n /**\n * 分页切换\n */\n const paginationChange = useCallback(\n (pagination: any, filter: any, sorter: any) => {\n const { order } = sorter;\n // 1升序 -1降序\n pagination['orderByInfo'] = undefined;\n if (order) {\n pagination['orderByInfo'] = `${sorter.field}:${order === 'ascend' ? 1 : -1}`;\n }\n changeEstimatesList(pagination as TablePaginationType);\n },\n [changeEstimatesList],\n );\n\n /**\n * @Description 行选择\n * @Author bihongbin\n * @Date 2020-06-24 15:16:07\n */\n const rowSelection: TableRowSelection<any> = {\n fixed: true,\n type: extraProps.rowType,\n selectedRowKeys: state.selectRowIds,\n getCheckboxProps: extraProps.getCheckboxProps,\n onSelectAll: (selected, selectedRows, changeRows) => {\n setState((prev) => {\n let ids = [...prev.selectRowIds];\n let rows = [...prev.selectRowArray];\n\n if (selected) {\n ids = _.uniq([...ids, ...changeRows.map((item) => item[key])]);\n rows = _.uniqBy([...rows, ...changeRows], key);\n } else {\n // 取消全选时,去掉取消选择的数据\n ids = ids.filter((item) => {\n return !changeRows.some((changeItem) => changeItem[key] === item);\n });\n rows = rows.filter((item) => {\n return !changeRows.some((changeItem) => changeItem[key] === item[key]);\n });\n }\n extraProps.onSelect && extraProps.onSelect(rows, ids);\n\n prev.selectRowIds = ids;\n prev.selectRowArray = rows;\n return prev;\n });\n },\n onSelect: (record, selected) => {\n setState((prev) => {\n let ids = [...prev.selectRowIds];\n let rows = [...prev.selectRowArray];\n\n if (extraProps.rowType === 'checkbox') {\n if (selected) {\n ids.push(record[key]);\n rows.push(record);\n } else {\n ids = ids.filter((item) => item !== record[key]);\n rows = rows.filter((item) => item[key] !== record[key]);\n }\n }\n if (extraProps.rowType === 'radio') {\n if (selected) {\n ids = [record[key]];\n rows = [record];\n }\n }\n extraProps.onSelect && extraProps.onSelect(rows, ids);\n\n prev.selectRowIds = ids;\n prev.selectRowArray = rows;\n return prev;\n });\n },\n };\n\n /**\n * @Description 表头拖动重置宽度\n * @Author bihongbin\n * @Date 2020-07-21 10:36:35\n */\n const handleResize =\n (index: number) =>\n (e: any, { size }: any) => {\n setFormatColumns((prev) => {\n const nextColumns = [...prev];\n nextColumns[index] = {\n ...nextColumns[index],\n width: size.width,\n };\n // 缓存表格头拖拽以后的数据\n columnsCacheRef.current = nextColumns;\n return nextColumns;\n });\n };\n\n /**\n * @Description 保存input数据\n * @Author bihongbin\n * @Date 2020-09-24 12:04:56\n */\n const handleSave = useCallback<EditableCellProps['handleSave']>(\n (row) => {\n setState((prev) => {\n let newData = JSON.parse(JSON.stringify(prev.listData));\n for (let [index, item] of newData.entries()) {\n if (item[key] === row[key]) {\n newData[index] = {\n ...newData[index],\n ...row,\n };\n break;\n }\n }\n prev.listData = newData;\n return prev;\n });\n },\n [key, setState],\n );\n\n /**\n * @Description 列拖动功能\n * @Author bihongbin\n * @Date 2020-12-14 11:54:23\n */\n const moveRow = useCallback(\n async (dragIndex: number, hoverIndex: number) => {\n const dragRow = state.listData[dragIndex];\n const list = update(state.listData, {\n $splice: [\n [dragIndex, 1],\n [hoverIndex, 0, dragRow],\n ],\n });\n\n setListLoading(true);\n try {\n // 拖动列回调\n if (extraProps.drag) {\n const data = JSON.parse(JSON.stringify(list));\n const prevData = JSON.parse(JSON.stringify(state.listData));\n const i = [dragIndex, hoverIndex].sort();\n\n const res = await extraProps.drag.moveRow(\n dragIndex, // 目标终点位置\n hoverIndex, // 目标开始位置\n data, // 拖拽完成后数据\n prevData, // 原数据\n data.slice(i[0], i[1] + 1), // 拖拽范围数据\n );\n // 只有在false情况下才不允许拖动列\n if (res !== false) {\n setState((prev) => {\n prev.listData = data;\n return prev;\n });\n }\n }\n } finally {\n setListLoading(false);\n }\n },\n [extraProps.drag, setState, state.listData],\n );\n\n /**\n * 拖拽\n */\n const moveChange = useCallback(\n (_: any, index: number | undefined) => {\n const attr = {\n index,\n moveRow,\n open: extraProps.drag && extraProps.drag.open,\n };\n return attr as React.HTMLAttributes<any>;\n },\n [extraProps.drag, moveRow],\n );\n\n /**\n * 通过选中id更新选中项rows\n */\n const filterSelectRows = useCallback(\n (tableList: AnyObjectType[]) => {\n let rows: AnyObjectType[] = [];\n // 递归\n const deepTable = (list: AnyObjectType[]) => {\n for (let item of list) {\n for (let ids of state.selectRowIds) {\n if (item[key] === ids) {\n rows.push(item);\n }\n }\n if (item.children) {\n deepTable(item.children);\n }\n }\n };\n deepTable(tableList);\n return rows;\n },\n [key, state.selectRowIds],\n );\n\n /**\n * @Description 设置表头\n * @Author bihongbin\n * @Date 2020-07-21 09:31:16\n */\n useEffect(() => {\n const filterColumns = async () => {\n let columns = [...extraProps.columns];\n\n // 添加序号\n if (!extraProps.hidSortColumn) {\n columns.unshift({\n width: 55,\n fixed: 'left',\n title: '序号',\n dataIndex: 'sequence',\n render: (text: any, record: any, index: number) => {\n const pages = queryPagination.current;\n if (Object.keys(pages).length) {\n return ((pages.current || 0) - 1) * (pages.pageSize || 0) + index + 1;\n } else {\n return index + 1;\n }\n },\n });\n }\n\n for (let [index, col] of columns.entries()) {\n let obj: AnyObjectType = {\n ...col,\n onHeaderCell: (column: any) => ({\n width: column.width,\n onResize: handleResize(index),\n }),\n onCell: (record: AnyObjectType, i: number) => ({\n record,\n recordIndex: i,\n dataIndex: col.dataIndex,\n title: col.title,\n rowSpanNum:\n typeof col.rowSpanNum === 'function' ? col.rowSpanNum(record, i) : col.rowSpanNum,\n colSpanNum:\n typeof col.colSpanNum === 'function' ? col.colSpanNum(record, i) : col.colSpanNum,\n editable: typeof col.editable === 'function' ? col.editable(record, i) : col.editable,\n inputType: col.inputType,\n valueType: col.valueType,\n valueEnum: col.valueEnum,\n recordSelectField: col.recordSelectField,\n controlRender: col.controlRender,\n render: col.render,\n formChange: col.formChange,\n remoteConfig: col.remoteConfig,\n formItemProps: col.formItemProps,\n handleSave: handleSave,\n placeholder: col.placeholder,\n triggerRemoteSearch: col.triggerRemoteSearch,\n }),\n };\n\n // 找到缓存中的columns,并且设置width,让其拖拽后宽度不变\n let currentColumns = columnsCacheRef.current.find(\n (t) => t.dataIndex === col.dataIndex && t.title === col.title,\n );\n\n if (currentColumns) {\n obj.width = currentColumns.width;\n }\n\n columns[index] = obj;\n }\n\n setFormatColumns(columns);\n };\n\n filterColumns();\n }, [extraProps.columns, extraProps.hidSortColumn, handleSave]);\n\n /**\n * @Description 初始化静态表格数据\n * @Author bihongbin\n * @Date 2020-07-13 09:16:45\n */\n useEffect(() => {\n if (_.isArray(extraProps.data)) {\n setState((prev) => {\n prev.listData = JSON.parse(JSON.stringify(extraProps.data));\n return prev;\n });\n }\n }, [extraProps.data, setState]);\n\n /**\n * @Description 固定列\n * @Author bihongbin\n * @Date 2020-06-28 10:33:20\n */\n useEffect(() => {\n const sliderMenu = document.getElementById('slider-menu');\n const routerRender = document.getElementById('router-render');\n\n if (extraProps.scroll?.x !== undefined || extraProps.scroll?.y !== undefined) {\n setScrollXY((prev) => ({ ...prev, ...extraProps.scroll }));\n } else {\n // 计算宽度 body.width - 左侧边栏宽度 - 右侧内容区padding*2\n if (sliderMenu && routerRender) {\n let pad = parseInt(window.getComputedStyle(routerRender, null)['paddingLeft']);\n setScrollXY((prev) => {\n prev.x = document.body.clientWidth - sliderMenu.clientWidth - (pad * 2 + 43);\n return prev;\n });\n }\n }\n }, [extraProps.scroll]);\n\n /**\n * @Description 分页初始查询值修改\n * @Author bihongbin\n * @Date 2021-08-24 16:06:14\n */\n useEffect(() => {\n if (extraProps.paginationConfig) {\n queryPagination.current = {\n ...queryPagination.current,\n ...extraProps.paginationConfig,\n };\n }\n }, [extraProps.paginationConfig]);\n\n // 暴漏给父组件调用\n useImperativeHandle<any, TableCallType>(ref, () => ({\n /** 设置loading */\n setTableLoading: (data) => {\n setListLoading(data);\n },\n /** 分页参数 */\n getPages: () => {\n return { ...queryPagination.current };\n },\n /** 调用接口获取表格数据 */\n getTableList: async (values, callback) => {\n if (values) {\n // 分页是否重置\n if (values.pagination === 'not-reset') {\n values.current = queryPagination.current.current;\n } else {\n if (values.current === undefined) {\n values.current = 1;\n }\n }\n // 清空选中项\n if (values.clearSelectIds) {\n delete values.clearSelectIds;\n setState((prev) => {\n prev.selectRowArray = [];\n prev.selectRowIds = [];\n return prev;\n });\n }\n }\n await getList(values);\n // 查询回调\n if (callback) {\n callback();\n }\n },\n /** 设置表格选中行id */\n setRowSelected: (selectedRowKeys, original) => {\n let ids = selectedRowKeys;\n if (original === true) {\n // set 合并去重\n ids = Array.from(new Set([...state.selectRowIds, ...selectedRowKeys]));\n }\n setState({\n selectRowIds: ids,\n });\n },\n /** 设置选中列数据[{}] */\n setRowSelectedBy: (data) => {\n setState({\n selectRowArray: data,\n });\n },\n /** 获取表格选中的id */\n getSelectIds: () => state.selectRowIds,\n /** 清空表格选中 */\n clearSelectIds: () => {\n setState({\n selectRowIds: [],\n selectRowArray: [],\n });\n },\n /** 获取表格选中的数组对象 */\n getSelectRowsArray: () => {\n const data = filterSelectRows(state.listData);\n return _.cloneDeep(keyOriginPlace(state.selectRowArray, data));\n },\n /** 移除表格选中的id和项 */\n removeSelectIds: (ids) => {\n if (!Array.isArray(ids) || ids.length === 0) return;\n const filterByIds = (array: any[], keyName: string) => {\n return array.filter((item) => {\n return typeof item === 'string' ? !ids.includes(item) : !ids.includes(item[keyName]);\n });\n };\n setState({\n selectRowIds: filterByIds(state.selectRowIds, key),\n selectRowArray: filterByIds(state.selectRowArray, key),\n });\n },\n /** 获取表格所有数据 */\n getStaticDataList: () => {\n try {\n return _.cloneDeep(state.listData || []);\n } catch (error) {\n console.error('error', error);\n return [];\n }\n },\n /** 设置表格静态数据 */\n setStaticDataList: (row, callback) => {\n if (!row) {\n return;\n }\n try {\n if (typeof row === 'object' && !Array.isArray(row)) {\n const data = row as AnyObjectType;\n setState((prev) => {\n prev.listData = state.listData.map((item) => {\n if (item[key] === data[key]) {\n return { ...item, ...data }; // 创建新对象\n }\n return item;\n });\n return prev;\n });\n } else if (Array.isArray(row)) {\n setState((prev) => {\n prev.listData = _.cloneDeep(row) as AnyObjectType[];\n return prev;\n });\n }\n\n if (callback) {\n callback();\n }\n } catch (error) {\n console.error('error', error);\n }\n },\n }));\n\n return (\n <ConfigProvider>\n <DndWrap>\n <Table\n bordered\n rowKey=\"id\"\n rowClassName=\"editable-row\"\n virtual={extraProps.virtual?.open}\n loading={listLoading}\n components={components}\n onRow={moveChange}\n columns={formatColumns}\n dataSource={state.listData}\n rowSelection={extraProps.rowType ? rowSelection : undefined}\n pagination={paginationConfig}\n onChange={paginationChange}\n scroll={scrollXY}\n {...extraProps.tableConfig}\n />\n </DndWrap>\n </ConfigProvider>\n );\n};\n\n// 当 props 未变化时跳过重渲染\nconst areEqual = (prev: GenerateTableProp, next: GenerateTableProp) => {\n const p = prev.extra || {};\n const n = next.extra || {};\n\n // 先对函数字段做引用比较\n const funcsEqual =\n p.apiMethod === n.apiMethod &&\n p.onSelect === n.onSelect &&\n p.drag?.moveRow === n.drag?.moveRow &&\n p.getCheckboxProps === n.getCheckboxProps &&\n p.resultFilter === n.resultFilter &&\n p.getTableSuccessData === n.getTableSuccessData;\n\n if (!funcsEqual) return false;\n\n // 构造去除函数字段后的对象进行深比较\n const stripFuncs = (o: GenerateTableProp['extra']) => {\n if (!o) return o;\n const {\n apiMethod,\n onSelect,\n drag,\n getCheckboxProps,\n resultFilter,\n getTableSuccessData,\n ...rest\n } = o;\n // 保留 drag.open 但去除 drag.moveRow\n const restDrag = drag ? { ...drag, moveRow: undefined } : undefined;\n return { ...rest, drag: restDrag } as any;\n };\n\n try {\n return _.isEqual(stripFuncs(p), stripFuncs(n));\n } catch (e) {\n return stripFuncs(p) === stripFuncs(n);\n }\n};\n\nexport default memo(forwardRef(GenerateTable), areEqual);\n","/*\n * 空内容组件\n */\nimport React from 'react';\nimport { Empty as Em, Row } from 'antd';\nimport type { EmptyProps } from 'antd/es/empty';\nimport './index.less';\n\ntype Props = EmptyProps & {\n /** 区域高度 */\n outerHeight?: number;\n};\n\n/**\n * 空内容组件\n */\nconst Empty = (props?: Props) => {\n const params: Props = { ...props };\n delete params.outerHeight;\n\n return (\n <Row\n className=\"empty-wrap\"\n style={{\n minHeight: props && props.outerHeight ? props.outerHeight : 400,\n }}\n align=\"middle\"\n justify=\"center\"\n >\n <Em description=\"暂无数据\" {...params} />\n </Row>\n );\n};\n\nexport default Empty;\n","import React, {\n useRef,\n useEffect,\n useMemo,\n useCallback,\n useImperativeHandle,\n forwardRef,\n} from 'react';\nimport dayjs from 'dayjs';\nimport _ from 'lodash';\nimport { Row, Col, Space, Button, Card, Typography, message } from 'antd';\nimport type { RowProps } from 'antd/es/row';\nimport type { ColProps } from 'antd/es/col';\nimport type { ModalProps } from 'antd/es/modal';\nimport { TableProps } from 'antd/es/table';\nimport { FormProps } from 'antd/es/form';\nimport GenerateForm, { FormListType, FormCallType } from '../GenerateForm';\nimport GenerateTable, {\n TableCallType,\n GenerateTableProp,\n TableColumns,\n getTableListQueryType,\n} from '../GenerateTable';\nimport Dialog from '../Dialog';\nimport Empty from '../Empty';\nimport hooks from '../brother/hooks';\nimport { dropDownMenuPushAll } from '../brother/utils';\nimport { AnyObjectType, PromiseAxiosResultType } from '../brother/typings';\nimport './index.less';\n\nexport type LayoutTableModalCallType = TableCallType &\n FormCallType & {\n setSavaLoading: (data: boolean) => void;\n };\n\nexport interface SizeType {\n xs?: number; // 屏幕 < 576px 响应式栅格\n sm?: number; // 屏幕 ≥ 576px 响应式栅格\n md?: number; // 屏幕 ≥ 768px 响应式栅格\n lg?: number; // 屏幕 ≥ 992px 响应式栅格\n xl?: number; // 屏幕 ≥ 1200px 响应式栅格\n xxl?: number; // 屏幕 ≥ 1600px 响应式栅格\n}\n\nexport interface LayoutTableModalPropType {\n /** 打开或关闭 */\n visible: boolean;\n /** 弹窗标题 */\n title: React.ReactNode;\n /** 弹窗宽度 */\n width?: number;\n /** 自定义modal配置 */\n modalConfig?: ModalProps;\n /** 头部渲染额外元素 */\n topExtra?: React.ReactNode;\n /** 搜索表单数据 */\n searchFormList?: FormListType[];\n /** 表单方法 */\n formConfig?: FormProps;\n /** 查询时是否清除选中项 */\n clearSelectIds?: getTableListQueryType['clearSelectIds'];\n /** rowType=checkbox多选 radio单选 list=表格头 tableConfig=自定义配置,支持antd官方表格所有参数*/\n tableColumnsList: {\n /** checkbox多选 radio单选 */\n rowType?: 'checkbox' | 'radio' | undefined;\n /** 表格头 */\n list: TableColumns[];\n /** 自定义配置,支持antd官方表格所有参数 */\n tableConfig?: TableProps<any>;\n };\n /** 是否开启默认查询功能 */\n autoGetList?: boolean;\n /** 查询回调 */\n searchCallback?: (data: any) => Promise<boolean>;\n /** 不需要重置的表单字段 */\n searchNoResetFiled?: string[];\n /** 列表请求函数 */\n apiMethod?: (data: any) => PromiseAxiosResultType;\n /** 查询表单手动参数转换 */\n manualParameterChange?: (params: AnyObjectType) => AnyObjectType;\n /** 静态表格数据 */\n data?: AnyObjectType[];\n /** 已选列表 */\n openSelected?: {\n /** 是否打开 */\n visible: boolean;\n /** 默认已选中 */\n defaultValues?: AnyObjectType[];\n /** 显示的字段名 */\n fileName?: string;\n /** 内容区域高度 */\n height?: number;\n };\n /** 虚拟滚动功能 */\n virtual?: GenerateTableProp['extra']['virtual'];\n /** 排列方式布局Row */\n rowProps?: RowProps;\n /** 主内容Col */\n colProps?: ColProps;\n /** 左边插槽 */\n leftSlot?: {\n colProps: ColProps;\n jsx: React.ReactNode;\n };\n /** 右边插槽 */\n rightSlot?: {\n colProps: ColProps;\n jsx: React.ReactNode;\n };\n /** 右侧导出 */\n rightExport?: {\n /** 导出 */\n open: boolean;\n /** 文件名 */\n fileName: string;\n /** 表头配置 */\n headres: { key: string; title: string }[];\n };\n /** 数据调用成功回调 */\n getTableSuccessData?: (data: AnyObjectType) => void;\n /** 行选中回调 */\n onSelect?: GenerateTableProp['extra']['onSelect'];\n /** 关闭弹窗回调 */\n onCancel?: () => void;\n /** 确定弹窗回调 */\n onConfirm?: (\n rows: AnyObjectType[],\n ids: string[],\n tableList: AnyObjectType[],\n ) => Promise<boolean>;\n}\n\ninterface StateType {\n /** 保存按钮loading */\n saveLoading: boolean;\n /** 已选中列表 */\n selectedRows: AnyObjectType[];\n}\n\nconst { Link, Paragraph } = Typography;\n\n/** 弹窗表格组件,常用来选择数据 */\nfunction LayoutTableModal(props: LayoutTableModalPropType, ref: any) {\n const searchFormRef = useRef<FormCallType>(null);\n const tableRef = useRef<TableCallType>();\n const [state, setState] = hooks.useSetState<StateType>({\n saveLoading: false,\n selectedRows: [],\n });\n\n /**\n * @description table rowKey\n * @author bihongbin\n * @param {*}\n * @return {*}\n * @Date 2022-03-01 10:01:40\n */\n const rowKey = useMemo(\n () =>\n ((props.tableColumnsList &&\n props.tableColumnsList.tableConfig &&\n props.tableColumnsList.tableConfig.rowKey) ||\n 'id') as string,\n [props.tableColumnsList],\n );\n\n /**\n * @Description 搜索表单宽度\n * @Author bihongbin\n * @Date 2021-09-17 17:50:34\n * @param {*} useMemo\n */\n const colGirdWidth = useMemo(() => {\n const width = props.width || 0;\n if (width >= 500 && width <= 800) {\n return {\n span: 7,\n };\n }\n if (width > 800 && width <= 1000) {\n return {\n span: 6,\n };\n } else if (width > 1000 && width <= 1200) {\n return {\n span: 5,\n };\n } else if (width > 1200) {\n return {\n span: 4,\n };\n } else {\n return {\n span: 8,\n };\n }\n }, [props.width]);\n\n /**\n * 将数据导出为Excel文件(CSV格式)\n * @param {Array} data - 要导出的数据数组,每个元素是一个对象\n * @param {Array} headers - 表头配置,格式如[{key: 'name', title: '姓名'}, ...]\n * @param {string} fileName - 导出的文件名(不含扩展名)\n */\n const exportToExcel = () => {\n const fileName = props.rightExport?.fileName;\n const headers = props.rightExport?.headres;\n const data = state.selectedRows;\n\n if (data && data.length && headers && headers.length) {\n // 构建CSV内容\n let csvContent = '';\n\n // 添加表头\n const headerTitles = headers.map((header) => header.title);\n csvContent += headerTitles.join(',') + '\\n';\n\n // 添加数据行\n data.forEach((row) => {\n const rowData = headers.map((header) => {\n const value = row[header.key] !== undefined ? row[header.key] : '';\n // 处理包含逗号、引号或换行符的内容\n return `\"${String(value).replace(/\"/g, '\"\"')}\"`;\n });\n csvContent += rowData.join(',') + '\\n';\n });\n\n // 创建Blob对象\n const blob = new Blob(['\\uFEFF' + csvContent], {\n type: 'text/csv;charset=utf-8;',\n });\n\n // 创建下载链接\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n\n link.setAttribute('href', url);\n link.setAttribute('download', `${fileName}.csv`);\n link.style.visibility = 'hidden';\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else {\n message.warning('请选择导出数据', 1.5);\n }\n };\n\n /**\n * @description 移除已选列表项\n * @author bihongbin\n * @param {*} type all全部移除 odd单个移除\n * @param {AnyObjectType} item\n * @return {*}\n * @Date 2022-03-01 15:12:17\n */\n const onRemoveCol = (type: 'all' | 'odd', item?: AnyObjectType) => {\n if (tableRef.current) {\n let removeIds: string[] = [];\n let removeRows: AnyObjectType[] = [];\n if (type === 'all') {\n tableRef.current.clearSelectIds();\n }\n if (type === 'odd' && item) {\n removeIds = [item[rowKey]];\n removeRows = state.selectedRows.filter((rows) => rows[rowKey] !== item[rowKey]);\n tableRef.current.removeSelectIds(removeIds);\n }\n setState({\n selectedRows: removeRows,\n });\n }\n };\n\n /**\n * @description table-checkbox-onChange\n * @author bihongbin\n * @param {*}\n * @return {*}\n * @Date 2022-03-01 11:28:31\n */\n const onCheckChange = (selectedRows: AnyObjectType[], selectedRowKeys: string[]) => {\n setState({\n selectedRows: selectedRowKeys.map((key) => {\n let row: AnyObjectType = {};\n const currentSelected = selectedRows.find((t) => t[rowKey] === key);\n\n row[rowKey] = key;\n\n if (props.openSelected && props.openSelected.fileName) {\n row[props.openSelected.fileName] = key;\n }\n\n if (currentSelected) {\n row = currentSelected;\n }\n\n if (props.openSelected) {\n const fileName = props.openSelected.fileName;\n const defaultValues = props.openSelected.defaultValues;\n if (fileName) {\n if (defaultValues) {\n const find = defaultValues.find((t) => t[rowKey] === key);\n if (find) {\n row[fileName] = find[fileName];\n }\n }\n }\n }\n\n return row;\n }),\n });\n };\n\n /**\n * @Description 查询\n * @Author bihongbin\n * @Date 2021-03-05 09:52:56\n */\n const formSubmit = useCallback(async () => {\n if (searchFormRef.current && tableRef.current) {\n let result = await searchFormRef.current.formSubmit();\n if (result && Object.keys(result).length) {\n // 时间格式转换\n for (let o in result) {\n const formatStr = 'YYYY-MM-DD HH:mm:ss';\n if (dayjs(result[o], formatStr, true).isValid()) {\n result[o] = dayjs(result[o]).format(formatStr);\n }\n }\n result = {\n clearSelectIds: true,\n ...result,\n };\n if (props.clearSelectIds !== undefined) {\n result.clearSelectIds = props.clearSelectIds;\n }\n if (result.clearSelectIds) {\n setState((prev) => {\n // 清空选中\n prev.selectedRows = [];\n return prev;\n });\n }\n // 从父级手动转换参数\n if (props.manualParameterChange) {\n result = props.manualParameterChange(result);\n }\n if (props.searchCallback) {\n // 查询回调\n props.searchCallback(result).then((res) => {\n if (res) {\n tableRef.current?.getTableList(result);\n }\n });\n } else {\n tableRef.current.getTableList(result);\n }\n }\n } else {\n tableRef.current?.getTableList();\n }\n }, [props, setState]);\n\n /**\n *\n * @Description 重置\n * @Author bihongbin\n * @Date 2020-07-31 10:27:40\n */\n const formReset = () => {\n if (searchFormRef.current) {\n let fileName: string[] = [];\n const searchNoResetFiled = props.searchNoResetFiled || [];\n\n if (props.searchFormList) {\n for (let n of props.searchFormList) {\n // 处理表单嵌套的情况\n if (n.unionConfig) {\n for (let k of n.unionConfig.unionItems) {\n // 找出禁止重置的字段\n if (k.name && !searchNoResetFiled.includes(k.name)) {\n fileName.push(k.name);\n }\n }\n }\n // 找出禁止重置的字段\n if (n.name && !searchNoResetFiled.includes(n.name)) {\n fileName.push(n.name);\n }\n }\n }\n\n searchFormRef.current.formReset(fileName);\n }\n formSubmit();\n };\n\n /**\n * @Description 确定\n * @Author bihongbin\n * @Date 2020-08-07 13:48:41\n */\n const handleConfirm = () => {\n let rows: AnyObjectType[] = tableRef.current?.getSelectRowsArray() || [];\n let ids: string[] = [];\n const tableList = tableRef.current?.getStaticDataList() || [];\n\n if (props.onConfirm) {\n if (tableRef.current) {\n ids = tableRef.current.getSelectIds();\n }\n setState({\n saveLoading: true,\n });\n props\n .onConfirm(rows, ids, tableList)\n .then((res) => {\n setState({\n saveLoading: false,\n });\n if (res) {\n setTimeout(() => {\n props.onCancel && props.onCancel();\n }, 100);\n }\n })\n .catch((err) => {\n setState({\n saveLoading: false,\n });\n message.warning(err, 1.5);\n });\n }\n };\n\n /**\n * @Description 开启默认查询功能\n * @Author bihongbin\n * @Date 2020-08-05 14:09:53\n */\n useEffect(() => {\n if (props.visible) {\n if (props.autoGetList) {\n tableRef.current?.getTableList();\n }\n if (props.openSelected && props.openSelected.visible) {\n setState((prev) => {\n prev.selectedRows = props.openSelected?.defaultValues || [];\n tableRef.current?.setRowSelectedBy(prev.selectedRows);\n tableRef.current?.setRowSelected(prev.selectedRows.map((item) => item[rowKey]));\n return prev;\n });\n }\n }\n }, [props.autoGetList, props.openSelected, props.visible, rowKey, setState]);\n\n // 暴漏给父组件调用\n useImperativeHandle<any, LayoutTableModalCallType>(ref, () => ({\n // 搜索表单方法\n ...(searchFormRef.current as FormCallType),\n // 表格实例对象方法\n ...(tableRef.current as TableCallType),\n /** 设置保存loading */\n setSavaLoading: (data) => {\n setState({\n saveLoading: data,\n });\n },\n }));\n\n return (\n <Dialog\n className=\"from-table-modal\"\n forceRender\n maskClosable={false}\n footer={null}\n width={props.width}\n visible={props.visible}\n title={props.title || '弹窗'}\n onCancel={() => {\n props.onCancel && props.onCancel();\n }}\n {...props.modalConfig}\n >\n {props.topExtra}\n {props.searchFormList ? (\n <GenerateForm\n ref={searchFormRef}\n rowGridConfig={{ gutter: 10 }}\n colGirdConfig={colGirdWidth}\n list={dropDownMenuPushAll(props.searchFormList)}\n formConfig={props.formConfig}\n render={() => {\n if (props.searchFormList && props.searchFormList.length) {\n return (\n <Space size={10}>\n <Button\n type=\"primary\"\n onClick={() => {\n formSubmit();\n }}\n >\n 查询\n </Button>\n <Button className=\"btn-reset\" onClick={formReset}>\n 重置\n </Button>\n </Space>\n );\n }\n return <></>;\n }}\n />\n ) : null}\n <Row {...props.rowProps}>\n {props.leftSlot ? <Col {...props.leftSlot.colProps}>{props.leftSlot.jsx}</Col> : null}\n <Col span={24} {...props.colProps}>\n <Row gutter={10}>\n <Col span={props.openSelected && props.openSelected.visible ? 16 : 24}>\n <GenerateTable\n ref={tableRef}\n extra={{\n rowType: props.tableColumnsList.rowType,\n apiMethod: props.apiMethod,\n columns: props.tableColumnsList.list,\n data: props.data,\n onSelect: (selectedRows, selectedRowKeys) => {\n onCheckChange(selectedRows, selectedRowKeys);\n props.onSelect && props.onSelect(selectedRows, selectedRowKeys);\n },\n virtual: props.virtual,\n getTableSuccessData: props.getTableSuccessData,\n scroll: {\n x: props.virtual?.open ? undefined : 'max-content',\n },\n tableConfig: props.tableColumnsList.tableConfig,\n }}\n />\n </Col>\n {props.openSelected && props.openSelected.visible ? (\n <Col span={8}>\n <Card\n title=\"已选列表\"\n size=\"small\"\n styles={{\n body: {\n height: props.openSelected.height || 330,\n overflowY: 'auto',\n },\n }}\n extra={\n <>\n {props.rightExport && props.rightExport.open ? (\n <Link style={{ marginRight: '8px' }} onClick={() => exportToExcel()}>\n 导出\n </Link>\n ) : null}\n <Link onClick={() => onRemoveCol('all')}>全部移除</Link>\n </>\n }\n >\n {state.selectedRows.length ? (\n state.selectedRows.map((item) => {\n const key = rowKey;\n const id = item[key];\n const title = item[props.openSelected?.fileName as string];\n return (\n <Row key={id} gutter={12}>\n <Col span={11} title={title}>\n <Paragraph ellipsis>{title}</Paragraph>\n </Col>\n <Col span={8} title={id}>\n <Paragraph ellipsis>{id}</Paragraph>\n </Col>\n <Col span={5}>\n <Link onClick={() => onRemoveCol('odd', item)}>移除</Link>\n </Col>\n </Row>\n );\n })\n ) : (\n <Empty outerHeight={200} />\n )}\n </Card>\n </Col>\n ) : null}\n </Row>\n </Col>\n {props.rightSlot ? <Col {...props.rightSlot.colProps}>{props.rightSlot.jsx}</Col> : null}\n </Row>\n <Row className=\"from-table-modal-foot\" justify=\"center\">\n <Col>\n <Space size={20}>\n {props.onCancel ? (\n <Button onClick={() => props.onCancel && props.onCancel()}>关闭</Button>\n ) : null}\n {props.onConfirm ? (\n <Button type=\"primary\" loading={state.saveLoading} onClick={handleConfirm}>\n 确定\n </Button>\n ) : null}\n </Space>\n </Col>\n </Row>\n </Dialog>\n );\n}\n\nexport default forwardRef(LayoutTableModal);\n","import React, { useRef, useMemo, useEffect, useCallback } from 'react';\nimport { Row, Col, message } from 'antd';\nimport dayjs from 'dayjs';\nimport { LeftCircleFilled, RightCircleFilled } from '@ant-design/icons';\nimport GenerateForm, { FormCallType, FormListType } from '../GenerateForm';\nimport hooks from '../brother/hooks';\nimport Dialog from '../Dialog';\nimport { AjaxResultType, AnyObjectType, PromiseAxiosResultType } from '../brother/typings';\nimport './index.less';\n\nexport interface QuicklyProcessTypes {\n /** 打开或关闭 */\n visible: boolean;\n id?: string | null | undefined;\n /** 弹窗标题 */\n title?: string | null | undefined;\n /** 弹窗宽度 */\n width?: number;\n /** 需要转换成时间格式的参数 */\n transformTime?: string[];\n /** 处理数据 */\n data: AnyObjectType[];\n /** 表单数据 */\n formList: FormListType[];\n /** 分页请求的额外参数 */\n methodParams?: AnyObjectType;\n /** 分页列表请求函数 */\n apiMethod?: (data: any) => PromiseAxiosResultType;\n /** 提交表单的接口 */\n submitApi: (data: any, method: 'put' | 'post') => Promise<AjaxResultType>;\n /** 上一页下一页切换回调 */\n onChange?: (data: AnyObjectType, pageObj?: AnyObjectType) => void;\n /** 关闭弹窗回调 */\n onCancel?: (pageObj?: AnyObjectType) => void;\n}\n\ninterface StateType {\n id: QuicklyProcessTypes['id'];\n saveLoading: boolean;\n data: QuicklyProcessTypes['data'];\n}\n\n/** 批量编辑,用来编辑表格列表数据 */\nconst QuicklyProcessForms = (props: QuicklyProcessTypes) => {\n const formRef = useRef<FormCallType>(); // 表单实例\n const queryPagination = useRef<AnyObjectType>({\n page: 1, // 当前第几页\n pages: 1, // 总共多少条\n size: 10, // 每页显示多少条数据\\\n });\n const [state, setState] = hooks.useSetState<StateType>({\n id: undefined,\n saveLoading: false,\n data: [],\n });\n\n // 左右操作按钮样式\n const leftRightStyle = {\n fontSize: 24,\n };\n\n /**\n * @Description 转换json里面的时间\n * @Author yanwen\n * @Date 2021-01-06 16:27:58\n */\n const transformTime = useCallback(\n (data: QuicklyProcessTypes['data'], timeArray: QuicklyProcessTypes['transformTime']) => {\n return data.map((item) => {\n if (timeArray) {\n for (let date of timeArray) {\n if (item[date]) {\n item[date] = dayjs(item[date]);\n }\n }\n }\n return item;\n });\n },\n [],\n );\n\n /**\n * @Description 获取分页数据\n * @Author yanwen\n * @Date 2021-01-06 16:36:20\n * @param {*} useCallback\n */\n const getList = useCallback(\n async (type?: 'up' | 'down') => {\n if (props.apiMethod) {\n try {\n let id = '';\n const result = await props.apiMethod(queryPagination.current);\n console.log(\n 'getList useCallback',\n result,\n 'queryPagination.current',\n queryPagination.current,\n );\n const list = result.data.content;\n queryPagination.current.pages = result.data.pages;\n // 上一页\n if (type === 'up') {\n id = list[list.length - 1].id;\n }\n // 下一页\n if (type === 'down') {\n id = list[0].id;\n }\n setState({\n id: id ? id : props.id,\n data: list,\n });\n } catch (error) {\n console.error(error);\n }\n }\n },\n [props, setState],\n );\n\n /**\n * @Description 根据当前id找到数组对应的索引\n * @Author bihongbin\n * @Date 2020-11-29 11:00:13\n */\n const currentIndex = useMemo(() => {\n let k = 0;\n for (let [index, item] of state.data.entries()) {\n if (item.id === state.id) {\n k = index;\n break;\n }\n }\n return k;\n }, [state.data, state.id]);\n\n /**\n * @Description 保存\n * @Author bihongbin\n * @Date 2021-01-15 17:41:38\n */\n // const save = useCallback(async () => {\n // if (formRef.current) {\n // const formResult = await formRef.current.formSubmit();\n // formResult.id = state.data[currentIndex].id;\n // setState({\n // saveLoading: true,\n // });\n // try {\n // props.submitApi(formResult, 'put');\n // message.success('保存成功', 1.5);\n // } catch (error) {}\n // setState({\n // saveLoading: false,\n // });\n // }\n // }, [currentIndex, props, setState, state.data]);\n\n /**\n * @Description 上一页\n * @Author bihongbin\n * @Date 2020-11-29 10:57:43\n */\n const prev = useCallback(async () => {\n if (props.apiMethod) {\n // 第一页,第一条\n if (queryPagination.current.page === 1 && currentIndex === 0) {\n message.destroy();\n message.warning('已经是第一页啦~', 1.5);\n return;\n }\n // 第一页第一条以外的数据\n if (currentIndex - 1 < 0) {\n queryPagination.current.page = queryPagination.current.page - 1;\n getList('up');\n if (props.onChange) {\n props.onChange(state.data[currentIndex], queryPagination.current);\n }\n return;\n }\n } else {\n if (currentIndex === 0) {\n message.destroy();\n message.warning('已经是第一个啦~', 1.5);\n return;\n }\n }\n if (formRef.current) {\n const formResult = await formRef.current.formSubmit();\n if (formResult) {\n formResult.id = state.data[currentIndex].id;\n try {\n const cutIndexObj = state.data[currentIndex - 1];\n console.log('cutIndexObj', cutIndexObj);\n props.submitApi(formResult, 'put');\n // 回调\n if (props.onChange) {\n props.onChange(cutIndexObj, queryPagination.current);\n }\n setState((prev) => {\n prev.id = cutIndexObj.id;\n prev.data[currentIndex] = {\n ...prev.data[currentIndex],\n ...formResult,\n };\n return prev;\n });\n } catch (error) {\n console.error(error);\n }\n }\n }\n }, [currentIndex, getList, props, setState, state.data]);\n\n /**\n * @Description 下一页\n * @Author bihongbin\n * @Date 2020-11-29 10:57:58\n */\n const next = useCallback(async () => {\n if (props.apiMethod) {\n // 最后一页 最后最一页最后一条数据\n if (\n queryPagination.current.page === queryPagination.current.pages &&\n currentIndex === state.data.length - 1\n ) {\n message.destroy();\n message.warning('已经是最后一页啦~', 1.5);\n return;\n }\n // 本页最后一条\n if (currentIndex + 1 >= state.data.length) {\n queryPagination.current.page = queryPagination.current.page + 1;\n getList('down');\n // 回调\n if (props.onChange) {\n props.onChange(state.data[currentIndex], queryPagination.current);\n }\n return;\n }\n } else {\n if (state.data.length === 0 || currentIndex === state.data.length - 1) {\n message.destroy();\n message.warning('已经是最后一个啦~', 1.5);\n return;\n }\n }\n if (formRef.current) {\n const formResult = await formRef.current.formSubmit();\n if (formResult) {\n formResult.id = state.data[currentIndex].id;\n try {\n const plusIndexObj = state.data[currentIndex + 1];\n console.log('cutIndexObj', plusIndexObj);\n props.submitApi(formResult, 'put');\n // 回调\n if (props.onChange) {\n props.onChange(plusIndexObj, queryPagination.current);\n }\n // if (props.onCancel) {\n // props.onCancel(queryPagination.current)\n // }\n setState((prev) => {\n prev.id = plusIndexObj.id;\n prev.data[currentIndex] = {\n ...prev.data[currentIndex],\n ...formResult,\n };\n return prev;\n });\n } catch (error) {\n console.error(error);\n }\n }\n }\n }, [currentIndex, getList, props, setState, state.data]);\n\n /**\n * @Description 键盘按下\n * @Author bihongbin\n * @Date 2020-11-29 14:07:47\n */\n const keyDown = useCallback(\n async (e: KeyboardEvent) => {\n // 上一页\n if (e.key === 'PageUp') {\n prev();\n e.preventDefault();\n }\n // 下一页\n if (e.key === 'PageDown') {\n next();\n e.preventDefault();\n }\n // 回车\n if (e.key === 'Enter') {\n if (formRef.current) {\n const formResult = await formRef.current.formSubmit();\n formResult.id = state.data[currentIndex].id;\n try {\n props.submitApi(formResult, 'put');\n message.success('保存成功', 1.5);\n } catch (error) {\n console.error(error);\n }\n }\n }\n },\n [currentIndex, next, prev, props, state.data],\n );\n\n const HandleRequestParam = useCallback(async () => {\n if (props.methodParams) {\n let arr = ['page', 'pages', 'size'];\n let obj: AnyObjectType = {};\n let param = await props.methodParams;\n for (let i in queryPagination.current) {\n for (let r of arr) {\n if (i === r) {\n obj[r] = queryPagination.current[i];\n }\n }\n }\n\n obj = {\n ...obj,\n ...param,\n };\n obj.page = param.page ? param.page.current : 1;\n queryPagination.current = obj;\n }\n }, [props.methodParams]);\n\n /**\n * @Description 设置表单数据\n * @Author bihongbin\n * @Date 2020-11-29 11:55:48\n */\n useEffect(() => {\n if (props.visible) {\n setTimeout(() => {\n if (formRef.current) {\n formRef.current.setFormValues(state.data[currentIndex]);\n }\n }, 100);\n }\n }, [currentIndex, props.visible, state.data]);\n\n /**\n * @Description 如果表单参数用到时间选择组件,需要转换成dayjs对象\n * @Author bihongbin\n * @Date 2020-11-29 13:59:25\n */\n useEffect(() => {\n if (props.visible) {\n if (props.apiMethod) {\n HandleRequestParam().then(() => {\n getList();\n });\n } else {\n setState({\n id: props.id,\n data: transformTime(props.data, props.transformTime),\n });\n }\n }\n }, [\n HandleRequestParam,\n getList,\n props.apiMethod,\n props.data,\n props.id,\n props.transformTime,\n props.visible,\n setState,\n transformTime,\n ]);\n\n /**\n * @Description 键盘事件监听和移除\n * @Author bihongbin\n * @Date 2020-11-29 14:01:41\n */\n useEffect(() => {\n if (props.visible) {\n document.addEventListener('keydown', keyDown);\n } else {\n document.removeEventListener('keydown', keyDown);\n }\n return () => {\n document.removeEventListener('keydown', keyDown);\n };\n }, [keyDown, props.visible]);\n\n return (\n <Dialog\n className=\"quickly-form-modal\"\n width={props.width ? props.width : 960}\n visible={props.visible}\n title={props.title || '快速编辑信息'}\n onCancel={() => {\n props.onCancel && props.onCancel(queryPagination.current);\n }}\n maskClosable={false}\n destroyOnHidden\n footer={null}\n >\n <Row className=\"modal-form-height\" gutter={16} align=\"middle\" wrap={false}>\n <Col flex=\"60px\">\n <Row justify=\"center\">\n <Col>\n <LeftCircleFilled className=\"circle-filled\" style={leftRightStyle} onClick={prev} />\n </Col>\n </Row>\n </Col>\n <Col flex=\"auto\">\n <GenerateForm\n ref={formRef}\n formConfig={{\n labelCol: { span: 24 },\n }}\n rowGridConfig={{ gutter: [20, 0] }}\n colGirdConfig={{ span: 6 }}\n list={props.formList}\n />\n </Col>\n <Col flex=\"60px\">\n <Row justify=\"center\">\n <Col>\n <RightCircleFilled className=\"circle-filled\" style={leftRightStyle} onClick={next} />\n </Col>\n </Row>\n </Col>\n </Row>\n {/* <Row className=\"quickly-form-modal-foot\" justify=\"center\">\n <Col>\n <Space size={20}>\n <Button onClick={() => props.onCancel && props.onCancel()}>取消</Button>\n <Button type=\"primary\" loading={state.saveLoading} onClick={save}>\n 提交\n </Button>\n </Space>\n </Col>\n </Row> */}\n </Dialog>\n );\n};\n\nexport default QuicklyProcessForms;\n","import React, { useRef, useEffect, useImperativeHandle, forwardRef } from 'react';\nimport { Spin, Row, Col, Button, Space, message } from 'antd';\nimport { ButtonProps } from 'antd/es/button';\nimport dayjs from 'dayjs';\nimport _ from 'lodash';\nimport type { FormInstance } from 'antd/es/form';\nimport { FormProps } from 'antd/es/form';\nimport { ColProps } from 'antd/es/col';\nimport GenerateForm, { FormCallType, FormListType } from '../GenerateForm';\nimport hooks from '../brother/hooks';\nimport Dialog from '../Dialog';\nimport { AnyObjectType, SubmitApiType } from '../brother/typings';\nimport './index.less';\n\ntype NamePath = any;\n\nexport interface LayoutFormPropTypes {\n /** 类名 */\n className?: string;\n /** 打开或关闭 */\n visible: boolean;\n /** 表单是否禁用 */\n disable?: boolean;\n id?: string | null | undefined;\n /** 弹窗标题 */\n title: string | React.ReactNode | null | undefined;\n /** 弹窗宽度 */\n width?: number;\n\n /** 表单弹窗头部显示的额外dom元素 */\n topRender?: React.ReactElement;\n /** 组件子元素插槽 */\n children?: React.ReactNode;\n /** 底部操作按钮自定义HTML */\n footer?: React.ReactNode;\n /** 底部操作按钮自定义Array */\n footBtnList?: {\n model: 'new' | 'before' | 'after';\n data: ButtonProps[];\n };\n\n /** 手动参数转换 */\n manualParameterChange?: (params: AnyObjectType) => AnyObjectType;\n /** 手动验证表单 */\n manualVerification?: (params: AnyObjectType) => boolean;\n /** 提交表单需要移除的参数 */\n submitRemoveField?: string[];\n /** 需要提交表单的额外参数 */\n submitExtraParameters?: AnyObjectType;\n /** 开关组件值转换成0和1 */\n switchTransform?: string[];\n\n /** 提交表单的接口 */\n submitApi?: SubmitApiType;\n /** 关闭弹窗回调 */\n onCancel?: () => void;\n /** 确定或保存回调,返回false会阻止关闭 */\n onConfirm?: (data: AnyObjectType) => void | boolean | Promise<void | boolean>;\n /** 表单数据 */\n formList: FormListType[];\n /** 表单每行显示的数量 */\n colGirdConfig?: ColProps;\n /** 支持antd Form组件官方传参所有类型 */\n formConfig?: FormProps;\n}\n\n// 导出该组件可调用的方法类型\nexport interface LayoutFormModalCallType {\n /** 设置loading */\n setFormLoading: (data: boolean) => void;\n /** 设置保存loading */\n setFormSaveLoading: (data: boolean) => void;\n /** 设置一组字段状态 */\n setFormFields: FormInstance['setFields'];\n /** 读取表单值 */\n getFormValues: (data: string[]) => AnyObjectType | undefined;\n /** 设置表单值 */\n setFormValues: (values: AnyObjectType) => void;\n /** 排除指定表单后提交 */\n excludeFormSubmitValues: (nameList?: NamePath[]) => Promise<AnyObjectType | undefined>;\n /** 提交表单并验证 */\n getFormSubmitValues: (nameList?: NamePath[]) => Promise<AnyObjectType | undefined>;\n}\n\nexport type LayoutFormModalListType = FormListType;\n\ninterface StateType {\n loading: boolean;\n saveLoading: boolean;\n disabled: boolean;\n}\n\n/** 弹窗表单组件,支持多种表单类型,手动提交(设置onConfirm)和自动提交(设置submitApi)参数至服务器 */\nconst LayoutFormModal = (props: LayoutFormPropTypes, ref: any) => {\n const formRef = useRef<FormCallType>(); // 表单实例\n const [state, setState] = hooks.useSetState<StateType>({\n loading: false, // loading\n saveLoading: false, // 保存按钮loading\n disabled: false, // 表单是否可编辑,当不可编辑不能显示保存按钮\n });\n\n /**\n * @description Footer渲染\n * @author bihongbin\n * @return {*}\n * @Date 2023-04-13 11:53:45\n */\n const footerRender = () => {\n const initBtn = (() => {\n const buttons = [\n <Button onClick={() => props.onCancel && props.onCancel()} key={-1}>\n 关闭\n </Button>,\n ];\n if (!state.disabled) {\n buttons.push(\n <Button type=\"primary\" loading={state.saveLoading} onClick={formSubmit} key={-2}>\n 提交\n </Button>,\n );\n }\n return buttons;\n })();\n const row = (children: React.ReactNode) => {\n return (\n <Row className=\"form-modal-foot\" justify=\"center\">\n <Col>\n <Space size={20}>{children}</Space>\n </Col>\n </Row>\n );\n };\n if (props.footer) {\n return props.footer;\n }\n if (props.footBtnList) {\n const { model, data } = props.footBtnList;\n const laterBtn = data.map((item, index) => {\n const { children, ...rest } = item;\n return (\n <Button {...rest} key={index}>\n {children}\n </Button>\n );\n });\n if (model === 'new') {\n return row(laterBtn);\n }\n if (model === 'before') {\n return row([...laterBtn, ...initBtn]);\n }\n if (model === 'after') {\n return row([...initBtn, ...laterBtn]);\n }\n }\n return row(initBtn);\n };\n\n /**\n * @Description 提交表单\n * @Author bihongbin\n * @Date 2020-08-01 15:38:26\n */\n const formSubmit = async () => {\n let formParams = await formRef.current?.formSubmit();\n if (formParams) {\n if (\n formParams.endTime &&\n formParams.startTime &&\n dayjs(formParams.endTime).isBefore(formParams.startTime)\n ) {\n message.warning('生效日期不能大于失效日期', 1.5);\n return;\n }\n setState({\n saveLoading: true,\n });\n try {\n let result: AnyObjectType = {};\n // 合并父组件传过来的额外参数\n formParams = {\n ...formParams,\n ...props.submitExtraParameters,\n };\n // 转换开关组件的值是0或1\n if (props.switchTransform) {\n for (let i = 0; i < props.switchTransform.length; i++) {\n if (formParams[props.switchTransform[i]]) {\n formParams[props.switchTransform[i]] = '1';\n } else {\n formParams[props.switchTransform[i]] = '0';\n }\n }\n }\n // 额外指定参数移除\n if (props.submitRemoveField) {\n for (let i = 0; i < props.submitRemoveField.length; i++) {\n if (formParams[props.submitRemoveField[i]]) {\n delete formParams[props.submitRemoveField[i]];\n }\n }\n }\n // 时间格式转换\n for (let o in formParams) {\n const formatStr = 'YYYY-MM-DD HH:mm:ss';\n if (dayjs(formParams[o], formatStr, true).isValid()) {\n formParams[o] = dayjs(formParams[o]).format(formatStr);\n }\n }\n // 从父级手动转换参数\n if (props.manualParameterChange) {\n formParams = props.manualParameterChange(formParams);\n }\n // 手动验证表单\n if (props.manualVerification) {\n if (!props.manualVerification(formParams)) {\n console.warn('手动验证表单不通过');\n setState({\n saveLoading: false,\n });\n return;\n }\n }\n formParams = _.omitBy(formParams, _.isNil);\n if (props.submitApi && formParams) {\n if (props.id) {\n formParams.id = props.id;\n result = await props.submitApi(formParams, 'put');\n } else {\n result = await props.submitApi(formParams, 'post');\n }\n if (result.code === 1) {\n // 确定或保存回调\n if (props.onConfirm) {\n let next = props.onConfirm(result);\n if (next === false) {\n return;\n }\n }\n message.success('操作成功', 1.5);\n props.onCancel && props.onCancel();\n }\n setState({\n saveLoading: false,\n });\n } else {\n // 确定或保存回调\n if (props.onConfirm && formParams) {\n props.onConfirm(formParams);\n }\n }\n } catch (error) {\n setState({\n saveLoading: false,\n });\n console.error(error);\n }\n }\n };\n\n /**\n * @Description 关闭弹窗,自动关闭loading\n * @Author bihongbin\n * @Date 2021-03-15 18:32:02\n */\n useEffect(() => {\n if (props.visible === false) {\n setState({\n saveLoading: false,\n });\n }\n }, [props.visible, setState]);\n\n /**\n * @Description 表单是否是禁用状态\n * @Author bihongbin\n * @Date 2020-08-05 11:37:06\n */\n useEffect(() => {\n setState({\n disabled: props.disable,\n });\n }, [props.disable, setState]);\n\n /**\n * @Description 暴漏给父组件调用\n * @Author bihongbin\n * @Date 2020-08-01 15:59:36\n */\n useImperativeHandle<any, LayoutFormModalCallType>(ref, () => ({\n // 设置loading\n setFormLoading: (data) => {\n setState({\n loading: data,\n });\n },\n // 设置保存loading\n setFormSaveLoading: (data) => {\n setState({\n saveLoading: data,\n });\n },\n // 设置一组字段状态\n setFormFields: (fields) => {\n if (formRef.current) {\n formRef.current.setFormFields(fields);\n }\n },\n // 读取表单值\n getFormValues: (data) => {\n return formRef.current?.getFormValues(data);\n },\n // 设置表单值\n setFormValues: (data) => {\n if (formRef.current) {\n formRef.current.setFormValues(data);\n }\n },\n // 排除指定表单后提交\n excludeFormSubmitValues: async (nameList) => {\n if (formRef.current) {\n const f = props.formList.filter((item) => {\n return !(nameList as string[])?.includes(item.name as string);\n });\n return await formRef.current?.formSubmit(f.map((item) => item.name) as NamePath[]);\n } else {\n return {};\n }\n },\n // 提交表单并验证\n getFormSubmitValues: async (nameList) => {\n if (formRef.current) {\n return await formRef.current?.formSubmit(nameList);\n } else {\n return {};\n }\n },\n }));\n\n return (\n <Dialog\n className={`form-modal ${props.className}`}\n width={props.width ? props.width : 600}\n visible={props.visible}\n title={props.title || '对话框'}\n onCancel={props.onCancel}\n destroyOnHidden\n maskClosable={false}\n footer={null}\n >\n <Spin spinning={state.loading}>\n <div className=\"modal-form-height\">\n {props.topRender ? props.topRender : null}\n <GenerateForm\n ref={formRef}\n formConfig={{\n labelCol: { span: 24 },\n ...props.formConfig,\n }}\n rowGridConfig={{ gutter: [20, 0] }}\n colGirdConfig={props.colGirdConfig || { span: 12 }}\n list={props.formList}\n />\n {props.children}\n </div>\n {footerRender()}\n </Spin>\n </Dialog>\n );\n};\n\nexport default forwardRef(LayoutFormModal);\n\n","import React from 'react';\nimport { Row, Col, Button, Space } from 'antd';\nimport hooks from '../brother/hooks';\nimport Dialog from '../Dialog';\nimport './index.less';\n\ninterface Props {\n /** 打开关闭 */\n visible: boolean;\n /** 弹窗宽度 */\n width?: number;\n /** 弹窗标题 */\n title?: string;\n /** 取消回调 */\n onCancel: () => void;\n /** 选择图标回调 */\n onConfirm?: (item: string) => void;\n}\n\ninterface StateType {\n iconModal: {\n selected: number;\n list: string[];\n };\n}\n\n/** 选择图标弹窗 */\nconst IconSelectionModal = (props: Props) => {\n const [state, setState] = hooks.useSetState<StateType>({\n iconModal: {\n selected: -1,\n list: [\n 'iconmove',\n 'iconmap',\n 'iconnotice',\n 'iconpassword',\n 'iconNotvisible1',\n 'iconphone',\n 'iconpic1',\n 'iconpin',\n 'iconproduct',\n 'iconQRcode1',\n 'iconreeor',\n 'iconreduce',\n 'iconresonserate',\n 'iconremind',\n 'iconrising1',\n 'iconRightarrow',\n 'iconrmb1',\n 'iconsave',\n 'iconscanning',\n 'iconseleted',\n 'iconsearchcart',\n 'iconshare',\n 'iconRightbutton',\n 'iconsorting',\n 'iconsound-Mute',\n 'iconsound-filling',\n 'iconsuggest',\n 'iconsuccess',\n 'iconsupplier-features',\n 'iconswitch',\n 'iconsuspended',\n 'iconTop',\n 'iconsmile',\n 'icontradealert',\n 'icontopsales',\n 'icontradingvolume',\n 'iconupload',\n 'iconviewlarger',\n 'iconwarning',\n 'iconset',\n 'iconDaytimemode',\n 'iconunlock',\n 'iconexchangerate',\n 'iconall',\n 'iconbussiness-man',\n 'iconcomponent',\n 'iconcode',\n 'iconcopy',\n 'icondollar',\n 'iconhistory',\n 'iconeditor',\n 'icondata',\n 'icongift',\n 'iconintegral',\n 'iconnav-list',\n 'iconpic',\n 'iconNotvisible',\n 'iconplay',\n 'iconQRcode',\n 'iconrmb',\n 'iconsimilar-product',\n 'iconExportservices',\n 'iconsendinquiry',\n 'iconcolumn',\n 'iconadd-account',\n 'iconcolumn1',\n 'iconadd',\n 'iconadd-cart',\n 'iconarrow-right',\n 'iconarrow-left',\n 'iconall1',\n 'iconarrow-up',\n 'iconashbin',\n 'iconatm',\n 'iconbad',\n 'iconattachent',\n 'iconbrowse',\n 'iconcalendar',\n 'iconcart-full',\n 'iconcalculator',\n 'iconcameraswitching',\n 'iconcecurity-protection',\n 'iconcategory',\n 'iconclose',\n 'iconcertified-supplier',\n 'iconcart-Empty',\n 'iconcode1',\n 'iconcopy1',\n 'iconcoupons',\n 'iconconnections',\n 'iconcry',\n 'iconclock',\n 'iconCurrencyConverter',\n 'iconcut',\n 'icondata1',\n 'iconCustomermanagement',\n 'icondouble-arro-right',\n 'iconcustomization',\n 'icondouble-arrow-left',\n 'icondiscount',\n 'icondownload',\n 'icondollar1',\n 'icondefault-template',\n 'iconeditor1',\n 'iconetrical-equipm',\n 'iconellipsis',\n 'iconemail',\n 'iconfalling',\n 'iconfilter',\n 'iconfolder',\n 'iconhelp',\n 'icongood',\n 'icongift1',\n 'iconhot',\n 'iconinspection',\n 'iconleftbutton',\n 'iconleftarrow',\n 'iconlink',\n 'iconloading',\n 'iconphone1',\n ],\n },\n });\n\n const iconStyle: React.CSSProperties = {\n height: 34,\n fontSize: 22,\n };\n\n /**\n * @Description 确定\n * @Author bihongbin\n * @Date 2020-08-18 17:34:47\n */\n const handleIconSave = () => {\n // 暂时不做限制\n // if (state.iconModal.selected === -1) {\n // message.warn('请选择图标', 1.5);\n // return;\n // }\n const item = state.iconModal.list[state.iconModal.selected];\n if (props.onConfirm) {\n props.onConfirm(item);\n }\n };\n\n return (\n <Dialog\n className=\"icon-selected-modal\"\n width={props.width ? props.width : 590}\n visible={props.visible}\n title={props.title ? props.title : '图标选择'}\n onCancel={props.onCancel}\n destroyOnHidden\n maskClosable={false}\n footer={null}\n >\n <Row gutter={[10, 10]}>\n {state.iconModal.list.map((item, index) => (\n <Col key={index}>\n <div\n className={`avatar-selected ${\n index === state.iconModal.selected ? 'avatar-selected-bg' : null\n }`}\n onClick={() => {\n setState((prev) => {\n prev.iconModal.selected = index;\n return prev;\n });\n }}\n >\n <i className={`iconfont ${item}`} title={item} style={iconStyle} />\n </div>\n </Col>\n ))}\n </Row>\n <Row className=\"icon-selected-foot\" justify=\"center\">\n <Col>\n <Space size={20}>\n <Button onClick={props.onCancel}>关闭</Button>\n <Button type=\"primary\" onClick={handleIconSave}>\n 确定\n </Button>\n </Space>\n </Col>\n </Row>\n </Dialog>\n );\n};\n\nexport default IconSelectionModal;\n","import React, { useMemo, useRef, useState, useEffect, useCallback } from 'react';\nimport { Table } from 'antd';\nimport { TableProps } from 'antd/es/table';\nimport ConfigProvider from '../brother/ConfigProvider';\nimport { isEqualWithFunc } from '../brother/utils';\nimport ResizableTitle from '../GenerateTable/ResizableTitle';\n\nexport type VirtualListProp<RecordType extends object = any> = {\n /** 虚拟列表参数 */\n vl: {\n /** (必填) 对应scrollY */\n height: number | string;\n /** (可选) 滚动条滚到底部触发api */\n onReachEnd?: () => void;\n /** (可选) 滚动时触发的api */\n onScroll?: () => void;\n onListRender?: (listInfo: { start: number; renderLen: number }) => void;\n debounceListRenderMS?: number;\n /** (可选, 如果同一页面存在多个虚拟表格时必填.) 唯一标识 */\n vid?: string;\n /** 默认为true. 是否数据变更后重置滚动条 */\n resetTopWhenDataChange?: boolean;\n };\n} & TableProps<RecordType>;\n\n/** 虚拟列表 */\nconst VirtualList = (props: VirtualListProp) => {\n const { vl, columns, ...rest } = props;\n const vlRef = useRef(vl);\n\n if (isEqualWithFunc(vl, vlRef.current)) {\n vlRef.current = vl;\n }\n\n const [colState, setColState] = useState(columns || []);\n\n useEffect(() => {\n setColState(columns || []);\n }, [columns]);\n\n const handleResize = useCallback(\n (index: number) =>\n (e: any, { size }: { size: { width: number } }) => {\n const newCols = [...colState];\n newCols[index] = { ...newCols[index], width: size.width };\n setColState(newCols);\n },\n [colState],\n );\n\n const mergedColumns = useMemo(() => {\n return colState.map((col: any, index: number) => ({\n ...col,\n onHeaderCell: (column: any) => ({\n width: column.width,\n onResize: handleResize(index),\n }),\n }));\n }, [colState, handleResize]);\n\n const mergedComponents = useMemo(\n () => ({\n header: { cell: ResizableTitle },\n }),\n [],\n );\n\n // 处理 onScroll/onReachEnd/onListRender\n const handleBodyScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n const { onScroll, onReachEnd, onListRender } = vl || {};\n if (onScroll) onScroll();\n const target = e.currentTarget;\n // 判断是否滚动到底部\n if (onReachEnd && target.scrollTop + target.clientHeight >= target.scrollHeight - 2) {\n onReachEnd();\n }\n // 触发 onListRender(无法精确获取渲染区间,只能简单模拟)\n if (onListRender) {\n // 这里只能大致估算\n onListRender({ start: 0, renderLen: 0 });\n }\n },\n [vl],\n );\n\n // antd Table 没有直接暴露 bodyRef,只能用 className 选择\n useEffect(() => {\n if (!vl) return;\n const timer = setTimeout(() => {\n const body = document.querySelector('.ant-table-body') as HTMLDivElement;\n if (body && vl.onScroll) {\n body.onscroll = () => {\n // 兼容原生 Event,转换为 React 事件参数结构\n handleBodyScroll({ currentTarget: body } as unknown as React.UIEvent<HTMLDivElement>);\n };\n }\n }, 500);\n return () => clearTimeout(timer);\n }, [vl, handleBodyScroll]);\n\n let scrollY = vl.height;\n try {\n scrollY = parseInt(vl.height as string);\n } catch (error) {\n scrollY = vl.height;\n }\n\n return (\n <ConfigProvider>\n <Table\n virtual\n bordered\n components={mergedComponents}\n rowKey=\"id\"\n pagination={false}\n scroll={{ y: scrollY, x: undefined }}\n columns={mergedColumns}\n {...rest}\n />\n </ConfigProvider>\n );\n};\n\nexport default VirtualList;\n","/*\n * @Description 按钮组\n * @Author bihongbin\n * @Date 2021-03-01 14:22:57\n * @LastEditors bihongbin\n * @LastEditTime 2023-04-12 14:56:32\n */\n\nimport React, { useEffect, useImperativeHandle, forwardRef } from 'react';\nimport { Row, Col } from 'antd';\nimport { CloseOutlined } from '@ant-design/icons';\nimport hooks from '../brother/hooks';\nimport './index.less';\n\nexport interface ButtonGroupListType {\n name: string;\n value: string | number;\n selected?: boolean;\n disabled?: boolean;\n [key: string]: any;\n}\n\nexport interface ButtonGroupTypeProps {\n /** 按钮组数据 */\n data: ButtonGroupListType[];\n className?: string;\n /** button的className */\n buttonClassName?: string;\n /** 按钮大小 */\n size?: 'large' | 'middle' | 'small';\n /** 单选和多选 */\n checkType?: 'checkbox' | 'radio';\n /** 是否打开删除功能 */\n deleteOpen?: boolean;\n /** 按钮删除和选中的回调 */\n onChange?: (data: ButtonGroupListType[]) => void;\n}\n\nexport interface ButtonGroupCallType {\n getButtonGroupSelected: () => ButtonGroupListType[];\n}\n\ninterface StateType {\n type: ButtonGroupTypeProps['checkType'];\n deleteOpen: boolean;\n data: ButtonGroupListType[];\n}\n\nconst baseStr = 'button-group';\n\n/** 按钮组,包含组件单选、多选和按钮组删除功能 */\nconst ButtonGroup = (props: ButtonGroupTypeProps, ref: any) => {\n const [state, setState] = hooks.useSetState<StateType>({\n type: 'checkbox', // 选择类型(单选和多选)\n deleteOpen: false, // 是否开启删除功能\n data: [], // 按钮数据\n });\n\n /**\n * @Description 渲染按钮样式\n * @Author bihongbin\n * @Date 2021-03-01 14:48:43\n */\n const buttonClassName = (item: ButtonGroupListType) => {\n let str = baseStr;\n if (props.buttonClassName) {\n str = `${str} ${props.buttonClassName}`;\n }\n if (props.size) {\n str = `${str} ${baseStr}-${props.size}`;\n }\n if (item.selected) {\n str = `${str} ${baseStr}-primary`;\n }\n return str;\n };\n\n /**\n * @Description 设置按钮状态选中\n * @Author bihongbin\n * @Date 2021-03-01 14:34:56\n */\n const handleSelected = (item: ButtonGroupListType, index: number) => {\n let formatList: ButtonGroupListType[] = [];\n // 当打开删除功能的时候,不能进行单选和多选\n if (props.deleteOpen) {\n return;\n }\n if (state.data) {\n // 多选\n if (state.type === 'checkbox') {\n state.data[index].selected = !item.selected;\n formatList = state.data;\n }\n // 单选\n if (state.type === 'radio') {\n formatList = state.data.map((t, i) => {\n let bool = false;\n if (index === i) {\n bool = !item.selected;\n }\n return {\n ...t,\n selected: bool,\n };\n });\n }\n }\n if (props.onChange) {\n props.onChange(formatList);\n }\n setState({\n data: formatList,\n });\n };\n\n /**\n * @Description 删除\n * @Author bihongbin\n * @Date 2021-03-01 14:36:22\n */\n const handleDelete = (index: number) => {\n if (state.data) {\n const formatList = state.data.filter((m, i) => index !== i);\n if (props.onChange) {\n props.onChange(formatList);\n }\n setState({\n data: formatList,\n });\n }\n };\n\n /**\n * @Description 父级设置状态\n * @Author bihongbin\n * @Date 2021-03-01 14:37:26\n */\n useEffect(() => {\n if (props.checkType) {\n setState({\n type: props.checkType,\n });\n }\n if (props.deleteOpen) {\n setState({\n deleteOpen: props.deleteOpen,\n });\n }\n if (props.data) {\n const data = props.data.map((item) => {\n if (item.selected === undefined) {\n item.selected = false;\n }\n return item;\n });\n setState({\n data: data,\n });\n }\n }, [props, setState]);\n\n /**\n * @Description 暴漏方法给父组件调用\n * @Author bihongbin\n * @Date 2020-08-04 11:51:33\n */\n useImperativeHandle<any, ButtonGroupCallType>(ref, () => ({\n // 当前选中的按钮\n getButtonGroupSelected: () => state.data.filter((item) => item.selected),\n }));\n\n return (\n <Row className={props.className} gutter={[10, 10]}>\n {state.data.map((item, index) => (\n <Col key={index}>\n <div className={buttonClassName(item)} onClick={() => handleSelected(item, index)}>\n {item.name}\n {state.deleteOpen ? <CloseOutlined onClick={() => handleDelete(index)} /> : null}\n </div>\n </Col>\n ))}\n </Row>\n );\n};\n\nexport default forwardRef(ButtonGroup);\n"],"names":["hook","useMemoizedFn","useEffect","effect","deps","isMounted","useRef","current","hooks","useSetState","initialState","state","setState","useState","useCallback","patch","prevState","Object","assign","Function","useDeepCompareEffect","callback","dependencies","React","value","ref","signalRef","_","isEqual","useDeepCompareMemoize","useUpdateEffect","useMount","fn","useUnmount","fnRef","useMethods","methods","func","undefined","create","keys","forEach","key","args","call","useToggle","defaultValue","reverseValue","useMemo","reverseValueOrigin","toggle","s","set","setLeft","setRight","useLatest","Affix","props","formatProps","targetId","_jsx","AffixBox","target","document","getElementById","window","typeofEqual","data","prototype","toString","type","getSelectValue","list","item","v","parseInt","label","dayjs","locale","mapStoreLangToDayjs","lng","Config","parentConfig","useContext","ConfigProvider","ConfigContext","antLocaleCode","mapAntLocaleToDayjs","localStorage","getItem","JSON","parse","error","getStorage","handler","e","language","addEventListener","removeEventListener","_Fragment","children","dialogIndex","Dialog","Component","show","dialog","body","host","createElement","onOk","onCancel","id","style","cssText","appendChild","visible","getContainer","destroyOnClose","removeChild","ReactDOM","render","confirm","title","draggleRef","constructor","super","this","disabled","bounds","left","top","bottom","right","onStart","event","uiData","clientWidth","clientHeight","documentElement","targetRect","getBoundingClientRect","x","y","open","Modal","className","maskClosable","cursor","onMouseOver","onMouseOut","onFocus","onBlur","modalRender","modal","Draggable","close","index$5","forwardRef","mapRef","mapCenterLocRef","storageConversion","uid","uuidV4","suggestId","coordinateConversion","forward","rear","convertor","BMap","Convertor","pointArr","push","point","translate","d","status","points","addMark","addOverlay","Marker","icon","Icon","Size","setMapCenterLocation","location","zoom","Point","centerAndZoom","setPropsOnChange","console","log","lat","onChange","setPlace","clearOverlays","local","LocalSearch","onSearchComplete","pp","getResults","getPoi","search","loadMap","Map","enableMapClick","enableScrollWheelZoom","Autocomplete","input","province","city","district","street","business","onMapInit","url","jsApi","src","head","useImperativeHandle","setMapCenter","_jsxs","width","height","placeholder","index$4","fileList","setFileList","UploadAntd","fileObject","response","file","code","message","destroy","errorMsg","msg","warning","content","dangerouslySetInnerHTML","__html","duration","success","uploadSuccess","filter","onRemove","prev","beforeUpload","LIST_IGNORE","Search","Input","index$3","loading","searchOpen","searchValue","treeList","draggableOpen","processOpen","checkedOpen","firstLevelCollection","expandedKeys","autoExpandParent","selectNode","selectCurrent","checkedNode","checkedCurrent","generateList","arr","eachData","_data","i","length","node","handleSelectTreeNode","selectedKeys","isArray","map","String","onSelect","handleExpandTreeNode","getParentKey","tree","parentKey","some","searchChange","_expandedKeys","indexOf","self","handleCheckNode","checked","checkedArr","Array","loopTree","t","index","beforeStr","substr","afterStr","treeRightButton","Col","customAction","Row","justify","align","deep","getDeep","setLoading","getSelectNode","getSelectCurrent","getCheckedNode","getCheckedCurrent","setSelectNode","setCheckedNode","Spin","spinning","Tree","blockNode","showLine","showLeafIcon","checkable","treeData","checkedKeys","onExpand","onCheck","halfChecked","draggable","onDrop","info","dropKey","dragKey","dragNode","dropPos","pos","split","dropPosition","Number","loop","onVerificationDropCallBack","noDrag","dragObj","splice","dropToGap","expanded","unshift","ar","onDropCallBack","onDragEnter","treeConfig","Empty","Option","Select","RangePicker","DatePicker","TimeRangePicker","TimePicker","GenerateForm$1","form","Form","useForm","formConfig","rowGridConfig","colGirdConfig","remoteRef","debounceMapRef","treeSelectRef","update","remoteFetching","remoteData","treeSelectData","treeSelectFlattenData","selectMultiple","fetchRemote","config","remoteConfig","names","name","remoteApi","then","res","setTimeout","catch","fetchTreeSelect","treeSelectConfig","api","transformTreeSelect","flattenTreeSelect","original","entries","regionLoadData","async","selectedOptions","targetOption","result","regionSelectionConfig","selectLoad","isLeaf","formRender","setMultipleCheckbox","bool","inputRender","inputMode","arg","inputConfig","maxLength","inputChange","onPressEnter","inputEnter","selectRender","allowClear","selectChange","selectConfig","selectData","k","multipleRender","mode","multipleChange","filterOption","inputValue","option","toLowerCase","includes","popupRender","allSelect","Checkbox","editObj","setFieldsValue","multipleSelectRender","maxTagPlaceholder","omittedValues","labels","join","Tooltip","placement","remoteSearchRender","isMode","remoteMode","showSearch","nameKey","debounce","notFoundContent","size","marginTop","marginBottom","image","PRESENTED_IMAGE_SIMPLE","onSearch","remoteSearchChange","datePickerRender","datePickerChange","datePickerConfig","timePickerRender","timePickerChange","timePickerConfig","unionRender","m","componentName","childForm","selectIsHideAll","alignRight","otherConfig","inputNumberConfig","InputNumber","inputNumberChange","InputNumberRender","display","hideInputRender","TextArea","rows","textAreaChange","textAreaRender","optionFilterProp","autoCompleteChange","autoCompleteRender","AutoComplete","toUpperCase","inputAutoCompleteChange","inputAutoCompleteConfig","inputAutoCompleteRender","multipleTagRender","rangePickerPlaceholder","rangePickerChange","rangePickerConfig","rangePickerRender","timeRangePickerPlaceholder","timeRangePickerChange","timeRangePickerConfig","TimeRangePickerRender","Switch","defaultChecked","checkedChildren","unCheckedChildren","switchChange","switchRender","Radio","Group","radioChange","radioRender","checkboxChange","checkboxRender","TreeSelect","styles","root","maxHeight","overflow","configData","flatten","changeChild","newItem","changeVal","treeDefaultExpandAll","extra","treeSelectRender","len","unionConfig","unionItems","gutter","Item","rules","noStyle","divide","propsRegionConfig","Cascader","options","loadData","changeOnSelect","cascaderChange","regionSelectionRender","Rate","rateChange","rateConfig","rateRender","grid","resetItem","marginRight","color","fontStyle","fontFamily","unionRuleStyle","omit","colProps","_createElement","renderedList","obj","initLoad","getFormValues","getFieldsValue","setFormFields","fields","setFields","setFormValues","values","reLoad","formSubmit","nameList","Promise","resolve","reject","validateFields","replace","err","errorFields","warn","Error","formReset","resetFields","initialValues","sortSeq","startTime","Date","getFullYear","endTime","stringifiable","slice","defineProperty","exports","isProduction","process","invariant","condition","hasOwnProperty","source","getAllKeys","getOwnPropertySymbols","concat","copy","object","Set","getPrototypeOf","Context","commands","defaultCommands","bind","extend","isEquals","newContext","get","enumerable","configurable","directive","$spec","_this","spec","$apply","nextObject","objectWasNextObject","nextValueForKey","nextObjectValue","$push","invariantPushAndUnshift","$unshift","$splice","originalObject","invariantSplice","invariantSplices","apply","$set","_nextObject","invariantSet","$toggle","targets","invariantSpecArray","nextObjectCopy","$unset","_spec","$add","invariantMapOrSet","_a","has","add","$remove","delete","$merge","specValue","defaultContext","command","typeOfTarget","default","module","ResizableTitle$1","memo","onResize","restProps","stopClick","stopPropagation","preventDefault","localWidth","setLocalWidth","draggableOpts","enableUserSelectHack","safeWidth","handleNode","onMouseDown","onClick","thRef","containerElRef","containerRect","setContainerRect","measured","offsetWidth","clamp","val","Math","min","max","rafIdRef","onResizeSafe","evt","cancelAnimationFrame","requestAnimationFrame","setDragX","clientX","onResizeStopSafe","setIsResizing","finalWidth","isResizing","dragX","Resizable","handle","onResizeStart","thEl","container","closest","onResizeStop","position","createPortal","borderLeft","pointerEvents","zIndex","EditableContext","createContext","EditableRow","moveRow","forwardedRef","innerRef","isOver","dropClassName","drop","useDrop","accept","collect","monitor","dragIndex","drag","useDrag","isDragging","tempProps","component","Provider","next","EditableCell$1","columns","record","recordIndex","dataIndex","rowSpanNum","colSpanNum","rowSpan","colSpan","editable","inputType","valueType","valueEnum","recordSelectField","controlRender","formChange","formItemProps","handleSave","triggerRemoteSearch","editing","setEditing","setRemoteFetching","setRemoteData","formItemRef","focus","fieldName","blurEditing","closeEdit","toggleEdit","curVal","filterTime","filed","DateTimePicker","format","filterContent","isDayjs","filterFormType","str","o","optionNode","popupMatchSelectWidth","save","showTime","errInfo","childNode","filterResult","margin","vcRender","rest","dom","DndContext","HTML5Backend","DndContainer","DndProvider","backend","context","GenerateTable$1","extraProps","tableConfig","virtual","rowType","scroll","apiMethod","hidSortColumn","paginationConfig","getCheckboxProps","resultFilter","getTableSuccessData","queryParameters","isShowPagination","queryPagination","total","pages","pageSize","showSizeChanger","orderByInfo","columnsCacheRef","formatColumns","setFormatColumns","listLoading","setListLoading","listData","selectRowIds","selectRowArray","scrollXY","setScrollXY","rowKey","VirtualEditableRow","VirtualEditableCell","EditableCell","components","header","cell","ResizableTitle","row","isFunction","showTotal","showQuickJumper","keyOriginPlace","prevData","newData","mergedMap","from","getList","updateSelected","pagination","queryParams","itemValue","page","pickBy","identity","rowIds","rowData","deepTable","ids","changeEstimatesList","paginationChange","sorter","order","field","rowSelection","fixed","selectedRowKeys","onSelectAll","selected","selectedRows","changeRows","uniq","uniqBy","changeItem","handleResize","nextColumns","stringify","hoverIndex","dragRow","sort","moveChange","filterSelectRows","tableList","text","col","onHeaderCell","column","onCell","currentColumns","find","filterColumns","sliderMenu","routerRender","pad","getComputedStyle","setTableLoading","getPages","getTableList","clearSelectIds","setRowSelected","setRowSelectedBy","getSelectIds","getSelectRowsArray","cloneDeep","removeSelectIds","filterByIds","array","keyName","getStaticDataList","setStaticDataList","DndWrap","Table","bordered","rowClassName","onRow","dataSource","p","n","stripFuncs","params","outerHeight","minHeight","Em","description","Link","Paragraph","Typography","index$2","searchFormRef","tableRef","saveLoading","tableColumnsList","colGirdWidth","span","onRemoveCol","removeIds","removeRows","formatStr","isValid","manualParameterChange","searchCallback","fileName","searchNoResetFiled","searchFormList","autoGetList","openSelected","defaultValues","setSavaLoading","forceRender","footer","modalConfig","topExtra","GenerateForm","Space","Button","rowProps","leftSlot","jsx","GenerateTable","currentSelected","onCheckChange","Card","overflowY","rightExport","headers","headres","csvContent","headerTitles","blob","Blob","link","URL","createObjectURL","setAttribute","visibility","click","exportToExcel","ellipsis","rightSlot","onConfirm","QuicklyProcessForms","formRef","leftRightStyle","fontSize","transformTime","timeArray","date","currentIndex","formResult","cutIndexObj","submitApi","plusIndexObj","keyDown","HandleRequestParam","methodParams","param","r","destroyOnHidden","wrap","flex","LeftCircleFilled","labelCol","formList","RightCircleFilled","index$1","formParams","isBefore","submitExtraParameters","switchTransform","submitRemoveField","manualVerification","omitBy","isNil","disable","setFormLoading","setFormSaveLoading","excludeFormSubmitValues","f","getFormSubmitValues","topRender","initBtn","buttons","footBtnList","model","laterBtn","footerRender","IconSelectionModal","iconModal","iconStyle","VirtualList","vl","vlRef","o1","o2","isEqualWith","val1","val2","colState","setColState","newCols","mergedColumns","mergedComponents","handleBodyScroll","onScroll","onReachEnd","onListRender","currentTarget","scrollTop","scrollHeight","start","renderLen","timer","querySelector","onscroll","clearTimeout","scrollY","baseStr","deleteOpen","buttonClassName","checkType","getButtonGroupSelected","formatList","handleSelected","CloseOutlined","handleDelete"],"mappings":"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,SAAEA,KAAagpB,GAAS3qB,EAC9B,OACEkd,EAAC2X,EAAM,IAAKlK,EAAM1sB,IAAK2P,GACpBjM,KAIP,GAAc,QAAVu3B,EACF,OAAOzL,EAAI0L,GAEb,GAAc,WAAVD,EACF,OAAOzL,EAAI,IAAI0L,KAAaJ,IAE9B,GAAc,UAAVG,EACF,OAAOzL,EAAI,IAAIsL,KAAYI,GAE/B,CACA,OAAO1L,EAAIsL,IAkNNK,UClVT,MAAMC,GAAsBr6B,IAC1B,MAAO9C,EAAOC,GAAYJ,GAAMC,YAAuB,CACrDs9B,UAAW,CACT/J,UAAU,EACVxvB,KAAM,CACJ,WACA,UACA,aACA,eACA,kBACA,YACA,WACA,UACA,cACA,cACA,YACA,aACA,kBACA,aACA,cACA,iBACA,WACA,WACA,eACA,cACA,iBACA,YACA,kBACA,cACA,iBACA,oBACA,cACA,cACA,wBACA,aACA,gBACA,UACA,YACA,iBACA,eACA,oBACA,aACA,iBACA,cACA,UACA,kBACA,aACA,mBACA,UACA,oBACA,gBACA,WACA,WACA,aACA,cACA,aACA,WACA,WACA,eACA,eACA,UACA,iBACA,WACA,aACA,UACA,sBACA,qBACA,kBACA,aACA,kBACA,cACA,UACA,eACA,kBACA,iBACA,WACA,eACA,aACA,UACA,UACA,gBACA,aACA,eACA,gBACA,iBACA,sBACA,0BACA,eACA,YACA,yBACA,iBACA,YACA,YACA,cACA,kBACA,UACA,YACA,wBACA,UACA,YACA,yBACA,wBACA,oBACA,wBACA,eACA,eACA,cACA,uBACA,cACA,qBACA,eACA,YACA,cACA,aACA,aACA,WACA,WACA,YACA,UACA,iBACA,iBACA,gBACA,WACA,cACA,iBAKAw5B,EAAiC,CACrClwB,OAAQ,GACRqtB,SAAU,IAoBZ,OACEvtB,EAACtH,GAAM,CACL2C,UAAU,sBACV4E,MAAOpK,EAAMoK,MAAQpK,EAAMoK,MAAQ,IACnC1G,QAAS1D,EAAM0D,QACfO,MAAOjE,EAAMiE,MAAQjE,EAAMiE,MAAQ,OACnCZ,SAAUrD,EAAMqD,SAChBm1B,iBAAe,EACf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","x_google_ignoreList":[17]}
|