/* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable react-hooks/rules-of-hooks */ /* eslint-disable react/no-children-prop */ import React, { useRef, memo, useMemo } from 'react' import { Space } from 'antd' import { run, delay, isArray } from '@fexd/tools' import { CaretDownOutlined, CaretUpOutlined, SyncOutlined, SearchOutlined, DownOutlined, UpOutlined, } from '@ant-design/icons' import { useThrottleFn, useMemoizedFn } from 'ahooks' import { useProState } from '@fexd/pro-utils' import { ProForm, FormItem } from '@fexd/pro-form' import Action from '../actions/Action' import useConfigPlugin, { I18nText } from '../config' import { useProps } from '../../utils' import useQueryFieldsConfig from './useFieldsConfig' import useQueryFieldPlugin from './index' import useItem from '../table/useItem' import useFieldParams from '../editField/useFieldParams' import { ProTableQueryFieldPluginConfig } from './types' function simpleCeil(num: number, base: number) { return base * Math.ceil(num / base) } const QueryButton = memo(function QueryButton(props) { const { form, getPaginationParams, setPaginationParams, setSelectedItems, search } = useQueryFieldPlugin(() => []) const query = useThrottleFn( async () => { const values = await form.validateFields() setPaginationParams({ page: 1 }) setSelectedItems([]) await delay(100) await search({ ...values, ...getPaginationParams(), page: 1, }) }, { wait: 300, }, ) return ( {() => { const { service, getQueryParams, getQueryingParams } = useQueryFieldPlugin(({ loading }) => [loading]) const { params: values } = getQueryParams() const currentQueryValueString = JSON.stringify(values) const isNewValues = currentQueryValueString !== JSON.stringify(getQueryingParams()) return ( } loading={service.loading} type="primary" onClick={query.run} tooltip={ !isNewValues ? { title: , mouseEnterDelay: 1, placement: 'bottom', } : undefined } children={} {...props} /> ) }} ) }) interface QueryFieldFormProps extends ProTableQueryFieldPluginConfig { form?: any onEnterDown?: () => any proFormRef?: any showAllFields?: boolean } const QueryField = memo(function QueryField({ form, onEnterDown, proFormRef, showAllFields, ...restProps }: QueryFieldFormProps) { const tableProps = useProps() const { queryFieldFormProps, queryFieldRefreshAfterReset, queryFieldGutter, queryFieldColumns, queryFieldDefaultLength: propsQueryFieldDefaultLength, queryFieldDefaultLines, queryFieldLayout, queryFieldOrder, renderQueryFields, normalizeFieldValue, queryFieldPersistKey, queryFieldPersistType, queryFieldPersistForm, onQueryFieldReset, queryFieldActionSortList, queryFieldFoldActionProps, queryFieldTextFoldActionProps, queryFieldQueryActionProps, queryFieldResetActionProps, } = { ...tableProps, ...restProps, } const formStatusRef = useRef({ focused: false, }) const showMoreQueryFormProState = useProState(false, { key: queryFieldPersistForm && queryFieldPersistKey ? `qf@${queryFieldPersistKey}:showMore` : undefined, persist: queryFieldPersistType, sync: false, }) const showMoreQueryForm = showAllFields === true ? true : showMoreQueryFormProState.state const toggleShowMoreQueryForm = () => showMoreQueryFormProState.setState((prevState: any) => !prevState as any) // const [showMoreQueryForm, { toggle: toggleShowMoreQueryForm }] = useToggle() const { rawQueryFields, queryFieldsMap: fieldsMap } = useQueryFieldsConfig() const { refresh, setPaginationParams, getService: getQueryService } = useQueryFieldPlugin(() => []) const { t } = useConfigPlugin(() => []) const foldAction = ( : } onClick={() => toggleShowMoreQueryForm()} tooltip={t(showMoreQueryForm ? 'queryField.fold' : 'queryField.more')} extraTooltipProps={{ placement: 'bottom', }} {...(queryFieldFoldActionProps ?? {})} /> ) const textFoldAction = ( : } onClick={() => toggleShowMoreQueryForm()} extraTooltipProps={{ placement: 'bottom', }} children={t(showMoreQueryForm ? 'queryField.fold' : 'queryField.more')} {...(queryFieldTextFoldActionProps ?? {})} /> ) const queryAction = const resetAction = ( } onClick={async () => { run(onQueryFieldReset) form.resetFields() if (queryFieldRefreshAfterReset && !getQueryService()?.loading) { setPaginationParams({ page: 1, }) await delay(60) refresh() } }} children={} {...(queryFieldResetActionProps ?? {})} /> ) const rawActions = ( {queryAction} {resetAction} ) const actions = ( {rawActions} ) const rawActionsWithFold = ( {queryAction} {resetAction} {foldAction} ) const actionsWithFold = ( {rawActionsWithFold} ) const defaultRenderQueryFields: typeof renderQueryFields = useMemoizedFn(({ renderField, renderFields }) => { if (isArray(rawQueryFields?.[0])) { const defaultShowQueryFields = rawQueryFields.slice(0, queryFieldDefaultLines) const showingFields = showMoreQueryForm ? rawQueryFields : defaultShowQueryFields return renderFields( [ ...showingFields, [ {queryAction} {resetAction} {!showAllFields && defaultShowQueryFields?.length < rawQueryFields?.length && foldAction} , ], ], { gridDynamicRender: false, // 不使用动态控制,避免造成问题 }, ) } const unsortedKeys = Object.keys(fieldsMap).filter((key) => !queryFieldOrder.includes(key)) const queryFields = [ ...queryFieldOrder.map((key: string) => fieldsMap?.[key]), ...unsortedKeys.map((key: string) => fieldsMap?.[key]), ] const queryFieldDefaultLength = propsQueryFieldDefaultLength ?? queryFieldColumns * queryFieldDefaultLines - 1 const defaultShowQueryFields = queryFields.slice(0, queryFieldDefaultLength) const showingFields = showMoreQueryForm ? queryFields : defaultShowQueryFields // console.log('showingFields', showingFields) // console.log(simpleCeil(showingFields?.length + 1, queryFieldColumns) - showingFields?.length - 1) const computedFoldAction = defaultShowQueryFields?.length < queryFields?.length ? foldAction : null const computedTextFoldAction = defaultShowQueryFields?.length < queryFields?.length ? textFoldAction : null return renderFields( [ ...showingFields, // ...Array(simpleCeil(showingFields?.length + 1, queryFieldColumns) - showingFields?.length - 1) // .fill('') // .map((_, idx) =>
), { content: ( {queryFieldActionSortList .map( (actionName) => ({ query: queryAction, reset: resetAction, fold: computedFoldAction, 'text-fold': computedTextFoldAction, })[actionName], ) .filter(Boolean)} ), colSpan: ((1 + simpleCeil(showingFields?.length + 1, queryFieldColumns) - showingFields?.length - 1) * 24) / queryFieldColumns, }, ], { gridDynamicRender: false, }, ) }) return ( ({ mode: 'query', viewType: 'field', form }), [])}> { formStatusRef.current.focused = true }} onBlur={() => { formStatusRef.current.focused = false }} onKeyDown={(e) => { if (formStatusRef.current.focused && e.nativeEvent.keyCode === 13) { run(onEnterDown) return } }} render={({ renderField, renderFields }) => run(renderQueryFields ?? defaultRenderQueryFields, undefined, { renderField, renderFields, rawActions, actions, fold: foldAction, query: queryAction, reset: resetAction, form, showMore: showMoreQueryForm, rawActionsWithFold, actionsWithFold, }) } /> ) }) export default QueryField