Overview.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { makeStyles, Theme, Typography } from '@material-ui/core';
  2. import { useCallback, useContext, useEffect, useMemo, useState } from 'react';
  3. import { useTranslation } from 'react-i18next';
  4. import EmptyCard from '../../components/cards/EmptyCard';
  5. import icons from '../../components/icons/Icons';
  6. import { StatusEnum } from '../../components/status/Types';
  7. import { rootContext } from '../../context/Root';
  8. import { useLoadAndReleaseDialogHook } from '../../hooks/Dialog';
  9. import { useNavigationHook } from '../../hooks/Navigation';
  10. import { CollectionHttp } from '../../http/Collection';
  11. import { ALL_ROUTER_TYPES } from '../../router/Types';
  12. import { ShowCollectionsType } from '../../types/Milvus';
  13. import { formatNumber } from '../../utils/Common';
  14. import CollectionCard from './collectionCard/CollectionCard';
  15. import { CollectionData } from './collectionCard/Types';
  16. import StatisticsCard from './statisticsCard/StatisticsCard';
  17. const useStyles = makeStyles((theme: Theme) => ({
  18. collectionTitle: {
  19. margin: theme.spacing(2, 0),
  20. lineHeight: '20px',
  21. fontSize: '14px',
  22. color: '#82838e',
  23. },
  24. cardsWrapper: {
  25. display: 'grid',
  26. gridTemplateColumns: 'repeat(auto-fill, minmax(380px, 1fr))',
  27. gap: '10px',
  28. },
  29. }));
  30. const Overview = () => {
  31. useNavigationHook(ALL_ROUTER_TYPES.OVERVIEW);
  32. const { handleAction } = useLoadAndReleaseDialogHook({ type: 'collection' });
  33. const classes = useStyles();
  34. const { t: overviewTrans } = useTranslation('overview');
  35. const { t: collectionTrans } = useTranslation('collection');
  36. const { t: successTrans } = useTranslation('success');
  37. const [statistics, setStatistics] = useState<{
  38. collectionCount: number;
  39. totalData: number;
  40. }>({
  41. collectionCount: 0,
  42. totalData: 0,
  43. });
  44. const [loadCollections, setLoadCollections] = useState<CollectionHttp[]>([]);
  45. const { openSnackBar } = useContext(rootContext);
  46. const fetchData = useCallback(async () => {
  47. const res = await CollectionHttp.getStatistics();
  48. const loadCollections = await CollectionHttp.getCollections({
  49. type: ShowCollectionsType.InMemory,
  50. });
  51. setStatistics(res);
  52. setLoadCollections(loadCollections);
  53. }, []);
  54. useEffect(() => {
  55. fetchData();
  56. }, [fetchData]);
  57. const fetchRelease = async (data: CollectionData) => {
  58. const name = data._name;
  59. const res = await CollectionHttp.releaseCollection(name);
  60. openSnackBar(
  61. successTrans('release', { name: collectionTrans('collection') })
  62. );
  63. fetchData();
  64. return res;
  65. };
  66. const handleRelease = (data: CollectionData) => {
  67. handleAction(data, fetchRelease);
  68. };
  69. const statisticsData = useMemo(() => {
  70. return {
  71. data: [
  72. {
  73. label: overviewTrans('load'),
  74. value: formatNumber(loadCollections.length),
  75. valueColor: '#07d197',
  76. },
  77. {
  78. label: overviewTrans('all'),
  79. value: formatNumber(statistics.collectionCount),
  80. valueColor: '#06aff2',
  81. },
  82. {
  83. label: overviewTrans('data'),
  84. value: overviewTrans('rows', {
  85. number: formatNumber(statistics.totalData),
  86. }) as string,
  87. valueColor: '#0689d2',
  88. },
  89. ],
  90. };
  91. }, [overviewTrans, statistics, loadCollections]);
  92. const loadCollectionsData: CollectionData[] = useMemo(() => {
  93. return loadCollections.map(v => ({
  94. _id: v._id,
  95. _name: v._name,
  96. _status: StatusEnum.loaded,
  97. _rowCount: v._rowCount,
  98. }));
  99. }, [loadCollections]);
  100. const CollectionIcon = icons.navCollection;
  101. return (
  102. <section className="page-wrapper">
  103. <StatisticsCard data={statisticsData.data} />
  104. <Typography className={classes.collectionTitle}>
  105. {overviewTrans('load')}
  106. </Typography>
  107. {loadCollectionsData.length > 0 ? (
  108. <div className={classes.cardsWrapper}>
  109. {loadCollectionsData.map(collection => (
  110. <CollectionCard
  111. key={collection._id}
  112. data={collection}
  113. handleRelease={handleRelease}
  114. />
  115. ))}
  116. </div>
  117. ) : (
  118. <EmptyCard
  119. wrapperClass="page-empty-card"
  120. icon={<CollectionIcon />}
  121. text={collectionTrans('noLoadData')}
  122. />
  123. )}
  124. </section>
  125. );
  126. };
  127. export default Overview;