Preview:
//html
<app-navbar></app-navbar>
<div class="main-container">
    <div class="header-search-container">
        <i class="bi bi-arrow-left-circle header-icon" (click)="goBack()"></i>
        <h2 class="header-title" routerLink="/product-list">AV MERCH</h2>
        <div class="search-bar-container">
            <input type="text" class="form-control search-bar" placeholder="Search products" [(ngModel)]="searchTerm" (input)="filteredProductsBySearch()">
        </div>
    </div>
    
    <!-- Side Navbar -->
    <div class="side-navbar" [ngClass]="{'open': isSidebarOpen}">
      <ul>
        <li (click)="filterProductsByCategory(0)">All</li>
        <li (click)="filterProductsByCategory(1)">Tops</li>
        <li (click)="filterProductsByCategory(2)">Bottoms</li>
      </ul>
    </div>
    
    <!-- Toggle Button -->
    <button class="toggle-btn" (click)="toggleSidebar()">
      <i class="bi" [ngClass]="{'bi-list': !isSidebarOpen, 'bi-x': isSidebarOpen}"></i>
    </button>
    
    <div class="product-list-container">
        <div *ngIf="filteredProducts.length === 0">
            <br>
            <br>
            <h1>"No Products Found"</h1>
        </div>
        <div *ngIf="filteredProducts.length > 0" class="row">
            <div class="col-6" *ngFor="let product of filteredProducts">
                <div class="card" style="width: 18rem;">
                    <div class="card-body">
                        <div class="card-img-container">
                            <a routerLink="/product-item/{{product.product_ID}}">
                                <img [src]="getImageSrc(product.product_Img)" alt= "Product Image" class="card-img-top">
                            </a>
                        </div>
                        <p class="card-text" style="text-align: center;">{{product.product_Name}}</p>
                    </div>
                </div>
                <br>
                <br>
            </div>
        </div>
    </div>
    <br>
</div>

//ts
import { Component } from '@angular/core';
import { OrderService } from '../Services/order.service';
import { Product } from '../shared/order';
import { CommonModule } from '@angular/common';
import { Router, RouterLink } from '@angular/router';
import { NavbarComponent } from './navbar.component';
import { Location } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';

@Component({
  selector: 'app-product-list',
  standalone: true,
  imports: [CommonModule, RouterLink, NavbarComponent, FormsModule],
  templateUrl: './product-list.component.html',
  styleUrl: './product-list.component.css'
})
export class ProductListComponent {
  productImage: string | null = null;
  products:Product[] = [];
  totalCartItems: number = 0;
  filteredProducts: Product[] = [];
  isSidebarOpen: boolean = false;
  searchTerm: string = '';

  constructor(private orderService:OrderService, private location: Location, private router: Router) {}

  ngOnInit(){
    this.GetAllProducts();
    this.orderService.cartItemsCount.subscribe(count => this.totalCartItems = count); // Update cart items count
    this.orderService.loadWishlistItems();
    this.orderService.loadCartItems();
  }

  GetAllProducts(): void {
    this.orderService.getAllProducts().subscribe({
      next: (p) => {
        this.products = p;
        this.filteredProducts = p;   
        console.log(p);        
      },
      error: (err) => {
        console.error('Error fetching products', err);
      }
    });
  }

  filterProductsByCategory(categoryId: number): void {
    if (categoryId === 0) {
      this.filteredProducts = this.products; // Display all products if 'All' is selected
    } else {
      this.filteredProducts = this.products.filter(product => product.product_Category_ID === categoryId);
    }
    this.toggleSidebar(); // Close sidebar after selecting a category
  }
  

  filteredProductsBySearch(): void {
    if (!this.searchTerm) {
      this.filteredProducts = this.products;
    } else {
      const term = this.searchTerm.toLowerCase();
      this.filteredProducts = this.products.filter(product =>
        product.product_Name.toLowerCase().includes(term)
      );
    }
  }

  toggleSidebar(): void {
    this.isSidebarOpen = !this.isSidebarOpen;
  }

  onCartUpdated(quantity: number) {  // Update cart count
    this.totalCartItems += quantity;
    // this.orderService.updateCartCount(this.totalCartItems); // Update the cart count in the service
  }

  getImageSrc(base64String: string): string {
    return `data:image/jpeg;base64,${base64String}`;
  }
  
  goBack() {
    const userTypeId = JSON.parse(localStorage.getItem('User')!).userTypeId;
    const userId = JSON.parse(localStorage.getItem('User')!).userId;
    if (userTypeId === 1) {  // Ensure userTypeID is compared as string
      this.router.navigateByUrl(`/OwnerHome/${userId}`);
    } else if (userTypeId === 2) {
      this.router.navigateByUrl(`/EmployeeHome/${userId}`);
    } else if (userTypeId === 3) {
      this.router.navigateByUrl(`/Home/${userId}`);
    }
  }
}
downloadDownload PNG downloadDownload JPEG downloadDownload SVG

Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!

Click to optimize width for Twitter