autocomplete off bei numeric fields, Mail Mask emptied after Mail dispatch, unknown listing controller for EMail Listings
This commit is contained in:
parent
245e76f697
commit
3a6a64cce9
|
|
@ -1,18 +1,26 @@
|
||||||
import { Controller, Inject } from '@nestjs/common';
|
import { Controller, Get, Inject, Param, Request, UseGuards } from '@nestjs/common';
|
||||||
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
|
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
|
||||||
import { Logger } from 'winston';
|
import { Logger } from 'winston';
|
||||||
|
import { OptionalJwtAuthGuard } from '../jwt-auth/optional-jwt-auth.guard.js';
|
||||||
|
import { BusinessListingService } from './business-listing.service.js';
|
||||||
|
import { CommercialPropertyService } from './commercial-property.service.js';
|
||||||
|
|
||||||
@Controller('listings/undefined')
|
@Controller('listings/undefined')
|
||||||
export class UnknownListingsController {
|
export class UnknownListingsController {
|
||||||
constructor(@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger) {}
|
constructor(
|
||||||
|
@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger,
|
||||||
|
private readonly businessListingsService: BusinessListingService,
|
||||||
|
private readonly propertyListingsService: CommercialPropertyService,
|
||||||
|
) {}
|
||||||
|
|
||||||
// @Get(':id')
|
@UseGuards(OptionalJwtAuthGuard)
|
||||||
// async findById(@Param('id') id: string): Promise<any> {
|
@Get(':id')
|
||||||
// const result = await this.listingsService.findById(id, businesses);
|
async findById(@Request() req, @Param('id') id: string): Promise<any> {
|
||||||
// if (result) {
|
const result = await this.businessListingsService.findBusinessesById(id, req.user);
|
||||||
// return result;
|
if (result) {
|
||||||
// } else {
|
return result;
|
||||||
// return await this.listingsService.findById(id, commercials);
|
} else {
|
||||||
// }
|
return await this.propertyListingsService.findCommercialPropertiesById(id, req.user);
|
||||||
// }
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,5 +21,6 @@
|
||||||
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500"
|
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500"
|
||||||
[options]="{ prefix: '$', thousands: ',', decimal: '.', precision: 0, align: 'left' }"
|
[options]="{ prefix: '$', thousands: ',', decimal: '.', precision: 0, align: 'left' }"
|
||||||
currencyMask
|
currencyMask
|
||||||
|
autocomplete="off"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import { HttpClient } from '@angular/common/http';
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router';
|
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router';
|
||||||
import { Observable, of } from 'rxjs';
|
import { Observable, of } from 'rxjs';
|
||||||
import { catchError, map } from 'rxjs/operators';
|
import { catchError, tap } from 'rxjs/operators';
|
||||||
import { environment } from '../../environments/environment';
|
import { environment } from '../../environments/environment';
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
|
|
@ -17,14 +17,14 @@ export class ListingCategoryGuard implements CanActivate {
|
||||||
const url = `${this.apiBaseUrl}/bizmatch/listings/undefined/${id}`;
|
const url = `${this.apiBaseUrl}/bizmatch/listings/undefined/${id}`;
|
||||||
|
|
||||||
return this.http.get<any>(url).pipe(
|
return this.http.get<any>(url).pipe(
|
||||||
map(response => {
|
tap(response => {
|
||||||
const category = response.listingsCategory;
|
const category = response.listingsCategory;
|
||||||
if (category === 'business') {
|
if (category === 'business') {
|
||||||
return this.router.createUrlTree([`/details-business-listing/${id}`]);
|
this.router.navigate(['details-business-listing', id]);
|
||||||
} else if (category === 'commercialProperty') {
|
} else if (category === 'commercialProperty') {
|
||||||
return this.router.createUrlTree([`/details-commercial-property-listing/${id}`]);
|
this.router.navigate(['details-commercial-property-listing', id]);
|
||||||
} else {
|
} else {
|
||||||
return this.router.createUrlTree(['/not-found']);
|
this.router.navigate(['not-found']);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
catchError(() => {
|
catchError(() => {
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ import { MailService } from '../../../services/mail.service';
|
||||||
import { SelectOptionsService } from '../../../services/select-options.service';
|
import { SelectOptionsService } from '../../../services/select-options.service';
|
||||||
import { UserService } from '../../../services/user.service';
|
import { UserService } from '../../../services/user.service';
|
||||||
import { SharedModule } from '../../../shared/shared/shared.module';
|
import { SharedModule } from '../../../shared/shared/shared.module';
|
||||||
import { map2User } from '../../../utils/utils';
|
import { createMailInfo, map2User } from '../../../utils/utils';
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-details-business-listing',
|
selector: 'app-details-business-listing',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
|
|
@ -81,7 +81,7 @@ export class DetailsBusinessListingComponent {
|
||||||
this.keycloakUser = map2User(token);
|
this.keycloakUser = map2User(token);
|
||||||
if (this.keycloakUser) {
|
if (this.keycloakUser) {
|
||||||
this.user = await this.userService.getByMail(this.keycloakUser.email);
|
this.user = await this.userService.getByMail(this.keycloakUser.email);
|
||||||
this.mailinfo.sender = { name: `${this.user.firstname} ${this.user.lastname}`, email: this.user.email, phoneNumber: this.user.phoneNumber, state: this.user.companyLocation.state };
|
this.mailinfo = createMailInfo(this.user);
|
||||||
}
|
}
|
||||||
this.listing = await lastValueFrom(this.listingsService.getListingById(this.id, 'business'));
|
this.listing = await lastValueFrom(this.listingsService.getListingById(this.id, 'business'));
|
||||||
this.listingUser = await this.userService.getByMail(this.listing.email);
|
this.listingUser = await this.userService.getByMail(this.listing.email);
|
||||||
|
|
@ -99,6 +99,7 @@ export class DetailsBusinessListingComponent {
|
||||||
this.mailinfo.listing = this.listing;
|
this.mailinfo.listing = this.listing;
|
||||||
await this.mailService.mail(this.mailinfo);
|
await this.mailService.mail(this.mailinfo);
|
||||||
this.messageService.addMessage({ severity: 'success', text: 'Your message has been sent to the creator of the listing', duration: 3000 });
|
this.messageService.addMessage({ severity: 'success', text: 'Your message has been sent to the creator of the listing', duration: 3000 });
|
||||||
|
this.mailinfo = createMailInfo(this.user);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.messageService.addMessage({
|
this.messageService.addMessage({
|
||||||
severity: 'danger',
|
severity: 'danger',
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ import { MailService } from '../../../services/mail.service';
|
||||||
import { SelectOptionsService } from '../../../services/select-options.service';
|
import { SelectOptionsService } from '../../../services/select-options.service';
|
||||||
import { UserService } from '../../../services/user.service';
|
import { UserService } from '../../../services/user.service';
|
||||||
import { SharedModule } from '../../../shared/shared/shared.module';
|
import { SharedModule } from '../../../shared/shared/shared.module';
|
||||||
import { map2User } from '../../../utils/utils';
|
import { createMailInfo, map2User } from '../../../utils/utils';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-details-commercial-property-listing',
|
selector: 'app-details-commercial-property-listing',
|
||||||
|
|
@ -86,7 +86,7 @@ export class DetailsCommercialPropertyListingComponent {
|
||||||
this.keycloakUser = map2User(token);
|
this.keycloakUser = map2User(token);
|
||||||
if (this.keycloakUser) {
|
if (this.keycloakUser) {
|
||||||
this.user = await this.userService.getByMail(this.keycloakUser.email);
|
this.user = await this.userService.getByMail(this.keycloakUser.email);
|
||||||
this.mailinfo.sender = { name: `${this.user.firstname} ${this.user.lastname}`, email: this.user.email, phoneNumber: this.user.phoneNumber, state: this.user.companyLocation.state };
|
this.mailinfo = createMailInfo(this.user);
|
||||||
}
|
}
|
||||||
this.listing = (await lastValueFrom(this.listingsService.getListingById(this.id, 'commercialProperty'))) as CommercialPropertyListing;
|
this.listing = (await lastValueFrom(this.listingsService.getListingById(this.id, 'commercialProperty'))) as CommercialPropertyListing;
|
||||||
this.listingUser = await this.userService.getByMail(this.listing.email);
|
this.listingUser = await this.userService.getByMail(this.listing.email);
|
||||||
|
|
@ -123,6 +123,7 @@ export class DetailsCommercialPropertyListingComponent {
|
||||||
this.mailinfo.listing = this.listing;
|
this.mailinfo.listing = this.listing;
|
||||||
await this.mailService.mail(this.mailinfo);
|
await this.mailService.mail(this.mailinfo);
|
||||||
this.messageService.addMessage({ severity: 'success', text: 'Your message has been sent to the creator of the listing', duration: 3000 });
|
this.messageService.addMessage({ severity: 'success', text: 'Your message has been sent to the creator of the listing', duration: 3000 });
|
||||||
|
this.mailinfo = createMailInfo(this.user);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.messageService.addMessage({
|
this.messageService.addMessage({
|
||||||
severity: 'danger',
|
severity: 'danger',
|
||||||
|
|
|
||||||
|
|
@ -129,15 +129,15 @@
|
||||||
|
|
||||||
<div class="flex mb-4 space-x-4">
|
<div class="flex mb-4 space-x-4">
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<input type="checkbox" id="realEstateIncluded" [(ngModel)]="listing.realEstateIncluded" name="realEstateIncluded" class="mr-2" />
|
<input type="checkbox" id="realEstateIncluded" [(ngModel)]="listing.realEstateIncluded" (change)="onCheckboxChange('realEstateIncluded')" name="realEstateIncluded" class="mr-2" />
|
||||||
<label for="realEstateIncluded" class="text-sm font-bold text-gray-700">Real Estate Included</label>
|
<label for="realEstateIncluded" class="text-sm font-bold text-gray-700">Real Estate Included</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<input type="checkbox" id="leasedLocation" [(ngModel)]="listing.leasedLocation" name="leasedLocation" class="mr-2" />
|
<input type="checkbox" id="leasedLocation" [(ngModel)]="listing.leasedLocation" (change)="onCheckboxChange('leasedLocation')" name="leasedLocation" class="mr-2" />
|
||||||
<label for="leasedLocation" class="text-sm font-bold text-gray-700">Leased Location</label>
|
<label for="leasedLocation" class="text-sm font-bold text-gray-700">Leased Location</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<input type="checkbox" id="franchiseResale" [(ngModel)]="listing.franchiseResale" name="franchiseResale" class="mr-2" />
|
<input type="checkbox" id="franchiseResale" [(ngModel)]="listing.franchiseResale" (change)="onCheckboxChange('franchiseResale')" name="franchiseResale" class="mr-2" />
|
||||||
<label for="franchiseResale" class="text-sm font-bold text-gray-700">Franchise Re-Sale</label>
|
<label for="franchiseResale" class="text-sm font-bold text-gray-700">Franchise Re-Sale</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -159,4 +159,13 @@ export class EditBusinessListingComponent {
|
||||||
}
|
}
|
||||||
target[keys[keys.length - 1]] = value;
|
target[keys[keys.length - 1]] = value;
|
||||||
}
|
}
|
||||||
|
onCheckboxChange(checkbox: string) {
|
||||||
|
// Deaktivieren Sie alle Checkboxes
|
||||||
|
this.listing.realEstateIncluded = false;
|
||||||
|
this.listing.leasedLocation = false;
|
||||||
|
this.listing.franchiseResale = false;
|
||||||
|
|
||||||
|
// Aktivieren Sie nur die aktuell ausgewählte Checkbox
|
||||||
|
this.listing[checkbox] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ import { ValidationMessagesService } from '../../../components/validation-messag
|
||||||
import { MailService } from '../../../services/mail.service';
|
import { MailService } from '../../../services/mail.service';
|
||||||
import { UserService } from '../../../services/user.service';
|
import { UserService } from '../../../services/user.service';
|
||||||
import { SharedModule } from '../../../shared/shared/shared.module';
|
import { SharedModule } from '../../../shared/shared/shared.module';
|
||||||
import { map2User } from '../../../utils/utils';
|
import { createMailInfo, map2User } from '../../../utils/utils';
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-email-us',
|
selector: 'app-email-us',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
|
|
@ -39,7 +39,7 @@ export class EmailUsComponent {
|
||||||
this.keycloakUser = map2User(token);
|
this.keycloakUser = map2User(token);
|
||||||
if (this.keycloakUser) {
|
if (this.keycloakUser) {
|
||||||
this.user = await this.userService.getByMail(this.keycloakUser.email);
|
this.user = await this.userService.getByMail(this.keycloakUser.email);
|
||||||
this.mailinfo.sender = { name: `${this.user.firstname} ${this.user.lastname}`, email: this.user.email, phoneNumber: this.user.phoneNumber, state: this.user.companyLocation.state };
|
this.mailinfo = createMailInfo(this.user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ngOnDestroy() {
|
ngOnDestroy() {
|
||||||
|
|
@ -50,6 +50,7 @@ export class EmailUsComponent {
|
||||||
this.mailinfo.email = 'support@bizmatch.net';
|
this.mailinfo.email = 'support@bizmatch.net';
|
||||||
await this.mailService.mail(this.mailinfo);
|
await this.mailService.mail(this.mailinfo);
|
||||||
this.messageService.addMessage({ severity: 'success', text: 'Your request has been forwarded to the support team of bizmatch.', duration: 3000 });
|
this.messageService.addMessage({ severity: 'success', text: 'Your request has been forwarded to the support team of bizmatch.', duration: 3000 });
|
||||||
|
this.mailinfo = createMailInfo(this.user);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.messageService.addMessage({
|
this.messageService.addMessage({
|
||||||
severity: 'danger',
|
severity: 'danger',
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
import { ConsoleFormattedStream, INFO, createLogger as _createLogger, stdSerializers } from 'browser-bunyan';
|
import { ConsoleFormattedStream, INFO, createLogger as _createLogger, stdSerializers } from 'browser-bunyan';
|
||||||
import { jwtDecode } from 'jwt-decode';
|
import { jwtDecode } from 'jwt-decode';
|
||||||
import { BusinessListingCriteria, CommercialPropertyListingCriteria, JwtToken, KeycloakUser, UserListingCriteria } from '../../../../bizmatch-server/src/models/main.model';
|
import { BusinessListingCriteria, CommercialPropertyListingCriteria, JwtToken, KeycloakUser, MailInfo, UserListingCriteria } from '../../../../bizmatch-server/src/models/main.model';
|
||||||
|
|
||||||
// export function createDefaultUser(email: string, firstname: string, lastname: string): User {
|
// export function createDefaultUser(email: string, firstname: string, lastname: string): User {
|
||||||
// return {
|
// return {
|
||||||
|
|
@ -154,6 +154,14 @@ export function createEmptyUserListingCriteria(): UserListingCriteria {
|
||||||
radius: null,
|
radius: null,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
export function createMailInfo(user: User): MailInfo {
|
||||||
|
return {
|
||||||
|
sender: { name: `${user.firstname} ${user.lastname}`, email: user.email, phoneNumber: user.phoneNumber, state: user.companyLocation.state, comments: null },
|
||||||
|
email: null,
|
||||||
|
url: environment.mailinfoUrl,
|
||||||
|
listing: null,
|
||||||
|
};
|
||||||
|
}
|
||||||
export function createLogger(name: string, level: number = INFO, options: any = {}) {
|
export function createLogger(name: string, level: number = INFO, options: any = {}) {
|
||||||
return _createLogger({
|
return _createLogger({
|
||||||
name,
|
name,
|
||||||
|
|
@ -244,6 +252,8 @@ export function getDialogWidth(dimensions): string {
|
||||||
import { initFlowbite } from 'flowbite';
|
import { initFlowbite } from 'flowbite';
|
||||||
import onChange from 'on-change';
|
import onChange from 'on-change';
|
||||||
import { Subject, concatMap, delay, of } from 'rxjs';
|
import { Subject, concatMap, delay, of } from 'rxjs';
|
||||||
|
import { User } from '../../../../bizmatch-server/src/models/db.model';
|
||||||
|
import { environment } from '../../environments/environment';
|
||||||
|
|
||||||
const flowbiteQueue = new Subject<() => void>();
|
const flowbiteQueue = new Subject<() => void>();
|
||||||
|
|
||||||
|
|
@ -387,17 +397,7 @@ export function getCriteriaProxy(path: string, component: any): BusinessListingC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export function createEnhancedProxy(obj: BusinessListingCriteria | CommercialPropertyListingCriteria | UserListingCriteria, component: any) {
|
export function createEnhancedProxy(obj: BusinessListingCriteria | CommercialPropertyListingCriteria | UserListingCriteria, component: any) {
|
||||||
// const component = this;
|
|
||||||
|
|
||||||
const sessionStorageHandler = function (path, value, previous, applyData) {
|
const sessionStorageHandler = function (path, value, previous, applyData) {
|
||||||
// let criteriaType = '';
|
|
||||||
// if ('/businessListings' === window.location.pathname) {
|
|
||||||
// criteriaType = 'business';
|
|
||||||
// } else if ('/commercialPropertyListings' === window.location.pathname) {
|
|
||||||
// criteriaType = 'commercialProperty';
|
|
||||||
// } else if ('/brokerListings' === window.location.pathname) {
|
|
||||||
// criteriaType = 'broker';
|
|
||||||
// }
|
|
||||||
sessionStorage.setItem(`${obj.criteriaType}`, JSON.stringify(this));
|
sessionStorage.setItem(`${obj.criteriaType}`, JSON.stringify(this));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue