Control table state

dev
Platon Yasev 3 years ago
parent 525a63dfb0
commit 9dabd4770b

@ -137,7 +137,7 @@ export const MapComponent = () => {
<LayersControl /> <LayersControl />
</Map> </Map>
</div> </div>
<div className="w-full"> <div className="w-full border-solid border-border border-0 border-t-[1px]">
<TableWrapper fullWidth={isSidebarCollapsed} /> <TableWrapper fullWidth={isSidebarCollapsed} />
</div> </div>
</div> </div>

@ -110,7 +110,9 @@ export const ApproveAndWorkingTable = ({ fullWidth }) => {
const clearSelected = () => setSelectedIds([]); const clearSelected = () => setSelectedIds([]);
const { data } = useQuery(["approve-working-points"], async () => { const { data, isInitialLoading } = useQuery(
["approve-working-points"],
async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
page, page,
page_size: pageSize, page_size: pageSize,
@ -122,7 +124,8 @@ export const ApproveAndWorkingTable = ({ fullWidth }) => {
); );
return data; return data;
}); }
);
const { data: mergedData, isClickedPointLoading } = useMergeTableData( const { data: mergedData, isClickedPointLoading } = useMergeTableData(
data, data,
@ -150,6 +153,7 @@ export const ApproveAndWorkingTable = ({ fullWidth }) => {
isClickedPointLoading={isClickedPointLoading} isClickedPointLoading={isClickedPointLoading}
columns={columns} columns={columns}
fullWidth={fullWidth} fullWidth={fullWidth}
loading={isInitialLoading}
/> />
); );
}; };

@ -12,7 +12,8 @@ export const InitialTable = ({ fullWidth }) => {
const { clickedPointConfig } = useClickedPointConfig(); const { clickedPointConfig } = useClickedPointConfig();
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const { data, pageSize, isClickedPointLoading } = useInitialTableData(page); const { data, pageSize, isClickedPointLoading, isDataLoading } =
useInitialTableData(page);
const getSelectedRowKeys = useCallback(() => { const getSelectedRowKeys = useCallback(() => {
const ids = data?.results.map((item) => item.location_id) ?? []; const ids = data?.results.map((item) => item.location_id) ?? [];
@ -58,6 +59,7 @@ export const InitialTable = ({ fullWidth }) => {
columns={columns} columns={columns}
fullWidth={fullWidth} fullWidth={fullWidth}
header={<HeaderWrapper exportProvider={useExportInitialData} />} header={<HeaderWrapper exportProvider={useExportInitialData} />}
loading={isDataLoading}
/> />
); );
}; };

@ -13,7 +13,7 @@ export const useInitialTableData = (page) => {
const { prediction, categories, region } = filters; const { prediction, categories, region } = filters;
const { selection } = usePointSelection(); const { selection } = usePointSelection();
const { data } = useQuery( const { data, isInitialLoading } = useQuery(
["table", page, filters, selection], ["table", page, filters, selection],
async () => { async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
@ -53,5 +53,6 @@ export const useInitialTableData = (page) => {
data: mergedData, data: mergedData,
pageSize, pageSize,
isClickedPointLoading, isClickedPointLoading,
isDataLoading: isInitialLoading,
}; };
}; };

@ -1,4 +1,4 @@
import React, { useEffect, useRef } from "react"; import React, { useEffect } from "react";
import { Collapse, Empty, Table as AntdTable } from "antd"; import { Collapse, Empty, Table as AntdTable } from "antd";
import "./Table.css"; import "./Table.css";
import parse from "wellknown"; import parse from "wellknown";
@ -7,6 +7,7 @@ import { useClickedPointConfig } from "../../stores/useClickedPointConfig";
import scrollIntoView from "scroll-into-view-if-needed"; import scrollIntoView from "scroll-into-view-if-needed";
import { twMerge } from "tailwind-merge"; import { twMerge } from "tailwind-merge";
import { HeaderWrapper } from "./HeaderWrapper"; import { HeaderWrapper } from "./HeaderWrapper";
import { useTable } from "../../stores/useTable";
export const Table = React.memo( export const Table = React.memo(
({ ({
@ -20,10 +21,11 @@ export const Table = React.memo(
columns, columns,
header, header,
fullWidth, fullWidth,
loading,
}) => { }) => {
const { clickedPointConfig } = useClickedPointConfig(); const { clickedPointConfig } = useClickedPointConfig();
const { map } = useMap(); const { map } = useMap();
const tableRef = useRef(null); const { isOpened, setIsOpened } = useTable();
const SCROLL = { const SCROLL = {
y: `${height}px`, y: `${height}px`,
@ -40,11 +42,16 @@ export const Table = React.memo(
}, [clickedPointConfig, data]); }, [clickedPointConfig, data]);
return ( return (
<Collapse> <Collapse
<Collapse.Panel key="1" header={header ? header : <HeaderWrapper />}> bordered={false}
onChange={setIsOpened}
defaultActiveKey={isOpened ? "opened" : null}
>
<Collapse.Panel
key={"opened"}
header={header ? header : <HeaderWrapper />}
>
<AntdTable <AntdTable
ref={tableRef}
// className="max-w-full"
size="small" size="small"
locale={{ emptyText: <Empty description="Нет данных" /> }} locale={{ emptyText: <Empty description="Нет данных" /> }}
pagination={{ pagination={{
@ -80,6 +87,7 @@ export const Table = React.memo(
) )
} }
data-fullwidth={fullWidth} data-fullwidth={fullWidth}
loading={loading}
/> />
</Collapse.Panel> </Collapse.Panel>
</Collapse> </Collapse>

@ -13,7 +13,7 @@ export const WorkingTable = ({ fullWidth }) => {
const [pageSize, setPageSize] = useState(PAGE_SIZE); const [pageSize, setPageSize] = useState(PAGE_SIZE);
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const { data } = useQuery(["working-points"], async () => { const { data, isInitialLoading } = useQuery(["working-points"], async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
page, page,
page_size: pageSize, page_size: pageSize,
@ -44,6 +44,7 @@ export const WorkingTable = ({ fullWidth }) => {
columns={columns} columns={columns}
fullWidth={fullWidth} fullWidth={fullWidth}
header={<HeaderWrapper exportProvider={useExportWorkingData} />} header={<HeaderWrapper exportProvider={useExportWorkingData} />}
loading={isInitialLoading}
/> />
); );
}; };

@ -3,7 +3,7 @@ import { immer } from "zustand/middleware/immer";
import { MODES } from "../config"; import { MODES } from "../config";
const store = (set) => ({ const store = (set) => ({
mode: MODES.APPROVE, mode: MODES.INITIAL,
setMode: (mode) => { setMode: (mode) => {
set((state) => { set((state) => {

@ -0,0 +1,14 @@
import { create } from "zustand";
import { immer } from "zustand/middleware/immer";
const store = (set) => ({
isOpened: false,
setIsOpened: (value) => {
set((state) => {
state.isOpened = value[0] === "opened";
});
},
});
export const useTable = create(immer(store));
Loading…
Cancel
Save