/* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable react-hooks/rules-of-hooks */ import React, { useState, useCallback, useMemo, useEffect } from 'react' import { Checkbox, Popover } from 'antd' import { SettingOutlined, HolderOutlined } from '@ant-design/icons' import { useMount } from 'ahooks' import { Hook, Action, useProState } from '@fexd/pro-utils' import { ProField } from '@fexd/pro-form' import { SortableContainer as sortableContainer, SortableElement as sortableElement, SortableHandle as sortableHandle, arrayMove, } from 'react-sortable-hoc' import { useProps } from '../../../utils' import useActionsPlugin from '../../actions' import { I18nText } from '../../config' const SortableContainer = sortableContainer(({ children }) => { return
{children}
}) const DragHandle = sortableHandle(() => ) const SortableCheckbox = sortableElement(({ ...props }) => { return (
) }) export default function useColumnSettings({ allColumns }) { const { id: tableId, columnSettingPersistType, iconActions } = useProps() const { setIconActions } = useActionsPlugin(({}) => []) const usingColumnSettings = useMemo( () => (iconActions ?? [])?.some((action: any) => action === 'settings' || action?.builtIn === 'settings'), [iconActions], ) const persistColumnSettingProState = useProState( { hiddenColumns: [], columnSort: allColumns.map((column: any) => column?.columnSettingKey), }, { key: tableId ? `t@${tableId}:column-setting` : undefined, persist: columnSettingPersistType, autoMergeObject: true, sync: false, }, ) const allColumnsRef = React.useRef(allColumns) allColumnsRef.current = allColumns useEffect(() => { if (persistColumnSettingProState.getState().columnSort?.length !== allColumns?.length) { persistColumnSettingProState.setState({ columnSort: allColumns.map((column: any) => column?.columnSettingKey), }) } }, [allColumns]) useMount(() => { setIconActions({ settings: ( } trigger="click" overlayClassName="f-pro-table-column-setting-popover" destroyTooltipOnHide content={ {() => { const allColumns = allColumnsRef.current const [{ hiddenColumns, columnSort: initialColumnSort }] = useState(() => persistColumnSettingProState.getState(), ) const [columnSort, setColumnSort] = useState(initialColumnSort) return ( document.querySelector('.f-pro-table-column-setting-popover') as any} lockToContainerEdges onSortEnd={({ oldIndex, newIndex }) => { const nextColumnSort = arrayMove(columnSort, oldIndex, newIndex) setColumnSort(nextColumnSort) persistColumnSettingProState.setState({ columnSort: nextColumnSort, }) }} > col.columnSettingKey) .filter((idx) => !hiddenColumns.includes(idx)) as any } props={{ renderOption: (option, index) => ( {option?.label} ), onChange: (value) => { const nextHiddenColumns = allColumns .map((col: any) => col.columnSettingKey) .filter((idx) => !value.includes(idx)) persistColumnSettingProState.setState({ hiddenColumns: nextHiddenColumns, }) }, }} type="checkbox" options={allColumns .sort( (a: any, b: any) => columnSort.indexOf(a?.columnSettingKey) - columnSort.indexOf(b?.columnSettingKey), ) .map((column, idx) => ({ label: column.title ?? column.label, value: (column as any)?.columnSettingKey, disabled: !(column?.hideable ?? true), }))} /> ) }} } placement="bottomRight" > } type="text" /> ), }) }) const applyColumnSettings = useCallback( (allColumns) => { if (!usingColumnSettings) { return allColumns ?? [] } const filteredColumns = (allColumns ?? []).filter( (column: any) => !persistColumnSettingProState.state.hiddenColumns?.includes?.(column?.columnSettingKey), ) if (persistColumnSettingProState.state.columnSort?.length === allColumns?.length) { return filteredColumns.sort( (a: any, b: any) => persistColumnSettingProState.state.columnSort.indexOf(a?.columnSettingKey) - persistColumnSettingProState.state.columnSort.indexOf(b?.columnSettingKey), ) } return filteredColumns }, [ persistColumnSettingProState.state.hiddenColumns, persistColumnSettingProState.state.columnSort, usingColumnSettings, ], ) return applyColumnSettings }