partitions.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import { makeStyles, Theme } from '@material-ui/core';
  2. import { FC, useContext, useEffect, useState } from 'react';
  3. import { PartitionManageParam, PartitionView } from './Types';
  4. import MilvusGrid from '../../components/grid';
  5. import { ColDefinitionsType, ToolBarConfig } from '../../components/grid/Types';
  6. import { useTranslation } from 'react-i18next';
  7. import { usePaginationHook } from '../../hooks/Pagination';
  8. import icons from '../../components/icons/Icons';
  9. import CustomToolTip from '../../components/customToolTip/CustomToolTip';
  10. import { rootContext } from '../../context/Root';
  11. import CreatePartition from './Create';
  12. import { PartitionHttp } from '../../http/Partition';
  13. import Status from '../../components/status/Status';
  14. import { ManageRequestMethods } from '../../types/Common';
  15. const useStyles = makeStyles((theme: Theme) => ({
  16. wrapper: {
  17. height: '100%',
  18. },
  19. icon: {
  20. fontSize: '20px',
  21. marginLeft: theme.spacing(0.5),
  22. },
  23. }));
  24. const Partitions: FC<{
  25. collectionName: string;
  26. }> = ({ collectionName }) => {
  27. const classes = useStyles();
  28. const { t } = useTranslation('partition');
  29. const InfoIcon = icons.info;
  30. const [selectedPartitions, setSelectedPartitions] = useState<PartitionView[]>(
  31. []
  32. );
  33. const [partitions, setPartitions] = useState<PartitionView[]>([]);
  34. const {
  35. pageSize,
  36. currentPage,
  37. handleCurrentPage,
  38. total,
  39. data: partitionList,
  40. } = usePaginationHook(partitions);
  41. const [loading, setLoading] = useState<boolean>(true);
  42. const { setDialog, handleCloseDialog, openSnackBar } =
  43. useContext(rootContext);
  44. useEffect(() => {
  45. fetchPartitions(collectionName);
  46. }, [collectionName]);
  47. const fetchPartitions = async (collectionName: string) => {
  48. try {
  49. const res = await PartitionHttp.getPartitions(collectionName);
  50. const partitons: PartitionView[] = res.map(p =>
  51. Object.assign(p, { _statusElement: <Status status={p._status} /> })
  52. );
  53. setLoading(false);
  54. setPartitions(partitons);
  55. } catch (err) {
  56. setLoading(false);
  57. }
  58. };
  59. const toolbarConfigs: ToolBarConfig[] = [
  60. {
  61. label: t('create'),
  62. onClick: () => {
  63. setDialog({
  64. open: true,
  65. type: 'custom',
  66. params: {
  67. component: (
  68. <CreatePartition
  69. handleCreate={handleCreatePartition}
  70. handleClose={handleCloseDialog}
  71. />
  72. ),
  73. },
  74. });
  75. },
  76. icon: 'add',
  77. },
  78. {
  79. type: 'iconBtn',
  80. onClick: () => {},
  81. label: t('delete'),
  82. icon: 'delete',
  83. },
  84. ];
  85. const colDefinitions: ColDefinitionsType[] = [
  86. {
  87. id: '_id',
  88. align: 'left',
  89. disablePadding: true,
  90. label: t('id'),
  91. },
  92. {
  93. id: '_name',
  94. align: 'left',
  95. disablePadding: false,
  96. label: t('name'),
  97. },
  98. {
  99. id: '_statusElement',
  100. align: 'left',
  101. disablePadding: false,
  102. label: t('status'),
  103. },
  104. {
  105. id: '_rowCount',
  106. align: 'left',
  107. disablePadding: false,
  108. label: (
  109. <span className="flex-center">
  110. {t('rowCount')}
  111. <CustomToolTip title={t('tooltip')}>
  112. <InfoIcon classes={{ root: classes.icon }} />
  113. </CustomToolTip>
  114. </span>
  115. ),
  116. },
  117. ];
  118. const handleSelectChange = (value: PartitionView[]) => {
  119. setSelectedPartitions(value);
  120. };
  121. const handlePageChange = (e: any, page: number) => {
  122. handleCurrentPage(page);
  123. setSelectedPartitions([]);
  124. };
  125. const handleCreatePartition = async (name: string) => {
  126. const param: PartitionManageParam = {
  127. partitionName: name,
  128. collectionName,
  129. type: ManageRequestMethods.CREATE,
  130. };
  131. await PartitionHttp.createPartition(param);
  132. openSnackBar(t('createSuccess'));
  133. handleCloseDialog();
  134. // refresh partitions
  135. fetchPartitions(collectionName);
  136. };
  137. return (
  138. <section className={classes.wrapper}>
  139. <MilvusGrid
  140. toolbarConfigs={toolbarConfigs}
  141. colDefinitions={colDefinitions}
  142. rows={partitionList}
  143. rowCount={total}
  144. primaryKey="id"
  145. openCheckBox={true}
  146. showHoverStyle={true}
  147. selected={selectedPartitions}
  148. setSelected={handleSelectChange}
  149. page={currentPage}
  150. onChangePage={handlePageChange}
  151. rowsPerPage={pageSize}
  152. isLoading={loading}
  153. />
  154. </section>
  155. );
  156. };
  157. export default Partitions;