import { Fragment, useEffect, useState } from 'react'; import { Avatar, Brand, Breadcrumb, BreadcrumbItem, Button, ButtonVariant, Content, Divider, Dropdown, DropdownGroup, DropdownItem, DropdownList, Label, LabelStatus, Masthead, MastheadMain, MastheadLogo, MastheadContent, MastheadBrand, MastheadToggle, MenuToggle, Nav, NavItem, NavList, Page, PageBreadcrumb, PageSection, PageSidebar, PageSidebarBody, PageToggleButton, Pagination, PaginationVariant, Toolbar, ToolbarContent, ToolbarGroup, ToolbarItem, Truncate } from '@patternfly/react-core'; import { Table, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table'; import translationsEn from './examples/translations.en.json'; import translationsHe from './examples/translations.he.json'; import AlignRightIcon from '@patternfly/react-icons/dist/esm/icons/align-right-icon'; import ToolsIcon from '@patternfly/react-icons/dist/esm/icons/tools-icon'; import RhUiRunningIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-running-icon'; import RhUiClockFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-clock-fill-icon'; import RhUiStopCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-stop-circle-fill-icon'; import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg'; import RhUiSettingsFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-settings-fill-icon'; import RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon'; import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon'; import RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon'; import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg'; import { rows } from '@patternfly/react-core/dist/esm/demos/sampleDataRTL'; interface Row { name: string; status: string; location: string; lastModified: string; url: string; } interface Translation { [key: string]: any; } export const PaginatedTableAction: React.FunctionComponent = () => { const [translation, setTranslation] = useState(translationsEn); const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(10); const columns = [ translation.table.columns.servers, translation.table.columns.status, translation.table.columns.location, translation.table.columns.modified, translation.table.columns.url ]; const generateRowsFromTranslation = (translation: Translation): Row[] => rows.map((row, index) => ({ name: `${translation.table.rows.node}${index + 1}`, status: translation.table.rows.status[row.status], location: translation.table.rows.locations[row.location], lastModified: translation.table.rows.lastModified[row.lastModified], url: `http://www.redhat.com/en/office-locations/node${index + 1}` })); const [paginatedRows, setPaginatedRows] = useState(rows.slice(0, 10)); const [isDirRTL, setIsDirRTL] = useState(false); const capitalize = (input: string) => input[0].toUpperCase() + input.substring(1); const switchTranslation = () => { setIsDirRTL((prevIsDirRTL) => !prevIsDirRTL); setTranslation((prevTranslation: string) => (prevTranslation === translationsEn ? translationsHe : translationsEn)); }; useEffect(() => { const fullRows = generateRowsFromTranslation(translation); setPaginatedRows(fullRows.slice((page - 1) * perPage, page * perPage)); }, [translation]); useEffect(() => { const html = document.querySelector('html'); html.dir = isDirRTL ? 'rtl' : 'ltr'; }, [isDirRTL]); // Pagination logic const handleSetPage = ( _evt: React.MouseEvent | React.KeyboardEvent | MouseEvent, newPage: number, _perPage: number | undefined, startIdx: number | undefined, endIdx: number | undefined ) => { const fullRows = generateRowsFromTranslation(translation); setPaginatedRows(fullRows.slice(startIdx, endIdx)); setPage(newPage); }; const handlePerPageSelect = ( _evt: React.MouseEvent | React.KeyboardEvent | MouseEvent, newPerPage: number, _newPage: number, startIdx: number | undefined, endIdx: number | undefined ) => { const fullRows = generateRowsFromTranslation(translation); setPaginatedRows(fullRows.slice(startIdx, endIdx)); setPerPage(newPerPage); }; const renderPagination = (variant: PaginationVariant) => { const { pagination } = translation; return ( ); }; const breadcrumbItems = { home: { url: '#home' }, category: { url: '#category' }, subCategory: { url: 'sub-category' } }; const renderLabel = (labelText: string) => { switch (labelText) { case 'Running': case 'רץ': return ( ); case 'Stopped': case 'עצר': return ( ); case 'Needs maintenance': case 'זקוק לתחזוקה': return ( ); case 'Down': case 'מטה': return ( ); } }; const toolbarItems = ( {renderPagination(PaginationVariant.top)} ); const pageNav = ( ); const sidebar = ( {pageNav} ); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false); const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = useState(false); const kebabDropdownItems = ( <> }>{translation.kebabDropdown.settings} }>{translation.kebabDropdown.help} ); const userDropdownItems = ( <> {translation.userDropdown.myProfile} {translation.userDropdown.userManagement} {translation.userDropdown.logout} ); const onDropdownToggle = () => { setIsDropdownOpen(!isDropdownOpen); }; const onDropdownSelect = () => { setIsDropdownOpen(false); }; const onKebabDropdownToggle = () => { setIsKebabDropdownOpen(!isKebabDropdownOpen); }; const onKebabDropdownSelect = () => { setIsKebabDropdownOpen(false); }; const onFullKebabToggle = () => { setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen); }; const onFullKebabSelect = () => { setIsFullKebabDropdownOpen(false); }; const masthead = ( {translation.brandLanguage && {translation.brandLanguage}}