diff --git a/frontend/src/app/dialogs/information/information.component.ts b/frontend/src/app/dialogs/information/information.component.ts index 5f4200e1..8fa619ec 100644 --- a/frontend/src/app/dialogs/information/information.component.ts +++ b/frontend/src/app/dialogs/information/information.component.ts @@ -18,15 +18,16 @@ export class InformationComponent { updateItems: { date: string, updates: string[] }[] = [ { - date: '3/13/2024', + date: '3/12/2024', updates: [ 'Temporary removal of Dark Mode feature.', 'Added Translation for Business Configuration Menu.', - 'Added Translation for Add Products Menu.' + 'Added Translation for Add Products Menu.', + 'Added Business Search functionality.' ] }, { - date: '3/12/2024', + date: '3/11/2024', updates: [ 'Added Translation for Business Marker Dialog.', 'Added Translation for Shopping Order Menu.', diff --git a/frontend/src/app/home/home.component.html b/frontend/src/app/home/home.component.html index d087b02c..84323e2c 100644 --- a/frontend/src/app/home/home.component.html +++ b/frontend/src/app/home/home.component.html @@ -1,5 +1,5 @@ - + diff --git a/frontend/src/app/home/home.component.ts b/frontend/src/app/home/home.component.ts index 03818f50..d08c9e95 100644 --- a/frontend/src/app/home/home.component.ts +++ b/frontend/src/app/home/home.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy, ViewChild } from '@angular/core'; import { ActionRowComponent } from './action-row/action-row.component'; import { SearchBarComponent } from './search-bar/search-bar.component'; import { MapComponent } from './map/map.component'; @@ -11,4 +11,11 @@ import { MapComponent } from './map/map.component'; styleUrl: './home.component.scss', changeDetection: ChangeDetectionStrategy.OnPush, }) -export class HomeComponent {} +export class HomeComponent { + @ViewChild(MapComponent) mapComponent!: MapComponent; + @ViewChild(SearchBarComponent) searchBarComponent!: SearchBarComponent; + + passSearchQueryToMap(query: string): void { + this.mapComponent.filterShops(query); + } +} diff --git a/frontend/src/app/home/map/map.component.ts b/frontend/src/app/home/map/map.component.ts index 2b0b2ac9..65526cb8 100644 --- a/frontend/src/app/home/map/map.component.ts +++ b/frontend/src/app/home/map/map.component.ts @@ -11,11 +11,12 @@ import { GeolocationService } from '../../core/service/geolocation.service'; import { ShopService } from '../../core/service/shop.service'; import { SnackService } from '../../core/service/snack.service'; import { dummyCoordinates } from '../../core/model/business'; +import { SearchBarComponent } from '../search-bar/search-bar.component'; @Component({ selector: 'app-map', standalone: true, - imports: [LeafletModule, RouterModule], + imports: [SearchBarComponent, LeafletModule, RouterModule], templateUrl: './map.component.html', styleUrl: './map.component.scss', changeDetection: ChangeDetectionStrategy.OnPush @@ -27,9 +28,11 @@ export class MapComponent implements OnInit { id: string = '65e2d67a38e1e60afd74378d'; navigator: Router = inject(Router); showPopup: boolean = false; + searchBarQuery: string = ''; allShops: any[] = []; + filteredShops: any[] = []; userPositions: any[] = []; - + // Translation strings distanceMessage!: string; onlinePiOrdersAllowedMessage!: string; @@ -71,6 +74,7 @@ export class MapComponent implements OnInit { const shops: any[] = response.data?.data; this.allShops = shops; + this.filteredShops = shops; // Wait for translation update before adding coordinates to the map this.updateTranslatedStrings(); @@ -83,7 +87,6 @@ export class MapComponent implements OnInit { } catch (error) { console.log(error); } - this.track(); } @@ -97,6 +100,18 @@ export class MapComponent implements OnInit { this.track(); } + // Filter shops based on search query + filterShops(query: string): void { + console.log("filterShops called"); + this.filteredShops = this.allShops.filter(shop => + shop.name.toLowerCase().includes(query.toLowerCase()) + ); + console.log("Filtered shops:", this.filteredShops); + // Update the map markers to reflect the filtered shops + this.removeAllMarkersFromMap(); + this.addAllCoordinatesToMap(this.filteredShops); + } + private updateTranslatedStrings(): void { this.distanceMessage = this.translateService.instant('BUSINESS_MARKER_DIALOG.DISTANCE_MESSAGE'); this.onlinePiOrdersAllowedMessage = this.translateService.instant('BUSINESS_MARKER_DIALOG.DISTANCE_MESSAGE'); @@ -128,8 +143,10 @@ export class MapComponent implements OnInit { }); } - addAllCoordinatesToMap(): void { - this.allShops.forEach((shop: any, index: number) => { + addAllCoordinatesToMap(shops?: any[]): void { + const shopsToAdd = shops ?? this.allShops; + + shopsToAdd.forEach((shop: any, index: number) => { const markerLayer = marker([shop.coordinates[0], shop.coordinates[1]], { icon: this.geolocationService.getMarkerIcon(), }).bindPopup(this.generatePopupContent(shop)) diff --git a/frontend/src/app/home/search-bar/search-bar.component.html b/frontend/src/app/home/search-bar/search-bar.component.html index 6ff20dfa..15b34d85 100644 --- a/frontend/src/app/home/search-bar/search-bar.component.html +++ b/frontend/src/app/home/search-bar/search-bar.component.html @@ -3,13 +3,10 @@
{{ 'HOME.SEARCH_BAR_PLACEHOLDER' | translate }} - - - @for (option of filteredOptions$ | async; track option) { - {{ option }} - } - +
+ + diff --git a/frontend/src/app/home/search-bar/search-bar.component.ts b/frontend/src/app/home/search-bar/search-bar.component.ts index b7a050fc..a28f2b2f 100644 --- a/frontend/src/app/home/search-bar/search-bar.component.ts +++ b/frontend/src/app/home/search-bar/search-bar.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, EventEmitter, OnInit, Output } from '@angular/core'; import { AsyncPipe } from '@angular/common'; import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; @@ -35,6 +35,8 @@ export class SearchBarComponent implements OnInit { options: string[] = ['R', 'Re', 'Res', 'Rest', 'Resta', 'Restau', 'Restaur', 'Restaura', 'Restauran', 'Restaurant']; searchBarControl = new FormControl(''); + @Output() searchQuery = new EventEmitter(); + constructor(private readonly uiStateService: UiStateService) { this.uiStateService.setShowBackButton(false); } @@ -45,4 +47,17 @@ export class SearchBarComponent implements OnInit { map((value: string | null) => this.options.filter((option) => option.toLowerCase().includes((value || '').toLowerCase()))), ); } + + submitSearch(): void { + const query = this.searchBarControl.value; + if (query != null) { + this.emitSearchQuery(query); + } + } + + emitSearchQuery(event: any): void { + const query = event.target.value; + console.log('Search query:', query); + this.searchQuery.emit(query); + } }