import { ArrayField } from '@formily/core'; import { useField } from '@formily/react'; import React, { createContext, useContext, useEffect } from 'react'; import { useCollectionManager } from '../collection-manager'; import { BlockProvider, useBlockRequestContext } from './BlockProvider'; export const TableSelectorContext = createContext({}); const InternalTableSelectorProvider = (props) => { const { params, rowKey } = props; const field = useField(); const { resource, service } = useBlockRequestContext(); // if (service.loading) { // return ; // } return ( {props.children} ); }; const useAssociationNames = (collection) => { const { getCollectionFields } = useCollectionManager(); const names = getCollectionFields(collection) ?.filter((field) => field.target) .map((field) => field.name); return names; }; export const TableSelectorProvider = (props) => { const params = { ...props.params }; const appends = useAssociationNames(props.collection); if (props.dragSort) { params['sort'] = ['sort']; } if (appends?.length) { params['appends'] = appends; } return ( ); }; export const useTableSelectorContext = () => { return useContext(TableSelectorContext); }; export const useTableSelectorProps = () => { const field = useField(); const ctx = useTableSelectorContext(); useEffect(() => { if (!ctx?.service?.loading) { field.value = ctx?.service?.data?.data; field.data = field.data || {}; field.data.selectedRowKeys = ctx?.field?.data?.selectedRowKeys; field.componentProps.pagination = field.componentProps.pagination || {}; field.componentProps.pagination.pageSize = ctx?.service?.data?.meta?.pageSize; field.componentProps.pagination.total = ctx?.service?.data?.meta?.count; field.componentProps.pagination.current = ctx?.service?.data?.meta?.page; } }, [ctx?.service?.loading]); return { loading: ctx?.service?.loading, showIndex: false, dragSort: false, rowKey: ctx.rowKey || 'id', pagination: ctx?.params?.paginate !== false ? { defaultCurrent: ctx?.params?.page || 1, defaultPageSize: ctx?.params?.pageSize, } : false, onRowSelectionChange(selectedRowKeys, selectedRows) { ctx.field.data = ctx?.field?.data || {}; ctx.field.data.selectedRowKeys = selectedRowKeys; }, async onRowDragEnd({ from, to }) { await ctx.resource.move({ sourceId: from[ctx.rowKey || 'id'], targetId: to[ctx.rowKey || 'id'], }); ctx.service.refresh(); }, onChange({ current, pageSize }) { ctx.service.run({ ...ctx.service.params?.[0], page: current, pageSize }); }, }; };