Skip to content

Commit fc0748d

Browse files
committed
update bulk select demo
1 parent cb75361 commit fc0748d

File tree

2 files changed

+174
-251
lines changed

2 files changed

+174
-251
lines changed

packages/react-table/src/docs/demos/Table.md

Lines changed: 1 addition & 251 deletions
Original file line numberDiff line numberDiff line change
@@ -56,258 +56,8 @@ import { rows, columns } from '../examples/Data.jsx';
5656

5757
### Bulk select
5858

59-
```js isFullscreen
60-
import React from 'react';
61-
import {
62-
Dropdown,
63-
DropdownItem,
64-
DropdownList,
65-
MenuToggle,
66-
MenuToggleCheckbox,
67-
PageSection,
68-
Pagination,
69-
Title,
70-
Toolbar,
71-
ToolbarContent,
72-
ToolbarGroup,
73-
ToolbarItem
74-
} from '@patternfly/react-core';
75-
import { Table as TableDeprecated, TableHeader, TableBody } from '@patternfly/react-table/deprecated';
76-
import DashboardWrapper from '@patternfly/react-core/src/demos/examples/DashboardWrapper';
77-
78-
class BulkSelectTableDemo extends React.Component {
79-
constructor(props) {
80-
super(props);
81-
this.state = {
82-
res: [],
83-
perPage: 20,
84-
page: 1,
85-
error: null,
86-
loading: true,
87-
selectedItems: [],
88-
numSelected: 0,
89-
isDropDownOpen: false,
90-
isKebabOpen: false,
91-
searchValue: ''
92-
};
93-
94-
this.onSelect = (event, isSelected, rowId) => {
95-
const { selectedItems } = this.state;
96-
const rows = [...this.state.res];
97-
const id = rows[rowId].id;
98-
rows[rowId].selected = isSelected;
99-
this.setState((prevState, props) => {
100-
return {
101-
res: rows,
102-
selectedItems: isSelected
103-
? [...prevState.selectedItems, id]
104-
: prevState.selectedItems.filter((itemId) => itemId !== id)
105-
};
106-
});
107-
};
108-
109-
this.updateSelected = () => {
110-
const { res, selectedItems } = this.state;
111-
let rows = res.map((post) => {
112-
post.selected = selectedItems.includes(post.id);
113-
return post;
114-
});
115-
116-
this.setState({
117-
res: rows
118-
});
119-
};
120-
121-
this.handleSelectClick = (newState) => {
122-
if (newState === 'none') {
123-
this.setState(
124-
{
125-
selectedItems: []
126-
},
127-
this.updateSelected
128-
);
129-
} else if (newState === 'page') {
130-
let newRows = [];
131-
let rows = this.state.res.map((post) => {
132-
const isSelected = post.selected;
133-
newRows = isSelected ? [...newRows] : [...newRows, post.id];
134-
post.selected = true;
135-
return post;
136-
});
137-
138-
this.setState((prevState, props) => {
139-
return {
140-
selectedItems: prevState.selectedItems.concat(newRows)
141-
};
142-
}, this.updateSelected);
143-
} else {
144-
let newRows = [];
145-
for (var i = 1; i <= 100; i++) newRows = [...newRows, i];
146-
147-
this.setState(
148-
{
149-
selectedItems: newRows
150-
},
151-
this.updateSelected
152-
);
153-
}
154-
};
155-
156-
this.onDropDownToggle = (isOpen) => {
157-
this.setState({
158-
isDropDownOpen: isOpen
159-
});
160-
};
161-
162-
this.onDropDownSelect = (event) => {
163-
this.setState((prevState, props) => {
164-
return { isDropDownOpen: !prevState.isDropDownOpen };
165-
});
166-
};
167-
}
59+
```js isFullscreen file="./table-demos/BulkSelect.jsx"
16860

169-
fetch(page, perPage) {
170-
this.setState({ loading: true });
171-
fetch(`https://jsonplaceholder.typicode.com/posts?_page=${page}&_limit=${perPage}`)
172-
.then((resp) => resp.json())
173-
.then((resp) => this.setState({ res: resp, perPage, page, loading: false }))
174-
.then(() => this.updateSelected())
175-
.catch((err) => this.setState({ error: err, loading: false }));
176-
}
177-
178-
componentDidMount() {
179-
this.fetch(this.state.page, this.state.perPage);
180-
}
181-
182-
renderPagination(variant) {
183-
const { page, perPage } = this.state;
184-
return (
185-
<Pagination
186-
isCompact
187-
itemCount={100}
188-
page={page}
189-
perPage={perPage}
190-
onSetPage={(_evt, value) => {
191-
this.fetch(value, perPage);
192-
}}
193-
onPerPageSelect={(_evt, value) => {
194-
this.fetch(1, value);
195-
}}
196-
variant={variant}
197-
titles={{
198-
paginationAriaLabel: `${variant} pagination`
199-
}}
200-
/>
201-
);
202-
}
203-
204-
buildSelectDropdown() {
205-
const { isDropDownOpen, selectedItems } = this.state;
206-
const numSelected = selectedItems.length;
207-
const allSelected = numSelected === 100;
208-
const anySelected = numSelected > 0;
209-
const someChecked = anySelected ? null : false;
210-
const isChecked = allSelected ? true : someChecked;
211-
212-
const items = (
213-
<>
214-
<DropdownItem key="item-1" onClick={() => this.handleSelectClick('none')}>
215-
Select none (0 items)
216-
</DropdownItem>
217-
<DropdownItem key="item-2" onClick={() => this.handleSelectClick('page')}>
218-
Select page ({this.state.perPage} items)
219-
</DropdownItem>
220-
<DropdownItem key="item-3" onClick={() => this.handleSelectClick('all')}>
221-
Select all (100 items)
222-
</DropdownItem>
223-
</>
224-
);
225-
return (
226-
<Dropdown
227-
onSelect={this.onDropDownSelect}
228-
isOpen={isDropDownOpen}
229-
onOpenChange={(isOpen) => this.setState({ isDropDownOpen: isOpen })}
230-
toggle={(toggleRef) => (
231-
<MenuToggle
232-
ref={toggleRef}
233-
isExpanded={isDropDownOpen}
234-
onClick={this.onDropDownToggle}
235-
aria-label="Select cards"
236-
splitButtonOptions={{
237-
items: [
238-
<MenuToggleCheckbox
239-
id="split-dropdown-checkbox"
240-
key="split-dropdown-checkbox"
241-
aria-label={anySelected ? 'Deselect all cards' : 'Select all cards'}
242-
isChecked={allSelected}
243-
onClick={() => {
244-
anySelected ? this.handleSelectClick('none') : this.handleSelectClick('all');
245-
}}
246-
>
247-
{numSelected !== 0 && `${numSelected} selected`}
248-
</MenuToggleCheckbox>
249-
]
250-
}}
251-
></MenuToggle>
252-
)}
253-
>
254-
<DropdownList>{items}</DropdownList>
255-
</Dropdown>
256-
);
257-
}
258-
259-
renderToolbar() {
260-
return (
261-
<React.Fragment>
262-
<Toolbar>
263-
<ToolbarContent>
264-
<ToolbarGroup>
265-
<ToolbarItem variant="bulk-select">{this.buildSelectDropdown()}</ToolbarItem>
266-
</ToolbarGroup>
267-
<ToolbarItem variant="pagination">{this.renderPagination('top')}</ToolbarItem>
268-
</ToolbarContent>
269-
</Toolbar>
270-
</React.Fragment>
271-
);
272-
}
273-
274-
render() {
275-
const { loading, res } = this.state;
276-
const rows = res.map((post) => ({
277-
cells: [post.title, post.body],
278-
selected: post.selected
279-
}));
280-
281-
return (
282-
<DashboardWrapper hasPageTemplateTitle>
283-
<PageSection isWidthLimited>
284-
{this.renderToolbar()}
285-
{!loading && (
286-
<TableDeprecated
287-
aria-label="Bulk Select Table Demo"
288-
cells={['Title', 'Body']}
289-
rows={rows}
290-
onSelect={this.onSelect}
291-
canSelectAll={false}
292-
>
293-
<TableHeader />
294-
<TableBody />
295-
</TableDeprecated>
296-
)}
297-
298-
{loading && (
299-
<div className="pf-v5-l-bullseye">
300-
<Title headingLevel="h2" size="3xl">
301-
Please wait while loading data
302-
</Title>
303-
</div>
304-
)}
305-
{this.renderPagination('bottom')}
306-
</PageSection>
307-
</DashboardWrapper>
308-
);
309-
}
310-
}
31161
```
31262

31363
### Expand/collapse all

0 commit comments

Comments
 (0)