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

feat(carousel): tries to update itemsPerSlide #6249

Draft
wants to merge 3 commits into
base: development
Choose a base branch
from
Draft
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
4 changes: 4 additions & 0 deletions apps/ngx-bootstrap-docs/src/assets/css/style.scss
Original file line number Diff line number Diff line change
Expand Up @@ -762,3 +762,7 @@ a:hover {
}
}
}

.carousel-item {
margin-right: auto;
}
234 changes: 117 additions & 117 deletions libs/doc-pages/carousel/src/lib/carousel-section.list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,123 +44,123 @@ export const demoComponentContent: ContentSection[] = [
html: require('!!raw-loader!./demos/basic/basic.html'),
outlet: DemoCarouseBasicComponent
},
{
title: 'Optional captions',
anchor: 'captions',
description: `<p>Add captions to your slides easily with the <code>.carousel-caption</code>
element within any <code>&lt;slide></code>. Place just about any optional HTML within there
and it will be automatically aligned and formatted.</p>`,
component: require('!!raw-loader!./demos/captions/captions.ts'),
html: require('!!raw-loader!./demos/captions/captions.html'),
outlet: DemoCarouselCaptionsComponent
},
{
title: 'Configuring defaults',
anchor: 'config-defaults',
component: require('!!raw-loader!./demos/config/config.ts'),
html: require('!!raw-loader!./demos/config/config.html'),
outlet: DemoCarouselConfigComponent
},
{
title: 'Dynamic Slides',
anchor: 'dynamic-slides',
component: require('!!raw-loader!./demos/dynamic/dynamic.ts'),
html: require('!!raw-loader!./demos/dynamic/dynamic.html'),
outlet: DemoCarouselDynamicComponent
},
{
title: 'Pause on hover',
anchor: 'pause-on-hover',
description: `<p>If <code>noPause</code> is set to <code>false</code>
, carousel autoplay will be stopped when carousel receives hover.</p>`,
component: require('!!raw-loader!./demos/pause-on-hover/pause-on-hover.ts'),
html: require('!!raw-loader!./demos/pause-on-hover/pause-on-hover.html'),
outlet: DemoCarouselPauseOnHoverComponent
},
{
title: 'Pause on focus',
anchor: 'pause-on-focus',
description: `<p>If <code>pauseOnFocus</code> is set to <code>true</code>
, carousel autoplay will be stopped when carousel receives focus.</p>`,
component: require('!!raw-loader!./demos/pause-on-focus/pause-on-focus.ts'),
html: require('!!raw-loader!./demos/pause-on-focus/pause-on-focus.html'),
outlet: DemoCarouselPauseOnFocusComponent
},
{
title: 'Custom content',
anchor: 'custom-content',
component: require('!!raw-loader!./demos/custom-content/custom-content.ts'),
html: require('!!raw-loader!./demos/custom-content/custom-content.html'),
outlet: DemoCarouselCustomContentComponent
},
{
title: 'Disable slide looping',
anchor: 'disable-looping',
component: require('!!raw-loader!./demos/disable-looping/disable-looping.ts'),
html: require('!!raw-loader!./demos/disable-looping/disable-looping.html'),
outlet: DemoCarouselDisableLoopingComponent
},
{
title: 'Disable indicator',
anchor: 'disable-indicator',
component: require('!!raw-loader!./demos/disable-indicator/disable-indicator.ts'),
html: require('!!raw-loader!./demos/disable-indicator/disable-indicator.html'),
outlet: DemoCarouselDisableIndicatorComponent
},
{
title: 'Interval',
anchor: 'slides-interval',
component: require('!!raw-loader!./demos/interval/interval.ts'),
html: require('!!raw-loader!./demos/interval/interval.html'),
outlet: DemoCarouselIntervalComponent
},
{
title: 'Slide changed event',
anchor: 'slide-changed-event',
component: require('!!raw-loader!./demos/slide-changed-event/slide-changed-event.ts'),
html: require('!!raw-loader!./demos/slide-changed-event/slide-changed-event.html'),
outlet: DemoCarouselSlideChangedEventComponent
},
{
title: 'Multilist',
anchor: 'multilist',
component: require('!!raw-loader!./demos/multilist/multilist.ts'),
html: require('!!raw-loader!./demos/multilist/multilist.html'),
outlet: DemoCarouselMultilistComponent
},
{
title: 'Multilist Single Offset',
anchor: 'multilist-single-offset',
component: require('!!raw-loader!./demos/multilist-single-offset/multilist-single-offset.ts'),
html: require('!!raw-loader!./demos/multilist-single-offset/multilist-single-offset.html'),
outlet: DemoCarouselMultilistSingleOffsetComponent
},
{
title: 'Multilist Start From Index',
anchor: 'multilist-from-index',
component: require('!!raw-loader!./demos/multilist-from-index/multilist-from-index.ts'),
html: require('!!raw-loader!./demos/multilist-from-index/multilist-from-index.html'),
outlet: DemoCarouselMultilistFromIndexComponent
},
{
title: 'Multilist Indicators By Chunk',
anchor: 'multilist-indicators-by-chunk',
component: require('!!raw-loader!./demos/multilist-indicators-by-chunk/multilist-indicators-by-chunk.ts'),
html: require('!!raw-loader!./demos/multilist-indicators-by-chunk/multilist-indicators-by-chunk.html'),
outlet: DemoCarouselMultilistIndicatorsByChunkComponent
},
{
title: 'With animation',
anchor: 'animated',
component: require('!!raw-loader!./demos/animated/animated.ts'),
html: require('!!raw-loader!./demos/animated/animated.html'),
outlet: DemoCarouseAnimatedComponent
},
{
title: 'Accessibility',
anchor: 'accessibility',
outlet: DemoAccessibilityComponent
}
// {
// title: 'Optional captions',
// anchor: 'captions',
// description: `<p>Add captions to your slides easily with the <code>.carousel-caption</code>
// element within any <code>&lt;slide></code>. Place just about any optional HTML within there
// and it will be automatically aligned and formatted.</p>`,
// component: require('!!raw-loader!./demos/captions/captions.ts'),
// html: require('!!raw-loader!./demos/captions/captions.html'),
// outlet: DemoCarouselCaptionsComponent
// },
// {
// title: 'Configuring defaults',
// anchor: 'config-defaults',
// component: require('!!raw-loader!./demos/config/config.ts'),
// html: require('!!raw-loader!./demos/config/config.html'),
// outlet: DemoCarouselConfigComponent
// },
// {
// title: 'Dynamic Slides',
// anchor: 'dynamic-slides',
// component: require('!!raw-loader!./demos/dynamic/dynamic.ts'),
// html: require('!!raw-loader!./demos/dynamic/dynamic.html'),
// outlet: DemoCarouselDynamicComponent
// },
// {
// title: 'Pause on hover',
// anchor: 'pause-on-hover',
// description: `<p>If <code>noPause</code> is set to <code>false</code>
// , carousel autoplay will be stopped when carousel receives hover.</p>`,
// component: require('!!raw-loader!./demos/pause-on-hover/pause-on-hover.ts'),
// html: require('!!raw-loader!./demos/pause-on-hover/pause-on-hover.html'),
// outlet: DemoCarouselPauseOnHoverComponent
// },
// {
// title: 'Pause on focus',
// anchor: 'pause-on-focus',
// description: `<p>If <code>pauseOnFocus</code> is set to <code>true</code>
// , carousel autoplay will be stopped when carousel receives focus.</p>`,
// component: require('!!raw-loader!./demos/pause-on-focus/pause-on-focus.ts'),
// html: require('!!raw-loader!./demos/pause-on-focus/pause-on-focus.html'),
// outlet: DemoCarouselPauseOnFocusComponent
// },
// {
// title: 'Custom content',
// anchor: 'custom-content',
// component: require('!!raw-loader!./demos/custom-content/custom-content.ts'),
// html: require('!!raw-loader!./demos/custom-content/custom-content.html'),
// outlet: DemoCarouselCustomContentComponent
// },
// {
// title: 'Disable slide looping',
// anchor: 'disable-looping',
// component: require('!!raw-loader!./demos/disable-looping/disable-looping.ts'),
// html: require('!!raw-loader!./demos/disable-looping/disable-looping.html'),
// outlet: DemoCarouselDisableLoopingComponent
// },
// {
// title: 'Disable indicator',
// anchor: 'disable-indicator',
// component: require('!!raw-loader!./demos/disable-indicator/disable-indicator.ts'),
// html: require('!!raw-loader!./demos/disable-indicator/disable-indicator.html'),
// outlet: DemoCarouselDisableIndicatorComponent
// },
// {
// title: 'Interval',
// anchor: 'slides-interval',
// component: require('!!raw-loader!./demos/interval/interval.ts'),
// html: require('!!raw-loader!./demos/interval/interval.html'),
// outlet: DemoCarouselIntervalComponent
// },
// {
// title: 'Slide changed event',
// anchor: 'slide-changed-event',
// component: require('!!raw-loader!./demos/slide-changed-event/slide-changed-event.ts'),
// html: require('!!raw-loader!./demos/slide-changed-event/slide-changed-event.html'),
// outlet: DemoCarouselSlideChangedEventComponent
// },
// {
// title: 'Multilist',
// anchor: 'multilist',
// component: require('!!raw-loader!./demos/multilist/multilist.ts'),
// html: require('!!raw-loader!./demos/multilist/multilist.html'),
// outlet: DemoCarouselMultilistComponent
// },
// {
// title: 'Multilist Single Offset',
// anchor: 'multilist-single-offset',
// component: require('!!raw-loader!./demos/multilist-single-offset/multilist-single-offset.ts'),
// html: require('!!raw-loader!./demos/multilist-single-offset/multilist-single-offset.html'),
// outlet: DemoCarouselMultilistSingleOffsetComponent
// },
// {
// title: 'Multilist Start From Index',
// anchor: 'multilist-from-index',
// component: require('!!raw-loader!./demos/multilist-from-index/multilist-from-index.ts'),
// html: require('!!raw-loader!./demos/multilist-from-index/multilist-from-index.html'),
// outlet: DemoCarouselMultilistFromIndexComponent
// },
// {
// title: 'Multilist Indicators By Chunk',
// anchor: 'multilist-indicators-by-chunk',
// component: require('!!raw-loader!./demos/multilist-indicators-by-chunk/multilist-indicators-by-chunk.ts'),
// html: require('!!raw-loader!./demos/multilist-indicators-by-chunk/multilist-indicators-by-chunk.html'),
// outlet: DemoCarouselMultilistIndicatorsByChunkComponent
// },
// {
// title: 'With animation',
// anchor: 'animated',
// component: require('!!raw-loader!./demos/animated/animated.ts'),
// html: require('!!raw-loader!./demos/animated/animated.html'),
// outlet: DemoCarouseAnimatedComponent
// },
// {
// title: 'Accessibility',
// anchor: 'accessibility',
// outlet: DemoAccessibilityComponent
// }
]
},
{
Expand Down
13 changes: 12 additions & 1 deletion libs/doc-pages/carousel/src/lib/demos/basic/basic.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
<carousel>
<carousel [(itemsPerSlide)]="itemPerSlide" [interval]='0'>
<slide>
<img src="assets/images/nature/1.jpg" alt="first slide" style="display: block; width: 100%;">
</slide>
<slide>
<img src="assets/images/nature/2.jpg" alt="second slide" style="display: block; width: 100%;">
</slide>
<slide>
<img src="assets/images/nature/3.jpg" alt="third slide" style="display: block; width: 100%;">
</slide>
<slide>
<img src="assets/images/nature/1.jpg" alt="first slide" style="display: block; width: 100%;">
</slide>
Expand All @@ -9,3 +18,5 @@
<img src="assets/images/nature/3.jpg" alt="third slide" style="display: block; width: 100%;">
</slide>
</carousel>

<button (click)='changeItemPerSlide()'>Click</button>
8 changes: 7 additions & 1 deletion libs/doc-pages/carousel/src/lib/demos/basic/basic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,10 @@ import { Component } from '@angular/core';
selector: 'demo-carousel-basic',
templateUrl: './basic.html'
})
export class DemoCarouseBasicComponent {}
export class DemoCarouseBasicComponent {
itemPerSlide = 3;

changeItemPerSlide() {
this.itemPerSlide = 2;
}
}
18 changes: 16 additions & 2 deletions src/carousel/carousel.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,21 @@ export class CarouselComponent implements AfterViewInit, OnDestroy {
works ONLY if singleSlideOffset = FALSE */
@Input() indicatorsByChunk = false;
/* If value more then 1 — carousel works in multilist mode */
@Input() itemsPerSlide = 1;
@Input()
set itemsPerSlide(index: number) {
this._currentItemPerSlide = index;
if (this._currentItemPerSlide > 1 && this.slides?.length) {
this._chunkedSlides = chunkByNumber(
this.mapSlidesAndIndexes(),
this._currentItemPerSlide
);
this.selectInitialSlides();
}
}

get itemsPerSlide(): number {
return this._currentItemPerSlide;
}
/* If `true` — carousel shifts by one element. By default carousel shifts by number
of visible elements (itemsPerSlide field) */
@Input() singleSlideOffset = false;
Expand Down Expand Up @@ -112,7 +126,7 @@ export class CarouselComponent implements AfterViewInit, OnDestroy {
protected _currentVisibleSlidesIndex = 0;
protected isPlaying = false;
protected destroyed = false;

protected _currentItemPerSlide = 1;
get isBs4(): boolean {
return !isBs3();
}
Expand Down