From e586b20012c41f0fe5664f5a4f342bc1d9d21479 Mon Sep 17 00:00:00 2001
From: golu701
Date: Fri, 24 Jun 2022 21:07:24 +0530
Subject: [PATCH 001/358] New: text-color class added in singup scss file
Update: password mat-error removed from sign up page, due to user experience
---
.../auth/pages/sign-up-page/sign-up-page.component.html | 3 +--
.../auth/pages/sign-up-page/sign-up-page.component.scss | 4 ++++
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.html b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.html
index 1f87b16a..6d352ac8 100755
--- a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.html
+++ b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.html
@@ -39,11 +39,10 @@
>
{{ hide ? 'visibility_off' : 'visibility' }}
- Must be minimum eight characters, at least one uppercase letter, one lowercase letter
and one number
- {{ getErrorMessage('password') }}
diff --git a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.scss b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.scss
index bcf80628..92b2b962 100755
--- a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.scss
+++ b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.scss
@@ -55,3 +55,7 @@
padding: 1rem;
}
}
+
+.text-red{
+ color: #dc143c;
+}
\ No newline at end of file
From 97115b58e1de7eb5367968e8b6fac58292a80053 Mon Sep 17 00:00:00 2001
From: "ismael.ramos"
Date: Sun, 26 Jun 2022 12:12:39 +0200
Subject: [PATCH 002/358] feat(SIGNUP): update controls and red color
---
.../auth/pages/sign-up-page/sign-up-page.component.html | 4 ++--
.../auth/pages/sign-up-page/sign-up-page.component.scss | 6 +++---
.../auth/pages/sign-up-page/sign-up-page.component.ts | 5 ++++-
3 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.html b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.html
index 6d352ac8..0dfaa268 100755
--- a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.html
+++ b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.html
@@ -39,8 +39,8 @@
>
{{ hide ? 'visibility_off' : 'visibility' }}
- Must be minimum eight characters, at least one uppercase letter, one lowercase letter
+ Must be minimum eight characters, at least one uppercase letter, one lowercase letter
and one number
diff --git a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.scss b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.scss
index 92b2b962..3be4d54d 100755
--- a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.scss
+++ b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.scss
@@ -56,6 +56,6 @@
}
}
-.text-red{
- color: #dc143c;
-}
\ No newline at end of file
+.text-red {
+ color: $red;
+}
diff --git a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.ts b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.ts
index 75c13633..82ee2c36 100755
--- a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.ts
+++ b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.ts
@@ -1,7 +1,7 @@
import { Component } from '@angular/core';
import { transition, trigger, useAnimation } from '@angular/animations';
import { fadeIn } from 'ng-animate';
-import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
+import { AbstractControl, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { AuthService } from '../../auth.service';
import { UtilsService } from '~shared/services/utils.service';
import { RoutesConfig } from '~app/configs/routes.config';
@@ -32,6 +32,7 @@ export class SignUpPageComponent {
Validators.pattern('^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$'),
]);
hide = true;
+ passwordControls: AbstractControl;
constructor(
private formBuilder: FormBuilder,
@@ -45,6 +46,8 @@ export class SignUpPageComponent {
email: this.email,
password: this.password,
});
+
+ this.passwordControls = this.signUpForm.controls['password'];
}
getErrorMessage(field: any): string | void {
From 352d447105714823a1355c6a19d96c89fe070795 Mon Sep 17 00:00:00 2001
From: "ismael.ramos"
Date: Tue, 12 Jul 2022 18:05:26 +0200
Subject: [PATCH 003/358] feat(APP): refactor utils helper service and some
imports
---
angular.json | 2 +-
src/app/app.component.ts | 4 +--
src/app/modules/auth/auth.service.ts | 2 +-
.../log-in-page/log-in-page.component.ts | 2 +-
.../sign-up-page/sign-up-page.component.ts | 2 +-
src/app/modules/core/core.module.ts | 2 ++
.../{events.servide.ts => events.service.ts} | 0
.../services/utils-helper.service.spec.ts | 30 -------------------
.../core/services/utils.service.spec.ts | 28 +++++++++++++++++
...ils-helper.service.ts => utils.service.ts} | 15 +++++++++-
.../my-heroes-page.component.ts | 5 ++--
.../pages/home-page/home-page.component.ts | 2 +-
.../hero-card/hero-card.component.ts | 4 +--
src/app/shared/services/utils.service.ts | 19 ------------
14 files changed, 55 insertions(+), 62 deletions(-)
rename src/app/modules/core/services/{events.servide.ts => events.service.ts} (100%)
delete mode 100755 src/app/modules/core/services/utils-helper.service.spec.ts
create mode 100755 src/app/modules/core/services/utils.service.spec.ts
rename src/app/modules/core/services/{utils-helper.service.ts => utils.service.ts} (54%)
delete mode 100644 src/app/shared/services/utils.service.ts
diff --git a/angular.json b/angular.json
index 516a8286..03b4e5c5 100644
--- a/angular.json
+++ b/angular.json
@@ -52,7 +52,7 @@
"includePaths": ["src/app/shared/styles"]
},
"allowedCommonJsDependencies": [
- "~app/modules/core/services/utils-helper.service"
+ "~modules/core/services/utils.service"
],
"scripts": [
"src/assets/js/gtm.js",
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 6519818a..63a24b20 100755
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -4,7 +4,7 @@ import { NavigationEnd, Router } from '@angular/router';
import { MatSnackBar } from '@angular/material/snack-bar';
import { DOCUMENT } from '@angular/common';
import { RoutesConfig } from './configs/routes.config';
-import { UtilsHelperService } from '~app/modules/core/services/utils-helper.service';
+import { UtilsService } from '~modules/core/services/utils.service';
declare const Modernizr: any;
@@ -58,7 +58,7 @@ export class AppComponent implements OnInit {
}
checkBrowser() {
- if (UtilsHelperService.isBrowserValid()) {
+ if (UtilsService.isBrowserValid()) {
this.checkBrowserFeatures();
} else {
this.snackBar.open('Change your browser', 'OK');
diff --git a/src/app/modules/auth/auth.service.ts b/src/app/modules/auth/auth.service.ts
index 38b56585..2b5f24d3 100755
--- a/src/app/modules/auth/auth.service.ts
+++ b/src/app/modules/auth/auth.service.ts
@@ -3,9 +3,9 @@ import { Injectable } from '@angular/core';
import { MatSnackBar } from '@angular/material/snack-bar';
import { Apollo, gql } from 'apollo-angular';
import { map } from 'rxjs/operators';
-import { UtilsService } from '~shared/services/utils.service';
import jwt_decode from 'jwt-decode';
import { StorageKey, StorageService } from '~shared/services/storage.service';
+import { UtilsService } from '~modules/core/services/utils.service';
@Injectable({
providedIn: 'root',
diff --git a/src/app/modules/auth/pages/log-in-page/log-in-page.component.ts b/src/app/modules/auth/pages/log-in-page/log-in-page.component.ts
index 24d4b149..501dca4b 100755
--- a/src/app/modules/auth/pages/log-in-page/log-in-page.component.ts
+++ b/src/app/modules/auth/pages/log-in-page/log-in-page.component.ts
@@ -5,7 +5,7 @@ import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'
import { AuthService } from '../../auth.service';
import { RoutesConfig } from '~app/configs/routes.config';
import { Router } from '@angular/router';
-import { UtilsService } from '~shared/services/utils.service';
+import { UtilsService } from '~modules/core/services/utils.service';
export enum UserLoginError {
BAD_CREDENTIALS = 11000,
diff --git a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.ts b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.ts
index 75c13633..b9f9079d 100755
--- a/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.ts
+++ b/src/app/modules/auth/pages/sign-up-page/sign-up-page.component.ts
@@ -3,7 +3,7 @@ import { transition, trigger, useAnimation } from '@angular/animations';
import { fadeIn } from 'ng-animate';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { AuthService } from '../../auth.service';
-import { UtilsService } from '~shared/services/utils.service';
+import { UtilsService } from '~modules/core/services/utils.service';
import { RoutesConfig } from '~app/configs/routes.config';
import { Router } from '@angular/router';
diff --git a/src/app/modules/core/core.module.ts b/src/app/modules/core/core.module.ts
index a6ba7a23..7a10d632 100644
--- a/src/app/modules/core/core.module.ts
+++ b/src/app/modules/core/core.module.ts
@@ -12,11 +12,13 @@ import { SentryErrorHandler } from './sentry.errorhandler';
import { TokenInterceptor } from './interceptors/token.interceptor';
import { StorageService } from '~shared/services/storage.service';
import { Apollo } from 'apollo-angular';
+import { SharedModule } from '~shared/shared.module';
@NgModule({
imports: [
RouterModule,
BrowserAnimationsModule,
+ SharedModule,
NgxExampleLibraryModule.forRoot({
config: {
say: 'hello',
diff --git a/src/app/modules/core/services/events.servide.ts b/src/app/modules/core/services/events.service.ts
similarity index 100%
rename from src/app/modules/core/services/events.servide.ts
rename to src/app/modules/core/services/events.service.ts
diff --git a/src/app/modules/core/services/utils-helper.service.spec.ts b/src/app/modules/core/services/utils-helper.service.spec.ts
deleted file mode 100755
index 6d1716eb..00000000
--- a/src/app/modules/core/services/utils-helper.service.spec.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { TestBed, waitForAsync } from '@angular/core/testing';
-import { UtilsHelperService } from './utils-helper.service';
-
-describe('UtilsHelperService', () => {
- let utilsHelperService: UtilsHelperService;
-
- beforeEach(
- waitForAsync(() => {
- TestBed.configureTestingModule({
- providers: [UtilsHelperService],
- });
-
- utilsHelperService = TestBed.inject(UtilsHelperService);
- })
- );
-
- it('should check if is palindrome', () => {
- expect(UtilsHelperService.isPalindrome('')).toBe(true);
- expect(UtilsHelperService.isPalindrome('asd')).toBe(false);
- expect(UtilsHelperService.isPalindrome('aas')).toBe(false);
- expect(UtilsHelperService.isPalindrome('ass')).toBe(false);
- expect(UtilsHelperService.isPalindrome('aassaa')).toBe(true);
- expect(UtilsHelperService.isPalindrome('asa')).toBe(true);
- expect(UtilsHelperService.isPalindrome('asswssa')).toBe(true);
- });
-
- it('should check if browser is valid', () => {
- expect(UtilsHelperService.isBrowserValid()).toBe(true);
- });
-});
diff --git a/src/app/modules/core/services/utils.service.spec.ts b/src/app/modules/core/services/utils.service.spec.ts
new file mode 100755
index 00000000..791b218e
--- /dev/null
+++ b/src/app/modules/core/services/utils.service.spec.ts
@@ -0,0 +1,28 @@
+import { TestBed, waitForAsync } from '@angular/core/testing';
+import { UtilsService } from './utils.service';
+
+describe('UtilsService', () => {
+ let utilsHelperService: UtilsService;
+
+ beforeEach(waitForAsync(() => {
+ TestBed.configureTestingModule({
+ providers: [UtilsService],
+ });
+
+ utilsHelperService = TestBed.inject(UtilsService);
+ }));
+
+ it('should check if is palindrome', () => {
+ expect(UtilsService.isPalindrome('')).toBe(true);
+ expect(UtilsService.isPalindrome('asd')).toBe(false);
+ expect(UtilsService.isPalindrome('aas')).toBe(false);
+ expect(UtilsService.isPalindrome('ass')).toBe(false);
+ expect(UtilsService.isPalindrome('aassaa')).toBe(true);
+ expect(UtilsService.isPalindrome('asa')).toBe(true);
+ expect(UtilsService.isPalindrome('asswssa')).toBe(true);
+ });
+
+ it('should check if browser is valid', () => {
+ expect(UtilsService.isBrowserValid()).toBe(true);
+ });
+});
diff --git a/src/app/modules/core/services/utils-helper.service.ts b/src/app/modules/core/services/utils.service.ts
similarity index 54%
rename from src/app/modules/core/services/utils-helper.service.ts
rename to src/app/modules/core/services/utils.service.ts
index a0813f8a..03b03e97 100644
--- a/src/app/modules/core/services/utils-helper.service.ts
+++ b/src/app/modules/core/services/utils.service.ts
@@ -1,4 +1,6 @@
import { Injectable } from '@angular/core';
+import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';
+import { AppConfig } from '~app/configs/app.config';
declare const require: any;
const bowser = require('bowser');
@@ -6,7 +8,9 @@ const bowser = require('bowser');
@Injectable({
providedIn: 'root',
})
-export class UtilsHelperService {
+export class UtilsService {
+ constructor(private snackBar: MatSnackBar) {}
+
static isPalindrome(str: string) {
const len = Math.floor(str.length / 2);
for (let i = 0; i < len; i++) {
@@ -31,4 +35,13 @@ export class UtilsHelperService {
opera: '>22',
});
}
+
+ showSnackBar(name: string, panelClass: string): void {
+ const config: any = new MatSnackBarConfig();
+ config.duration = panelClass === 'warning-snack-bar' ? 50000 : AppConfig.snackBarDuration;
+ config.horizontalPosition = 'right';
+ config.verticalPosition = 'top';
+ config.panelClass = panelClass;
+ this.snackBar.open(name, 'OK', config);
+ }
}
diff --git a/src/app/modules/hero/pages/my-heroes-page/my-heroes-page.component.ts b/src/app/modules/hero/pages/my-heroes-page/my-heroes-page.component.ts
index 9b3aae89..b0ebced3 100644
--- a/src/app/modules/hero/pages/my-heroes-page/my-heroes-page.component.ts
+++ b/src/app/modules/hero/pages/my-heroes-page/my-heroes-page.component.ts
@@ -9,10 +9,9 @@ import { transition, trigger, useAnimation } from '@angular/animations';
import { fadeIn } from 'ng-animate';
import { ROUTES_CONFIG } from '~app/configs/routes.config';
import { HeroService } from '../../shared/hero.service';
-import { UtilsHelperService } from '../../../core/services/utils-helper.service';
+import { UtilsService } from '~modules/core/services/utils.service';
import { UserService } from '../../../user/user.service';
import { User } from '../../../user/shared/user.model';
-import { UtilsService } from '~shared/services/utils.service';
@Component({
selector: 'app-my-heroes-page',
@@ -103,7 +102,7 @@ export class MyHeroesPageComponent implements OnInit {
private onChanges() {
this.newHeroForm.get('realName')?.valueChanges.subscribe((value: any) => {
- if (value && value.length >= 3 && UtilsHelperService.isPalindrome(value)) {
+ if (value && value.length >= 3 && UtilsService.isPalindrome(value)) {
this.snackBar.open("Yeah that's a Palindrome!", '', { duration: 2000 });
} else {
this.snackBar.dismiss();
diff --git a/src/app/modules/root/pages/home-page/home-page.component.ts b/src/app/modules/root/pages/home-page/home-page.component.ts
index cfc70785..fed70c4e 100644
--- a/src/app/modules/root/pages/home-page/home-page.component.ts
+++ b/src/app/modules/root/pages/home-page/home-page.component.ts
@@ -1,7 +1,7 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Hero } from '../../../hero/shared/hero.model';
import { Observable, Subject, takeUntil } from 'rxjs';
-import { EventsService, EventsTypes } from '../../../core/services/events.servide';
+import { EventsService, EventsTypes } from '../../../core/services/events.service';
import { HeroDataService } from '~modules/hero/shared/hero-data.service';
@Component({
diff --git a/src/app/shared/components/hero-card/hero-card.component.ts b/src/app/shared/components/hero-card/hero-card.component.ts
index e218f1d0..ab5a7ca2 100644
--- a/src/app/shared/components/hero-card/hero-card.component.ts
+++ b/src/app/shared/components/hero-card/hero-card.component.ts
@@ -6,8 +6,8 @@ import { ROUTES_CONFIG, RoutesConfig } from '~app/configs/routes.config';
import { HeroService } from '~modules/hero/shared/hero.service';
import { Router } from '@angular/router';
import { AuthService } from '~modules/auth/auth.service';
-import { UtilsService } from '../../services/utils.service';
-import { EventsService, EventsTypes } from '~modules/core/services/events.servide';
+import { UtilsService } from '~modules/core/services/utils.service';
+import { EventsService, EventsTypes } from '~modules/core/services/events.service';
@Component({
selector: 'app-hero-card',
diff --git a/src/app/shared/services/utils.service.ts b/src/app/shared/services/utils.service.ts
deleted file mode 100644
index 058161bc..00000000
--- a/src/app/shared/services/utils.service.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Injectable } from '@angular/core';
-import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';
-import { AppConfig } from '~app/configs/app.config';
-
-@Injectable({
- providedIn: 'root',
-})
-export class UtilsService {
- constructor(private snackBar: MatSnackBar) {}
-
- showSnackBar(name: string, panelClass: string): void {
- const config: any = new MatSnackBarConfig();
- config.duration = panelClass === 'warning-snack-bar' ? 50000 : AppConfig.snackBarDuration;
- config.horizontalPosition = 'right';
- config.verticalPosition = 'top';
- config.panelClass = panelClass;
- this.snackBar.open(name, 'OK', config);
- }
-}
From 8f826cc4ce54bde33b0aabbd7370c6e27a05290f Mon Sep 17 00:00:00 2001
From: "ismael.ramos"
Date: Tue, 12 Jul 2022 18:22:50 +0200
Subject: [PATCH 004/358] feat(TEST): fix problem with provider
---
src/app/modules/core/services/utils.service.spec.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/app/modules/core/services/utils.service.spec.ts b/src/app/modules/core/services/utils.service.spec.ts
index 791b218e..868aa999 100755
--- a/src/app/modules/core/services/utils.service.spec.ts
+++ b/src/app/modules/core/services/utils.service.spec.ts
@@ -1,11 +1,13 @@
import { TestBed, waitForAsync } from '@angular/core/testing';
import { UtilsService } from './utils.service';
+import { MatSnackBarModule } from '@angular/material/snack-bar';
describe('UtilsService', () => {
let utilsHelperService: UtilsService;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
+ imports: [MatSnackBarModule],
providers: [UtilsService],
});
From d222814f083870ba29ad9a92f926e6c44c22fb23 Mon Sep 17 00:00:00 2001
From: Ismael Ramos
Date: Thu, 14 Jul 2022 00:19:16 +0200
Subject: [PATCH 005/358] Update app.config.ts
---
src/app/configs/app.config.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/app/configs/app.config.ts b/src/app/configs/app.config.ts
index 7d8232ea..da43bd55 100644
--- a/src/app/configs/app.config.ts
+++ b/src/app/configs/app.config.ts
@@ -5,7 +5,7 @@ export const APP_CONFIG = new InjectionToken('app.config');
export const AppConfig: any = {
topHeroesLimit: 5,
snackBarDuration: 3000,
- repositoryURL: 'https://github.com/ismaestro/angular8-example-app',
+ repositoryURL: 'https://github.com/Ismaestro/angular-example-app',
sentryDSN: 'https://38434a1b115f41d3a31e356cdc496c06@sentry.io/1315526',
cspDirectives: {
defaultSrc: [
From fa35c3861506bedd52b202b171a4eaa61daa9669 Mon Sep 17 00:00:00 2001
From: ismaestro
Date: Tue, 20 Dec 2022 14:53:02 +0100
Subject: [PATCH 006/358] feat(BOOTSTRAP): prepare all components for the new
version with bootstrap
---
.browserslistrc | 3 -
.commitlintrc.json | 3 +
.editorconfig | 3 +
.eslintrc.json | 188 +-
.github/ISSUE_TEMPLATE/bug_report.md | 0
.github/ISSUE_TEMPLATE/feature_request.md | 0
.gitignore | 36 +-
.husky/commit-msg | 6 +
.husky/pre-push | 2 +-
.husky/scripts/check-coverage.sh | 12 +
.prettierignore | 5 +-
.prettierrc | 2 +-
.stylelintrc.json | 11 +
LICENSE | 21 -
README.md | 2 +-
angular.json | 238 +-
commitlint.config.js | 3 +
cypress.config.ts | 55 +
cypress.json | 10 -
cypress/e2e/home.feature | 4 +
cypress/e2e/home.ts | 9 +
cypress/fixtures/example.json | 3 +-
cypress/integration/spec.ts | 19 -
cypress/plugins/index.ts | 4 -
cypress/support/commands.ts | 0
cypress/tsconfig.json | 3 +-
documentation/changelog.html | 1345 -----------
documentation/classes/Hero.html | 527 -----
documentation/classes/User.html | 532 -----
documentation/components/AppComponent.html | 695 ------
.../components/Error404PageComponent.html | 294 ---
documentation/components/FooterComponent.html | 318 ---
documentation/components/HeaderComponent.html | 968 --------
.../components/HeroCardComponent.html | 669 ------
.../components/HeroDetailPageComponent.html | 616 -----
.../components/HeroLoadingComponent.html | 299 ---
.../components/HeroRemoveComponent.html | 270 ---
.../components/HomePageComponent.html | 483 ----
.../LoadingPlaceholderComponent.html | 388 ---
.../components/LogInPageComponent.html | 797 -------
.../components/MyHeroesPageComponent.html | 1300 ----------
.../components/SearchBarComponent.html | 669 ------
.../components/SignUpPageComponent.html | 848 -------
.../components/SpinnerComponent.html | 315 ---
documentation/coverage.html | 773 ------
documentation/dependencies.html | 202 --
documentation/fonts/ionicons.eot | Bin 112650 -> 0 bytes
documentation/fonts/ionicons.svg | 2090 -----------------
documentation/fonts/ionicons.ttf | Bin 112472 -> 0 bytes
documentation/fonts/ionicons.woff | Bin 65912 -> 0 bytes
documentation/fonts/ionicons.woff2 | Bin 50632 -> 0 bytes
documentation/fonts/roboto-v15-latin-300.eot | Bin 16205 -> 0 bytes
documentation/fonts/roboto-v15-latin-300.svg | 314 ---
documentation/fonts/roboto-v15-latin-300.ttf | Bin 32664 -> 0 bytes
documentation/fonts/roboto-v15-latin-300.woff | Bin 18520 -> 0 bytes
.../fonts/roboto-v15-latin-300.woff2 | Bin 14524 -> 0 bytes
documentation/fonts/roboto-v15-latin-700.eot | Bin 16208 -> 0 bytes
documentation/fonts/roboto-v15-latin-700.svg | 310 ---
documentation/fonts/roboto-v15-latin-700.ttf | Bin 32500 -> 0 bytes
documentation/fonts/roboto-v15-latin-700.woff | Bin 18568 -> 0 bytes
.../fonts/roboto-v15-latin-700.woff2 | Bin 14552 -> 0 bytes
.../fonts/roboto-v15-latin-italic.eot | Bin 17534 -> 0 bytes
.../fonts/roboto-v15-latin-italic.svg | 323 ---
.../fonts/roboto-v15-latin-italic.ttf | Bin 33404 -> 0 bytes
.../fonts/roboto-v15-latin-italic.woff | Bin 19880 -> 0 bytes
.../fonts/roboto-v15-latin-italic.woff2 | Bin 11500 -> 0 bytes
.../fonts/roboto-v15-latin-regular.eot | Bin 16227 -> 0 bytes
.../fonts/roboto-v15-latin-regular.svg | 308 ---
.../fonts/roboto-v15-latin-regular.ttf | Bin 32652 -> 0 bytes
.../fonts/roboto-v15-latin-regular.woff | Bin 18520 -> 0 bytes
.../fonts/roboto-v15-latin-regular.woff2 | Bin 14584 -> 0 bytes
documentation/graph/dependencies.svg | 626 -----
documentation/guards/AuthGuard.html | 343 ---
documentation/guards/HeroResolver.html | 317 ---
.../images/compodoc-vectorise-inverted.png | Bin 21782 -> 0 bytes
.../images/compodoc-vectorise-inverted.svg | 201 --
documentation/images/compodoc-vectorise.png | Bin 21325 -> 0 bytes
documentation/images/compodoc-vectorise.svg | 201 --
.../images/coverage-badge-documentation.svg | 9 -
documentation/images/favicon.ico | Bin 1150 -> 0 bytes
documentation/index.html | 195 --
documentation/injectables/AuthService.html | 591 -----
documentation/injectables/EventsService.html | 356 ---
documentation/injectables/HeroService.html | 721 ------
documentation/injectables/LoggerService.html | 362 ---
.../injectables/SentryErrorHandler.html | 287 ---
documentation/injectables/StorageService.html | 459 ----
documentation/injectables/UserService.html | 335 ---
.../injectables/UtilsHelperService.html | 332 ---
documentation/injectables/UtilsService.html | 331 ---
.../interceptors/TimingInterceptor.html | 308 ---
.../interceptors/TokenInterceptor.html | 357 ---
documentation/interfaces/Deserializable.html | 244 --
documentation/interfaces/EventType.html | 368 ---
documentation/js/compodoc.js | 14 -
documentation/js/lazy-load-graphs.js | 44 -
documentation/js/libs/EventDispatcher.js | 5 -
documentation/js/libs/bootstrap-native.js | 2 -
documentation/js/libs/clipboard.min.js | 7 -
.../js/libs/custom-elements-es5-adapter.js | 15 -
documentation/js/libs/custom-elements.min.js | 38 -
documentation/js/libs/d3.v3.min.js | 2 -
documentation/js/libs/deep-iterator.js | 2 -
documentation/js/libs/es6-shim.min.js | 11 -
documentation/js/libs/htmlparser.js | 23 -
documentation/js/libs/innersvg.js | 9 -
documentation/js/libs/lit-html.js | 1 -
documentation/js/libs/prism.js | 46 -
documentation/js/libs/promise.min.js | 6 -
documentation/js/libs/svg-pan-zoom.min.js | 3 -
documentation/js/libs/tablesort.min.js | 6 -
documentation/js/libs/tablesort.number.min.js | 6 -
documentation/js/libs/vis.min.js | 46 -
documentation/js/libs/zepto.min.js | 2 -
documentation/js/menu-wc.js | 374 ---
documentation/js/menu-wc_es5.js | 60 -
documentation/js/menu.js | 321 ---
documentation/js/routes.js | 280 ---
documentation/js/routes/routes_index.js | 1 -
documentation/js/search/lunr.min.js | 6 -
documentation/js/search/search-lunr.js | 67 -
documentation/js/search/search.js | 268 ---
documentation/js/search/search_index.js | 4 -
documentation/js/sourceCode.js | 58 -
documentation/js/svg-pan-zoom.controls.js | 53 -
documentation/js/tabs.js | 21 -
documentation/js/tree.js | 147 --
documentation/license.html | 130 -
documentation/miscellaneous/enumerations.html | 193 --
documentation/miscellaneous/functions.html | 199 --
documentation/miscellaneous/variables.html | 715 ------
documentation/modules.html | 328 ---
documentation/modules/AppModule.html | 355 ---
.../modules/AppModule/dependencies.svg | 120 -
documentation/modules/AppRoutingModule.html | 181 --
documentation/modules/AuthModule.html | 283 ---
.../modules/AuthModule/dependencies.svg | 80 -
documentation/modules/AuthRoutingModule.html | 172 --
documentation/modules/CoreModule.html | 289 ---
.../modules/CoreModule/dependencies.svg | 64 -
documentation/modules/GraphQLModule.html | 188 --
documentation/modules/HeroModule.html | 308 ---
.../modules/HeroModule/dependencies.svg | 92 -
documentation/modules/HeroRoutingModule.html | 178 --
documentation/modules/MaterialModule.html | 205 --
documentation/modules/RootModule.html | 429 ----
.../modules/RootModule/dependencies.svg | 180 --
documentation/modules/RootRoutingModule.html | 171 --
documentation/modules/SharedModule.html | 448 ----
.../modules/SharedModule/dependencies.svg | 180 --
documentation/modules/UserModule.html | 225 --
.../modules/UserModule/dependencies.svg | 40 -
documentation/overview.html | 827 -------
documentation/pipes/CapitalizeFirstPipe.html | 248 --
documentation/properties.html | 121 -
documentation/routes.html | 122 -
documentation/styles/bootstrap-card.css | 219 --
documentation/styles/bootstrap.min.css | 6 -
documentation/styles/compodoc.css | 1082 ---------
documentation/styles/dark.css | 117 -
documentation/styles/ionicons.min.css | 11 -
documentation/styles/laravel.css | 113 -
documentation/styles/material.css | 131 --
documentation/styles/original.css | 51 -
documentation/styles/postmark.css | 238 --
documentation/styles/prism.css | 301 ---
documentation/styles/readthedocs.css | 117 -
documentation/styles/reset.css | 129 -
documentation/styles/stripe.css | 106 -
documentation/styles/style.css | 7 -
documentation/styles/tablesort.css | 33 -
documentation/styles/vagrant.css | 130 -
karma.conf.js | 6 +-
package.json | 196 +-
projects/ngx-example-library/.browserslistrc | 16 -
projects/ngx-example-library/karma.conf.js | 55 -
projects/ngx-example-library/ng-package.json | 7 -
projects/ngx-example-library/package.json | 16 -
.../lib/ngx-example-library.component.spec.ts | 23 -
.../src/lib/ngx-example-library.component.ts | 17 -
.../src/lib/ngx-example-library.module.ts | 36 -
.../lib/ngx-example-library.service.spec.ts | 15 -
.../src/lib/ngx-example-library.service.ts | 8 -
.../ngx-example-library/src/public_api.ts | 3 -
projects/ngx-example-library/src/test.ts | 28 -
.../ngx-example-library/tsconfig.lib.json | 12 -
.../tsconfig.lib.prod.json | 10 -
.../ngx-example-library/tsconfig.spec.json | 10 -
sonar-project.properties | 12 -
src/app/app-routes.ts | 9 +
src/app/app-routing.module.ts | 28 -
src/app/app.component.html | 31 +-
src/app/app.component.scss | 53 +
src/app/app.component.spec.ts | 79 +-
src/app/app.component.ts | 228 +-
src/app/app.module.ts | 30 -
src/app/configs/app-config.interface.ts | 24 +
src/app/configs/app.config.ts | 56 +-
src/app/configs/endpoints.config.ts | 7 -
src/app/configs/routes.config.ts | 40 -
src/app/modules/auth/auth-routing.module.ts | 19 -
src/app/modules/auth/auth.guard.ts | 20 -
src/app/modules/auth/auth.module.ts | 13 -
src/app/modules/auth/auth.routes.ts | 17 +
src/app/modules/auth/auth.service.ts | 95 -
.../log-in-page/log-in-page.component.html | 142 +-
.../log-in-page/log-in-page.component.scss | 79 +-
.../log-in-page/log-in-page.component.spec.ts | 38 -
.../log-in-page/log-in-page.component.ts | 179 +-
.../logout-page/logout-page.component.ts | 72 +
.../register-page.component.html | 154 ++
.../register-page.component.scss | 58 +
.../register-page.component.spec.ts | 0
.../register-page/register-page.component.ts | 174 ++
.../sign-up-page/sign-up-page.component.html | 61 -
.../sign-up-page/sign-up-page.component.scss | 61 -
.../sign-up-page.component.spec.ts | 38 -
.../sign-up-page/sign-up-page.component.ts | 84 -
.../auth/shared/auth-mutations.graphql.ts | 202 ++
.../auth/shared/auth-queries.graphql.ts | 23 +
src/app/modules/auth/shared/auth-routes.ts | 12 +
src/app/modules/auth/shared/auth.service.ts | 145 ++
.../language-selector.component.html | 17 +
.../language-selector.component.scss | 17 +
.../language-selector.component.spec.ts | 0
.../language-selector.component.ts | 15 +
.../change-password-response.interface.ts | 8 +
.../shared/interfaces/custom-errors.enum.ts | 6 +
.../delete-account-response.interface.ts | 8 +
.../interfaces/get-me-response.interface.ts | 8 +
.../interfaces/log-in-response.interface.ts | 12 +
.../interfaces/register-data.interface.ts | 7 +
.../interfaces/register-payload.interface.ts | 6 +
.../interfaces/register-response.interface.ts | 12 +
.../interfaces/update-token-data.interface.ts | 4 +
.../update-token-response.interface.ts | 9 +
.../interfaces/update-user-data.interface.ts | 5 +
.../update-user-response.interface.ts | 8 +
src/app/modules/auth/store/auth.repository.ts | 70 +
.../store/interfaces/auth-props.interface.ts | 7 +
src/app/modules/core/core.module.ts | 78 +-
src/app/modules/core/guards/auth.guard.ts | 23 +
src/app/modules/core/guards/no-auth.guard.ts | 23 +
.../core/interceptors/timing.interceptor.ts | 28 -
.../core/interceptors/token.interceptor.ts | 150 +-
src/app/modules/core/sentry.errorhandler.ts | 17 -
.../modules/core/services/alert.service.ts | 95 +
.../core/services/event-bus.service.ts | 42 +
.../modules/core/services/events.service.ts | 35 -
.../core/services/logger.service.spec.ts | 20 -
.../modules/core/services/logger.service.ts | 14 -
.../modules/core/services/track-by.service.ts | 11 +
src/app/modules/core/services/util.service.ts | 19 +
.../core/services/utils.service.spec.ts | 30 -
.../modules/core/services/utils.service.ts | 47 -
.../core/services/validation.service.ts | 18 +
.../hero-remove/hero-remove.component.html | 6 -
.../hero-remove/hero-remove.component.spec.ts | 25 -
.../hero-remove/hero-remove.component.ts | 9 -
src/app/modules/hero/hero-routing.module.ts | 25 -
src/app/modules/hero/hero.module.ts | 14 -
.../hero-detail-page.component.html | 25 -
.../hero-detail-page.component.scss | 18 -
.../hero-detail-page.component.spec.ts | 63 -
.../hero-detail-page.component.ts | 50 -
.../my-heroes-page.component.html | 117 -
.../my-heroes-page.component.scss | 105 -
.../my-heroes-page.component.spec.ts | 122 -
.../my-heroes-page.component.ts | 112 -
.../hero/shared/hero-data.service.spec.ts | 1 -
.../modules/hero/shared/hero-data.service.ts | 34 -
src/app/modules/hero/shared/hero.model.ts | 25 -
.../modules/hero/shared/hero.resolver.spec.ts | 41 -
src/app/modules/hero/shared/hero.resolver.ts | 15 -
.../modules/hero/shared/hero.service.spec.ts | 53 -
src/app/modules/hero/shared/hero.service.ts | 134 --
.../error404-page.component.html | 3 -
.../error404-page.component.scss | 13 -
.../error404-page.component.spec.ts | 23 -
.../error404-page/error404-page.component.ts | 10 -
.../pages/home-page/home-page.component.html | 15 -
.../pages/home-page/home-page.component.scss | 5 -
.../home-page/home-page.component.spec.ts | 51 -
.../pages/home-page/home-page.component.ts | 40 -
src/app/modules/root/root-routing.module.ts | 18 -
src/app/modules/root/root.module.ts | 29 -
.../root/shared/footer/footer.component.html | 15 -
.../root/shared/footer/footer.component.scss | 26 -
.../shared/footer/footer.component.spec.ts | 25 -
.../root/shared/footer/footer.component.ts | 10 -
.../root/shared/header/header.component.html | 48 -
.../root/shared/header/header.component.scss | 120 -
.../shared/header/header.component.spec.ts | 70 -
.../root/shared/header/header.component.ts | 58 -
.../search-bar/search-bar.component.html | 17 -
.../search-bar/search-bar.component.scss | 6 -
.../search-bar/search-bar.component.spec.ts | 59 -
.../shared/search-bar/search-bar.component.ts | 48 -
.../components/alert/alert.component.html | 35 +
.../components/alert/alert.component.scss | 5 +
.../components/alert/alert.component.spec.ts | 0
.../components/alert/alert.component.ts | 128 +
.../shared/components/alert/alerts.config.ts | 59 +
.../components/footer/footer.component.html | 34 +
.../components/footer/footer.component.scss | 31 +
.../footer/footer.component.spec.ts | 0
.../components/footer/footer.component.ts | 24 +
.../form-errors/form-errors.component.html | 19 +
.../form-errors/form-errors.component.spec.ts | 0
.../form-errors/form-errors.component.ts | 27 +
.../components/header/header.component.html | 116 +
.../components/header/header.component.scss | 151 ++
.../header/header.component.spec.ts | 0
.../components/header/header.component.ts | 88 +
.../components/sidebar/sidebar.component.html | 25 +
.../components/sidebar/sidebar.component.scss | 123 +
.../sidebar/sidebar.component.spec.ts | 0
.../components/sidebar/sidebar.component.ts | 75 +
.../components/spinner/spinner.component.html | 7 +
.../components/spinner/spinner.component.scss | 69 +
.../components/spinner/spinner.component.ts | 10 +
.../shared/directives/lowercase.directive.ts | 17 +
.../shared/directives/trim.directive.ts | 17 +
.../shared/interfaces/api-error.interface.ts | 4 +
.../interfaces/custom-route.interface.ts | 5 +
.../shared/interfaces/ok-data.interface.ts | 3 +
.../error404-page.component.html | 12 +
.../error404-page.component.scss | 19 +
.../error404-page.component.spec.ts | 0
.../error404-page/error404-page.component.ts | 56 +
.../change-language.component.html | 33 +
.../change-language.component.spec.ts | 0
.../change-language.component.ts | 94 +
.../change-password.component.html | 82 +
.../change-password.component.spec.ts | 0
.../change-password.component.ts | 130 +
.../delete-account.component.html | 127 +
.../delete-account.component.spec.ts | 0
.../delete-account.component.ts | 143 ++
.../edit-profile/edit-profile.component.html | 88 +
.../edit-profile.component.spec.ts | 0
.../edit-profile/edit-profile.component.ts | 117 +
.../dashboard/dashboard-page.component.html | 1 +
.../dashboard/dashboard-page.component.scss | 30 +
.../dashboard-page.component.spec.ts | 0
.../dashboard/dashboard-page.component.ts | 64 +
.../my-account/my-account.component.html | 105 +
.../my-account/my-account.component.scss | 18 +
.../my-account/my-account.component.spec.ts | 0
.../pages/my-account/my-account.component.ts | 53 +
src/app/modules/user/shared/user-routes.ts | 10 +
src/app/modules/user/shared/user.model.ts | 36 +-
src/app/modules/user/user.module.ts | 10 -
src/app/modules/user/user.routes.ts | 20 +
src/app/modules/user/user.service.ts | 36 -
.../hero-card/hero-card.component.html | 22 -
.../hero-card/hero-card.component.scss | 37 -
.../hero-card/hero-card.component.spec.ts | 44 -
.../hero-card/hero-card.component.ts | 53 -
.../hero-loading/hero-loading.component.html | 16 -
.../hero-loading/hero-loading.component.scss | 5 -
.../hero-loading.component.spec.ts | 28 -
.../hero-loading/hero-loading.component.ts | 10 -
.../loading-placeholder.component.html | 1 -
.../loading-placeholder.component.scss | 22 -
.../loading-placeholder.component.spec.ts | 23 -
.../loading-placeholder.component.ts | 13 -
.../components/spinner/spinner.component.html | 1 -
.../components/spinner/spinner.component.scss | 36 -
.../spinner/spinner.component.spec.ts | 23 -
.../components/spinner/spinner.component.ts | 10 -
.../interfaces/deserializable.interface.ts | 3 -
src/app/shared/modules/graphql.module.ts | 35 -
src/app/shared/modules/material.module.ts | 52 -
.../pipes/capitalize-first.pipe.spec.ts | 33 -
src/app/shared/pipes/capitalize-first.pipe.ts | 13 -
src/app/shared/services/storage.service.ts | 43 -
src/app/shared/shared.module.ts | 48 -
src/app/styles/_colors.scss | 10 -
src/app/styles/_functions.scss | 7 -
src/app/styles/_mixins.scss | 46 -
src/app/styles/abstracts/_functions.scss | 5 +
src/app/styles/abstracts/_keyframes.scss | 84 +
src/app/styles/base/_colors.scss | 18 +
src/app/styles/base/_variables.scss | 98 +
src/app/styles/custom/accordions.scss | 17 +
src/app/styles/custom/alerts.scss | 65 +
src/app/styles/custom/buttons.scss | 35 +
src/app/styles/custom/cards.scss | 28 +
src/app/styles/custom/checkboxes.scss | 8 +
src/app/styles/custom/dropdowns.scss | 12 +
src/app/styles/custom/forms.scss | 86 +
src/app/styles/custom/global.scss | 46 +
src/app/styles/custom/headings.scss | 30 +
src/app/styles/custom/icons.scss | 8 +
src/app/styles/custom/index.scss | 15 +
src/app/styles/custom/links.scss | 17 +
src/app/styles/custom/modals.scss | 49 +
src/app/styles/custom/selects.scss | 5 +
src/app/styles/custom/tables.scss | 14 +
src/app/styles/custom/tooltips.scss | 4 +
src/app/styles/external/global.scss | 15 +
src/app/styles/external/index.scss | 1 +
src/app/styles/global.scss | 115 -
src/app/styles/index.scss | 56 +
src/app/styles/material.scss | 53 -
src/assets/base/404.html | 384 ---
src/assets/base/googled41787c6aae2151b.html | 1 -
src/assets/base/manifest.webmanifest | 57 -
src/assets/base/robots.txt | 4 -
src/assets/css/loading.css | 132 --
src/assets/css/reset.css | 131 --
src/assets/default/_redirects | 3 +
src/assets/default/robots.txt | 2 +
src/assets/icons/icon-128x128.png | Bin
src/assets/icons/icon-144x144.png | Bin
src/assets/icons/icon-152x152.png | Bin
src/assets/icons/icon-192x192.png | Bin
src/assets/icons/icon-384x384.png | Bin
src/assets/icons/icon-512x512.png | Bin
src/assets/icons/icon-72x72.png | Bin
src/assets/icons/icon-96x96.png | Bin
src/assets/images/404.gif | Bin 896180 -> 0 bytes
src/assets/images/angular.svg | 26 -
src/assets/images/default-hero.png | Bin 6298 -> 0 bytes
src/assets/images/favicon.ico | Bin 5430 -> 0 bytes
.../github-circle-white-transparent.svg | 6 -
src/assets/images/og.jpg | Bin 32876 -> 0 bytes
src/assets/js/gtm.js | 13 -
src/assets/js/modernizr.js | 89 -
src/environments/environment.prod.ts | 5 +-
src/environments/environment.ts | 10 +-
src/index.html | 95 +-
src/locale/messages.es.xlf | 428 ++--
src/locale/messages.xlf | 370 ++-
src/locale/translations.ts | 15 +
src/main.ts | 58 +-
src/ngsw-config.json | 38 -
src/polyfills.ts | 0
src/test.ts | 2 +-
tsconfig.app.json | 4 +-
tsconfig.doc.json | 4 -
tsconfig.json | 13 +-
tsconfig.spec.json | 0
444 files changed, 5979 insertions(+), 40146 deletions(-)
mode change 100644 => 100755 .browserslistrc
create mode 100755 .commitlintrc.json
mode change 100644 => 100755 .editorconfig
mode change 100644 => 100755 .eslintrc.json
mode change 100644 => 100755 .github/ISSUE_TEMPLATE/bug_report.md
mode change 100644 => 100755 .github/ISSUE_TEMPLATE/feature_request.md
mode change 100644 => 100755 .gitignore
create mode 100755 .husky/commit-msg
create mode 100755 .husky/scripts/check-coverage.sh
mode change 100644 => 100755 .prettierignore
mode change 100644 => 100755 .prettierrc
create mode 100755 .stylelintrc.json
delete mode 100755 LICENSE
mode change 100644 => 100755 angular.json
create mode 100755 commitlint.config.js
create mode 100755 cypress.config.ts
delete mode 100644 cypress.json
create mode 100755 cypress/e2e/home.feature
create mode 100755 cypress/e2e/home.ts
mode change 100644 => 100755 cypress/fixtures/example.json
delete mode 100644 cypress/integration/spec.ts
delete mode 100644 cypress/plugins/index.ts
mode change 100644 => 100755 cypress/support/commands.ts
mode change 100644 => 100755 cypress/tsconfig.json
delete mode 100644 documentation/changelog.html
delete mode 100644 documentation/classes/Hero.html
delete mode 100644 documentation/classes/User.html
delete mode 100644 documentation/components/AppComponent.html
delete mode 100644 documentation/components/Error404PageComponent.html
delete mode 100644 documentation/components/FooterComponent.html
delete mode 100644 documentation/components/HeaderComponent.html
delete mode 100644 documentation/components/HeroCardComponent.html
delete mode 100644 documentation/components/HeroDetailPageComponent.html
delete mode 100644 documentation/components/HeroLoadingComponent.html
delete mode 100644 documentation/components/HeroRemoveComponent.html
delete mode 100644 documentation/components/HomePageComponent.html
delete mode 100644 documentation/components/LoadingPlaceholderComponent.html
delete mode 100644 documentation/components/LogInPageComponent.html
delete mode 100644 documentation/components/MyHeroesPageComponent.html
delete mode 100644 documentation/components/SearchBarComponent.html
delete mode 100644 documentation/components/SignUpPageComponent.html
delete mode 100644 documentation/components/SpinnerComponent.html
delete mode 100644 documentation/coverage.html
delete mode 100644 documentation/dependencies.html
delete mode 100644 documentation/fonts/ionicons.eot
delete mode 100644 documentation/fonts/ionicons.svg
delete mode 100644 documentation/fonts/ionicons.ttf
delete mode 100644 documentation/fonts/ionicons.woff
delete mode 100644 documentation/fonts/ionicons.woff2
delete mode 100644 documentation/fonts/roboto-v15-latin-300.eot
delete mode 100644 documentation/fonts/roboto-v15-latin-300.svg
delete mode 100644 documentation/fonts/roboto-v15-latin-300.ttf
delete mode 100644 documentation/fonts/roboto-v15-latin-300.woff
delete mode 100644 documentation/fonts/roboto-v15-latin-300.woff2
delete mode 100644 documentation/fonts/roboto-v15-latin-700.eot
delete mode 100644 documentation/fonts/roboto-v15-latin-700.svg
delete mode 100644 documentation/fonts/roboto-v15-latin-700.ttf
delete mode 100644 documentation/fonts/roboto-v15-latin-700.woff
delete mode 100644 documentation/fonts/roboto-v15-latin-700.woff2
delete mode 100644 documentation/fonts/roboto-v15-latin-italic.eot
delete mode 100644 documentation/fonts/roboto-v15-latin-italic.svg
delete mode 100644 documentation/fonts/roboto-v15-latin-italic.ttf
delete mode 100644 documentation/fonts/roboto-v15-latin-italic.woff
delete mode 100644 documentation/fonts/roboto-v15-latin-italic.woff2
delete mode 100644 documentation/fonts/roboto-v15-latin-regular.eot
delete mode 100644 documentation/fonts/roboto-v15-latin-regular.svg
delete mode 100644 documentation/fonts/roboto-v15-latin-regular.ttf
delete mode 100644 documentation/fonts/roboto-v15-latin-regular.woff
delete mode 100644 documentation/fonts/roboto-v15-latin-regular.woff2
delete mode 100644 documentation/graph/dependencies.svg
delete mode 100644 documentation/guards/AuthGuard.html
delete mode 100644 documentation/guards/HeroResolver.html
delete mode 100644 documentation/images/compodoc-vectorise-inverted.png
delete mode 100644 documentation/images/compodoc-vectorise-inverted.svg
delete mode 100644 documentation/images/compodoc-vectorise.png
delete mode 100644 documentation/images/compodoc-vectorise.svg
delete mode 100644 documentation/images/coverage-badge-documentation.svg
delete mode 100644 documentation/images/favicon.ico
delete mode 100644 documentation/index.html
delete mode 100644 documentation/injectables/AuthService.html
delete mode 100644 documentation/injectables/EventsService.html
delete mode 100644 documentation/injectables/HeroService.html
delete mode 100644 documentation/injectables/LoggerService.html
delete mode 100644 documentation/injectables/SentryErrorHandler.html
delete mode 100644 documentation/injectables/StorageService.html
delete mode 100644 documentation/injectables/UserService.html
delete mode 100644 documentation/injectables/UtilsHelperService.html
delete mode 100644 documentation/injectables/UtilsService.html
delete mode 100644 documentation/interceptors/TimingInterceptor.html
delete mode 100644 documentation/interceptors/TokenInterceptor.html
delete mode 100644 documentation/interfaces/Deserializable.html
delete mode 100644 documentation/interfaces/EventType.html
delete mode 100644 documentation/js/compodoc.js
delete mode 100644 documentation/js/lazy-load-graphs.js
delete mode 100644 documentation/js/libs/EventDispatcher.js
delete mode 100644 documentation/js/libs/bootstrap-native.js
delete mode 100644 documentation/js/libs/clipboard.min.js
delete mode 100644 documentation/js/libs/custom-elements-es5-adapter.js
delete mode 100644 documentation/js/libs/custom-elements.min.js
delete mode 100644 documentation/js/libs/d3.v3.min.js
delete mode 100644 documentation/js/libs/deep-iterator.js
delete mode 100644 documentation/js/libs/es6-shim.min.js
delete mode 100644 documentation/js/libs/htmlparser.js
delete mode 100644 documentation/js/libs/innersvg.js
delete mode 100644 documentation/js/libs/lit-html.js
delete mode 100644 documentation/js/libs/prism.js
delete mode 100644 documentation/js/libs/promise.min.js
delete mode 100644 documentation/js/libs/svg-pan-zoom.min.js
delete mode 100644 documentation/js/libs/tablesort.min.js
delete mode 100644 documentation/js/libs/tablesort.number.min.js
delete mode 100644 documentation/js/libs/vis.min.js
delete mode 100644 documentation/js/libs/zepto.min.js
delete mode 100644 documentation/js/menu-wc.js
delete mode 100644 documentation/js/menu-wc_es5.js
delete mode 100644 documentation/js/menu.js
delete mode 100644 documentation/js/routes.js
delete mode 100644 documentation/js/routes/routes_index.js
delete mode 100644 documentation/js/search/lunr.min.js
delete mode 100644 documentation/js/search/search-lunr.js
delete mode 100644 documentation/js/search/search.js
delete mode 100644 documentation/js/search/search_index.js
delete mode 100644 documentation/js/sourceCode.js
delete mode 100644 documentation/js/svg-pan-zoom.controls.js
delete mode 100644 documentation/js/tabs.js
delete mode 100644 documentation/js/tree.js
delete mode 100644 documentation/license.html
delete mode 100644 documentation/miscellaneous/enumerations.html
delete mode 100644 documentation/miscellaneous/functions.html
delete mode 100644 documentation/miscellaneous/variables.html
delete mode 100644 documentation/modules.html
delete mode 100644 documentation/modules/AppModule.html
delete mode 100644 documentation/modules/AppModule/dependencies.svg
delete mode 100644 documentation/modules/AppRoutingModule.html
delete mode 100644 documentation/modules/AuthModule.html
delete mode 100644 documentation/modules/AuthModule/dependencies.svg
delete mode 100644 documentation/modules/AuthRoutingModule.html
delete mode 100644 documentation/modules/CoreModule.html
delete mode 100644 documentation/modules/CoreModule/dependencies.svg
delete mode 100644 documentation/modules/GraphQLModule.html
delete mode 100644 documentation/modules/HeroModule.html
delete mode 100644 documentation/modules/HeroModule/dependencies.svg
delete mode 100644 documentation/modules/HeroRoutingModule.html
delete mode 100644 documentation/modules/MaterialModule.html
delete mode 100644 documentation/modules/RootModule.html
delete mode 100644 documentation/modules/RootModule/dependencies.svg
delete mode 100644 documentation/modules/RootRoutingModule.html
delete mode 100644 documentation/modules/SharedModule.html
delete mode 100644 documentation/modules/SharedModule/dependencies.svg
delete mode 100644 documentation/modules/UserModule.html
delete mode 100644 documentation/modules/UserModule/dependencies.svg
delete mode 100644 documentation/overview.html
delete mode 100644 documentation/pipes/CapitalizeFirstPipe.html
delete mode 100644 documentation/properties.html
delete mode 100644 documentation/routes.html
delete mode 100644 documentation/styles/bootstrap-card.css
delete mode 100644 documentation/styles/bootstrap.min.css
delete mode 100644 documentation/styles/compodoc.css
delete mode 100644 documentation/styles/dark.css
delete mode 100644 documentation/styles/ionicons.min.css
delete mode 100644 documentation/styles/laravel.css
delete mode 100644 documentation/styles/material.css
delete mode 100644 documentation/styles/original.css
delete mode 100644 documentation/styles/postmark.css
delete mode 100644 documentation/styles/prism.css
delete mode 100644 documentation/styles/readthedocs.css
delete mode 100644 documentation/styles/reset.css
delete mode 100644 documentation/styles/stripe.css
delete mode 100644 documentation/styles/style.css
delete mode 100644 documentation/styles/tablesort.css
delete mode 100644 documentation/styles/vagrant.css
mode change 100644 => 100755 karma.conf.js
mode change 100644 => 100755 package.json
delete mode 100644 projects/ngx-example-library/.browserslistrc
delete mode 100644 projects/ngx-example-library/karma.conf.js
delete mode 100644 projects/ngx-example-library/ng-package.json
delete mode 100644 projects/ngx-example-library/package.json
delete mode 100644 projects/ngx-example-library/src/lib/ngx-example-library.component.spec.ts
delete mode 100644 projects/ngx-example-library/src/lib/ngx-example-library.component.ts
delete mode 100644 projects/ngx-example-library/src/lib/ngx-example-library.module.ts
delete mode 100644 projects/ngx-example-library/src/lib/ngx-example-library.service.spec.ts
delete mode 100644 projects/ngx-example-library/src/lib/ngx-example-library.service.ts
delete mode 100644 projects/ngx-example-library/src/public_api.ts
delete mode 100644 projects/ngx-example-library/src/test.ts
delete mode 100644 projects/ngx-example-library/tsconfig.lib.json
delete mode 100644 projects/ngx-example-library/tsconfig.lib.prod.json
delete mode 100644 projects/ngx-example-library/tsconfig.spec.json
delete mode 100644 sonar-project.properties
create mode 100755 src/app/app-routes.ts
delete mode 100644 src/app/app-routing.module.ts
mode change 100644 => 100755 src/app/app.component.html
create mode 100755 src/app/app.component.scss
delete mode 100755 src/app/app.module.ts
create mode 100755 src/app/configs/app-config.interface.ts
mode change 100644 => 100755 src/app/configs/app.config.ts
delete mode 100644 src/app/configs/endpoints.config.ts
delete mode 100644 src/app/configs/routes.config.ts
delete mode 100644 src/app/modules/auth/auth-routing.module.ts
delete mode 100644 src/app/modules/auth/auth.guard.ts
delete mode 100644 src/app/modules/auth/auth.module.ts
create mode 100755 src/app/modules/auth/auth.routes.ts
delete mode 100755 src/app/modules/auth/auth.service.ts
create mode 100755 src/app/modules/auth/pages/logout-page/logout-page.component.ts
create mode 100755 src/app/modules/auth/pages/register-page/register-page.component.html
create mode 100755 src/app/modules/auth/pages/register-page/register-page.component.scss
create mode 100755 src/app/modules/auth/pages/register-page/register-page.component.spec.ts
create mode 100755 src/app/modules/auth/pages/register-page/register-page.component.ts
delete mode 100755 src/app/modules/auth/pages/sign-up-page/sign-up-page.component.html
delete mode 100755 src/app/modules/auth/pages/sign-up-page/sign-up-page.component.scss
delete mode 100755 src/app/modules/auth/pages/sign-up-page/sign-up-page.component.spec.ts
delete mode 100755 src/app/modules/auth/pages/sign-up-page/sign-up-page.component.ts
create mode 100755 src/app/modules/auth/shared/auth-mutations.graphql.ts
create mode 100755 src/app/modules/auth/shared/auth-queries.graphql.ts
create mode 100755 src/app/modules/auth/shared/auth-routes.ts
create mode 100755 src/app/modules/auth/shared/auth.service.ts
create mode 100755 src/app/modules/auth/shared/components/language-selector/language-selector.component.html
create mode 100755 src/app/modules/auth/shared/components/language-selector/language-selector.component.scss
create mode 100755 src/app/modules/auth/shared/components/language-selector/language-selector.component.spec.ts
create mode 100755 src/app/modules/auth/shared/components/language-selector/language-selector.component.ts
create mode 100755 src/app/modules/auth/shared/interfaces/change-password-response.interface.ts
create mode 100755 src/app/modules/auth/shared/interfaces/custom-errors.enum.ts
create mode 100755 src/app/modules/auth/shared/interfaces/delete-account-response.interface.ts
create mode 100755 src/app/modules/auth/shared/interfaces/get-me-response.interface.ts
create mode 100755 src/app/modules/auth/shared/interfaces/log-in-response.interface.ts
create mode 100755 src/app/modules/auth/shared/interfaces/register-data.interface.ts
create mode 100755 src/app/modules/auth/shared/interfaces/register-payload.interface.ts
create mode 100755 src/app/modules/auth/shared/interfaces/register-response.interface.ts
create mode 100755 src/app/modules/auth/shared/interfaces/update-token-data.interface.ts
create mode 100755 src/app/modules/auth/shared/interfaces/update-token-response.interface.ts
create mode 100755 src/app/modules/auth/shared/interfaces/update-user-data.interface.ts
create mode 100755 src/app/modules/auth/shared/interfaces/update-user-response.interface.ts
create mode 100755 src/app/modules/auth/store/auth.repository.ts
create mode 100755 src/app/modules/auth/store/interfaces/auth-props.interface.ts
mode change 100644 => 100755 src/app/modules/core/core.module.ts
create mode 100755 src/app/modules/core/guards/auth.guard.ts
create mode 100755 src/app/modules/core/guards/no-auth.guard.ts
delete mode 100644 src/app/modules/core/interceptors/timing.interceptor.ts
mode change 100644 => 100755 src/app/modules/core/interceptors/token.interceptor.ts
delete mode 100644 src/app/modules/core/sentry.errorhandler.ts
create mode 100755 src/app/modules/core/services/alert.service.ts
create mode 100755 src/app/modules/core/services/event-bus.service.ts
delete mode 100644 src/app/modules/core/services/events.service.ts
delete mode 100755 src/app/modules/core/services/logger.service.spec.ts
delete mode 100644 src/app/modules/core/services/logger.service.ts
create mode 100755 src/app/modules/core/services/track-by.service.ts
create mode 100755 src/app/modules/core/services/util.service.ts
delete mode 100755 src/app/modules/core/services/utils.service.spec.ts
delete mode 100644 src/app/modules/core/services/utils.service.ts
create mode 100755 src/app/modules/core/services/validation.service.ts
delete mode 100644 src/app/modules/hero/components/hero-remove/hero-remove.component.html
delete mode 100755 src/app/modules/hero/components/hero-remove/hero-remove.component.spec.ts
delete mode 100644 src/app/modules/hero/components/hero-remove/hero-remove.component.ts
delete mode 100644 src/app/modules/hero/hero-routing.module.ts
delete mode 100644 src/app/modules/hero/hero.module.ts
delete mode 100755 src/app/modules/hero/pages/hero-detail-page/hero-detail-page.component.html
delete mode 100755 src/app/modules/hero/pages/hero-detail-page/hero-detail-page.component.scss
delete mode 100755 src/app/modules/hero/pages/hero-detail-page/hero-detail-page.component.spec.ts
delete mode 100755 src/app/modules/hero/pages/hero-detail-page/hero-detail-page.component.ts
delete mode 100644 src/app/modules/hero/pages/my-heroes-page/my-heroes-page.component.html
delete mode 100644 src/app/modules/hero/pages/my-heroes-page/my-heroes-page.component.scss
delete mode 100644 src/app/modules/hero/pages/my-heroes-page/my-heroes-page.component.spec.ts
delete mode 100644 src/app/modules/hero/pages/my-heroes-page/my-heroes-page.component.ts
delete mode 100644 src/app/modules/hero/shared/hero-data.service.spec.ts
delete mode 100644 src/app/modules/hero/shared/hero-data.service.ts
delete mode 100755 src/app/modules/hero/shared/hero.model.ts
delete mode 100755 src/app/modules/hero/shared/hero.resolver.spec.ts
delete mode 100644 src/app/modules/hero/shared/hero.resolver.ts
delete mode 100755 src/app/modules/hero/shared/hero.service.spec.ts
delete mode 100755 src/app/modules/hero/shared/hero.service.ts
delete mode 100644 src/app/modules/root/pages/error404-page/error404-page.component.html
delete mode 100755 src/app/modules/root/pages/error404-page/error404-page.component.scss
delete mode 100755 src/app/modules/root/pages/error404-page/error404-page.component.spec.ts
delete mode 100644 src/app/modules/root/pages/error404-page/error404-page.component.ts
delete mode 100644 src/app/modules/root/pages/home-page/home-page.component.html
delete mode 100755 src/app/modules/root/pages/home-page/home-page.component.scss
delete mode 100755 src/app/modules/root/pages/home-page/home-page.component.spec.ts
delete mode 100644 src/app/modules/root/pages/home-page/home-page.component.ts
delete mode 100644 src/app/modules/root/root-routing.module.ts
delete mode 100644 src/app/modules/root/root.module.ts
delete mode 100644 src/app/modules/root/shared/footer/footer.component.html
delete mode 100755 src/app/modules/root/shared/footer/footer.component.scss
delete mode 100755 src/app/modules/root/shared/footer/footer.component.spec.ts
delete mode 100644 src/app/modules/root/shared/footer/footer.component.ts
delete mode 100644 src/app/modules/root/shared/header/header.component.html
delete mode 100755 src/app/modules/root/shared/header/header.component.scss
delete mode 100755 src/app/modules/root/shared/header/header.component.spec.ts
delete mode 100644 src/app/modules/root/shared/header/header.component.ts
delete mode 100644 src/app/modules/root/shared/search-bar/search-bar.component.html
delete mode 100644 src/app/modules/root/shared/search-bar/search-bar.component.scss
delete mode 100755 src/app/modules/root/shared/search-bar/search-bar.component.spec.ts
delete mode 100644 src/app/modules/root/shared/search-bar/search-bar.component.ts
create mode 100755 src/app/modules/shared/components/alert/alert.component.html
create mode 100755 src/app/modules/shared/components/alert/alert.component.scss
create mode 100755 src/app/modules/shared/components/alert/alert.component.spec.ts
create mode 100755 src/app/modules/shared/components/alert/alert.component.ts
create mode 100755 src/app/modules/shared/components/alert/alerts.config.ts
create mode 100755 src/app/modules/shared/components/footer/footer.component.html
create mode 100755 src/app/modules/shared/components/footer/footer.component.scss
create mode 100755 src/app/modules/shared/components/footer/footer.component.spec.ts
create mode 100755 src/app/modules/shared/components/footer/footer.component.ts
create mode 100755 src/app/modules/shared/components/form-errors/form-errors.component.html
create mode 100755 src/app/modules/shared/components/form-errors/form-errors.component.spec.ts
create mode 100755 src/app/modules/shared/components/form-errors/form-errors.component.ts
create mode 100755 src/app/modules/shared/components/header/header.component.html
create mode 100755 src/app/modules/shared/components/header/header.component.scss
create mode 100755 src/app/modules/shared/components/header/header.component.spec.ts
create mode 100755 src/app/modules/shared/components/header/header.component.ts
create mode 100755 src/app/modules/shared/components/sidebar/sidebar.component.html
create mode 100755 src/app/modules/shared/components/sidebar/sidebar.component.scss
create mode 100755 src/app/modules/shared/components/sidebar/sidebar.component.spec.ts
create mode 100755 src/app/modules/shared/components/sidebar/sidebar.component.ts
create mode 100755 src/app/modules/shared/components/spinner/spinner.component.html
create mode 100755 src/app/modules/shared/components/spinner/spinner.component.scss
create mode 100755 src/app/modules/shared/components/spinner/spinner.component.ts
create mode 100755 src/app/modules/shared/directives/lowercase.directive.ts
create mode 100755 src/app/modules/shared/directives/trim.directive.ts
create mode 100755 src/app/modules/shared/interfaces/api-error.interface.ts
create mode 100755 src/app/modules/shared/interfaces/custom-route.interface.ts
create mode 100755 src/app/modules/shared/interfaces/ok-data.interface.ts
create mode 100755 src/app/modules/shared/pages/error404-page/error404-page.component.html
create mode 100755 src/app/modules/shared/pages/error404-page/error404-page.component.scss
create mode 100755 src/app/modules/shared/pages/error404-page/error404-page.component.spec.ts
create mode 100755 src/app/modules/shared/pages/error404-page/error404-page.component.ts
create mode 100755 src/app/modules/user/components/change-language/change-language.component.html
create mode 100755 src/app/modules/user/components/change-language/change-language.component.spec.ts
create mode 100755 src/app/modules/user/components/change-language/change-language.component.ts
create mode 100755 src/app/modules/user/components/change-password/change-password.component.html
create mode 100755 src/app/modules/user/components/change-password/change-password.component.spec.ts
create mode 100755 src/app/modules/user/components/change-password/change-password.component.ts
create mode 100755 src/app/modules/user/components/delete-account/delete-account.component.html
create mode 100755 src/app/modules/user/components/delete-account/delete-account.component.spec.ts
create mode 100755 src/app/modules/user/components/delete-account/delete-account.component.ts
create mode 100755 src/app/modules/user/components/edit-profile/edit-profile.component.html
create mode 100755 src/app/modules/user/components/edit-profile/edit-profile.component.spec.ts
create mode 100755 src/app/modules/user/components/edit-profile/edit-profile.component.ts
create mode 100755 src/app/modules/user/pages/dashboard/dashboard-page.component.html
create mode 100755 src/app/modules/user/pages/dashboard/dashboard-page.component.scss
create mode 100755 src/app/modules/user/pages/dashboard/dashboard-page.component.spec.ts
create mode 100755 src/app/modules/user/pages/dashboard/dashboard-page.component.ts
create mode 100755 src/app/modules/user/pages/my-account/my-account.component.html
create mode 100755 src/app/modules/user/pages/my-account/my-account.component.scss
create mode 100755 src/app/modules/user/pages/my-account/my-account.component.spec.ts
create mode 100755 src/app/modules/user/pages/my-account/my-account.component.ts
create mode 100755 src/app/modules/user/shared/user-routes.ts
mode change 100644 => 100755 src/app/modules/user/shared/user.model.ts
delete mode 100644 src/app/modules/user/user.module.ts
create mode 100755 src/app/modules/user/user.routes.ts
delete mode 100755 src/app/modules/user/user.service.ts
delete mode 100644 src/app/shared/components/hero-card/hero-card.component.html
delete mode 100644 src/app/shared/components/hero-card/hero-card.component.scss
delete mode 100644 src/app/shared/components/hero-card/hero-card.component.spec.ts
delete mode 100644 src/app/shared/components/hero-card/hero-card.component.ts
delete mode 100644 src/app/shared/components/hero-loading/hero-loading.component.html
delete mode 100644 src/app/shared/components/hero-loading/hero-loading.component.scss
delete mode 100644 src/app/shared/components/hero-loading/hero-loading.component.spec.ts
delete mode 100644 src/app/shared/components/hero-loading/hero-loading.component.ts
delete mode 100644 src/app/shared/components/loading-placeholder/loading-placeholder.component.html
delete mode 100644 src/app/shared/components/loading-placeholder/loading-placeholder.component.scss
delete mode 100644 src/app/shared/components/loading-placeholder/loading-placeholder.component.spec.ts
delete mode 100644 src/app/shared/components/loading-placeholder/loading-placeholder.component.ts
delete mode 100644 src/app/shared/components/spinner/spinner.component.html
delete mode 100644 src/app/shared/components/spinner/spinner.component.scss
delete mode 100644 src/app/shared/components/spinner/spinner.component.spec.ts
delete mode 100644 src/app/shared/components/spinner/spinner.component.ts
delete mode 100644 src/app/shared/interfaces/deserializable.interface.ts
delete mode 100644 src/app/shared/modules/graphql.module.ts
delete mode 100644 src/app/shared/modules/material.module.ts
delete mode 100644 src/app/shared/pipes/capitalize-first.pipe.spec.ts
delete mode 100644 src/app/shared/pipes/capitalize-first.pipe.ts
delete mode 100644 src/app/shared/services/storage.service.ts
delete mode 100644 src/app/shared/shared.module.ts
delete mode 100644 src/app/styles/_colors.scss
delete mode 100644 src/app/styles/_functions.scss
delete mode 100644 src/app/styles/_mixins.scss
create mode 100755 src/app/styles/abstracts/_functions.scss
create mode 100755 src/app/styles/abstracts/_keyframes.scss
create mode 100755 src/app/styles/base/_colors.scss
create mode 100755 src/app/styles/base/_variables.scss
create mode 100755 src/app/styles/custom/accordions.scss
create mode 100755 src/app/styles/custom/alerts.scss
create mode 100755 src/app/styles/custom/buttons.scss
create mode 100755 src/app/styles/custom/cards.scss
create mode 100755 src/app/styles/custom/checkboxes.scss
create mode 100755 src/app/styles/custom/dropdowns.scss
create mode 100755 src/app/styles/custom/forms.scss
create mode 100755 src/app/styles/custom/global.scss
create mode 100755 src/app/styles/custom/headings.scss
create mode 100755 src/app/styles/custom/icons.scss
create mode 100755 src/app/styles/custom/index.scss
create mode 100755 src/app/styles/custom/links.scss
create mode 100755 src/app/styles/custom/modals.scss
create mode 100755 src/app/styles/custom/selects.scss
create mode 100755 src/app/styles/custom/tables.scss
create mode 100755 src/app/styles/custom/tooltips.scss
create mode 100755 src/app/styles/external/global.scss
create mode 100755 src/app/styles/external/index.scss
delete mode 100644 src/app/styles/global.scss
create mode 100755 src/app/styles/index.scss
delete mode 100644 src/app/styles/material.scss
delete mode 100644 src/assets/base/404.html
delete mode 100644 src/assets/base/googled41787c6aae2151b.html
delete mode 100644 src/assets/base/manifest.webmanifest
delete mode 100644 src/assets/base/robots.txt
delete mode 100644 src/assets/css/loading.css
delete mode 100644 src/assets/css/reset.css
create mode 100755 src/assets/default/_redirects
create mode 100755 src/assets/default/robots.txt
mode change 100644 => 100755 src/assets/icons/icon-128x128.png
mode change 100644 => 100755 src/assets/icons/icon-144x144.png
mode change 100644 => 100755 src/assets/icons/icon-152x152.png
mode change 100644 => 100755 src/assets/icons/icon-192x192.png
mode change 100644 => 100755 src/assets/icons/icon-384x384.png
mode change 100644 => 100755 src/assets/icons/icon-512x512.png
mode change 100644 => 100755 src/assets/icons/icon-72x72.png
mode change 100644 => 100755 src/assets/icons/icon-96x96.png
delete mode 100644 src/assets/images/404.gif
delete mode 100644 src/assets/images/angular.svg
delete mode 100644 src/assets/images/default-hero.png
delete mode 100644 src/assets/images/favicon.ico
delete mode 100644 src/assets/images/github-circle-white-transparent.svg
delete mode 100644 src/assets/images/og.jpg
delete mode 100644 src/assets/js/gtm.js
delete mode 100644 src/assets/js/modernizr.js
mode change 100644 => 100755 src/environments/environment.prod.ts
mode change 100644 => 100755 src/environments/environment.ts
mode change 100644 => 100755 src/index.html
mode change 100644 => 100755 src/locale/messages.es.xlf
mode change 100644 => 100755 src/locale/messages.xlf
create mode 100755 src/locale/translations.ts
mode change 100644 => 100755 src/main.ts
delete mode 100644 src/ngsw-config.json
mode change 100644 => 100755 src/polyfills.ts
mode change 100644 => 100755 src/test.ts
mode change 100644 => 100755 tsconfig.app.json
delete mode 100644 tsconfig.doc.json
mode change 100644 => 100755 tsconfig.json
mode change 100644 => 100755 tsconfig.spec.json
diff --git a/.browserslistrc b/.browserslistrc
old mode 100644
new mode 100755
index 4f9ac269..ebf28904
--- a/.browserslistrc
+++ b/.browserslistrc
@@ -9,8 +9,5 @@
# npx browserslist
last 1 Chrome version
-last 1 Firefox version
-last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
-Firefox ESR
diff --git a/.commitlintrc.json b/.commitlintrc.json
new file mode 100755
index 00000000..c30e5a97
--- /dev/null
+++ b/.commitlintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["@commitlint/config-conventional"]
+}
diff --git a/.editorconfig b/.editorconfig
old mode 100644
new mode 100755
index 59d9a3a3..dcde8df2
--- a/.editorconfig
+++ b/.editorconfig
@@ -14,3 +14,6 @@ quote_type = single
[*.md]
max_line_length = off
trim_trailing_whitespace = false
+
+[*.xlf]
+insert_final_newline = false
diff --git a/.eslintrc.json b/.eslintrc.json
old mode 100644
new mode 100755
index 99b4d9ed..8fc2683c
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,45 +1,37 @@
{
"root": true,
- "ignorePatterns": [
- "projects/**/*"
- ],
+ "ignorePatterns": ["projects/**/*"],
"overrides": [
{
- "files": [
- "*.ts"
- ],
+ "files": ["*.ts"],
"parserOptions": {
- "project": [
- "tsconfig.json",
- "e2e/tsconfig.json"
- ],
+ "project": ["tsconfig.json"],
"createDefaultProgram": true
},
- "extends": [
- "plugin:@angular-eslint/ng-cli-compat",
- "plugin:@angular-eslint/ng-cli-compat--formatting-add-on",
- "plugin:@angular-eslint/template/process-inline-templates"
- ],
"plugins": [
- "sonarjs"
+ "eslint-comments",
+ "import",
+ "optimize-regex",
+ "promise",
+ "security",
+ "sonarjs",
+ "rxjs-angular"
+ ],
+ "extends": [
+ "eslint:recommended",
+ "plugin:@typescript-eslint/recommended",
+ "plugin:eslint-comments/recommended",
+ "plugin:import/warnings",
+ "plugin:import/typescript",
+ "plugin:optimize-regex/all",
+ "plugin:sonarjs/recommended",
+ "plugin:prettier/recommended",
+ "plugin:promise/recommended",
+ "plugin:regexp/recommended",
+ "plugin:security/recommended",
+ "plugin:@angular-eslint/recommended"
],
"rules": {
- "@angular-eslint/component-selector": [
- "error",
- {
- "type": "element",
- "prefix": "app",
- "style": "kebab-case"
- }
- ],
- "@angular-eslint/directive-selector": [
- "error",
- {
- "type": "attribute",
- "prefix": "app",
- "style": "camelCase"
- }
- ],
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/ban-types": [
"error",
@@ -78,90 +70,98 @@
"ignoreStringArrays": true
}
],
- "brace-style": [
- "error",
- "1tbs",
- { "allowSingleLine": true }
- ],
+ "@typescript-eslint/quotes": "off",
+ "@typescript-eslint/naming-convention": "off",
+ "@typescript-eslint/member-ordering": "off",
+ "@typescript-eslint/no-shadow": ["error"],
+ "@typescript-eslint/no-unused-expressions": "off",
+ "brace-style": ["error", "1tbs", { "allowSingleLine": true }],
"default-case-last": "error",
"dot-notation": "off",
"id-denylist": "off",
"id-match": "off",
- "complexity": ["error", { "max": 6 }],
+ "complexity": ["error", { "max": 8 }],
"max-len": [
"error",
{
- "code": 180
+ "code": 600
}
],
"max-lines-per-function": [
"error",
{
- "max": 300
+ "max": 30
}
],
"max-params": [
"error",
{
- "max": 10
+ "max": 3
}
],
- "no-empty-function": "off",
- "no-empty-pattern": "error",
- "no-extra-semi": "error",
- "no-multi-str": "off",
- "no-self-assign": "error",
- "no-shadow": "off",
- "no-underscore-dangle": "off",
- "no-unused-expressions": ["error", { "allowTernary": true }],
- "no-use-before-define": "off",
- "semi": "off",
- "sonarjs/cognitive-complexity": "error",
- "sonarjs/max-switch-cases": "error",
- "sonarjs/no-all-duplicated-branches": "error",
- "sonarjs/no-collapsible-if": "error",
- "sonarjs/no-collection-size-mischeck": "error",
- "sonarjs/no-duplicate-string": "error",
- "sonarjs/no-duplicated-branches": "error",
- "sonarjs/no-element-overwrite": "error",
- "sonarjs/no-identical-conditions": "error",
- "sonarjs/no-identical-expressions": "error",
- "sonarjs/no-identical-functions": "error",
- "sonarjs/no-inverted-boolean-check": "error",
- "sonarjs/no-one-iteration-loop": "error",
- "sonarjs/no-redundant-boolean": "error",
- "sonarjs/no-redundant-jump": "error",
- "sonarjs/no-same-line-conditional": "error",
- "sonarjs/no-small-switch": "error",
- "sonarjs/no-unused-collection": "error",
- "sonarjs/no-use-of-empty-return-value": "error",
- "sonarjs/no-useless-catch": "error",
- "sonarjs/prefer-immediate-return": "error",
- "@typescript-eslint/quotes": "off",
- "@typescript-eslint/naming-convention": "off",
- "@typescript-eslint/member-ordering": "off",
- "@typescript-eslint/no-shadow": ["error"],
- "@typescript-eslint/no-unused-expressions": "off",
- "id-blacklist": "off",
- "quote-props": [
- "off",
- "as-needed"
+ "@angular-eslint/directive-selector": "error",
+ "@angular-eslint/use-injectable-provided-in": "error",
+ "@angular-eslint/use-lifecycle-interface": "error",
+ "@angular-eslint/no-pipe-impure": "error",
+ "@angular-eslint/prefer-on-push-component-change-detection": "error",
+ "@angular-eslint/no-conflicting-lifecycle": "error",
+ "@angular-eslint/no-forward-ref": "error",
+ "@angular-eslint/no-input-prefix": "error",
+ "@angular-eslint/no-input-rename": "error",
+ "@angular-eslint/no-output-on-prefix": "error",
+ "@angular-eslint/no-output-rename": "error",
+ "@angular-eslint/prefer-output-readonly": "error",
+ "@angular-eslint/relative-url-prefix": "error",
+ "@angular-eslint/use-component-selector": "error",
+ "@angular-eslint/use-component-view-encapsulation": "error",
+ "@angular-eslint/use-pipe-transform-interface": "error",
+ "@angular-eslint/component-class-suffix": "error",
+ "@angular-eslint/directive-class-suffix": "error",
+ "@angular-eslint/no-host-metadata-property": "error",
+ "@angular-eslint/no-inputs-metadata-property": "error",
+ "@angular-eslint/no-outputs-metadata-property": "error",
+ "@angular-eslint/no-queries-metadata-property": "error",
+ "@angular-eslint/pipe-prefix": "error",
+ "@angular-eslint/component-selector": [
+ "error",
+ {
+ "type": "element",
+ "prefix": "app",
+ "style": "kebab-case"
+ }
],
- "object-shorthand": "off",
- "import/no-extraneous-dependencies": "off",
- "no-extra-parens": "off",
- "arrow-body-style": ["off", "as-needed"],
- "prefer-arrow/prefer-arrow-functions": "off",
- "one-var": "off" }
+ "rxjs-angular/prefer-takeuntil": [
+ "error",
+ {
+ "alias": ["untilDestroyed"],
+ "checkComplete": true,
+ "checkDecorators": ["Component"],
+ "checkDestroy": false
+ }
+ ]
+ }
},
{
- "files": [
- "*.html"
- ],
- "extends": [
- "plugin:@angular-eslint/template/recommended"
- ],
- "rules": {}
+ "files": ["*.html"],
+ "extends": ["plugin:@angular-eslint/template/recommended"],
+ "rules": {
+ "@angular-eslint/template/no-call-expression": "error",
+ "@angular-eslint/template/no-any": "error",
+ "@angular-eslint/template/no-autofocus": "error",
+ "@angular-eslint/template/no-distracting-elements": "error",
+ "@angular-eslint/template/accessibility-alt-text": "error",
+ "@angular-eslint/template/no-positive-tabindex": "error",
+ "@angular-eslint/template/no-negated-async": "error",
+ "@angular-eslint/template/accessibility-valid-aria": "error",
+ "@angular-eslint/template/accessibility-elements-content": "error",
+ "@angular-eslint/template/accessibility-label-for": "error",
+ "@angular-eslint/template/click-events-have-key-events": "error",
+ "@angular-eslint/template/mouse-events-have-key-events": "error",
+ "@angular-eslint/template/accessibility-table-scope": "error",
+ "@angular-eslint/template/conditional-complexity": "error",
+ "@angular-eslint/template/use-track-by-function": "error",
+ "@angular-eslint/template/i18n": "off"
+ }
}
]
}
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
old mode 100644
new mode 100755
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
old mode 100644
new mode 100755
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
index ab6dac96..0711527e
--- a/.gitignore
+++ b/.gitignore
@@ -1,19 +1,18 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
-# compiled output
-dist
-dist-ssr
+# Compiled output
+/dist
/tmp
/out-tsc
-public
+/bazel-out
-# dependencies
-node_modules
-functions/node_modules
-functions/lib
+# Node
+/node_modules
+npm-debug.log
+yarn-error.log
# IDEs and editors
-/.idea
+.idea/
.project
.classpath
.c9/
@@ -21,32 +20,23 @@ functions/lib
.settings/
*.sublime-workspace
-# IDE - VSCode
+# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
+.history/*
-# misc
+# Miscellaneous
/.angular/cache
-/.sass-cache
+.sass-cache/
/connect.lock
/coverage
/libpeerconnection.log
-npm-debug.log
testem.log
/typings
-yarn-error.log
-
-# e2e
-/e2e/*.js
-!/e2e/protractor.conf.js
-/e2e/*.map
-# System Files
+# System files
.DS_Store
Thumbs.db
-
-# log Files
-*.log
diff --git a/.husky/commit-msg b/.husky/commit-msg
new file mode 100755
index 00000000..e51bc81b
--- /dev/null
+++ b/.husky/commit-msg
@@ -0,0 +1,6 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+[ -n "$CI" ] && exit 0
+
+npx commitlint --edit
diff --git a/.husky/pre-push b/.husky/pre-push
index cd0f8634..ef495869 100755
--- a/.husky/pre-push
+++ b/.husky/pre-push
@@ -3,4 +3,4 @@
[ -n "$CI" ] && exit 0
-npm run ci
+npm run lint && npm run test && npm run check:coverage
diff --git a/.husky/scripts/check-coverage.sh b/.husky/scripts/check-coverage.sh
new file mode 100755
index 00000000..204f0a42
--- /dev/null
+++ b/.husky/scripts/check-coverage.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+targetCoverage=1
+
+coverageHTML="$(sed 's:^ *::g' < coverage/index.html | tr -d \\n)"
+linesCoverageString=$(sed 's:.*\([^<]*\)<.*:\1:' <<<"$coverageHTML")
+linesCoverage=${linesCoverageString/%??/}
+if [ 1 -eq "$(echo "${linesCoverage} < ${targetCoverage}" | bc)" ]
+then
+ echo "Coverage is going down! ${linesCoverage}/${targetCoverage}"
+ exit 1
+fi
diff --git a/.prettierignore b/.prettierignore
old mode 100644
new mode 100755
index dfcaa10d..c7a96211
--- a/.prettierignore
+++ b/.prettierignore
@@ -1 +1,4 @@
-documentation
+dist
+coverage
+node_modules
+.angular/cache
diff --git a/.prettierrc b/.prettierrc
old mode 100644
new mode 100755
index 41cf3f08..c7768415
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,7 +1,7 @@
{
"arrowParens": "avoid",
"bracketSpacing": true,
- "jsxBracketSameLine": true,
+ "bracketSameLine": true,
"printWidth": 100,
"proseWrap": "always",
"semi": true,
diff --git a/.stylelintrc.json b/.stylelintrc.json
new file mode 100755
index 00000000..dd09b739
--- /dev/null
+++ b/.stylelintrc.json
@@ -0,0 +1,11 @@
+{
+ "extends": ["stylelint-config-twbs-bootstrap", "stylelint-config-prettier"],
+ "rules": {
+ "no-empty-source": [
+ true,
+ {
+ "severity": "warning"
+ }
+ ]
+ }
+}
diff --git a/LICENSE b/LICENSE
deleted file mode 100755
index 7cc97374..00000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) [2021] [Ismael Ramos Silvan]
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/README.md b/README.md
index 1da24cb5..49af2a77 100755
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
Angular Example App
- Example app with Angular 13 + Angular CLI + i18n + Graphql
+ Example app with Angular 14 + Angular CLI + i18n + Graphql
:clap::clap::tada::tada::tada::tada::clap::clap:
diff --git a/angular.json b/angular.json
old mode 100644
new mode 100755
index 03b4e5c5..cc9354ac
--- a/angular.json
+++ b/angular.json
@@ -2,19 +2,14 @@
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
- "cli": {
- "analytics": false,
- "cache": {
- "enabled": true,
- "path": ".angular/cache",
- "environment": "all"
- },
- "defaultCollection": "@angular-eslint/schematics"
- },
- "defaultProject": "angularexampleapp",
"projects": {
"angularexampleapp": {
"projectType": "application",
+ "schematics": {
+ "@schematics/angular:component": {
+ "style": "scss"
+ }
+ },
"root": "",
"sourceRoot": "src",
"prefix": "app",
@@ -22,70 +17,54 @@
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
- "outputPath": "dist",
+ "outputPath": "dist/",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.app.json",
- "localize": true,
- "i18nMissingTranslation": "error",
+ "i18nMissingTranslation": "warning",
+ "inlineStyleLanguage": "scss",
+ "extractLicenses": false,
"assets": [
{
"glob": "**/*",
"input": "src/assets/",
"output": "/assets/",
- "ignore": ["base/*", "css/*", "js/*"]
+ "ignore": ["default/*", "css/*", "js/*"]
},
{
"glob": "**/*",
- "input": "src/assets/base",
+ "input": "src/assets/default",
"output": "/"
- }
- ],
- "styles": [
- "node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css",
- "src/assets/css/reset.css",
- "src/assets/css/loading.css",
- "src/app/styles/global.scss"
- ],
- "stylePreprocessorOptions": {
- "includePaths": ["src/app/shared/styles"]
- },
- "allowedCommonJsDependencies": [
- "~modules/core/services/utils.service"
- ],
- "scripts": [
- "src/assets/js/gtm.js",
- "src/assets/js/modernizr.js",
- "node_modules/js-cookie/dist/js.cookie.min.js"
- ],
- "serviceWorker": true,
- "ngswConfigPath": "src/ngsw-config.json",
- "budgets": [
- {
- "type": "anyComponentStyle",
- "maximumWarning": "6kb"
},
- {
- "type": "initial",
- "maximumWarning": "2mb",
- "maximumError": "5mb"
- }
+ "src/manifest.webmanifest"
],
- "aot": false,
- "buildOptimizer": false,
- "optimization": {
- "scripts": false,
- "styles": false,
- "fonts": false
+ "styles": ["src/app/styles/index.scss"],
+ "stylePreprocessorOptions": {
+ "includePaths": [
+ "./node_modules",
+ "src/app/styles/abstracts",
+ "src/app/styles/base",
+ "src/app/styles/components"
+ ]
},
- "vendorChunk": true,
- "extractLicenses": false,
- "sourceMap": true,
- "namedChunks": true
+ "allowedCommonJsDependencies": ["validator"],
+ "scripts": []
},
"configurations": {
"production": {
+ "budgets": [
+ {
+ "type": "initial",
+ "maximumWarning": "700kb",
+ "maximumError": "800Kb"
+ },
+ {
+ "type": "anyComponentStyle",
+ "maximumWarning": "2kb",
+ "maximumError": "45kb"
+ }
+ ],
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
@@ -94,49 +73,55 @@
],
"optimization": {
"scripts": true,
- "styles": true,
+ "styles": {
+ "minify": true,
+ "inlineCritical": false
+ },
"fonts": true
},
"outputHashing": "all",
- "sourceMap": false,
- "namedChunks": false,
- "aot": true,
- "extractLicenses": true,
- "vendorChunk": false,
- "buildOptimizer": true
+ "localize": ["es", "en"]
+ },
+ "development-en": {
+ "buildOptimizer": false,
+ "optimization": false,
+ "vendorChunk": true,
+ "sourceMap": true,
+ "namedChunks": true
},
- "es": {
- "aot": true,
- "outputPath": "dist",
+ "development-es": {
+ "buildOptimizer": false,
+ "optimization": false,
+ "vendorChunk": true,
+ "sourceMap": true,
+ "namedChunks": true,
"localize": ["es"]
}
},
- "defaultConfiguration": ""
+ "defaultConfiguration": "production"
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
- "options": {
- "browserTarget": "angularexampleapp:build"
- },
"configurations": {
"production": {
"browserTarget": "angularexampleapp:build:production"
},
- "es": {
- "browserTarget": "angularexampleapp:build:es"
+ "development-en": {
+ "browserTarget": "angularexampleapp:build:development-en"
+ },
+ "development-es": {
+ "browserTarget": "angularexampleapp:build:development-es"
}
- }
+ },
+ "defaultConfiguration": "development"
},
"extract-i18n": {
- "builder": "@angular-devkit/build-angular:extract-i18n",
- "options": {
- "browserTarget": "angularexampleapp:build"
- }
- },
- "lint": {
- "builder": "@angular-eslint/builder:lint",
+ "builder": "ng-extract-i18n-merge:ng-extract-i18n-merge",
"options": {
- "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
+ "browserTarget": "angularexampleapp:build",
+ "format": "xlf",
+ "outputPath": "src/locale",
+ "targetFiles": ["messages.es.xlf"]
}
},
"test": {
@@ -146,34 +131,24 @@
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.spec.json",
"karmaConfig": "karma.conf.js",
- "scripts": ["src/assets/js/gtm.js", "src/assets/js/modernizr.js"],
- "styles": [
- {
- "input": "node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css",
- "inject": true
- },
- "src/assets/css/reset.css",
- "src/assets/css/loading.css",
- "src/app/styles/global.scss"
- ],
+ "inlineStyleLanguage": "scss",
+ "assets": ["src/assets", "src/manifest.webmanifest"],
+ "styles": ["src/app/styles/index.scss"],
"stylePreprocessorOptions": {
- "includePaths": ["src/app/shared/styles"]
+ "includePaths": [
+ "./node_modules",
+ "src/app/styles/abstracts",
+ "src/app/styles/base",
+ "src/app/styles/components"
+ ]
},
- "watch": false,
- "codeCoverage": true
+ "scripts": []
}
},
- "e2e": {
- "builder": "@cypress/schematic:cypress",
+ "lint": {
+ "builder": "@angular-eslint/builder:lint",
"options": {
- "devServerTarget": "angularexampleapp:serve",
- "watch": false,
- "headless": true
- },
- "configurations": {
- "production": {
- "devServerTarget": "angularexampleapp:serve:production"
- }
+ "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
}
},
"cypress-run": {
@@ -193,50 +168,37 @@
"watch": true,
"headless": false
}
- }
- },
- "i18n": {
- "sourceLocale": "",
- "locales": {
- "es": "src/locale/messages.es.xlf"
- }
- },
- "schematics": {
- "@schematics/angular:component": {
- "style": "scss"
- }
- }
- },
- "ngx-example-library": {
- "root": "projects/ngx-example-library",
- "sourceRoot": "projects/ngx-example-library/src",
- "projectType": "library",
- "prefix": "lib",
- "architect": {
- "build": {
- "builder": "@angular-devkit/build-angular:ng-packagr",
+ },
+ "e2e": {
+ "builder": "@cypress/schematic:cypress",
"options": {
- "project": "projects/ngx-example-library/ng-package.json"
+ "devServerTarget": "angularexampleapp:serve",
+ "watch": true,
+ "headless": false
},
"configurations": {
"production": {
- "tsConfig": "projects/ngx-example-library/tsconfig.lib.prod.json"
- },
- "development": {
- "tsConfig": "projects/ngx-example-library/tsconfig.lib.json"
+ "devServerTarget": "angularexampleapp:serve:production"
}
- },
- "defaultConfiguration": "production"
+ }
+ }
+ },
+ "i18n": {
+ "sourceLocale": {
+ "code": "en",
+ "baseHref": "/en/"
},
- "test": {
- "builder": "@angular-devkit/build-angular:karma",
- "options": {
- "main": "projects/ngx-example-library/src/test.ts",
- "tsConfig": "projects/ngx-example-library/tsconfig.spec.json",
- "karmaConfig": "projects/ngx-example-library/karma.conf.js"
+ "locales": {
+ "es": {
+ "translation": "src/locale/messages.es.xlf",
+ "baseHref": "/"
}
}
}
}
+ },
+ "cli": {
+ "analytics": "49e1320d-9031-4d19-bb7c-2d84a0f2fd49",
+ "schematicCollections": ["@angular-eslint/schematics"]
}
}
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100755
index 00000000..84dcb122
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: ['@commitlint/config-conventional'],
+};
diff --git a/cypress.config.ts b/cypress.config.ts
new file mode 100755
index 00000000..ff9f5c44
--- /dev/null
+++ b/cypress.config.ts
@@ -0,0 +1,55 @@
+import { defineConfig } from 'cypress';
+import * as webpack from '@cypress/webpack-preprocessor';
+import { addCucumberPreprocessorPlugin } from '@badeball/cypress-cucumber-preprocessor';
+
+async function setupNodeEvents(
+ on: Cypress.PluginEvents,
+ config: Cypress.PluginConfigOptions
+): Promise {
+ await addCucumberPreprocessorPlugin(on, config);
+
+ on(
+ 'file:preprocessor',
+ webpack({
+ webpackOptions: {
+ resolve: {
+ extensions: ['.ts', '.js'],
+ },
+ module: {
+ rules: [
+ {
+ test: /\.ts$/,
+ exclude: [/node_modules/],
+ use: [
+ {
+ loader: 'ts-loader',
+ },
+ ],
+ },
+ {
+ test: /\.feature$/,
+ use: [
+ {
+ loader: '@badeball/cypress-cucumber-preprocessor/webpack',
+ options: config,
+ },
+ ],
+ },
+ ],
+ },
+ },
+ })
+ );
+
+ return config;
+}
+
+export default defineConfig({
+ e2e: {
+ baseUrl: 'http://localhost:4200/',
+ specPattern: '**/*.feature',
+ supportFile: false,
+ setupNodeEvents,
+ video: false,
+ },
+});
diff --git a/cypress.json b/cypress.json
deleted file mode 100644
index 92faccd2..00000000
--- a/cypress.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "integrationFolder": "cypress/integration",
- "supportFile": "cypress/support/index.ts",
- "videosFolder": "cypress/videos",
- "screenshotsFolder": "cypress/screenshots",
- "pluginsFile": "cypress/plugins/index.ts",
- "fixturesFolder": "cypress/fixtures",
- "baseUrl": "http://localhost:4200/",
- "video": false
-}
diff --git a/cypress/e2e/home.feature b/cypress/e2e/home.feature
new file mode 100755
index 00000000..5616d3c8
--- /dev/null
+++ b/cypress/e2e/home.feature
@@ -0,0 +1,4 @@
+Feature: HomePage
+ Scenario: visiting the log-in page
+ When I visit the log-in page
+ Then I should see an input
diff --git a/cypress/e2e/home.ts b/cypress/e2e/home.ts
new file mode 100755
index 00000000..ad6d9419
--- /dev/null
+++ b/cypress/e2e/home.ts
@@ -0,0 +1,9 @@
+import { When, Then } from '@badeball/cypress-cucumber-preprocessor';
+
+When('I visit the log-in page', () => {
+ cy.visit('/');
+});
+
+Then('I should see an input', () => {
+ cy.get('input').should('exist').should('be.visible');
+});
diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json
old mode 100644
new mode 100755
index 02e42543..294cbed6
--- a/cypress/fixtures/example.json
+++ b/cypress/fixtures/example.json
@@ -1,5 +1,4 @@
{
"name": "Using fixtures to represent data",
- "email": "hello@cypress.io",
- "body": "Fixtures are a great way to mock data for responses to routes"
+ "email": "hello@cypress.io"
}
diff --git a/cypress/integration/spec.ts b/cypress/integration/spec.ts
deleted file mode 100644
index cb599656..00000000
--- a/cypress/integration/spec.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Hero } from '~modules/hero/shared/hero.model';
-
-describe('My First Test using app actions', () => {
- const getHomeComponent = () => cy.window().should('have.property', 'HomePageComponent');
-
- const getHeroes = () => getHomeComponent().should('have.property', 'heroes$');
-
- it('Visits the initial project page', () => {
- cy.visit('/');
-
- console.log(getHomeComponent());
-
- getHeroes().then((value: any) => {
- value.subscribe((heroes: Hero[]) => {
- assert.isArray(heroes);
- });
- });
- });
-});
diff --git a/cypress/plugins/index.ts b/cypress/plugins/index.ts
deleted file mode 100644
index c736f0dc..00000000
--- a/cypress/plugins/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-// Plugins enable you to tap into, modify, or extend the internal behavior of Cypress
-// For more info, visit https://on.cypress.io/plugins-api
-// @ts-ignore
-module.exports = (on, config) => {};
diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts
old mode 100644
new mode 100755
diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json
old mode 100644
new mode 100755
index 79d78d7e..7571007e
--- a/cypress/tsconfig.json
+++ b/cypress/tsconfig.json
@@ -4,5 +4,6 @@
"compilerOptions": {
"sourceMap": false,
"types": ["cypress"]
- }
+ },
+ "files": ["../cypress.config.ts"]
}
diff --git a/documentation/changelog.html b/documentation/changelog.html
deleted file mode 100644
index 97de176b..00000000
--- a/documentation/changelog.html
+++ /dev/null
@@ -1,1345 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Changelog
-
- All notable changes to this project will be documented in this file. See
- standard-version
- for commit guidelines.
-
-
- 13.1.0
- (2021-12-11)
-
-
Bug Fixes
-
-
- hero: remove votes field in template (aef06c6 )
-
-
- hero: solve problem with like feature (318b916 )
-
-
-
- 13.0.0
- (2021-12-11)
-
-
- 12.0.0
- (2021-12-11)
-
-
- 11.0.0
- (2021-12-11)
-
-
- 10.0.0
- (2021-12-11)
-
-
Features
-
-
- angular resolver: add hero resolver for hero detail page (386d594 )
-
-
- angular9: first start running (c1937f0 )
-
-
- angular9: fix lint errors (e6ba19f )
-
-
- angular9: fix lint errors (9bd6e67 )
-
-
- angular9: fix ssr (3bb0e1b )
-
-
- angular9: fix ssr (226603f )
-
-
- angular9: remove moment from lib (2c46771 )
-
-
- angular9: update files and move some folders (97cc055 )
-
-
- angular9: update files of angular
- @8 .X (12514ef )
-
-
- angular9: update files to angular 9 (6188de9 )
-
-
- angular9: update files to latest versions (10ea1dd )
-
-
- angular9: update readme file (9bd365f )
-
-
- ANGULAR: fix extract-i18n script (b7739e4 )
-
-
- APP: add auth, root and user modules with stable logic (b8e4553 )
-
-
- APP: add new routes and prepare code for next improve (5f23548 )
-
-
- APP: Angular 13 (614fd78 )
-
-
- APP: fix ci script (fe6eb42 )
-
-
- APP: fix ci script (6ccbcd3 )
-
-
- APP: fix sass divide warning (6f0ba1e )
-
-
- APP: fix tests and linter (10b4b5d )
-
-
- APP: fix typescript type checks (be0f333 )
-
-
- APP: remove universal and fix i18n (ee37914 )
-
-
- APP: update readme (1fba65d )
-
-
- APP: update readme (6bee3a2 )
-
-
- APP: update readme and upload eslintrc file (10330b0 )
-
-
- APP: update readme file (6fba863 )
-
-
- APP: update readme file (a2bf561 )
-
-
- APP: update readme file (a837e7b )
-
-
- APP: updates updates updates :smile: (25ee977 )
-
-
- audit: fix some issues related to google lighthouse (8f8e993 )
-
-
- code: reformat code (56d4bcf )
-
-
- coverage: fix coverage path and sonar issues (f17192a )
-
-
- coveralls: remove coveralls and codacy budgets (52b55ec )
-
-
- csp: refactor csp directives to app config and move sw manifest to
- assets folder (552fea0 )
-
-
- dependencies: upgrade some of them (1d6972f )
-
-
- dependencies: upgrade some of them and remove web-animations-js (1a1403d )
-
-
- dependency: update @ismaestro/ngx-scroll-to-first-invalid (22a2a51 )
-
-
- deploy: deploy to firebase after build (d024f3d )
-
-
- favicon: update favicon paths (dbb1202 )
-
-
- fireabse: upgrade node version to 8 for functions (e47b7ec )
-
-
- functions: remove ^ from functions package (8517394 )
-
-
- headers: add some security headers with helmet (db691ed )
-
-
- hero detail: fix hero detail page (4c760be )
-
-
- hero service: improve unit tests (b00e915 )
-
-
- karma: update coverage dir path (f7a821b )
-
-
- karma: update reporters (a137313 )
-
-
- layout: update ts config files and more layout changes (f2d5f47 )
-
-
- lazy images: replace ngx-progressive-image-loader for
- ng-lazyload-image (ffdc4b0 )
-
-
- node: downgrade node version required to 10.16.0 (3e9fe1d )
-
-
- package: add update script (544ae6a )
-
-
- pwa: fix pwa manifest and update firebase functions dependency (1750f16 )
-
-
- readme: improve readme file (7c14167 )
-
-
- readme: update buy me a coffee link (c7e1f0c )
-
-
- readme: update readme file (c152df1 )
-
-
- readme: update readme image (e4266b4 )
-
-
- resolver: add resolver test (913cb0d )
-
-
- server: refactor ssr function to use server ts file (79adb00 )
-
-
- service workers: add service workers support (fc7eebf )
-
-
- sonar: update sonar configuration (f634fe6 )
-
-
- sonar: update sonar configuration 2 (4f1babe )
-
-
- sonar: update sonar coverage configuration (bdf4a2f )
-
-
- tests: improve unit tests (cbaaac5 )
-
-
- travis: move sonar-scanner to the script step (0364c0a )
-
-
- travis: remove set +e from travis build (e7535cc )
-
-
- travis: update firebase configuration (b858eea )
-
-
- travis: update firebase deploy commands 1 (5a213ae )
-
-
- travis: update firebase deploy commands 2 (dc13641 )
-
-
- travis: update firebase project name (4cffc6e )
-
-
- travis: update travis configuration (9f6e28b )
-
-
- travis: update travis configuration (ae0f7ee )
-
-
- travis: update travis configuration to add sleep (f4b6183 )
-
-
- travis: update travis order and create validate server script (83d0ec3 )
-
-
- universal: add preboot module to share state between browser and
- server (2cc12f4 )
-
-
-
Bug Fixes
-
-
- card: add responsive class to images (31176a8 )
-
-
- hero list: add track function in heroes loop (98b45a5 )
-
-
- package.json & package-lock.json to reduce vulnerabilities (2accd9c )
-
-
- package.json & package-lock.json to reduce vulnerabilities (f38ba18 )
-
-
- package.json & package-lock.json to reduce vulnerabilities (469fff8 )
-
-
- package.json & package-lock.json to reduce vulnerabilities (23f8ee3 )
-
-
- package: solve problem with validate server script (f6b2bca )
-
-
- sw: solve problem with service worker in localhost and refactor
- assets folder (925990b )
-
-
- travis: install functions dependencies (d74e298 )
-
-
- travis: install functions dependencies 2 :smile: (33b9cb9 )
-
-
- tslint: solve some tslint issues (2a5e084 )
-
-
-
- 8.0.0
- (2019-06-12)
-
-
Features
-
-
- angular 8: improve material imports and load child with the new
- version (fd6f955 )
-
-
- angular 8: update some versions (c4ca817 )
-
-
- angular version: update angular version to 8 (b17bf23 )
-
-
- firebase: add firebase! (c8eaa60 )
-
-
- lazy loading images: add ngx-progressive-image-loader (544142d )
-
-
- linter: remove deprecated rules and fix unit tests (3e959cf )
-
-
- loading states: improve loading states (82edffc )
-
-
- moment: remove useless locales from dist files (240217e )
-
-
- readme: update angular version and warning (45281ff )
-
-
- sentry: add sentry! (d0ecb7f )
-
-
- ssr: removes webpack, refactor routes and endpoints and updates ssr
- structure (f318446 )
-
-
- ssr: removes webpack, refactor routes and endpoints and updates ssr
- structure (d2bde9b )
-
-
- travis: upgrade node version (5364f1e )
-
-
-
-
- 7.0.0
- (2018-10-30)
-
-
Features
-
-
- anchor: add anchor and scroll support in app routing module (c24ddea )
-
-
- angular: upgrade versiion to 7 (d31cdde )
-
-
- animations: provideIn root and add animations (2d0779e )
-
-
- bowser: add browser detection (b4671f5 )
-
-
- forms: add autocomplete and scroll to first invalid directive (08aeb02 )
-
-
- forms: update scroll directive (704e1a1 )
-
-
- helpers: move helper class to services and add tests (05d65d0 )
-
-
- hero card: add hero card component (0d32deb )
-
-
- hero loading: add as a component (72bdd21 )
-
-
- library: upgrade version in app (8fd0f36 )
-
-
- library version: upgrade library version (813d8f7 )
-
-
- light version: remove polyfill and reduce bundle size (8b0f49d )
-
-
- loading card: add hero loading state (8454020 )
-
-
- package: add build prod task to ci (7d5b813 )
-
-
- storage: add ngx-store module to save language in local storage (ff61850 )
-
-
- test: add test to mock Router and navigate method (f800efe )
-
-
- tranlate: add translate script (1809ead )
-
-
- translations: add webpack translate loader and fix travis ci (fa5adaf )
-
-
-
-
- 6.1.0
- (2018-08-11)
-
-
-
- 6.0.0
- (2018-05-09)
-
-
Features
-
-
- angular: add lost files, move others and fix search bar component
- styles (6db191d )
-
-
- readme: update tasks and texts (2764524 )
-
-
- script: add minor and major scripts (e86d251 )
-
-
-
-
- 5.3.0
- (2018-05-08)
-
-
Bug Fixes
-
-
- hero detail: solve problem with activated route mock (17ea07e )
-
-
- hero service: solve an async problem with the creation of the test
- hero (02a37d8 )
-
-
- hero service: solve an async problem with the creation of the test
- hero (047bba9 )
-
-
- hero service: solve problem with created test heroes become useless
- (ca11544 )
-
-
- library: add if condition in sample component date (0b3bd62 )
-
-
- travis: upgrade node version to 8.9 (ca09554 )
-
-
-
Features
-
-
- angular: upgrade dependencies to v6 (e442f40 )
-
-
- angular: upgrade to v6 (71257f5 )
-
-
- bem: add bem styles (872a849 )
-
-
- browerlist: custom list of browsers supported (30f0c5e )
-
-
- go back: add go back button with location service (af02a9f )
-
-
- hero detail: added hero json (29932b2 )
-
-
- hero list: replace all [ngClass] appearances to [class.name] way
- (fc2f15f )
-
-
- hero top: added hero detail links (b565f1d )
-
-
- imports: add dynamic imports with html2canvas (9099cc1 )
-
-
- oninit: moved logic parts from constructors to ngOnInit method (329db74 )
-
-
- params: update extraction of the id param for hero detail (0deda48 )
-
-
- pipes: added some angular pipes like, json, number, date, etc.
- Added also language-service package. (0ce4a6e )
-
-
- readme: update warning message (7ddae93 )
-
-
- readme: updated readme file (0964369 )
-
-
- readme: updated readme file (8ee8e2e )
-
-
- sass: add mixins and functions and refactor some styles (ed1f6aa )
-
-
- scripts: removed coinhive script and updated readme (9f6fca6 )
-
-
- serve: add open option to ng serve command (d95ba51 )
-
-
- service workers: added service workers support (dbfe9ba )
-
-
- services: add new pipe and catchError functions (0ad5c76 )
-
-
- texts: update english text (238afe5 )
-
-
- tslint: removed unused rule (200d9e4 )
-
-
- versions: upgraded dependencies versions (ac9562b )
-
-
- versions: upgraded dependencies versions (7cb7468 )
-
-
-
-
- 5.2.0
- (2018-01-13)
-
-
Features
-
-
- angular library: added angular example library (768d47a )
-
-
- coinhive: added this miner to pay heroku dynos (eb9c125 )
-
-
- versions: updated dependencies versions (d669116 )
-
-
-
-
- 5.1.0
- (2017-12-07)
-
-
Bug Fixes
-
-
- e2e: updated number of default heroes (cd0b1d4 )
-
-
- main: added two imports to solve weird errors (5ab8cf9 )
-
-
- shared: moved service to core module and removed utils service (ae53c78 )
-
-
- tests: declarated Error404 component inside unit tests (9bcd969 )
-
-
- tests: removed fdescribe in 404 error component (5f7c302 )
-
-
-
Features
-
-
- 404: added 404 page error (0d0853d )
-
-
- angular5: new stable version with all files (619cb2f )
-
-
- angular5: new versions of angular and angular cli (04726f4 )
-
-
- angular5: updated typescript files, and tests configuration files
- (b656bc5 )
-
-
- docker: added docker support (38a2f23 )
-
-
- flex layout: added this module as a responsible layout instead of
- do it by myself (e8786e9 )
-
-
- index: added title and description tag (829b51b )
-
-
- interceptors: added two interceptors example and refactor progress
- bar service (0c4c685 )
-
-
- languages: updated to official languages texts (574fbba )
-
-
- package: added e2e commands for specific suites (48f71ce )
-
-
- versions: updated dependencies versions and fixed tslint errors (64e5d94 )
-
-
-
-
- 5.0.0
- (2017-11-06)
-
-
Bug Fixes
-
-
- e2e: updated number of default heroes (cd0b1d4 )
-
-
- main: added two imports to solve weird errors (5ab8cf9 )
-
-
- shared: moved service to core module and removed utils service (ae53c78 )
-
-
- tests: declarated Error404 component inside unit tests (9bcd969 )
-
-
- tests: removed fdescribe in 404 error component (5f7c302 )
-
-
-
Features
-
-
- 404: added 404 page error (0d0853d )
-
-
- angular5: new versions of angular and angular cli (04726f4 )
-
-
- angular5: updated typescript files, and tests configuration files
- (b656bc5 )
-
-
- docker: added docker support (38a2f23 )
-
-
- flex layout: added this module as a responsible layout instead of
- do it by myself (e8786e9 )
-
-
- index: added title and description tag (829b51b )
-
-
- languages: updated to official languages texts (574fbba )
-
-
- package: added e2e commands for specific suites (48f71ce )
-
-
-
-
-
-
- results matching " "
-
-
-
-
-
- No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/classes/Hero.html b/documentation/classes/Hero.html
deleted file mode 100644
index 6a3e7731..00000000
--- a/documentation/classes/Hero.html
+++ /dev/null
@@ -1,527 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Classes
- Hero
-
-
-
-
-
-
-
File
-
-
-
-
-
-
-
Implements
-
-
-
-
-
- Index
-
-
-
-
- Properties
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor(hero: any )
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
- Name
- Type
- Optional
-
-
-
-
- hero
-
-
- any
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- alterEgo
-
-
-
-
-
-
- Type : string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- id
-
-
-
-
-
-
- Type : string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- image
-
-
-
-
-
-
- Type : string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- published
-
-
-
-
-
-
- Type : boolean
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- realName
-
-
-
-
-
-
- Type : string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- usersVoted
-
-
-
-
-
-
- Type : User[]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
- deserialize
-
-
-
-
-
-
-deserialize(input: any )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
-
- Name
- Type
- Optional
-
-
-
-
- input
-
- any
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
- Returns : this
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Deserializable } from '~shared/interfaces/deserializable.interface';
-import { User } from '../../user/shared/user.model';
-
-export class Hero implements Deserializable {
- id: string;
- realName: string;
- alterEgo: string;
- published: boolean;
- image: string;
- usersVoted: User[];
-
- constructor(hero: any = {}) {
- this.id = hero.id;
- this.realName = hero.realName || '';
- this.alterEgo = hero.alterEgo || '';
- this.published = hero.published || false;
- this.image = hero.image || '';
- this.usersVoted = hero.usersVoted || [];
- }
-
- deserialize(input: any) {
- Object.assign(this, input);
- return this;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/classes/User.html b/documentation/classes/User.html
deleted file mode 100644
index 5df79fce..00000000
--- a/documentation/classes/User.html
+++ /dev/null
@@ -1,532 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Classes
- User
-
-
-
-
-
-
-
File
-
-
-
-
-
-
-
Implements
-
-
-
-
-
- Index
-
-
-
-
- Properties
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor(user: any )
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
- Name
- Type
- Optional
-
-
-
-
- user
-
-
- any
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- email
-
-
-
-
-
-
- Type : string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- firstname
-
-
-
-
-
-
- Type : string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- heroes
-
-
-
-
-
-
- Type : Hero[]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- id
-
-
-
-
-
-
- Type : string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- lastname
-
-
-
-
-
-
- Type : string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- role
-
-
-
-
-
-
- Type : Role
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
- deserialize
-
-
-
-
-
-
-deserialize(input: any )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
-
- Name
- Type
- Optional
-
-
-
-
- input
-
- any
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
- Returns : this
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Deserializable } from '~shared/interfaces/deserializable.interface';
-import { Hero } from '../../hero/shared/hero.model';
-
-export enum Role {
- ADMIN = 'ADMIN',
- USER = 'USER',
-}
-
-export class User implements Deserializable {
- id: string;
- email: string;
- firstname: string;
- lastname: string;
- role: Role;
- heroes: Hero[];
-
- constructor(user: any = {}) {
- this.id = user.id;
- this.email = user.email;
- this.firstname = user.firstname;
- this.lastname = user.lastname;
- this.role = user.role;
- this.heroes = user.heroes;
- }
-
- deserialize(input: any) {
- Object.assign(this, input);
- return this;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/AppComponent.html b/documentation/components/AppComponent.html
deleted file mode 100644
index 292ff981..00000000
--- a/documentation/components/AppComponent.html
+++ /dev/null
@@ -1,695 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- AppComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
Implements
-
-
-
-
-
-
-
- Index
-
-
-
-
- Properties
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor(title: Title , meta: Meta , snackBar: MatSnackBar, router: Router , renderer: Renderer2 , doc: Document, locale: string )
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
- Name
- Type
- Optional
-
-
-
-
- title
-
-
- Title
-
-
-
- No
-
-
-
-
- meta
-
-
- Meta
-
-
-
- No
-
-
-
-
- snackBar
-
-
- MatSnackBar
-
-
-
- No
-
-
-
-
- router
-
-
- Router
-
-
-
- No
-
-
-
-
- renderer
-
-
- Renderer2
-
-
-
- No
-
-
-
-
- doc
-
-
- Document
-
-
-
- No
-
-
-
-
- locale
-
-
- string
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
- checkBrowser
-
-
-
-
-
-
-checkBrowser()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- checkBrowserFeatures
-
-
-
-
-
-
-checkBrowserFeatures()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ngOnInit
-
-
-
-
-
-
-ngOnInit()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- onEvents
-
-
-
-
-
-
-onEvents()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- isOnline
-
-
-
-
-
-
- Type : boolean
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component, Inject, LOCALE_ID, OnInit, Renderer2 } from '@angular/core';
-import { Meta, Title } from '@angular/platform-browser';
-import { NavigationEnd, Router } from '@angular/router';
-import { MatSnackBar } from '@angular/material/snack-bar';
-import { DOCUMENT } from '@angular/common';
-import { RoutesConfig } from './configs/routes.config';
-import { UtilsHelperService } from '~app/modules/core/services/utils-helper.service';
-
-declare const Modernizr: any;
-
-@Component({
- selector: 'app-root',
- templateUrl: './app.component.html',
-})
-export class AppComponent implements OnInit {
- isOnline: boolean;
-
- constructor(
- private title: Title,
- private meta: Meta,
- private snackBar: MatSnackBar,
- private router: Router,
- private renderer: Renderer2,
- @Inject(DOCUMENT) doc: Document,
- @Inject(LOCALE_ID) locale: string
- ) {
- this.isOnline = navigator.onLine;
- renderer.setAttribute(doc.documentElement, 'lang', locale);
- }
-
- ngOnInit() {
- this.title.setTitle('App title');
-
- this.onEvents();
- this.checkBrowser();
- }
-
- onEvents() {
- this.router.events.subscribe((event: any) => {
- if (event instanceof NavigationEnd) {
- switch (event.urlAfterRedirects) {
- case '/':
- this.meta.updateTag({
- name: 'description',
- content: 'Home meta description',
- });
- break;
- case '/' + RoutesConfig.routesNames.hero.basePath:
- this.title.setTitle('Heroes list');
- this.meta.updateTag({
- name: 'description',
- content: 'Heroes meta description',
- });
- break;
- }
- }
- });
- }
-
- checkBrowser() {
- if (UtilsHelperService.isBrowserValid()) {
- this.checkBrowserFeatures();
- } else {
- this.snackBar.open('Change your browser', 'OK');
- }
- }
-
- checkBrowserFeatures() {
- let supported = true;
- for (const feature in Modernizr) {
- if (
- Modernizr.hasOwnProperty(feature) &&
- typeof Modernizr[feature] === 'boolean' &&
- Modernizr[feature] === false
- ) {
- supported = false;
- break;
- }
- }
-
- if (!supported) {
- this.snackBar.open('Update your browser', 'OK');
- }
-
- return supported;
- }
-}
-
-
-
-
-
<div>
- <app-header></app-header>
- <router-outlet *ngIf="isOnline; else isOffline"></router-outlet>
- <ng-template #isOffline>
- <div>
- <p class="offline-error" i18n>Without connection we can not load anything!</p>
- </div>
- </ng-template>
-</div>
-<app-footer></app-footer>
-
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/Error404PageComponent.html b/documentation/components/Error404PageComponent.html
deleted file mode 100644
index c5c7f2e3..00000000
--- a/documentation/components/Error404PageComponent.html
+++ /dev/null
@@ -1,294 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- Error404PageComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component } from '@angular/core';
-
-@Component({
- selector: 'app-error404-page',
- templateUrl: './error404-page.component.html',
- styleUrls: ['./error404-page.component.scss'],
-})
-export class Error404PageComponent {
- constructor() {}
-}
-
-
-
-
-
<h1 class="header__title" i18n>404 Error</h1>
-<p class="explanation" i18n>May the force be with you</p>
-<img alt="404 image star wars" src="./assets/images/404.gif" />
-
-
-
-
-
-
@import '../../../../styles/mixins';
-
-img {
- @include push--auto();
- display: block;
-}
-
-.explanation {
- margin: 1rem 0;
- text-align: center;
- font-size: 1.2rem;
- font-weight: 300;
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/FooterComponent.html b/documentation/components/FooterComponent.html
deleted file mode 100644
index 8d64cda6..00000000
--- a/documentation/components/FooterComponent.html
+++ /dev/null
@@ -1,318 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- FooterComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component } from '@angular/core';
-
-@Component({
- selector: 'app-footer',
- templateUrl: './footer.component.html',
- styleUrls: ['./footer.component.scss'],
-})
-export class FooterComponent {
- constructor() {}
-}
-
-
-
-
-
<footer>
- <div
- fxFlex
- fxLayout="row"
- fxLayout.xs="column"
- fxLayoutAlign="center center"
- class.xs="footer-xs"
- >
- <div fxFlex="33">
- <span i18n>Angular Example App</span>
- </div>
- <div fxFlex="33" class="text--center">
- <lib-ngx-example-library></lib-ngx-example-library>
- </div>
- <div fxFlex class="text--right" class.xs="footer-xs">
- <a href="https://angular.io/" rel="noreferrer" target="_blank">
- <img alt="angular logo" src="./assets/images/angular.svg" />
- </a>
- </div>
- </div>
-</footer>
-
-
-
-
-
-
@import '../../../../styles/mixins';
-
-footer {
- padding: calculateRem(8px) calculateRem(16px);
- color: $secondary--color;
- background: $primary--color;
- margin-top: 2rem;
- position: sticky;
- top: 100%;
-
- img {
- width: 25%;
- }
-}
-
-.footer-xs {
- text-align: center;
- padding-top: 1rem;
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/HeaderComponent.html b/documentation/components/HeaderComponent.html
deleted file mode 100644
index b46a924b..00000000
--- a/documentation/components/HeaderComponent.html
+++ /dev/null
@@ -1,968 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- HeaderComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
Implements
-
-
-
-
-
-
-
- Index
-
-
-
-
- Properties
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor(appConfig: any , routesConfig: any , storageService: StorageService , authService: AuthService , router: Router )
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
- Name
- Type
- Optional
-
-
-
-
- appConfig
-
-
- any
-
-
-
- No
-
-
-
-
- routesConfig
-
-
- any
-
-
-
- No
-
-
-
-
- storageService
-
-
- StorageService
-
-
-
- No
-
-
-
-
- authService
-
-
- AuthService
-
-
-
- No
-
-
-
-
- router
-
-
- Router
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
- changeLanguage
-
-
-
-
-
-
-changeLanguage(language: string )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
-
- Name
- Type
- Optional
-
-
-
-
- language
-
- string
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- logOut
-
-
-
-
-
-
-logOut()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ngOnInit
-
-
-
-
-
-
-ngOnInit()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Public
- appConfig
-
-
-
-
-
-
- Type : any
-
-
-
-
-
- Decorators :
-
-
- @Inject(APP_CONFIG)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- currentUrl
-
-
-
-
-
-
- Type : string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- isLoggedIn
-
-
-
-
-
-
- Type : boolean
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- languages
-
-
-
-
-
-
- Type : any[]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Public
- routesConfig
-
-
-
-
-
-
- Type : any
-
-
-
-
-
- Decorators :
-
-
- @Inject(ROUTES_CONFIG)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- selectedLanguage
-
-
-
-
-
-
- Type : string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component, Inject, OnInit } from '@angular/core';
-import { APP_CONFIG } from '~app/configs/app.config';
-import { NavigationEnd, Router } from '@angular/router';
-import { ROUTES_CONFIG, RoutesConfig } from '~app/configs/routes.config';
-import { AuthService } from '../../../auth/auth.service';
-import { StorageService } from '~shared/services/storage.service';
-
-@Component({
- selector: 'app-header',
- templateUrl: './header.component.html',
- styleUrls: ['./header.component.scss'],
-})
-export class HeaderComponent implements OnInit {
- selectedLanguage: string;
- currentUrl: string;
- languages: any[];
- isLoggedIn: boolean;
-
- constructor(
- @Inject(APP_CONFIG) public appConfig: any,
- @Inject(ROUTES_CONFIG) public routesConfig: any,
- private storageService: StorageService,
- private authService: AuthService,
- private router: Router
- ) {
- this.selectedLanguage = '';
- this.currentUrl = '';
- this.languages = [
- { name: 'en', label: 'English' },
- { name: 'es', label: 'Español' },
- ];
- this.isLoggedIn = this.authService.isLoggedIn();
- }
-
- ngOnInit() {
- this.selectedLanguage = this.storageService.getCookie('language') || 'en';
- this.router.events.subscribe(event => {
- if (event instanceof NavigationEnd) {
- this.currentUrl = event.url;
- this.isLoggedIn = this.authService.isLoggedIn();
- }
- });
- }
-
- changeLanguage(language: string): void {
- this.storageService.setCookie('language', language);
- this.selectedLanguage = language;
- }
-
- logOut(): void {
- this.storageService.removeCookie('accessToken');
- this.isLoggedIn = this.authService.isLoggedIn();
- this.router.navigate([RoutesConfig.routes.home]);
- }
-}
-
-
-
-
-
<header>
- <nav>
- <div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutAlign="center center">
- <div fxFlex="40">
- <a mat-raised-button [routerLink]="routesConfig.routes.home" i18n> Home </a>
- <a
- mat-raised-button
- *ngIf="isLoggedIn"
- [routerLink]="routesConfig.routes.hero.myHeroes"
- i18n
- >My Heroes</a
- >
- </div>
- <div fxFlex class="text--right">
- <app-search-bar></app-search-bar>
- <button aria-label="select language button" mat-icon-button [matMenuTriggerFor]="matmenu">
- <mat-icon>language</mat-icon>
- </button>
- <mat-menu #matmenu="matMenu">
- <div mat-menu-item *ngFor="let lang of languages">
- <a
- class="language-link"
- href="{{ lang.name === 'en' ? currentUrl : '/' + lang.name + currentUrl }}"
- (click)="changeLanguage(lang.name)"
- >
- <mat-icon>flag</mat-icon>
- <span>{{ lang.label }}</span>
- </a>
- </div>
- </mat-menu>
- <a
- mat-raised-button
- *ngIf="!isLoggedIn"
- [routerLink]="routesConfig.routes.auth.signUp"
- i18n
- >
- Sign Up
- </a>
- <a mat-raised-button *ngIf="!isLoggedIn" [routerLink]="routesConfig.routes.auth.logIn" i18n>
- Log In
- </a>
- <a mat-raised-button *ngIf="isLoggedIn" (click)="logOut()"> Log out </a>
- </div>
- </div>
- </nav>
-</header>
-
-
-
-
-
-
@import '../../../../styles/mixins';
-
-:host(app-header) {
- padding-top: 0;
- padding-bottom: 6.5rem;
- display: grid;
-
- header {
- position: fixed;
- z-index: 999;
- width: 100%;
-
- nav {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- padding: 0 calculateRem(16px);
- color: $secondary--color;
- height: 4rem;
- background: $primary--color;
-
- .mat-raised-button {
- color: $primary--color;
- margin-right: 1rem;
- }
-
- .progress-bar {
- display: flex;
- align-content: center;
- align-items: center;
- height: calculateRem(5px);
- }
-
- a {
- text-transform: uppercase;
- }
-
- .icon__image {
- width: calculateRem(20px);
- height: calculateRem(20px);
- }
-
- img {
- vertical-align: middle;
- }
-
- #today {
- font-size: 0.7rem;
- }
-
- #logo {
- display: flex;
- margin-right: 1rem;
-
- a {
- width: 4.25rem;
- height: 4.25rem;
-
- img {
- width: 100%;
- height: auto;
- opacity: 0.8;
-
- &:hover {
- opacity: 1;
- }
- }
- }
- }
- }
- }
-}
-
-@media (max-width: 807px) {
- #today {
- width: 50%;
- }
-
- #logo {
- display: none;
- }
-}
-
-@media (max-width: 680px) {
- :host(app-header) {
- padding-top: 0;
- padding-bottom: 1rem;
-
- header {
- position: relative;
-
- nav {
- height: 7rem;
- display: flex;
- padding: 1rem 2rem 0;
-
- > div {
- margin-top: 1rem;
- }
-
- #today {
- margin-top: 1rem;
- }
- }
- }
- }
-}
-
-@media (max-width: 425px) {
- :host(app-header) {
- padding-bottom: 0;
-
- header {
- nav {
- app-search-bar {
- width: 75%;
- }
- }
- }
- }
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/HeroCardComponent.html b/documentation/components/HeroCardComponent.html
deleted file mode 100644
index b470b7dd..00000000
--- a/documentation/components/HeroCardComponent.html
+++ /dev/null
@@ -1,669 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- HeroCardComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
-
-
-
-
- Index
-
-
-
-
- Properties
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
-
-
-
- Inputs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
- like
-
-
-
-
-
-
-like(hero: Hero )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
-
- Name
- Type
- Optional
-
-
-
-
- hero
-
- Hero
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
- Returns : Promise | void
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Public
- routesConfig
-
-
-
-
-
-
- Type : any
-
-
-
-
-
- Decorators :
-
-
- @Inject(ROUTES_CONFIG)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { ChangeDetectionStrategy, Component, Inject, Input } from '@angular/core';
-import { Hero } from '~modules/hero/shared/hero.model';
-import { transition, trigger, useAnimation } from '@angular/animations';
-import { fadeIn } from 'ng-animate';
-import { ROUTES_CONFIG, RoutesConfig } from '~app/configs/routes.config';
-import { HeroService } from '~modules/hero/shared/hero.service';
-import { Router } from '@angular/router';
-import { AuthService } from '~modules/auth/auth.service';
-import { UtilsService } from '../../services/utils.service';
-import { EventsService, EventsTypes } from '~modules/core/services/events.servide';
-
-@Component({
- selector: 'app-hero-card',
- templateUrl: './hero-card.component.html',
- styleUrls: ['./hero-card.component.scss'],
- changeDetection: ChangeDetectionStrategy.OnPush,
- animations: [
- trigger('fadeIn', [
- transition(
- '* => *',
- useAnimation(fadeIn, {
- params: { timing: 1, delay: 0 },
- })
- ),
- ]),
- ],
-})
-export class HeroCardComponent {
- @Input() hero: Hero | undefined;
-
- constructor(
- private heroService: HeroService,
- private router: Router,
- private utilsService: UtilsService,
- private authService: AuthService,
- private eventsService: EventsService,
- @Inject(ROUTES_CONFIG) public routesConfig: any
- ) {}
-
- like(hero: Hero): Promise<void> | void {
- if (this.authService.isLoggedIn()) {
- this.heroService.voteHero(hero).subscribe(response => {
- if (!response.errors) {
- this.eventsService.send({ type: EventsTypes.UPDATE_HEROES });
- } else {
- this.utilsService.showSnackBar(response.errors[0].message, 'warning-snack-bar');
- }
- });
- } else {
- this.router.navigate([RoutesConfig.routes.auth.logIn]);
- }
- }
-}
-
-
-
-
-
<mat-card class="hero-card" *ngIf="hero" [@fadeIn]="'fadeIn'">
- <mat-card-header>
- <mat-card-title>
- <a class="hero-detail-link" [routerLink]="[routesConfig.routes.hero.detail(hero.id)]">
- {{ hero.alterEgo }}
- </a>
- </mat-card-title>
- <mat-card-subtitle>
- <a class="hero-detail-link" [routerLink]="[routesConfig.routes.hero.detail(hero.id)]">
- {{ hero.realName }}
- </a>
- </mat-card-subtitle>
- <div class="flex-spacer"></div>
- <div class="hero-actions">
- {{ hero.usersVoted.length }}
- <mat-icon class="icon__like--red" (click)="like(hero)">favorite </mat-icon>
- </div>
- </mat-card-header>
- <a class="hero-detail-link" [routerLink]="[routesConfig.routes.hero.detail(hero.id)]">
- <img alt="{{ hero.realName }} hero image" [defaultImage]="hero.image" [lazyLoad]="hero.image" />
- </a>
-</mat-card>
-
-
-
-
-
-
@import '../../../styles/mixins';
-@import '../../../styles/colors';
-
-.hero-detail-link {
- @include text-small-grey();
-}
-
-mat-card-title,
-mat-card-subtitle,
-.mat-card-image {
- cursor: pointer;
-}
-
-.hero-card {
- margin-bottom: 2rem;
- @include push--auto(2rem);
-}
-
-.progress__spinner {
- @include push--auto();
-}
-
-img {
- width: 100%;
- height: auto;
-}
-
-@media (max-width: 680px) {
- .hero-card {
- width: 80%;
- @include push--auto();
- }
-
- .mat-card {
- margin-bottom: 2rem;
- }
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/HeroDetailPageComponent.html b/documentation/components/HeroDetailPageComponent.html
deleted file mode 100644
index 40007e18..00000000
--- a/documentation/components/HeroDetailPageComponent.html
+++ /dev/null
@@ -1,616 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- HeroDetailPageComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
Implements
-
-
-
-
-
-
-
- Index
-
-
-
-
- Properties
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor(location: Location , router: Router , activatedRoute: ActivatedRoute )
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
- Name
- Type
- Optional
-
-
-
-
- location
-
-
- Location
-
-
-
- No
-
-
-
-
- router
-
-
- Router
-
-
-
- No
-
-
-
-
- activatedRoute
-
-
- ActivatedRoute
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
- goBack
-
-
-
-
-
-
-goBack()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- goToTheAnchor
-
-
-
-
-
-
-goToTheAnchor()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ngOnInit
-
-
-
-
-
-
-ngOnInit()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component, OnInit } from '@angular/core';
-import { Hero } from '../../shared/hero.model';
-import { ActivatedRoute, Router } from '@angular/router';
-import { Location } from '@angular/common';
-import { transition, trigger, useAnimation } from '@angular/animations';
-import { fadeIn } from 'ng-animate';
-import { RoutesConfig } from '../../../../configs/routes.config';
-
-@Component({
- selector: 'app-hero-detail-page',
- templateUrl: './hero-detail-page.component.html',
- styleUrls: ['./hero-detail-page.component.scss'],
- animations: [
- trigger('fadeIn', [
- transition(
- '* => *',
- useAnimation(fadeIn, {
- params: { timing: 1, delay: 0 },
- })
- ),
- ]),
- ],
-})
-export class HeroDetailPageComponent implements OnInit {
- hero: Hero | undefined;
-
- constructor(
- private location: Location,
- private router: Router,
- private activatedRoute: ActivatedRoute
- ) {}
-
- ngOnInit() {
- this.activatedRoute.snapshot.data['hero'].subscribe((hero: Hero) => {
- this.hero = hero;
- });
- }
-
- goBack(): void {
- this.location.back();
- }
-
- goToTheAnchor(): void {
- if (this.hero) {
- this.router.navigate([RoutesConfig.routes.hero.detail(this.hero.id)], {
- fragment: 'heroe-detail',
- });
- }
- }
-}
-
-
-
-
-
<h1 class="header__title" i18n>Hero detail</h1>
-<div class="container" *ngIf="!hero">
- <app-hero-loading></app-hero-loading>
-</div>
-<div class="container" *ngIf="hero" [@fadeIn]="'fadeIn'">
- <ng-container>
- <app-hero-card [hero]="hero"></app-hero-card>
- <div id="hero-json">
- <pre>{{ hero | json }}</pre>
- </div>
- </ng-container>
-</div>
-<button
- *ngIf="hero"
- aria-label="Anchor the hero button"
- mat-raised-button
- type="button"
- (click)="goToTheAnchor()"
- i18n
->
- Anchor the hero
-</button>
-<button aria-label="Go back button" mat-raised-button type="button" (click)="goBack()" i18n>
- Go back
-</button>
-
-
-
-
-
-
@import '../../../../styles/mixins';
-
-.container {
- width: 65%;
- @include push--auto();
- margin-top: 2rem;
-}
-
-button {
- @include push--auto(2rem);
- display: block;
-}
-
-@media (max-width: 600px) {
- .container {
- width: 90%;
- }
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/HeroLoadingComponent.html b/documentation/components/HeroLoadingComponent.html
deleted file mode 100644
index 7c5dc4c0..00000000
--- a/documentation/components/HeroLoadingComponent.html
+++ /dev/null
@@ -1,299 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- HeroLoadingComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component } from '@angular/core';
-
-@Component({
- selector: 'app-hero-loading',
- templateUrl: './hero-loading.component.html',
- styleUrls: ['./hero-loading.component.scss'],
-})
-export class HeroLoadingComponent {
- constructor() {}
-}
-
-
-
-
-
<mat-card id="loading-card" class="hero-card">
- <mat-card-header>
- <div mat-card-avatar class="hero-header__image"></div>
- <mat-card-title>
- <app-loading-placeholder [width]="'200px'" [height]="'1rem'"></app-loading-placeholder>
- </mat-card-title>
- <mat-card-subtitle>
- <app-loading-placeholder [width]="'160px'" [height]="'1rem'"></app-loading-placeholder>
- </mat-card-subtitle>
- <div class="flex-spacer"></div>
- <div class="hero-actions">
- <mat-icon class="icon__like--grey">favorite</mat-icon>
- </div>
- </mat-card-header>
- <app-loading-placeholder [height]="'486px'"></app-loading-placeholder>
-</mat-card>
-
-
-
-
-
-
@import '../../../styles/colors';
-
-.hero-header__image {
- background: $grey;
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/HeroRemoveComponent.html b/documentation/components/HeroRemoveComponent.html
deleted file mode 100644
index ac4c8634..00000000
--- a/documentation/components/HeroRemoveComponent.html
+++ /dev/null
@@ -1,270 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- HeroRemoveComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component } from '@angular/core';
-
-@Component({
- selector: 'app-hero-remove',
- templateUrl: './hero-remove.component.html',
-})
-export class HeroRemoveComponent {
- constructor() {}
-}
-
-
-
-
-
<h2 mat-dialog-title i18n>Delete hero</h2>
-<mat-dialog-content i18n>Are you sure?</mat-dialog-content>
-<mat-dialog-actions>
- <button aria-label="no button" mat-button mat-dialog-close i18n>No</button>
- <button aria-label="yes button" mat-button [mat-dialog-close]="true" i18n>Yes</button>
-</mat-dialog-actions>
-
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/HomePageComponent.html b/documentation/components/HomePageComponent.html
deleted file mode 100644
index 21d931c6..00000000
--- a/documentation/components/HomePageComponent.html
+++ /dev/null
@@ -1,483 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- HomePageComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
Implements
-
-
-
-
-
-
-
- Index
-
-
-
-
- Properties
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor(heroService: HeroService , eventsService: EventsService )
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
- Name
- Type
- Optional
-
-
-
-
- heroService
-
-
- HeroService
-
-
-
- No
-
-
-
-
- eventsService
-
-
- EventsService
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
- ngOnInit
-
-
-
-
-
-
-ngOnInit()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component, OnInit } from '@angular/core';
-import { Hero } from '../../../hero/shared/hero.model';
-import { Observable } from 'rxjs';
-import { HeroService } from '../../../hero/shared/hero.service';
-import { EventsService, EventsTypes } from '../../../core/services/events.servide';
-
-@Component({
- selector: 'app-home-page',
- templateUrl: './home-page.component.html',
- styleUrls: ['./home-page.component.scss'],
-})
-export class HomePageComponent implements OnInit {
- heroes$: Observable<Hero[]> | undefined;
-
- constructor(private heroService: HeroService, private eventsService: EventsService) {
- // @ts-ignore
- if (window.Cypress) {
- // @ts-ignore
- window.HomePageComponent = this;
- }
- }
-
- ngOnInit() {
- this.heroes$ = this.heroService.searchHeroes({ fetchPolicy: 'no-cache' });
-
- this.eventsService.events$.subscribe(event => {
- if (event.type === EventsTypes.UPDATE_HEROES) {
- this.heroes$ = this.heroService.searchHeroes({ fetchPolicy: 'no-cache' });
- }
- });
- }
-}
-
-
-
-
-
<div fxLayout="row">
- <div fxFlex="10" fxFlex.gt-sm="20"></div>
- <div fxFlex="90" fxFlex.gt-sm="80">
- <h1 class="header__title" i18n>Heroes published</h1>
- <div id="heroes-list" *ngIf="heroes$ | async as heroes; else loading">
- <ng-container *ngFor="let hero of heroes">
- <app-hero-card [hero]="hero"></app-hero-card>
- </ng-container>
- </div>
- <ng-template #loading>
- <app-hero-loading></app-hero-loading>
- </ng-template>
- </div>
- <div fxFlex="10" fxFlex.gt-sm="20"></div>
-</div>
-
-
-
-
-
-
mat-card-title,
-mat-card-subtitle,
-.mat-card-image {
- cursor: pointer;
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/LoadingPlaceholderComponent.html b/documentation/components/LoadingPlaceholderComponent.html
deleted file mode 100644
index 401f923d..00000000
--- a/documentation/components/LoadingPlaceholderComponent.html
+++ /dev/null
@@ -1,388 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- LoadingPlaceholderComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
-
-
-
-
- Index
-
-
-
-
-
-
- Inputs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- height
-
-
-
-
- Type : string
-
-
-
-
-
- Default value : ''
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- width
-
-
-
-
- Type : string
-
-
-
-
-
- Default value : ''
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component, Input } from '@angular/core';
-
-@Component({
- selector: 'app-loading-placeholder',
- templateUrl: './loading-placeholder.component.html',
- styleUrls: ['./loading-placeholder.component.scss'],
-})
-export class LoadingPlaceholderComponent {
- @Input() height = '';
- @Input() width = '';
-
- constructor() {}
-}
-
-
-
-
-
<div class="placeholder-animation" [ngStyle]="{ height: height, width: width }"></div>
-
-
-
-
-
-
@import 'src/app/styles/colors';
-
-@keyframes placeHolderShimmer {
- 0% {
- background-position: -468px 0;
- }
- 100% {
- background-position: 468px 0;
- }
-}
-
-.placeholder-animation {
- animation-duration: 1.25s;
- animation-fill-mode: forwards;
- animation-iteration-count: infinite;
- animation-name: placeHolderShimmer;
- animation-timing-function: linear;
- background: darkgray;
- background: linear-gradient(to right, $light-grey 10%, #dddddd 18%, #eeeeee 33%);
- position: relative;
- background-size: 1000px 100px;
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/LogInPageComponent.html b/documentation/components/LogInPageComponent.html
deleted file mode 100644
index 4a8bbe02..00000000
--- a/documentation/components/LogInPageComponent.html
+++ /dev/null
@@ -1,797 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- LogInPageComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
-
-
-
-
- Index
-
-
-
-
- Properties
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
- getErrorMessage
-
-
-
-
-
-
-getErrorMessage(field: string )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
-
- Name
- Type
- Optional
-
-
-
-
- field
-
- string
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
- Returns : string | void
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sendForm
-
-
-
-
-
-
-sendForm()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- email
-
-
-
-
-
-
- Default value : new FormControl('', [Validators.required, Validators.email])
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- hide
-
-
-
-
-
-
- Default value : true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- loginForm
-
-
-
-
-
-
- Type : any
-
-
-
-
-
- Decorators :
-
-
- @ViewChild('loginForm')
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- logInForm
-
-
-
-
-
-
- Type : FormGroup
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- password
-
-
-
-
-
-
- Default value : new FormControl('', [Validators.required])
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component, ViewChild } from '@angular/core';
-import { transition, trigger, useAnimation } from '@angular/animations';
-import { fadeIn } from 'ng-animate';
-import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
-import { AuthService } from '../../auth.service';
-import { RoutesConfig } from '../../../../configs/routes.config';
-import { Router } from '@angular/router';
-import { UtilsService } from '../../../../shared/services/utils.service';
-
-@Component({
- selector: 'app-log-in-page',
- templateUrl: './log-in-page.component.html',
- styleUrls: ['./log-in-page.component.scss'],
- animations: [
- trigger('fadeIn', [
- transition(
- '* => *',
- useAnimation(fadeIn, {
- params: { timing: 1, delay: 0 },
- })
- ),
- ]),
- ],
-})
-export class LogInPageComponent {
- @ViewChild('loginForm') loginForm: any;
-
- logInForm: FormGroup;
- email = new FormControl('', [Validators.required, Validators.email]);
- password = new FormControl('', [Validators.required]);
- hide = true;
-
- constructor(
- private formBuilder: FormBuilder,
- private authService: AuthService,
- private router: Router,
- private utilsService: UtilsService
- ) {
- this.logInForm = this.formBuilder.group({
- email: this.email,
- password: this.password,
- });
- }
-
- getErrorMessage(field: string): string | void {
- // @ts-ignore
- const classField = this[field];
- if (classField?.hasError('required')) {
- return 'You must enter a value';
- } else if (classField?.hasError('email')) {
- return 'Not a valid email';
- }
- }
-
- sendForm() {
- if (this.logInForm.valid) {
- const formValue = this.logInForm.value;
- this.authService.logIn(formValue.email, formValue.password).subscribe((response: any) => {
- if (!response.errors) {
- this.router.navigate([RoutesConfig.routes.hero.myHeroes]);
- } else if (response.errors[0].code === 11000) {
- this.utilsService.showSnackBar("Nice! Let's create some heroes", 'info-snack-bar');
- }
- });
- }
- }
-}
-
-
-
-
-
<mat-grid-list cols="1" rows="1" rowHeight="2:1">
- <mat-grid-tile>
- <mat-card class="login--form__box--blue">
- <div class="login--form-container">
- <p class="login--form__header-title">Try to log in!</p>
- <form class="example-container" [formGroup]="logInForm" #loginForm="ngForm">
- <p>
- <mat-form-field appearance="outline">
- <mat-label>Enter your email</mat-label>
- <input matInput placeholder="pat@example.com" [formControl]="email" required />
- <mat-error *ngIf="email.invalid">{{ getErrorMessage('email') }}</mat-error>
- </mat-form-field>
- </p>
- <p>
- <mat-form-field appearance="outline">
- <mat-label>Enter a password</mat-label>
- <input matInput [formControl]="password" [type]="hide ? 'password' : 'text'" />
- <button
- mat-icon-button
- matSuffix
- (click)="hide = !hide"
- [attr.aria-label]="'Hide password'"
- [attr.aria-pressed]="hide"
- >
- <mat-icon>{{ hide ? 'visibility_off' : 'visibility' }}</mat-icon>
- </button>
- <mat-hint
- >Must be minimum eight characters, at least one uppercase letter, one lowercase
- letter and one number</mat-hint
- >
- <mat-error *ngIf="password.invalid">{{ getErrorMessage('password') }}</mat-error>
- </mat-form-field>
- </p>
- <p>
- <button
- class="login--form__submit-button"
- mat-raised-button
- color="primary"
- (click)="sendForm()"
- >
- {{ 'Log In' | uppercase }}
- </button>
- </p>
- </form>
- </div>
- </mat-card>
- </mat-grid-tile>
-</mat-grid-list>
-
-
-
-
-
-
@import '../../../../styles/mixins';
-
-.login--form-container {
- text-align: center;
-
- p {
- margin-bottom: 1rem;
- }
-
- .login--form__header-title {
- margin-bottom: 2rem;
- }
-}
-
-.login--form-container .mat-form-field + .mat-form-field {
- margin-left: 8px;
-}
-
-.mat-form-field {
- width: 100%;
-}
-
-.login--form__box--blue {
- padding: 4rem;
-}
-
-:host ::ng-deep .mat-form-field-flex {
- background: rgb(245, 245, 245);
-}
-
-.login--form__header-title {
- font-weight: bold;
- font-size: 20px;
- color: #000000de;
-}
-
-.login--form__submit-button {
- margin-top: 40px;
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/MyHeroesPageComponent.html b/documentation/components/MyHeroesPageComponent.html
deleted file mode 100644
index a62841a9..00000000
--- a/documentation/components/MyHeroesPageComponent.html
+++ /dev/null
@@ -1,1300 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- MyHeroesPageComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
Implements
-
-
-
-
-
-
-
- Index
-
-
-
-
- Properties
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor(heroService: HeroService , userService: UserService , dialog: MatDialog, snackBar: MatSnackBar, utilsService: UtilsService , router: Router , formBuilder: FormBuilder , routesConfig: any )
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
- Name
- Type
- Optional
-
-
-
-
- heroService
-
-
- HeroService
-
-
-
- No
-
-
-
-
- userService
-
-
- UserService
-
-
-
- No
-
-
-
-
- dialog
-
-
- MatDialog
-
-
-
- No
-
-
-
-
- snackBar
-
-
- MatSnackBar
-
-
-
- No
-
-
-
-
- utilsService
-
-
- UtilsService
-
-
-
- No
-
-
-
-
- router
-
-
- Router
-
-
-
- No
-
-
-
-
- formBuilder
-
-
- FormBuilder
-
-
-
- No
-
-
-
-
- routesConfig
-
-
- any
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
- createNewHero
-
-
-
-
-
-
-createNewHero()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- deleteHero
-
-
-
-
-
-
-deleteHero(hero: Hero )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
-
- Name
- Type
- Optional
-
-
-
-
- hero
-
- Hero
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- loadUser
-
-
-
-
-
-
-loadUser()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ngOnInit
-
-
-
-
-
-
-ngOnInit()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Private
- onChanges
-
-
-
-
-
-
-
- onChanges()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- trackByFn
-
-
-
-
-
-
-trackByFn(index: any )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
-
- Name
- Type
- Optional
-
-
-
-
- index
-
- any
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- alterEgo
-
-
-
-
-
-
- Type : FormControl
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- error
-
-
-
-
-
-
- Type : boolean
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- myNgForm
-
-
-
-
-
-
- Type : any
-
-
-
-
-
- Default value : ''
-
-
-
-
- Decorators :
-
-
- @ViewChild('form', {static: false})
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- newHeroForm
-
-
-
-
-
-
- Type : any
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- realName
-
-
-
-
-
-
- Type : FormControl
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Public
- routesConfig
-
-
-
-
-
-
- Type : any
-
-
-
-
-
- Decorators :
-
-
- @Inject(ROUTES_CONFIG)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component, Inject, OnInit, ViewChild } from '@angular/core';
-import { Hero } from '../../shared/hero.model';
-import { FormBuilder, FormControl, Validators } from '@angular/forms';
-import { MatDialog } from '@angular/material/dialog';
-import { MatSnackBar } from '@angular/material/snack-bar';
-import { Router } from '@angular/router';
-import { HeroRemoveComponent } from '../../components/hero-remove/hero-remove.component';
-import { transition, trigger, useAnimation } from '@angular/animations';
-import { fadeIn } from 'ng-animate';
-import { ROUTES_CONFIG } from '../../../../configs/routes.config';
-import { HeroService } from '../../shared/hero.service';
-import { UtilsHelperService } from '../../../core/services/utils-helper.service';
-import { UserService } from '../../../user/user.service';
-import { User } from '../../../user/shared/user.model';
-import { UtilsService } from '../../../../shared/services/utils.service';
-
-@Component({
- selector: 'app-my-heroes-page',
- templateUrl: './my-heroes-page.component.html',
- styleUrls: ['./my-heroes-page.component.scss'],
- animations: [
- trigger('fadeIn', [
- transition(
- '* => *',
- useAnimation(fadeIn, {
- params: { timing: 1, delay: 0 },
- })
- ),
- ]),
- ],
-})
-export class MyHeroesPageComponent implements OnInit {
- user: User | undefined;
- newHeroForm: any;
- error: boolean;
- realName: FormControl;
- alterEgo: FormControl;
-
- @ViewChild('form', { static: false }) myNgForm: any = ''; // just to call resetForm method
-
- constructor(
- private heroService: HeroService,
- private userService: UserService,
- private dialog: MatDialog,
- private snackBar: MatSnackBar,
- private utilsService: UtilsService,
- private router: Router,
- private formBuilder: FormBuilder,
- @Inject(ROUTES_CONFIG) public routesConfig: any
- ) {
- this.error = false;
- this.realName = new FormControl('', [Validators.required, Validators.maxLength(30)]);
- this.alterEgo = new FormControl('', [Validators.required, Validators.maxLength(30)]);
- this.newHeroForm = this.formBuilder.group({
- realName: this.realName,
- alterEgo: this.alterEgo,
- });
-
- this.onChanges();
- }
-
- ngOnInit() {
- this.loadUser();
- }
-
- loadUser() {
- this.userService.getMe({ fetchPolicy: 'no-cache' }).subscribe((user: User) => {
- this.user = user;
- });
- }
-
- createNewHero() {
- if (this.newHeroForm.valid) {
- this.heroService.createHero(new Hero(this.newHeroForm.value)).subscribe(response => {
- if (!response.errors) {
- this.myNgForm.resetForm();
- this.utilsService.showSnackBar('Hero created', 'info-snack-bar');
- this.loadUser();
- }
- });
- }
- }
-
- deleteHero(hero: Hero) {
- const dialogRef = this.dialog.open(HeroRemoveComponent);
- dialogRef.afterClosed().subscribe(result => {
- if (result) {
- this.heroService.removeHero(hero.id).subscribe(response => {
- if (!response.errors) {
- this.utilsService.showSnackBar('Hero removed', 'info-snack-bar');
- this.loadUser();
- } else {
- this.error = true;
- }
- });
- }
- });
- }
-
- trackByFn(index: any) {
- return index;
- }
-
- private onChanges() {
- this.newHeroForm.get('realName')?.valueChanges.subscribe((value: any) => {
- if (value && value.length >= 3 && UtilsHelperService.isPalindrome(value)) {
- this.snackBar.open("Yeah that's a Palindrome!", '', { duration: 2000 });
- } else {
- this.snackBar.dismiss();
- }
- });
- }
-}
-
-
-
-
-
<div id="left">
- <h2 class="header__title" i18n>My heroes</h2>
- <p *ngIf="!user?.heroes?.length" class="my-heroes__no-heroes--message" i18n>
- No heroes yet, try to create one in the right side!
- </p>
- <div>
- <mat-list id="loading-list" *ngIf="!user?.heroes">
- <mat-list-item *ngFor="let i of [1, 2, 3, 4, 5, 6, 7, 8]">
- <img alt="default hero avatar" mat-list-avatar src="./assets/images/default-hero.png" />
- <h3 mat-line>
- <app-loading-placeholder [width]="'150px'" [height]="'0.9rem'"></app-loading-placeholder>
- </h3>
- <p mat-line>
- <app-loading-placeholder [width]="'100px'" [height]="'0.9rem'"></app-loading-placeholder>
- </p>
- <div class="hero-actions">
- <app-loading-placeholder [width]="'30px'" [height]="'0.9rem'"></app-loading-placeholder>
-
- <mat-icon class="icon__like--grey">favorite</mat-icon>
- </div>
- </mat-list-item>
- </mat-list>
- <mat-list>
- <mat-list-item *ngFor="let hero of user?.heroes; trackBy: trackByFn">
- <h3 mat-line [class.cp]="hero.published">
- {{ hero.alterEgo }}
- </h3>
- <p mat-line [class.cp]="hero.published">
- <span>{{ hero.realName }}</span>
- </p>
- <div class="hero-actions">
- <mat-icon class="icon__remove" *ngIf="!hero.published" (click)="deleteHero(hero)">
- delete
- </mat-icon>
- </div>
- </mat-list-item>
- </mat-list>
- </div>
-</div>
-<div id="right">
- <h2 class="header__title" i18n>Create a hero</h2>
- <div id="form-loading" *ngIf="!user?.heroes">
- <form>
- <div class="input-container">
- <app-loading-placeholder [height]="'2rem'"></app-loading-placeholder>
- </div>
- <div class="input-container">
- <app-loading-placeholder [height]="'2rem'"></app-loading-placeholder>
- </div>
-
- <button aria-label="create button" mat-raised-button [disabled]="true" i18n>Create</button>
- </form>
- </div>
- <div *ngIf="user?.heroes">
- <form
- [formGroup]="newHeroForm"
- #form="ngForm"
- ngxScrollToFirstInvalid
- (ngSubmit)="createNewHero()"
- autocomplete="on"
- >
- <mat-form-field class="input-container">
- <input
- matInput
- name="hname"
- type="text"
- placeholder="Name (Palindrome?)"
- i18n-placeholder="@@nameWithPalindrome"
- formControlName="realName"
- />
- <mat-error *ngIf="realName.errors && form.submitted">
- <ng-template [ngIf]="realName.errors['required']" i18n> Name is required </ng-template>
- <ng-template [ngIf]="realName.errors['maxlength']" i18n>
- The field is too long
- </ng-template>
- </mat-error>
- </mat-form-field>
- <mat-form-field class="input-container">
- <input
- matInput
- type="text"
- name="rname"
- placeholder="Alter ego"
- i18n-placeholder="@@realName"
- formControlName="alterEgo"
- />
- <mat-error *ngIf="alterEgo.errors && form.submitted">
- <ng-template [ngIf]="alterEgo.errors['required']" i18n> Name is required </ng-template>
- <ng-template [ngIf]="alterEgo.errors['maxlength']" i18n>
- The field is too long. Required length:
- {{ alterEgo.errors['maxlength'].requiredLength }}. Current:
- {{ alterEgo.errors['maxlength'].actualLength }}
- </ng-template>
- </mat-error>
- </mat-form-field>
- <button
- aria-label="create button"
- mat-raised-button
- type="submit"
- [disabled]="form.submitted && !newHeroForm.valid"
- i18n
- >
- Create
- </button>
- <div *ngIf="error" i18n>An error has ocurred</div>
- </form>
- </div>
-
- <div id="heroes-json">
- <h2 class="header__title" i18n>Heroes 1 and 2</h2>
- <pre *ngIf="!user?.heroes">
- <app-loading-placeholder [height]="'300px'"></app-loading-placeholder>
- </pre>
- <pre *ngIf="user?.heroes">{{ user?.heroes | slice: 0:2 | json }}</pre>
- </div>
-</div>
-<div class="clear"></div>
-
-
-
-
-
-
@import 'src/app/styles/mixins';
-@import 'src/app/styles/colors';
-
-a {
- @include text-small-grey();
-}
-
-#loading-list {
- p {
- margin-top: 0.2rem;
- }
-}
-
-#form-loading {
- .input-container {
- margin: 0.5rem 0;
- }
-}
-
-#left {
- width: 50%;
- float: left;
- margin-left: 6%;
-}
-
-#right {
- margin-left: 50%;
- text-align: center;
- padding-right: 17%;
-}
-
-.clear {
- clear: both;
-}
-
-.mat-list {
- @include push--auto();
- display: table;
-
- .mat-list-text {
- text-align: left !important;
- }
-}
-
-.hero-actions {
- margin-left: 1rem;
- padding-bottom: 0;
-
- .icon__remove {
- padding-left: 0.5rem;
- color: darkslategrey;
- cursor: pointer;
- }
-}
-
-form {
- display: grid;
- width: 80%;
- @include push--auto();
-
- .mat-raised-button {
- color: $secondary--color;
- background: $primary--color;
- width: 50%;
- @include push--auto();
- }
-
- .mat-form-field {
- width: 100%;
- }
-}
-
-#heroes-json {
- margin-top: 2rem;
-
- pre {
- margin-top: 1rem;
- }
-}
-
-.my-heroes__no-heroes--message {
- text-align: center;
- width: 20%;
- margin: 0 auto;
- line-height: 1.7rem;
-}
-
-@media (max-width: 680px) {
- #left {
- width: 100%;
- float: none;
- @include push--auto();
- }
-
- #right {
- margin: 1em auto 0;
- width: 90%;
- float: none;
- padding: 0;
- }
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/SearchBarComponent.html b/documentation/components/SearchBarComponent.html
deleted file mode 100644
index b7bb2174..00000000
--- a/documentation/components/SearchBarComponent.html
+++ /dev/null
@@ -1,669 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- SearchBarComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
Implements
-
-
-
-
-
-
-
- Index
-
-
-
-
- Properties
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor(heroService: HeroService , routesConfig: any )
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
- Name
- Type
- Optional
-
-
-
-
- heroService
-
-
- HeroService
-
-
-
- No
-
-
-
-
- routesConfig
-
-
- any
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
- filterHeroes
-
-
-
-
-
-
-filterHeroes(val: string )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
-
- Name
- Type
- Optional
-
-
-
-
- val
-
- string
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ngOnInit
-
-
-
-
-
-
-ngOnInit()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- defaultHeroes
-
-
-
-
-
-
- Type : Array<Hero>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- filteredHeroes
-
-
-
-
-
-
- Type : any
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- heroFormControl
-
-
-
-
-
-
- Type : FormControl
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Public
- routesConfig
-
-
-
-
-
-
- Type : any
-
-
-
-
-
- Decorators :
-
-
- @Inject(ROUTES_CONFIG)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { map, startWith } from 'rxjs/operators';
-import { Component, Inject, OnInit } from '@angular/core';
-import { FormControl } from '@angular/forms';
-import { Hero } from '../../../hero/shared/hero.model';
-import { ROUTES_CONFIG } from '~app/configs/routes.config';
-import { HeroService } from '../../../hero/shared/hero.service';
-
-@Component({
- selector: 'app-search-bar',
- templateUrl: './search-bar.component.html',
- styleUrls: ['./search-bar.component.scss'],
-})
-export class SearchBarComponent implements OnInit {
- defaultHeroes: Array<Hero>;
- heroFormControl: FormControl;
- filteredHeroes: any;
-
- constructor(private heroService: HeroService, @Inject(ROUTES_CONFIG) public routesConfig: any) {
- this.defaultHeroes = [];
- this.heroFormControl = new FormControl();
- }
-
- ngOnInit() {
- this.heroService.searchHeroes({ fetchPolicy: 'no-cache' }).subscribe((heroes: Array<Hero>) => {
- this.defaultHeroes = heroes;
-
- this.heroFormControl.valueChanges
- .pipe(
- startWith(null as unknown as string),
- map(value => this.filterHeroes(value))
- )
- .subscribe(heroesFiltered => {
- this.filteredHeroes = heroesFiltered;
- });
- });
- }
-
- filterHeroes(val: string): Hero[] {
- return val
- ? this.defaultHeroes.filter(
- hero => hero.alterEgo.toLowerCase().indexOf(val.toLowerCase()) === 0
- )
- : this.defaultHeroes;
- }
-}
-
-
-
-
-
<mat-form-field id="search-input">
- <input
- matInput
- placeholder="Look for a hero!"
- i18n-placeholder
- [matAutocomplete]="heroesAutocomplete"
- [formControl]="heroFormControl"
- />
-</mat-form-field>
-
-<mat-autocomplete #heroesAutocomplete="matAutocomplete">
- <mat-option *ngFor="let hero of filteredHeroes" [value]="hero.name">
- <a class="hero-link" [routerLink]="[routesConfig.routes.hero.detail(hero.id)]">
- {{ hero.alterEgo | capitalizefirst }}
- </a>
- </mat-option>
-</mat-autocomplete>
-
-
-
-
-
-
@import '../../../../styles/mixins';
-@import '../../../../styles/colors';
-
-.hero-link {
- text-decoration: none;
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/SignUpPageComponent.html b/documentation/components/SignUpPageComponent.html
deleted file mode 100644
index 2992afe9..00000000
--- a/documentation/components/SignUpPageComponent.html
+++ /dev/null
@@ -1,848 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- SignUpPageComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
-
-
-
-
- Index
-
-
-
-
- Properties
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
-
- getErrorMessage
-
-
-
-
-
-
-getErrorMessage(field: any )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Parameters :
-
-
-
-
- Name
- Type
- Optional
-
-
-
-
- field
-
- any
-
-
-
- No
-
-
-
-
-
-
-
-
-
-
- Returns : string | void
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sendForm
-
-
-
-
-
-
-sendForm()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- email
-
-
-
-
-
-
- Default value : new FormControl('', [Validators.required, Validators.email])
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- firstName
-
-
-
-
-
-
- Default value : new FormControl('', [Validators.required, Validators.maxLength(100)])
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- hide
-
-
-
-
-
-
- Default value : true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- lastName
-
-
-
-
-
-
- Default value : new FormControl('', [Validators.required, Validators.maxLength(100)])
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- password
-
-
-
-
-
-
- Default value : new FormControl('', [
- Validators.required,
- Validators.pattern('^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$'),
- ])
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- signUpForm
-
-
-
-
-
-
- Type : FormGroup
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component } from '@angular/core';
-import { transition, trigger, useAnimation } from '@angular/animations';
-import { fadeIn } from 'ng-animate';
-import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
-import { AuthService } from '../../auth.service';
-import { UtilsService } from '../../../../shared/services/utils.service';
-import { RoutesConfig } from '../../../../configs/routes.config';
-import { Router } from '@angular/router';
-
-@Component({
- selector: 'app-sign-up-page',
- templateUrl: './sign-up-page.component.html',
- styleUrls: ['./sign-up-page.component.scss'],
- animations: [
- trigger('fadeIn', [
- transition(
- '* => *',
- useAnimation(fadeIn, {
- params: { timing: 1, delay: 0 },
- })
- ),
- ]),
- ],
-})
-export class SignUpPageComponent {
- signUpForm: FormGroup;
- firstName = new FormControl('', [Validators.required, Validators.maxLength(100)]);
- lastName = new FormControl('', [Validators.required, Validators.maxLength(100)]);
- email = new FormControl('', [Validators.required, Validators.email]);
- password = new FormControl('', [
- Validators.required,
- Validators.pattern('^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$'),
- ]);
- hide = true;
-
- constructor(
- private formBuilder: FormBuilder,
- private authService: AuthService,
- private router: Router,
- private utilsService: UtilsService
- ) {
- this.signUpForm = this.formBuilder.group({
- firstName: this.firstName,
- lastName: this.lastName,
- email: this.email,
- password: this.password,
- });
- }
-
- getErrorMessage(field: any): string | void {
- // @ts-ignore
- const classField: any = this[field];
- if (classField?.hasError('required')) {
- return 'You must enter a value';
- } else if (classField?.hasError('email')) {
- return 'Not a valid email';
- } else if (classField?.hasError('pattern')) {
- return 'Not a valid password';
- }
- }
-
- sendForm() {
- if (this.signUpForm.valid) {
- const formValue = this.signUpForm.value;
- this.authService
- .signUp(formValue.firstName, formValue.lastName, formValue.email, formValue.password)
- .subscribe((response: any) => {
- if (!response.errors) {
- this.router.navigate([RoutesConfig.routes.auth.logIn]).then(() => {
- this.utilsService.showSnackBar('Cool! Now try to log in!', 'info-snack-bar');
- });
- } else if (response.errors[0].code === 10000) {
- this.utilsService.showSnackBar(
- 'This email is not available. Try again, with a different one.',
- 'warning-snack-bar'
- );
- }
- });
- }
- }
-}
-
-
-
-
-
<mat-grid-list cols="1" rows="1" rowHeight="2:1">
- <mat-grid-tile>
- <mat-card class="signup--form__box--blue">
- <div class="signup--form-container">
- <p class="signup--form__header-title">Give it a try!</p>
- <form class="example-container" [formGroup]="signUpForm">
- <p>
- <mat-form-field appearance="outline">
- <mat-label>First name</mat-label>
- <input [formControl]="firstName" matInput placeholder="Jason" />
- <mat-icon matSuffix>sentiment_very_satisfied</mat-icon>
- <mat-error *ngIf="email.invalid">{{ getErrorMessage('firstName') }}</mat-error>
- </mat-form-field>
- </p>
- <p>
- <mat-form-field appearance="outline">
- <mat-label>Last name</mat-label>
- <input [formControl]="lastName" matInput placeholder="Bourne" />
- <mat-icon matSuffix>favorite</mat-icon>
- <mat-error *ngIf="email.invalid">{{ getErrorMessage('lastName') }}</mat-error>
- </mat-form-field>
- </p>
- <p>
- <mat-form-field appearance="outline">
- <mat-label>Enter your email</mat-label>
- <input matInput placeholder="pat@example.com" [formControl]="email" required />
- <mat-error *ngIf="email.invalid">{{ getErrorMessage('email') }}</mat-error>
- </mat-form-field>
- </p>
- <p>
- <mat-form-field appearance="outline">
- <mat-label>Enter a password</mat-label>
- <input matInput [formControl]="password" [type]="hide ? 'password' : 'text'" />
- <button
- mat-icon-button
- matSuffix
- (click)="hide = !hide"
- [attr.aria-label]="'Hide password'"
- [attr.aria-pressed]="hide"
- >
- <mat-icon>{{ hide ? 'visibility_off' : 'visibility' }}</mat-icon>
- </button>
- <mat-hint
- >Must be minimum eight characters, at least one uppercase letter, one lowercase
- letter and one number</mat-hint
- >
- <mat-error *ngIf="password.invalid">{{ getErrorMessage('password') }}</mat-error>
- </mat-form-field>
- </p>
- <p>
- <button
- class="signup--form__submit-button"
- mat-raised-button
- color="primary"
- (click)="sendForm()"
- >
- {{ 'Sign Up' | uppercase }}
- </button>
- </p>
- </form>
- </div>
- </mat-card>
- </mat-grid-tile>
-</mat-grid-list>
-
-
-
-
-
-
@import '../../../../styles/mixins';
-
-.signup--form-container {
- text-align: center;
-
- p {
- margin-bottom: 1rem;
- }
-
- .signup--form__header-title {
- margin-bottom: 2rem;
- }
-}
-
-.signup--form-container .mat-form-field + .mat-form-field {
- margin-left: 8px;
-}
-
-.mat-form-field {
- width: 100%;
-}
-
-.signup--form__box--blue {
- padding: 4rem;
-}
-
-:host ::ng-deep .mat-form-field-flex {
- background: rgb(245, 245, 245);
-}
-
-.signup--form__header-title {
- font-weight: bold;
- font-size: 20px;
- color: #000000de;
-}
-
-.signup--form__submit-button {
- margin-top: 40px;
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/components/SpinnerComponent.html b/documentation/components/SpinnerComponent.html
deleted file mode 100644
index 115e6349..00000000
--- a/documentation/components/SpinnerComponent.html
+++ /dev/null
@@ -1,315 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Components
-
- SpinnerComponent
-
-
-
-
-
-
File
-
-
-
-
-
-
-
-
-
-
-
-
- Constructor
-
-
-
-
-constructor()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import { Component } from '@angular/core';
-
-@Component({
- selector: 'app-spinner',
- templateUrl: './spinner.component.html',
- styleUrls: ['./spinner.component.scss'],
-})
-export class SpinnerComponent {
- constructor() {}
-}
-
-
-
-
-
<div class="spinner"></div>
-
-
-
-
-
-
.spinner {
- width: 40px;
- height: 40px;
- background-color: #333;
-
- border-radius: 100%;
- -webkit-animation: sk-scaleout 1s infinite ease-in-out;
- animation: sk-scaleout 1s infinite ease-in-out;
-
- transform: translate(-50%, -50%);
- position: absolute;
- left: 50%;
- top: 48%;
-}
-
-@-webkit-keyframes sk-scaleout {
- 0% {
- -webkit-transform: scale(0);
- }
- 100% {
- -webkit-transform: scale(1);
- opacity: 0;
- }
-}
-
-@keyframes sk-scaleout {
- 0% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 100% {
- -webkit-transform: scale(1);
- transform: scale(1);
- opacity: 0;
- }
-}
-
-
-
-
-
-
-
- Legend
-
-
-
-
-
Html element with directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/coverage.html b/documentation/coverage.html
deleted file mode 100644
index fcfed16c..00000000
--- a/documentation/coverage.html
+++ /dev/null
@@ -1,773 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Documentation coverage
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/dependencies.html b/documentation/dependencies.html
deleted file mode 100644
index e37968c5..00000000
--- a/documentation/dependencies.html
+++ /dev/null
@@ -1,202 +0,0 @@
-
-
-
-
-
- angular-example-app documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Dependencies
-
-
-
- @angular-devkit/build-angular : 13.0.4
-
- @angular-devkit/schematics : 13.0.4
-
- @angular/animations : 13.1.0
-
- @angular/cdk : 13.1.0
-
- @angular/cli : 13.0.4
-
- @angular/common : 13.1.0
-
- @angular/compiler : 13.0.2
-
- @angular/compiler-cli : 13.1.0
-
- @angular/core : 13.1.0
-
- @angular/flex-layout : 13.0.0-beta.36
-
- @angular/forms : 13.1.0
-
- @angular/http : 7.2.16
-
- @angular/language-service : 13.1.0
-
- @angular/localize : 13.1.0
-
- @angular/platform-browser : 13.1.0
-
- @angular/platform-browser-dynamic : 13.1.0
-
- @angular/router : 13.1.0
-
- @angular/service-worker : 13.1.0
-
- @angular/upgrade : 13.1.0
-
- @apollo/client : 3.5.6
-
- @ismaestro/ngx-scroll-to-first-invalid : 3.0.0
-
- @ngx-meta/core : 9.0.0
-
- @sentry/browser : 6.16.0
-
- @types/js-cookie : 3.0.1
-
- apollo-angular : 2.6.0
-
- compression : 1.7.4
-
- cookie-parser : 1.4.6
-
- core-js : 3.19.3
-
- express : 4.17.1
-
- graphql : 15.7.2
-
- grpc : 1.24.11
-
- helmet : 4.6.0
-
- js-cookie : 3.0.1
-
- jwt-decode : 3.1.2
-
- ng-animate : 1.0.0
-
- ng-lazyload-image : 9.1.0
-
- ngx-cookie : 5.0.2
-
- ngx-logger : 5.0.4
-
- rxjs : 7.4.0
-
- tslib : 2.3.1
-
- uuid : 8.3.2
-
- zone.js : 0.11.4
-
-
-
-
-
-
-
-
-
-
-
results matching " "
-
-
-
-
No results matching " "
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/fonts/ionicons.eot b/documentation/fonts/ionicons.eot
deleted file mode 100644
index 4b1fd0f48c9fa50401fa6dd1514fac66c0e92b06..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 112650
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