Compare commits
5 Commits
timo-clean
...
097f911889
| Author | SHA1 | Date | |
|---|---|---|---|
| 097f911889 | |||
| 621e5222fa | |||
| 3ed7519afd | |||
| 3cfe86e1a0 | |||
| e62263622f |
@@ -106,7 +106,14 @@
|
|||||||
[leafletCenter]="mapCenter" [leafletZoom]="mapZoom" (leafletMapReady)="onMapReady($event)"></div>
|
[leafletCenter]="mapCenter" [leafletZoom]="mapZoom" (leafletMapReady)="onMapReady($event)"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- Disclaimer: immer sichtbar, unabhängig von der Map -->
|
||||||
|
<p class="mt-4 text-sm text-neutral-500 leading-relaxed w-full">
|
||||||
|
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>
|
||||||
<!-- Right column -->
|
<!-- Right column -->
|
||||||
<div class="w-full lg:w-1/2 mt-6 lg:mt-0 print:hidden">
|
<div class="w-full lg:w-1/2 mt-6 lg:mt-0 print:hidden">
|
||||||
<h2 class="md:mt-8 mb-4 text-xl font-bold">Contact the Author of this Listing</h2>
|
<h2 class="md:mt-8 mb-4 text-xl font-bold">Contact the Author of this Listing</h2>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -107,7 +107,14 @@
|
|||||||
[leafletCenter]="mapCenter" [leafletZoom]="mapZoom" (leafletMapReady)="onMapReady($event)"></div>
|
[leafletCenter]="mapCenter" [leafletZoom]="mapZoom" (leafletMapReady)="onMapReady($event)"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- Disclaimer: immer sichtbar, unabhängig von der Map -->
|
||||||
|
<p class="mt-4 text-sm text-neutral-500 leading-relaxed w-full">
|
||||||
|
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 class="w-full lg:w-1/2 mt-6 lg:mt-0">
|
<div class="w-full lg:w-1/2 mt-6 lg:mt-0">
|
||||||
@if(this.images.length>0){
|
@if(this.images.length>0){
|
||||||
<div class="block print:hidden">
|
<div class="block print:hidden">
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user