Discover the Cool Things You Can Do with CSS

 CSS, or Cascading Style Sheets, is a stylesheet language that is used to represent the look & formatting of a document written in HTML. It allows developers to control the appearance of web pages by separating the content of a document from its presentation. CSS is a powerful tool that can be used to create a wide range of visual effects, and in this article, we will take a look at some of the cool things that you can do with CSS.

One of the most powerful features of CSS is its ability to control the layout of a webpage. With CSS, you can specify the position of elements on a page, control the size and dimensions of elements, and create complex grid-based layouts. This is particularly useful for creating responsive designs that look good on a wide range of devices.

CSS also offers a wide range of options for styling text. You can alternate the size, font, and color of text, add text shadows, and even animate text using CSS. This can be used to create visually appealing headlines and other text elements that draw the attention of your visitors.

In addition to styling text and layout, CSS also offers a range of options for styling images. You can use CSS to add borders, round the corners of images, and even apply filters to images. This can be used to create a wide range of visual effects and make your images stand out.

One of the coolest things that you can do with CSS is create animations. With CSS, you can animate elements on a webpage by changing their properties over time. This can be used to create a wide range of effects, such as fading elements in and out, moving elements around the page, and even creating complex interactive animations.

CSS is a powerful tool that allows developers to control the appearance of web pages in a variety of ways. Whether you are a beginner or an experienced developer, there is always something new to learn and discover with CSS. If you are interested in learning more about CSS and what it can do, there are a wide range of resources available online that can help you get started.

Creating a project in Angular 14 and connecting with Spring Boot and MySQL

 In this article, we will create a simple Angular 14 project and connect it with our spring boot project and MySQL. The spring boot project is already created in our previous article. You can view the article on this link. I am using Visual Studio Code to create the angular project.



1. First install Angular using the command 
"npm install -g@angular/cli"

2. Create a project using the command
"ng new PRODUCTUIBB"

3. Next install bootstrap using the command
"npm install --save bootstrap"

4. Now create two components for the Nav bar and Footer.
  "ng g c component/footer"
"ng g c component/navbar"

5. Next create pages to show the homepage, add a product, update a product and show all the products using the following commands.
 "ng g c pages/home"
"ng g c pages/addproduct"
"ng g c pages/products"
"ng g c pages/updateproduct"

6. Your project folder will look like this:


7. Go to app.component.html and add the following code in it:

<app-navbar></app-navbar>

<div class="container marginbottom">
  <router-outlet></router-outlet>
</div>

<div>
<app-footer></app-footer>
</div>


8. Now go to styles.css file and add the following code:

html {
  position: relative;
  min-height: 100%;
}

.footer{
  background-color: black;
  color: white;
  width: 100%;
  position: absolute;
  bottom: 0;
}

.margintop{
margin-top: 15vh;
}

.marginbottom{
  margin-bottom: 15vh;
}

.marginhome{
margin-top: 10vh;
}

9. To create a nav bar, go to navbar.component.html and add the following code:

<nav class="navbar navbar-expand-md navbar-dark bg-primary fixed-top">
  <div class="container-fluid">
    <a class="navbar-brand" href="#">BB Products</a>
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse"
        data-bs-target="#navbarNav" aria-controls="navbarNav"
        aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarNav">
      <ul class="navbar-nav">
        <li class="nav-item">
          <a class="nav-link active" aria-current="page" href="#">Home</a>
        </li>
        <li class="nav-item">
          <a class="nav-link " routerLink="/allproducts">Products List</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" routerLink="/addproduct">Add Products</a>
        </li>
      </ul>
    </div>
  </div>
</nav>


10. To create a footer, go to footer.component.html and add the following code:

<footer class="footer">
  <p class="text-center">&copy; Black Bichhu 2022</p>
</footer>

11. For creating the home page, paste the following code in home.component.html:

<div class="container marginhome">
<div id="carouselExampleCaptions" class="carousel slide"
        data-bs-ride="carousel">
  <div class="carousel-indicators">
    <button type="button" data-bs-target="#carouselExampleCaptions"
        data-bs-slide-to="0" class="active" aria-current="true"
        aria-label="Slide 1"></button>
    <button type="button" data-bs-target="#carouselExampleCaptions"
        data-bs-slide-to="1" aria-label="Slide 2"></button>
    <button type="button" data-bs-target="#carouselExampleCaptions"
        data-bs-slide-to="2" aria-label="Slide 3"></button>
  </div>
  <div class="carousel-inner">
    <div class="carousel-item active">
      <img src="/assets/2.jpg" class="d-block w-100 img-fluid" alt="img">
      <div class="carousel-caption  d-md-block my-5">
        <h1>Welcome to BB Products</h1>
        <p></p>
      </div>
    </div>
    <div class="carousel-item">
      <img src="/assets/1.jpg" class="d-block w-100 img-fluid" alt="...">
      <div class="carousel-caption  d-md-block">
        <h5>Product 1</h5>
        <p>Product 2 Desc</p>
      </div>
    </div>
    <div class="carousel-item">
      <img src="/assets/3.jpg" class="d-block w-100 img-fluid" alt="...">
      <div class="carousel-caption  d-md-block">
        <h5>Product 2</h5>
        <p>Product 2 Desc</p>
      </div>
    </div>
  </div>
  <button class="carousel-control-prev" type="button"
        data-bs-target="#carouselExampleCaptions" data-bs-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Previous</span>
  </button>
  <button class="carousel-control-next" type="button"
        data-bs-target="#carouselExampleCaptions" data-bs-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Next</span>
  </button>
</div>
<div class="text-center mt-5">
  <h3>Let's Start the process</h3>
</div>
<div class="text-center mb-5">
  <button type="button" class="btn btn-primary mx-3"
        routerLink="/allproducts">View Products</button>
  <button type="button" class="btn btn-success mx-3"
        routerLink="/addproduct">Add Products</button>
</div>
</div>

12. Add the following code in product.component.html file:

<div class="container margintop ">
  <h2 class="text-center">Products List</h2>
  <div class="bgcards row">
  <div class="productcard col-md-3 col-sm-5 m-4" *ngFor="let c of products">
    <h3><strong>{{c.name}}</strong></h3>
    <p><small> <strong>Product ID: </strong>{{c.id}}</small></p>
    <p><strong> Quantity: </strong>{{c.quantity}}</p>
    <p><strong>Price: </strong>{{c.price}}</p>
    <button type="button" (click)="onupdateProduct(c.id)"
        class="btn btn-warning mx-2">Edit</button>
    <button type="button" (click)="ondelProduct(c.id)"
        class="btn btn-danger mx-2" >Delete</button>

  </div>
</div>
</div>

also, add the following code in product.component.css file:

.productcard{

border-radius: 5px;
box-shadow: rgba(0, 0, 0, 0.25) 0px 14px 28px,
            rgba(0, 0, 0, 0.22) 0px 10px 10px;
text-align: center;
padding: 2%;
}

.productcard:hover{
  transform: scale(1.2);
}

.bgcards{
  justify-content: center;
}

13. To add products, add the following code in the addproduct.compont.html file:

<div class="container margintop">
  <h2 class="text-center">Add Product</h2>
<div class="addforms">
  <form #addForm="ngForm" (ngSubmit)="onAddProduct(addForm)">
    <div class="mb-3 ">

      <label for="name" class="form-label ">Product Name</label>
      <input type="text" class="form-control" ngModel name="name">

    </div>
    <div class="mb-3">
      <label for="quantity" class="form-label">Product Quantity</label>
      <input type="number" class="form-control" ngModel name="quantity">
    </div>
    <div class="mb-3">
      <label for="price" class="form-label">Product Price</label>
      <input type="number" class="form-control" ngModel name="price">
    </div>
    <div class="text-center mb-5">
      <button type="submit" class="btn btn-primary mx-3" >Submit</button>
      <button type="reset" class="btn btn-primary mx-3"
            id="clearform">Clear</button>
    </div>
  </form>
</div>
</div>

14. Now add the following code in updateproduct.compont.html file:

<div class="container margintop">
  <h2 class="text-center">Edit Product Details</h2>
<div class="addforms">
  <form (ngSubmit)="onupdate()">
    <div class="mb-3">

      <label for="name" class="form-label">Product Name</label>
      <input type="text" [(ngModel)]="product.name" class="form-control"
        ngModel name="name">

    </div>
    <div class="mb-3">
      <label for="quantity" class="form-label">Product Quantity</label>
      <input type="text" [(ngModel)]="product.quantity" class="form-control"
        ngModel name="quantity">
    </div>
    <div class="mb-3">
      <label for="price" class="form-label">Product Price</label>
      <input type="text" [(ngModel)]="product.price" class="form-control"
        ngModel name="price">
    </div>
    <div class="text-center mb-5">
      <button type="submit" class="btn btn-primary mx-3" >Update</button>
      <button type="reset" class="btn btn-primary mx-3"
            id="clearform">Clear</button>
      <button type="button" class="btn btn-primary mx-3"
            routerLink="/allproducts"
        id="clearform">Back</button>
    </div>
  </form>
</div>
</div>

15. Go to app-routing.module.ts and import the components and add the following code:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AddproductComponent } from
    './pages/addproduct/addproduct.component';
import { HomeComponent } from './pages/home/home.component';
import { ProductsComponent } from './pages/products/products.component';
import { UpdateproductComponent } from
    './pages/updateproduct/updateproduct.component';

const routes: Routes = [
  {path:"", component:HomeComponent},
  {path:"allproducts",component:ProductsComponent},
  {path:"addproduct", component:AddproductComponent},
  {path:"updateproduct/:id", component:UpdateproductComponent}
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }


16. Go to app.module.ts and import the following modules:

imports: [
    BrowserModule,
    AppRoutingModule,
    HttpClientModule,
    FormsModule,ReactiveFormsModule,
  ],

17. Create a Product class using the code "ng g class products" and add the below code in it :

export class Product {
  id: number;
  name: string;
  quantity: number;
  price: number;
}

18. Next create a product service which will connect to our spring boot project:
 create service: "ng g service productservice"

now add the following code in product.service.ts file:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http'
import { Observable } from 'rxjs';
import { Product } from './product';

@Injectable({
  providedIn: 'root'
})
export class ProductService {

  constructor(private http:HttpClient ) { }

  private baseUrl = 'http://localhost:8080/api/v1';


  public getProducts():Observable<Product[]>{
    return this.http.get<Product[]>(`${this.baseUrl}/all-products`);
  }

  public addProducts(product: Product):Observable<Product>{
    return this.http.post<Product>
        ('http://localhost:8080/api/v1/add-products',product);
  }

  public updateProducts( id: number,product: Product):Observable<Object>{
    return this.http.put(`${this.baseUrl}/update/${id}`,product);
  }

  public deleteProducts(productId: number):Observable<any>{
    return this.http.delete(`${this.baseUrl}/delete/${productId}`,
        { responseType: 'text' });
  }

  public getProductById(id: number):Observable<Product>{
    return this.http.get<Product>(`${this.baseUrl}/all-products-byid/${id}`);
  }
}


19. Go to addproduct.compont.ts file and add this:

import { HttpErrorResponse } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { NgForm } from '@angular/forms';
import { Router, RouterLink } from '@angular/router';
import { Product } from 'src/app/product';
import { ProductService } from 'src/app/product.service';

@Component({
  selector: 'app-addproduct',
  templateUrl: './addproduct.component.html',
  styleUrls: ['./addproduct.component.css']
})
export class AddproductComponent implements OnInit {

  products: Product[];

  constructor(private productService:ProductService,) { }

  ngOnInit(): void {

  }

  public onAddProduct(addForm:NgForm){

    this.productService.addProducts(addForm.value).subscribe(
      (response:Product)=>{
        alert("Product Added Sucessfully");
      },
      (error:HttpErrorResponse)=>{
        alert(error.message)
      }
    )
    document.getElementById("clearform")?.click();
  }
}


20. Go to the file product.component.ts and add the following code:

import { HttpErrorResponse } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Product } from 'src/app/product';
import { ProductService } from 'src/app/product.service';

@Component({
  selector: 'app-products',
  templateUrl: './products.component.html',
  styleUrls: ['./products.component.css']
})
export class ProductsComponent implements OnInit {

  products: Product[];


  constructor(private productService:ProductService,
        private route: Router) { }

  ngOnInit(): void {
    this.getProducts();

  }
  //getting all the products
  public getProducts(){
    this.productService.getProducts().subscribe(
      (response:Product[])=>{
        this.products=response;
      },
      (error: HttpErrorResponse)=>{
        alert(error.message);
      }
    )
  }

  //deleting product
  ondelProduct(employeeId:number){
    this.productService.deleteProducts(employeeId).subscribe(
      (response:void)=>{
        alert("Deleted");
        this.getProducts();
      },
      (error:HttpErrorResponse)=>{
        alert(error.message)
      }
    )
  }

  onupdateProduct(id: number){
    this.route.navigate(['updateproduct',id])
  }
}

21. Next go to updateproduct.component.ts file and paste the following code:

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { Product } from 'src/app/product';
import { ProductService } from 'src/app/product.service';

@Component({
  selector: 'app-updateproduct',
  templateUrl: './updateproduct.component.html',
  styleUrls: ['./updateproduct.component.css']
})
export class UpdateproductComponent implements OnInit {

  id: number;
  product: Product = new Product();
  constructor(private productService: ProductService,
    private activatedRoute:ActivatedRoute, private route:Router) { }

  ngOnInit(): void {
    this.id=this.activatedRoute.snapshot.params['id'];
    this.productService.getProductById(this.id).subscribe(
      (data)=>{this.product=data},
      (error)=>{alert(error.message)}
    )
  }

  onupdate(){
    this.productService.updateProducts(this.id, this.product).subscribe(
      (data)=>{alert("Updated Sucessfully"),this.gotoproductlist();},
      (error)=>{alert(error.message)},


  )
}

  gotoproductlist(){
    this.route.navigate(['/allproducts'])
  }

}


22. Now our project is ready. Start the angular project using the command "npm start", and also start the spring boot project. By default, the angular project will run on port no. 4200 and spring boot will run on port no. 8080.