fix: additional bug fixes in OverlayComponent

This commit is contained in:
Chneemann 2025-04-06 15:54:18 +02:00
parent 0e0e2db776
commit 0be9f98cca
6 changed files with 209 additions and 230 deletions

View file

@ -83,13 +83,13 @@ export class AddTaskComponent implements OnInit {
}
async loadExistingTaskData() {
if (this.overlayData) {
if (this.overlayType === 'newTaskOverlay') {
this.taskData.status = this.overlayData;
} else if (this.overlayData) {
const taskData = await firstValueFrom(this.getTaskData(this.overlayData));
if (taskData) {
this.taskData = { ...this.taskData, ...taskData };
}
} else if (this.overlayType === 'newTaskOverlay') {
this.taskData.status = this.overlayData;
}
}

View file

@ -31,7 +31,7 @@
>
<span class="line"></span>
</div>
<button class="btn" type="submit" (click)="addNewTaskOverlay('none')">
<button class="btn" type="submit" (click)="addNewTaskOverlay(TODO)">
<div class="btn-inside">
<span>{{ "board.addTask" | translate }}</span>
<img src="./../../../assets/img/board/add_white.svg" alt="check" />

View file

@ -1,159 +1,157 @@
<section>
<form
(ngSubmit)="onSubmit(contactForm)"
(keyup)="updateFormData()"
#contactForm="ngForm"
onsubmit="return false"
class="contact-formular"
>
<div class="name">
<input
id="firstName"
type="text"
class="firstName"
name="firstName"
#firstName="ngModel"
placeholder="{{
contactData.firstName !== ''
? contactData.firstName
: ('contactDialogForm.firstName' | translate)
}}"
[(ngModel)]="contactData.firstName"
pattern="[A-Za-z]+"
autocomplete="off"
required
/>
@if (resizeService.isContactViewMedia) {
<div class="error-msg">
@if (firstName.hasError('pattern') && firstName.touched) {
<p>{{ "contactDialogForm.invalidPattern" | translate }}</p>
} @else { @if (!firstName.valid && firstName.touched) {
<p>{{ "contactDialogForm.invalidFirstName" | translate }}</p>
}}
</div>
}
<input
id="lastName"
type="text"
class="lastName"
name="lastName"
#lastName="ngModel"
placeholder="{{
contactData.lastName !== ''
? contactData.lastName
: ('contactDialogForm.lastName' | translate)
}}"
[(ngModel)]="contactData.lastName"
pattern="[A-Za-z]+"
autocomplete="off"
required
/>
</div>
@if (resizeService.isContactViewMedia) {
<div class="error-msg">
@if (lastName.hasError('pattern') && lastName.touched) {
<p>{{ "contactDialogForm.invalidPattern" | translate }}</p>
} @else { @if (!lastName.valid && lastName.touched) {
<p>{{ "contactDialogForm.invalidLastName" | translate }}</p>
}}
</div>
} @if (!resizeService.isContactViewMedia) {
<div class="error-msg">
@if (firstName.hasError('pattern') || lastName.hasError('pattern') &&
firstName.touched) {
<p>{{ "contactDialogForm.invalidPattern" | translate }}</p>
} @else { @if ((!firstName.valid && firstName.touched) && (!lastName.valid
&& lastName.touched)) {
<p>{{ "contactDialogForm.invalidName" | translate }}</p>
} @else { @if (!firstName.valid && firstName.touched &&
!firstName.hasError('pattern')) {
<p>{{ "contactDialogForm.invalidFirstName" | translate }}</p>
} @else { @if (!lastName.valid && lastName.touched &&
!lastName.hasError('pattern')) {
<p>{{ "contactDialogForm.invalidLastName" | translate }}</p>
} } } }
</div>
}
<form
(ngSubmit)="onSubmit(contactForm)"
(keyup)="updateFormData()"
#contactForm="ngForm"
onsubmit="return false"
class="contact-formular"
>
<div class="name">
<input
id="email"
type="email"
name="email"
#email="ngModel"
id="firstName"
type="text"
class="firstName"
name="firstName"
#firstName="ngModel"
placeholder="{{
contactData.email !== ''
? contactData.email
: ('contactDialogForm.email' | translate)
contactData.firstName !== ''
? contactData.firstName
: ('contactDialogForm.firstName' | translate)
}}"
[(ngModel)]="contactData.email"
[(ngModel)]="contactData.firstName"
pattern="[A-Za-z]+"
autocomplete="off"
required
/>
@if (resizeService.isContactViewMedia) {
<div class="error-msg">
@if(!email.valid && email.touched &&
!checkIfUserEmailIsValid(contactData.email)) {
<p>{{ "contactDialogForm.invalidMail0" | translate }}</p>
} @else { @if (email.touched &&
!checkIfUserEmailIsValid(contactData.email)) {
<p>{{ "contactDialogForm.invalidMail1" | translate }}</p>
} @else { @if (existEmailOnServer(contactData.email) &&
!contactData.email) {
<p>{{ "contactDialogForm.invalidMail2" | translate }}</p>
} } }
@if (firstName.hasError('pattern') && firstName.touched) {
<p>{{ "contactDialogForm.invalidPattern" | translate }}</p>
} @else { @if (!firstName.valid && firstName.touched) {
<p>{{ "contactDialogForm.invalidFirstName" | translate }}</p>
}}
</div>
}
<input
id="phone"
type="phone"
name="phone"
#phone="ngModel"
id="lastName"
type="text"
class="lastName"
name="lastName"
#lastName="ngModel"
placeholder="{{
contactData.phone !== ''
? contactData.phone
: ('contactDialogForm.phone' | translate)
contactData.lastName !== ''
? contactData.lastName
: ('contactDialogForm.lastName' | translate)
}}"
[(ngModel)]="contactData.phone"
pattern="[\d\+\-\(\)\/]{10,15}"
[(ngModel)]="contactData.lastName"
pattern="[A-Za-z]+"
autocomplete="off"
required
/>
<div class="error-msg">
@if (!phone.valid && phone.touched) {
<p>{{ "contactDialogForm.invalidPhone" | translate }}</p>
}
</div>
<div class="btns">
@if (selectedUserExists) {
<app-form-btn
class="btn-delete"
type="button"
value="{{ 'contactDialogForm.btnDelete' | translate }}"
(click)="toggleConfirmDialog()"
></app-form-btn>
} @else {
<app-form-btn
class="btn-cancel"
type="button"
value="{{ 'contactDialogForm.btnCancel' | translate }}"
(click)="closeDialog()"
></app-form-btn>
}
<app-form-btn
[class]="'btn-submit'"
[type]="'submit'"
[img]="'check'"
[imgFilter]="'none'"
value="{{ 'contactDialogForm.btnSave' | translate }}"
[disabled]="
firstName.invalid ||
!contactData.firstName ||
lastName.invalid ||
!contactData.lastName ||
email.invalid ||
!contactData.email ||
!checkIfUserEmailIsValid(contactData.email)
"
></app-form-btn>
</div>
</form>
</section>
</div>
@if (resizeService.isContactViewMedia) {
<div class="error-msg">
@if (lastName.hasError('pattern') && lastName.touched) {
<p>{{ "contactDialogForm.invalidPattern" | translate }}</p>
} @else { @if (!lastName.valid && lastName.touched) {
<p>{{ "contactDialogForm.invalidLastName" | translate }}</p>
}}
</div>
} @if (!resizeService.isContactViewMedia) {
<div class="error-msg">
@if (firstName.hasError('pattern') || lastName.hasError('pattern') &&
firstName.touched) {
<p>{{ "contactDialogForm.invalidPattern" | translate }}</p>
} @else { @if ((!firstName.valid && firstName.touched) && (!lastName.valid
&& lastName.touched)) {
<p>{{ "contactDialogForm.invalidName" | translate }}</p>
} @else { @if (!firstName.valid && firstName.touched &&
!firstName.hasError('pattern')) {
<p>{{ "contactDialogForm.invalidFirstName" | translate }}</p>
} @else { @if (!lastName.valid && lastName.touched &&
!lastName.hasError('pattern')) {
<p>{{ "contactDialogForm.invalidLastName" | translate }}</p>
} } } }
</div>
}
<input
id="email"
type="email"
name="email"
#email="ngModel"
placeholder="{{
contactData.email !== ''
? contactData.email
: ('contactDialogForm.email' | translate)
}}"
[(ngModel)]="contactData.email"
autocomplete="off"
required
/>
<div class="error-msg">
@if(!email.valid && email.touched &&
!checkIfUserEmailIsValid(contactData.email)) {
<p>{{ "contactDialogForm.invalidMail0" | translate }}</p>
} @else { @if (email.touched && !checkIfUserEmailIsValid(contactData.email))
{
<p>{{ "contactDialogForm.invalidMail1" | translate }}</p>
} @else { @if (existEmailOnServer(contactData.email) && !contactData.email)
{
<p>{{ "contactDialogForm.invalidMail2" | translate }}</p>
} } }
</div>
<input
id="phone"
type="phone"
name="phone"
#phone="ngModel"
placeholder="{{
contactData.phone !== ''
? contactData.phone
: ('contactDialogForm.phone' | translate)
}}"
[(ngModel)]="contactData.phone"
pattern="[\d\+\-\(\)\/]{10,15}"
autocomplete="off"
/>
<div class="error-msg">
@if (!phone.valid && phone.touched) {
<p>{{ "contactDialogForm.invalidPhone" | translate }}</p>
}
</div>
<div class="btns">
@if (selectedUserExists) {
<app-form-btn
class="btn-delete"
type="button"
value="{{ 'contactDialogForm.btnDelete' | translate }}"
(click)="toggleConfirmDialog()"
></app-form-btn>
} @else {
<app-form-btn
class="btn-cancel"
type="button"
value="{{ 'contactDialogForm.btnCancel' | translate }}"
(click)="closeDialog()"
></app-form-btn>
}
<app-form-btn
[class]="'btn-submit'"
[type]="'submit'"
[img]="'check'"
[imgFilter]="'none'"
value="{{ 'contactDialogForm.btnSave' | translate }}"
[disabled]="
firstName.invalid ||
!contactData.firstName ||
lastName.invalid ||
!contactData.lastName ||
email.invalid ||
!contactData.email ||
!checkIfUserEmailIsValid(contactData.email)
"
></app-form-btn>
</div>
</form>
<!-- Confirm dialog -->
<app-confirm-dialog

View file

@ -1,69 +1,67 @@
@if (overlayData !== "new") {
<section class="overlay">
<div class="dialog">
<div class="header">
<img src="./../../../../assets/img/logo.svg" alt="" />
<p>{{ "contacts.editContact" | translate }}</p>
<app-btn-close (click)="closeDialog()"></app-btn-close>
</div>
<div class="content">
<div class="badge">
<div class="picker">
<input
[(colorPicker)]="overlayData.color"
[style.background]="newColor === '' ? overlayData.color : newColor"
(colorPickerChange)="updateColor($event)"
/>
<div class="initials">
@if (!userInitials) {
{{ overlayData.initials }} } @else {
{{ userInitials }}
}
</div>
<div class="overlay">
<div class="header">
<img src="./../../../../assets/img/logo.svg" alt="" />
<p>{{ "contacts.editContact" | translate }}</p>
<app-btn-close (click)="closeDialog()"></app-btn-close>
</div>
<div class="content">
<div class="badge">
<div class="picker">
<input
[(colorPicker)]="overlayData.color"
[style.background]="newColor === '' ? overlayData.color : newColor"
(colorPickerChange)="updateColor($event)"
/>
<div class="initials">
@if (!userInitials) {
{{ overlayData.initials }} } @else {
{{ userInitials }}
}
</div>
</div>
<div class="form">
<app-contact-form
(initialsEmitter)="initialsEmitter($event)"
(closeDialogEmitter)="closeDialog()"
[selectedUser]="overlayData"
[newColor]="newColor"
[currentColor]="overlayData.color"
></app-contact-form>
</div>
</div>
<div class="notice">{{ "contacts.notice" | translate }}</div>
<div class="form">
<app-contact-form
(initialsEmitter)="initialsEmitter($event)"
(closeDialogEmitter)="closeDialog()"
[selectedUser]="overlayData"
[newColor]="newColor"
[currentColor]="overlayData.color"
></app-contact-form>
</div>
</div>
</section>
<div class="notice">{{ "contacts.notice" | translate }}</div>
</div>
} @else {
<section class="overlay">
<div class="dialog">
<div class="header">
<img src="./../../../../assets/img/logo.svg" alt="" />
<p>{{ "contacts.addContact" | translate }}</p>
<app-btn-close (click)="closeDialog()"></app-btn-close>
</div>
<div class="content">
<div class="badge">
<div class="picker">
<input
[(colorPicker)]="randomColor"
[style.background]="randomColor"
(colorPickerSelect)="updateColor($event)"
/>
<div class="initials">{{ userInitials }}</div>
</div>
</div>
<div class="form">
<app-contact-form
(initialsEmitter)="initialsEmitter($event)"
(closeDialogEmitter)="closeDialog()"
[randomColor]="randomColor"
[newColor]="newColor"
></app-contact-form>
</div>
</div>
<div class="notice">{{ "contacts.notice" | translate }}</div>
<div class="overlay">
<div class="header">
<img src="./../../../../assets/img/logo.svg" alt="" />
<p>{{ "contacts.addContact" | translate }}</p>
<app-btn-close (click)="closeDialog()"></app-btn-close>
</div>
</section>
<div class="content">
<div class="badge">
<div class="picker">
<input
[(colorPicker)]="randomColor"
[style.background]="randomColor"
(colorPickerSelect)="updateColor($event)"
/>
<div class="initials">{{ userInitials }}</div>
</div>
</div>
<div class="form">
<app-contact-form
(initialsEmitter)="initialsEmitter($event)"
(closeDialogEmitter)="closeDialog()"
[randomColor]="randomColor"
[newColor]="newColor"
></app-contact-form>
</div>
</div>
<div class="notice">{{ "contacts.notice" | translate }}</div>
</div>
}

View file

@ -1,17 +1,4 @@
section {
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: flex;
justify-content: center;
align-items: center;
}
.dialog {
.overlay {
background-color: var(--white);
width: 760px;
height: auto;

View file

@ -59,19 +59,15 @@ export class OverlayComponent implements OnInit {
}
@HostListener('document:click', ['$event'])
/**
* Checks if a click event occurred within the overlay but outside the content or dialog elements.
* If so, closes the overlay by emitting an event.
* Closes the contact edit overlay if the user clicks on the overlay background.
*
* @param event The MouseEvent that triggered the check.
* @param event The MouseEvent triggered by a click action.
*/
checkOpenContactEdit(event: MouseEvent) {
const targetElement = event.target as HTMLElement;
if (
targetElement.closest('.overlay') &&
(!targetElement.closest('.content') || !targetElement.closest('.dialog'))
) {
if (targetElement === document.querySelector('.overlay')) {
this.onCloseOverlay(false);
}
}