fix: error after changed table mode in overview (#30)

Co-authored-by: yaojiping <yaojiping@infini.ltd>
This commit is contained in:
yaojp123 2024-12-14 10:52:21 +08:00 committed by GitHub
parent cfdc1870a9
commit a08e33a570
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 662 additions and 725 deletions

View File

@ -301,6 +301,7 @@ export default forwardRef((props: IProps, ref: any) => {
setSelectedItem(item);
drawRef.current?.open();
}}
parentLoading={loading}
/>
)}
</div>

View File

@ -1,96 +1,18 @@
import React, { useState, useEffect, useMemo } from "react";
import { Table, Tooltip, Progress } from "antd";
import { formatter } from "@/utils/format";
import { formatUtcTimeToLocal } from "@/utils/utils";
import { formatMessage } from "umi/locale";
import { SearchEngineIcon } from "@/lib/search_engines";
import { HealthStatusView } from "@/components/infini/health_status_view";
import { StatusBlockGroup } from "@/components/infini/status_block";
import { Providers, ProviderIcon } from "@/lib/providers";
import request from "@/utils/request";
import styles from "./index.less"
import CommonTable from "../../components/CommonTable";
export default (props) => {
const {
dataSource,
total,
from,
pageSize,
loading,
onPageChange,
onPageSizeChange,
onRowClick,
infoAction
} = props;
const [infos, setInfos] = useState({});
const fetchListInfo = async (data) => {
const res = await Promise.all(data?.map((item) => request(infoAction, {
method: "POST",
body: [item.id],
}, false, false)));
if (res) {
let newInfos = {}
res.forEach((item) => {
if (item && !item.error) {
newInfos = {
...newInfos,
...item
}
}
})
setInfos(newInfos);
}
};
useEffect(() => {
fetchListInfo(dataSource);
}, [JSON.stringify(dataSource)])
const [tableData] = useMemo(() => {
let tableData = dataSource?.map((item) => {
const id = item?._id;
const metadata = item._source || {};
const info = id && infos[id] ? infos[id] : {};
const summary = info.summary || {};
const metrics = info.metrics || {};
const fs_total_in_bytes = summary?.fs?.total_in_bytes || 0;
const fs_available_in_bytes = summary?.fs?.available_in_bytes || 0;
const fs_used_in_bytes = fs_total_in_bytes - fs_available_in_bytes;
const jvm_mem_total_in_bytes = summary?.jvm?.heap_max_in_bytes || 0;
const jvm_mem_used_in_bytes = summary?.jvm?.heap_used_in_bytes || 0;
const disk_percent =
fs_total_in_bytes > 0
? Math.round((fs_used_in_bytes / fs_total_in_bytes) * 100)
: 0;
const jvm_mem_percent =
jvm_mem_total_in_bytes > 0
? Math.round((jvm_mem_used_in_bytes / jvm_mem_total_in_bytes) * 100)
: 0;
const metrics_status = metrics?.status || {};
return {
id,
metadata,
summary,
metrics_status,
fs_total_in_bytes,
fs_available_in_bytes,
fs_used_in_bytes,
jvm_mem_total_in_bytes,
jvm_mem_used_in_bytes,
disk_percent,
jvm_mem_percent,
};
});
return [tableData];
}, [JSON.stringify(dataSource), JSON.stringify(infos)]);
const [columns] = useMemo(() => {
let columns = [
return (
<CommonTable
{...props}
columns={[
{
title: "Name",
dataIndex: "name",
@ -265,39 +187,47 @@ export default (props) => {
);
},
},
];
return [columns];
}, []);
]}
formatData={(dataSource, infos) => {
const newData = dataSource?.map((item) => {
const id = item?._id;
const metadata = item._source || {};
const info = id && infos[id] ? infos[id] : {};
const summary = info.summary || {};
const metrics = info.metrics || {};
const fs_total_in_bytes = summary?.fs?.total_in_bytes || 0;
const fs_available_in_bytes = summary?.fs?.available_in_bytes || 0;
const fs_used_in_bytes = fs_total_in_bytes - fs_available_in_bytes;
const jvm_mem_total_in_bytes = summary?.jvm?.heap_max_in_bytes || 0;
const jvm_mem_used_in_bytes = summary?.jvm?.heap_used_in_bytes || 0;
const disk_percent =
fs_total_in_bytes > 0
? Math.round((fs_used_in_bytes / fs_total_in_bytes) * 100)
: 0;
const jvm_mem_percent =
jvm_mem_total_in_bytes > 0
? Math.round((jvm_mem_used_in_bytes / jvm_mem_total_in_bytes) * 100)
: 0;
const metrics_status = metrics?.status || {};
return (
<div className="table-wrap">
<Table
size={"small"}
loading={loading}
columns={columns}
dataSource={tableData}
rowKey={"id"}
pagination={{
size: "small",
total,
pageSize,
onChange: onPageChange,
showSizeChanger: true,
onShowSizeChange: (_, size) => {
onPageSizeChange(size);
},
showTotal: (total, range) =>
`${range[0]}-${range[1]} of ${total} items`,
}}
onRow={(record, i) => {
return {
onClick: (event) => {
onRowClick(dataSource[i]);
},
id,
metadata,
summary,
metrics_status,
fs_total_in_bytes,
fs_available_in_bytes,
fs_used_in_bytes,
jvm_mem_total_in_bytes,
jvm_mem_used_in_bytes,
disk_percent,
jvm_mem_percent,
};
});
return newData
}}
rowClassName={() => styles.rowPointer}
/>
</div>
);
};

View File

@ -1,51 +1,18 @@
import React, { useState, useEffect, useMemo } from "react";
import { Table, Tooltip, Progress, Icon } from "antd";
import { Tooltip, Progress, Icon } from "antd";
import { formatter } from "@/utils/format";
import { formatUtcTimeToLocal } from "@/utils/utils";
import { formatMessage } from "umi/locale";
import { SearchEngineIcon } from "@/lib/search_engines";
import { HealthStatusView } from "@/components/infini/health_status_view";
import { StatusBlockGroup } from "@/components/infini/status_block";
import CommonTable from "../../components/CommonTable";
export default (props) => {
const {
infos,
dataSource,
total,
from,
pageSize,
loading,
onPageChange,
onPageSizeChange,
onRowClick,
} = props;
const [tableData] = useMemo(() => {
let tableData = dataSource?.map((item) => {
const id = item?._source?.metadata?.index_id;
const metadata = item?._source?.metadata || {};
const info = id && infos[id] ? infos[id] : {};
const summary = info.summary || {};
const metrics = info.metrics || {};
const timestamp = item?._source?.timestamp
? formatUtcTimeToLocal(item?._source?.timestamp)
: "N/A";
const metrics_status = metrics?.status || {};
return {
id,
metadata,
summary,
metrics_status,
timestamp,
};
});
return [tableData];
}, [JSON.stringify(dataSource), JSON.stringify(infos)]);
const [columns] = useMemo(() => {
let columns = [
return (
<CommonTable
{...props}
columns={[
{
title: "Name",
dataIndex: "name",
@ -171,38 +138,30 @@ export default (props) => {
);
},
},
];
return [columns];
}, []);
]}
formatData={(dataSource, infos) => {
const newData = dataSource?.map((item) => {
const id = item?._source?.metadata?.index_id;
const metadata = item?._source?.metadata || {};
const info = id && infos[id] ? infos[id] : {};
const summary = info.summary || {};
const metrics = info.metrics || {};
const timestamp = item?._source?.timestamp
? formatUtcTimeToLocal(item?._source?.timestamp)
: "N/A";
const metrics_status = metrics?.status || {};
return (
<div className="table-wrap">
<Table
size={"small"}
loading={loading}
columns={columns}
dataSource={tableData}
rowKey={"id"}
pagination={{
size: "small",
total,
pageSize,
onChange: onPageChange,
showSizeChanger: true,
onShowSizeChange: (_, size) => {
onPageSizeChange(size);
},
showTotal: (total, range) =>
`${range[0]}-${range[1]} of ${total} items`,
}}
onRow={(record, i) => {
return {
onClick: (event) => {
onRowClick(dataSource[i]);
},
id,
metadata,
summary,
metrics_status,
timestamp,
};
});
return newData
}}
/>
</div>
);
};

View File

@ -1,68 +1,15 @@
import React, { useState, useEffect, useMemo } from "react";
import { Table, Tooltip, Progress, Icon } from "antd";
import { Tooltip, Progress, Icon } from "antd";
import { formatter } from "@/utils/format";
import { formatUtcTimeToLocal } from "@/utils/utils";
import { formatMessage } from "umi/locale";
import { SearchEngineIcon } from "@/lib/search_engines";
import { HealthStatusView } from "@/components/infini/health_status_view";
import { StatusBlockGroup } from "@/components/infini/status_block";
import CommonTable from "../../components/CommonTable";
export default (props) => {
const {
infos,
dataSource,
total,
from,
pageSize,
loading,
onPageChange,
onPageSizeChange,
onRowClick,
} = props;
const [tableData] = useMemo(() => {
let tableData = dataSource?.map((item) => {
const id = item?._source?.metadata?.node_id;
const metadata = item._source?.metadata || {};
const info = id && infos[id] ? infos[id] : {};
const summary = info.summary || {};
const metrics = info.metrics || {};
const fs_total_in_bytes = summary?.fs?.total?.total_in_bytes || 0;
const fs_available_in_bytes = summary?.fs?.total?.available_in_bytes || 0;
const fs_used_in_bytes = fs_total_in_bytes - fs_available_in_bytes;
const jvm_mem_total_in_bytes = summary?.jvm?.mem?.heap_max_in_bytes || 0;
const jvm_mem_used_in_bytes = summary?.jvm?.mem?.heap_used_in_bytes || 0;
const disk_percent =
fs_total_in_bytes > 0
? Math.round((fs_used_in_bytes / fs_total_in_bytes) * 100)
: 0;
const jvm_mem_percent =
jvm_mem_total_in_bytes > 0
? Math.round((jvm_mem_used_in_bytes / jvm_mem_total_in_bytes) * 100)
: 0;
const metrics_status = metrics?.status || {};
return {
id,
metadata,
summary,
metrics_status,
fs_total_in_bytes,
fs_available_in_bytes,
fs_used_in_bytes,
jvm_mem_total_in_bytes,
jvm_mem_used_in_bytes,
disk_percent,
jvm_mem_percent,
};
});
return [tableData];
}, [JSON.stringify(dataSource), JSON.stringify(infos)]);
const [columns] = useMemo(() => {
let columns = [
return (
<CommonTable
{...props}
columns={[
{
title: "Name",
dataIndex: "name",
@ -220,38 +167,47 @@ export default (props) => {
);
},
},
];
return [columns];
}, []);
]}
formatData={(dataSource, infos) => {
const newData = dataSource?.map((item) => {
const id = item?._source?.metadata?.node_id;
const metadata = item._source?.metadata || {};
const info = id && infos[id] ? infos[id] : {};
const summary = info.summary || {};
const metrics = info.metrics || {};
const fs_total_in_bytes = summary?.fs?.total?.total_in_bytes || 0;
const fs_available_in_bytes = summary?.fs?.total?.available_in_bytes || 0;
const fs_used_in_bytes = fs_total_in_bytes - fs_available_in_bytes;
const jvm_mem_total_in_bytes = summary?.jvm?.mem?.heap_max_in_bytes || 0;
const jvm_mem_used_in_bytes = summary?.jvm?.mem?.heap_used_in_bytes || 0;
const disk_percent =
fs_total_in_bytes > 0
? Math.round((fs_used_in_bytes / fs_total_in_bytes) * 100)
: 0;
const jvm_mem_percent =
jvm_mem_total_in_bytes > 0
? Math.round((jvm_mem_used_in_bytes / jvm_mem_total_in_bytes) * 100)
: 0;
const metrics_status = metrics?.status || {};
return (
<div className="table-wrap">
<Table
size={"small"}
loading={loading}
columns={columns}
dataSource={tableData}
rowKey={"id"}
pagination={{
size: "small",
total,
pageSize,
onChange: onPageChange,
showSizeChanger: true,
onShowSizeChange: (_, size) => {
onPageSizeChange(size);
},
showTotal: (total, range) =>
`${range[0]}-${range[1]} of ${total} items`,
}}
onRow={(record, i) => {
return {
onClick: (event) => {
onRowClick(dataSource[i]);
},
id,
metadata,
summary,
metrics_status,
fs_total_in_bytes,
fs_available_in_bytes,
fs_used_in_bytes,
jvm_mem_total_in_bytes,
jvm_mem_used_in_bytes,
disk_percent,
jvm_mem_percent,
};
});
return newData
}}
/>
</div>
);
};

View File

@ -0,0 +1,91 @@
import React, { useState, useEffect, useMemo } from "react";
import { Table, Tooltip, Progress } from "antd";
import { formatter } from "@/utils/format";
import { formatUtcTimeToLocal } from "@/utils/utils";
import { formatMessage } from "umi/locale";
import { SearchEngineIcon } from "@/lib/search_engines";
import { HealthStatusView } from "@/components/infini/health_status_view";
import { StatusBlockGroup } from "@/components/infini/status_block";
import { Providers, ProviderIcon } from "@/lib/providers";
import request from "@/utils/request";
import styles from "./index.less"
export default (props) => {
const {
dataSource,
total,
from,
pageSize,
loading,
onPageChange,
onPageSizeChange,
onRowClick,
infoAction,
formatData,
columns = [],
parentLoading
} = props;
const [infos, setInfos] = useState({});
const fetchListInfo = async (data) => {
const res = await Promise.all(data?.map((item) => request(infoAction, {
method: "POST",
body: [item.id],
}, false, false)));
if (res) {
let newInfos = {}
res.forEach((item) => {
if (item && !item.error) {
newInfos = {
...newInfos,
...item
}
}
})
setInfos(newInfos);
}
};
useEffect(() => {
if (!parentLoading) {
fetchListInfo(dataSource);
}
}, [JSON.stringify(dataSource), parentLoading])
const tableData = useMemo(() => {
return formatData(dataSource, infos);
}, [JSON.stringify(dataSource), JSON.stringify(infos)]);
return (
<div className="table-wrap">
<Table
size={"small"}
loading={loading}
columns={columns}
dataSource={tableData}
rowKey={"id"}
pagination={{
size: "small",
total,
pageSize,
onChange: onPageChange,
showSizeChanger: true,
onShowSizeChange: (_, size) => {
onPageSizeChange(size);
},
showTotal: (total, range) =>
`${range[0]}-${range[1]} of ${total} items`,
}}
onRow={(record, i) => {
return {
onClick: (event) => {
onRowClick(dataSource[i]);
},
};
}}
rowClassName={() => styles.rowPointer}
/>
</div>
);
};