import { Fragment, useState } from 'react'; import { Badge, Bullseye, Button, Card, CardHeader, CardTitle, CardBody, Content, Divider, Dropdown, DropdownItem, DropdownList, EmptyState, EmptyStateFooter, EmptyStateVariant, EmptyStateActions, Gallery, MenuToggle, MenuToggleCheckbox, OverflowMenu, OverflowMenuControl, OverflowMenuDropdownItem, OverflowMenuItem, PageSection, Pagination, Toolbar, ToolbarItem, ToolbarFilter, ToolbarContent, Select, SelectList, SelectOption, MenuToggleElement } from '@patternfly/react-core'; import TrashIcon from '@patternfly/react-icons/dist/esm/icons/trash-icon'; import RhUiAddCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-add-circle-fill-icon'; import pfIcon from './assets/pf-logo-small.svg'; import activeMQIcon from './assets/activemq-core_200x150.png'; import avroIcon from './assets/camel-avro_200x150.png'; import dropBoxIcon from './assets/camel-dropbox_200x150.png'; import infinispanIcon from './assets/camel-infinispan_200x150.png'; import saxonIcon from './assets/camel-saxon_200x150.png'; import sparkIcon from './assets/camel-spark_200x150.png'; import swaggerIcon from './assets/camel-swagger-java_200x150.png'; import azureIcon from './assets/FuseConnector_Icons_AzureServices.png'; import restIcon from './assets/FuseConnector_Icons_REST.png'; import RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon'; import { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper'; import { data } from '@patternfly/react-core/src/demos/CardView/examples/CardViewData.jsx'; export const CardViewBasic: React.FunctionComponent = () => { const totalItemCount = 10; const [cardData, setCardData] = useState(data); const [isChecked, setIsChecked] = useState(false); const [selectedItems, setSelectedItems] = useState([]); const [areAllSelected, setAreAllSelected] = useState(false); const [splitButtonDropdownIsOpen, setSplitButtonDropdownIsOpen] = useState(false); const [isLowerToolbarDropdownOpen, setIsLowerToolbarDropdownOpen] = useState(false); const [isLowerToolbarKebabDropdownOpen, setIsLowerToolbarKebabDropdownOpen] = useState(false); const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(10); const [filters, setFilters] = useState>({ products: [] }); const [state, setState] = useState({}); interface ProductType { id: number; name: string; icon: string; description: string; } const checkAllSelected = (selected: number, total: number) => { if (selected && selected < total) { return null; } return selected === total; }; const onToolbarDropdownToggle = () => { setIsLowerToolbarDropdownOpen(!isLowerToolbarDropdownOpen); }; const onToolbarKebabDropdownToggle = () => { setIsLowerToolbarKebabDropdownOpen(!isLowerToolbarKebabDropdownOpen); }; const onToolbarKebabDropdownSelect = () => { setIsLowerToolbarKebabDropdownOpen(!isLowerToolbarKebabDropdownOpen); }; const onCardKebabDropdownToggle = ( event: React.MouseEvent | React.MouseEvent, key: string ) => { setState({ [key]: !state[key as keyof Object] }); }; const deleteItem = (item: ProductType) => { const filter = (getter) => (val) => getter(val) !== item.id; setCardData(cardData.filter(filter(({ id }) => id))); setSelectedItems(selectedItems.filter(filter((id) => id))); }; const onSetPage = (_event: any, pageNumber: number) => { setPage(pageNumber); }; const onPerPageSelect = (_event: any, perPage: number) => { setPerPage(perPage); setPage(1); }; const onSplitButtonToggle = () => { setSplitButtonDropdownIsOpen(!splitButtonDropdownIsOpen); }; const onSplitButtonSelect = () => { setSplitButtonDropdownIsOpen(false); }; const onNameSelect = (event: any, selection = '') => { const checked = event.target.checked; const prevSelections = filters.products; setFilters({ ...filters, products: checked ? [...prevSelections, selection] : prevSelections.filter((value) => value !== selection) }); }; const onDelete = (type = '', _id = '') => { if (type) { setFilters(filters); } else { setFilters({ products: [] }); } }; const onChange = (event: React.FormEvent) => { const name = event.currentTarget.name; const productId = Number(name.charAt(name.length - 1)); if (selectedItems.includes(productId * 1)) { setSelectedItems(selectedItems.filter((id) => productId * 1 !== id)); const checkAll = checkAllSelected(selectedItems.length - 1, totalItemCount); setAreAllSelected(!!checkAll); } else { setSelectedItems([...selectedItems, productId * 1]); const checkAll = checkAllSelected(selectedItems.length + 1, totalItemCount); setAreAllSelected(!!checkAll); } }; const updateSelected = () => { const rows = cardData.map((post) => { post.selected = selectedItems.includes(post.id); return post; }); setCardData(rows); }; const getAllItems = () => { const collection: number[] = []; for (const items of cardData) { collection.push(items.id); } return collection; }; const splitCheckboxSelectAll = (e: any) => { let collection: number[] = []; if (e.target.checked) { for (let i = 0; i <= 9; i++) { collection = [...collection, i]; } } setSelectedItems(collection); setIsChecked(isChecked); setAreAllSelected(e.target.checked); updateSelected(); }; const selectPage = (e: { target: { checked: any } }) => { const { checked } = e.target; let collection: number[] = []; collection = getAllItems(); setSelectedItems(collection); setIsChecked(checked); setAreAllSelected(totalItemCount === perPage ? true : false); updateSelected(); }; const selectAll = () => { let collection: number[] = []; for (let i = 0; i <= 9; i++) { collection = [...collection, i]; } setSelectedItems(collection); setIsChecked(true); setAreAllSelected(true); updateSelected(); }; const selectNone = () => { setSelectedItems([]); setIsChecked(false); setAreAllSelected(false); updateSelected(); }; const renderPagination = () => { const defaultPerPageOptions = [ { title: '1', value: 1 }, { title: '5', value: 5 }, { title: '10', value: 10 } ]; return ( ); }; const buildSelectDropdown = () => { const numSelected = selectedItems.length; const anySelected = numSelected > 0; const splitButtonDropdownItems = ( <> Select none (0 items) Select page ({perPage} items) Select all ({totalItemCount} items) ); return ( setSplitButtonDropdownIsOpen(isOpen)} toggle={(toggleRef) => ( splitCheckboxSelectAll(e)} > {numSelected !== 0 && `${numSelected} selected`} ]} > )} > {splitButtonDropdownItems} ); }; const buildFilterDropdown = () => { const filterDropdownItems = ( PatternFly ActiveMQ Apache Spark Avro Azure Services Crypto DropBox JBoss Data Grid REST SWAGGER ); return ( onDelete(type as string, id as string)} > ); }; const toolbarKebabDropdownItems = [ Link , Action , Disabled Link , Disabled Action , , Separated Link , Separated Action ]; const toolbarItems = ( {buildSelectDropdown()} {buildFilterDropdown()} ( } /> )} isOpen={isLowerToolbarKebabDropdownOpen} onOpenChange={(isOpen) => setIsLowerToolbarDropdownOpen(isOpen)} > {toolbarKebabDropdownItems} {renderPagination()} ); const icons = { pfIcon, activeMQIcon, sparkIcon, avroIcon, azureIcon, saxonIcon, dropBoxIcon, infinispanIcon, restIcon, swaggerIcon }; const filtered = filters.products.length > 0 ? data.filter((card: { name: string }) => filters.products.length === 0 || filters.products.includes(card.name)) : cardData.slice((page - 1) * perPage, perPage === 1 ? page * perPage : page * perPage - 1); return (

Projects

This is a demo that showcases PatternFly cards.

{toolbarItems}
{filtered.map((product, key) => ( setState({ [key]: isOpen })} toggle={(toggleRef: React.Ref) => ( { onCardKebabDropdownToggle(e, key.toString()); }} isExpanded={!!state[key]} icon={} /> )} popperProps={{ position: 'right' }} > { deleteItem(product); }} > Delete ) }} > {`${product.name} {product.name} {product.description} ))}
); };