Skip to content

Commit

Permalink
feat(offcanvas): add static backdrop option (#4367)
Browse files Browse the repository at this point in the history
feat(offcanvas): add 'static' backdrop option
  • Loading branch information
jnizet committed Aug 3, 2022
1 parent cb4406d commit fe4c798
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 3 deletions.
Expand Up @@ -15,6 +15,7 @@ <h4 class="offcanvas-title">Offcanvas title</h4>
<button class="btn btn-lg btn-outline-primary mb-2 me-2" (click)="openTop(content)">Top position</button>
<button class="btn btn-lg btn-outline-primary mb-2 me-2" (click)="openBottom(content)">Bottom position</button>
<button class="btn btn-lg btn-outline-primary mb-2 me-2" (click)="openNoBackdrop(content)">No backdrop</button>
<button class="btn btn-lg btn-outline-primary mb-2 me-2" (click)="openStaticBackdrop(content)">Static backdrop</button>
<button class="btn btn-lg btn-outline-primary mb-2 me-2" (click)="openScroll(content)">Scrolling of main content enabled</button>
<button class="btn btn-lg btn-outline-primary mb-2 me-2" (click)="openNoKeyboard(content)">Escape does not dismiss</button>
<button class="btn btn-lg btn-outline-primary mb-2 me-2" (click)="openNoAnimation(content)">No animation</button>
Expand Down
Expand Up @@ -27,6 +27,10 @@ export class NgbdOffcanvasOptions {
this.offcanvasService.open(content, { backdrop: false });
}

openStaticBackdrop(content: TemplateRef<any>) {
this.offcanvasService.open(content, { backdrop: 'static' });
}

openScroll(content: TemplateRef<any>) {
this.offcanvasService.open(content, { scroll: true });
}
Expand Down
13 changes: 13 additions & 0 deletions src/offcanvas/offcanvas-backdrop.spec.ts
Expand Up @@ -44,4 +44,17 @@ describe('ngb-offcanvas-backdrop', () => {

expect(emittedEvent).toBe(OffcanvasDismissReasons.BACKDROP_CLICK);
});

it('should not emit dismiss event on mousedown if static is true', () => {
const fixture = TestBed.createComponent(NgbOffcanvasBackdrop);
fixture.componentInstance.static = true;
fixture.detectChanges();

let emittedEvent: any;
fixture.componentInstance.dismissEvent.subscribe(event => emittedEvent = event);
fixture.nativeElement.dispatchEvent(new Event('mousedown'));
fixture.detectChanges();

expect(emittedEvent).toBeUndefined();
});
});
7 changes: 6 additions & 1 deletion src/offcanvas/offcanvas-backdrop.ts
Expand Up @@ -21,6 +21,7 @@ import {OffcanvasDismissReasons} from './offcanvas-dismiss-reasons';
export class NgbOffcanvasBackdrop implements OnInit {
@Input() animation: boolean;
@Input() backdropClass: string;
@Input() static: boolean;

@Output('dismiss') dismissEvent = new EventEmitter();

Expand All @@ -43,5 +44,9 @@ export class NgbOffcanvasBackdrop implements OnInit {
{animation: this.animation, runningTransition: 'stop'});
}

dismiss() { this.dismissEvent.emit(OffcanvasDismissReasons.BACKDROP_CLICK); }
dismiss() {
if (!this.static) {
this.dismissEvent.emit(OffcanvasDismissReasons.BACKDROP_CLICK);
}
}
}
6 changes: 6 additions & 0 deletions src/offcanvas/offcanvas-config.spec.ts
Expand Up @@ -21,4 +21,10 @@ describe('NgbOffcanvasConfig', () => {
expect(config.position).toBe('start');
expect(config.scroll).toBeFalse();
}));

it('should compile when setting config backdrop to static',
inject([NgbOffcanvasConfig], (config: NgbOffcanvasConfig) => {
config.backdrop = 'static';
expect().nothing();
}));
});
5 changes: 3 additions & 2 deletions src/offcanvas/offcanvas-config.ts
Expand Up @@ -24,10 +24,11 @@ export interface NgbOffcanvasOptions {

/**
* If `true`, the backdrop element will be created for a given offcanvas.
* If 'static', clicking the backdrop won't close the offcanvas.
*
* Default value is `true`.
*/
backdrop?: boolean;
backdrop?: boolean | 'static';

/**
* A custom class to append to the offcanvas backdrop.
Expand Down Expand Up @@ -93,7 +94,7 @@ export interface NgbOffcanvasOptions {
export class NgbOffcanvasConfig implements Required<NgbOffcanvasOptions> {
ariaDescribedBy: string;
ariaLabelledBy: string;
backdrop = true;
backdrop: boolean | 'static' = true;
backdropClass: string;
beforeDismiss: () => boolean | Promise<boolean>;
container: string | HTMLElement;
Expand Down
1 change: 1 addition & 0 deletions src/offcanvas/offcanvas-stack.ts
Expand Up @@ -132,6 +132,7 @@ export class NgbOffcanvasStack {
backdropInstance[optionName] = options[optionName];
}
});
backdropInstance.static = (options.backdrop === 'static');
}

private _getContentRef(
Expand Down
37 changes: 37 additions & 0 deletions src/offcanvas/offcanvas.spec.ts
Expand Up @@ -401,6 +401,43 @@ describe('ngb-offcanvas', () => {
expect(fixture.nativeElement).not.toHaveOffcanvasBackdrop();
});

it('should open and close offcanvas with static backdrop', () => {
const offcanvasInstance = fixture.componentInstance.open('foo', {backdrop: 'static'});
fixture.detectChanges();

expect(fixture.nativeElement).toHaveOffcanvas('foo');
expect(fixture.nativeElement).toHaveOffcanvasBackdrop();

offcanvasInstance.close('some reason');
fixture.detectChanges();

expect(fixture.nativeElement).not.toHaveOffcanvas();
expect(fixture.nativeElement).not.toHaveOffcanvasBackdrop();
});

it('should not close with backdrop mousedown if backdrop is static', async() => {
let rejectReason: any;
const offcanvasInstance = fixture.componentInstance.open('foo', {backdrop: 'static'});
offcanvasInstance.result.catch((reason) => rejectReason = reason);
fixture.detectChanges();
expect(fixture.nativeElement).toHaveOffcanvas('foo');

document.querySelector('ngb-offcanvas-backdrop') ?.dispatchEvent(new Event('mousedown'));
fixture.detectChanges();

expect(fixture.nativeElement).toHaveOffcanvas();
expect(fixture.nativeElement).toHaveOffcanvasBackdrop();

await fixture.whenStable();
expect(rejectReason).toBeUndefined();

offcanvasInstance.close('some reason');
fixture.detectChanges();

expect(fixture.nativeElement).not.toHaveOffcanvas();
expect(fixture.nativeElement).not.toHaveOffcanvasBackdrop();
});

it('should open and close offcanvas without backdrop from template content', () => {
const offcanvasInstance = fixture.componentInstance.openTpl({backdrop: false});
fixture.detectChanges();
Expand Down

0 comments on commit fe4c798

Please sign in to comment.