Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix carousel RTL and refactor code, fix rtl swipe issues #32913

Merged
merged 9 commits into from
Mar 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .bundlewatch.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
},
{
"path": "./dist/js/bootstrap.bundle.min.js",
"maxSize": "22.5 kB"
"maxSize": "22.75 kB"
},
{
"path": "./dist/js/bootstrap.esm.js",
Expand Down
95 changes: 50 additions & 45 deletions js/src/carousel.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import {
emulateTransitionEnd,
getElementFromSelector,
getTransitionDurationFromElement,
isVisible,
isRTL,
isVisible,
reflow,
triggerTransitionEnd,
typeCheckConfig
Expand Down Expand Up @@ -56,8 +56,8 @@ const DefaultType = {
touch: 'boolean'
}

const DIRECTION_NEXT = 'next'
const DIRECTION_PREV = 'prev'
const ORDER_NEXT = 'next'
const ORDER_PREV = 'prev'
const DIRECTION_LEFT = 'left'
const DIRECTION_RIGHT = 'right'

Expand Down Expand Up @@ -137,7 +137,7 @@ class Carousel extends BaseComponent {

next() {
if (!this._isSliding) {
this._slide(DIRECTION_NEXT)
this._slide(ORDER_NEXT)
}
}

Expand All @@ -151,7 +151,7 @@ class Carousel extends BaseComponent {

prev() {
if (!this._isSliding) {
this._slide(DIRECTION_PREV)
this._slide(ORDER_PREV)
}
}

Expand Down Expand Up @@ -208,11 +208,11 @@ class Carousel extends BaseComponent {
return
}

const direction = index > activeIndex ?
DIRECTION_NEXT :
DIRECTION_PREV
const order = index > activeIndex ?
ORDER_NEXT :
ORDER_PREV

this._slide(direction, this._items[index])
this._slide(order, this._items[index])
}

dispose() {
Expand Down Expand Up @@ -251,23 +251,11 @@ class Carousel extends BaseComponent {

this.touchDeltaX = 0

// swipe left
if (direction > 0) {
if (isRTL()) {
this.next()
} else {
this.prev()
}
if (!direction) {
return
}

// swipe right
if (direction < 0) {
if (isRTL()) {
this.prev()
} else {
this.next()
}
}
this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT)
}

_addEventListeners() {
Expand Down Expand Up @@ -350,18 +338,10 @@ class Carousel extends BaseComponent {

if (event.key === ARROW_LEFT_KEY) {
event.preventDefault()
if (isRTL()) {
this.next()
} else {
this.prev()
}
this._slide(DIRECTION_LEFT)
} else if (event.key === ARROW_RIGHT_KEY) {
event.preventDefault()
if (isRTL()) {
this.prev()
} else {
this.next()
}
this._slide(DIRECTION_RIGHT)
}
}

Expand All @@ -373,19 +353,18 @@ class Carousel extends BaseComponent {
return this._items.indexOf(element)
}

_getItemByDirection(direction, activeElement) {
const isNextDirection = direction === DIRECTION_NEXT
const isPrevDirection = direction === DIRECTION_PREV
_getItemByOrder(order, activeElement) {
const isNext = order === ORDER_NEXT
const isPrev = order === ORDER_PREV
const activeIndex = this._getItemIndex(activeElement)
const lastItemIndex = this._items.length - 1
const isGoingToWrap = (isPrevDirection && activeIndex === 0) ||
(isNextDirection && activeIndex === lastItemIndex)
const isGoingToWrap = (isPrev && activeIndex === 0) || (isNext && activeIndex === lastItemIndex)

if (isGoingToWrap && !this._config.wrap) {
return activeElement
}

const delta = direction === DIRECTION_PREV ? -1 : 1
const delta = isPrev ? -1 : 1
const itemIndex = (activeIndex + delta) % this._items.length

return itemIndex === -1 ?
Expand Down Expand Up @@ -441,17 +420,19 @@ class Carousel extends BaseComponent {
}
}

_slide(direction, element) {
_slide(directionOrOrder, element) {
const order = this._directionToOrder(directionOrOrder)
const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)
const activeElementIndex = this._getItemIndex(activeElement)
const nextElement = element || (activeElement && this._getItemByDirection(direction, activeElement))
const nextElement = element || this._getItemByOrder(order, activeElement)

const nextElementIndex = this._getItemIndex(nextElement)
const isCycling = Boolean(this._interval)

const directionalClassName = direction === DIRECTION_NEXT ? CLASS_NAME_START : CLASS_NAME_END
const orderClassName = direction === DIRECTION_NEXT ? CLASS_NAME_NEXT : CLASS_NAME_PREV
const eventDirectionName = direction === DIRECTION_NEXT ? DIRECTION_LEFT : DIRECTION_RIGHT
const isNext = order === ORDER_NEXT
const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END
const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV
const eventDirectionName = this._orderToDirection(order)

if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {
this._isSliding = false
Expand Down Expand Up @@ -524,6 +505,30 @@ class Carousel extends BaseComponent {
}
}

_directionToOrder(direction) {
if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {
return direction
}

if (isRTL()) {
return direction === DIRECTION_RIGHT ? ORDER_PREV : ORDER_NEXT
}

return direction === DIRECTION_RIGHT ? ORDER_NEXT : ORDER_PREV
}

_orderToDirection(order) {
if (![ORDER_NEXT, ORDER_PREV].includes(order)) {
return order
}

if (isRTL()) {
return order === ORDER_NEXT ? DIRECTION_LEFT : DIRECTION_RIGHT
}

return order === ORDER_NEXT ? DIRECTION_RIGHT : DIRECTION_LEFT
}

// Static

static carouselInterface(element, config) {
Expand Down
Loading