Skip to content

Commit c460a6e

Browse files
gioboaDomainv
authored andcommitted
feat(carousel): indicators for group of slides (#5234)
Fix: #5233 with indicatorsByChunk input the carousel indicators indicate slides chunks - works ONLY if singleSlideOffset = FALSE
1 parent 8098924 commit c460a6e

File tree

7 files changed

+65
-3
lines changed

7 files changed

+65
-3
lines changed

demo/src/app/components/+carousel/carousel-section.list.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { DemoCarouselSlideChangedEventComponent } from './demos/slide-changed-ev
1111
import { DemoCarouselMultilistComponent } from './demos/multilist/multilist';
1212
import { DemoCarouselMultilistSingleOffsetComponent } from './demos/multilist-single-offset/multilist-single-offset';
1313
import { DemoCarouselMultilistFromIndexComponent } from './demos/multilist-from-index/multilist-from-index';
14+
import { DemoCarouselMultilistIndicatorsByChunkComponent } from './demos/multilist-indicators-by-chunk/multilist-indicators-by-chunk';
1415
import { DemoAccessibilityComponent } from './demos/accessibility/accessibility';
1516

1617
import { ContentSection } from '../../docs/models/content-section.model';
@@ -129,6 +130,13 @@ export const demoComponentContent: ContentSection[] = [
129130
html: require('!!raw-loader!./demos/multilist-from-index/multilist-from-index.html'),
130131
outlet: DemoCarouselMultilistFromIndexComponent
131132
},
133+
{
134+
title: 'Multilist Indicators By Chunk',
135+
anchor: 'multilist-indicators-by-chunk',
136+
component: require('!!raw-loader?lang=typescript!./demos/multilist-indicators-by-chunk/multilist-indicators-by-chunk.ts'),
137+
html: require('!!raw-loader?lang=markup!./demos/multilist-indicators-by-chunk/multilist-indicators-by-chunk.html'),
138+
outlet: DemoCarouselMultilistIndicatorsByChunkComponent
139+
},
132140
{
133141
title: 'Accessibility',
134142
anchor: 'accessibility',

demo/src/app/components/+carousel/demos/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { DemoCarouselSlideChangedEventComponent } from './slide-changed-event/sl
1111
import { DemoCarouselMultilistComponent } from './multilist/multilist';
1212
import { DemoCarouselMultilistSingleOffsetComponent } from './multilist-single-offset/multilist-single-offset';
1313
import { DemoCarouselMultilistFromIndexComponent } from './multilist-from-index/multilist-from-index';
14+
import { DemoCarouselMultilistIndicatorsByChunkComponent } from './multilist-indicators-by-chunk/multilist-indicators-by-chunk';
1415
import { DemoAccessibilityComponent } from './accessibility/accessibility';
1516

1617
export const DEMO_COMPONENTS = [
@@ -28,5 +29,6 @@ export const DEMO_COMPONENTS = [
2829
DemoCarouselMultilistComponent,
2930
DemoCarouselMultilistSingleOffsetComponent,
3031
DemoCarouselMultilistFromIndexComponent,
32+
DemoCarouselMultilistIndicatorsByChunkComponent,
3133
DemoAccessibilityComponent
3234
];
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<p>
2+
If `true` - carousel indicators indicate slides chunks works ONLY if singleSlideOffset = FALSE
3+
</p>
4+
<carousel [itemsPerSlide]="itemsPerSlide"
5+
[singleSlideOffset]="false"
6+
[interval]="false"
7+
[indicatorsByChunk]="true">
8+
<slide *ngFor="let slide of slides; let index=index">
9+
<img [src]="slide.image" alt="image slide" style="display: block; width: 100%;">
10+
<div class="carousel-caption">
11+
<h4>Slide {{index}}</h4>
12+
</div>
13+
</slide>
14+
</carousel>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Component } from '@angular/core';
2+
3+
@Component({
4+
selector: 'demo-carousel-multilist-indicators-by-chunk',
5+
templateUrl: './multilist-indicators-by-chunk.html'
6+
})
7+
export class DemoCarouselMultilistIndicatorsByChunkComponent {
8+
itemsPerSlide = 3;
9+
10+
slides = [
11+
{image: 'assets/images/nature/1.jpg'},
12+
{image: 'assets/images/nature/2.jpg'},
13+
{image: 'assets/images/nature/3.jpg'},
14+
{image: 'assets/images/nature/4.jpg'},
15+
{image: 'assets/images/nature/5.jpg'},
16+
{image: 'assets/images/nature/6.jpg'},
17+
{image: 'assets/images/nature/7.jpg'},
18+
{image: 'assets/images/nature/8.jpg'},
19+
{image: 'assets/images/nature/1.jpg'},
20+
{image: 'assets/images/nature/2.jpg'}
21+
];
22+
}

src/carousel/carousel.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<div (mouseenter)="pause()" (mouseleave)="play()" (mouseup)="play()" class="carousel slide">
22
<ol class="carousel-indicators" *ngIf="showIndicators && slides.length > 1">
3-
<li *ngFor="let slidez of slides; let i = index;" [class.active]="slidez.active === true" (click)="selectSlide(i)"></li>
3+
<li *ngFor="let slidez of indicatorsSlides(); let i = index;" [class.active]="slidez.active === true" (click)="selectSlide(i)"></li>
44
</ol>
55
<div class="carousel-inner" [ngStyle]="{'display': multilist ? 'flex' : 'block'}"><ng-content></ng-content></div>
66
<a class="left carousel-control carousel-control-prev" [class.disabled]="activeSlide === 0 && noWrap" (click)="previousSlide()" *ngIf="slides.length > 1">

src/carousel/carousel.component.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ export class CarouselComponent implements AfterViewInit, OnDestroy {
4646
@Input() noPause: boolean;
4747
/* If `true` — carousel-indicators are visible */
4848
@Input() showIndicators: boolean;
49+
/* If `true` - carousel indicators indicate slides chunks
50+
works ONLY if singleSlideOffset = FALSE */
51+
@Input() indicatorsByChunk = false;
4952
/* If value more then 1 — carousel works in multilist mode */
5053
@Input() itemsPerSlide = 1;
5154
/* If `true` — carousel shifts by one element. By default carousel shifts by number
@@ -118,6 +121,9 @@ export class CarouselComponent implements AfterViewInit, OnDestroy {
118121

119122
ngAfterViewInit(): void {
120123
setTimeout(() => {
124+
if (this.singleSlideOffset) {
125+
this.indicatorsByChunk = false;
126+
}
121127
if (this.multilist) {
122128
this._chunkedSlides = chunkByNumber(
123129
this.mapSlidesAndIndexes(),
@@ -259,9 +265,9 @@ export class CarouselComponent implements AfterViewInit, OnDestroy {
259265
}
260266

261267
if (!this.multilist) {
262-
this.activeSlide = index;
268+
this.activeSlide = this.indicatorsByChunk ? index * this.itemsPerSlide : index;
263269
} else {
264-
this.selectSlideRange(index);
270+
this.selectSlideRange(this.indicatorsByChunk ? index * this.itemsPerSlide : index);
265271
}
266272
}
267273

@@ -308,6 +314,12 @@ export class CarouselComponent implements AfterViewInit, OnDestroy {
308314
return index === 0;
309315
}
310316

317+
indicatorsSlides(): SlideComponent[] {
318+
return this.slides.filter(
319+
(slide: SlideComponent, index: number) => !this.indicatorsByChunk || index % this.itemsPerSlide === 0
320+
);
321+
}
322+
311323
private selectInitialSlides(): void {
312324
const startIndex = this.startFromIndex <= this._slides.length
313325
? this.startFromIndex

src/carousel/carousel.config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ export class CarouselConfig {
1414
/** Show carousel-indicators */
1515
showIndicators = true;
1616

17+
/* If `true` - carousel indicators indicate slides chunks
18+
works ONLY if singleSlideOffset = FALSE */
19+
indicatorsByChunk = false;
20+
1721
/* If value more then 1 — carousel works in multilist mode */
1822
itemsPerSlide = 1;
1923

0 commit comments

Comments
 (0)