import { ArrayField } from '@formily/core'; import { Schema, useField, useFieldSchema } from '@formily/react'; import React, { createContext, useContext, useEffect } from 'react'; import { useCollectionManager } from '../collection-manager'; import { BlockProvider, useBlockRequestContext } from './BlockProvider'; export const TableBlockContext = createContext({}); const InternalTableBlockProvider = (props) => { const { params, showIndex, dragSort, 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; const fieldSchema = useFieldSchema(); const tableSchema = fieldSchema.reduceProperties((buf, schema) => { if (schema['x-component'] === 'TableV2') { return schema; } return buf; }, null) as Schema; return tableSchema.reduceProperties((buf, schema) => { if (schema['x-component'] === 'TableV2.Column') { const s = schema.reduceProperties((buf, s) => { if (s['x-collection-field'] && names.includes(s.name)) { return s; } return buf; }, null); if (s) { buf.push(s.name); } } return buf; }, []); }; export const TableBlockProvider = (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 useTableBlockContext = () => { return useContext(TableBlockContext); }; export const useTableBlockProps = () => { const field = useField(); const ctx = useTableBlockContext(); 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: ctx.showIndex, dragSort: ctx.dragSort, rowKey: ctx.rowKey || 'id', pagination: ctx?.params?.paginate !== false ? { defaultCurrent: ctx?.params?.page || 1, defaultPageSize: ctx?.params?.pageSize, } : false, onRowSelectionChange(selectedRowKeys) { 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 }); }, }; };