Implementierung des Imports von Benutzern und Gruppen aus Active Directory im Angular-Frontend.

This commit is contained in:
Developer 02
2024-03-11 15:31:36 +01:00
parent df9bc33795
commit 2e26342be6
292 changed files with 599 additions and 221 deletions

View File

@@ -8,16 +8,16 @@ import { AppComponent } from './app.component';
import { NavMenuComponent } from './nav-menu/nav-menu.component';
import { HomeComponent } from './home/home.component';
import { GuiGridModule } from '@generic-ui/ngx-grid';
import { BaseTableComponent} from './components/tables/base-table/base-table.component';
import { BaseTableComponent } from './components/tables/base-table/base-table.component';
import { UserTableComponent } from './components/tables/user-table/user-table.component';
import { GroupTableComponent } from './components/tables/group-table/group-table.component';
import { ModuleTableComponent } from './components/tables/module-table/module-table.component';
import { UserAssignmentComponent } from './components/user-assignment/user-assignment.component';
import { CardComponent } from './components/common/card/card.component';
import { TabCardComponent } from './components/common/tab-card/tab-card.component';
import {MatTabsModule, MatTabGroup } from '@angular/material/tabs';
import {MatCommonModule} from '@angular/material/core';
import {DragDropModule} from '@angular/cdk/drag-drop';
import { MatTabsModule, MatTabGroup } from '@angular/material/tabs';
import { MatCommonModule } from '@angular/material/core';
import { DragDropModule } from '@angular/cdk/drag-drop';
import { MatTableComponent } from './components/common/mat-table/mat-table.component';
import { UserRepresentationComponent } from './components/user-representation/user-representation.component';
import { GroupUserTableComponent } from "./components/tables/group-user-table/group-user-table.component";
@@ -25,7 +25,10 @@ import { UserRepTableComponent } from './components/tables/user-rep-table/user-r
import { SweetAlert2Module } from '@sweetalert2/ngx-sweetalert2';
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 { GroupDirImportComponent } from './components/group-dir-import/group-dir-import.component';
import { DirUserTableComponent } from "./components/tables/dir-user-table/dir-user-table.component";
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
@NgModule({
declarations: [
@@ -42,7 +45,8 @@ import { DirUserTableComponent } from "./components/tables/dir-user-table/dir-us
UserAssignmentComponent,
UserRepresentationComponent,
UserGroupDirImportComponent,
DirUserTableComponent
DirUserTableComponent,
GroupDirImportComponent
],
providers: [],
bootstrap: [AppComponent],
@@ -60,6 +64,8 @@ import { DirUserTableComponent } from "./components/tables/dir-user-table/dir-us
MatCommonModule,
DragDropModule,
SweetAlert2Module,
MatButtonModule,
MatIconModule,
RouterModule.forRoot([
{ path: '', component: HomeComponent, pathMatch: 'full' },
{ path: 'user-table', component: UserTableComponent },

View File

@@ -0,0 +1,15 @@
<div class="row p-0 m-0">
<div class="col p-0 m-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()">Gruppen<br>Hinzufügen</button>
</form>
</nav>
</div>
</div>
<div class="row align-items-start p-0 m-0">
<div class="col p-0 m-0">
<app-dir-group-table #dirGroups [rowSelection]="dirGroupsRowSelection"></app-dir-group-table>
</div>
</div>

View File

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

View File

@@ -0,0 +1,85 @@
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';
@Component({
selector: 'app-group-dir-import',
templateUrl: './group-dir-import.component.html',
styleUrl: './group-dir-import.component.css'
})
export class GroupDirImportComponent implements OnInit, AfterViewInit {
initWithoutData = () => { }
constructor(private gService: GroupService) {
}
ngOnInit(): void {
}
@ViewChild('dirGroups') dirGroups!: DirGroupTableComponent;
ngAfterViewInit(): void {
}
dirGroupsRowSelection: GuiRowSelection = {
enabled: true,
type: GuiRowSelectionType.CHECKBOX,
mode: GuiRowSelectionMode.MULTIPLE
}
dirUsersRowSelection: GuiRowSelection = {
enabled: true,
type: GuiRowSelectionType.CHECKBOX,
mode: GuiRowSelectionMode.MULTIPLE
}
addSelectedGroups() {
let requests = [];
let numAdded: number = 0;
for (let row of this.dirGroups.selectedRows) {
// Create an Observable for each request and add it to the requests array
requests.push(
this.gService.createByDir({ 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

@@ -3,7 +3,6 @@ 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',

View File

@@ -13,4 +13,19 @@ export class DirUserTableComponent extends BaseTableComponent<DirUser, DirUserSe
constructor(service: DirUserService, @Inject('DIR_USER_TABLE_COLUMNS') columns: Array<GuiColumn>) {
super(service, columns)
}
}
fetchDataByGroupName(groupName: string): void {
this.service.getAll(groupName).subscribe({
next: (response) => {
if (response.isSuccess && response.data) {
this.source = response.data;
this.loading = false;
} else {
// Handle response failure
console.error('Failed to fetch users');
}
},
error: (error) => console.error('Error fetching users:', error)
})
}
}

View File

@@ -1,13 +1,18 @@
<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 class="row p-0 m-0">
<div class="col p-0 m-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)="addSelectedUsers()">Benutzer<br>Hinzufügen</button>
</form>
</nav>
</div>
<div class="col-6">
<app-dir-user-table #dirUsers [initData]="initWithoutData"></app-dir-user-table>
</div>
<div class="row align-items-start p-0 m-0">
<div class="col-6 p-0 m-0">
<app-dir-group-table #dirGroups [rowSelection]="dirGroupsRowSelection" [onSelectedRows]="dirGroupOnSelectedRows"></app-dir-group-table>
</div>
<div class="col-6 p-0 m-0">
<app-dir-user-table #dirUsers [initData]="initWithoutData" [rowSelection]="dirUsersRowSelection"></app-dir-user-table>
</div>
</div>

View File

@@ -1,11 +1,12 @@
import { AfterViewInit, Component, Inject, OnInit, ViewChild } from '@angular/core';
import { GuiRowSelection, GuiRowSelectionMode, GuiRowSelectionType } from '@generic-ui/ngx-grid';
import { 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';
import { DirGroupTableComponent } from '../tables/dir-group-table/dir-group-table.component';
import { DirUserTableComponent } from '../tables/dir-user-table/dir-user-table.component';
import { UserService } from 'src/app/services/user.service';
@Component({
selector: 'app-user-group-dir-import',
@@ -14,47 +15,55 @@ import { DirUserTableComponent } from '../tables/dir-user-table/dir-user-table.c
})
export class UserGroupDirImportComponent implements OnInit, AfterViewInit {
initWithoutData = () => {}
initWithoutData = () => { }
constructor(public gService: GroupService) {
constructor(private gService: GroupService, private uService: UserService) {
}
ngOnInit(): void {
}
@ViewChild('dirGroups') dirGroups!: DirGroupTableComponent;
@ViewChild('dirUsers') dirUsers!: DirUserTableComponent;
ngAfterViewInit(): void {
this.dirUsers.loading = false;
}
@ViewChild('dirGroups') dirGroups! : DirGroupTableComponent;
@ViewChild('dirUsers') dirUsers! : DirUserTableComponent;
dirGroupsRowSelection: GuiRowSelection = {
enabled: true,
type: GuiRowSelectionType.ROW,
mode: GuiRowSelectionMode.SINGLE
}
dirUsersRowSelection: GuiRowSelection = {
enabled: true,
type: GuiRowSelectionType.CHECKBOX,
mode: GuiRowSelectionMode.MULTIPLE
}
addSelectedGroups() {
addSelectedUsers() {
let requests = [];
let numAdded: number = 0;
for (let row of this.dirGroups.selectedRows) {
console.log(row)
console.log({ samaccountname: row?.source?.samaccountname })
for (let row of this.dirUsers.selectedRows) {
// Create an Observable for each request and add it to the requests array
requests.push(
this.gService.createByAd({ samaccountname: row?.source?.samaccountname }).pipe(
this.uService.create({
email: row?.source.emailAddress,
prename: row.source.givenName,
username: row.source.samAccountName,
name: row.source.surname,
}).pipe(
catchError((err) => {
console.log(err);
console.log('An error occurred', 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(() => {
@@ -62,13 +71,13 @@ export class UserGroupDirImportComponent implements OnInit, AfterViewInit {
Swal.fire({
icon: "success",
title: "Completed",
text: `${numAdded} new groups added`,
text: `${numAdded} new users added`,
position: "center",
showConfirmButton: false,
timer: 3000
});
this.dirGroups.safelyUnselectAll();
this.dirUsers.safelyUnselectAll();
})
).subscribe({
next: (results) => {
@@ -82,4 +91,12 @@ export class UserGroupDirImportComponent implements OnInit, AfterViewInit {
}
});
}
dirGroupOnSelectedRows = (rows: Array<GuiSelectedRow>) => {
if (rows.length > 0) {
this.dirGroups.safelyUnselectAll()
let groupName: string = rows[rows.length - 1].source.samaccountname;
this.dirUsers.fetchDataByGroupName(groupName);
}
}
}

View File

@@ -5,13 +5,13 @@ export interface User {
username: string;
shortname?: string;
email?: string;
language: string;
language?: string;
comment?: string;
deleted?: boolean;
dateFormat: string;
dateFormat?: string;
addedWho?: string;
changedWho?: string;
active: boolean;
active?: boolean;
}
@@ -71,12 +71,10 @@ export interface DirGroup {
}
export interface DirUser {
guid: string;
sId: string;
employeeId: string;
samAccountName: string;
givenName: string;
middleName: string;
middleName?: string;
surname: string;
emailAddress: string;
addedWho?: string;
}

View File

@@ -1,5 +1,6 @@
<header>
<nav class="nav nav-tabs navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow py-0 my-3">
<nav
class="nav nav-tabs navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow py-0 my-3">
<div class="container">
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-start" [ngClass]="{ show: isExpanded }">
<ul class=" navbar-nav flex-grow">
@@ -94,12 +95,38 @@
</ul>
</div>
<button class="btn btn-bd-primary d-flex align-items-center ms-2" type="button" (click)="importUser()">
<svg class="bi my-1 theme-icon-active" width="1.2em" height="1.2em" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 6C16 8.20914 14.2091 10 12 10C9.79086 10 8 8.20914 8 6C8 3.79086 9.79086 2 12 2C14.2091 2 16 3.79086 16 6Z" fill="#1C274C"/>
<path opacity="0.5" d="M14.4774 21.9208C13.7513 21.9728 12.9296 22 12 22C4 22 4 19.9853 4 17.5C4 15.0147 7.58172 13 12 13C14.8806 13 17.4056 13.8564 18.8142 15.1412C18.298 15 17.5737 15 16.5 15C14.8501 15 14.0251 15 13.5126 15.5126C13 16.0251 13 16.8501 13 18.5C13 20.1499 13 20.9749 13.5126 21.4874C13.7501 21.725 14.0547 21.8524 14.4774 21.9208Z" fill="#1C274C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.5 22C14.8501 22 14.0251 22 13.5126 21.4874C13 20.9749 13 20.1499 13 18.5C13 16.8501 13 16.0251 13.5126 15.5126C14.0251 15 14.8501 15 16.5 15C18.1499 15 18.9749 15 19.4874 15.5126C20 16.0251 20 16.8501 20 18.5C20 20.1499 20 20.9749 19.4874 21.4874C18.9749 22 18.1499 22 16.5 22ZM17.0833 16.9444C17.0833 16.6223 16.8222 16.3611 16.5 16.3611C16.1778 16.3611 15.9167 16.6223 15.9167 16.9444V17.9167H14.9444C14.6223 17.9167 14.3611 18.1778 14.3611 18.5C14.3611 18.8222 14.6223 19.0833 14.9444 19.0833H15.9167V20.0556C15.9167 20.3777 16.1778 20.6389 16.5 20.6389C16.8222 20.6389 17.0833 20.3777 17.0833 20.0556V19.0833H18.0556C18.3777 19.0833 18.6389 18.8222 18.6389 18.5C18.6389 18.1778 18.3777 17.9167 18.0556 17.9167H17.0833V16.9444Z" fill="#1C274C"/>
</svg>
<button class="btn btn-bd-primary d-flex align-items-center ms-2 p-0" type="button" (click)="importUser()">
<svg class="bi my-1 theme-icon-active" width="3em" height="2em" viewBox="0 0 24 24" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path
d="M16 6C16 8.20914 14.2091 10 12 10C9.79086 10 8 8.20914 8 6C8 3.79086 9.79086 2 12 2C14.2091 2 16 3.79086 16 6Z"
fill="#1C274C" />
<path opacity="0.5"
d="M14.4774 21.9208C13.7513 21.9728 12.9296 22 12 22C4 22 4 19.9853 4 17.5C4 15.0147 7.58172 13 12 13C14.8806 13 17.4056 13.8564 18.8142 15.1412C18.298 15 17.5737 15 16.5 15C14.8501 15 14.0251 15 13.5126 15.5126C13 16.0251 13 16.8501 13 18.5C13 20.1499 13 20.9749 13.5126 21.4874C13.7501 21.725 14.0547 21.8524 14.4774 21.9208Z"
fill="#1C274C" />
<path fill-rule="evenodd" clip-rule="evenodd"
d="M16.5 22C14.8501 22 14.0251 22 13.5126 21.4874C13 20.9749 13 20.1499 13 18.5C13 16.8501 13 16.0251 13.5126 15.5126C14.0251 15 14.8501 15 16.5 15C18.1499 15 18.9749 15 19.4874 15.5126C20 16.0251 20 16.8501 20 18.5C20 20.1499 20 20.9749 19.4874 21.4874C18.9749 22 18.1499 22 16.5 22ZM17.0833 16.9444C17.0833 16.6223 16.8222 16.3611 16.5 16.3611C16.1778 16.3611 15.9167 16.6223 15.9167 16.9444V17.9167H14.9444C14.6223 17.9167 14.3611 18.1778 14.3611 18.5C14.3611 18.8222 14.6223 19.0833 14.9444 19.0833H15.9167V20.0556C15.9167 20.3777 16.1778 20.6389 16.5 20.6389C16.8222 20.6389 17.0833 20.3777 17.0833 20.0556V19.0833H18.0556C18.3777 19.0833 18.6389 18.8222 18.6389 18.5C18.6389 18.1778 18.3777 17.9167 18.0556 17.9167H17.0833V16.9444Z"
fill="#1C274C" />
</svg>
</button>
<button class="btn btn-bd-primary d-flex align-items-center ms-2 p-0" type="button" (click)="importGroup()">
<svg fill="#000000" width="3em" height="2.5em" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 488.6 488.6" xml:space="preserve">
<g>
<g>
<path d="M480.9,333.2c-27.2-22.3-56.5-37.1-62.4-40c-0.7-0.3-1.1-1-1.1-1.8v-42.3c5.3-3.5,8.8-9.6,8.8-16.5v-43.9
c0-21.8-17.7-39.5-39.5-39.5H382h-4.7c-21.8,0-39.5,17.7-39.5,39.5v43.9c0,6.9,3.5,12.9,8.8,16.5v42.3c0,0.3-0.1,0.5-0.1,0.7
c8.3,5.7,17,12.1,25.5,19.1c9.9,8.2,15.6,20.2,15.6,33.2v35.3h101v-30.1C488.6,343.3,485.8,337.2,480.9,333.2z"/>
<path d="M142,291.4v-42.3c5.3-3.5,8.8-9.6,8.8-16.5v-43.9c0-21.8-17.7-39.5-39.5-39.5h-4.7h-4.7c-21.8,0-39.5,17.7-39.5,39.5v43.9
c0,6.9,3.5,12.9,8.8,16.5v42.3c0,0.7-0.4,1.4-1.1,1.8c-6,2.9-35.3,17.7-62.4,40c-4.9,4-7.7,10.1-7.7,16.4v30.1h101v-35.3
c0-12.9,5.7-25,15.6-33.2c8.5-7,17.2-13.4,25.5-19.1C142.1,291.9,142,291.7,142,291.4z"/>
<path d="M360.5,325.1c-31.9-26.2-66.3-43.6-73.4-47.1c-0.8-0.4-1.3-1.2-1.3-2.1v-49.7c6.2-4.2,10.4-11.3,10.4-19.3v-51.6
c0-25.6-20.8-46.4-46.4-46.4h-5.5h-5.5c-25.6,0-46.4,20.8-46.4,46.4v51.5c0,8.1,4.1,15.2,10.4,19.3v49.7c0,0.9-0.5,1.7-1.3,2.1
c-7,3.4-41.4,20.8-73.4,47.1c-5.8,4.7-9.1,11.8-9.1,19.3v35.3h108.9l10.8-49.3c-21.7-30.3,1.6-31.8,5.7-31.8l0,0l0,0
c4.1,0,27.4,1.5,5.7,31.8l10.8,49.3h108.9v-35.3C369.6,336.9,366.3,329.8,360.5,325.1z"/>
</g>
</g>
</svg>
</button>
</div>
</nav>

View File

@@ -1,6 +1,7 @@
import { Component } from '@angular/core';
import {MatDialog} from '@angular/material/dialog';
import { MatDialog } from '@angular/material/dialog';
import { UserGroupDirImportComponent } from '../components/user-group-dir-import/user-group-dir-import.component';
import { GroupDirImportComponent } from '../components/group-dir-import/group-dir-import.component';
@Component({
selector: 'app-nav-menu',
@@ -10,10 +11,10 @@ import { UserGroupDirImportComponent } from '../components/user-group-dir-import
export class NavMenuComponent {
isExpanded = false;
constructor(public dialog: MatDialog){
constructor(public dialog: MatDialog) {
}
collapse() {
this.isExpanded = false;
}
@@ -22,13 +23,14 @@ export class NavMenuComponent {
this.isExpanded = !this.isExpanded;
}
importUser() {
const dialogRef = this.dialog.open(UserGroupDirImportComponent, {
});
dialogRef.afterClosed().subscribe(result => {
console.log('The dialog was closed');
width: "50vw"
});
}
}
importGroup() {
const dialogRef = this.dialog.open(GroupDirImportComponent, {
width: "50vw"
});
}
}

View File

@@ -1,7 +1,9 @@
import { Injectable, Inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { HttpClient, HttpParams } from '@angular/common/http';
import { DirUser } from '../models/user-management.api.models';
import { ApiService } from './user-management.api.service';
import { Observable } from 'rxjs/internal/Observable';
import { ApiResponseModel } from '../models/api.response.model';
@Injectable({
providedIn: 'root'
@@ -10,4 +12,13 @@ export class DirUserService extends ApiService<DirUser> {
constructor(http: HttpClient, @Inject('DIR_USER_URL') private userUri: string) {
super(http, userUri);
}
override getAll(groupName?: string): Observable<ApiResponseModel<DirUser[]>> {
let params = new HttpParams();
if (groupName) {
params = params.set('groupName', groupName);
}
return this.http.get<ApiResponseModel<DirUser[]>>(this.baseUrl, { params });
}
}

View File

@@ -0,0 +1,23 @@
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';
import { ApiResponseModel } from '../models/api.response.model';
import { Inject, Injectable } from '@angular/core';
import { DirUser } from '../models/user-management.api.models';
@Injectable({
providedIn: 'root'
})
export class DirService {
constructor(private http: HttpClient, @Inject('DIR_URL') private baseUrl: string) {
this.http = http;
}
getUser(groupName: string): Observable<ApiResponseModel<DirUser[]>> {
let params = new HttpParams();
if (groupName) {
params = params.set('groupName', groupName);
}
return this.http.get<ApiResponseModel<DirUser[]>>(this.baseUrl, { params });
}
}

View File

@@ -21,12 +21,12 @@ export class GroupOfUserService extends ApiService<GroupOfUser> {
override getAll(withUser: boolean = false, withGroup: boolean = false): Observable<ApiResponseModel<GroupOfUser[]>> {
let params = new HttpParams();
if (withUser) {
params = params.set('withUser', 'true');
params = params.set('withUser', withUser);
}
if (withGroup) {
params = params.set('withGroup', 'true');
params = params.set('withGroup', withGroup);
}
return this.http.get<ApiResponseModel<GroupOfUser[]>>(`${this.baseUrl}`, { params });
return this.http.get<ApiResponseModel<GroupOfUser[]>>(this.baseUrl, { params });
}
}

View File

@@ -12,7 +12,7 @@ export class GroupService extends ApiService<Group> {
super(http, userUri);
}
createByAd(createModel: DirGroup): Observable<DirGroup> {
return this.http.post<DirGroup>(`${this.baseUrl}/byAd`, createModel);
createByDir(createModel: DirGroup): Observable<DirGroup> {
return this.http.post<DirGroup>(`${this.baseUrl}/byDir`, createModel);
}
}

View File

@@ -1,6 +1,6 @@
import { Injectable, Inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { User } from '../models/user-management.api.models';
import { DirUser, User } from '../models/user-management.api.models';
import { ApiService } from './user-management.api.service';
import { Observable } from 'rxjs';
import { ApiResponseModel } from '../models/api.response.model';
@@ -22,4 +22,9 @@ export class UserService extends ApiService<User> {
const url = `${this.baseUrl}/ByGroupId/${groupId}?assigned=${assigned}`;
return this.http.get<ApiResponseModel<User[]>>(url);
}
createByDir(createModel: DirUser): Observable<DirUser> {
console.log(createModel)
return this.http.post<DirUser>(`${this.baseUrl}/byDir`, createModel);
}
}

View File

@@ -7,7 +7,7 @@
<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" dir-group-route="directory/Group?propName=samaccountname"
dir-user-route="directory/user"/>
dir-user-route="directory/user" dir-route="directory"/>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" type="image/x-icon" href="favicon.ico" />

View File

@@ -36,6 +36,9 @@ export function getDirGroupUrl() {
export function getDirUserUrl() {
return `${getUserManagerUrl()}${document.getElementsByTagName("user-manager-api")[0].getAttribute("dir-user-route")}`;
}
export function getDirUrl() {
return `${getUserManagerUrl()}${document.getElementsByTagName("user-manager-api")[0].getAttribute("dir-route")}`;
}
var columnNames = {
user: [
@@ -102,8 +105,7 @@ var columnNames = {
header: 'E-email',
field: 'emailAddress'
}
]
,
],
module: [
{
header: "Produkt",
@@ -151,13 +153,14 @@ const providers = [
{ provide: 'USER_REP_URL', useFactory: getUserRepUrl, deps: [] },
{ provide: 'DIR_GROUP_URL', useFactory: getDirGroupUrl, deps: [] },
{ provide: 'DIR_USER_URL', useFactory: getDirUserUrl, deps: [] },
{ provide: 'DIR_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: [] },
{ provide: 'GROUP_REP_TABLE_COLUMNS', useFactory: () => columnNames.group.representative, deps: [] },
{ 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: 'USER_REP_TABLE_COLUMNS', useFactory: () => columnNames.userRep, deps: [] },
{ provide: 'DIR_GROUP_TABLE_COLUMNS', useFactory: () => columnNames.dirGroup, deps: [] },
{ provide: 'DIR_USER_TABLE_COLUMNS', useFactory: () => columnNames.dirUser, deps: [] }
];