108 lines
3.2 KiB
TypeScript
108 lines
3.2 KiB
TypeScript
import {Component} from '@angular/core';
|
|
import {FormControl, FormGroup} from "@angular/forms";
|
|
import {debounceTime} from "rxjs/operators";
|
|
import {Subscription} from "rxjs";
|
|
import {ListsService} from "@app/_services";
|
|
|
|
@Component({
|
|
templateUrl: 'search-page.component.html',
|
|
styleUrls: ['search-page.component.scss']
|
|
})
|
|
export class SearchPageComponent {
|
|
public filters: FormGroup;
|
|
public tabs: any = [
|
|
{name: 'pages', title: 'Страницы сайта', active: true},
|
|
{name: 'publications', title: 'Публикации'},
|
|
{name: 'entries', title: 'Записи реестров'}
|
|
];
|
|
public total = 0;
|
|
public searchString = '';
|
|
public loading: any = {pages: true, publications: true, entries: true};
|
|
|
|
pagesSubscription: Subscription;
|
|
publicationsSubscription: Subscription;
|
|
entriesSubscription: Subscription;
|
|
|
|
constructor(private listsService: ListsService) {
|
|
this.pagesSubscription = this.listsService.result('sections-list').subscribe(res => {
|
|
this.setCount('pages', res?.meta?.pagination?.total);
|
|
});
|
|
this.publicationsSubscription = this.listsService.result('publications-list').subscribe(res => {
|
|
this.setCount('publications', res?.meta?.pagination?.total);
|
|
});
|
|
this.entriesSubscription = this.listsService.result('common-entries').subscribe(res => {
|
|
this.setCount('entries', res?.meta?.pagination?.total);
|
|
});
|
|
}
|
|
|
|
get activeTab() {
|
|
return this.tabs.filter(item => {return item.active})[0];
|
|
}
|
|
get enabledTabs() {
|
|
return this.tabs.filter(item => {return !item.disabled});
|
|
}
|
|
|
|
get isLoaded() {
|
|
return !this.loading?.pages && !this.loading?.publications && !this.loading?.entries;
|
|
}
|
|
|
|
ngOnInit() {
|
|
this.filters = new FormGroup({search: new FormControl()});
|
|
this.filters.valueChanges.pipe(debounceTime(300)).subscribe(val => {
|
|
this.loading = {pages: true, publications: true, entries: true};
|
|
if (val.search) {
|
|
this.listsService.addFilters(val, 'sections-list');
|
|
this.listsService.addFilters(val, 'publications-list');
|
|
this.listsService.addFilters(val, 'common-entries');
|
|
} else this.resetResults();
|
|
this.searchString = val.search;
|
|
});
|
|
}
|
|
|
|
ngOnDestroy() {
|
|
this.pagesSubscription?.unsubscribe();
|
|
this.publicationsSubscription?.unsubscribe();
|
|
this.entriesSubscription?.unsubscribe();
|
|
}
|
|
|
|
|
|
toggleTab(tab: any) {
|
|
if (!tab.disabled) {
|
|
this.tabs = this.tabs.map(item => {
|
|
item.active = item.name === tab.name;
|
|
return item;
|
|
});
|
|
}
|
|
}
|
|
|
|
setCount(tabName, value) {
|
|
this.total = 0;
|
|
this.tabs = this.tabs.map(item => {
|
|
if (item.name === tabName) {
|
|
item.count = value || 0;
|
|
item.disabled = item.count < 1;
|
|
}
|
|
this.total += (item.count || 0);
|
|
return item;
|
|
});
|
|
this.loading[tabName] = false;
|
|
if (this.isLoaded) this.checkActiveTab();
|
|
}
|
|
|
|
checkActiveTab() {
|
|
let active = this.activeTab;
|
|
let enabled = this.enabledTabs;
|
|
if ((!active || active.disabled) && enabled.length) {
|
|
this.toggleTab(enabled[0]);
|
|
}
|
|
}
|
|
|
|
resetResults() {
|
|
this.listsService.result('sections-list').next(null);
|
|
this.listsService.result('publications-list').next(null);
|
|
this.listsService.result('common-entries').next(null);
|
|
|
|
}
|
|
|
|
}
|