Skip to content

Commit d23b28a

Browse files
mkalishTheSharpieOne
authored andcommitted
feat(Carousel): add className to carousel components (#682)
Closes #669
1 parent 1e70e64 commit d23b28a

8 files changed

Lines changed: 134 additions & 11 deletions

File tree

docs/lib/Components/CarouselPage.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import CarouselExample from '../examples/Carousel';
66
const CarouselExampleSource = require('!!raw!../examples/Carousel');
77
import CarouselUncontrolledExample from '../examples/CarouselUncontrolled';
88
const CarouselUncontrolledExampleSource = require('!!raw!../examples/CarouselUncontrolled');
9+
import CarouselCustomTagExample from '../examples/CarouselCustomTag';
10+
const CarouselCustomTagExampleSource = require('!!raw!../examples/CarouselCustomTag');
911

1012
export default class CarouselPage extends React.Component {
1113
render() {
@@ -140,6 +142,16 @@ export default class CarouselPage extends React.Component {
140142
};`}
141143
</PrismCode>
142144
</pre>
145+
146+
<h3>Carousel using a tag and classname</h3>
147+
<div className="docs-example">
148+
<CarouselCustomTagExample />
149+
</div>
150+
<pre>
151+
<PrismCode className="language-jsx">
152+
{CarouselCustomTagExampleSource}
153+
</PrismCode>
154+
</pre>
143155
</div>
144156
);
145157
}

docs/lib/examples/Carousel.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,5 @@ class Example extends Component {
9393
}
9494
}
9595

96+
9697
export default Example;
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import React, { Component } from 'react';
2+
import {
3+
Carousel,
4+
CarouselItem,
5+
CarouselControl,
6+
CarouselIndicators,
7+
CarouselCaption
8+
} from 'reactstrap';
9+
10+
const items = [
11+
{
12+
altText: 'Slide 1',
13+
caption: 'Slide 1'
14+
},
15+
{
16+
altText: 'Slide 2',
17+
caption: 'Slide 2'
18+
},
19+
{
20+
altText: 'Slide 3',
21+
caption: 'Slide 3'
22+
}
23+
];
24+
25+
class Example extends Component {
26+
constructor(props) {
27+
super(props);
28+
this.state = { activeIndex: 0 };
29+
this.next = this.next.bind(this);
30+
this.previous = this.previous.bind(this);
31+
this.goToIndex = this.goToIndex.bind(this);
32+
this.onExiting = this.onExiting.bind(this);
33+
this.onExited = this.onExited.bind(this);
34+
}
35+
36+
onExiting() {
37+
this.animating = true;
38+
}
39+
40+
onExited() {
41+
this.animating = false;
42+
}
43+
44+
next() {
45+
if (this.animating) return;
46+
const nextIndex = this.state.activeIndex === items.length - 1 ? 0 : this.state.activeIndex + 1;
47+
this.setState({ activeIndex: nextIndex });
48+
}
49+
50+
previous() {
51+
if (this.animating) return;
52+
const nextIndex = this.state.activeIndex === 0 ? items.length - 1 : this.state.activeIndex - 1;
53+
this.setState({ activeIndex: nextIndex });
54+
}
55+
56+
goToIndex(newIndex) {
57+
if (this.animating) return;
58+
this.setState({ activeIndex: newIndex });
59+
}
60+
61+
render() {
62+
const { activeIndex } = this.state;
63+
64+
const slides = items.map((item) => {
65+
return (
66+
<CarouselItem
67+
className="custom-tag"
68+
tag="div"
69+
onExiting={this.onExiting}
70+
onExited={this.onExited}
71+
>
72+
<CarouselCaption className="text-danger" captionText={item.caption} captionHeader={item.caption} />
73+
</CarouselItem>
74+
);
75+
});
76+
77+
return (
78+
<div>
79+
<style>{`
80+
.custom-tag {
81+
max-width: 100%;
82+
height: 500px;
83+
background: black;
84+
}
85+
`}</style>
86+
<Carousel
87+
activeIndex={activeIndex}
88+
next={this.next}
89+
previous={this.previous}
90+
>
91+
<CarouselIndicators items={items} activeIndex={activeIndex} onClickHandler={this.goToIndex} />
92+
{slides}
93+
<CarouselControl direction="prev" directionText="Previous" onClickHandler={this.previous} />
94+
<CarouselControl direction="next" directionText="Next" onClickHandler={this.next} />
95+
</Carousel>
96+
</div>
97+
);
98+
}
99+
}
100+
101+
export default Example;

src/Carousel.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,11 @@ class Carousel extends React.Component {
105105
}
106106

107107
render() {
108-
const { children, cssModule, slide } = this.props;
108+
const { children, cssModule, slide, className } = this.props;
109109
const outerClasses = mapToCssModules(classNames(
110+
className,
110111
'carousel',
111-
slide && 'slide',
112+
slide && 'slide'
112113
), cssModule);
113114

114115
const innerClasses = mapToCssModules(classNames(
@@ -190,6 +191,7 @@ Carousel.propTypes = {
190191
// controls whether the slide animation on the Carousel works or not
191192
slide: PropTypes.bool,
192193
cssModule: PropTypes.object,
194+
className: PropTypes.string,
193195
};
194196

195197
Carousel.defaultProps = {

src/CarouselCaption.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import classNames from 'classnames';
44
import { mapToCssModules } from './utils';
55

66
const CarouselCaption = (props) => {
7-
const { captionHeader, captionText, cssModule } = props;
7+
const { captionHeader, captionText, cssModule, className } = props;
88
const classes = mapToCssModules(classNames(
9+
className,
910
'carousel-caption',
1011
'd-none',
1112
'd-md-block'
@@ -22,7 +23,8 @@ const CarouselCaption = (props) => {
2223
CarouselCaption.propTypes = {
2324
captionHeader: PropTypes.string,
2425
captionText: PropTypes.string.isRequired,
25-
cssModule: PropTypes.object
26+
cssModule: PropTypes.object,
27+
className: PropTypes.string,
2628
};
2729

2830
export default CarouselCaption;

src/CarouselControl.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import classNames from 'classnames';
44
import { mapToCssModules } from './utils';
55

66
const CarouselControl = (props) => {
7-
const { direction, onClickHandler, cssModule, directionText } = props;
7+
const { direction, onClickHandler, cssModule, directionText, className } = props;
88

99
const anchorClasses = mapToCssModules(classNames(
10+
className,
1011
`carousel-control-${direction}`
1112
), cssModule);
1213

@@ -39,7 +40,8 @@ CarouselControl.propTypes = {
3940
direction: PropTypes.oneOf(['prev', 'next']).isRequired,
4041
onClickHandler: PropTypes.func.isRequired,
4142
cssModule: PropTypes.object,
42-
directionText: PropTypes.string
43+
directionText: PropTypes.string,
44+
className: PropTypes.string,
4345
};
4446

4547
export default CarouselControl;

src/CarouselIndicators.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import classNames from 'classnames';
44
import { mapToCssModules } from './utils';
55

66
const CarouselIndicators = (props) => {
7-
const { items, activeIndex, cssModule, onClickHandler } = props;
7+
const { items, activeIndex, cssModule, onClickHandler, className } = props;
88

9-
const listClasses = mapToCssModules('carousel-indicators', cssModule);
9+
const listClasses = mapToCssModules(classNames(className, 'carousel-indicators', cssModule));
1010
const indicators = items.map((item, idx) => {
1111
const indicatorClasses = mapToCssModules(classNames(
1212
{ active: activeIndex === idx }
@@ -33,7 +33,8 @@ CarouselIndicators.propTypes = {
3333
items: PropTypes.array.isRequired,
3434
activeIndex: PropTypes.number.isRequired,
3535
cssModule: PropTypes.object,
36-
onClickHandler: PropTypes.func.isRequired
36+
onClickHandler: PropTypes.func.isRequired,
37+
className: PropTypes.string,
3738
};
3839

3940
export default CarouselIndicators;

src/CarouselItem.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,11 @@ class CarouselItem extends React.Component {
5050
}
5151

5252
render() {
53-
const { src, altText, in: isIn, children, cssModule, slide, tag: Tag, ...transitionProps } = this.props;
53+
const { src, altText, in: isIn, children, cssModule, slide, tag: Tag, className, ...transitionProps } = this.props;
5454
const imgClasses = mapToCssModules(classNames(
55+
className,
5556
'd-block',
56-
'img-fluid'
57+
'img-fluid',
5758
), cssModule);
5859

5960
return (
@@ -106,6 +107,7 @@ CarouselItem.propTypes = {
106107
type: PropTypes.oneOf([CarouselCaption]),
107108
}),
108109
slide: PropTypes.bool,
110+
className: PropTypes.string,
109111
};
110112

111113
CarouselItem.defaultProps = {

0 commit comments

Comments
 (0)