<aside> 💡
</aside>
npx json-server db.json
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { MovieService } from 'src/app/movie.service';
@Component({
selector: 'app-movie-add',
templateUrl: './movie-add.component.html',
styleUrls: ['./movie-add.component.css']
})
export class MovieAddComponent {
movieForm: FormGroup;
movies: any[] = [];
constructor(private fb: FormBuilder, private movieService: MovieService, private router: Router ) {
this.movieForm = this.fb.group({
id: ["", Validators.required] // id nhi bhi mention ho phir bhi likh kr try krna
title: ["", Validators.required],
director: ["", Validators.required],
director: ["", [Validators.required, Validators.email]],
year: ["", [Validators.required, Validators.min(1900), Validators.max(2025)]],
counter: [0, Validators.required ]
})
}
addMovie(): void {
console.log("Movies Length : ", this.movies.length);
const newMovie = {
...this.movieForm.value
};
// ADD MOVIE LOGIC IS HERE
// dynamic form data coming from client
// this.movieService.addMovie(this.movieForm.value).subscribe(() => {
this.movieService.addMovie(newMovie).subscribe(() => {
this.router.navigate(['/']);
})
}
}
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { MovieService } from 'src/app/movie.service';
@Component({
selector: 'app-edit-movie',
templateUrl: './edit-movie.component.html',
styleUrls: ['./edit-movie.component.css']
})
export class EditMovieComponent implements OnInit {
movieForm : FormGroup;
movieId : any;
constructor(
private fb : FormBuilder,
private movieService: MovieService,
private route : ActivatedRoute,
private router : Router
){
this.movieForm = this.fb.group({
title: ['', Validators.required],
director: ['', Validators.required],
year: [null, [Validators.required, Validators.min(1900), Validators.max(new
Date().getFullYear())]]
})
}
ngOnInit(): void {
this.movieId = this.route.snapshot.paramMap.get('id')!;
this.movieService.getMovie(this.movieId).subscribe(movie=> {
this.movieForm.patchValue(movie);
})
}
updateMovieBtn(): void {
const updatedMovie = { ...this.movieForm.value, id: this.movieId };
this.movieService.updateMovie(updatedMovie).subscribe(() => {
// this.router.navigate(['/']);
this.router.navigateByUrl('/');
})
}
}
}
export class MovieListComponent implements OnInit{
movies: Movie[] = [];
searchTxt: string = "";
filteredMovies: Movie[] = [];
filterMovies(): void {
if(this.searchTxt){
this.filteredMovies = this.movies.filter((m) => {
return m.title.toLowerCase().includes(this.searchTxt.toLowerCase())
|| m.director.toLowerCase().includes(this.searchTxt.toLowerCase() );
})
} else{
this.filteredMovies = [...this.movies];
}
console.log("inp search is ..." + this.searchTxt);
console.log(this.filteredMovies);
}
<div class="searchBox">
<h2>Movies</h2>
<input type="text" [(ngModel)]="searchTxt" (input)="filterMovies()" placeholder="search" >
</div>
onSort () {
this.rooms.sort((a, b) => {
return a.name.localeCompare(b.name)
})
}
onChangeSort (event: any) {
const value = (event.target as HTMLInputElement).value
console.log('Sort by:', value)
this.rooms.sort((a, b) => {
if (a[value] < b[value]) return -1
if (a[value] > b[value]) return 1
return 0 // for equal values
})
}
<button class="btn btn-primary mx-2" (click)="onSort()">Sort</button>
<div class="">
<label for="">Sort</label>
<select name="" (change)="onChangeSort($event)" id="">
<option value=""></option>
<option value="id">ID</option>
<option value="name">Name</option>
<option value="floor">Floor</option>
<option value="capacity">Capacity</option>
<option value="lastInspection">Last Inspection</option>
</select>
</div>
// filter.pipe.ts
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'filter'
})
export class FilterPipe implements PipeTransform {
transform(items: any[], searchTerm: string): any[] {
if(searchTerm == "")
return items;
const normalizedSearchTerm = searchTerm.trim().toLowerCase();
return items.filter((item) => {
return item.name.toLowerCase().includes(normalizedSearchTerm);
} )
}
}
<div>
<input type="text" id="searchTerm" [(ngModel)]="searchTerm">
<div>
// // filtered course (fc) i.e, array
<div *ngFor="let course of fc | filter : searchTerm">
<h3>{{course.title}}</h3>
<p>{{course.instructor}}</p>
<p>{{course.description}}</p>
<p><strong>Duration:</strong>{{course.duration}} hours</p>
<p><strong>Rating:</strong>{{ course.userRating}}</p>
</div>
</div>
</div>
or you can use in ts file :
import { Component, OnInit } from '@angular/core';
import { Course } from '../models/course';
import { CourseService } from '../services/course.service';
import { FilterPipe } from '../services/filterPipe';
@Component({
selector: 'app-course-list',
templateUrl: './course-list.component.html'
})
export class CourseListComponent implements OnInit {
courses:Course[];
searchTerm:string='';
fcourses:Course[];
constructor(private fp:FilterPipe, Private courseService:CourseService){}
getfilteredCourses():Course[]{
this.courses = this.fp.transform(this.courses, this.searchTerm);
return this.courses;
}
}