diff --git a/packages/react-table/src/docs/demos/Table.md b/packages/react-table/src/docs/demos/Table.md index 71f3b2e1e5d..1539ef97034 100644 --- a/packages/react-table/src/docs/demos/Table.md +++ b/packages/react-table/src/docs/demos/Table.md @@ -56,258 +56,8 @@ import { rows, columns } from '../examples/Data.jsx'; ### Bulk select -```js isFullscreen -import React from 'react'; -import { - Dropdown, - DropdownItem, - DropdownList, - MenuToggle, - MenuToggleCheckbox, - PageSection, - Pagination, - Title, - Toolbar, - ToolbarContent, - ToolbarGroup, - ToolbarItem -} from '@patternfly/react-core'; -import { Table as TableDeprecated, TableHeader, TableBody } from '@patternfly/react-table/deprecated'; -import DashboardWrapper from '@patternfly/react-core/src/demos/examples/DashboardWrapper'; - -class BulkSelectTableDemo extends React.Component { - constructor(props) { - super(props); - this.state = { - res: [], - perPage: 20, - page: 1, - error: null, - loading: true, - selectedItems: [], - numSelected: 0, - isDropDownOpen: false, - isKebabOpen: false, - searchValue: '' - }; - - this.onSelect = (event, isSelected, rowId) => { - const { selectedItems } = this.state; - const rows = [...this.state.res]; - const id = rows[rowId].id; - rows[rowId].selected = isSelected; - this.setState((prevState, props) => { - return { - res: rows, - selectedItems: isSelected - ? [...prevState.selectedItems, id] - : prevState.selectedItems.filter((itemId) => itemId !== id) - }; - }); - }; - - this.updateSelected = () => { - const { res, selectedItems } = this.state; - let rows = res.map((post) => { - post.selected = selectedItems.includes(post.id); - return post; - }); - - this.setState({ - res: rows - }); - }; - - this.handleSelectClick = (newState) => { - if (newState === 'none') { - this.setState( - { - selectedItems: [] - }, - this.updateSelected - ); - } else if (newState === 'page') { - let newRows = []; - let rows = this.state.res.map((post) => { - const isSelected = post.selected; - newRows = isSelected ? [...newRows] : [...newRows, post.id]; - post.selected = true; - return post; - }); - - this.setState((prevState, props) => { - return { - selectedItems: prevState.selectedItems.concat(newRows) - }; - }, this.updateSelected); - } else { - let newRows = []; - for (var i = 1; i <= 100; i++) newRows = [...newRows, i]; - - this.setState( - { - selectedItems: newRows - }, - this.updateSelected - ); - } - }; - - this.onDropDownToggle = (isOpen) => { - this.setState({ - isDropDownOpen: isOpen - }); - }; - - this.onDropDownSelect = (event) => { - this.setState((prevState, props) => { - return { isDropDownOpen: !prevState.isDropDownOpen }; - }); - }; - } +```js isFullscreen file="./table-demos/BulkSelect.jsx" - fetch(page, perPage) { - this.setState({ loading: true }); - fetch(`https://jsonplaceholder.typicode.com/posts?_page=${page}&_limit=${perPage}`) - .then((resp) => resp.json()) - .then((resp) => this.setState({ res: resp, perPage, page, loading: false })) - .then(() => this.updateSelected()) - .catch((err) => this.setState({ error: err, loading: false })); - } - - componentDidMount() { - this.fetch(this.state.page, this.state.perPage); - } - - renderPagination(variant) { - const { page, perPage } = this.state; - return ( - { - this.fetch(value, perPage); - }} - onPerPageSelect={(_evt, value) => { - this.fetch(1, value); - }} - variant={variant} - titles={{ - paginationAriaLabel: `${variant} pagination` - }} - /> - ); - } - - buildSelectDropdown() { - const { isDropDownOpen, selectedItems } = this.state; - const numSelected = selectedItems.length; - const allSelected = numSelected === 100; - const anySelected = numSelected > 0; - const someChecked = anySelected ? null : false; - const isChecked = allSelected ? true : someChecked; - - const items = ( - <> - this.handleSelectClick('none')}> - Select none (0 items) - - this.handleSelectClick('page')}> - Select page ({this.state.perPage} items) - - this.handleSelectClick('all')}> - Select all (100 items) - - - ); - return ( - this.setState({ isDropDownOpen: isOpen })} - toggle={(toggleRef) => ( - { - anySelected ? this.handleSelectClick('none') : this.handleSelectClick('all'); - }} - > - {numSelected !== 0 && `${numSelected} selected`} - - ] - }} - > - )} - > - {items} - - ); - } - - renderToolbar() { - return ( - - - - - {this.buildSelectDropdown()} - - {this.renderPagination('top')} - - - - ); - } - - render() { - const { loading, res } = this.state; - const rows = res.map((post) => ({ - cells: [post.title, post.body], - selected: post.selected - })); - - return ( - - - {this.renderToolbar()} - {!loading && ( - - - - - )} - - {loading && ( -
- - Please wait while loading data - -
- )} - {this.renderPagination('bottom')} -
-
- ); - } -} ``` ### Expand/collapse all diff --git a/packages/react-table/src/docs/demos/table-demos/BulkSelect.jsx b/packages/react-table/src/docs/demos/table-demos/BulkSelect.jsx new file mode 100644 index 00000000000..378dc4cc405 --- /dev/null +++ b/packages/react-table/src/docs/demos/table-demos/BulkSelect.jsx @@ -0,0 +1,172 @@ +import React from 'react'; +import { + Dropdown, + DropdownList, + DropdownItem, + MenuToggle, + MenuToggleCheckbox, + PageSection, + Pagination, + Toolbar, + ToolbarContent, + ToolbarGroup, + ToolbarItem +} from '@patternfly/react-core'; +import { Table, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table'; +import DashboardWrapper from '@patternfly/react-core/src/demos/examples/DashboardWrapper'; +import { rows, columns } from '../../examples/Data.jsx'; + +export const BulkSelectTableDemo = () => { + const [isBulkSelectDropdownOpen, setIsBulkSelectDropdownOpen] = React.useState(false); + const [bulkSelection, setBulkSelection] = React.useState(''); + const [page, setPage] = React.useState(1); + const [perPage, setPerPage] = React.useState(10); + const [paginatedRows, setPaginatedRows] = React.useState(rows.slice(0, 10)); + const [selectedRows, setSelectedRows] = React.useState([]); + const handleSetPage = (_evt, newPage, _perPage, startIdx, endIdx) => { + setPaginatedRows(rows.slice(startIdx, endIdx)); + setPage(newPage); + }; + const handlePerPageSelect = (_evt, newPerPage, newPage, startIdx, endIdx) => { + setPaginatedRows(rows.slice(startIdx, endIdx)); + setPage(newPage); + setPerPage(newPerPage); + }; + + const setRowSelected = (row, isSelecting = true) => + setSelectedRows(prevSelected => { + const otherSelectedRows = prevSelected.filter(r => r !== row.name); + return isSelecting ? [...otherSelectedRows, row.name] : otherSelectedRows; + }); + const selectAllRows = (isSelecting = true) => + setSelectedRows(isSelecting ? rows.map(r => r.name) : []); + const selectPageRows = (isSelecting = true) => setSelectedRows(isSelecting ? paginatedRows.map(r => r.name) : []); + const isRowSelected = (row) => selectedRows.includes(row.name); + + const buildPagination = (variant, isCompact) => ( + + ); + + const buildBulkSelectDropdown = () => { + const numSelected = selectedRows.length; + const allSelected = numSelected === rows.length; + const anySelected = numSelected > 0; + const someChecked = anySelected ? null : false; + const isChecked = allSelected ? true : someChecked; + + const items = ( + <> + + Select none (0 items) + + + Select page ({perPage} items) + + + Select all ({rows.length} items) + + + ); + return ( + { + if (itemId === "all") { + selectAllRows(bulkSelection !== 'all'); + } else if (itemId === "page") { + selectPageRows(bulkSelection !== 'page'); + } else { + setSelectedRows([]); + } + setBulkSelection(itemId); + }} + isOpen={isBulkSelectDropdownOpen} + onOpenChange={(isOpen) => setIsBulkSelectDropdownOpen(isOpen)} + toggle={(toggleRef) => ( + setIsBulkSelectDropdownOpen(!isBulkSelectDropdownOpen)} + aria-label="Select cards" + splitButtonOptions={{ + items: [ + { + anySelected ? setSelectedRows([]) : selectAllRows(bulkSelection !== 'all'); + }} + > + {numSelected !== 0 && `${numSelected} selected`} + + ] + }} + > + )} + > + {items} + + ); + } + + const toolbar=( + + + + {buildBulkSelectDropdown()} + + {buildPagination('top')} + + + ); + + return ( + + + {toolbar} + + + + + + + + + + + {paginatedRows.map((row, rowIndex) => ( + + + + + + + ))} + +
+ {columns[0]}{columns[1]}{columns[2]}{columns[3]}
setRowSelected(row, isSelecting), + isSelected: isRowSelected(row) + }} + /> + {row.name}{row.threads}{row.applications}{row.workspaces}
+ {buildPagination('bottom')} +
+
+ ); +}