Skip to content

Commit 1fa96e8

Browse files
committed
Add admin granting and MS Teams update
1 parent b3ddf6a commit 1fa96e8

File tree

10 files changed

+102
-33
lines changed

10 files changed

+102
-33
lines changed

src/app/_models/ms-team/ms-team.model.ts

+2
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ export class MsTeamModel extends AuditModel {
44
displayName: string = '';
55
tenantId: string = '';
66
groupId: string = '';
7+
channelId: string = '';
8+
companyFilter: string = '';
79
organization: GenericModel = new GenericModel();
810
}

src/app/_models/user/user.model.ts

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export class UserModel extends AuditModel {
99
avatarUrl: string = '';
1010
enabled: boolean = true;
1111
token: string = '';
12+
userAuthoritiesRef: number[] = [];
1213
userOrganizationAuthoritiesRef: number[] = [];
1314

1415
// Only in web component

src/app/_services/authentication/authentication.service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export class AuthenticationService {
6161

6262
whoami(): Observable<User> {
6363
const principal = this.http.get<UserModel>(`${this.configService.get('apiUrl')}/whoami`);
64-
const authorities = this.http.get<AuthorityModel[]>(`${this.configService.get('apiUrl')}/authority`);
64+
const authorities = this.http.get<AuthorityModel[]>(`${this.configService.get('apiUrl')}/authority/me`);
6565
const orgauthorities = this.http.get<OrganizationAuthorityModel[]>(`${this.configService.get('apiUrl')}/orgauthorities`);
6666
const organizations = this.http.get<OrganizationModel[]>(`${this.configService.get('apiUrl')}/organizations`);
6767
return forkJoin([principal, authorities, orgauthorities, organizations])

src/app/_services/authority/authority.service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ export class AuthorityService {
1010

1111
constructor(private http: HttpClient, private configService: ConfigService) { }
1212

13-
getUserAuthorities() {
14-
return this.http.get<AuthorityModel[]>(`${this.configService.get('apiUrl')}/authorities`);
13+
list() {
14+
return this.http.get<AuthorityModel[]>(`${this.configService.get('apiUrl')}/authority`);
1515
}
1616

1717
}

src/app/_services/ms-team/ms-team.service.ts

+4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ export class MsTeamService {
1818
return this.http.post(`${this.configService.get('apiUrl')}/team/ms`, team);
1919
}
2020

21+
update(team: MsTeamModel) {
22+
return this.http.put(`${this.configService.get('apiUrl')}/team/ms`, team);
23+
}
24+
2125
delete(id: number) {
2226
return this.http.delete(`${this.configService.get('apiUrl')}/team/ms/${id}`, {});
2327
}

src/app/_services/user/user.service.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { HttpClient, HttpParams } from '@angular/common/http';
33

44
import { ConfigService } from '../config/config.service';
55

6-
import { AccountModel, DonationModel, UserModel, OrganizationModel, OrganizationAuthorityModel } from '../../_models';
6+
import { AccountModel, DonationModel, UserModel, OrganizationModel, OrganizationAuthorityModel, AuthorityModel } from '../../_models';
77

88
import { ProjectModel } from '../../_models/project/project.model';
99

@@ -81,7 +81,11 @@ export class UserService {
8181
return this.http.delete(`${this.configService.get('apiUrl')}/user/${id}`);
8282
}
8383

84-
grant(id: number, organizationAuthority: OrganizationAuthorityModel) {
84+
grant(id: number, authority: AuthorityModel) {
85+
return this.http.post(`${this.configService.get('apiUrl')}/user/${id}/authorities`, authority);
86+
}
87+
88+
grantOrgAuthority(id: number, organizationAuthority: OrganizationAuthorityModel) {
8589
return this.http.post(`${this.configService.get('apiUrl')}/user/${id}/orgauthorities`, organizationAuthority);
8690
}
8791
}

src/app/app/organizations/edit/edit-organization.component.html

+12
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,18 @@ <h3 class="card-title" i18n=@@informations>Informations</h3>
132132
<input type="url" formControlName="logoUrl" class="form-control" id="logoUrl"
133133
placeholder="Enter organization logo URL">
134134
</div>
135+
<div *ngIf="msTeam && msTeam.id > 0" class="form-group has-feedback" [ngClass]="{ 'has-error': f['msPublicationGroupId'].errors }">
136+
<label for="msPublicationGroupId" i18n="@@msPublicationGroupId">Microsoft Publication Group ID</label>
137+
<input type="text" formControlName="msPublicationGroupId" [(ngModel)]="msTeam.groupId" class="form-control" id="msPublicationGroupId" placeholder="Microsoft Team Group ID">
138+
</div>
139+
<div *ngIf="msTeam && msTeam.id > 0" class="form-group has-feedback" [ngClass]="{ 'has-error': f['msPublicationChannelId'].errors }">
140+
<label for="msPublicationChannelId" i18n="@@msPublicationChannelId">Microsoft Publication Channel ID</label>
141+
<input type="text" formControlName="msPublicationChannelId" [(ngModel)]="msTeam.channelId" class="form-control" id="msPublicationChannelId" placeholder="Microsoft Team Channel ID">
142+
</div>
143+
<div *ngIf="msTeam && msTeam.id > 0" class="form-group has-feedback" [ngClass]="{ 'has-error': f['msCompanyFilter'].errors }">
144+
<label for="msCompanyFilter" i18n="@@msCompanyFilter">Microsoft Company Filter</label>
145+
<input type="text" formControlName="msCompanyFilter" [(ngModel)]="msTeam.companyFilter" class="form-control" id="msCompanyFilter" placeholder="Microsoft Company Filter">
146+
</div>
135147
<div *ngIf="id > 0" class="form-group action-bar">
136148
<label i18n="@@thirdApps">Third Apps</label>
137149
<table class="table table-striped table-valign-middle">

src/app/app/organizations/edit/edit-organization.component.ts

+34-21
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,32 @@ export class EditOrganizationComponent implements OnInit {
2424
organization: Organization = new Organization();
2525
authorities: Map<string, OrganizationAuthorityModel> = new Map<string, OrganizationAuthorityModel>();
2626

27+
// Slack OAuth
28+
slackSyncStatus: string = 'idle';
29+
slackDisconnectStatus: string = 'idle';
30+
slackClientId: string = '';
31+
redirectUrlSlackOAuth: string = '';
32+
code: string = '';
33+
34+
// Microsoft OAuth
35+
microsoftEnabled: boolean = false;
36+
microsoftSyncStatus: string = 'idle';
37+
microsoftDisconnectStatus: string = 'idle';
38+
microsoftTenantId: string = '';
39+
microsoftClientId: string = '';
40+
microsoftState: string = '';
41+
microsoftRedirectUrl: string = '';
42+
microsoftCode: string = '';
43+
msDisconnectStatus: string = 'idle';
44+
msTeam: MsTeamModel = new MsTeamModel();
45+
2746
// Forms
2847
editOrgForm: FormGroup = this.formBuilder.group({
2948
name: [this.organization.name, Validators.required],
30-
logoUrl: [this.organization.logoUrl]
49+
logoUrl: [this.organization.logoUrl],
50+
msPublicationGroupId: [this.msTeam.groupId],
51+
msPublicationChannelId: [this.msTeam.channelId],
52+
msCompanyFilter: [this.msTeam.companyFilter]
3153
});
3254
addMemberOrgForm: FormGroup = this.formBuilder.group({
3355
email: ['', Validators.required]
@@ -46,25 +68,6 @@ export class EditOrganizationComponent implements OnInit {
4668
addStatus: string = 'idle';
4769
submitStatus: string = 'idle';
4870

49-
// Slack OAuth
50-
slackSyncStatus: string = 'idle';
51-
slackDisconnectStatus: string = 'idle';
52-
slackClientId: string = '';
53-
redirectUrlSlackOAuth: string = '';
54-
code: string = '';
55-
56-
// Microsoft OAuth
57-
microsoftEnabled: boolean = false;
58-
microsoftSyncStatus: string = 'idle';
59-
microsoftDisconnectStatus: string = 'idle';
60-
microsoftTenantId: string = '';
61-
microsoftClientId: string = '';
62-
microsoftState: string = '';
63-
microsoftRedirectUrl: string = '';
64-
microsoftCode: string = '';
65-
msDisconnectStatus: string = 'idle';
66-
msTeam: MsTeamModel = new MsTeamModel();
67-
6871
// Members card
6972
private rawResponseMembers: any;
7073
pagerMembers: any = {};
@@ -515,7 +518,7 @@ export class EditOrganizationComponent implements OnInit {
515518
grant(userId: number, role: string) {
516519
var organizationAuthority = this.organization.organizationAuthorities.find(authority => authority.name === role);
517520
if (organizationAuthority !== undefined) {
518-
this.userService.grant(userId, organizationAuthority)
521+
this.userService.grantOrgAuthority(userId, organizationAuthority)
519522
.subscribe(() => {
520523
this.refreshMembers(this.pagerMembers.currentPage);
521524
});
@@ -538,6 +541,16 @@ export class EditOrganizationComponent implements OnInit {
538541
organization.logoUrl = "https://eu.ui-avatars.com/api/?name=" + organization.name;
539542
}
540543

544+
if(this.msTeam.id > 0) {
545+
this.msTeamService.update(this.msTeam)
546+
.subscribe(
547+
() => {},
548+
error => {
549+
console.log(error);
550+
}
551+
)
552+
}
553+
541554
if (this.id > 0) {
542555
organization.id = this.id;
543556
this.organizationService.update(organization)

src/app/app/users/users.component.html

+8-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ <h3 class="card-title" i18n="@@users">Users</h3>
1111
[ngClass]="{ 'btn-success': refreshStatus == 'success', 'btn-danger': refreshStatus == 'error' }"
1212
(click)="refresh(pager.currentPage)"><i class="fas fa-sync"></i>
1313
<span i18n="@@refresh">Refresh</span></button>
14-
<button type="button" class="btn btn-default" (click)="openModalCreateUser(editUserModalTemplate)"><i
15-
class="fa fa-plus"></i> <span i18n="@@add">Add</span></button>
14+
<button type="button" class="btn btn-default"
15+
(click)="openModalCreateUser(editUserModalTemplate)"><i class="fa fa-plus"></i> <span
16+
i18n="@@add">Add</span></button>
1617
</div>
1718
<div class="col-6">
1819
<div class="dataTables_length text-right">
@@ -36,6 +37,7 @@ <h3 class="card-title" i18n="@@users">Users</h3>
3637
<th i18n="@@username">Username</th>
3738
<th i18n="@@email">Email</th>
3839
<th i18n="@@createdAt">Created at</th>
40+
<th i18n="@@isAdmin">Is Admin</th>
3941
<th i18n="@@enabled">Enabled</th>
4042
<th></th>
4143
</tr>
@@ -46,6 +48,10 @@ <h3 class="card-title" i18n="@@users">Users</h3>
4648
<td>{{ user.firstname }} {{ user.lastname }}</td>
4749
<td>{{ user.email }}</td>
4850
<td>{{ user.createdAt | date:'medium' }}</td>
51+
<td *ngIf="isAdmin(user)" class="item-clickable text-green" (click)="grant(user.id)">
52+
<i class="far fa-check-square"></i></td>
53+
<td *ngIf="!isAdmin(user)" class="item-clickable text-red" (click)="grant(user.id)">
54+
<i class="far fa-square"></i></td>
4955
<td *ngIf="user.enabled" class="text-green"><i class="far fa-check-square"></i></td>
5056
<td *ngIf="!user.enabled" class="text-red"><i class="far fa-square"></i></td>
5157
<td class="action-bar">

src/app/app/users/users.component.ts

+32-5
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms';
33
import { first } from 'rxjs/operators';
44
import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal';
55

6-
import { UserModel } from 'src/app/_models';
7-
import { UserService, PagerService } from 'src/app/_services';
6+
import { AuthorityModel, UserModel } from 'src/app/_models';
7+
import { UserService, PagerService, AuthorityService } from 'src/app/_services';
8+
import { Authority, User } from 'src/app/_entities';
89

910
@Component({
1011
selector: 'app-users',
@@ -23,9 +24,10 @@ export class UsersComponent implements OnInit {
2324
color: ['']
2425
});;
2526
closeResult: string = '';
26-
userEdited: UserModel = new UserModel();;
27+
userEdited: UserModel = new UserModel();
2728
submitting: boolean = false;
2829
refreshStatus: string = "no-refresh";
30+
adminAuthority: AuthorityModel = new AuthorityModel();
2931

3032
// Modal
3133
modalRef: BsModalRef = new BsModalRef();
@@ -37,16 +39,25 @@ export class UsersComponent implements OnInit {
3739
pageSize: number = 10;
3840

3941
constructor(
42+
private modalService: BsModalService,
4043
private formBuilder: FormBuilder,
4144
private pagerService: PagerService,
42-
private userService: UserService,
43-
private modalService: BsModalService) {
45+
private authorityService: AuthorityService,
46+
private userService: UserService) {
4447
}
4548

4649
ngOnInit() {
50+
this.refreshAuthorities();
4751
this.refresh();
4852
}
4953

54+
refreshAuthorities() {
55+
this.authorityService.list()
56+
.subscribe(response => {
57+
var authority = response.find(element => element.name == 'ROLE_ADMIN');
58+
this.adminAuthority = authority != null ? authority : new AuthorityModel();
59+
});
60+
}
5061

5162
refresh(page: number = 1): void {
5263
if (this.pagerService.canChangePage(this.pager, page)) {
@@ -152,4 +163,20 @@ export class UsersComponent implements OnInit {
152163

153164
}
154165

166+
isAdmin(user: UserModel) {
167+
var userAdminAuthority = user.userAuthoritiesRef.find(element => element == this.adminAuthority.id)
168+
console.log(user.userAuthoritiesRef);
169+
console.log(this.adminAuthority.id);
170+
return userAdminAuthority != null;
171+
}
172+
173+
grant(userId: number) {
174+
if (this.adminAuthority !== undefined) {
175+
this.userService.grant(userId, this.adminAuthority)
176+
.subscribe(() => {
177+
this.refresh(this.pager.currentPage);
178+
});
179+
}
180+
}
181+
155182
}

0 commit comments

Comments
 (0)