Integration des Active Directory Controllers und Active Directory Service abgeschlossen.

This commit is contained in:
Developer 02
2024-03-11 08:48:40 +01:00
parent 58f87e2be5
commit df9bc33795
420 changed files with 2611 additions and 4118 deletions

View File

@@ -7,7 +7,6 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { AppComponent } from './app.component';
import { NavMenuComponent } from './nav-menu/nav-menu.component';
import { HomeComponent } from './home/home.component';
import { UserService } from './services/user.service';
import { GuiGridModule } from '@generic-ui/ngx-grid';
import { BaseTableComponent} from './components/tables/base-table/base-table.component';
import { UserTableComponent } from './components/tables/user-table/user-table.component';
@@ -24,7 +23,9 @@ import { UserRepresentationComponent } from './components/user-representation/us
import { GroupUserTableComponent } from "./components/tables/group-user-table/group-user-table.component";
import { UserRepTableComponent } from './components/tables/user-rep-table/user-rep-table.component';
import { SweetAlert2Module } from '@sweetalert2/ngx-sweetalert2';
import { AdGroupUserTableComponent } from './components/tables/ad-group-user-table/ad-group-user-table.component';
import { DirGroupTableComponent } from './components/tables/dir-group-table/dir-group-table.component';
import { UserGroupDirImportComponent } from './components/user-group-dir-import/user-group-dir-import.component';
import { DirUserTableComponent } from "./components/tables/dir-user-table/dir-user-table.component";
@NgModule({
declarations: [
@@ -37,9 +38,11 @@ import { AdGroupUserTableComponent } from './components/tables/ad-group-user-tab
ModuleTableComponent,
GroupUserTableComponent,
UserRepTableComponent,
AdGroupUserTableComponent,
DirGroupTableComponent,
UserAssignmentComponent,
UserRepresentationComponent
UserRepresentationComponent,
UserGroupDirImportComponent,
DirUserTableComponent
],
providers: [],
bootstrap: [AppComponent],

View File

@@ -1,10 +0,0 @@
<nav class="navbar bg-body-tertiary">
<form class="container-fluid justify-content-start">
<button class="btn btn-outline-success me-2" type="button" (click)="addSelectedGroups()">Hinzufügen</button>
</form>
</nav>
<gui-grid #grid [columns]="columns" [columnMenu]="columnMenu" [sorting]="sorting" [loading]="loading"
[rowSelection]="rowSelection" [rowDetail]="rowDetail" [autoResizeWidth]="autoResizeWidth" [paging]="paging"
[searching]="searching" [cellEditing]="cellEditing" [virtualScroll]="true" [infoPanel]="infoPanel"
[titlePanel]="titlePanel" [theme]="theme" (selectedRows)="onSelectedRows($event)">
</gui-grid>

View File

@@ -1,7 +1,6 @@
import { AfterViewInit, Component, Inject, Input, OnInit, ViewChild, input } from '@angular/core';
import { ApiService } from '../../../services/user-management.api.service';
import { GuiColumn, GuiColumnMenu, GuiSorting, GuiRowDetail, GuiPaging, GuiPagingDisplay, GuiSearching, GuiCellEdit, GuiInfoPanel, GuiTitlePanel, GuiRowSelection, GuiSelectedRow, GuiGridComponent, GuiGridApi, GuiTheme } from '@generic-ui/ngx-grid';
import { GuiCellView } from '@generic-ui/ngx-grid';
@Component({
selector: 'app-base-table',

View File

@@ -1,23 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AdGroupUserTableComponent } from './ad-group-user-table.component';
describe('AdGroupUserTableComponent', () => {
let component: AdGroupUserTableComponent;
let fixture: ComponentFixture<AdGroupUserTableComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [AdGroupUserTableComponent]
})
.compileComponents();
fixture = TestBed.createComponent(AdGroupUserTableComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DirGroupTableComponent } from './dir-group-table.component';
describe('AdGroupUserTableComponent', () => {
let component: DirGroupTableComponent;
let fixture: ComponentFixture<DirGroupTableComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [DirGroupTableComponent]
})
.compileComponents();
fixture = TestBed.createComponent(DirGroupTableComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,17 @@
import { Component, Inject } from '@angular/core';
import { BaseTableComponent } from '../base-table/base-table.component';
import { DirGroupService } from 'src/app/services/dir-group.service';
import { DirGroup } from 'src/app/models/user-management.api.models';
import { GuiColumn } from '@generic-ui/ngx-grid';
import { GroupService } from 'src/app/services/group.service';
@Component({
selector: 'app-dir-group-table',
templateUrl: '../base-table/base-table.component.html',
styleUrl: './dir-group-table.component.css'
})
export class DirGroupTableComponent extends BaseTableComponent<DirGroup, DirGroupService> {
constructor(service: DirGroupService, @Inject('DIR_GROUP_TABLE_COLUMNS') columns: Array<GuiColumn>) {
super(service, columns)
}
}

View File

@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DirUserTableComponent } from './dir-user-table.component';
describe('DirUserTableComponent', () => {
let component: DirUserTableComponent;
let fixture: ComponentFixture<DirUserTableComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [DirUserTableComponent]
})
.compileComponents();
fixture = TestBed.createComponent(DirUserTableComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,16 @@
import { Component, Inject } from '@angular/core';
import { DirUser } from 'src/app/models/user-management.api.models';
import { DirUserService } from 'src/app/services/dir-user.service';
import { BaseTableComponent } from '../base-table/base-table.component';
import { GuiColumn } from '@generic-ui/ngx-grid/gui/grid/src/core/api/gui.grid.public-api';
@Component({
selector: 'app-dir-user-table',
templateUrl: '../base-table/base-table.component.html',
styleUrl: './dir-user-table.component.css'
})
export class DirUserTableComponent extends BaseTableComponent<DirUser, DirUserService> {
constructor(service: DirUserService, @Inject('DIR_USER_TABLE_COLUMNS') columns: Array<GuiColumn>) {
super(service, columns)
}
}

View File

@@ -0,0 +1,13 @@
<nav class="navbar bg-body-tertiary">
<form class="container-fluid justify-content-start">
<button class="btn btn-outline-success me-2" type="button" (click)="addSelectedGroups()">Hinzufügen</button>
</form>
</nav>
<div class="row">
<div class="col-6">
<app-dir-group-table #dirGroups [rowSelection]="dirGroupsRowSelection"></app-dir-group-table>
</div>
<div class="col-6">
<app-dir-user-table #dirUsers [initData]="initWithoutData"></app-dir-user-table>
</div>
</div>

View File

@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { UserGroupDirImportComponent } from './user-group-dir-import.component';
describe('UserGroupDirImportComponent', () => {
let component: UserGroupDirImportComponent;
let fixture: ComponentFixture<UserGroupDirImportComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [UserGroupDirImportComponent]
})
.compileComponents();
fixture = TestBed.createComponent(UserGroupDirImportComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -1,72 +1,85 @@
import { Component, Inject } from '@angular/core';
import { BaseTableComponent } from '../base-table/base-table.component';
import { ADGroupService } from 'src/app/services/ad-group.service';
import { ADGroup } from 'src/app/models/user-management.api.models';
import { GuiColumn, GuiRowSelection, GuiRowSelectionMode, GuiRowSelectionType, GuiSelectedRow } from '@generic-ui/ngx-grid';
import Swal from 'sweetalert2';
import { GroupService } from 'src/app/services/group.service';
import { forkJoin, of } from 'rxjs';
import { catchError, finalize } from 'rxjs/operators';
@Component({
selector: 'app-ad-group-user-table',
templateUrl: 'ad-group-user-table.component.html',
styleUrl: './ad-group-user-table.component.css'
})
export class AdGroupUserTableComponent extends BaseTableComponent<ADGroup, ADGroupService> {
constructor(
service: ADGroupService, public gService: GroupService, @Inject('ADGROUP_COMPLETE_TABLE_COLUMNS') columns: Array<GuiColumn>) {
super(service, columns)
}
rowSelection: GuiRowSelection = {
enabled: true,
type: GuiRowSelectionType.CHECKBOX,
mode: GuiRowSelectionMode.MULTIPLE
}
addSelectedGroups() {
let requests = [];
let numAdded: number = 0;
for (let row of this.selectedRows) {
// Create an Observable for each request and add it to the requests array
requests.push(
this.gService.createByAd({ samAccountName: row?.source?.samAccountName }).pipe(
catchError((err) => {
console.log(err);
// In case of error, return a 'null' observable for this request, so it doesn't affect other requests
return of(null);
})
)
);
}
forkJoin(requests).pipe(
// finalize is executed after all requests are completed or when an error occurs
finalize(() => {
// Show Swal notification after all requests are completed
Swal.fire({
icon: "success",
title: "Completed",
text: `${numAdded} new groups added`,
position: "center",
showConfirmButton: false,
timer: 3000
});
this.safelyUnselectAll();
})
).subscribe({
next: (results) => {
// Increment numAdded for each successful request
// You can increment numAdded for each result that is not null
numAdded += results.filter(result => result !== null).length;
},
error: (err) => {
// You may need to handle any potential errors here
console.log('An error occurred', err);
}
});
}
}
import { AfterViewInit, Component, Inject, OnInit, ViewChild } from '@angular/core';
import { GuiRowSelection, GuiRowSelectionMode, GuiRowSelectionType } from '@generic-ui/ngx-grid';
import Swal from 'sweetalert2';
import { GroupService } from 'src/app/services/group.service';
import { forkJoin, of } from 'rxjs';
import { catchError, finalize } from 'rxjs/operators';
import { DirGroupTableComponent } from '../tables/dir-group-table/dir-group-table.component';
import { DirUserTableComponent } from '../tables/dir-user-table/dir-user-table.component';
@Component({
selector: 'app-user-group-dir-import',
templateUrl: './user-group-dir-import.component.html',
styleUrl: './user-group-dir-import.component.css'
})
export class UserGroupDirImportComponent implements OnInit, AfterViewInit {
initWithoutData = () => {}
constructor(public gService: GroupService) {
}
ngOnInit(): void {
}
ngAfterViewInit(): void {
this.dirUsers.loading = false;
}
@ViewChild('dirGroups') dirGroups! : DirGroupTableComponent;
@ViewChild('dirUsers') dirUsers! : DirUserTableComponent;
dirGroupsRowSelection: GuiRowSelection = {
enabled: true,
type: GuiRowSelectionType.CHECKBOX,
mode: GuiRowSelectionMode.MULTIPLE
}
addSelectedGroups() {
let requests = [];
let numAdded: number = 0;
for (let row of this.dirGroups.selectedRows) {
console.log(row)
console.log({ samaccountname: row?.source?.samaccountname })
// Create an Observable for each request and add it to the requests array
requests.push(
this.gService.createByAd({ samaccountname: row?.source?.samaccountname }).pipe(
catchError((err) => {
console.log(err);
// In case of error, return a 'null' observable for this request, so it doesn't affect other requests
return of(null);
})
)
);
}
forkJoin(requests).pipe(
// finalize is executed after all requests are completed or when an error occurs
finalize(() => {
// Show Swal notification after all requests are completed
Swal.fire({
icon: "success",
title: "Completed",
text: `${numAdded} new groups added`,
position: "center",
showConfirmButton: false,
timer: 3000
});
this.dirGroups.safelyUnselectAll();
})
).subscribe({
next: (results) => {
// Increment numAdded for each successful request
// You can increment numAdded for each result that is not null
numAdded += results.filter(result => result !== null).length;
},
error: (err) => {
// You may need to handle any potential errors here
console.log('An error occurred', err);
}
});
}
}

View File

@@ -57,7 +57,7 @@ export interface UserRep {
guid?: number,
userId: number,
repGroupId?: number,
rightGroupId:number,
rightGroupId: number,
addedWho: string,
repUserId?: number,
user?: User,
@@ -66,6 +66,17 @@ export interface UserRep {
repUser?: User
}
export interface ADGroup {
export interface DirGroup {
samaccountname: Array<string>;
}
export interface DirUser {
guid: string;
sId: string;
employeeId: string;
samAccountName: string;
givenName: string;
middleName: string;
surname: string;
emailAddress: string;
}

View File

@@ -1,7 +1,6 @@
import { Component } from '@angular/core';
import Swal from 'sweetalert2';
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
import { AdGroupUserTableComponent } from '../components/tables/ad-group-user-table/ad-group-user-table.component';
import {MatDialog} from '@angular/material/dialog';
import { UserGroupDirImportComponent } from '../components/user-group-dir-import/user-group-dir-import.component';
@Component({
selector: 'app-nav-menu',
@@ -25,7 +24,7 @@ export class NavMenuComponent {
importUser() {
const dialogRef = this.dialog.open(AdGroupUserTableComponent, {
const dialogRef = this.dialog.open(UserGroupDirImportComponent, {
});
dialogRef.afterClosed().subscribe(result => {

View File

@@ -0,0 +1,13 @@
import { Injectable, Inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { DirGroup } from '../models/user-management.api.models';
import { ApiService } from './user-management.api.service';
@Injectable({
providedIn: 'root'
})
export class DirGroupService extends ApiService<DirGroup> {
constructor(http: HttpClient, @Inject('DIR_GROUP_URL') private userUri: string) {
super(http, userUri);
}
}

View File

@@ -1,13 +1,13 @@
import { Injectable, Inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { ADGroup, } from '../models/user-management.api.models';
import { ApiService } from './user-management.api.service';
@Injectable({
providedIn: 'root'
})
export class ADGroupService extends ApiService<ADGroup> {
constructor(http: HttpClient, @Inject('AD_GROUP_URL') private userUri: string) {
super(http, userUri);
}
import { Injectable, Inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { DirUser } from '../models/user-management.api.models';
import { ApiService } from './user-management.api.service';
@Injectable({
providedIn: 'root'
})
export class DirUserService extends ApiService<DirUser> {
constructor(http: HttpClient, @Inject('DIR_USER_URL') private userUri: string) {
super(http, userUri);
}
}

View File

@@ -1,6 +1,6 @@
import { Injectable, Inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { ADGroup, Group, } from '../models/user-management.api.models';
import { DirGroup, Group, } from '../models/user-management.api.models';
import { ApiService } from './user-management.api.service';
import { Observable } from 'rxjs/internal/Observable';
@@ -12,7 +12,7 @@ export class GroupService extends ApiService<Group> {
super(http, userUri);
}
createByAd(createModel: ADGroup): Observable<ADGroup> {
return this.http.post<ADGroup>(`${this.baseUrl}/byAd`, createModel);
createByAd(createModel: DirGroup): Observable<DirGroup> {
return this.http.post<DirGroup>(`${this.baseUrl}/byAd`, createModel);
}
}

View File

@@ -6,7 +6,8 @@
<title>User Manager Portal</title>
<base href="/" />
<user-manager-api href="https://localhost:7202/api/" user-route="user" group-route="group" module-route="module"
module-of-user-route="moduleOfUser" group-of-user-route="groupOfUser" user-representation-route="userRep" ad-group-route="aDGroup" />
module-of-user-route="moduleOfUser" group-of-user-route="groupOfUser" user-representation-route="userRep" dir-group-route="directory/Group?propName=samaccountname"
dir-user-route="directory/user"/>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" type="image/x-icon" href="favicon.ico" />

View File

@@ -3,7 +3,7 @@ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
import { User, UserRep } from './app/models/user-management.api.models';
import { DirGroup, User, UserRep } from './app/models/user-management.api.models';
export function getBaseUrl() {
return document.getElementsByTagName('base')[0].href;
@@ -30,8 +30,11 @@ export function getGroupOfUserUrl() {
export function getUserRepUrl() {
return `${getUserManagerUrl()}${document.getElementsByTagName("user-manager-api")[0].getAttribute("user-representation-route")}`;
}
export function getADGroupUrl() {
return `${getUserManagerUrl()}${document.getElementsByTagName("user-manager-api")[0].getAttribute("ad-group-route")}`;
export function getDirGroupUrl() {
return `${getUserManagerUrl()}${document.getElementsByTagName("user-manager-api")[0].getAttribute("dir-group-route")}`;
}
export function getDirUserUrl() {
return `${getUserManagerUrl()}${document.getElementsByTagName("user-manager-api")[0].getAttribute("dir-user-route")}`;
}
var columnNames = {
@@ -76,12 +79,31 @@ var columnNames = {
}
]
},
adGroup: [
dirGroup: [
{
header: "SAM-Account-Name",
field: "samAccountName"
field: (dirGroup: DirGroup) => dirGroup.samaccountname[0]
}
],
dirUser: [
{
header: 'Benutzername',
field: 'samAccountName'
},
{
header: 'Vorname',
field: 'givenName'
},
{
header: 'Name',
field: 'surname'
},
{
header: 'E-email',
field: 'emailAddress'
}
]
,
module: [
{
header: "Produkt",
@@ -127,7 +149,8 @@ const providers = [
{ provide: 'MODULE_OF_USER_URL', useFactory: getModuleOfUserUrl, deps: [] },
{ provide: 'GROUP_OF_USER_URL', useFactory: getGroupOfUserUrl, deps: [] },
{ provide: 'USER_REP_URL', useFactory: getUserRepUrl, deps: [] },
{ provide: 'AD_GROUP_URL', useFactory: getADGroupUrl, deps: [] },
{ provide: 'DIR_GROUP_URL', useFactory: getDirGroupUrl, deps: [] },
{ provide: 'DIR_USER_URL', useFactory: getDirUserUrl, deps: [] },
{ provide: 'USER_TABLE_COLUMNS', useFactory: () => columnNames.user, deps: [] },
{ provide: 'GROUP_COMPLETE_TABLE_COLUMNS', useFactory: () => columnNames.group.complete, deps: [] },
{ provide: 'GROUP_RIGHT_TABLE_COLUMNS', useFactory: () => columnNames.group.right, deps: [] },
@@ -135,7 +158,8 @@ const providers = [
{ provide: 'MODULE_TABLE_COLUMNS', useFactory: () => columnNames.module, deps: [] },
{ provide: 'GROUP_USER_TABLE_COLUMNS', useFactory: () => columnNames.groupOfUser, deps: [] },
{ provide: 'USER_REP_TABLE_COLUMNS', useFactory: () => columnNames.userRep, deps: [] }, //
{ provide: 'ADGROUP_COMPLETE_TABLE_COLUMNS', useFactory: () => columnNames.adGroup, deps: [] },
{ provide: 'DIR_GROUP_TABLE_COLUMNS', useFactory: () => columnNames.dirGroup, deps: [] },
{ provide: 'DIR_USER_TABLE_COLUMNS', useFactory: () => columnNames.dirUser, deps: [] }
];
if (environment.production) {