(Sidebar) Make the sidebar invisible when it's not open

Made the backdrop methods private
This commit is contained in:
Sercan Yemen 2018-05-30 11:49:30 +03:00
parent 387077882b
commit 83c395b866

View File

@ -1,7 +1,7 @@
import { Component, ElementRef, HostBinding, HostListener, Input, OnDestroy, OnInit, Renderer2, ViewEncapsulation } from '@angular/core'; import { Component, ElementRef, HostBinding, HostListener, Input, OnDestroy, OnInit, Renderer2, ViewEncapsulation } from '@angular/core';
import { animate, AnimationBuilder, AnimationPlayer, style } from '@angular/animations'; import { animate, AnimationBuilder, AnimationPlayer, style } from '@angular/animations';
import { ObservableMedia } from '@angular/flex-layout'; import { ObservableMedia } from '@angular/flex-layout';
import { Subject, Subscription } from 'rxjs'; import { Subject } from 'rxjs';
import { FuseSidebarService } from './sidebar.service'; import { FuseSidebarService } from './sidebar.service';
import { FuseMatchMediaService } from '@fuse/services/match-media.service'; import { FuseMatchMediaService } from '@fuse/services/match-media.service';
@ -159,6 +159,9 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
// Register the sidebar // Register the sidebar
this._fuseSidebarService.register(this.name, this); this._fuseSidebarService.register(this.name, this);
// Setup visibility
this._setupVisibility();
// Setup alignment // Setup alignment
this._setupAlignment(); this._setupAlignment();
@ -224,6 +227,9 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
// Set the wasActive for the first time // Set the wasActive for the first time
this._wasActive = false; this._wasActive = false;
// Show the sidebar
this._showSidebar();
// Act on every media change // Act on every media change
this._fuseMatchMediaService.onMediaChange this._fuseMatchMediaService.onMediaChange
.pipe(takeUntil(this._unsubscribeAll)) .pipe(takeUntil(this._unsubscribeAll))
@ -244,6 +250,9 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
// Set the lockedOpen status // Set the lockedOpen status
this.isLockedOpen = true; this.isLockedOpen = true;
// Show the sidebar
this._showSidebar();
// Force the the opened status to true // Force the the opened status to true
this.opened = true; this.opened = true;
@ -255,7 +264,7 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
} }
// Hide the backdrop if any exists // Hide the backdrop if any exists
this.hideBackdrop(); this._hideBackdrop();
} }
// De-Activate the lockedOpen // De-Activate the lockedOpen
else else
@ -268,6 +277,9 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
// Force the the opened status to close // Force the the opened status to close
this.opened = false; this.opened = false;
// Hide the sidebar
this._hideSidebar();
} }
// Store the new active status // Store the new active status
@ -275,6 +287,124 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
}); });
} }
/**
* Setup the visibility of the sidebar
*
* @private
*/
private _setupVisibility(): void
{
// Remove the existing box-shadow
this._renderer.setStyle(this._elementRef.nativeElement, 'box-shadow', 'none');
// Make the sidebar invisible
this._renderer.setStyle(this._elementRef.nativeElement, 'visibility', 'hidden');
}
/**
* Show the backdrop
*
* @private
*/
private _showBackdrop(): void
{
// Create the backdrop element
this._backdrop = this._renderer.createElement('div');
// Add a class to the backdrop element
this._backdrop.classList.add('fuse-sidebar-overlay');
// Append the backdrop to the parent of the sidebar
this._renderer.appendChild(this._elementRef.nativeElement.parentElement, this._backdrop);
// Create the enter animation and attach it to the player
this._player =
this._animationBuilder
.build([
animate('300ms ease', style({opacity: 1}))
]).create(this._backdrop);
// Play the animation
this._player.play();
// Add an event listener to the overlay
this._backdrop.addEventListener('click', () => {
this.close();
}
);
}
/**
* Hide the backdrop
*
* @private
*/
private _hideBackdrop(): void
{
if ( !this._backdrop )
{
return;
}
// Create the leave animation and attach it to the player
this._player =
this._animationBuilder
.build([
animate('300ms ease', style({opacity: 0}))
]).create(this._backdrop);
// Play the animation
this._player.play();
// Once the animation is done...
this._player.onDone(() => {
// If the backdrop still exists...
if ( this._backdrop )
{
// Remove the backdrop
this._backdrop.parentNode.removeChild(this._backdrop);
this._backdrop = null;
}
});
}
/**
* Change some properties of the sidebar
* and make it visible
*
* @private
*/
private _showSidebar(): void
{
// Remove the box-shadow style
this._renderer.removeStyle(this._elementRef.nativeElement, 'box-shadow');
// Make the sidebar invisible
this._renderer.removeStyle(this._elementRef.nativeElement, 'visibility');
}
/**
* Change some properties of the sidebar
* and make it invisible
*
* @private
*/
private _hideSidebar(delay = true): void
{
const delayAmount = delay ? 300 : 0;
// Add a delay so close animation can play
setTimeout(() => {
// Remove the box-shadow
this._renderer.setStyle(this._elementRef.nativeElement, 'box-shadow', 'none');
// Make the sidebar invisible
this._renderer.setStyle(this._elementRef.nativeElement, 'visibility', 'hidden');
}, delayAmount);
}
// ----------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------
// @ Public methods // @ Public methods
// ----------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------
@ -289,8 +419,11 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
return; return;
} }
// Show the sidebar
this._showSidebar();
// Show the backdrop // Show the backdrop
this.showBackdrop(); this._showBackdrop();
// Set the opened status // Set the opened status
this.opened = true; this.opened = true;
@ -307,10 +440,13 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
} }
// Hide the backdrop // Hide the backdrop
this.hideBackdrop(); this._hideBackdrop();
// Set the opened status // Set the opened status
this.opened = false; this.opened = false;
// Hide the sidebar
this._hideSidebar();
} }
/** /**
@ -404,68 +540,4 @@ export class FuseSidebarComponent implements OnInit, OnDestroy
this.fold(); this.fold();
} }
} }
/**
* Show the backdrop
*/
showBackdrop(): void
{
// Create the backdrop element
this._backdrop = this._renderer.createElement('div');
// Add a class to the backdrop element
this._backdrop.classList.add('fuse-sidebar-overlay');
// Append the backdrop to the parent of the sidebar
this._renderer.appendChild(this._elementRef.nativeElement.parentElement, this._backdrop);
// Create the enter animation and attach it to the player
this._player =
this._animationBuilder
.build([
animate('300ms ease', style({opacity: 1}))
]).create(this._backdrop);
// Play the animation
this._player.play();
// Add an event listener to the overlay
this._backdrop.addEventListener('click', () => {
this.close();
}
);
}
/**
* Hide the backdrop
*/
hideBackdrop(): void
{
if ( !this._backdrop )
{
return;
}
// Create the leave animation and attach it to the player
this._player =
this._animationBuilder
.build([
animate('300ms ease', style({opacity: 0}))
]).create(this._backdrop);
// Play the animation
this._player.play();
// Once the animation is done...
this._player.onDone(() => {
// If the backdrop still exists...
if ( this._backdrop )
{
// Remove the backdrop
this._backdrop.parentNode.removeChild(this._backdrop);
this._backdrop = null;
}
});
}
} }