Skip to content

Commit 0e3d7ed

Browse files
camdCameron Dawson
authored andcommitted
chore: Upgrade from reactstrap to react-bootstrap
1 parent 0217375 commit 0e3d7ed

File tree

125 files changed

+1111
-1277
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

125 files changed

+1111
-1277
lines changed

docs/accessibility.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ For example:
5454
</Button>
5555
```
5656

57-
Known reactstrap components that accept the `color` prop and work with custom Treeherder colors: `Badge`, `Button`, `Card`, `DropdownToggle`, `FormText`, `NavBar`, `Progress`, `Spinner`.
57+
Known reactstrap components that accept the `color` prop and work with custom Treeherder colors: `Badge`, `Button`, `Card`, `Dropdown.Toggle`, `FormText`, `NavBar`, `Progress`, `Spinner`.
5858

5959
In case you need to add more custom colors, please add on [treeherder-custom-styles.css](https://github.com/mozilla/treeherder/blob/master/ui/css/treeherder-custom-styles.css#L348) style sheet.
6060

@@ -102,7 +102,7 @@ If your case is more specific, please check [this guide](https://css-tricks.com/
102102

103103
## Interactive elements
104104

105-
When creating elements that have event listeners, prefer any component of the reactstrap interactive elements. Examples are: `Button`, `Input`, `DropdownToggle`. You can also choose a HTML `<a>` element.
105+
When creating elements that have event listeners, prefer any component of the reactstrap interactive elements. Examples are: `Button`, `Input`, `Dropdown.Toggle`. You can also choose a HTML `<a>` element.
106106

107107
If you need to insert an event listener in a non-interactive element, such as a `span`, add also an `aria-role` of `button`, `link`, `checkbox`, or whatever seems closer to the functionality of the element.
108108

@@ -116,10 +116,10 @@ If you need to insert an event listener in a non-interactive element, such as a
116116

117117
There is a special case when you are creating a dropdown menu. First of all, try to follow [reactstrap structure](https://reactstrap.github.io/components/dropdowns/).
118118

119-
Lastly, insert an additional tag `prop` to `DropdownItem` component.
119+
Lastly, insert an additional tag `prop` to `Dropdown.Item` component.
120120

121121
```jsx
122-
<DropdownItem tag="a"> Menu Item </DropdownItem>
122+
<Dropdown.Item tag="a"> Menu Item </Dropdown.Item>
123123
```
124124

125125
## Forms, inputs and buttons

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
"prop-types": "15.8.1",
4343
"query-string": "7.0.1",
4444
"react": "18.3.1",
45+
"react-bootstrap": "2.10.10",
4546
"react-dates": "21.8.0",
4647
"react-dom": "18.3.1",
4748
"react-helmet": "6.1.0",
@@ -55,7 +56,6 @@
5556
"react-split-pane": "0.1.92",
5657
"react-table-6": "6.11.0",
5758
"react-tabs": "6.1.0",
58-
"reactstrap": "8.10.1",
5959
"redoc": "2.4.0",
6060
"redux": "4.2.1",
6161
"redux-debounce": "1.0.1",

ui/infra-compare/InfraCompareTable.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import { Table } from 'reactstrap';
2+
import { Table } from 'react-bootstrap';
33
import PropTypes from 'prop-types';
44

55
import { getJobsUrl } from '../helpers/url';

ui/infra-compare/InfraCompareTableControls.jsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
3-
import { Container, CustomInput, Label } from 'reactstrap';
3+
import { Container, Form } from 'react-bootstrap';
44

55
import FilterControls from '../shared/FilterControls';
66

@@ -110,11 +110,11 @@ export default class CompareTableControls extends React.Component {
110110
updateFilter={this.updateFilter}
111111
updateFilterText={this.updateFilterText}
112112
/>
113-
<Label for="filterPercent">Filter percentage: {filterPercent}%</Label>
114-
<CustomInput
115-
type="range"
113+
<Form.Label htmlFor="filterPercent">
114+
Filter percentage: {filterPercent}%
115+
</Form.Label>
116+
<Form.Range
116117
id="filterPercent"
117-
name="customSelect"
118118
min={0}
119119
max={20}
120120
value={filterPercent}

ui/infra-compare/InfraCompareTableRow.jsx

Lines changed: 63 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
3-
import { UncontrolledTooltip } from 'reactstrap';
3+
import { OverlayTrigger, Tooltip } from 'react-bootstrap';
44

55
import { getJobsUrl } from '../helpers/url';
66

77
export default class InfraCompareTableRow extends React.PureComponent {
88
render() {
99
const {
10-
hashkey,
1110
rowLevelResults: {
1211
suite,
1312
platform,
@@ -24,80 +23,80 @@ export default class InfraCompareTableRow extends React.PureComponent {
2423
} = this.props;
2524

2625
return (
27-
<tr color="danger">
26+
<tr className="table-danger">
2827
<th className="text-left">{suite}</th>
2928
<td>
30-
<span
31-
style={{ textDecoration: 'underline', color: 'blue' }}
32-
id={`originalValue${hashkey}`}
33-
>
34-
{originalValue}
35-
</span>
36-
<UncontrolledTooltip
29+
<OverlayTrigger
3730
placement="top"
38-
target={`originalValue${hashkey}`}
39-
autohide={false}
31+
overlay={
32+
<Tooltip>
33+
{originalJobs.size > 0 ? (
34+
Array.from(originalJobs).map(([jobName, durations]) => (
35+
<p key={jobName}>
36+
{jobName}: {durations.join(', ')}
37+
</p>
38+
))
39+
) : (
40+
<p className="lead text-center">No jobs to show</p>
41+
)}
42+
<a
43+
href={getJobsUrl({
44+
repo: originalProject,
45+
revision: originalRevision,
46+
searchStr: `${platform} ${suite}`,
47+
})}
48+
target="_blank"
49+
rel="noopener noreferrer"
50+
>
51+
Go to treeherder Job View
52+
</a>
53+
</Tooltip>
54+
}
55+
delay={{ show: 0, hide: 0 }}
4056
>
41-
{originalJobs.size > 0 ? (
42-
Array.from(originalJobs).map(([jobName, durations]) => (
43-
<p>
44-
{jobName}: {durations.join(', ')}
45-
</p>
46-
))
47-
) : (
48-
<p className="lead text-center">No jobs to show</p>
49-
)}
50-
<a
51-
href={getJobsUrl({
52-
repo: originalProject,
53-
revision: originalRevision,
54-
searchStr: `${platform} ${suite}`,
55-
})}
56-
target="_blank"
57-
rel="noopener noreferrer"
58-
>
59-
Go to treeherder Job View
60-
</a>
61-
</UncontrolledTooltip>
57+
<span style={{ textDecoration: 'underline', color: 'blue' }}>
58+
{originalValue}
59+
</span>
60+
</OverlayTrigger>
6261
</td>
6362
<td>
6463
{originalValue < newValue && <span>&lt;</span>}
6564
{originalValue > newValue && <span>&gt;</span>}
6665
</td>
6766
<td>
68-
<span
69-
style={{ textDecoration: 'underline', color: 'blue' }}
70-
id={`newValue${hashkey}`}
67+
<OverlayTrigger
68+
placement="top"
69+
overlay={
70+
<Tooltip>
71+
{newJobs.size > 0 ? (
72+
Array.from(newJobs).map(([jobName, duration]) => (
73+
<p key={jobName}>
74+
{jobName}: {duration.join(', ')}
75+
</p>
76+
))
77+
) : (
78+
<p className="lead text-center">No jobs to show</p>
79+
)}
80+
<a
81+
href={getJobsUrl({
82+
repo: newProject,
83+
revision: newRevision,
84+
searchStr: `${platform} ${suite}`,
85+
})}
86+
target="_blank"
87+
rel="noopener noreferrer"
88+
>
89+
Go to treeherder Job View
90+
</a>
91+
</Tooltip>
92+
}
93+
delay={{ show: 0, hide: 0 }}
7194
>
72-
{newValue}
73-
</span>
95+
<span style={{ textDecoration: 'underline', color: 'blue' }}>
96+
{newValue}
97+
</span>
98+
</OverlayTrigger>
7499
</td>
75-
<UncontrolledTooltip
76-
placement="top"
77-
target={`newValue${hashkey}`}
78-
autohide={false}
79-
>
80-
{newJobs.size > 0 ? (
81-
Array.from(newJobs).map(([jobName, duration]) => (
82-
<p>
83-
{jobName}: {duration.join(', ')}
84-
</p>
85-
))
86-
) : (
87-
<p className="lead text-center">No jobs to show</p>
88-
)}
89-
<a
90-
href={getJobsUrl({
91-
repo: newProject,
92-
revision: newRevision,
93-
searchStr: `${platform} ${suite}`,
94-
})}
95-
target="_blank"
96-
rel="noopener noreferrer"
97-
>
98-
Go to treeherder Job View
99-
</a>
100-
</UncontrolledTooltip>
101100
<td>{originalFailures}</td>
102101
<td>
103102
{originalFailures < newFailures && <span>&lt;</span>}

ui/infra-compare/InfraCompareTableView.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
3-
import { Col, Row, Container, Alert } from 'reactstrap';
3+
import { Col, Row, Container, Alert } from 'react-bootstrap';
44

55
import ErrorMessages from '../shared/ErrorMessages';
66
import { genericErrorMessage, errorMessageClass } from '../helpers/constants';
@@ -211,7 +211,7 @@ export default class InfraCompareTableView extends React.Component {
211211
{jobsNotDisplayed && jobsNotDisplayed.length > 0 && (
212212
<Row className="pt-5 justify-content-center">
213213
<Col small="12" className="px-0 max-width-default">
214-
<Alert color="warning">
214+
<Alert variant="warning">
215215
<TruncatedText
216216
title="Tests without results: "
217217
maxLength={174}

ui/intermittent-failures/App.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import { Route, Switch, Redirect } from 'react-router-dom';
3-
import { Container } from 'reactstrap';
3+
import { Container } from 'react-bootstrap';
44
import { hot } from 'react-hot-loader/root';
55

66
import ErrorMessages from '../shared/ErrorMessages';

ui/intermittent-failures/BugDetailsView.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import { Row, Col, Breadcrumb, BreadcrumbItem } from 'reactstrap';
2+
import { Row, Col, Breadcrumb, BreadcrumbItem } from 'react-bootstrap';
33
import { Link } from 'react-router-dom';
44
import ReactTable from 'react-table-6';
55
import PropTypes from 'prop-types';

ui/intermittent-failures/DateOptions.jsx

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import { ButtonDropdown, DropdownToggle } from 'reactstrap';
2+
import { DropdownButton } from 'react-bootstrap';
33
import moment from 'moment';
44
import PropTypes from 'prop-types';
55

@@ -12,15 +12,10 @@ export default class DateOptions extends React.Component {
1212
constructor(props) {
1313
super(props);
1414
this.state = {
15-
dropdownOpen: false,
1615
dateRange: '',
1716
};
1817
}
1918

20-
toggle = () => {
21-
this.setState((prevState) => ({ dropdownOpen: !prevState.dropdownOpen }));
22-
};
23-
2419
updateDateRange = (dateRange) => {
2520
this.setState({ dateRange });
2621
if (dateRange === 'custom range') {
@@ -42,7 +37,7 @@ export default class DateOptions extends React.Component {
4237

4338
render() {
4439
const { updateState } = this.props;
45-
const { dropdownOpen, dateRange } = this.state;
40+
const { dateRange } = this.state;
4641
const dateOptions = [
4742
'last 7 days',
4843
'last 30 days',
@@ -52,18 +47,13 @@ export default class DateOptions extends React.Component {
5247

5348
return (
5449
<div className="d-inline-block">
55-
<ButtonDropdown
56-
className="mr-3"
57-
isOpen={dropdownOpen}
58-
toggle={this.toggle}
59-
>
60-
<DropdownToggle caret>date range</DropdownToggle>
50+
<DropdownButton className="mr-3" title="date range">
6151
<DropdownMenuItems
6252
options={dateOptions}
6353
updateData={this.updateDateRange}
6454
selectedItem={dateRange}
6555
/>
66-
</ButtonDropdown>
56+
</DropdownButton>
6757
{dateRange === 'custom range' && (
6858
<DateRangePicker updateState={updateState} />
6959
)}

ui/intermittent-failures/DateRangePicker.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { DateRangePickerPhrases } from 'react-dates/lib/defaultPhrases';
55
import { DateRangePicker as DatePickerAirbnb } from 'react-dates';
66
import moment from 'moment';
77
import PropTypes from 'prop-types';
8-
import { Button } from 'reactstrap';
8+
import { Button } from 'react-bootstrap';
99

1010
import { ISODate } from './helpers';
1111

@@ -91,7 +91,7 @@ export default class DateRangePicker extends React.Component {
9191
isOutsideRange={(day) => moment().diff(day) < 0}
9292
phrases={defaultPhrases}
9393
/>
94-
<Button color="secondary" className="ml-3" onClick={this.updateData}>
94+
<Button variant="secondary" className="ml-3" onClick={this.updateData}>
9595
update
9696
</Button>
9797
</div>

0 commit comments

Comments
 (0)