Skip to content

Commit 6a6675f

Browse files
committed
initial commit with fix
1 parent 8fa08aa commit 6a6675f

File tree

4 files changed

+95
-62
lines changed

4 files changed

+95
-62
lines changed

web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
<mat-label>Enable Authentication</mat-label>
3737
</div>
3838
<admin-authentication-settings [strategy]="strategy" [teams]="teams" [events]="events"
39-
(strategyDirty)="onStrategyDirty($event)">
39+
(strategyDirty)="isDirty = $event">
4040
</admin-authentication-settings>
4141
<div class="auth__action--delete">
4242
<button mat-button color="warn" id="delete-strategy-button"
@@ -48,4 +48,11 @@
4848
</mat-expansion-panel>
4949
</div>
5050
</mat-accordion>
51+
</section>
52+
<section>
53+
<div class="settings__action--save">
54+
<button mat-flat-button color="primary" (click)="save()" [disabled]="!isDirty">
55+
<mat-icon>check</mat-icon>Save
56+
</button>
57+
</div>
5158
</section>

web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.scss

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
.auth__action--new {
44
display: flex;
5-
flex-direction:column;
5+
flex-direction: column;
66
align-items: flex-end;
77
margin-top: 8px;
88
margin-bottom: 8px;
@@ -11,14 +11,14 @@
1111

1212
.auth__action--delete {
1313
display: flex;
14-
flex-direction:column;
14+
flex-direction: column;
1515
align-items: flex-start;
1616
margin-top: 10px;
1717
}
1818

1919
.auth__action--enable {
2020
display: flex;
21-
flex-direction:row;
21+
flex-direction: row;
2222
align-items: flex-start;
2323
margin-bottom: 16px;
2424
}
@@ -33,7 +33,7 @@
3333
align-items: center;
3434
}
3535

36-
.headers-align .mat-form-field + .mat-form-field {
36+
.headers-align .mat-form-field+.mat-form-field {
3737
margin-left: 8px;
3838
}
3939

@@ -56,4 +56,12 @@ img {
5656

5757
mat-icon {
5858
margin-right: 8px;
59+
}
60+
61+
.settings__action--save {
62+
display: flex;
63+
flex-direction: column;
64+
align-items: flex-end;
65+
margin-top: 4px;
66+
margin-right: 8px;
5967
}

web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.ts

Lines changed: 75 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import _ from 'underscore'
22
import { Component, OnInit, Inject, EventEmitter, Output, Input, OnChanges, SimpleChanges } from '@angular/core';
3+
import { MatSnackBar } from '@angular/material/snack-bar';
34
import { Team, Event, LocalStorageService, AuthenticationConfigurationService, UserService } from '../../upgrade/ajs-upgraded-providers';
45
import { AdminBreadcrumb } from '../admin-breadcrumb/admin-breadcrumb.model'
56
import { Strategy } from '../admin-authentication/admin-settings.model';
67
import { MatDialog } from '@angular/material/dialog';
78
import { StateService } from '@uirouter/angular';
89
import { AuthenticationDeleteComponent } from './admin-authentication-delete/admin-authentication-delete.component';
10+
import { AdminSettingsUnsavedComponent } from '../admin-settings/admin-settings-unsaved/admin-settings-unsaved.component';
11+
import { TransitionService } from '@uirouter/core';
12+
import { lastValueFrom } from 'rxjs';
913

1014
@Component({
1115
selector: 'admin-authentication',
@@ -26,13 +30,17 @@ export class AdminAuthenticationComponent implements OnInit, OnChanges {
2630
teams: any[] = [];
2731
events: any[] = [];
2832

33+
isDirty: boolean = false;
34+
2935
strategies: Strategy[] = [];
3036

3137
readonly hasAuthConfigEditPermission: boolean;
3238

3339
constructor(
3440
private dialog: MatDialog,
3541
private stateService: StateService,
42+
private readonly snackBar: MatSnackBar,
43+
private readonly transitionService: TransitionService,
3644
@Inject(Team)
3745
public team: any,
3846
@Inject(Event)
@@ -50,6 +58,7 @@ export class AdminAuthenticationComponent implements OnInit, OnChanges {
5058
const configsPromise = this.authenticationConfigurationService.getAllConfigurations({ includeDisabled: true });
5159
const teamsPromise = this.team.query({ state: 'all', populate: false }).$promise;
5260
const eventsPromise = this.event.query({ state: 'all', populate: false }).$promise;
61+
this.transitionService.onExit({}, this.onUnsavedChanges, { bind: this });
5362

5463
Promise.all([configsPromise, teamsPromise, eventsPromise]).then(result => {
5564
// Remove event teams
@@ -92,32 +101,57 @@ export class AdminAuthenticationComponent implements OnInit, OnChanges {
92101
}
93102
}
94103

95-
private save(): void {
104+
onAuthenticationSaved(status: boolean): void {
105+
if (status) {
106+
this.snackBar.open('Authentication successfully saved', null, {
107+
duration: 2000,
108+
});
109+
} else {
110+
this.snackBar.open('1 or more authentications failed to save correctly', null, {
111+
duration: 2000,
112+
});
113+
};
114+
this.isDirty = false;
115+
}
116+
117+
onAuthenticationDeleted(status: boolean): void {
118+
if (status) {
119+
this.snackBar.open('Authentication successfully deleted', null, {
120+
duration: 2000,
121+
});
122+
} else {
123+
this.snackBar.open('Failed to delete authentication', null, {
124+
duration: 2000,
125+
});
126+
};
127+
this.isDirty = false;
128+
}
129+
130+
save(): void {
131+
console.log('Saving authentication configurations');
96132
const promises = [];
97133
this.strategies.forEach(strategy => {
98134
if (strategy.isDirty) {
99135
promises.push(this.authenticationConfigurationService.updateConfiguration(strategy));
100136
}
101137
});
102138

103-
if (promises.length > 0) {
104-
Promise.all(promises).then(() => {
105-
return this.authenticationConfigurationService.getAllConfigurations({ includeDisabled: true });
106-
}).then(strategies => {
107-
this.processUnsortedStrategies(strategies.data);
108-
this.saveComplete.emit(true);
109-
}).catch(err => {
110-
console.log(err);
111-
this.authenticationConfigurationService.getAllConfigurations({ includeDisabled: true }).then((newStrategies: { data: Strategy[]; }) => {
112-
this.processUnsortedStrategies(newStrategies.data);
113-
this.saveComplete.emit(false);
114-
}).catch((err2: any) => {
115-
console.log(err2);
116-
this.saveComplete.emit(false);
117-
});
139+
Promise.all(promises).then(() => {
140+
return this.authenticationConfigurationService.getAllConfigurations({ includeDisabled: true });
141+
}).then(strategies => {
142+
this.processUnsortedStrategies(strategies.data);
143+
this.onAuthenticationSaved(true);
144+
}).catch(err => {
145+
console.log(err);
146+
this.authenticationConfigurationService.getAllConfigurations({ includeDisabled: true }).then((newStrategies: { data: Strategy[]; }) => {
147+
this.processUnsortedStrategies(newStrategies.data);
148+
this.onAuthenticationSaved(false);
149+
}).catch((err2: any) => {
150+
console.log(err2);
151+
this.onAuthenticationSaved(false);
118152
});
119-
}
120-
this.onStrategyDirty(false);
153+
});
154+
this.isDirty = false;
121155
}
122156

123157
deleteStrategy(strategy: Strategy): void {
@@ -129,13 +163,13 @@ export class AdminAuthenticationComponent implements OnInit, OnChanges {
129163
if (result === 'delete') {
130164
this.authenticationConfigurationService.getAllConfigurations().then(configs => {
131165
this.processUnsortedStrategies(configs.data);
132-
this.deleteComplete.emit(true);
166+
this.onAuthenticationDeleted(true);
133167
}).catch((err: any) => {
134168
console.error(err);
135-
this.deleteComplete.emit(false);
136-
})
169+
this.onAuthenticationDeleted(false);
170+
});
137171
} else if (result === 'error') {
138-
this.deleteComplete.emit(false);
172+
this.onAuthenticationDeleted(false);
139173
}
140174
});
141175
}
@@ -144,12 +178,26 @@ export class AdminAuthenticationComponent implements OnInit, OnChanges {
144178
this.stateService.go('admin.authenticationCreate')
145179
}
146180

147-
onStrategyDirty(isDirty: boolean): void {
148-
this.onDirty.emit(isDirty);
149-
}
150-
151181
onAuthenticationToggled(strategy: Strategy): void {
152182
strategy.isDirty = true;
153-
this.onStrategyDirty(true)
183+
this.isDirty = true;
184+
}
185+
186+
async onUnsavedChanges(): Promise<boolean> {
187+
if (this.isDirty) {
188+
const ref = this.dialog.open(AdminSettingsUnsavedComponent);
189+
190+
const result_2 = await lastValueFrom(ref.afterClosed());
191+
let discard = true;
192+
if (result_2) {
193+
discard = result_2.discard;
194+
}
195+
if (discard) {
196+
this.isDirty = false;
197+
}
198+
return await Promise.resolve(discard);
199+
}
200+
201+
return Promise.resolve(true);
154202
}
155203
}

web-app/admin/src/app/admin/admin-settings/admin-settings.component.ts

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -87,36 +87,6 @@ export class AdminSettingsComponent implements OnInit {
8787
this.isContactInfoDirty = false;
8888
}
8989

90-
onAuthenticationDirty(isDirty: boolean): void {
91-
this.isAuthenticationDirty = isDirty;
92-
}
93-
94-
onAuthenticationSaved(status: boolean): void {
95-
if (status) {
96-
this.snackBar.open('Authentication successfully saved', null, {
97-
duration: 2000,
98-
});
99-
} else {
100-
this.snackBar.open('1 or more authentications failed to save correctly', null, {
101-
duration: 2000,
102-
});
103-
};
104-
this.isAuthenticationDirty = false;
105-
}
106-
107-
onAuthenticationDeleted(status: boolean): void {
108-
if (status) {
109-
this.snackBar.open('Authentication successfully deleted', null, {
110-
duration: 2000,
111-
});
112-
} else {
113-
this.snackBar.open('Failed to delete authentication', null, {
114-
duration: 2000,
115-
});
116-
};
117-
this.isAuthenticationDirty = false;
118-
}
119-
12090
isDirty(): boolean {
12191
return this.isDisclaimerDirty || this.isAuthenticationDirty || this.isBannerDirty || this.isContactInfoDirty;
12292
}

0 commit comments

Comments
 (0)