3 Commits

Author SHA1 Message Date
3ed7519afd Disclaimer 2026-05-28 10:41:03 -05:00
3cfe86e1a0 remove Listed since 2026-05-12 10:52:28 -05:00
e62263622f move + fix 2026-04-11 15:15:59 -05:00
5 changed files with 39 additions and 38 deletions

View File

@@ -104,6 +104,12 @@
<!-- <div style="height: 300px" leaflet [leafletOptions]="mapOptions" [leafletLayers]="mapLayers" [leafletCenter]="mapCenter" [leafletZoom]="mapZoom"></div> --> <!-- <div style="height: 300px" leaflet [leafletOptions]="mapOptions" [leafletLayers]="mapLayers" [leafletCenter]="mapCenter" [leafletZoom]="mapZoom"></div> -->
<div style="height: 400px" leaflet [leafletOptions]="mapOptions" [leafletLayers]="mapLayers" <div style="height: 400px" leaflet [leafletOptions]="mapOptions" [leafletLayers]="mapLayers"
[leafletCenter]="mapCenter" [leafletZoom]="mapZoom" (leafletMapReady)="onMapReady($event)"></div> [leafletCenter]="mapCenter" [leafletZoom]="mapZoom" (leafletMapReady)="onMapReady($event)"></div>
<p class="mt-3 text-xs text-neutral-500 leading-relaxed">
The information on this listing has been provided by either the seller or a business broker representing the seller.
BizMatch, Inc. has no interest or stake in the sale of this business and has not verified any of the information
and assumes no responsibility for its accuracy, veracity, or completeness.
See our full <a class="text-primary-600 hover:underline hover:cursor-pointer" routerLink="/terms-of-use">Terms of Use</a>.
</p>
</div> </div>
</div> </div>

View File

@@ -1,5 +1,5 @@
import { ChangeDetectorRef, Component } from '@angular/core';
import { NgOptimizedImage } from '@angular/common'; import { NgOptimizedImage } from '@angular/common';
import { ChangeDetectorRef, Component } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
import { LeafletModule } from '@bluehalo/ngx-leaflet'; import { LeafletModule } from '@bluehalo/ngx-leaflet';
@@ -7,13 +7,13 @@ import { lastValueFrom } from 'rxjs';
import { BusinessListing, EventTypeEnum, ShareByEMail, User } from '../../../../../../bizmatch-server/src/models/db.model'; import { BusinessListing, EventTypeEnum, ShareByEMail, User } from '../../../../../../bizmatch-server/src/models/db.model';
import { KeycloakUser, MailInfo } from '../../../../../../bizmatch-server/src/models/main.model'; import { KeycloakUser, MailInfo } from '../../../../../../bizmatch-server/src/models/main.model';
import { environment } from '../../../../environments/environment'; import { environment } from '../../../../environments/environment';
import { BreadcrumbItem, BreadcrumbsComponent } from '../../../components/breadcrumbs/breadcrumbs.component';
import { EMailService } from '../../../components/email/email.service'; import { EMailService } from '../../../components/email/email.service';
import { MessageService } from '../../../components/message/message.service'; import { MessageService } from '../../../components/message/message.service';
import { ValidatedInputComponent } from '../../../components/validated-input/validated-input.component'; import { ValidatedInputComponent } from '../../../components/validated-input/validated-input.component';
import { ValidatedNgSelectComponent } from '../../../components/validated-ng-select/validated-ng-select.component'; import { ValidatedNgSelectComponent } from '../../../components/validated-ng-select/validated-ng-select.component';
import { ValidatedTextareaComponent } from '../../../components/validated-textarea/validated-textarea.component'; import { ValidatedTextareaComponent } from '../../../components/validated-textarea/validated-textarea.component';
import { ValidationMessagesService } from '../../../components/validation-messages.service'; import { ValidationMessagesService } from '../../../components/validation-messages.service';
import { BreadcrumbItem, BreadcrumbsComponent } from '../../../components/breadcrumbs/breadcrumbs.component';
import { AuditService } from '../../../services/audit.service'; import { AuditService } from '../../../services/audit.service';
import { GeoService } from '../../../services/geo.service'; import { GeoService } from '../../../services/geo.service';
import { HistoryService } from '../../../services/history.service'; import { HistoryService } from '../../../services/history.service';
@@ -26,13 +26,13 @@ import { SharedModule } from '../../../shared/shared/shared.module';
import { createMailInfo, map2User } from '../../../utils/utils'; import { createMailInfo, map2User } from '../../../utils/utils';
// Import für Leaflet // Import für Leaflet
// Note: Leaflet requires browser environment - protected by isBrowser checks in base class // Note: Leaflet requires browser environment - protected by isBrowser checks in base class
import { circle, Circle, Control, DomEvent, DomUtil, icon, Icon, latLng, LatLngBounds, Marker, polygon, Polygon, tileLayer } from 'leaflet';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { circle, Control, DomEvent, DomUtil, icon, Icon, latLng, LatLngBounds, Marker, polygon, Polygon, tileLayer } from 'leaflet';
import { provideShareButtonsOptions, SharerMethods, withConfig } from 'ngx-sharebuttons';
import { ShareButton } from 'ngx-sharebuttons/button';
import { shareIcons } from 'ngx-sharebuttons/icons';
import { AuthService } from '../../../services/auth.service'; import { AuthService } from '../../../services/auth.service';
import { BaseDetailsComponent } from '../base-details.component'; import { BaseDetailsComponent } from '../base-details.component';
import { ShareButton } from 'ngx-sharebuttons/button';
import { provideShareButtonsOptions, SharerMethods, withConfig } from 'ngx-sharebuttons';
import { shareIcons } from 'ngx-sharebuttons/icons';
@Component({ @Component({
selector: 'app-details-business-listing', selector: 'app-details-business-listing',
standalone: true, standalone: true,
@@ -376,7 +376,6 @@ export class DetailsBusinessListingComponent extends BaseDetailsComponent {
{ label: 'Support & Training', value: this.listing.supportAndTraining }, { label: 'Support & Training', value: this.listing.supportAndTraining },
{ label: 'Reason for Sale', value: this.listing.reasonForSale }, { label: 'Reason for Sale', value: this.listing.reasonForSale },
{ label: 'Broker licensing', value: this.listing.brokerLicencing }, { label: 'Broker licensing', value: this.listing.brokerLicencing },
{ label: 'Listed since', value: `${this.dateInserted()} - ${this.getDaysListed()} days` },
{ {
label: 'Listing by', label: 'Listing by',
value: null, // Wird nicht verwendet value: null, // Wird nicht verwendet

View File

@@ -105,6 +105,12 @@
<!-- <div style="height: 300px" leaflet [leafletOptions]="mapOptions" [leafletLayers]="mapLayers" [leafletCenter]="mapCenter" [leafletZoom]="mapZoom"></div> --> <!-- <div style="height: 300px" leaflet [leafletOptions]="mapOptions" [leafletLayers]="mapLayers" [leafletCenter]="mapCenter" [leafletZoom]="mapZoom"></div> -->
<div style="height: 400px" leaflet [leafletOptions]="mapOptions" [leafletLayers]="mapLayers" <div style="height: 400px" leaflet [leafletOptions]="mapOptions" [leafletLayers]="mapLayers"
[leafletCenter]="mapCenter" [leafletZoom]="mapZoom" (leafletMapReady)="onMapReady($event)"></div> [leafletCenter]="mapCenter" [leafletZoom]="mapZoom" (leafletMapReady)="onMapReady($event)"></div>
<p class="mt-3 text-xs text-neutral-500 leading-relaxed">
The information on this listing has been provided by either the seller or a business broker representing the seller.
BizMatch, Inc. has no interest or stake in the sale of this business and has not verified any of the information
and assumes no responsibility for its accuracy, veracity, or completeness.
See our full <a class="text-primary-600 hover:underline hover:cursor-pointer" routerLink="/terms-of-use">Terms of Use</a>.
</p>
</div> </div>
</div> </div>

View File

@@ -1,15 +1,18 @@
import { ChangeDetectorRef, Component, NgZone } from '@angular/core';
import { NgOptimizedImage } from '@angular/common'; import { NgOptimizedImage } from '@angular/common';
import { ChangeDetectorRef, Component, NgZone } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { LeafletModule } from '@bluehalo/ngx-leaflet'; import { LeafletModule } from '@bluehalo/ngx-leaflet';
import { APP_ICONS } from '../../../utils/fontawesome-icons';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { GALLERY_CONFIG, GalleryConfig, GalleryModule, ImageItem } from 'ng-gallery'; import { GALLERY_CONFIG, GalleryConfig, GalleryModule, ImageItem } from 'ng-gallery';
import { provideShareButtonsOptions, SharerMethods, withConfig } from 'ngx-sharebuttons';
import { ShareButton } from 'ngx-sharebuttons/button';
import { shareIcons } from 'ngx-sharebuttons/icons';
import { lastValueFrom } from 'rxjs'; import { lastValueFrom } from 'rxjs';
import { CommercialPropertyListing, EventTypeEnum, ShareByEMail, User } from '../../../../../../bizmatch-server/src/models/db.model'; import { CommercialPropertyListing, EventTypeEnum, ShareByEMail, User } from '../../../../../../bizmatch-server/src/models/db.model';
import { CommercialPropertyListingCriteria, ErrorResponse, KeycloakUser, MailInfo } from '../../../../../../bizmatch-server/src/models/main.model'; import { CommercialPropertyListingCriteria, ErrorResponse, KeycloakUser, MailInfo } from '../../../../../../bizmatch-server/src/models/main.model';
import { environment } from '../../../../environments/environment'; import { environment } from '../../../../environments/environment';
import { BreadcrumbItem, BreadcrumbsComponent } from '../../../components/breadcrumbs/breadcrumbs.component';
import { EMailService } from '../../../components/email/email.service'; import { EMailService } from '../../../components/email/email.service';
import { MessageService } from '../../../components/message/message.service'; import { MessageService } from '../../../components/message/message.service';
import { ValidatedInputComponent } from '../../../components/validated-input/validated-input.component'; import { ValidatedInputComponent } from '../../../components/validated-input/validated-input.component';
@@ -26,12 +29,9 @@ import { SelectOptionsService } from '../../../services/select-options.service';
import { SeoService } from '../../../services/seo.service'; import { SeoService } from '../../../services/seo.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 { APP_ICONS } from '../../../utils/fontawesome-icons';
import { createMailInfo, map2User } from '../../../utils/utils'; import { createMailInfo, map2User } from '../../../utils/utils';
import { BaseDetailsComponent } from '../base-details.component'; import { BaseDetailsComponent } from '../base-details.component';
import { BreadcrumbItem, BreadcrumbsComponent } from '../../../components/breadcrumbs/breadcrumbs.component';
import { ShareButton } from 'ngx-sharebuttons/button';
import { provideShareButtonsOptions, SharerMethods, withConfig } from 'ngx-sharebuttons';
import { shareIcons } from 'ngx-sharebuttons/icons';
@Component({ @Component({
selector: 'app-details-commercial-property-listing', selector: 'app-details-commercial-property-listing',
@@ -145,7 +145,6 @@ export class DetailsCommercialPropertyListingComponent extends BaseDetailsCompon
{ label: 'Located in', value: this.selectOptions.getState(this.listing.location.state) }, { label: 'Located in', value: this.selectOptions.getState(this.listing.location.state) },
{ label: this.listing.location.name ? 'City' : 'County', value: this.listing.location.name ? this.listing.location.name : this.listing.location.county }, { label: this.listing.location.name ? 'City' : 'County', value: this.listing.location.name ? this.listing.location.name : this.listing.location.county },
{ label: 'Asking Price:', value: `$${this.listing.price?.toLocaleString()}` }, { label: 'Asking Price:', value: `$${this.listing.price?.toLocaleString()}` },
{ label: 'Listed since', value: `${this.dateInserted()} - ${this.getDaysListed()} days` },
{ {
label: 'Listing by', label: 'Listing by',
value: null, // Wird nicht verwendet value: null, // Wird nicht verwendet

View File

@@ -1,39 +1,37 @@
services: services:
# --- FRONTEND --- # --- FRONTEND (SSR) ---
bizmatch-ssr: bizmatch-ssr:
build: build:
context: . # Pfad zum Angular Ordner context: .
dockerfile: bizmatch/Dockerfile dockerfile: bizmatch/Dockerfile
image: bizmatch-ssr
container_name: bizmatch-ssr container_name: bizmatch-ssr
extra_hosts:
- "localhost:host-gateway"
restart: unless-stopped restart: unless-stopped
ports: # In der Produktion brauchen wir keine Ports nach außen (Caddy regelt das intern)
- '4200:4000' # Extern 4200 -> Intern 4000 (SSR) networks:
environment: - bizmatch
NODE_ENV: production
volumes: volumes:
- ./bizmatch-server/pictures:/app/pictures - ./bizmatch-server/pictures:/app/pictures
environment:
NODE_ENV: production
# WICHTIG: Die URL, unter der das SSR-Frontend die API intern erreicht
API_INTERNAL_URL: http://bizmatch-app:3001
# --- BACKEND --- # --- BACKEND ---
app: app:
build: build:
context: ./bizmatch-server # Pfad zum NestJS Ordner context: ./bizmatch-server
dockerfile: Dockerfile dockerfile: Dockerfile
image: bizmatch-server:latest
container_name: bizmatch-app container_name: bizmatch-app
restart: unless-stopped restart: unless-stopped
ports:
- '3001:3001'
env_file: env_file:
- ./bizmatch-server/.env # Pfad zur .env Datei - ./bizmatch-server/.env
depends_on: depends_on:
- postgres - postgres
networks: networks:
- bizmatch - bizmatch
# WICHTIG: Kein Volume Mapping für node_modules im Prod-Modus! volumes:
# Das Image bringt alles fertig mit. # Das Backend braucht ebenfalls Zugriff auf den Bilder-Ordner zum Speichern!
- ./bizmatch-server/pictures:/app/dist/pictures
# --- DATABASE --- # --- DATABASE ---
postgres: postgres:
@@ -44,19 +42,12 @@ services:
- bizmatch-db-data:/var/lib/postgresql/data - bizmatch-db-data:/var/lib/postgresql/data
env_file: env_file:
- ./bizmatch-server/.env - ./bizmatch-server/.env
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
ports:
- '5434:5432'
networks: networks:
- bizmatch - bizmatch
volumes: volumes:
bizmatch-db-data: bizmatch-db-data:
driver: local
networks: networks:
bizmatch: bizmatch:
external: false # Oder true, falls du es manuell erstellt hast external: true # Wir nutzen das gleiche Netzwerk wie für Caddy