diff --git a/bizmatch/src/app/pages/subscription/account/account.component.scss b/bizmatch/src/app/pages/subscription/account/account.component.scss
index e7f8f3d..05e3422 100644
--- a/bizmatch/src/app/pages/subscription/account/account.component.scss
+++ b/bizmatch/src/app/pages/subscription/account/account.component.scss
@@ -25,8 +25,8 @@
/* Stil für das FontAwesome Icon */
.image-wrap fa-icon {
position: absolute;
- top: 5px; /* Positioniert das Icon am oberen Rand des Bildes */
- right: 5px; /* Positioniert das Icon am rechten Rand des Bildes */
+ top: -5px; /* Positioniert das Icon am oberen Rand des Bildes */
+ right: -18px; /* Positioniert das Icon am rechten Rand des Bildes */
color: #fff; /* Weiße Farbe für das Icon */
background-color: rgba(0, 0, 0, 0.5); /* Halbtransparenter Hintergrund für bessere Sichtbarkeit */
padding: 5px; /* Ein wenig Platz um das Icon */
diff --git a/bizmatch/src/app/pages/subscription/account/account.component.ts b/bizmatch/src/app/pages/subscription/account/account.component.ts
index 67a3f91..4d6559f 100644
--- a/bizmatch/src/app/pages/subscription/account/account.component.ts
+++ b/bizmatch/src/app/pages/subscription/account/account.component.ts
@@ -10,6 +10,7 @@ import { DialogModule } from 'primeng/dialog';
import { DialogService, DynamicDialogModule, DynamicDialogRef } from 'primeng/dynamicdialog';
import { EditorModule } from 'primeng/editor';
import { FileUpload, FileUploadModule } from 'primeng/fileupload';
+import { InputMaskModule } from 'primeng/inputmask';
import { SelectButtonModule } from 'primeng/selectbutton';
import { lastValueFrom } from 'rxjs';
import { User } from '../../../../../../bizmatch-server/src/models/db.model';
@@ -23,12 +24,12 @@ import { SelectOptionsService } from '../../../services/select-options.service';
import { SubscriptionsService } from '../../../services/subscriptions.service';
import { UserService } from '../../../services/user.service';
import { SharedModule } from '../../../shared/shared/shared.module';
-import { map2User } from '../../../utils/utils';
+import { getDialogWidth, getImageDimensions, map2User } from '../../../utils/utils';
import { TOOLBAR_OPTIONS } from '../../utils/defaults';
@Component({
selector: 'app-account',
standalone: true,
- imports: [SharedModule, FileUploadModule, EditorModule, AngularCropperjsModule, DialogModule, SelectButtonModule, DynamicDialogModule, ConfirmDialogModule],
+ imports: [SharedModule, FileUploadModule, EditorModule, AngularCropperjsModule, DialogModule, SelectButtonModule, DynamicDialogModule, ConfirmDialogModule, InputMaskModule],
providers: [MessageService, DialogService, ConfirmationService],
templateUrl: './account.component.html',
styleUrl: './account.component.scss',
@@ -124,46 +125,46 @@ export class AccountComponent {
const imageUrl = URL.createObjectURL(event.files[0]);
this.type = type;
const config = { aspectRatio: type === 'company' ? stateOptions[0].value : stateOptions[2].value };
- this.dialogRef = this.dialogService.open(ImageCropperComponent, {
- data: {
- imageUrl: imageUrl,
- fileUpload: type === 'company' ? this.companyUpload : this.profileUpload,
- config: config,
- ratioVariable: type === 'company' ? true : false,
- },
- header: 'Edit Image',
- width: '30vw',
- modal: true,
- closeOnEscape: true,
- keepInViewport: true,
- closable: false,
- // breakpoints: {
- // '960px': '75vw',
- // '640px': '90vw',
- // },
- });
- this.dialogRef.onClose.subscribe(cropper => {
- if (cropper) {
- this.loadingService.startLoading('uploadImage');
- cropper.getCroppedCanvas().toBlob(async blob => {
- this.imageUploadService.uploadImage(blob, type === 'company' ? 'uploadCompanyLogo' : 'uploadProfile', emailToDirName(this.user.email)).subscribe(
- async event => {
- if (event.type === HttpEventType.Response) {
- this.loadingService.stopLoading('uploadImage');
- if (this.type === 'company') {
- this.user.hasCompanyLogo = true; //
- this.companyLogoUrl = `${this.env.imageBaseUrl}/pictures/logo/${emailToDirName(this.user.email)}.avif?_ts=${new Date().getTime()}`;
- } else {
- this.user.hasProfile = true;
- this.profileUrl = `${this.env.imageBaseUrl}/pictures/profile/${emailToDirName(this.user.email)}.avif?_ts=${new Date().getTime()}`;
+ getImageDimensions(imageUrl).then(dimensions => {
+ const dialogWidth = getDialogWidth(dimensions);
+
+ this.dialogRef = this.dialogService.open(ImageCropperComponent, {
+ data: {
+ imageUrl: imageUrl,
+ fileUpload: type === 'company' ? this.companyUpload : this.profileUpload,
+ config: config,
+ ratioVariable: type === 'company' ? true : false,
+ },
+ header: 'Edit Image',
+ width: dialogWidth,
+ modal: true,
+ closeOnEscape: true,
+ keepInViewport: true,
+ closable: false,
+ });
+ this.dialogRef.onClose.subscribe(cropper => {
+ if (cropper) {
+ this.loadingService.startLoading('uploadImage');
+ cropper.getCroppedCanvas().toBlob(async blob => {
+ this.imageUploadService.uploadImage(blob, type === 'company' ? 'uploadCompanyLogo' : 'uploadProfile', emailToDirName(this.user.email)).subscribe(
+ async event => {
+ if (event.type === HttpEventType.Response) {
+ this.loadingService.stopLoading('uploadImage');
+ if (this.type === 'company') {
+ this.user.hasCompanyLogo = true; //
+ this.companyLogoUrl = `${this.env.imageBaseUrl}/pictures/logo/${emailToDirName(this.user.email)}.avif?_ts=${new Date().getTime()}`;
+ } else {
+ this.user.hasProfile = true;
+ this.profileUrl = `${this.env.imageBaseUrl}/pictures/profile/${emailToDirName(this.user.email)}.avif?_ts=${new Date().getTime()}`;
+ }
+ await this.userService.save(this.user);
}
- await this.userService.save(this.user);
- }
- },
- error => console.error('Fehler beim Upload:', error),
- );
- });
- }
+ },
+ error => console.error('Fehler beim Upload:', error),
+ );
+ });
+ }
+ });
});
}
deleteConfirm(type: 'profile' | 'logo') {
diff --git a/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.ts b/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.ts
index 5b66b9d..424fa8b 100644
--- a/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.ts
+++ b/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.ts
@@ -3,7 +3,7 @@ import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
import { lastValueFrom } from 'rxjs';
import { ListingsService } from '../../../services/listings.service';
import { SelectOptionsService } from '../../../services/select-options.service';
-import { createDefaultCommercialPropertyListing, map2User, routeListingWithState } from '../../../utils/utils';
+import { createDefaultCommercialPropertyListing, getDialogWidth, getImageDimensions, map2User, routeListingWithState } from '../../../utils/utils';
import { DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';
import { HttpEventType } from '@angular/common/http';
@@ -151,41 +151,44 @@ export class EditCommercialPropertyListingComponent {
select(event: any) {
const imageUrl = URL.createObjectURL(event.files[0]);
- this.dialogRef = this.dialogService.open(ImageCropperComponent, {
- data: {
- imageUrl: imageUrl,
- fileUpload: this.fileUpload,
- ratioVariable: false,
- },
- header: 'Edit Image',
- width: '50vw',
- modal: true,
- closeOnEscape: true,
- keepInViewport: true,
- closable: false,
- breakpoints: {
- '960px': '75vw',
- '640px': '90vw',
- },
- });
- this.dialogRef.onClose.subscribe(cropper => {
- if (cropper) {
- this.loadingService.startLoading('uploadImage');
- cropper.getCroppedCanvas().toBlob(async blob => {
- this.imageService.uploadImage(blob, 'uploadPropertyPicture', this.listing.imagePath, this.listing.serialId).subscribe(
- async event => {
- if (event.type === HttpEventType.Response) {
- this.ts = new Date().getTime();
- console.log('Upload abgeschlossen', event.body);
- this.loadingService.stopLoading('uploadImage');
- this.listing = await lastValueFrom(this.listingsService.getListingById(this.id, 'commercialProperty'));
- }
- },
- error => console.error('Fehler beim Upload:', error),
- );
- }, 'image/jpg');
- cropper.destroy();
- }
+ getImageDimensions(imageUrl).then(dimensions => {
+ const dialogWidth = getDialogWidth(dimensions);
+ this.dialogRef = this.dialogService.open(ImageCropperComponent, {
+ data: {
+ imageUrl: imageUrl,
+ fileUpload: this.fileUpload,
+ ratioVariable: false,
+ },
+ header: 'Edit Image',
+ width: dialogWidth,
+ modal: true,
+ closeOnEscape: true,
+ keepInViewport: true,
+ closable: false,
+ breakpoints: {
+ '960px': '75vw',
+ '640px': '90vw',
+ },
+ });
+ this.dialogRef.onClose.subscribe(cropper => {
+ if (cropper) {
+ this.loadingService.startLoading('uploadImage');
+ cropper.getCroppedCanvas().toBlob(async blob => {
+ this.imageService.uploadImage(blob, 'uploadPropertyPicture', this.listing.imagePath, this.listing.serialId).subscribe(
+ async event => {
+ if (event.type === HttpEventType.Response) {
+ this.ts = new Date().getTime();
+ console.log('Upload abgeschlossen', event.body);
+ this.loadingService.stopLoading('uploadImage');
+ this.listing = await lastValueFrom(this.listingsService.getListingById(this.id, 'commercialProperty'));
+ }
+ },
+ error => console.error('Fehler beim Upload:', error),
+ );
+ }, 'image/jpg');
+ cropper.destroy();
+ }
+ });
});
}
diff --git a/bizmatch/src/app/utils/utils.ts b/bizmatch/src/app/utils/utils.ts
index 7ac9e4d..bebf392 100644
--- a/bizmatch/src/app/utils/utils.ts
+++ b/bizmatch/src/app/utils/utils.ts
@@ -87,7 +87,14 @@ export function createLogger(name: string, level: number = INFO, options: any =
...options,
});
}
-
+export function formatPhoneNumber(phone: string): string {
+ const cleaned = ('' + phone).replace(/\D/g, '');
+ const match = cleaned.match(/^(\d{3})(\d{3})(\d{4})$/);
+ if (match) {
+ return '(' + match[1] + ') ' + match[2] + '-' + match[3];
+ }
+ return phone;
+}
export const getSessionStorageHandler = function (path, value, previous, applyData) {
sessionStorage.setItem('criteria', JSON.stringify(this));
};
@@ -130,3 +137,25 @@ export function map2User(jwt: string): KeycloakUser {
return null;
}
}
+export function getImageDimensions(imageUrl: string): Promise<{ width: number; height: number }> {
+ return new Promise(resolve => {
+ const img = new Image();
+ img.onload = () => {
+ resolve({ width: img.width, height: img.height });
+ };
+ img.src = imageUrl;
+ });
+}
+
+export function getDialogWidth(dimensions): string {
+ const aspectRatio = dimensions.width / dimensions.height;
+ let dialogWidth = '50vw'; // Standardbreite
+
+ // Passen Sie die Breite basierend auf dem Seitenverhältnis an
+ if (aspectRatio < 1) {
+ dialogWidth = '30vw'; // Hochformat
+ } else if (aspectRatio > 1) {
+ dialogWidth = '50vw'; // Querformat
+ }
+ return dialogWidth;
+}