fix: additional bug fixes in OverlayComponent
This commit is contained in:
parent
0e0e2db776
commit
0be9f98cca
6 changed files with 209 additions and 230 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue