Skip to content

Commit 2d0779e

Browse files
Ismaestroiramos
authored andcommitted
feat(animations): provideIn root and add animations
1 parent 704e1a1 commit 2d0779e

17 files changed

Lines changed: 181 additions & 132 deletions

README.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,21 @@ npm run update | Update the project dependencies with ng update
6666
* CRUD: create, update and remove heroes
6767
* Search bar, to look for heroes
6868
* Custom loading page
69-
* Angular Pipes
70-
* Interceptors and Events (Progress bar active, if a request is pending)
7169
* Modal and toasts (snakbar)!
72-
* Autocomplete enabled in forms
73-
* Scroll to first invalid input in forms (directive)
74-
* Responsive layout (flex layout module)
75-
* SASS (most common used functions and mixins) and BEM styles
7670
* Internationalization with ng-translate and ngx-translate-extract. Also use cache busting for translation files with [webpack translate loader](https://github.com/ngx-translate/http-loader#angular-cliwebpack-translateloader-example)
7771
* Lazy loading modules
7872
* Service Workers
7973
* Dynamic Imports
8074
* More logical structure directory (from [here](https://itnext.io/choosing-a-highly-scalable-folder-structure-in-angular-d987de65ec7))
8175
* Basic example library
8276
* Scroll restoration and anchor examples
77+
* Responsive layout (flex layout module)
78+
* SASS (most common used functions and mixins) and BEM styles
79+
* Animations!
80+
* Angular Pipes
81+
* Interceptors and Events (Progress bar active, if a request is pending)
82+
* Scroll to first invalid input in forms (directive)
83+
* Autocomplete enabled in forms
8384
* Modernizr (browser features detection)
8485
* Safari polyfill for date inputs (date-input-polyfill)
8586
* Google Tag Manager

src/app/app-routing.module.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import {HomePageComponent} from './shared/pages/home-page/home-page.component';
55
import {AppConfig} from './configs/app.config';
66

77
const routes: Routes = [
8-
{path: '', redirectTo: '/', pathMatch: 'full'},
9-
{path: '', component: HomePageComponent},
8+
{path: '', component: HomePageComponent, pathMatch: 'full'},
109
{path: AppConfig.routes.error404, component: Error404PageComponent},
1110
{path: AppConfig.routes.heroes, loadChildren: './modules/heroes/heroes.module#HeroesModule'},
1211

src/app/app.module.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import {NgModule} from '@angular/core';
2-
import {BrowserModule} from '@angular/platform-browser';
32
import {AppRoutingModule} from './app-routing.module';
43
import {CoreModule} from './core/core.module';
54
import {AppComponent} from './app.component';
6-
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
7-
import {HttpClientModule} from '@angular/common/http';
85
import {TranslateLoader, TranslateModule} from '@ngx-translate/core';
96
import {NgxExampleLibraryModule} from '@ismaestro/ngx-example-library';
107
import {ServiceWorkerModule} from '@angular/service-worker';
@@ -15,10 +12,7 @@ import {SharedModule} from './shared/shared.module';
1512

1613
@NgModule({
1714
imports: [
18-
BrowserModule,
19-
BrowserAnimationsModule,
2015
ServiceWorkerModule.register('/ngsw-worker.js', {enabled: environment.production}),
21-
HttpClientModule,
2216
TranslateModule.forRoot({
2317
loader: {
2418
provide: TranslateLoader,

src/app/core/core.module.ts

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,36 @@
11
import {NgModule, Optional, SkipSelf} from '@angular/core';
2-
import {ReactiveFormsModule} from '@angular/forms';
3-
import {RouterModule} from '@angular/router';
42
import {ProgressBarService} from './services/progress-bar.service';
5-
import {LoggerService} from './services/logger.service';
6-
import {HeroService} from '../modules/heroes/shared/hero.service';
73
import {TimingInterceptor} from './interceptors/timing.interceptor';
8-
import {HTTP_INTERCEPTORS} from '@angular/common/http';
4+
import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http';
95
import {ProgressInterceptor} from './interceptors/progress.interceptor';
10-
11-
function throwIfAlreadyLoaded(parentModule: any, moduleName: string) {
12-
if (parentModule) {
13-
throw new Error(`${moduleName} has already been loaded. Import Core modules in the AppModule only.`);
14-
}
15-
}
6+
import {BrowserModule} from '@angular/platform-browser';
7+
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
8+
import {TranslateModule} from '@ngx-translate/core';
9+
import {RouterModule} from '@angular/router';
1610

1711
@NgModule({
1812
imports: [
19-
/*ReactiveFormsModule,
20-
RouterModule*/
13+
BrowserModule,
14+
BrowserAnimationsModule,
15+
TranslateModule.forChild(),
16+
RouterModule,
17+
HttpClientModule
18+
],
19+
exports: [
20+
BrowserModule,
21+
BrowserAnimationsModule,
22+
HttpClientModule
2123
],
2224
providers: [
2325
{provide: HTTP_INTERCEPTORS, useClass: ProgressInterceptor, multi: true, deps: [ProgressBarService]},
24-
{provide: HTTP_INTERCEPTORS, useClass: TimingInterceptor, multi: true},
25-
HeroService,
26-
LoggerService,
27-
ProgressBarService
26+
{provide: HTTP_INTERCEPTORS, useClass: TimingInterceptor, multi: true}
2827
]
2928
})
3029

3130
export class CoreModule {
3231
constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
33-
throwIfAlreadyLoaded(parentModule, 'CoreModule');
32+
if (parentModule) {
33+
throw new Error(`CoreModule has already been loaded. Import Core modules in the AppModule only.`);
34+
}
3435
}
3536
}

src/app/core/services/logger.service.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import {Injectable} from '@angular/core';
22

3-
@Injectable()
3+
@Injectable({
4+
providedIn: 'root'
5+
})
46
export class LoggerService {
57
static log(msg: string): void {
68
console.log(msg);

src/app/core/services/progress-bar.service.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import {EventEmitter, Injectable} from '@angular/core';
22

3-
@Injectable()
3+
@Injectable({
4+
providedIn: 'root'
5+
})
46
export class ProgressBarService {
57
public updateProgressBar$: EventEmitter<any>;
68

src/app/modules/heroes/pages/hero-detail-page/hero-detail-page.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ <h1 class="header__title">{{'heroDetail' | translate}}</h1>
44
[color]="'primary'"
55
[mode]="'indeterminate'">
66
</mat-progress-spinner>
7-
<div id="heroe-detail" *ngIf="hero">
7+
<div id="heroe-detail" *ngIf="hero" [@fadeInOut]>
88
<ng-container>
99
<app-hero-card [hero]="hero"></app-hero-card>
1010
<div id="hero-json">

src/app/modules/heroes/pages/hero-detail-page/hero-detail-page.component.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import {HeroService} from '../../shared/hero.service';
44
import {ActivatedRoute, Router} from '@angular/router';
55
import {Location} from '@angular/common';
66
import {AppConfig} from '../../../../configs/app.config';
7+
import {fadeInOut} from '../../../../shared/helpers/utils.helper';
78

89
@Component({
910
selector: 'app-hero-detail-page',
1011
templateUrl: './hero-detail-page.component.html',
11-
styleUrls: ['./hero-detail-page.component.scss']
12+
styleUrls: ['./hero-detail-page.component.scss'],
13+
animations: [fadeInOut]
1214
})
1315

1416
export class HeroDetailPageComponent implements OnInit {

src/app/modules/heroes/pages/heroes-list-page/heroes-list-page.component.html

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
<div id="left">
22
<h2 class="header__title">{{ 'heroesList' | translate }}</h2>
33
<div>
4-
<mat-progress-spinner *ngIf="!heroes"
5-
class="progress__spinner"
6-
[color]="'primary'"
7-
[mode]="'indeterminate'">
8-
</mat-progress-spinner>
4+
<mat-list id="loading-list" *ngIf="!heroes">
5+
<mat-list-item *ngFor="let i of [1,2]">
6+
<img mat-list-avatar src="assets/images/heroes/default.png">
7+
<h3 mat-line>.</h3>
8+
<p mat-line><span>.</span></p>
9+
<div class="hero-actions">
10+
<mat-icon class="icon__like--grey">favorite</mat-icon>
11+
</div>
12+
</mat-list-item>
13+
<div id="loading-spinner">
14+
<app-spinner></app-spinner>
15+
</div>
16+
</mat-list>
17+
918
<mat-list>
10-
<mat-list-item *ngFor="let hero of heroes">
19+
<mat-list-item *ngFor="let hero of heroes" [@fadeInOut]>
1120
<img *ngIf="hero.default" class="cp"
1221
(click)="seeHeroDetails(hero);" mat-list-avatar
1322
src="assets/images/heroes/{{hero.id}}-thumbnail.jpg">
@@ -33,7 +42,7 @@ <h3 mat-line [class.cp]="hero.default" (click)="seeHeroDetails(hero);"> {{hero.n
3342
</mat-list>
3443
</div>
3544
</div>
36-
<div id="right">
45+
<div id="right" [@fadeInOut]>
3746
<h2 class="header__title">{{ 'createHero' | translate }}</h2>
3847
<div>
3948
<form [formGroup]="newHeroForm" #form="ngForm" appScrollToFirstInvalid

src/app/modules/heroes/pages/heroes-list-page/heroes-list-page.component.scss

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,20 @@
11
@import "mixins";
2+
@import "colors";
3+
4+
#loading-list {
5+
h3, p {
6+
color: $light-grey;
7+
background: $light-grey;
8+
}
9+
10+
p {
11+
margin-top: 0.5rem;
12+
}
13+
}
14+
15+
#loading-spinner {
16+
position: relative;
17+
}
218

319
#left {
420
width: 50%;
@@ -26,6 +42,7 @@
2642
}
2743

2844
.hero-actions {
45+
margin-left: 1rem;
2946
padding-bottom: 0;
3047

3148
.icon__remove {

0 commit comments

Comments
 (0)