From d72db1ed4f09b55487c82a519e68499daf2db015 Mon Sep 17 00:00:00 2001 From: HardiReady Date: Tue, 17 Jul 2018 11:34:32 +0200 Subject: [PATCH] * Revert to legacy load indicator and improve it * Fix enter submit of forgotten forms --- static/src/app/app.component.css | 6 +++++ static/src/app/app.component.html | 6 ++--- static/src/app/app.component.ts | 12 ++++++--- static/src/app/app.module.ts | 4 +-- static/src/app/login/login.component.html | 4 --- static/src/app/login/login.component.ts | 14 +++------- static/src/app/material-components.module.ts | 20 -------------- .../campaign-submit.component.ts | 2 +- .../war/war-edit/war-edit.component.ts | 5 ++-- .../war/war-submit/war-submit.component.html | 2 -- .../war/war-submit/war-submit.component.ts | 11 ++++---- static/src/app/style/load-indicator.css | 25 +++++++----------- static/src/assets/loading.png | Bin 5369 -> 6490 bytes 13 files changed, 42 insertions(+), 69 deletions(-) delete mode 100644 static/src/app/material-components.module.ts diff --git a/static/src/app/app.component.css b/static/src/app/app.component.css index d14f402..e5407e4 100644 --- a/static/src/app/app.component.css +++ b/static/src/app/app.component.css @@ -8,6 +8,12 @@ li { display: inline; } +.sidebar-toggle-btn { + background: linear-gradient(-90deg, #e8e5e5, #ffffff); + margin-left: -12px; + z-index: 500; +} + .content { padding-left: 15px; padding-right: 15px; diff --git a/static/src/app/app.component.html b/static/src/app/app.component.html index 3e7b1f9..5a699ae 100644 --- a/static/src/app/app.component.html +++ b/static/src/app/app.component.html @@ -96,9 +96,9 @@
- + diff --git a/static/src/app/app.component.ts b/static/src/app/app.component.ts index 7743739..8c24bb5 100644 --- a/static/src/app/app.component.ts +++ b/static/src/app/app.component.ts @@ -34,6 +34,8 @@ export class AppComponent implements OnInit { leftBoxShadow; + // a map of svgIcon names and associated svg file names + // to load from assets/icon folder svgIcons = { 'add': 'outline-add_box-24px', 'add-user': 'twotone-person_add-24px', @@ -63,17 +65,20 @@ export class AppComponent implements OnInit { this.spinnerService.activate(); } if (event instanceof NavigationEnd) { + this.spinnerService.deactivate(); const currentUrl = this.router.url; - this.spinnerService.deactivate(); // scroll to top on route from army overview to user detail and back if (currentUrl.includes('/overview')) { this.scrollToTop(); } + // show sidebar menu on initial page access this.sidebarOpen = true; this.showSidebarToggleBtn = currentUrl.includes('/stats'); + // remove sidebar styling for components that are rendered inside, + // but not really shown as sidebar (legacy) if (currentUrl.includes('/login') || currentUrl.includes('/signup') || currentUrl.endsWith('/404')) { @@ -87,13 +92,14 @@ export class AppComponent implements OnInit { }); } - toggleSpinner(active){ + toggleSpinner(active) { this.loading = active; } initMaterialSvgIcons() { Object.keys(this.svgIcons).forEach(key => { - const fileUri = '../assets/icon/' + this.svgIcons[key] + '.svg'; + const fileUri = '../assets/icon/'.concat(this.svgIcons[key]) + .concat('.svg'); this.iconRegistry.addSvgIcon(key, this.sanitizer.bypassSecurityTrustResourceUrl(fileUri)); }); } diff --git a/static/src/app/app.module.ts b/static/src/app/app.module.ts index 10c897b..5c8f9c6 100644 --- a/static/src/app/app.module.ts +++ b/static/src/app/app.module.ts @@ -23,13 +23,13 @@ import {UserService} from './services/army-management/user.service'; import {UserStore} from './services/stores/user.store'; import {CookieService} from 'ngx-cookie-service'; import {SnackBarService} from './services/user-interface/snack-bar/snack-bar.service'; -import {MaterialComponentsModule} from './material-components.module'; import {HttpClientModule} from '@angular/common/http'; import {SpinnerService} from './services/user-interface/spinner/spinner.service'; +import {MatSnackBarModule} from '@angular/material'; @NgModule({ imports: [SharedModule, BrowserModule, BrowserAnimationsModule, appRouting, HttpModule, HttpClientModule, - ClipboardModule, MaterialComponentsModule], + ClipboardModule, MatSnackBarModule], providers: [ HttpClient, LoginService, diff --git a/static/src/app/login/login.component.html b/static/src/app/login/login.component.html index 92de22e..2b588bd 100644 --- a/static/src/app/login/login.component.html +++ b/static/src/app/login/login.component.html @@ -15,10 +15,6 @@ Anmelden - - {{error}} - diff --git a/static/src/app/login/login.component.ts b/static/src/app/login/login.component.ts index c801702..b5e48e6 100644 --- a/static/src/app/login/login.component.ts +++ b/static/src/app/login/login.component.ts @@ -2,6 +2,7 @@ import {Component, OnInit} from '@angular/core'; import {Router} from '@angular/router'; import {LoginService} from '../services/app-user-service/login-service'; import {RouteConfig} from '../app.config'; +import {SnackBarService} from '../services/user-interface/snack-bar/snack-bar.service'; @Component({ @@ -12,16 +13,13 @@ import {RouteConfig} from '../app.config'; export class LoginComponent implements OnInit { - showErrorLabel = false; - - error: string; - loading = false; returnUrl: string; constructor(private router: Router, - private loginService: LoginService) { + private loginService: LoginService, + private snackBarService: SnackBarService) { } ngOnInit() { @@ -40,11 +38,7 @@ export class LoginComponent implements OnInit { this.router.navigate([this.returnUrl]); }, error => { - this.error = error._body; - this.showErrorLabel = true; - setTimeout(() => { - this.showErrorLabel = false; - }, 4000); + this.snackBarService.showError(error._body, 15000); this.loading = false; }); } diff --git a/static/src/app/material-components.module.ts b/static/src/app/material-components.module.ts deleted file mode 100644 index b21a508..0000000 --- a/static/src/app/material-components.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Angular material imports - */ - -import {NgModule} from '@angular/core'; -import {MatProgressSpinnerModule, MatSnackBarModule} from '@angular/material'; - -@NgModule({ - imports: [ - MatSnackBarModule, - MatProgressSpinnerModule, - ], - exports: [ - MatSnackBarModule, - MatProgressSpinnerModule, - ] -}) - -export class MaterialComponentsModule { -} diff --git a/static/src/app/statistic/campaign/campaign-submit/campaign-submit.component.ts b/static/src/app/statistic/campaign/campaign-submit/campaign-submit.component.ts index 31e3420..5820889 100644 --- a/static/src/app/statistic/campaign/campaign-submit/campaign-submit.component.ts +++ b/static/src/app/statistic/campaign/campaign-submit/campaign-submit.component.ts @@ -44,7 +44,7 @@ export class CampaignSubmitComponent { this.snackBarService.showSuccess(Message.SUCCESS_SAVE); this.router.navigate([redirectSuccessUrl + campaign._id], {relativeTo: this.route}); }, - error => this.snackBarService.showError(error._body.error.message, 30000)); + error => this.snackBarService.showError(error._body.error.message, 15000)); } cancel() { diff --git a/static/src/app/statistic/war/war-edit/war-edit.component.ts b/static/src/app/statistic/war/war-edit/war-edit.component.ts index 634d3fa..d0e18c2 100644 --- a/static/src/app/statistic/war/war-edit/war-edit.component.ts +++ b/static/src/app/statistic/war/war-edit/war-edit.component.ts @@ -12,8 +12,7 @@ import {Message} from '../../../i18n/de.messages'; @Component({ selector: 'war-edit', templateUrl: './war-edit.component.html', - styleUrls: ['./war-edit.component.css', '../../../style/load-indicator.css', - '../../../style/entry-form.css', '../../../style/overview.css'] + styleUrls: ['./war-edit.component.css', '../../../style/entry-form.css', '../../../style/overview.css'] }) export class WarEditComponent { @@ -43,7 +42,7 @@ export class WarEditComponent { this.snackBarService.showSuccess(Message.SUCCESS_SAVE); this.router.navigate(['../../war/' + war._id], {relativeTo: this.route}); }, - error => this.snackBarService.showError(error._body.error.message, 30000)); + error => this.snackBarService.showError(error._body.error.message, 15000)); } cancel() { diff --git a/static/src/app/statistic/war/war-submit/war-submit.component.html b/static/src/app/statistic/war/war-submit/war-submit.component.html index 2708d55..b3566e4 100644 --- a/static/src/app/statistic/war/war-submit/war-submit.component.html +++ b/static/src/app/statistic/war/war-submit/war-submit.component.html @@ -49,6 +49,4 @@ [disabled]="!form.valid"> Bestätigen - - diff --git a/static/src/app/statistic/war/war-submit/war-submit.component.ts b/static/src/app/statistic/war/war-submit/war-submit.component.ts index 798e445..09c4edd 100644 --- a/static/src/app/statistic/war/war-submit/war-submit.component.ts +++ b/static/src/app/statistic/war/war-submit/war-submit.component.ts @@ -5,13 +5,13 @@ import {WarService} from '../../../services/logs/war.service'; import {War} from '../../../models/model-interfaces'; import {CampaignService} from '../../../services/logs/campaign.service'; import {SnackBarService} from '../../../services/user-interface/snack-bar/snack-bar.service'; +import {SpinnerService} from '../../../services/user-interface/spinner/spinner.service'; @Component({ selector: 'war-submit', templateUrl: './war-submit.component.html', - styleUrls: ['./war-submit.component.css', '../../../style/load-indicator.css', - '../../../style/entry-form.css', '../../../style/overview.css'] + styleUrls: ['./war-submit.component.css', '../../../style/entry-form.css', '../../../style/overview.css'] }) export class WarSubmitComponent { @@ -25,14 +25,13 @@ export class WarSubmitComponent { loading = false; - error; - @ViewChild(NgForm) form: NgForm; constructor(private route: ActivatedRoute, private router: Router, private warService: WarService, private snackBarService: SnackBarService, + private spinnerService: SpinnerService, public campaignService: CampaignService) { } @@ -53,15 +52,17 @@ export class WarSubmitComponent { } const file: File = this.fileList[0]; this.loading = true; + this.spinnerService.activate(); this.warService.submitWar(this.war, file) .subscribe(war => { this.router.navigate(['../war/' + war._id], {relativeTo: this.route}); }, error => { + this.spinnerService.deactivate(); this.loading = false; const errorMsg = JSON.parse(error._body).error.message; - this.snackBarService.showError('Error: '.concat(errorMsg), 10000); + this.snackBarService.showError('Error: '.concat(errorMsg), 15000); }); } diff --git a/static/src/app/style/load-indicator.css b/static/src/app/style/load-indicator.css index 526fcaf..362096e 100644 --- a/static/src/app/style/load-indicator.css +++ b/static/src/app/style/load-indicator.css @@ -2,43 +2,36 @@ position: absolute; top: 50%; z-index: 10000; + left: 46%; + filter: drop-shadow(3px 1px 2px #dadada); } -@media only screen and (max-width: 1199px) { - .load-indicator { - left: 46%; - } -} + @media only screen and (min-width: 1200px) { .load-indicator { - left: 46%; + left: 47.4%; } } @media only screen and (min-width: 1376px) { .load-indicator { - left: 46.5%; + left: 48%; } } @media only screen and (min-width: 1600px) { .load-indicator { - left: 47.5%; + left: 48.2%; } } @media only screen and (min-width: 1925px) { .load-indicator { - left: 48%; + left: 48.7%; } } -:host /deep/ .mat-progress-spinner circle, .mat-spinner circle { - stroke: #303030 !important; - stroke-linecap: round; -} - .load-arrow { background: url(../../assets/loading.png) no-repeat; display: block; - width: 80px; - height: 80px; + width: 70px; + height: 70px; } /* Loading Animation */ diff --git a/static/src/assets/loading.png b/static/src/assets/loading.png index adcf3c67a26197c29f850133091ff72c30a668a1..4a484da3955eb5ea313e406ac916475988128257 100644 GIT binary patch literal 6490 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 A$N&HU literal 5369 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

lN)Z53N=;i!DQjy@7Lz6*YU}WI z`||`~DS-c+-X#^C69QPietqsaDP{2#uqqs~d8HP5RcajrT9LkfMp}1bm1E@Sllr^2 zBnRvMyi^P};>D#)dk^p0wWk&2wY9*i*nD28g*Y!ALZQ;naJ8AJDJ&GPhULHvAS+B`54MID+TBbBdau7=?7sTYj zp0|*2T4fk|EknqwM6g41ohbzjV2KbMCo(^zYqF_ zUnm=3MfDj@Tbq`)W|4U&lUBuI>2%64<_dY!Gn9=Ot*8OD?x*I$2~GdeoD+$x;e z3JX*EFS7pf{APwRB}aGne5zKf@3D~=F6~;8$#Z54znNiZIllCzuT+KL-bO7QR($*i zQ&^uoooW~%@FeL`0`!hA}N(6@s0?!95oM_(ii*Q2-{1Xj$w)dNw~-UU_-C zTrN-U-aY(=W*BiYC1(B%fP0%2)*Z)rE|GATnbfS|sUQ2`bF;`i;-R~{x;ox>;e{8; zH#);;mMQ7)J5jHxG_-yU!28+$rCpT^w{+Mx!H$m_DbID?&j&%U{?%7s59(CU?Bk=& zY~CsD_EJhAnM{1NUQ=m=BEP5gLdw*9TRnT$$i=&^dtbF$y=ldYi)r4xGwRtqo6nm| zo7Zx;*ZlcsINP`H%mcVAPD=*>+OT1OIZAo;Y9q}ebF)q)+|O65)tdkyq`Wt}h7p-5 z2_f9=+jm|7V0E1HB(Cdh1%Sc9AxWkmaCWC2ry1A#ec!(!0(rHQ-c68a+q_eHo0*e&XW*PHVA^fo|m1X8R8%>PGp`)xVQSge?tWFPL~?SN%5*y-gR-5 zr}guE5CjLzflQ9moo=^6)Qij=$N6fdQoZNWOIOnAm|;X^O2fnZC)4RvCo}&;vu$hj zi2v)>tq&-3(x1bfsLi}>9fxt7@B5ztfVQ^GX`RD9X2~uoT@Y?Zmv|SpADZ_s@Ef)OeU@#898?FJKy=f zVTVvV6Whq!HtCn^2e9Fr-~5`WR{bcO7moAldD}l(x7XEIf0#QvJ64v)M@Rd>*x2}fb7cNcQNw7Z7W46sf0!S8EWdPQU z*E;#3l=8y^1N~_tvgJ^n0>(v-7qJzyngsPv>%dX=bj6Jp1%!)OnJb zvMSSNVhs=Pn+yVpWHNC}xm>vmfE!Z|qsVKvY}veRXlO4-$U!v)#yJ6^ip-G)#+!+MHSu+5{!R5;@T-njlSuGTvsN3Pn;rK5q!+7gk zyBz>WW-t@0i->Lq@H1v!69j>i&lifRRO*yu7)mM3pFhtT92~kp=e7?UWkxm;h;bsZWU+%u^I`RY6`lD(C+f4wbrW(~5hjbqRtXj2#JTKdJ*Iku?z=Y&Yl>6G8bp+_#$mO2UKZ0ReVbLORI2xcOOIDvu^}@&yiXL1rTs#PWwSZy zZ9VUZ<2XlyAo!h9>iKj!`R_#H$zrj1+^(zi^z@uLIy$<%TCKiE2<}x1=SeBg0RK+zD&j#>teX?qJt244)TLUaf}l!VANx{{Gdj zl=3eUiNr^M)=zqe*J0&F)ne>kmGCK}7A6x#oxFc!`SJ@_UUu1g$3iwQPAx{($OK)( zxO>Hli>XFDUJ z?%etKjJmy8bNriHtzj@T5fN^??dF%yKKrbdK@fbVSv9|&kaJawY4qYk>DdpZl;>~R zvUyuB*Ov&zd9Bo91Tpi2Qp!)wwuS)!XPnW#Y;<(|K_XnjTtAFxHg$Ij z+xPwZ`};3TgmT*%WlAIjI0$M%YgA`w+L~j~kX13kWqW(uCFA20n*m%ti>bSjHgBei zOePaox3{nKEYxAP`Jk#N2Q&Kfsas2r4@-Kh+ zj0AvGD!FuWvV0RWtyT)>D5d7l#OB#uQjX&s@_qjW0N(@f{g6y^CWpli8HZXmqu_-# zklUVYZjVSNowNrL|2>2Qz&D=B`p*rf-M3oxv3Ku&X(brv5YbzRXn~Y+A%Mk1^iHKz zFMziYQM)d96^ZCorPPZ6o@3@eNGXp1c!`MqC!J0nDi$ZJN-11^xyOTpL#I>@>%R2= Xh~_Ub<$0}V00000NkvXXu0mjf%GQMx