diff --git a/backend-server/src/index.ts b/backend-server/src/index.ts index 5c4cb3e..11b6ebf 100644 --- a/backend-server/src/index.ts +++ b/backend-server/src/index.ts @@ -110,6 +110,18 @@ app.get("/api/backup", async (req,res)=>{ res.send(allBackup) }) +app.post("/api/backup/search", async (req,res)=>{ + const searchTerm = req.body.term; + const foundItems = await BackupModel.find({ + $or: [ + { projectName: new RegExp(searchTerm,"i") }, + { volumeName: new RegExp(searchTerm, "i") } + ] + }) + + res.status(201).send(foundItems); +}) + app.get("/api/update", async (req,res)=>{ const allUpdate = await UpdateModel.find({ deleted: { $ne: true} }).sort({ Date: 'asc' }) res.status(200).send(allUpdate); diff --git a/src/app/components/pages/backup-list/backup-list.component.html b/src/app/components/pages/backup-list/backup-list.component.html index 706f522..abe7ec3 100644 --- a/src/app/components/pages/backup-list/backup-list.component.html +++ b/src/app/components/pages/backup-list/backup-list.component.html @@ -2,6 +2,10 @@

Backup List

+ +

{{searchTerm}}

@@ -21,7 +25,7 @@ - +
{{backup.projectName}} {{backup.volumeName}} {{backup.volumeName}}-{{currentDate | date: 'dd-MM-YYYY'}}-Cloud
diff --git a/src/app/components/pages/backup-list/backup-list.component.ts b/src/app/components/pages/backup-list/backup-list.component.ts index 98e17cd..f5fed31 100644 --- a/src/app/components/pages/backup-list/backup-list.component.ts +++ b/src/app/components/pages/backup-list/backup-list.component.ts @@ -2,22 +2,31 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { BackupService } from './backup-list.service'; import { Backup } from '../../../shared/model/backup.model'; import { CommonModule } from '@angular/common'; -import { Subscription } from 'rxjs'; +import { debounceTime, distinctUntilChanged, Subscription, switchMap } from 'rxjs'; +import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { SearchComponent } from "../../../shared/components/search/search.component"; +import { searchService } from '../../../shared/components/search/search.service'; @Component({ selector: 'app-backup-list', standalone: true, - imports: [CommonModule], + imports: [CommonModule, ReactiveFormsModule, SearchComponent], templateUrl: './backup-list.component.html', styleUrl: './backup-list.component.scss', providers: [BackupService] }) export class BackupListComponent implements OnInit, OnDestroy{ + + backupVolumes: Backup[] = [] currentDate = new Date(); innerHTML!: string; backupVolumesSubscription!: Subscription; - constructor(private backupService: BackupService) {} + searchTerm: FormControl = new FormControl(); + + + + constructor(private backupService: BackupService, private searchService: searchService) {} ngOnInit(): void { this.backupVolumesSubscription = this.backupService.allBackups().subscribe((volumes)=>{ @@ -38,4 +47,18 @@ export class BackupListComponent implements OnInit, OnDestroy{ onReset() { } + + searchRequestSubscriptions: Subscription[] = []; + + onTextChange(changedText: string) { + this.cancelPendingRequests(); + this.searchService.search(changedText).subscribe((resp)=>{ + this.backupVolumes = resp; + }) + + } + + cancelPendingRequests() { + this.searchRequestSubscriptions.forEach(sub => sub.unsubscribe()); + } } diff --git a/src/app/shared/components/search/search.component.html b/src/app/shared/components/search/search.component.html new file mode 100644 index 0000000..03282b4 --- /dev/null +++ b/src/app/shared/components/search/search.component.html @@ -0,0 +1,8 @@ +
+ +
\ No newline at end of file diff --git a/src/app/shared/components/search/search.component.scss b/src/app/shared/components/search/search.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/shared/components/search/search.component.spec.ts b/src/app/shared/components/search/search.component.spec.ts new file mode 100644 index 0000000..1f28b44 --- /dev/null +++ b/src/app/shared/components/search/search.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SearchComponent } from './search.component'; + +describe('SearchComponent', () => { + let component: SearchComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SearchComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/search/search.component.ts b/src/app/shared/components/search/search.component.ts new file mode 100644 index 0000000..642d935 --- /dev/null +++ b/src/app/shared/components/search/search.component.ts @@ -0,0 +1,43 @@ +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Subject, debounceTime, distinctUntilChanged, Subscription } from 'rxjs'; + +@Component({ + selector: 'app-search', + standalone: true, + imports: [FormsModule], + templateUrl: './search.component.html', + styleUrl: './search.component.scss' +}) + export class SearchComponent implements OnInit, OnDestroy { + @Input() initialValue: string = ""; + @Input() debounceTime = 300; + + @Output() textChange = new EventEmitter(); + + inputValue = new Subject(); + trigger = this.inputValue.pipe( + debounceTime(this.debounceTime), + distinctUntilChanged() + ); + + subscriptions: Subscription[] = []; + + constructor() {} + + ngOnInit() { + const subscription = this.trigger.subscribe(currentValue => { + this.textChange.emit(currentValue); + }); + this.subscriptions.push(subscription); + } + + ngOnDestroy() { + this.subscriptions.forEach(sub => sub.unsubscribe()); + } + + onInput(e: any) { + this.inputValue.next(e.target.value); + } + } + \ No newline at end of file diff --git a/src/app/shared/components/search/search.service.ts b/src/app/shared/components/search/search.service.ts new file mode 100644 index 0000000..4e615a9 --- /dev/null +++ b/src/app/shared/components/search/search.service.ts @@ -0,0 +1,18 @@ +import { HttpClient, HttpParams } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { BACKUP_GET_URL } from "../../constants/backend"; +import { Backup } from "../../model/backup.model"; + +@Injectable({providedIn:'root'}) + +export class searchService { + + constructor(private httpClient: HttpClient){} + + search(term: string){ + console.log(term) + let params = new HttpParams().set('term',term) + + return this.httpClient.post(BACKUP_GET_URL+"/search",{term}) + } +} \ No newline at end of file