117 lines
3.2 KiB
TypeScript
117 lines
3.2 KiB
TypeScript
|
|
import { MyPageContainer } from '@/common';
|
|||
|
|
import { MyResponseType } from '@/common/typings';
|
|||
|
|
import { ProCard, ProFormColumnsType } from '@ant-design/pro-components';
|
|||
|
|
import { Fields, HierarchyType, Meta, RawData } from '@antv/s2';
|
|||
|
|
import { Flex, Space } from 'antd';
|
|||
|
|
import { useEffect } from 'react';
|
|||
|
|
import { useSetState } from 'react-use';
|
|||
|
|
import { MyS2TableComponent } from './MyS2TableComponent';
|
|||
|
|
import { MyS2TableExtra } from './MyS2TableExtra';
|
|||
|
|
import { MySwitcherFields } from './MySwitcherFields';
|
|||
|
|
import Query from './Query';
|
|||
|
|
|
|||
|
|
export type PropsType = {
|
|||
|
|
title: string;
|
|||
|
|
api: (values?: any) => Promise<MyResponseType>;
|
|||
|
|
defaultParams?: Record<string, any>;
|
|||
|
|
columns?: ProFormColumnsType<Record<string, any>, 'text'>[] | undefined;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
export type DataType = {
|
|||
|
|
config: {
|
|||
|
|
hierarchyType: HierarchyType | undefined;
|
|||
|
|
rowGrandTotals: boolean;
|
|||
|
|
rowSubTotals: boolean;
|
|||
|
|
colGrandTotals: boolean;
|
|||
|
|
colSubTotals: boolean;
|
|||
|
|
};
|
|||
|
|
data: RawData[];
|
|||
|
|
fields: Fields;
|
|||
|
|
meta?: Meta[];
|
|||
|
|
query?: Record<string, any>;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
export function NewMyS2Table(props: PropsType) {
|
|||
|
|
const [data, setData] = useSetState<DataType>(undefined);
|
|||
|
|
|
|||
|
|
// 请求数据
|
|||
|
|
function doRequest() {
|
|||
|
|
props
|
|||
|
|
.api?.({ ...props.defaultParams, ...data.query, fields: data.fields })
|
|||
|
|
.then((resp) => {
|
|||
|
|
if (!data.config)
|
|||
|
|
setData({
|
|||
|
|
config: resp.data.config,
|
|||
|
|
data: resp.data.data,
|
|||
|
|
fields: resp.data.fields,
|
|||
|
|
meta: resp.data.meta,
|
|||
|
|
});
|
|||
|
|
else setData({ data: resp.data.data });
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// // 如果没有columns,直接发起请求
|
|||
|
|
// useEffect(() => {
|
|||
|
|
// if (props.columns === undefined) doRequest({});
|
|||
|
|
// }, []);
|
|||
|
|
|
|||
|
|
useEffect(() => {
|
|||
|
|
console.log('useEffect query', data.query, data.fields);
|
|||
|
|
if (!data.query && !data.fields) {
|
|||
|
|
if (props.columns === undefined) {
|
|||
|
|
doRequest();
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
doRequest();
|
|||
|
|
}
|
|||
|
|
}, [data.query, data.fields]);
|
|||
|
|
|
|||
|
|
return (
|
|||
|
|
<MyPageContainer title={props.title}>
|
|||
|
|
{props.columns && (
|
|||
|
|
<Query
|
|||
|
|
columns={props.columns}
|
|||
|
|
doRequest={(values) => {
|
|||
|
|
setData({ query: values });
|
|||
|
|
}}
|
|||
|
|
/>
|
|||
|
|
)}
|
|||
|
|
<ProCard>
|
|||
|
|
<Space direction="vertical" style={{ width: '100%' }}>
|
|||
|
|
<Flex
|
|||
|
|
justify="space-between"
|
|||
|
|
style={{ width: '100%', margin: '10px 0' }}
|
|||
|
|
>
|
|||
|
|
{data.fields && (
|
|||
|
|
<MySwitcherFields
|
|||
|
|
fields={data.fields}
|
|||
|
|
setFields={(fields: DataType['fields']) => {
|
|||
|
|
console.log('fields', fields);
|
|||
|
|
setData({ fields });
|
|||
|
|
}}
|
|||
|
|
/>
|
|||
|
|
)}
|
|||
|
|
{data.config && (
|
|||
|
|
<MyS2TableExtra
|
|||
|
|
config={data.config}
|
|||
|
|
setConfig={(config) => {
|
|||
|
|
setData({ config });
|
|||
|
|
}}
|
|||
|
|
data={data.data}
|
|||
|
|
/>
|
|||
|
|
)}
|
|||
|
|
</Flex>
|
|||
|
|
{data.config && (
|
|||
|
|
<MyS2TableComponent
|
|||
|
|
config={data.config}
|
|||
|
|
fields={data.fields}
|
|||
|
|
meta={data.meta}
|
|||
|
|
data={data.data}
|
|||
|
|
/>
|
|||
|
|
)}
|
|||
|
|
</Space>
|
|||
|
|
</ProCard>
|
|||
|
|
</MyPageContainer>
|
|||
|
|
);
|
|||
|
|
}
|