Skip to content
Snippets Groups Projects
Verified Commit bc38ed08 authored by Sebastian Bergandy's avatar Sebastian Bergandy :keyboard:
Browse files

OZG-7405 revert ozgcloud menu for assign user

Assign user should not be implemented with drop down menu.
parent 0e17872f
No related branches found
No related tags found
1 merge request!3OZG-7405 Replace ozgcloud-menu with ods-dropdown-menu
Showing
with 206 additions and 29 deletions
<!--
Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
Ministerpräsidenten des Landes Schleswig-Holstein
Staatskanzlei
Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
Lizenziert unter der EUPL, Version 1.2 oder - sobald
diese von der Europäischen Kommission genehmigt wurden -
Folgeversionen der EUPL ("Lizenz");
Sie dürfen dieses Werk ausschließlich gemäß
dieser Lizenz nutzen.
Eine Kopie der Lizenz finden Sie hier:
https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
Sofern nicht durch anwendbare Rechtsvorschriften
gefordert oder in schriftlicher Form vereinbart, wird
die unter der Lizenz verbreitete Software "so wie sie
ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
ausdrücklich oder stillschweigend - verbreitet.
Die sprachspezifischen Genehmigungen und Beschränkungen
unter der Lizenz sind dem Lizenztext zu entnehmen.
-->
<mat-menu #menu="matMenu" class="menu">
<ng-content></ng-content>
</mat-menu>
/**
* Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
/*
* Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatMenuModule } from '@angular/material/menu';
import { OzgcloudMenuComponent } from './ozgcloud-menu.component';
describe('OzgcloudMenuComponent', () => {
let component: OzgcloudMenuComponent;
let fixture: ComponentFixture<OzgcloudMenuComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [OzgcloudMenuComponent],
imports: [MatMenuModule],
}).compileComponents();
fixture = TestBed.createComponent(OzgcloudMenuComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
/*
* Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
import { Component, ViewChild } from '@angular/core';
import { MatMenu } from '@angular/material/menu';
@Component({
selector: 'ozgcloud-menu',
templateUrl: './ozgcloud-menu.component.html',
styleUrls: ['./ozgcloud-menu.component.scss'],
})
export class OzgcloudMenuComponent {
@ViewChild('menu', { static: true }) matMenu: MatMenu;
}
...@@ -81,6 +81,7 @@ import { OzgcloudIconButtonPrimaryComponent } from './ozgcloud-button/ozgcloud-i ...@@ -81,6 +81,7 @@ import { OzgcloudIconButtonPrimaryComponent } from './ozgcloud-button/ozgcloud-i
import { OzgcloudStrokedButtonWithSpinnerComponent } from './ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component'; import { OzgcloudStrokedButtonWithSpinnerComponent } from './ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component';
import { OzgcloudButtonContentComponent } from './ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component'; import { OzgcloudButtonContentComponent } from './ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component';
import { OzgcloudIconComponent } from './ozgcloud-icon/ozgcloud-icon.component'; import { OzgcloudIconComponent } from './ozgcloud-icon/ozgcloud-icon.component';
import { OzgcloudMenuComponent } from './ozgcloud-menu/ozgcloud-menu.component';
import { OzgcloudPasteTextButtonComponent } from './ozgcloud-paste-text-button/ozgcloud-paste-text-button.component'; import { OzgcloudPasteTextButtonComponent } from './ozgcloud-paste-text-button/ozgcloud-paste-text-button.component';
import { OzgcloudRoutingButtonComponent } from './ozgcloud-routing-button/ozgcloud-routing-button.component'; import { OzgcloudRoutingButtonComponent } from './ozgcloud-routing-button/ozgcloud-routing-button.component';
import { OzgcloudSvgIconBigComponent } from './ozgcloud-svgicon-big/ozgcloud-svgicon-big.component'; import { OzgcloudSvgIconBigComponent } from './ozgcloud-svgicon-big/ozgcloud-svgicon-big.component';
...@@ -132,6 +133,7 @@ import { ValidationErrorComponent } from './validation-error/validation-error.co ...@@ -132,6 +133,7 @@ import { ValidationErrorComponent } from './validation-error/validation-error.co
OzgcloudButtonContentComponent, OzgcloudButtonContentComponent,
OzgcloudPasteTextButtonComponent, OzgcloudPasteTextButtonComponent,
CheckboxEnumEditorComponent, CheckboxEnumEditorComponent,
OzgcloudMenuComponent,
], ],
imports: [ imports: [
MatButtonModule, MatButtonModule,
...@@ -229,6 +231,7 @@ import { ValidationErrorComponent } from './validation-error/validation-error.co ...@@ -229,6 +231,7 @@ import { ValidationErrorComponent } from './validation-error/validation-error.co
CheckboxEnumEditorComponent, CheckboxEnumEditorComponent,
FileUploadButtonComponent, FileUploadButtonComponent,
OzgcloudButtonContentComponent, OzgcloudButtonContentComponent,
OzgcloudMenuComponent,
], ],
providers: [ providers: [
{ {
......
...@@ -23,16 +23,28 @@ ...@@ -23,16 +23,28 @@
unter der Lizenz sind dem Lizenztext zu entnehmen. unter der Lizenz sind dem Lizenztext zu entnehmen.
--> -->
<ods-dropdown-menu (opened)="showUserProfileSearch()"> <button
#menuTrigger="matMenuTrigger"
[matMenuTriggerFor]="menu.matMenu"
(menuOpened)="showUserProfileSearch()"
(menuClosed)="hideUserProfileSearch()"
[attr.aria-label]="userButtonLabel"
class="user-profile-button"
>
<alfa-user-icon <alfa-user-icon
button-content
data-test-id="user-profile-icon" data-test-id="user-profile-icon"
[userProfileStateResource]="userProfile" [userProfileStateResource]="userProfile"
class="user-profile-icon" class="user-profile-icon"
> >
</alfa-user-icon> </alfa-user-icon>
<ods-dropdown-menu-item *ngIf="userProfileSearchVisibility$ | async" (click)="$event.stopPropagation()"> </button>
<alfa-user-profile-search-container data-test-id="user-profile-search-container" (assigned)="hideUserProfileSearch()">
<ozgcloud-menu #menu>
<alfa-user-profile-search-container
*ngIf="showUserProfileSearch$ | async"
data-test-id="user-profile-search-container"
(click)="$event.stopPropagation()"
(assigned)="menuTrigger.closeMenu()"
>
</alfa-user-profile-search-container> </alfa-user-profile-search-container>
</ods-dropdown-menu-item> </ozgcloud-menu>
</ods-dropdown-menu>
...@@ -26,8 +26,9 @@ import { mock } from '@alfa-client/test-utils'; ...@@ -26,8 +26,9 @@ import { mock } from '@alfa-client/test-utils';
import { UiModule } from '@alfa-client/ui'; import { UiModule } from '@alfa-client/ui';
import { UserProfileResource, UserProfileService } from '@alfa-client/user-profile-shared'; import { UserProfileResource, UserProfileService } from '@alfa-client/user-profile-shared';
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DropdownMenuComponent, DropdownMenuItemComponent } from '@ods/system';
import { MockComponent } from 'ng-mocks'; import { MockComponent } from 'ng-mocks';
import { BehaviorSubject } from 'rxjs';
import { OzgcloudMenuComponent } from '../../../../../../ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component';
import { UserIconComponent } from '../../../user-icon/user-icon.component'; import { UserIconComponent } from '../../../user-icon/user-icon.component';
import { UserProfileSearchContainerComponent } from '../../../user-profile-search-container/user-profile-search-container.component'; import { UserProfileSearchContainerComponent } from '../../../user-profile-search-container/user-profile-search-container.component';
import { UserProfileButtonContainerComponent } from './user-profile-button-container.component'; import { UserProfileButtonContainerComponent } from './user-profile-button-container.component';
...@@ -36,9 +37,10 @@ describe('UserProfileButtonContainerComponent', () => { ...@@ -36,9 +37,10 @@ describe('UserProfileButtonContainerComponent', () => {
let component: UserProfileButtonContainerComponent; let component: UserProfileButtonContainerComponent;
let fixture: ComponentFixture<UserProfileButtonContainerComponent>; let fixture: ComponentFixture<UserProfileButtonContainerComponent>;
const userProfileSearchVisbilitySubj: BehaviorSubject<boolean> = new BehaviorSubject(false);
const userProfileService = { const userProfileService = {
...mock(UserProfileService), ...mock(UserProfileService),
getUserProfileSearchVisibility: jest.fn().mockResolvedValue(Promise.resolve()), getUserProfileSearchVisibility: () => userProfileSearchVisbilitySubj,
}; };
beforeEach(async () => { beforeEach(async () => {
...@@ -47,8 +49,7 @@ describe('UserProfileButtonContainerComponent', () => { ...@@ -47,8 +49,7 @@ describe('UserProfileButtonContainerComponent', () => {
UserProfileButtonContainerComponent, UserProfileButtonContainerComponent,
MockComponent(UserIconComponent), MockComponent(UserIconComponent),
MockComponent(UserProfileSearchContainerComponent), MockComponent(UserProfileSearchContainerComponent),
MockComponent(DropdownMenuComponent), MockComponent(OzgcloudMenuComponent),
MockComponent(DropdownMenuItemComponent),
], ],
providers: [ providers: [
{ {
...@@ -72,9 +73,31 @@ describe('UserProfileButtonContainerComponent', () => { ...@@ -72,9 +73,31 @@ describe('UserProfileButtonContainerComponent', () => {
describe('ngOnInit', () => { describe('ngOnInit', () => {
it('should call getUserProfileSearchVisibility', () => { it('should call getUserProfileSearchVisibility', () => {
component.getUserProfileSearchVisibility = jest.fn();
component.ngOnInit(); component.ngOnInit();
expect(userProfileService.getUserProfileSearchVisibility).toHaveBeenCalled(); expect(component.getUserProfileSearchVisibility).toHaveBeenCalled();
});
});
describe('getUserProfileSearchVisibility', () => {
it('should call handleVisibilityChange', () => {
component.handleVisibilityChange = jest.fn();
component.getUserProfileSearchVisibility().subscribe();
expect(component.handleVisibilityChange).toHaveBeenCalled();
});
});
describe('handleVisibilityChange', () => {
it('should openMenu if changed to true', () => {
component.menuTrigger.openMenu = jest.fn();
component.handleVisibilityChange(true);
expect(component.menuTrigger.openMenu).toHaveBeenCalled();
}); });
}); });
...@@ -92,14 +115,6 @@ describe('UserProfileButtonContainerComponent', () => { ...@@ -92,14 +115,6 @@ describe('UserProfileButtonContainerComponent', () => {
expect(userProfileService.hideUserProfileSearch).toHaveBeenCalled(); expect(userProfileService.hideUserProfileSearch).toHaveBeenCalled();
}); });
it('should call menu.closeMenu', () => {
component.menu.closeMenu = jest.fn();
component.hideUserProfileSearch();
expect(component.menu.closeMenu).toHaveBeenCalled();
});
}); });
describe('getUserButtonLabel', () => { describe('getUserButtonLabel', () => {
......
...@@ -22,10 +22,14 @@ ...@@ -22,10 +22,14 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
import { StateResource } from '@alfa-client/tech-shared'; import { StateResource } from '@alfa-client/tech-shared';
import { getUserName, UserProfileResource, UserProfileService } from '@alfa-client/user-profile-shared'; import {
getUserName,
UserProfileResource,
UserProfileService,
} from '@alfa-client/user-profile-shared';
import { Component, Input, OnInit, ViewChild } from '@angular/core'; import { Component, Input, OnInit, ViewChild } from '@angular/core';
import { DropdownMenuComponent } from '@ods/system'; import { MatMenuTrigger } from '@angular/material/menu';
import { Observable } from 'rxjs'; import { Observable, tap } from 'rxjs';
@Component({ @Component({
selector: 'alfa-user-profile-button-container', selector: 'alfa-user-profile-button-container',
...@@ -33,8 +37,6 @@ import { Observable } from 'rxjs'; ...@@ -33,8 +37,6 @@ import { Observable } from 'rxjs';
styleUrls: ['./user-profile-button-container.component.scss'], styleUrls: ['./user-profile-button-container.component.scss'],
}) })
export class UserProfileButtonContainerComponent implements OnInit { export class UserProfileButtonContainerComponent implements OnInit {
@ViewChild(DropdownMenuComponent) menu: DropdownMenuComponent;
@Input() @Input()
set userProfile(value: StateResource<UserProfileResource>) { set userProfile(value: StateResource<UserProfileResource>) {
this._userProfile = value; this._userProfile = value;
...@@ -45,14 +47,28 @@ export class UserProfileButtonContainerComponent implements OnInit { ...@@ -45,14 +47,28 @@ export class UserProfileButtonContainerComponent implements OnInit {
return this._userProfile; return this._userProfile;
} }
userProfileSearchVisibility$: Observable<boolean>; @ViewChild(MatMenuTrigger) menuTrigger: MatMenuTrigger;
showUserProfileSearch$: Observable<boolean>;
private _userProfile: StateResource<UserProfileResource>; private _userProfile: StateResource<UserProfileResource>;
userButtonLabel: string; userButtonLabel: string;
constructor(public userProfileService: UserProfileService) {} constructor(public userProfileService: UserProfileService) {}
ngOnInit(): void { ngOnInit(): void {
this.userProfileSearchVisibility$ = this.userProfileService.getUserProfileSearchVisibility(); this.showUserProfileSearch$ = this.getUserProfileSearchVisibility();
}
getUserProfileSearchVisibility(): Observable<boolean> {
return this.userProfileService
.getUserProfileSearchVisibility()
.pipe(tap((visibility: boolean) => this.handleVisibilityChange(visibility)));
}
handleVisibilityChange(visibility: boolean): void {
if (visibility) {
this.menuTrigger.openMenu();
}
} }
public showUserProfileSearch(): void { public showUserProfileSearch(): void {
...@@ -61,7 +77,6 @@ export class UserProfileButtonContainerComponent implements OnInit { ...@@ -61,7 +77,6 @@ export class UserProfileButtonContainerComponent implements OnInit {
public hideUserProfileSearch(): void { public hideUserProfileSearch(): void {
this.userProfileService.hideUserProfileSearch(); this.userProfileService.hideUserProfileSearch();
this.menu.closeMenu();
} }
public getUserButtonLabel(): string { public getUserButtonLabel(): string {
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
:host { :host {
padding: 8px 16px;
display: block; display: block;
background-color: inherit; background-color: inherit;
} }
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
<ozgcloud-autocomplete-editor <ozgcloud-autocomplete-editor
data-test-id="user-search" data-test-id="user-search"
label="Bearbeiter" label="Bearbeiter"
[required]="false" [required]="true"
[formControlName]="formServiceClass.SEARCH_FIELD" [formControlName]="formServiceClass.SEARCH_FIELD"
[values]="searchedUserProfiles.resource" [values]="searchedUserProfiles.resource"
(onKeyUp)="onKeyUp()" (onKeyUp)="onKeyUp()"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment