From 7e4af3b505f9ce65b8e494d779db6f73b54017d6 Mon Sep 17 00:00:00 2001 From: Sara Cousin Date: Sun, 26 Apr 2020 12:21:22 +0200 Subject: [PATCH 01/17] Removed bootstrap --- angular.json | 5 +---- package-lock.json | 5 ----- package.json | 1 - 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/angular.json b/angular.json index 5a5184e..7bb367e 100644 --- a/angular.json +++ b/angular.json @@ -24,12 +24,9 @@ "src/assets" ], "styles": [ - "src/styles.css", - "node_modules/bootstrap/dist/css/bootstrap.min.css" + "src/styles.css" ], "scripts": [ - "node_modules/jquery/dist/jquery.min.js", - "node_modules/bootstrap/dist/js/bootstrap.min.js" ] }, "configurations": { diff --git a/package-lock.json b/package-lock.json index 16267e1..e433c1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3213,11 +3213,6 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, - "bootstrap": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", - "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", diff --git a/package.json b/package.json index 2b3fffd..34918fa 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,6 @@ "@ngx-translate/core": "^12.1.2", "@ngx-translate/http-loader": "^4.0.0", "@types/googlemaps": "^3.39.3", - "bootstrap": "^4.4.1", "express": "^4.17.1", "firebase": "^7.14.1", "jquery": "^3.4.1", -- GitLab From 4bcf58d565bec0903c9991828836d5b4278f97dd Mon Sep 17 00:00:00 2001 From: Sara Cousin Date: Sun, 26 Apr 2020 12:22:27 +0200 Subject: [PATCH 02/17] Removed fake responsiveness --- src/app/app.component.css | 4 +++- src/app/app.component.html | 12 +++++++----- src/app/app.component.ts | 40 -------------------------------------- 3 files changed, 10 insertions(+), 46 deletions(-) diff --git a/src/app/app.component.css b/src/app/app.component.css index 65d76fd..eccc764 100644 --- a/src/app/app.component.css +++ b/src/app/app.component.css @@ -5,4 +5,6 @@ #app-header{ transition: opacity 0.5s; } - +.container{ + display: flex; +} diff --git a/src/app/app.component.html b/src/app/app.component.html index 3881434..8e1f47a 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,6 +1,8 @@ - - -
- - + +
+ +
+ + +
diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 39ab9fe..512a72c 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -16,47 +16,7 @@ export class AppComponent { constructor(private router: Router,) {} - changeMenu(){ - this.mobileMenuActive = !this.mobileMenuActive; - if(!this.mobileMenuActive){ - document.getElementById("app-header").style.visibility = "hidden"; - document.getElementById("app-header").style.opacity = "0"; - document.getElementById("app-root").style.marginLeft = "250px"; - document.getElementById("app-root").style.marginLeft = "0rem"; - } else{ - document.getElementById("app-header").style.visibility = "visible"; - document.getElementById("app-header").style.opacity = "1"; - document.getElementById("app-root").style.marginLeft = "0px"; - document.getElementById("app-root").style.marginLeft = "12rem"; - } - } - - @HostListener('window:resize', ['$event']) - onResize(event) { - if(window.innerWidth < 500){ - this.isMobile = true; - document.getElementById("app-header").style.visibility = "hidden"; - document.getElementById("app-root").style.marginLeft = "0rem"; - document.getElementById("app-header").style.opacity = "0"; - }else{ - this.isMobile = false; - document.getElementById("app-header").style.visibility = "visible"; - document.getElementById("app-header").style.opacity = "1"; - document.getElementById("app-root").style.marginLeft = "12rem"; - } - } - - ngOnInit(): void { - if(window.innerWidth < 500){ - this.isMobile = true; - document.getElementById("app-header").style.visibility = "hidden"; - document.getElementById("app-root").style.marginLeft = "0rem"; - }else { - this.isMobile = false; - document.getElementById("app-header").style.visibility = "visible"; - document.getElementById("app-root").style.marginLeft = "12rem"; - } } } -- GitLab From 8b11ad76bf9ca3406fbaf7c48804b3cabbec0f4e Mon Sep 17 00:00:00 2001 From: Sara Cousin Date: Sun, 26 Apr 2020 12:23:17 +0200 Subject: [PATCH 03/17] Navigation under new design done --- src/app/app-routing.module.ts | 9 +++-- src/app/header/header.component.css | 53 +++++++++++++++++++++++++--- src/app/header/header.component.html | 42 +++++++++++----------- src/app/header/header.component.ts | 3 +- src/index.html | 1 + src/styles.css | 12 ++++++- 6 files changed, 88 insertions(+), 32 deletions(-) diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index e2c56a4..be80289 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -11,11 +11,6 @@ import { SignupComponent } from './signup/signup.component'; const routes: Routes = [ - { - path: '', - redirectTo: '/preventive-measures', - pathMatch: 'full' - }, { path: 'maps', component: MapsComponent @@ -39,6 +34,10 @@ const routes: Routes = [ { path: 'signup', component: SignupComponent + }, + { + path: '', + component: GettingStartedComponent } ]; diff --git a/src/app/header/header.component.css b/src/app/header/header.component.css index 863f3b7..4d8f50f 100644 --- a/src/app/header/header.component.css +++ b/src/app/header/header.component.css @@ -1,13 +1,51 @@ .vertical-nav { - min-width: 12rem; - width: 12rem; + min-width: 20rem; height: 100vh; - position: fixed; + position: sticky; text-align: center; top: 0; left: 0; box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.1); display: inline-block; + background-color: #8C93D8; +} + +.nav__list { + list-style: none; + margin: 0; + padding: 0; + height: 75vh; + max-height: 600px; +} + +.col { + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.nav__item { +} + +.nav__link--selected { + background-color: #EBDDFF; +} + +.nav__link { + padding: 1em 0; + text-decoration: none; + box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.4); + border-radius: 65px; + display: block; + margin: 0 1.5em; +} +.exit { + background-color: #FC5C14; + font-weight: bold; +} + +.exit:hover { + cursor: pointer; } li:hover { @@ -20,12 +58,17 @@ select { outline: none; -webkit-appearance: none; -moz-appearance: none; - color: #ae61ff; + color: #EBDDFF; background: none; text-align-last: center; text-align: center; -ms-text-align-last: center; -moz-text-align-last: center; + text-transform: uppercase; +} + +select:hover { + cursor: pointer; } option { @@ -47,4 +90,4 @@ option { .logo-center { margin: auto; -} +} \ No newline at end of file diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html index 470ee00..17e1b7a 100644 --- a/src/app/header/header.component.html +++ b/src/app/header/header.component.html @@ -1,28 +1,30 @@ - - - \ No newline at end of file diff --git a/src/app/header/header.component.ts b/src/app/header/header.component.ts index 97e3a78..99ce2a7 100644 --- a/src/app/header/header.component.ts +++ b/src/app/header/header.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { LangService } from '../services/lang.service'; +import { Router } from '@angular/router'; @Component({ selector: 'app-header', @@ -10,7 +11,7 @@ import { LangService } from '../services/lang.service'; export class HeaderComponent implements OnInit { translate: TranslateService; - constructor(public lang: LangService) { + constructor(public lang: LangService, private router: Router) { this.translate = lang.getTranslateService(); } diff --git a/src/index.html b/src/index.html index 67c8f1f..81cc840 100644 --- a/src/index.html +++ b/src/index.html @@ -6,6 +6,7 @@ + diff --git a/src/styles.css b/src/styles.css index e50a47e..1a2b432 100644 --- a/src/styles.css +++ b/src/styles.css @@ -1 +1,11 @@ -/* You can add global styles to this file, and also import other style files */ \ No newline at end of file +/* You can add global styles to this file, and also import other style files */ +* { + font-family: 'Montserrat'; + font-size: 21px; + font-weight: regular; + margin: 0; +} + +a:visited { + color: inherit; +} \ No newline at end of file -- GitLab From 63347ea4172c0f9edf20dbb8fd1adc7d0b50aced Mon Sep 17 00:00:00 2001 From: Sara Cousin Date: Sun, 26 Apr 2020 13:40:14 +0200 Subject: [PATCH 04/17] deployement automatique des merges requests --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 87f66b1..9a200c1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,7 +15,7 @@ staging: script: - dpl --provider=heroku --app=$HEROKU_STAGING_APP --api-key=$HEROKU_STAGING_API_KEY only: - - staging + - merge_requests production: type: deploy -- GitLab From f183c969c4f62e8c4b81dfa3f14dffa4d7dbb17d Mon Sep 17 00:00:00 2001 From: Sara Cousin Date: Sun, 26 Apr 2020 13:40:47 +0200 Subject: [PATCH 05/17] menu text color black --- src/app/header/header.component.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/header/header.component.css b/src/app/header/header.component.css index 4d8f50f..d006438 100644 --- a/src/app/header/header.component.css +++ b/src/app/header/header.component.css @@ -16,6 +16,7 @@ padding: 0; height: 75vh; max-height: 600px; + color: black; } .col { @@ -25,6 +26,7 @@ } .nav__item { + } .nav__link--selected { @@ -73,11 +75,11 @@ select:hover { option { border: 0; - border-bottom: 1px solid #595e63; + border-bottom: 1px solid #8C93D8; -webkit-appearance: none; -moz-appearance: none; background: none; - background-color: #595e63; + background-color: #8C93D8; } .selector { -- GitLab From 7e129d8a68a2a5cd67e1ead7455cf035aa9e921b Mon Sep 17 00:00:00 2001 From: Marcy Date: Sun, 26 Apr 2020 12:09:02 +0200 Subject: [PATCH 06/17] something went south --- package.json | 2 +- src/app/app.module.ts | 3 +- src/app/login/login.component.css | 98 ++++++++++++-- src/app/login/login.component.html | 7 +- src/app/login/login.component.ts | 4 +- src/app/signup/signup.component.css | 184 ++++++++++++++++++--------- src/app/signup/signup.component.html | 67 ++++++++++ src/app/signup/signup.component.ts | 38 +++++- 8 files changed, 325 insertions(+), 78 deletions(-) diff --git a/package.json b/package.json index 34918fa..c58db87 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@angular/compiler-cli": "^9.0.7", "@angular/core": "~9.0.3", "@angular/fire": "^6.0.0", - "@angular/forms": "~9.0.3", + "@angular/forms": "^9.0.7", "@angular/localize": "^9.1.0", "@angular/platform-browser": "~9.0.3", "@angular/platform-browser-dynamic": "~9.0.3", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 711c6ca..e2f0f96 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -52,7 +52,7 @@ export function HttpLoaderFactory(http: HttpClient) { return new TranslateHttpLoader(http); } -import { FormsModule } from '@angular/forms'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AgmCoreModule, GoogleMapsAPIWrapper } from '@agm/core'; import { GeocodeService } from './services/geocode.service'; @@ -77,6 +77,7 @@ import { GeocodeService } from './services/geocode.service'; CommonModule, HttpClientModule, FormsModule, + ReactiveFormsModule, AgmCoreModule.forRoot({ apiKey: 'AIzaSyD9crBwGrLUT3_iH_wi1ZqKNhGhwjzHp5I' }), diff --git a/src/app/login/login.component.css b/src/app/login/login.component.css index 01f5c49..08afc24 100644 --- a/src/app/login/login.component.css +++ b/src/app/login/login.component.css @@ -7,10 +7,10 @@ form { padding: 20px; text-align: center; margin: auto auto 0 auto; - background-color: white; - -webkit-box-shadow: 0px 4px 22px 3px rgba(0,0,0,0.75); - -moz-box-shadow: 0px 4px 22px 3px rgba(0,0,0,0.75); - box-shadow: 0px 4px 22px 3px rgba(0,0,0,0.75); + background: #FFFFFF; + border: 1px solid #2E3192; + box-sizing: border-box; + border-radius: 36px; } .v_container { @@ -21,8 +21,7 @@ form { height: 100vh; min-width: 300px; min-height: 1000px; - background: rgb(236,160,193); - background: radial-gradient(circle, rgba(236,160,193,1) 0%, rgba(130,180,238,1) 100%); + background: #FFFAE7; } .fixed_height { @@ -40,7 +39,15 @@ form { } #login { + font-family: Montserrat; + font-weight: 500; + font-size: 36px; + line-height: 44px; + display: flex; + align-items: center; text-align: center; + font-style: normal; + color: #2E3192; } #submit { @@ -49,7 +56,16 @@ form { } p { - font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + font-family: Montserrat; + font-weight: normal; + font-size: 22px; + line-height: 27px; + display: flex; + align-items: center; + text-align: center; + + color: #2E3192; + font-style: normal; } #signup { @@ -58,11 +74,71 @@ p { } input[type=text] { - border: none; - border-bottom: 2px solid rgb(200, 200, 200); + background: #FFFFFF; + border: 1px solid #EBDDFF; + box-sizing: border-box; } input[type=password] { - border: none; - border-bottom: 2px solid rgb(200, 200, 200); + background: #FFFFFF; + box-sizing: border-box; + border: 1px solid #EBDDFF; +} + +.container1{ + font-family: Montserrat; + font-weight: normal; + font-size: 22px; + line-height: 27px; + display: flex; + align-items: center; + text-align: center; + color: #2E3192; + font-style: normal; +} + +.container2{ + font-family: Montserrat; + font-weight: normal; + font-size: 22px; + line-height: 27px; + display: flex; + align-items: center; + text-align: center; + color: #2E3192; + font-style: normal; +} + +a:link { + font-family: Montserrat; + font-weight: normal; + font-size: 22px; + line-height: 27px; + display: flex; + align-items: center; + text-align: center; + text-decoration-line: underline; + + color: #FC5C14; + font-style: normal; +} + +button { +background: #EBDDFF; +border: 2px solid #2E3192; +box-sizing: border-box; +border-radius: 30px; +font-family: Montserrat; +font-style: normal; +font-weight: normal; +font-size: 24px; +line-height: 29px; +display: flex; +align-items: center; +text-align: center; +} + +input::placeholder{ + color: #999FDE; + } diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html index 56223aa..941a094 100644 --- a/src/app/login/login.component.html +++ b/src/app/login/login.component.html @@ -14,10 +14,11 @@
- + Forgot password? +

LOGIN.NOACCOUNT

- + Sign Up - \ No newline at end of file + diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index a83a6a5..fa08500 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; +import { FirebaseAuthService } from '../services/firebase-auth.service'; @Component({ selector: 'app-login', @@ -7,7 +8,8 @@ import { Router } from '@angular/router'; styleUrls: ['./login.component.css'] }) export class LoginComponent implements OnInit { - constructor(private router: Router) { } + constructor(private router: Router, private authService: FirebaseAuthService) { } + ngOnInit(): void { } diff --git a/src/app/signup/signup.component.css b/src/app/signup/signup.component.css index 2facceb..e39b8ab 100644 --- a/src/app/signup/signup.component.css +++ b/src/app/signup/signup.component.css @@ -1,90 +1,158 @@ -.v_container { - align-items: center; - justify-content: center; + +form { text-align: center; - width: 100%; - height: 100vh; min-width: 300px; - min-height: 1000px; - background: rgb(2,0,36); - background: linear-gradient(189deg, rgba(2,0,36,1) 0%, rgba(255,252,161,1) 0%, rgba(126,236,175,1) 52%, rgba(0,255,211,1) 97%); + max-width: 400px; + min-height: 600px; + max-height: 700px; + background: #FFFFFF; + box-sizing: border-box; + border-radius: 36px; + border: 1px solid #2E3192; + display: flex; + flex-direction: column; + justify-content: center; + margin-left: 50%; + margin-top: 10%; } -.fixed_height { - height: 20vh +h2{ + padding-bottom: 5%; + font-family: Montserrat; + font-weight: 500; + font-size: 36px; + line-height: 44px; + display: flex; + margin-left: 34%; + margin-top: 10%; + + + color: #2E3192; + font-style: normal; } -form { - text-align: center; - margin: auto auto 0 auto; - border-radius: 25px; - width: 400px; - height: 600px; - background: white; - -webkit-box-shadow: 0px 4px 22px 3px rgba(0,0,0,0.75); - -moz-box-shadow: 0px 4px 22px 3px rgba(0,0,0,0.75); - box-shadow: 0px 4px 22px 3px rgba(0,0,0,0.75); +.form-group{ + padding-top: 2%; + margin-left: 5%; + margin-right: 5%; + text-align: left; } -.container{ - font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - vertical-align: middle; - line-height:25px; - font-size: 120%; - padding: 10%; +input[type=text] { + background: #FFFFFF; + border: 1px solid #EBDDFF; + box-sizing: border-box; } -.container1{ - padding: 5px; +input[type=password] { + background: #FFFFFF; + box-sizing: border-box; + border: 1px solid #EBDDFF; +} + +#line { + border-bottom: 1px solid #EBDDFF; + margin-left: 5%; + margin-right: 5%; + padding-top: 5%; + margin-bottom: 15%; } -#signupHeader{ +label{ + font-family: Montserrat; + font-weight: normal; + font-size: 22px; + line-height: 27px; + display: flex; + align-items: center; text-align: center; + + color: #2E3192; + font-style: normal; } +input::placeholder{ + font-family: Montserrat; + font-weight: normal; + font-size: 22px; + line-height: 27px; + display: flex; + align-items: left; + text-align: left; + + color: #999FDE; + font-style: normal; +} +button{ + background: #EBDDFF; + box-sizing: border-box; + border-radius: 30px; + font-family: Montserrat; + font-style: normal; + font-weight: normal; + font-size: 24px; + line-height: 29px; + display: flex; + align-items: center; + text-align: center; + border: 2px solid #2E3192; + font-family: Montserrat; + font-weight: normal; + font-size: 24px; + line-height: 29px; + display: flex; + align-items: center; + text-align: center; + color: #2E3192; + font-style: normal; -#submit{ - border-radius: 25px; - font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - height: 40px; - width: 200px; - background-color : rgba(245, 254, 155, 0.988); -} + margin-left: 25%; + margin-right: 25%; + margin-top: 10%; -p { - margin-bottom: 3%; - padding: 10%; } -#victim:focus{ - border-radius: 25px; - background-color: #4CAF50; +#rectangle { + width: 200px; + height: 100px; + background: red; } -#chose{ - margin: 3%; -} -#verify{ - border-radius: 25px; - font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; +#sos{ + font-family: Montserrat; + font-weight: normal; + font-size: 23.1579px; + line-height: 28px; + display: flex; + align-items: center; + text-align: center; + font-style: normal; + + color: #FC5C14; + border: 1px solid #FF9848; + border-radius: 28.9474px; + box-sizing: border-box; + margin-left: 30%; + margin-top: 2%; + } -input[type=text] { - border: none; - border-bottom: 2px solid rgb(200, 200, 200); +.back{ + background: #FFFAE7; } -input[type=password] { - border: none; - border-bottom: 2px solid rgb(200, 200, 200); +.tree{ + position: absolute; + x: 0; + y:0; } -.help { - border-radius: 25px; - font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; -} \ No newline at end of file + + + + diff --git a/src/app/signup/signup.component.html b/src/app/signup/signup.component.html index 3c22efb..227bbae 100644 --- a/src/app/signup/signup.component.html +++ b/src/app/signup/signup.component.html @@ -1,4 +1,70 @@ +
+ +
+
+
Are you in an emergency ? Call 147 or find help near you
+
+

Sign up

+
+
+ + +
+
+ + +
+ +
+

{{ errorMessage }}

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + \ No newline at end of file diff --git a/src/app/signup/signup.component.ts b/src/app/signup/signup.component.ts index 7aba739..dca4e16 100644 --- a/src/app/signup/signup.component.ts +++ b/src/app/signup/signup.component.ts @@ -2,6 +2,9 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { LangService } from '../services/lang.service'; +import { FirebaseAuthService } from '../services/firebase-auth.service'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; + @Component({ selector: 'app-signup', @@ -11,13 +14,41 @@ import { LangService } from '../services/lang.service'; export class SignupComponent implements OnInit { translate: TranslateService; - constructor(private router: Router, private lang: LangService) { + signupForm: FormGroup; + errorMessage: string; + + constructor(private formBuilder: FormBuilder, + private router: Router, + private lang: LangService, + private authService: FirebaseAuthService) { this.translate = lang.getTranslateService(); } - ngOnInit(): void { + ngOnInit() { + this.initForm(); } + initForm() { + this.signupForm = this.formBuilder.group({ + email: ['', [Validators.required, Validators.email]], + password: ['', [Validators.required, Validators.pattern(/[0-9a-zA-Z]{6,}/)]] + }); + } + + onSubmit() { + const email = this.signupForm.get('email').value; + const password = this.signupForm.get('password').value; + + this.authService.createNewUser(email, password).then( + () => { + this.router.navigate(['/books']); + }, + (error) => { + this.errorMessage = error; + } + ); + } + loginUser(event) { event.preventDefault(); // const target = event.target @@ -30,4 +61,5 @@ export class SignupComponent implements OnInit { this.router.navigate([`${pageName}`]); } -} + +} \ No newline at end of file -- GitLab From fcb1c9461c22bd3043e5392856bc6de81c14ec31 Mon Sep 17 00:00:00 2001 From: Marcy Date: Sun, 26 Apr 2020 13:07:56 +0200 Subject: [PATCH 07/17] signup_presque_nice --- src/app/login/login.component.css | 1 - src/app/signup/signup.component.css | 14 ++++++------- src/app/signup/signup.component.html | 27 ------------------------- src/assets/images/yana-tree-noHands.svg | 21 +++++++++++++++++++ 4 files changed, 28 insertions(+), 35 deletions(-) create mode 100644 src/assets/images/yana-tree-noHands.svg diff --git a/src/app/login/login.component.css b/src/app/login/login.component.css index 08afc24..f84a023 100644 --- a/src/app/login/login.component.css +++ b/src/app/login/login.component.css @@ -140,5 +140,4 @@ text-align: center; input::placeholder{ color: #999FDE; - } diff --git a/src/app/signup/signup.component.css b/src/app/signup/signup.component.css index e39b8ab..63461cb 100644 --- a/src/app/signup/signup.component.css +++ b/src/app/signup/signup.component.css @@ -13,7 +13,7 @@ form { flex-direction: column; justify-content: center; margin-left: 50%; - margin-top: 10%; + margin-top: 5%; } h2{ @@ -143,13 +143,13 @@ button{ } .back{ - background: #FFFAE7; -} -.tree{ - position: absolute; - x: 0; - y:0; + height: 850px; + background: #FFFAE7; + background-image: url(../../assets/images/yana-tree-noHands.svg); + background-repeat: space; + background-image-size: 100%; + background-position: bottom; } diff --git a/src/app/signup/signup.component.html b/src/app/signup/signup.component.html index 227bbae..acca945 100644 --- a/src/app/signup/signup.component.html +++ b/src/app/signup/signup.component.html @@ -28,33 +28,6 @@ -
- - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/assets/images/yana-tree-noHands.svg b/src/assets/images/yana-tree-noHands.svg new file mode 100644 index 0000000..c2ba6d2 --- /dev/null +++ b/src/assets/images/yana-tree-noHands.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- GitLab From 19d3e569d4ced0bc7044f29d1f5a8a94eed1308e Mon Sep 17 00:00:00 2001 From: Marcy Date: Sun, 26 Apr 2020 14:34:09 +0200 Subject: [PATCH 08/17] Login page, Sign UP page and unlinked rest password page + thank you page --- src/app/app.module.ts | 6 +- src/app/login/login.component.css | 192 +++++++++++------- src/app/login/login.component.html | 48 +++++ src/app/login/login.component.ts | 39 +++- .../resetpassword/resetpassword.component.css | 0 .../resetpassword.component.html | 1 + .../resetpassword.component.spec.ts | 25 +++ .../resetpassword/resetpassword.component.ts | 15 ++ src/app/signup/signup.component.html | 2 +- src/app/signup/signup.component.ts | 2 +- src/app/thankyou/thankyou.component.css | 0 src/app/thankyou/thankyou.component.html | 19 ++ src/app/thankyou/thankyou.component.spec.ts | 25 +++ src/app/thankyou/thankyou.component.ts | 15 ++ 14 files changed, 307 insertions(+), 82 deletions(-) create mode 100644 src/app/resetpassword/resetpassword.component.css create mode 100644 src/app/resetpassword/resetpassword.component.html create mode 100644 src/app/resetpassword/resetpassword.component.spec.ts create mode 100644 src/app/resetpassword/resetpassword.component.ts create mode 100644 src/app/thankyou/thankyou.component.css create mode 100644 src/app/thankyou/thankyou.component.html create mode 100644 src/app/thankyou/thankyou.component.spec.ts create mode 100644 src/app/thankyou/thankyou.component.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index e2f0f96..6c6fcd7 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -55,6 +55,8 @@ export function HttpLoaderFactory(http: HttpClient) { import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AgmCoreModule, GoogleMapsAPIWrapper } from '@agm/core'; import { GeocodeService } from './services/geocode.service'; +import { ResetpasswordComponent } from './resetpassword/resetpassword.component'; +import { ThankyouComponent } from './thankyou/thankyou.component'; @NgModule({ @@ -69,7 +71,9 @@ import { GeocodeService } from './services/geocode.service'; ArticleComponent, NavButtonComponent, LoginComponent, - SignupComponent + SignupComponent, + ResetpasswordComponent, + ThankyouComponent ], imports: [ BrowserModule, diff --git a/src/app/login/login.component.css b/src/app/login/login.component.css index f84a023..ed28a07 100644 --- a/src/app/login/login.component.css +++ b/src/app/login/login.component.css @@ -1,76 +1,42 @@ form { - max-width: 2000px; - max-height: 2000px; - border-radius: 25px; - height: fit-content; - width: fit-content; - padding: 20px; text-align: center; - margin: auto auto 0 auto; + min-width: 300px; + max-width: 400px; + min-height: 600px; + max-height: 700px; background: #FFFFFF; - border: 1px solid #2E3192; box-sizing: border-box; border-radius: 36px; -} - -.v_container { - align-items: center; + border: 1px solid #2E3192; + display: flex; + flex-direction: column; justify-content: center; - text-align: center; - width: 100%; - height: 100vh; - min-width: 300px; - min-height: 1000px; - background: #FFFAE7; -} - -.fixed_height { - height: 20vh -} - -.container{ - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - font-style: normal; - font-variant: normal; - font-weight: bold; - vertical-align: middle; - line-height:35px; - font-size: 120%; + margin-left: 50%; + margin-top: 5%; } -#login { +h2{ + padding-bottom: 5%; font-family: Montserrat; font-weight: 500; font-size: 36px; line-height: 44px; display: flex; - align-items: center; - text-align: center; - font-style: normal; - color: #2E3192; -} - -#submit { - border-radius: 25px; - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; -} - -p { - font-family: Montserrat; - font-weight: normal; - font-size: 22px; - line-height: 27px; - display: flex; - align-items: center; - text-align: center; + margin-left: 34%; + margin-top: 10%; + color: #2E3192; font-style: normal; } -#signup { - border-radius: 25px; - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + + +.form-group{ + padding-top: 2%; + margin-left: 5%; + margin-right: 5%; + text-align: left; } input[type=text] { @@ -85,7 +51,15 @@ input[type=password] { border: 1px solid #EBDDFF; } -.container1{ +#line { + border-bottom: 1px solid #EBDDFF; + margin-left: 5%; + margin-right: 5%; + padding-top: 5%; + margin-bottom: 15%; +} + +.label{ font-family: Montserrat; font-weight: normal; font-size: 22px; @@ -93,51 +67,113 @@ input[type=password] { display: flex; align-items: center; text-align: center; + color: #2E3192; font-style: normal; } -.container2{ +input::placeholder{ font-family: Montserrat; font-weight: normal; font-size: 22px; line-height: 27px; display: flex; + align-items: left; + text-align: left; + + color: #999FDE; + font-style: normal; +} + +button{ + background: #EBDDFF; + box-sizing: border-box; + border-radius: 30px; + font-family: Montserrat; + font-style: normal; + font-weight: normal; + font-size: 24px; + line-height: 29px; + display: flex; + align-items: center; + text-align: center; + border: 2px solid #2E3192; + + font-family: Montserrat; + font-weight: normal; + font-size: 24px; + line-height: 29px; + display: flex; align-items: center; text-align: center; color: #2E3192; font-style: normal; + + margin-left: 25%; + margin-right: 25%; + margin-top: 10%; + +} + +#rectangle { + width: 200px; + height: 100px; + background: red; } -a:link { + +#sos{ font-family: Montserrat; font-weight: normal; - font-size: 22px; - line-height: 27px; + font-size: 23.1579px; + line-height: 28px; display: flex; align-items: center; text-align: center; - text-decoration-line: underline; - - color: #FC5C14; font-style: normal; + + color: #FC5C14; + border: 1px solid #FF9848; + border-radius: 28.9474px; + box-sizing: border-box; + margin-left: 30%; + margin-top: 2%; + } -button { -background: #EBDDFF; -border: 2px solid #2E3192; -box-sizing: border-box; -border-radius: 30px; -font-family: Montserrat; -font-style: normal; -font-weight: normal; -font-size: 24px; -line-height: 29px; -display: flex; -align-items: center; -text-align: center; +.back{ + + height: 850px; + background: #FFFAE7; + background-image: url(../../assets/images/yana-tree-noHands.svg); + background-repeat: space; + background-image-size: 100%; + background-position: bottom; } -input::placeholder{ - color: #999FDE; +p{ + ont-family: Montserrat; + font-weight: normal; + font-size: 22px; + line-height: 27px; + display: flex; + align-items: center; + text-align: center; + + color: #2E3192; + font-style: normal; } + +a{ + font-family: Montserrat; + font-weight: normal; + font-size: 22px; + line-height: 27px; + display: flex; + align-items: center; + text-align: center; + text-decoration-line: underline; + + color: #FC5C14; + font-style: normal; +} \ No newline at end of file diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html index 941a094..6f2b546 100644 --- a/src/app/login/login.component.html +++ b/src/app/login/login.component.html @@ -1,4 +1,51 @@ +
+ +
+
+
Are you in an emergency ? Call 147 or find help near you
+
+

Login

+
+
+ + +
+
+ + +
+ Forgot password? + +

Don't have an account yet?

+ Sign Up +
+

{{ errorMessage }}

+
+
+ +
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index fa08500..4a14778 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -1,6 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; +import { LangService } from '../services/lang.service'; import { FirebaseAuthService } from '../services/firebase-auth.service'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; @Component({ selector: 'app-login', @@ -8,11 +10,46 @@ import { FirebaseAuthService } from '../services/firebase-auth.service'; styleUrls: ['./login.component.css'] }) export class LoginComponent implements OnInit { - constructor(private router: Router, private authService: FirebaseAuthService) { } + + loginForm: FormGroup; + errorMessage: string; + + + constructor(private formBuilder: FormBuilder, + private router: Router, + private lang: LangService, + private authService: FirebaseAuthService) { } ngOnInit(): void { + this.initForm(); } + initForm() { + this.loginForm = this.formBuilder.group({ + email: ['', [Validators.required, Validators.email]], + password: ['', [Validators.required, Validators.pattern(/[0-9a-zA-Z]{6,}/)]] + }); + } + + onSubmit() { + const email = this.loginForm.get('email').value; + const password = this.loginForm.get('password').value; + + this.authService.signInUser(email, password).then( + () => { + this.router.navigate(['/']); + }, + (error) => { + this.errorMessage = error; + } + ); + } + + + + + + getUserDetails() { //post this details to API server return info if correct } diff --git a/src/app/resetpassword/resetpassword.component.css b/src/app/resetpassword/resetpassword.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/resetpassword/resetpassword.component.html b/src/app/resetpassword/resetpassword.component.html new file mode 100644 index 0000000..6b9f5ee --- /dev/null +++ b/src/app/resetpassword/resetpassword.component.html @@ -0,0 +1 @@ +

resetpassword works!

diff --git a/src/app/resetpassword/resetpassword.component.spec.ts b/src/app/resetpassword/resetpassword.component.spec.ts new file mode 100644 index 0000000..f6cd854 --- /dev/null +++ b/src/app/resetpassword/resetpassword.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ResetpasswordComponent } from './resetpassword.component'; + +describe('ResetpasswordComponent', () => { + let component: ResetpasswordComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ResetpasswordComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ResetpasswordComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/resetpassword/resetpassword.component.ts b/src/app/resetpassword/resetpassword.component.ts new file mode 100644 index 0000000..756c49e --- /dev/null +++ b/src/app/resetpassword/resetpassword.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-resetpassword', + templateUrl: './resetpassword.component.html', + styleUrls: ['./resetpassword.component.css'] +}) +export class ResetpasswordComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/signup/signup.component.html b/src/app/signup/signup.component.html index acca945..5ae46fe 100644 --- a/src/app/signup/signup.component.html +++ b/src/app/signup/signup.component.html @@ -20,7 +20,7 @@ id="password" class="form-control" formControlName="password" - placeholder="Enter your email"> + placeholder="Enter your password"> diff --git a/src/app/signup/signup.component.ts b/src/app/signup/signup.component.ts index dca4e16..478b911 100644 --- a/src/app/signup/signup.component.ts +++ b/src/app/signup/signup.component.ts @@ -41,7 +41,7 @@ export class SignupComponent implements OnInit { this.authService.createNewUser(email, password).then( () => { - this.router.navigate(['/books']); + this.router.navigate(['/']); }, (error) => { this.errorMessage = error; diff --git a/src/app/thankyou/thankyou.component.css b/src/app/thankyou/thankyou.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/thankyou/thankyou.component.html b/src/app/thankyou/thankyou.component.html new file mode 100644 index 0000000..7c1ed22 --- /dev/null +++ b/src/app/thankyou/thankyou.component.html @@ -0,0 +1,19 @@ +
+ +
+
+
Are you in an emergency ? Call 147 or find help near you
+
+

Thank you for joining our comunity

+
+

Thank you for joining our comunity!

+ + +
+ +
+
+ +
+ + \ No newline at end of file diff --git a/src/app/thankyou/thankyou.component.spec.ts b/src/app/thankyou/thankyou.component.spec.ts new file mode 100644 index 0000000..375f72a --- /dev/null +++ b/src/app/thankyou/thankyou.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ThankyouComponent } from './thankyou.component'; + +describe('ThankyouComponent', () => { + let component: ThankyouComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ThankyouComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ThankyouComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/thankyou/thankyou.component.ts b/src/app/thankyou/thankyou.component.ts new file mode 100644 index 0000000..6e4d8f7 --- /dev/null +++ b/src/app/thankyou/thankyou.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-thankyou', + templateUrl: './thankyou.component.html', + styleUrls: ['./thankyou.component.css'] +}) +export class ThankyouComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} -- GitLab From 4db0714994c32120dbe4ce2ade9e4b6c94a24b0d Mon Sep 17 00:00:00 2001 From: AtomicNicos Date: Sun, 26 Apr 2020 18:04:20 +0200 Subject: [PATCH 09/17] Firebase Map integration, next up UI --- src/app/interfaces/map-point.ts | 14 +++++ src/app/json-typings.d.ts | 6 +- src/app/maps/maps.component.html | 4 +- src/app/maps/maps.component.ts | 62 ++++++++++--------- src/app/services/firebase-auth.service.ts | 11 ++-- .../services/firebase-data.service.spec.ts | 16 +++++ src/app/services/firebase-data.service.ts | 31 ++++++++++ src/app/services/location-representation.ts | 4 +- 8 files changed, 107 insertions(+), 41 deletions(-) create mode 100644 src/app/interfaces/map-point.ts create mode 100644 src/app/services/firebase-data.service.spec.ts create mode 100644 src/app/services/firebase-data.service.ts diff --git a/src/app/interfaces/map-point.ts b/src/app/interfaces/map-point.ts new file mode 100644 index 0000000..d780311 --- /dev/null +++ b/src/app/interfaces/map-point.ts @@ -0,0 +1,14 @@ +export interface MapPoint { + name: string; + address: string; + postalCode: string; + city: string; + canton: string; + description: string; + tel: string; + email: string; + type: string; + website: string; + longitude: string; + latitude: string; +} diff --git a/src/app/json-typings.d.ts b/src/app/json-typings.d.ts index 1056388..f3f5966 100644 --- a/src/app/json-typings.d.ts +++ b/src/app/json-typings.d.ts @@ -1,4 +1,4 @@ declare module "*.json" { - const value: any; - export default value; - } \ No newline at end of file + const value: any; + export default value; +} diff --git a/src/app/maps/maps.component.html b/src/app/maps/maps.component.html index 8cb3520..a751d8a 100644 --- a/src/app/maps/maps.component.html +++ b/src/app/maps/maps.component.html @@ -14,8 +14,8 @@ [disableDefaultUI]="false" [zoomControl]="false"> + [latitude]="place.latitude" + [longitude]="place.longitude"> {{ place.name }}
{{ place.address }}
diff --git a/src/app/maps/maps.component.ts b/src/app/maps/maps.component.ts index 217759c..133662f 100644 --- a/src/app/maps/maps.component.ts +++ b/src/app/maps/maps.component.ts @@ -4,6 +4,9 @@ import { GeocodeService } from '../services/geocode.service'; import { Location } from '../services/location-representation'; import { LangService } from '../services/lang.service'; import { TranslateService } from '@ngx-translate/core'; +import { FirebaseDataService } from '../services/firebase-data.service'; +import { MapPoint } from '../interfaces/map-point'; + @Component({ selector: 'app-maps', @@ -11,62 +14,65 @@ import { TranslateService } from '@ngx-translate/core'; styleUrls: ['./maps.component.css'] }) export class MapsComponent implements OnInit { - address = 'London'; location: Location; centersFound = false; geocoder: any; - cantonCenter: Location = {lng: 7.4446085, lat: 46.9479222}; + cantonCenter: Location = { lat: 46.9479222, lng: 7.4446085 }; translate: TranslateService; cantonSelected = ''; - cantons = ['Argovie (AG)', 'Appenzell Rhodes-Intérieures (AI)', 'Appenzell Rhodes-Extérieures (AR)', 'Berne (BE)', 'Bâle-Campagne (BL)', 'Bâle-Ville (BS)', 'Fribourg (FR)', 'Genève (GE)', 'Glaris (GL)', 'Grisons (GR)', 'Jura (JU)', 'Lucerne (LU)', 'Neuchâtel (NE)', 'Nidwald (NW)', 'Obwald (OW)', 'Saint-Gall (SG)', 'Schaffhouse (SH)', 'Soleure (SO)', 'Schwytz (SZ)', 'Thurgovie (TG)', 'Tessin (TI)', 'Uri (UR)', 'Vaud (VD)', 'Valais (VS)', 'Zoug (ZG)', 'Zurich (ZH)'] - cantons_total_data = {"VD": [{"name": "Bureau d'information Femmes - BIF", "address": "Eglantine 6", "city": "Lausanne", "postal_code": 1006, "tel": "021 320 04 04", "website": "www.bif-vd.ch", "description": "Lieu d'écoute, accueil sans rendez-vous, gratuit et confidentialité garantie"}, {"name": "Les centres LAVI", "address": "Rue du Grand-Pont 2bis", "city": "Lausanne", "postal_code": 1003, "tel": "021 631 03 00", "website": "http://www.profa.ch/services-2/centre-lavi/#1525268514379-f98f76dd-1965", "description": "Centre d'aide aux victimes d'agressions violentes"}, {"name": "Les centres LAVI", "address": "Rue de la Plaine 2", "city": "Yverdon-les-Bains", "postal_code": 1400, "tel": "021 631 03 08", "website": "http://www.profa.ch/services-2/centre-lavi/#1525268514379-f98f76dd-1965", "description": "Centre d'aide aux victimes d'agressions violentes"}, {"name": "Les centres LAVI", "address": "Rue du Molage 36", "city": "Aigle", "postal_code": 1860, "tel": "021 631 03 04", "website": "http://www.profa.ch/services-2/centre-lavi/#1525268514379-f98f76dd-1965", "description": "Centre d'aide aux victimes d'agressions violentes"}, {"name": "Regional Social Center (CSR)", "address": "Place Chauderon 4", "city": "Lausanne", "postal_code": 1002, "tel": "021 316 52 21", "website": "https://www.vaudfamille.ch/N1320/lausanne-csr-centre-social-regional.html", "description": "Le CSR traite les problématiques suivantes: Allocation du Revenu d'Insertion; Mesures de réinsertion sociale; Appui social pour les personnes rencontrant toute forme de difficultés; Soutien et aide en cas de difficultés familiales, sociales, financiéres et de logement"}, {"name": "ProJuventute", "address": "Place Chauderon 24", "city": "Lausanne", "postal_code": 1003, "tel": "021 622 08 17", "website": "https://pj.projuventute.ch/index.php?id=3916&L=1", "description": "Fond de soutien aux famille - aide individuelle"}, {"name": "Centre d'accueil MalleyPrairie", "address": "Chemin de la Prairie 34", "city": "Lausanne", "postal_code": 1007, "tel": "021 620 76 76", "website": "https://malleyprairie.ch/", "description": "Pour les femmes et les hommes victimes de violences conjugales ou familiales"}, {"name": "Association avocats ressources en matiére de violence domistique", "address": "Rue de Bourg 47-49", "city": "Lausanne", "postal_code": 1002, "tel": "021 317 50 81", "website": "https://arvd.ch/", "description": "Réunir les avocats sensibilisés \u00e0 la problématique afin d'offrir un conseil et un soutien jurdique aux personnes concernées par la violence domestique"}, {"name": "Unité de médicine des violences (UMV) CHUV", "address": "Rue du Bugnon 44", "city": "Lausanne", "postal_code": 1011, "tel": "021 314 00 60", "website": "https://www.curml.ch/node/16", "description": "Consultation médico-légale pour adultes victimes de violences"}, {"name": "Unité de médicine des violences (UMV) l'Hopital d'Yverdon-les-Bains", "address": "Rue d'Entremonts 11", "city": "Yverdon-les-Bains", "postal_code": 1400, "tel": "024 424 42 20", "website": "https://www.curml.ch/node/16", "description": "Consultation médico-légale pour adultes victimes de violences"}, {"name": "Unité de médicine des violences (UMV) l'Hopital Riviera-Chablais", "address": "Route du Vieux-Séquola 20", "city": "Rennaz", "postal_code": 1847, "tel": "058 773 64 77", "website": "https://www.curml.ch/node/16", "description": "Consultation médico-légale pour adultes victimes de violences"}, {"name": "Unité de médicine des violence (UMV) Nyon", "address": "Avenue Reverdil 8", "city": "Nyon", "postal_code": 1260, "tel": "021 314 08 51", "website": "https://www.curml.ch/node/16", "description": "Consultation médico-légale pour adultes victimes de violences"}]} - - cantonData = []; - regex = /\(([^()]*)\)/g; + cantons = this.firebase.getCantons(); - locationData = []; + cantonData: MapPoint[] = []; + regex: RegExp = /\(([^()]*)\)/g; constructor(public mapsAPI: MapsAPILoader, private geocodeService: GeocodeService, private ref: ChangeDetectorRef, - public lang: LangService) { + public lang: LangService, + private firebase: FirebaseDataService) { this.translate = lang.getTranslateService(); - this.mapsAPI = mapsAPI; this.mapsAPI.load().then(() => { }); } getLocation(address: string, cp: string, city: string, isCanton: boolean) { this.geocodeService.geocodeAddress(address + ' ' + cp + ' ' + city) .subscribe((location: Location) => { - if (isCanton) - this.cantonCenter = location; - else - this.cantonData.filter((e) => e.address == address && e.city == city && e.code_postal == cp)[0].location = location; - this.ref.detectChanges(); + if (isCanton) { + this.cantonCenter = location; + } else { + const point: MapPoint = this.cantonData.filter((e) => e.address == address && e.city == city && e.postalCode == cp)[0]; + // Update db + point.latitude = '' + location.lat; + point.longitude = '' + location.lng; } - ); + this.ref.detectChanges(); + } + ); } getPosition() { - this.locationData = []; - this.getLocation('Canton of ' + this.cantonSelected, '', '', true); + this.getLocation('Canton of ' + this.cantonSelected, '', '', true); - if (this.cantonData !== undefined) { - this.centersFound = true; - this.cantonData.forEach((e) => { - this.getLocation(e.address, e.code_postal, e.city, false); - console.log(e); - }); - } else - this.centersFound = false; + if (this.cantonData !== undefined) { + this.centersFound = true; + this.cantonData.filter( + (e: MapPoint) => e.address !== '' && e.postalCode !== '' && e.city !== '' && e.latitude === '' && e.longitude === '' + ).forEach((e: MapPoint) => { + this.getLocation(e.address, e.postalCode, e.city, false); + console.log(e); + }); + } else { + this.centersFound = false; + } } - onSelect(value) { + async onSelect(value: string) { this.cantonSelected = this.cantons[value]; if (this.cantonSelected.match(this.regex) !== null) { const abbr = this.cantonSelected.match(this.regex)[0].substring(1, 3); - this.cantonData = this.cantons_total_data[abbr]; + this.cantonData = await this.firebase.getCantonData(abbr); + console.log(this.cantonSelected, this.cantonData); } this.getPosition(); } diff --git a/src/app/services/firebase-auth.service.ts b/src/app/services/firebase-auth.service.ts index 00ec1db..b6763a3 100644 --- a/src/app/services/firebase-auth.service.ts +++ b/src/app/services/firebase-auth.service.ts @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core'; - -import * as firebase from 'firebase'; +import { AngularFireAuth } from '@angular/fire/auth'; @Injectable({ providedIn: 'root' @@ -9,7 +8,7 @@ export class FirebaseAuthService { createNewUser(email: string, password: string) { return new Promise( (resolve, reject) => { - firebase.auth().createUserWithEmailAndPassword(email, password).then( + this.firebaseAuth.createUserWithEmailAndPassword(email, password).then( () => { resolve(); }, @@ -24,7 +23,7 @@ export class FirebaseAuthService { signInUser(email: string, password: string) { return new Promise( (resolve, reject) => { - firebase.auth().signInWithEmailAndPassword(email, password).then( + this.firebaseAuth.signInWithEmailAndPassword(email, password).then( () => { resolve(); }, @@ -37,8 +36,8 @@ export class FirebaseAuthService { } signOutUser() { - firebase.auth().signOut(); + this.firebaseAuth.signOut(); } - constructor() { } + constructor(private firebaseAuth: AngularFireAuth) { } } diff --git a/src/app/services/firebase-data.service.spec.ts b/src/app/services/firebase-data.service.spec.ts new file mode 100644 index 0000000..afdfe8f --- /dev/null +++ b/src/app/services/firebase-data.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { FirebaseDataService } from './firebase-data.service'; + +describe('FirebaseDataService', () => { + let service: FirebaseDataService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(FirebaseDataService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/firebase-data.service.ts b/src/app/services/firebase-data.service.ts new file mode 100644 index 0000000..d2118be --- /dev/null +++ b/src/app/services/firebase-data.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { AngularFireDatabase } from '@angular/fire/database'; +import { MapPoint } from '../interfaces/map-point'; +import * as sampleData from '../../assets/maps/cantons.json'; + +@Injectable({ + providedIn: 'root' +}) +export class FirebaseDataService { + constructor(protected firebaseDB: AngularFireDatabase) { } + regex: RegExp = /\(([^()]*)\)/g; + + getCantons(): string[] { + return (sampleData as any).default; + } + + async getCantonData(canton: string): Promise { + let results: MapPoint[] = []; + await new Promise((resolve, reject) => + this.firebaseDB.list('/safe-spaces/').valueChanges().subscribe((v: MapPoint[]) => + (v.length > 0) ? resolve(v) : reject({ error: 'No results '}) + ) + ).then((v: MapPoint[]) => + results = v.filter((mp: MapPoint) => mp.canton === canton) + ).catch((reason) => + console.log(reason) + ); + + return results; + } +} diff --git a/src/app/services/location-representation.ts b/src/app/services/location-representation.ts index f6a16ce..c82fe31 100644 --- a/src/app/services/location-representation.ts +++ b/src/app/services/location-representation.ts @@ -1,4 +1,4 @@ export interface Location { - lat: number; + lat: number; lng: number; - } \ No newline at end of file + } -- GitLab From 4f878aaafee94c0e739757d6d874ccd66f98f169 Mon Sep 17 00:00:00 2001 From: AtomicNicos Date: Sun, 26 Apr 2020 19:49:12 +0200 Subject: [PATCH 10/17] Firebase Auth Current User + Maps UI WIP --- src/app/maps/maps.component.css | 5 +++++ src/app/maps/maps.component.html | 14 +++++++++++--- src/app/services/firebase-auth.service.ts | 4 ++++ src/app/services/firebase-data.service.ts | 2 +- src/app/services/lang.service.ts | 1 - src/assets/i18n/de.json | 4 +++- src/assets/i18n/en.json | 4 +++- src/assets/i18n/fr.json | 4 +++- src/assets/i18n/it.json | 4 +++- 9 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/app/maps/maps.component.css b/src/app/maps/maps.component.css index ebda879..a8de609 100644 --- a/src/app/maps/maps.component.css +++ b/src/app/maps/maps.component.css @@ -5,3 +5,8 @@ agm-map { height: 50vh; } + +.target { + width: 100%; + background-color: lightblue; +} diff --git a/src/app/maps/maps.component.html b/src/app/maps/maps.component.html index a751d8a..8bbfc62 100644 --- a/src/app/maps/maps.component.html +++ b/src/app/maps/maps.component.html @@ -17,9 +17,17 @@ [latitude]="place.latitude" [longitude]="place.longitude"> - {{ place.name }}
- {{ place.address }}
- {{ place.website }} + {{ place.name }}
+ {{ place.address }}
+ {{ place.postalCode }}
+ {{ place.city }}
+ MAP.WEBSITE + +
+ {{ 'MAP.WHO' | translate }} :
+ {{ place.type }}
+

+
diff --git a/src/app/services/firebase-auth.service.ts b/src/app/services/firebase-auth.service.ts index b6763a3..c33bfdb 100644 --- a/src/app/services/firebase-auth.service.ts +++ b/src/app/services/firebase-auth.service.ts @@ -39,5 +39,9 @@ export class FirebaseAuthService { this.firebaseAuth.signOut(); } + getUser(): Promise { + return this.firebaseAuth.currentUser; + } + constructor(private firebaseAuth: AngularFireAuth) { } } diff --git a/src/app/services/firebase-data.service.ts b/src/app/services/firebase-data.service.ts index d2118be..34ef318 100644 --- a/src/app/services/firebase-data.service.ts +++ b/src/app/services/firebase-data.service.ts @@ -17,7 +17,7 @@ export class FirebaseDataService { async getCantonData(canton: string): Promise { let results: MapPoint[] = []; await new Promise((resolve, reject) => - this.firebaseDB.list('/safe-spaces/').valueChanges().subscribe((v: MapPoint[]) => + this.firebaseDB.list('/data/safe-spaces/').valueChanges().subscribe((v: MapPoint[]) => (v.length > 0) ? resolve(v) : reject({ error: 'No results '}) ) ).then((v: MapPoint[]) => diff --git a/src/app/services/lang.service.ts b/src/app/services/lang.service.ts index 5d6f968..2c48197 100644 --- a/src/app/services/lang.service.ts +++ b/src/app/services/lang.service.ts @@ -1,7 +1,6 @@ import { Injectable } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; -import { Subject, BehaviorSubject, Observable } from 'rxjs'; @Injectable({ providedIn: 'root' diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 4fb465f..c929801 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -52,7 +52,9 @@ }, "MAP": { "CANTONOF": "Kanton", - "SORRY": "Es tut uns leid, aber diese Seite ist eine Demo. Die Daten f\u00fcr diesen Kanton k\u00f6nnen nicht geladen werden" + "SORRY": "Es tut uns leid, aber diese Seite ist eine Demo. Die Daten f\u00fcr diesen Kanton k\u00f6nnen nicht geladen werden", + "WEBSITE": "Webseite", + "WHO": "Für wen" }, "FILES": { "TEST": "test.png" diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index c0aab1a..2bcb270 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -52,7 +52,9 @@ }, "MAP": { "CANTONOF": "Canton of", - "SORRY": "Sorry, this site is a demo. The data for your canton could not be loaded." + "SORRY": "Sorry, this site is a demo. The data for your canton could not be loaded.", + "WEBSITE": "Website", + "WHO": "Who for" }, "FILES": { "TEST": "test.png" diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index d71bbeb..a09cde9 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -52,7 +52,9 @@ }, "MAP": { "CANTONOF": "Canton de", - "SORRY": "Nous sommes d\u00e9sol\u00e9s, ce site est une d\u00e9mo. Nous n'avons pas encore pu charger les donn\u00e9es de votre canton." + "SORRY": "Nous sommes d\u00e9sol\u00e9s, ce site est une d\u00e9mo. Nous n'avons pas encore pu charger les donn\u00e9es de votre canton.", + "WEBSITE": "Site Web", + "WHO": "Pour qui" }, "FILES": { "TEST": "test.png" diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index 914194f..2f84c88 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -52,7 +52,9 @@ }, "MAP": { "CANTONOF": "Cantone di", - "SORRY": "Siamo spiacenti, questo sito \u00e9 una demo. Non siamo stati in grado di caricare i dati del tuo cantone" + "SORRY": "Siamo spiacenti, questo sito \u00e9 una demo. Non siamo stati in grado di caricare i dati del tuo cantone", + "WEBSITE": "Sito Internet", + "WHO": "Per chi" }, "FILES": { "TEST": "test.png" -- GitLab From b6bb649532c4a03ac0418f59a40ff50ecab5b60d Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 26 Apr 2020 20:05:08 +0200 Subject: [PATCH 11/17] Getting started done --- package-lock.json | 27 +- src/app/app-routing.module.ts | 8 + src/app/app.module.ts | 7 +- .../click-outside.directive.spec.ts | 12 + src/app/directives/click-outside.directive.ts | 31 ++ .../getting-started.component.css | 348 ++++++++++++++++++ .../getting-started.component.html | 51 ++- .../getting-started.component.ts | 57 ++- src/app/header/header.component.html | 1 + src/app/maps/maps.component.html | 5 +- src/assets/yana-tree-noHands.svg | 21 ++ src/styles.css | 3 +- 12 files changed, 555 insertions(+), 16 deletions(-) create mode 100644 src/app/directives/click-outside.directive.spec.ts create mode 100644 src/app/directives/click-outside.directive.ts create mode 100644 src/assets/yana-tree-noHands.svg diff --git a/package-lock.json b/package-lock.json index d32346a..16267e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13800,7 +13800,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -13843,7 +13844,8 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", @@ -13854,7 +13856,8 @@ "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -13971,7 +13974,8 @@ "inherits": { "version": "2.0.4", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -13983,6 +13987,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -14012,6 +14017,7 @@ "version": "2.9.0", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -14030,6 +14036,7 @@ "version": "0.5.3", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "^1.2.5" } @@ -14133,6 +14140,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -14210,7 +14218,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -14246,6 +14255,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -14265,6 +14275,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -14308,12 +14319,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index e2c56a4..fcf1cbe 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -16,6 +16,10 @@ const routes: Routes = [ redirectTo: '/preventive-measures', pathMatch: 'full' }, + { + path: 'getting-started', + component: GettingStartedComponent + }, { path: 'maps', component: MapsComponent @@ -39,6 +43,10 @@ const routes: Routes = [ { path: 'signup', component: SignupComponent + }, + { + path: 'maps/:canton', + component: MapsComponent } ]; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 2204cd9..b32ad19 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -57,9 +57,10 @@ export function HttpLoaderFactory(http: HttpClient) { return new TranslateHttpLoader(http); } -import { FormsModule } from '@angular/forms'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AgmCoreModule, GoogleMapsAPIWrapper } from '@agm/core'; import { GeocodeService } from './services/geocode.service'; +import { ClickOutsideDirective } from './directives/click-outside.directive'; @NgModule({ @@ -74,7 +75,8 @@ import { GeocodeService } from './services/geocode.service'; ArticleComponent, NavButtonComponent, LoginComponent, - SignupComponent + SignupComponent, + ClickOutsideDirective ], imports: [ BrowserModule, @@ -82,6 +84,7 @@ import { GeocodeService } from './services/geocode.service'; CommonModule, HttpClientModule, FormsModule, + ReactiveFormsModule, AgmCoreModule.forRoot({ apiKey: 'AIzaSyD9crBwGrLUT3_iH_wi1ZqKNhGhwjzHp5I' }), diff --git a/src/app/directives/click-outside.directive.spec.ts b/src/app/directives/click-outside.directive.spec.ts new file mode 100644 index 0000000..a78541f --- /dev/null +++ b/src/app/directives/click-outside.directive.spec.ts @@ -0,0 +1,12 @@ +import { ClickOutsideDirective } from './click-outside.directive'; + +describe('ClickOutsideDirective', () => { + it('should create an instance', () => { + let elRefMock = { + nativeElement: document.createElement('div') //Mock + }; + console.log("spec"); + const directive = new ClickOutsideDirective(elRefMock); + expect(directive).toBeTruthy(); + }); +}); diff --git a/src/app/directives/click-outside.directive.ts b/src/app/directives/click-outside.directive.ts new file mode 100644 index 0000000..4946e19 --- /dev/null +++ b/src/app/directives/click-outside.directive.ts @@ -0,0 +1,31 @@ +import { Directive, Input, Output, EventEmitter, ElementRef, HostListener, OnInit, OnDestroy } from '@angular/core'; +import { Subject, Subscription } from 'rxjs'; + +@Directive({ + selector: '[appClickOutside]', +}) +export class ClickOutsideDirective implements OnInit, OnDestroy { + @Output() clickOutside: EventEmitter = new EventEmitter(false); + + private clicksOutside = new Subject(); + private subscription: Subscription; + + constructor(private elementRef: ElementRef) { } + + ngOnInit() { + this.subscription = this.clicksOutside + .subscribe((e: boolean) => this.clickOutside.emit(e)); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + @HostListener('document:click', ['$event.target']) + public onListenerTriggered(target: ElementRef) { + const clickedInside = this.elementRef.nativeElement.contains(target); + if(!clickedInside){ + this.clicksOutside.next(!clickedInside); + } + } +} diff --git a/src/app/getting-started/getting-started.component.css b/src/app/getting-started/getting-started.component.css index e69de29..029e5e4 100644 --- a/src/app/getting-started/getting-started.component.css +++ b/src/app/getting-started/getting-started.component.css @@ -0,0 +1,348 @@ +#background{ + position: relative; + width: 100%; + height: 100vh; + background: #8C93D8; + padding-right: 7.5%; + padding-left: 7.5%; + overflow: auto; + overflow-x: hidden; +} + +.overflow{ + position: absolute; + right: 0%; + top: 0; + width: 40%; + height: 110vh; + overflow: hidden; + pointer-events: none; +} + +.overflow img{ + position: absolute; + width: 140%; + height: 140%; + margin-right: -100%; + margin-top: -60%; +} + +.flexbox{ + position: relative; + display: flex; +} + +#title{ + position: relative; + width: 55%; + float: left; + display: flex; + flex-direction: column; + align-items: center; +} + +#title > h1{ + position: relative; + + font-family: 'Nova Round', cursive; + font-style: normal; + font-weight: normal; + margin: 0; + font-size: 122px; + align-items: center; + text-align: center; + font-feature-settings: 'kern' off; + + color: #FF9848; + + text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25), 0px 4px 4px rgba(0, 0, 0, 0.25); +} + +#title > h2{ + position: relative; + + font-family: 'Nova Round', cursive; + font-style: normal; + font-weight: normal; + font-size: 52px; + margin: 1% 0; + align-items: center; + text-align: center; + + color: #FF9848; + + text-shadow: 1px 2px 1px rgba(0, 0, 0, 0.4); +} + +#title > .line1{ + width: 100%; + border: 3px solid #999FDE; +} + +#title > p{ + position: relative; + + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 24px; + margin: 3% 0; + line-height: 29px; + align-items: center; + text-align: center; + + color: #2E3192; +} + +.emergency{ + position: relative; + + padding: 2%; + margin: 5% 0; + + border: 4px solid #FF9848; + box-sizing: border-box; + border-radius: 28.9474px; + + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 24px; + line-height: 28px; + align-items: center; + text-align: center; + + color: #FFFAE7; +} + +span{ + color: #FF9848; +} + +#inputbox{ + position: relative; + width: 85%; + + justify-self: center; + display: flex; + flex-direction: column; + align-items: center; + background: #FFFFFF; + box-shadow: 0px 3px 10px rgba(255, 152, 72, 0.28); + border-radius: 31px; +} + +#inputbox > h2{ + position: relative; + width: 90%; + padding-top: 1%; + + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 36px; + line-height: 44px; + justify-self: center; + + color: #2E3192; +} + +#inputbox > .line2{ + position: relative; + height: 0px; + width: 95%; + justify-self: center; + text-align: center; + border: 1px solid #BEBEBE; +} + +#optionbox{ + width: 80%; + height: 100%; + display: flex; + flex-direction: column; +} + +.selbox{ + border: 2px solid #FC5C14; + box-sizing: border-box; + border-radius: 30px; + justify-items: center; + justify-content: center; + display: flex; + align-items: center; + margin: 2% 0; + transition-duration: 0.4s; +} + +.selbox:hover{ + background: #FF9848; + color: #FFFFFF; + cursor: pointer; + +} + +.selbox:hover > p{ + color: #FFFFFF; +} + +.langboxes{ + position: relative; + display: flex; + justify-content: space-evenly; +} + +.langboxes > .selbox{ + position: relative; + width: 6vw; + height: 4vw; +} + +.selbox > p{ + position: relative; + margin-bottom: 0; + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 24px; + text-align: center; + + color: #FC5C14; +} + +.cantonbox{ + height: 4vw; +} + +.age{ + position: relative; + display: flex; + align-items: flex-start; + justify-content: space-evenly; +} + +.age > .selbox{ + position: relative; + width: 30%; + height: 4vw; +} + +.submitbox{ + position: relative; + display: flex; + justify-content: space-evenly; +} + +.submit{ + border: 2px solid #8C93D8; +} + +.submit > p{ + color: #2E3192;} + +.submitbox > .selbox{ + position: relative; + width: 13vw; + height: 4vw; +} + +.submitbox .selbox:hover{ + background: #2E3192; + color: #FFFFFF; +} + +.submitbox .selbox:hover > p{ + color: #FFFFFF; +} + +.selected{ + background: #FF9848; +} + +.selected > p{ + color: #FFFFFF; +} + + + + +/*auto-suggest form*/ + + +.filter-wrapper, +.keyword-wrapper { + display: flex; + justify-content: center; +} +.filter-wrapper { + min-height: 100%; + flex-flow: column wrap; + position: relative; +} +.keyword-wrapper { + width: 100%; + position: relative; +} +#keyword { + border: 1px solid #ccc; + box-sizing: border-box; + border-radius: 30px; + padding: 10px; + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 24px; + text-align: center; + width: 50%; + outline: none; + transition: border 0.5s ease-in-out +} +#keyword:focus { + border-color : rgba(81, 203, 238, 1);; +} + +.filter-select { + width: 50%; + margin-top: 1%; + font-family: 'Montserrat', sans-serif; + font-style: normal; + font-weight: normal; + font-size: 24px; + text-align: center; + font-size: 1.1em; + color: rgb(105, 105, 105); + border: 1px solid #ccc; + box-sizing: border-box; + border-radius: 50; + + position: absolute; + z-index: 99; + left: 25%; + top: calc(50% + 25px); + max-height: 500%; + overflow-y: auto; + background: #fff; + padding-inline-start: 0px; + } + + + .filter-select-list:hover .tags { + color: #fff; + } + .filter-select-list { + cursor: pointer; + padding: 10px 10px; + } + .artist-name { + display: inline-block; + position: absolute; + } + .filter-select-list:hover { + background: #C0C0C0; + color: #fff + } + .list-highlight, + .list-highlight:hover { + background: rgb(55, 55, 55); + color: #fff + } \ No newline at end of file diff --git a/src/app/getting-started/getting-started.component.html b/src/app/getting-started/getting-started.component.html index 842470a..8ec9ab9 100644 --- a/src/app/getting-started/getting-started.component.html +++ b/src/app/getting-started/getting-started.component.html @@ -1 +1,50 @@ -

getting-started works!

+
+
+
+

YANA.help

+

You Are Not Alone

+
+

Welcome to the safe place ! Here you can find help and useful information. Come and join the community !

+
Are you in an emergency ? Call 147 or find help near you
+
+
+

Find help

+
+
+
+
+

{{ language }}

+
+
+
+
+
+ +
+
    +
  • +

    {{result}}

    +
+
+
+
+
+

I am a child

+
+
+

I am an adult

+
+
+
+
+

Get Started

+
+
+
+
+
+
+ YANA tree +
+
+ diff --git a/src/app/getting-started/getting-started.component.ts b/src/app/getting-started/getting-started.component.ts index 91d9ed4..617ecfc 100644 --- a/src/app/getting-started/getting-started.component.ts +++ b/src/app/getting-started/getting-started.component.ts @@ -1,4 +1,8 @@ import { Component, OnInit } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { LangService } from '../services/lang.service'; +import { FormControl } from '@angular/forms'; +import * as sampleData from '../../assets/maps/cantons.json'; @Component({ selector: 'app-getting-started', @@ -7,9 +11,60 @@ import { Component, OnInit } from '@angular/core'; }) export class GettingStartedComponent implements OnInit { - constructor() { } + isClicked: boolean = false; + translate: TranslateService; + langSelector: any = null; + ageSelector: any = null; + cantonSelector: String = null; + queryField: FormControl = new FormControl(); + show: boolean = false; + results: any[] = []; + cantons: String[] = (sampleData as any).default; + + constructor(public lang: LangService) { + this.translate = lang.getTranslateService(); + } + + onClickLang(button): void { + if (this.langSelector === button) { + this.langSelector = null; + } else { + this.langSelector = button; + } + } + + onClickAge(button): void { + if (this.ageSelector === button) { + this.ageSelector = null; + } else { + this.ageSelector = button; + } + } + + suggest(data : string){ + var newArr = this.cantons.filter(canton => canton.toLowerCase().includes(data.toLowerCase())); + console.log(newArr); + return newArr; + } + + send(){ + console.log(this.queryField.value + " waw"); + if(this.queryField.value == null){ + this.results = this.cantons; + this.show = true; + console.log("sent"); + } + } + + change(result){ + this.cantonSelector = result; + this.queryField.setValue(result); + this.show = false; + } ngOnInit(): void { + this.queryField.valueChanges + .subscribe(query => this.results = this.suggest(query)); } } diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html index 470ee00..8fcbb7c 100644 --- a/src/app/header/header.component.html +++ b/src/app/header/header.component.html @@ -11,6 +11,7 @@ - - - + \ No newline at end of file diff --git a/src/assets/yana-tree-noHands.svg b/src/assets/yana-tree-noHands.svg new file mode 100644 index 0000000..d755af5 --- /dev/null +++ b/src/assets/yana-tree-noHands.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/styles.css b/src/styles.css index e50a47e..71ae9b1 100644 --- a/src/styles.css +++ b/src/styles.css @@ -1 +1,2 @@ -/* You can add global styles to this file, and also import other style files */ \ No newline at end of file +/* You can add global styles to this file, and also import other style files */ +@import url('https://fonts.googleapis.com/css2?family=Montserrat&family=Nova+Round&display=swap'); \ No newline at end of file -- GitLab From e911180535be5c2f2e2194e3a26bbac81e870dff Mon Sep 17 00:00:00 2001 From: AtomicNicos Date: Sun, 26 Apr 2020 21:41:26 +0200 Subject: [PATCH 12/17] i18n services/map --- src/app/community/community.component.html | 7 +-- src/app/maps/maps.component.css | 27 ++++++++++ src/app/maps/maps.component.html | 27 ++++++---- src/app/maps/maps.component.ts | 19 ++++--- src/app/services/firebase-data.service.ts | 16 ++++++ src/app/services/geocode.service.ts | 63 +++++++++++----------- src/assets/i18n/de.json | 4 +- src/assets/i18n/en.json | 4 +- src/assets/i18n/fr.json | 4 +- src/assets/i18n/it.json | 4 +- 10 files changed, 119 insertions(+), 56 deletions(-) diff --git a/src/app/community/community.component.html b/src/app/community/community.component.html index 3bf70cd..4bb3ed2 100644 --- a/src/app/community/community.component.html +++ b/src/app/community/community.component.html @@ -14,8 +14,9 @@ alt="user" width="50" class="rounded-circle">
-
{{ user }}
{{time | date:"yyyy-MM-dd"}} +
{{ user }}
+ + {{time | date:"yyyy-MM-dd"}}

{{ message }}

@@ -105,4 +106,4 @@ - \ No newline at end of file + diff --git a/src/app/maps/maps.component.css b/src/app/maps/maps.component.css index a8de609..258a085 100644 --- a/src/app/maps/maps.component.css +++ b/src/app/maps/maps.component.css @@ -10,3 +10,30 @@ agm-map { width: 100%; background-color: lightblue; } + +.description { + width: 100%; + background-color: lightgreen +} + +.content-header { + background-color: gray; + padding: 20px 0px 10px 0px; + align-items: middle; + font-size: 18pt; +} + +.content-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); +} + +.content-grid > * { + padding: 5px; + background-color: whitesmoke; + border-radius: 5px; +} + +.content-grid > * > p { + word-wrap: break-word; +} diff --git a/src/app/maps/maps.component.html b/src/app/maps/maps.component.html index 8bbfc62..50c5c80 100644 --- a/src/app/maps/maps.component.html +++ b/src/app/maps/maps.component.html @@ -21,19 +21,28 @@ {{ place.address }}
{{ place.postalCode }}
{{ place.city }}
- MAP.WEBSITE - -
- {{ 'MAP.WHO' | translate }} :
- {{ place.type }}
-

- + MAP.WEBSITE
+ {{ place.tel }}
+ {{ 'MAP.WHO' | translate }} : {{ place.type }}
-
-

{{d.name}}
{{d.address}}
{{d.postal_code}} {{ d.city }}
{{ d.tel }}
{{ d.website }}

+
+

{{t.key}}

+

MAP.UNCATEGORIZED

+
+
+

+ {{d.name}}
+ {{d.address}}
+ {{d.postalCode}} {{ d.city }}
+ {{ d.tel }}
+ MAP.WEBSITE
+ {{ 'MAP.DESCRIPTION' | translate }} : {{ d.description }}
+

+
+
diff --git a/src/app/maps/maps.component.ts b/src/app/maps/maps.component.ts index 133662f..feb31c3 100644 --- a/src/app/maps/maps.component.ts +++ b/src/app/maps/maps.component.ts @@ -7,7 +7,6 @@ import { TranslateService } from '@ngx-translate/core'; import { FirebaseDataService } from '../services/firebase-data.service'; import { MapPoint } from '../interfaces/map-point'; - @Component({ selector: 'app-maps', templateUrl: './maps.component.html', @@ -20,8 +19,10 @@ export class MapsComponent implements OnInit { cantonCenter: Location = { lat: 46.9479222, lng: 7.4446085 }; translate: TranslateService; + typeMap: {}; + cantonSelected = ''; - cantons = this.firebase.getCantons(); + cantons = this.firebaseDB.getCantons(); cantonData: MapPoint[] = []; regex: RegExp = /\(([^()]*)\)/g; @@ -30,7 +31,7 @@ export class MapsComponent implements OnInit { private geocodeService: GeocodeService, private ref: ChangeDetectorRef, public lang: LangService, - private firebase: FirebaseDataService) { + private firebaseDB: FirebaseDataService) { this.translate = lang.getTranslateService(); this.mapsAPI.load().then(() => { }); } @@ -42,9 +43,9 @@ export class MapsComponent implements OnInit { this.cantonCenter = location; } else { const point: MapPoint = this.cantonData.filter((e) => e.address == address && e.city == city && e.postalCode == cp)[0]; - // Update db point.latitude = '' + location.lat; point.longitude = '' + location.lng; + this.firebaseDB.updatePoint(point); } this.ref.detectChanges(); } @@ -60,7 +61,6 @@ export class MapsComponent implements OnInit { (e: MapPoint) => e.address !== '' && e.postalCode !== '' && e.city !== '' && e.latitude === '' && e.longitude === '' ).forEach((e: MapPoint) => { this.getLocation(e.address, e.postalCode, e.city, false); - console.log(e); }); } else { this.centersFound = false; @@ -71,8 +71,13 @@ export class MapsComponent implements OnInit { this.cantonSelected = this.cantons[value]; if (this.cantonSelected.match(this.regex) !== null) { const abbr = this.cantonSelected.match(this.regex)[0].substring(1, 3); - this.cantonData = await this.firebase.getCantonData(abbr); - console.log(this.cantonSelected, this.cantonData); + this.cantonData = await this.firebaseDB.getCantonData(abbr); + this.typeMap = {}; + for (const t of this.cantonData) { + (!(t.type in this.typeMap)) ? this.typeMap[t.type] = [] : null; + this.typeMap[t.type].push(t); + } + console.log(this.typeMap); } this.getPosition(); } diff --git a/src/app/services/firebase-data.service.ts b/src/app/services/firebase-data.service.ts index 34ef318..51cae1a 100644 --- a/src/app/services/firebase-data.service.ts +++ b/src/app/services/firebase-data.service.ts @@ -28,4 +28,20 @@ export class FirebaseDataService { return results; } + + async updatePoint(point: MapPoint) { + const ref = this.firebaseDB.database.ref('data/safe-spaces'); + ref.orderByChild('name') + .equalTo(point.name) + .orderByChild('address') + .equalTo(point.address) + .orderByChild('postalCode') + .equalTo(point.postalCode) + .once('value', (snapshot: firebase.database.DataSnapshot) => { + snapshot.forEach((s) => { + s.ref.update({ latitude: parseFloat(point.latitude), longitude: parseFloat(point.longitude) }); + }); + } + ); + } } diff --git a/src/app/services/geocode.service.ts b/src/app/services/geocode.service.ts index 83ee1fb..2aa6de6 100644 --- a/src/app/services/geocode.service.ts +++ b/src/app/services/geocode.service.ts @@ -9,44 +9,41 @@ declare var google: any; @Injectable() export class GeocodeService { private geocoder: any; - + constructor(private mapLoader: MapsAPILoader) {} - + private initGeocoder() { - console.log('Init geocoder!'); this.geocoder = new google.maps.Geocoder(); } - + private waitForMapsToLoad(): Observable { - if(!this.geocoder) { + if (!this.geocoder) { return from(this.mapLoader.load()) - .pipe( - tap(() => this.initGeocoder()), - map(() => true) + .pipe( + tap(() => this.initGeocoder()), + map(() => true) ); - } - return of(true); } - - geocodeAddress(location: string): Observable { - console.log('Start geocoding!'); - return this.waitForMapsToLoad().pipe( - switchMap(() => { - return new Observable(observer => { - this.geocoder.geocode({'address': location}, (results, status) => { - if (status == google.maps.GeocoderStatus.OK) { - console.log('Geocoding complete!'); - observer.next({ - lat: results[0].geometry.location.lat(), - lng: results[0].geometry.location.lng() - }); - } else { - console.log('Error - ', results, ' & Status - ', status); - observer.next({lat: 0, lng: 0}); - } - }); - }) - }) - )} - - } \ No newline at end of file + return of(true); + } + + geocodeAddress(location: string): Observable { + return this.waitForMapsToLoad().pipe( + switchMap(() => { + return new Observable(observer => { + this.geocoder.geocode({ address: location }, (results, status) => { + if (status == google.maps.GeocoderStatus.OK) { + observer.next({ + lat: results[0].geometry.location.lat(), + lng: results[0].geometry.location.lng() + }); + } else { + console.log('Error - ', results, ' & Status - ', status); + observer.next({lat: 0, lng: 0}); + } + }); + }); + }) + ); + } +} diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index c929801..1ac1d96 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -54,7 +54,9 @@ "CANTONOF": "Kanton", "SORRY": "Es tut uns leid, aber diese Seite ist eine Demo. Die Daten f\u00fcr diesen Kanton k\u00f6nnen nicht geladen werden", "WEBSITE": "Webseite", - "WHO": "Für wen" + "WHO": "Für wen", + "DESCRIPTION": "Beschreibung", + "UNCATEGORIZED": "Unkategorisiert" }, "FILES": { "TEST": "test.png" diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 2bcb270..d0c4fb7 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -54,7 +54,9 @@ "CANTONOF": "Canton of", "SORRY": "Sorry, this site is a demo. The data for your canton could not be loaded.", "WEBSITE": "Website", - "WHO": "Who for" + "WHO": "Who for", + "DESCRIPTION": "Description", + "UNCATEGORIZED": "Uncategorized" }, "FILES": { "TEST": "test.png" diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index a09cde9..f44dcfa 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -54,7 +54,9 @@ "CANTONOF": "Canton de", "SORRY": "Nous sommes d\u00e9sol\u00e9s, ce site est une d\u00e9mo. Nous n'avons pas encore pu charger les donn\u00e9es de votre canton.", "WEBSITE": "Site Web", - "WHO": "Pour qui" + "WHO": "Pour qui", + "DESCRIPTION": "Description", + "UNCATEGORIZED": "Non class\u00e9" }, "FILES": { "TEST": "test.png" diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index 2f84c88..98a0cf0 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -54,7 +54,9 @@ "CANTONOF": "Cantone di", "SORRY": "Siamo spiacenti, questo sito \u00e9 una demo. Non siamo stati in grado di caricare i dati del tuo cantone", "WEBSITE": "Sito Internet", - "WHO": "Per chi" + "WHO": "Per chi", + "DESCRIPTION": "Descrizione", + "UNCATEGORIZED": "Senza categoria" }, "FILES": { "TEST": "test.png" -- GitLab From 1c7408492895c6da0d8498d7e5e52ed1a5c6a3dc Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 26 Apr 2020 22:52:02 +0200 Subject: [PATCH 13/17] first mezzo fix for login and signup --- .../getting-started.component.css | 9 ++- src/app/login/login.component.css | 24 ++++--- src/app/login/login.component.html | 63 +++++++++---------- src/app/signup/signup.component.css | 19 +++--- 4 files changed, 54 insertions(+), 61 deletions(-) diff --git a/src/app/getting-started/getting-started.component.css b/src/app/getting-started/getting-started.component.css index 029e5e4..f3d0620 100644 --- a/src/app/getting-started/getting-started.component.css +++ b/src/app/getting-started/getting-started.component.css @@ -1,12 +1,11 @@ #background{ position: relative; - width: 100%; + width: calc(100%-20rem); height: 100vh; background: #8C93D8; - padding-right: 7.5%; - padding-left: 7.5%; - overflow: auto; - overflow-x: hidden; + padding: 0 6%; + display: inline-flex; + overflow: hidden; } .overflow{ diff --git a/src/app/login/login.component.css b/src/app/login/login.component.css index ed28a07..eaf8892 100644 --- a/src/app/login/login.component.css +++ b/src/app/login/login.component.css @@ -1,3 +1,12 @@ +.back{ + height: 100vh; + width: calc(100vw - 20rem); + background: #FFFAE7; + background-image: url(../../assets/images/yana-tree-noHands.svg); + background-repeat: space; + background-position: bottom; +} + form { text-align: center; min-width: 300px; @@ -25,13 +34,11 @@ h2{ margin-left: 34%; margin-top: 10%; - color: #2E3192; font-style: normal; } - .form-group{ padding-top: 2%; margin-left: 5%; @@ -137,22 +144,13 @@ button{ border-radius: 28.9474px; box-sizing: border-box; margin-left: 30%; - margin-top: 2%; + padding-top: 2%; } -.back{ - - height: 850px; - background: #FFFAE7; - background-image: url(../../assets/images/yana-tree-noHands.svg); - background-repeat: space; - background-image-size: 100%; - background-position: bottom; -} p{ - ont-family: Montserrat; + font-family: Montserrat; font-weight: normal; font-size: 22px; line-height: 27px; diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html index 6f2b546..cc373c4 100644 --- a/src/app/login/login.component.html +++ b/src/app/login/login.component.html @@ -1,38 +1,35 @@
-
-
-
Are you in an emergency ? Call 147 or find help near you
-
-

Login

-
-
- - -
-
- - -
- Forgot password? - -

Don't have an account yet?

- Sign Up -
-

{{ errorMessage }}

-
-
- -
- +
+
Are you in an emergency ? Call 147 or find help near you
+
+

Login

+
+
+ + +
+
+ + +
+ Forgot password? + +

Don't have an account yet?

+ Sign Up +
+

{{ errorMessage }}

+
+ + diff --git a/src/app/signup/signup.component.css b/src/app/signup/signup.component.css index 63461cb..3114d08 100644 --- a/src/app/signup/signup.component.css +++ b/src/app/signup/signup.component.css @@ -1,3 +1,11 @@ +.back{ + width: calc(100vw - 20rem); + height: 100vh; + background: #FFFAE7; + background-image: url(../../assets/images/yana-tree-noHands.svg); + background-repeat: space; + background-position: bottom; +} form { text-align: center; @@ -138,19 +146,10 @@ button{ border-radius: 28.9474px; box-sizing: border-box; margin-left: 30%; - margin-top: 2%; + padding-top: 2%; } -.back{ - - height: 850px; - background: #FFFAE7; - background-image: url(../../assets/images/yana-tree-noHands.svg); - background-repeat: space; - background-image-size: 100%; - background-position: bottom; -} -- GitLab From 2f990fcef4df35d39f708d29ad78bbf0c0f5c5fb Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 26 Apr 2020 22:56:23 +0200 Subject: [PATCH 14/17] suggest box fix --- src/app/getting-started/getting-started.component.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/getting-started/getting-started.component.css b/src/app/getting-started/getting-started.component.css index f3d0620..f5aae28 100644 --- a/src/app/getting-started/getting-started.component.css +++ b/src/app/getting-started/getting-started.component.css @@ -318,7 +318,7 @@ span{ z-index: 99; left: 25%; top: calc(50% + 25px); - max-height: 500%; + max-height: 400%; overflow-y: auto; background: #fff; padding-inline-start: 0px; -- GitLab From 80b5f69dc2ab654719f78b996502f6cc57e1d75d Mon Sep 17 00:00:00 2001 From: AtomicNicos Date: Mon, 27 Apr 2020 00:28:06 +0200 Subject: [PATCH 15/17] Open links in new window. --- src/app/maps/maps.component.html | 89 ++++++++++++++++---------------- 1 file changed, 45 insertions(+), 44 deletions(-) diff --git a/src/app/maps/maps.component.html b/src/app/maps/maps.component.html index 50c5c80..728166a 100644 --- a/src/app/maps/maps.component.html +++ b/src/app/maps/maps.component.html @@ -1,50 +1,51 @@
- + -

{{ 'MAP.CANTONOF' | translate }} {{cantonSelected}}

- -

MAP.SORRY

- - - - {{ place.name }}
- {{ place.address }}
- {{ place.postalCode }}
- {{ place.city }}
- MAP.WEBSITE
- {{ place.tel }}
- {{ 'MAP.WHO' | translate }} : {{ place.type }}
-
-
-
+

{{ 'MAP.CANTONOF' | translate }} {{cantonSelected}}

+ +

MAP.SORRY

+ + + + {{ place.name }}
+ {{ place.address }}
+ {{ place.postalCode }}
+ {{ place.city }}
+ MAP.WEBSITE
+ {{ place.tel }}
+ MAP.WEBSITE
+ {{ place.tel }}
+ {{ 'MAP.WHO' | translate }} : {{ place.type }}
+
+
+
-
-

{{t.key}}

-

MAP.UNCATEGORIZED

-
-
-

- {{d.name}}
- {{d.address}}
- {{d.postalCode}} {{ d.city }}
- {{ d.tel }}
- MAP.WEBSITE
- {{ 'MAP.DESCRIPTION' | translate }} : {{ d.description }}
-

-
+
+

{{t.key}}

+

MAP.UNCATEGORIZED

+
+
+

+ {{d.name}}
+ {{d.address}}
+ {{d.postalCode}} {{ d.city }}
+ {{ d.tel }}
+ MAP.WEBSITE
+ {{ d.tel }}
+ MAP.WEBSITE
+ {{ 'MAP.DESCRIPTION' | translate }} : {{ d.description }}
+

+
- - - -- GitLab From eea9b781fe39dd0700b48cbf3f13b79582fe9a84 Mon Sep 17 00:00:00 2001 From: AtomicNicos Date: Mon, 27 Apr 2020 13:21:15 +0200 Subject: [PATCH 16/17] CSS Fixes --- src/app/app.module.ts | 5 +- src/app/community/community.component.html | 2 +- src/app/community/european-date.pipe.spec.ts | 8 ++ src/app/community/european-date.pipe.ts | 16 +++ src/app/header/header.component.css | 6 +- src/app/header/header.component.html | 6 +- src/app/login/login.component.css | 99 +++++++++-------- src/app/login/login.component.html | 26 +++-- src/app/maps/maps.component.css | 51 +++++++-- src/app/maps/maps.component.html | 56 +++++----- src/app/signup/signup.component.css | 107 +++++++++++-------- src/app/signup/signup.component.html | 60 +++++------ src/assets/favicon.png | Bin 55986 -> 0 bytes src/assets/favicon.svg | 1 + 14 files changed, 268 insertions(+), 175 deletions(-) create mode 100644 src/app/community/european-date.pipe.spec.ts create mode 100644 src/app/community/european-date.pipe.ts delete mode 100644 src/assets/favicon.png create mode 100644 src/assets/favicon.svg diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 2b8a180..6dc1f28 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -20,7 +20,6 @@ import { SignupComponent } from './signup/signup.component'; import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; import { TranslateHttpLoader } from '@ngx-translate/http-loader'; import { LOCALE_ID } from '@angular/core'; - import { NavButtonComponent } from './header/nav-button/nav-button.component'; // Firebase @@ -58,6 +57,7 @@ import { GeocodeService } from './services/geocode.service'; import { ResetpasswordComponent } from './resetpassword/resetpassword.component'; import { ThankyouComponent } from './thankyou/thankyou.component'; import { ClickOutsideDirective } from './directives/click-outside.directive'; +import { EuropeanDatePipe } from './community/european-date.pipe'; @NgModule({ @@ -75,7 +75,8 @@ import { ClickOutsideDirective } from './directives/click-outside.directive'; SignupComponent, ClickOutsideDirective, ResetpasswordComponent, - ThankyouComponent + ThankyouComponent, + EuropeanDatePipe ], imports: [ BrowserModule, diff --git a/src/app/community/community.component.html b/src/app/community/community.component.html index 4bb3ed2..639041a 100644 --- a/src/app/community/community.component.html +++ b/src/app/community/community.component.html @@ -16,7 +16,7 @@
{{ user }}
- {{time | date:"yyyy-MM-dd"}} + {{time | europeanDate}}

{{ message }}

diff --git a/src/app/community/european-date.pipe.spec.ts b/src/app/community/european-date.pipe.spec.ts new file mode 100644 index 0000000..e122e0b --- /dev/null +++ b/src/app/community/european-date.pipe.spec.ts @@ -0,0 +1,8 @@ +import { EuropeanDatePipe } from './european-date.pipe'; + +describe('EuropeanDatePipe', () => { + it('create an instance', () => { + const pipe = new EuropeanDatePipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/community/european-date.pipe.ts b/src/app/community/european-date.pipe.ts new file mode 100644 index 0000000..55c405a --- /dev/null +++ b/src/app/community/european-date.pipe.ts @@ -0,0 +1,16 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DatePipe } from '@angular/common'; +import { LangService } from '../services/lang.service'; + +@Pipe({ + name: 'europeanDate' +}) +export class EuropeanDatePipe implements PipeTransform { + constructor(private lang: LangService) { } + + transform(value: any, pattern: string = 'yyyy-MM-dd'): any { + const datePipe: DatePipe = new DatePipe(this.lang.browserLang); + return datePipe.transform(value, pattern); + } + +} diff --git a/src/app/header/header.component.css b/src/app/header/header.component.css index d006438..486fc49 100644 --- a/src/app/header/header.component.css +++ b/src/app/header/header.component.css @@ -10,6 +10,10 @@ background-color: #8C93D8; } +#logo { + padding-top: 20px; +} + .nav__list { list-style: none; margin: 0; @@ -92,4 +96,4 @@ option { .logo-center { margin: auto; -} \ No newline at end of file +} diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html index 17e1b7a..ccfeed2 100644 --- a/src/app/header/header.component.html +++ b/src/app/header/header.component.html @@ -1,6 +1,6 @@ -
\ No newline at end of file + diff --git a/src/app/login/login.component.css b/src/app/login/login.component.css index eaf8892..bcde918 100644 --- a/src/app/login/login.component.css +++ b/src/app/login/login.component.css @@ -7,6 +7,12 @@ background-position: bottom; } +.row { + display: flex; + text-align: center; + justify-content: center; +} + form { text-align: center; min-width: 300px; @@ -20,42 +26,36 @@ form { display: flex; flex-direction: column; justify-content: center; - margin-left: 50%; - margin-top: 5%; + margin-top: 40px; +} + +.form-container { + display: flex; + margin: 0 auto; } h2{ padding-bottom: 5%; - font-family: Montserrat; font-weight: 500; font-size: 36px; line-height: 44px; - display: flex; - margin-left: 34%; - margin-top: 10%; - + color: #2E3192; font-style: normal; } -.form-group{ +.form-group { padding-top: 2%; - margin-left: 5%; - margin-right: 5%; + margin: 0 5%; text-align: left; } -input[type=text] { +input { background: #FFFFFF; border: 1px solid #EBDDFF; box-sizing: border-box; -} - -input[type=password] { - background: #FFFFFF; - box-sizing: border-box; - border: 1px solid #EBDDFF; + width: 100%; } #line { @@ -66,7 +66,7 @@ input[type=password] { margin-bottom: 15%; } -.label{ +.label { font-family: Montserrat; font-weight: normal; font-size: 22px; @@ -74,12 +74,12 @@ input[type=password] { display: flex; align-items: center; text-align: center; - + color: #2E3192; font-style: normal; } -input::placeholder{ +input::placeholder { font-family: Montserrat; font-weight: normal; font-size: 22px; @@ -87,23 +87,15 @@ input::placeholder{ display: flex; align-items: left; text-align: left; - + color: #999FDE; font-style: normal; } -button{ +button { background: #EBDDFF; box-sizing: border-box; border-radius: 30px; - font-family: Montserrat; - font-style: normal; - font-weight: normal; - font-size: 24px; - line-height: 29px; - display: flex; - align-items: center; - text-align: center; border: 2px solid #2E3192; font-family: Montserrat; @@ -116,10 +108,9 @@ button{ color: #2E3192; font-style: normal; - margin-left: 25%; - margin-right: 25%; + margin: 0 auto; + padding: 1% 6%; margin-top: 10%; - } #rectangle { @@ -128,13 +119,21 @@ button{ background: red; } +.form-action { + padding-top: 2%; + margin: 0 5%; + width: 90%; + display: flex; + flex-direction: column; + justify-content: space-evenly; + text-align: center; +} #sos{ - font-family: Montserrat; font-weight: normal; font-size: 23.1579px; line-height: 28px; - display: flex; + display: inline-block; align-items: center; text-align: center; font-style: normal; @@ -143,35 +142,41 @@ button{ border: 1px solid #FF9848; border-radius: 28.9474px; box-sizing: border-box; - margin-left: 30%; - padding-top: 2%; - + padding: 2%; + margin-top: 2%; } +.content { + display: flex; + flex-direction: column; + justify-content: space-evenly; +} -p{ - font-family: Montserrat; + +p { font-weight: normal; font-size: 22px; line-height: 27px; - display: flex; align-items: center; text-align: center; - + color: #2E3192; font-style: normal; } -a{ - font-family: Montserrat; +a { font-weight: normal; font-size: 22px; line-height: 27px; - display: flex; align-items: center; text-align: center; text-decoration-line: underline; - + color: #FC5C14; font-style: normal; -} \ No newline at end of file +} + +#sos > a { + display: inline-block; + padding: 0px 2px; +} diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html index cc373c4..240efb7 100644 --- a/src/app/login/login.component.html +++ b/src/app/login/login.component.html @@ -1,9 +1,10 @@
-
-
Are you in an emergency ? Call 147 or find help near you
-
-

Login

+
+
Are you in an emergency ? Call 147 or find help near you
+
+ +

NAV.LOGIN

@@ -21,12 +22,15 @@ formControlName="password" placeholder="Enter password">
- Forgot password? - -

Don't have an account yet?

- Sign Up +
+ Forgot password? + +

LOGIN.NOACCOUNT

+ Sign Up +

{{ errorMessage }}

+
@@ -59,11 +63,11 @@
Forgot password? - + - +

LOGIN.NOACCOUNT

Sign Up ---> \ No newline at end of file +--> diff --git a/src/app/maps/maps.component.css b/src/app/maps/maps.component.css index 258a085..5151363 100644 --- a/src/app/maps/maps.component.css +++ b/src/app/maps/maps.component.css @@ -1,9 +1,47 @@ -.my-4{ - margin-top:70px !important; + +:host { + overflow-x: hidden; +} +.back{ + height: 100vh; + max-height: 100%; + width: calc(100vw - 20rem - 6%); + align-content: center; + padding: 0 3%; + justify-content: center; +} + +.select-container, .details-container { + display: flex; + max-width: calc(100vw - 26rem); + display: flex; + flex-direction: column; + justify-content: space-between; + padding: .5em 0; + overflow-x: hidden; + margin: 0 auto; +} + +.map-container { + max-width: calc(100vw - 26rem); + margin: 0 auto; + overflow-x: hidden; +} + +.details-container { + overflow-y: scroll; + overflow-x: hidden; +} + +.custom-select { + width: 70%; } agm-map { - height: 50vh; + height: 50vh; + max-width: calc(100vw - 20rem); + padding: 0 3%; + margin: 0 auto; } .target { @@ -17,8 +55,8 @@ agm-map { } .content-header { - background-color: gray; - padding: 20px 0px 10px 0px; + background-color: lightcoral; + padding: 10px; align-items: middle; font-size: 18pt; } @@ -26,12 +64,13 @@ agm-map { .content-grid { display: grid; grid-template-columns: repeat(3, 1fr); + background-color: whitesmoke; } .content-grid > * { padding: 5px; - background-color: whitesmoke; border-radius: 5px; + border: 1px solid lightslategray; } .content-grid > * > p { diff --git a/src/app/maps/maps.component.html b/src/app/maps/maps.component.html index f4b77a2..c4469a2 100644 --- a/src/app/maps/maps.component.html +++ b/src/app/maps/maps.component.html @@ -1,13 +1,16 @@ -
- - - -

{{ 'MAP.CANTONOF' | translate }} {{cantonSelected}}

- + +

{{ 'MAP.CANTONOF' | translate }} {{cantonSelected}}

+

MAP.SORRY

- + +
+ {{ place.address }}
{{ place.postalCode }}
{{ place.city }}
- MAP.WEBSITE
- {{ place.tel }}
- MAP.WEBSITE
+ MAP.WEBSITE
{{ place.tel }}
{{ 'MAP.WHO' | translate }} : {{ place.type }}
-
+ +
-
-

{{t.key}}

-

MAP.UNCATEGORIZED

-
-
-

- {{d.name}}
- {{d.address}}
- {{d.postalCode}} {{ d.city }}
- {{ d.tel }}
- MAP.WEBSITE
- {{ d.tel }}
- MAP.WEBSITE
- {{ 'MAP.DESCRIPTION' | translate }} : {{ d.description }}
-

+
+
+

{{t.key}}

+

MAP.UNCATEGORIZED

+
+
+

+ {{d.name}}
+ {{d.address}}
+ {{d.postalCode}} {{ d.city }}
+ {{ d.tel }}
+ MAP.WEBSITE
+ {{ 'MAP.DESCRIPTION' | translate }} : {{ d.description }}
+

+
-
\ No newline at end of file +
diff --git a/src/app/signup/signup.component.css b/src/app/signup/signup.component.css index 3114d08..c33fb98 100644 --- a/src/app/signup/signup.component.css +++ b/src/app/signup/signup.component.css @@ -7,11 +7,17 @@ background-position: bottom; } +.row { + display: flex; + text-align: center; + justify-content: center; +} + form { text-align: center; - min-width: 300px; - max-width: 400px; - min-height: 600px; + min-width: 400px; + max-width: 600px; + min-height: 500px; max-height: 700px; background: #FFFFFF; box-sizing: border-box; @@ -20,44 +26,39 @@ form { display: flex; flex-direction: column; justify-content: center; - margin-left: 50%; - margin-top: 5%; + margin-top: 40px; +} +.content { + display: flex; + flex-direction: column; + justify-content: space-evenly; +} +.form-container { + display: flex; + margin: 0 auto; } -h2{ +h2 { padding-bottom: 5%; - font-family: Montserrat; font-weight: 500; font-size: 36px; line-height: 44px; - display: flex; - margin-left: 34%; - margin-top: 10%; - - + color: #2E3192; font-style: normal; } - - -.form-group{ +.form-group { padding-top: 2%; - margin-left: 5%; - margin-right: 5%; + margin: 0 5%; text-align: left; } -input[type=text] { - background: #FFFFFF; - border: 1px solid #EBDDFF; - box-sizing: border-box; -} - -input[type=password] { +input { background: #FFFFFF; box-sizing: border-box; border: 1px solid #EBDDFF; + width: 100%; } #line { @@ -68,44 +69,34 @@ input[type=password] { margin-bottom: 15%; } -label{ - font-family: Montserrat; +label { font-weight: normal; font-size: 22px; line-height: 27px; display: flex; align-items: center; text-align: center; - + color: #2E3192; font-style: normal; } -input::placeholder{ - font-family: Montserrat; +input::placeholder { font-weight: normal; font-size: 22px; line-height: 27px; display: flex; align-items: left; text-align: left; - + color: #999FDE; font-style: normal; } -button{ +button { background: #EBDDFF; box-sizing: border-box; border-radius: 30px; - font-family: Montserrat; - font-style: normal; - font-weight: normal; - font-size: 24px; - line-height: 29px; - display: flex; - align-items: center; - text-align: center; border: 2px solid #2E3192; font-family: Montserrat; @@ -118,10 +109,9 @@ button{ color: #2E3192; font-style: normal; - margin-left: 25%; - margin-right: 25%; + margin: 0 auto; + padding: 1% 6%; margin-top: 10%; - } #rectangle { @@ -132,11 +122,10 @@ button{ #sos{ - font-family: Montserrat; font-weight: normal; font-size: 23.1579px; line-height: 28px; - display: flex; + display: inline-block; align-items: center; text-align: center; font-style: normal; @@ -145,13 +134,37 @@ button{ border: 1px solid #FF9848; border-radius: 28.9474px; box-sizing: border-box; - margin-left: 30%; - padding-top: 2%; - + padding: 2%; + margin-top: 2%; } +a { + font-weight: normal; + font-size: 22px; + line-height: 27px; + align-items: center; + text-align: center; + text-decoration-line: underline; + + color: #FC5C14; + font-style: normal; +} +.form-action { + padding-top: 2%; + margin: 0 5%; + width: 90%; + display: flex; + flex-direction: column; + justify-content: space-evenly; + text-align: center; +} + +#sos > a { + display: inline-block; + padding: 0px 2px; +} diff --git a/src/app/signup/signup.component.html b/src/app/signup/signup.component.html index 5ae46fe..702fd42 100644 --- a/src/app/signup/signup.component.html +++ b/src/app/signup/signup.component.html @@ -1,33 +1,33 @@
- -
-
-
Are you in an emergency ? Call 147 or find help near you
-
-

Sign up

-
-
- - -
-
- - -
- -
-

{{ errorMessage }}

-
+
+
+
Are you in an emergency ? Call 147 or find help near you
+
+
+

Sign up

+
+
+ + +
+
+ + +
+ +
+

{{ errorMessage }}

+
- +
@@ -37,7 +37,7 @@ - \ No newline at end of file +--> diff --git a/src/assets/favicon.png b/src/assets/favicon.png deleted file mode 100644 index 6b9b992058e4e1ae3b5ee4c58c4fc1ff59fdb508..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55986 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 z 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 diff --git a/src/assets/favicon.svg b/src/assets/favicon.svg new file mode 100644 index 0000000..9c80f08 --- /dev/null +++ b/src/assets/favicon.svg @@ -0,0 +1 @@ + -- GitLab From 82669b58e8f1875276fe935cf966c8f1473db89d Mon Sep 17 00:00:00 2001 From: Xoeseko Date: Mon, 27 Apr 2020 13:32:54 +0200 Subject: [PATCH 17/17] Removed routes that are not ready yet --- src/app/header/header.component.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html index ccfeed2..a3e15ca 100644 --- a/src/app/header/header.component.html +++ b/src/app/header/header.component.html @@ -7,12 +7,12 @@