Skip to main content
  1. All Posts/

ecommerce-angular-app

eCommerce TypeScript

ECOMMERCE ANGULAR APP

Description

This repository is a Software of Application with Angular.

Installation

Using Angular 10 preferably.

REST API (example)

https://github.com/DanielArturoAlejoAlvarez/ecommerce-rest-api-node

Usage

$ git clone https://github.com/DanielArturoAlejoAlvarez/ecommerce-angular-app.git
[NAME APP]

$ yarn install

$ ng serve

Follow the following steps and you’re good to go! Important:

Coding

Config

...
export class AuthComponent implements OnInit {
  formAuth: FormGroup;

  constructor(
    private _toastr: ToastrService,
    private _fb: FormBuilder,
    private _auth: AuthService,
    private _router: Router
  ) {
    this.formAuth = this._fb.group({
      username: ['', Validators.required],
      password: ['', Validators.required],
    });
  }

  ngOnInit(): void {}

  login() {
    this._auth.login(this.formAuth.value).subscribe((data) => {
      if (data.ok) {
        localStorage.setItem('token', data.token);
        this._toastr.success('You are now logged in!', 'SUCCESS')
        this._router.navigate(['user']);
      }else {
        //alert(data.msg)
        this._toastr.error(data.msg, 'ERROR')
      }
    },err=>{
      //alert(err.error.msg)
      this._toastr.error(err.error.msg, 'ERROR')
    });
  }
}
...

Guards

...
export class AuthGuard implements CanActivate {

  constructor(private _as: AuthService, private _router: Router) {}

  canActivate(): boolean {
    if (this._as.loggedIn()) {
      return true
    }else {
      this._router.navigate(['login'])
      return false
    }
  }
  
}
...

Services

...
export class OrderService {

  httpOptions = {
    headers: new HttpHeaders({
      'Authorization': localStorage.getItem('token')
    })
  }

  constructor(private _http: HttpClient) { }


  API_URI = 'http://127.0.0.1:3000/api/v1'

  getOrders(): Observable<any> {
    return this._http.get<Order[]>(`${this.API_URI}/orders`, this.httpOptions)
  }

  getOrder(id: number|string): Observable<any> {
    return this._http.get<Order>(`${this.API_URI}/orders/${id}`, this.httpOptions)
  }

  saveOrder(order: Order): Observable<any> {
    return this._http.post<Order>(`${this.API_URI}/orders`, order, this.httpOptions)
  }

  updateOrder(order: Order): Observable<any> {
    return this._http.put<Order>(`${this.API_URI}/orders/${order._id}`, order, this.httpOptions)
  }

  deleteOrder(order: Order): Observable<any> {
    return this._http.delete<Order>(`${this.API_URI}/orders/${order._id}`, this.httpOptions)
  }

}
...

Components

...
export class OrderComponent implements OnInit {
  formOrder: FormGroup;

  orders = [];
  products = []
  
  clients = []

  edit: boolean = false;

  btnAction: string = 'CREATE';

  

  constructor(
    private _fb: FormBuilder,
    private _toastr: ToastrService,
    private _cs: ClientService,
    private _ps: ProductService,
    private _os: OrderService,
    private _router: Router
  ) {
    this.formOrder = this._fb.group({
      _id: [1],
      client: [{}],
      product: [{}],
      price: [0],
      qty: [1],
      total: [0],
      orderItems: [[]],
      serial: ['']
    });
  }

  ngOnInit(): void {
    
    this.orderList();
    this.clientList()
    this.productList()
    
  }

  putPrice() {
    let data = this.formOrder.value.product.split('-'); 
    this.formOrder.patchValue({
      price: data[1]
    })   
  }

  putSerialNumber() {
    const pos = this.clients.indexOf(this.formOrder.value.client)
    let serialNum= this.generateSerialNumber(pos)
    this.formOrder.value.serial = 
    this.formOrder.patchValue({
      serial: serialNum
    })  
  }

  deleteItem(item: number) {
    const items = this.formOrder.value.orderItems
    let obj = items.splice(items.indexOf(item), 1);
    this.formOrder.value.total -=  obj[0].subtotal    
  }


  addCart() {
    let data = this.formOrder.value.product.split('-');

    let exist = this.formOrder.value.orderItems.findIndex(e=>e.product_id == data[0])
    console.log(exist)

    if (exist != -1) {
      this.formOrder.value.orderItems[exist] = {
        product_id: data[0],
        product_name: data[2],
        qty: Number(this.formOrder.value.orderItems[exist].qty) + Number(this.formOrder.value.qty),
        price: this.formOrder.value.price,
        subtotal: this.formOrder.value.price * (Number(this.formOrder.value.orderItems[exist].qty) + Number(this.formOrder.value.qty))
      }
    } else {
      this.formOrder.value.orderItems.push({
        product_id: data[0],
        product_name: data[2],
        qty: this.formOrder.value.qty,
        price: this.formOrder.value.price,
        subtotal: this.formOrder.value.qty * this.formOrder.value.price
      });
    }

    
    this.formOrder.patchValue({
      total: this.formOrder.value.total + (this.formOrder.value.qty * this.formOrder.value.price)
    })  
  }

  orderList() {
    this._os.getOrders().subscribe(
      (data) => {
        console.log(data);
        this.orders = data.orders;
      },
      (err) => {
        console.log(err);
      }
    );
  }   

  addOrder() {
    this._os.saveOrder(this.formOrder.value)
      .subscribe(data=>{
        this.orderList()
        this.formOrder.reset({
          price: 0,
          qty: 1,
          total: 0
        })
        this._toastr.success('Order saved successfully!', 'SUCCESS')
      },err=>{
        console.log(err)
      })
  }

  clientList() {
    this._cs.getClients().subscribe(
      (data) => {
        console.log(data);
        this.clients = data.clients;
      },
      (err) => {
        console.log(err);
      }
    );
  }

  productList() {
    this._ps.getProducts().subscribe(
      (data) => {
        console.log(data);
        this.products = data.products;
      },
      (err) => {
        console.log(err);
      }
    );
  }


  generateSerialNumber(num: number) {
    if (num<=9) {
      return '000000000'+num
    }
    if (num<=99 && num >9) {
      return '00000000'+num
    }
    if (num<=999 && num >99) {
      return '0000000'+num
    }
    if (num<=9999 && num >999) {
      return '000000'+num
    }
    if (num<=99999 && num >9999) {
      return '00000'+num
    }
    if (num<=999999 && num >99999) {
      return '0000'+num
    }
    if (num<=9999999 && num >999999) {
      return '000'+num
    }
    if (num<=99999999 && num >999999) {
      return '00'+num
    }
    if (num<=999999999 && num >9999999) {
      return '0'+num
    }
  }
  
}
...

Models

...
export class Order {
  _id: number | string;
  client: Client;
  product: Product;
  price: number;
  qty: number;
  serial: number | string;
  total: number;
  orderItems: [];
}

...

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/DanielArturoAlejoAlvarez/ecommerce-angular-app. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.