123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- import React from 'react';
- import { useHistory } from 'react-router';
- import {
- TopicWithDetailedInfo,
- ClusterName,
- TopicName,
- } from 'redux/interfaces';
- import Breadcrumb from 'components/common/Breadcrumb/Breadcrumb';
- import { Link, useParams } from 'react-router-dom';
- import { clusterTopicNewPath } from 'lib/paths';
- import usePagination from 'lib/hooks/usePagination';
- import ClusterContext from 'components/contexts/ClusterContext';
- import PageLoader from 'components/common/PageLoader/PageLoader';
- import Pagination from 'components/common/Pagination/Pagination';
- import { GetTopicsRequest, TopicColumnsToSort } from 'generated-sources';
- import SortableColumnHeader from 'components/common/table/SortableCulumnHeader/SortableColumnHeader';
- import Search from 'components/common/Search/Search';
- import { PER_PAGE } from 'lib/constants';
- import ListItem from './ListItem';
- export interface TopicsListProps {
- areTopicsFetching: boolean;
- topics: TopicWithDetailedInfo[];
- totalPages: number;
- fetchTopicsList(props: GetTopicsRequest): void;
- deleteTopic(topicName: TopicName, clusterName: ClusterName): void;
- clearTopicMessages(
- topicName: TopicName,
- clusterName: ClusterName,
- partitions?: number[]
- ): void;
- search: string;
- orderBy: TopicColumnsToSort | null;
- setTopicsSearch(search: string): void;
- setTopicsOrderBy(orderBy: TopicColumnsToSort | null): void;
- }
- const List: React.FC<TopicsListProps> = ({
- areTopicsFetching,
- topics,
- totalPages,
- fetchTopicsList,
- deleteTopic,
- clearTopicMessages,
- search,
- orderBy,
- setTopicsSearch,
- setTopicsOrderBy,
- }) => {
- const { isReadOnly } = React.useContext(ClusterContext);
- const { clusterName } = useParams<{ clusterName: ClusterName }>();
- const { page, perPage, pathname } = usePagination();
- const [showInternal, setShowInternal] = React.useState<boolean>(true);
- const history = useHistory();
- React.useEffect(() => {
- fetchTopicsList({
- clusterName,
- page,
- perPage,
- orderBy: orderBy || undefined,
- search,
- showInternal,
- });
- }, [
- fetchTopicsList,
- clusterName,
- page,
- perPage,
- orderBy,
- search,
- showInternal,
- ]);
- const handleSwitch = React.useCallback(() => {
- setShowInternal(!showInternal);
- history.push(`${pathname}?page=1&perPage=${perPage || PER_PAGE}`);
- }, [showInternal]);
- return (
- <div className="section">
- <Breadcrumb>{showInternal ? `All Topics` : `External Topics`}</Breadcrumb>
- <div className="box">
- <div className="columns">
- <div className="column is-one-quarter is-align-items-center is-flex">
- <div className="field">
- <input
- id="switchRoundedDefault"
- type="checkbox"
- name="switchRoundedDefault"
- className="switch is-rounded"
- checked={showInternal}
- onChange={handleSwitch}
- />
- <label htmlFor="switchRoundedDefault">Show Internal Topics</label>
- </div>
- </div>
- <div className="column">
- <Search
- handleSearch={setTopicsSearch}
- placeholder="Search by Topic Name"
- value={search}
- />
- </div>
- <div className="column is-2 is-justify-content-flex-end is-flex">
- {!isReadOnly && (
- <Link
- className="button is-primary"
- to={clusterTopicNewPath(clusterName)}
- >
- Add a Topic
- </Link>
- )}
- </div>
- </div>
- </div>
- {areTopicsFetching ? (
- <PageLoader />
- ) : (
- <div className="box">
- <table className="table is-fullwidth">
- <thead>
- <tr>
- <SortableColumnHeader
- value={TopicColumnsToSort.NAME}
- title="Topic Name"
- orderBy={orderBy}
- setOrderBy={setTopicsOrderBy}
- />
- <SortableColumnHeader
- value={TopicColumnsToSort.TOTAL_PARTITIONS}
- title="Total Partitions"
- orderBy={orderBy}
- setOrderBy={setTopicsOrderBy}
- />
- <SortableColumnHeader
- value={TopicColumnsToSort.OUT_OF_SYNC_REPLICAS}
- title="Out of sync replicas"
- orderBy={orderBy}
- setOrderBy={setTopicsOrderBy}
- />
- <th>Replication Factor</th>
- <th>Number of messages</th>
- <th>Size</th>
- <th>Type</th>
- <th>Clean Up Policy</th>
- <th> </th>
- </tr>
- </thead>
- <tbody>
- {topics.map((topic) => (
- <ListItem
- clusterName={clusterName}
- key={topic.name}
- topic={topic}
- deleteTopic={deleteTopic}
- clearTopicMessages={clearTopicMessages}
- />
- ))}
- {topics.length === 0 && (
- <tr>
- <td colSpan={10}>No topics found</td>
- </tr>
- )}
- </tbody>
- </table>
- <Pagination totalPages={totalPages} />
- </div>
- )}
- </div>
- );
- };
- export default List;
|