| /** |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| import {Component, OnDestroy, OnInit, ViewChild} from '@angular/core'; |
| import 'rxjs/add/operator/switchMap'; |
| import {Observable} from 'rxjs/Observable'; |
| import {ActivatedRouteSnapshot, Router, NavigationEnd} from '@angular/router'; |
| import {Subscription} from 'rxjs/Subscription'; |
| |
| import {ClustersService} from '@app/services/storage/clusters.service'; |
| import {UtilsService} from '@app/services/utils.service'; |
| import {ListItem} from '@app/classes/list-item'; |
| import {ClusterSelectionService} from '@app/services/storage/cluster-selection.service'; |
| import {BehaviorSubject} from 'rxjs/BehaviorSubject'; |
| import {FilterDropdownComponent} from '@modules/shared/components/filter-dropdown/filter-dropdown.component'; |
| import {RoutingUtilsService} from '@app/services/routing-utils.service'; |
| import {DataAvailabilityValues} from '@app/classes/string'; |
| import { DataAvailabilityStatesStore } from '@app/modules/app-load/stores/data-availability-state.store'; |
| import { DataStateStoreKeys } from '@app/modules/app-load/services/app-load.service'; |
| |
| @Component({ |
| selector: 'cluster-filter', |
| templateUrl: './cluster-filter.component.html', |
| styleUrls: ['./cluster-filter.component.less'] |
| }) |
| export class ClusterFilterComponent implements OnInit, OnDestroy { |
| |
| @ViewChild('filterDropdown', { |
| read: FilterDropdownComponent |
| }) |
| filterDropdown: FilterDropdownComponent; |
| |
| private clusterSelectionStoreKey: BehaviorSubject<string> = new BehaviorSubject(''); |
| |
| private clustersAsListItems$: Observable<ListItem[]> = this.clusterSelectionStoreKey.distinctUntilChanged() |
| .switchMap((selectionStoreKey: string) => Observable.combineLatest( |
| this.clusterSelectionStoreService.getParameter(selectionStoreKey), |
| this.clusterStoreService.getAll() |
| ).map(([selections, clusters]) => { |
| const selectedClusters = selections ? (Array.isArray(selections) ? selections : [selections]) : selections; |
| return clusters.map((cluster) => Object.assign(this.utilsService.getListItemFromString(cluster), { |
| isChecked: selectedClusters && selectedClusters.indexOf(cluster) > -1 |
| }) |
| ); |
| }) |
| ).startWith([]); |
| |
| private readonly defaultUseMultiSelection = true; |
| private useMultiSelection: BehaviorSubject<boolean> = new BehaviorSubject(false); |
| |
| private subscriptions: Subscription[] = []; |
| |
| constructor( |
| private clusterStoreService: ClustersService, |
| private utilsService: UtilsService, |
| private router: Router, |
| private clusterSelectionStoreService: ClusterSelectionService, |
| private routingUtilsService: RoutingUtilsService, |
| private dataAvaibilityStateStore: DataAvailabilityStatesStore |
| ) { } |
| |
| ngOnInit() { |
| this.subscriptions.push( |
| this.router.events.filter(routes => routes instanceof NavigationEnd).subscribe(this.onNavigationEnd) |
| ); |
| this.actualizeDropdownSelectionByActivatedRouteSnapshot(this.router.routerState.root.snapshot); |
| } |
| |
| ngOnDestroy() { |
| if (this.subscriptions) { |
| this.subscriptions.forEach((subscription: Subscription) => subscription.unsubscribe()); |
| } |
| } |
| |
| private getClusterSelectionStoreKeyFromActivatedRouteSnapshot(routeSnapshot: ActivatedRouteSnapshot): string { |
| return this.routingUtilsService.getDataFromActivatedRouteSnapshot(routeSnapshot, 'clusterSelectionStoreKey') |
| || (routeSnapshot.firstChild && routeSnapshot.firstChild.url[0].path); |
| } |
| |
| private setClusterSelectionStoreKeyFromActivatedRouteSnapshot(routeSnapshot: ActivatedRouteSnapshot): void { |
| const clusterSelectionStoreKey: string = this.getClusterSelectionStoreKeyFromActivatedRouteSnapshot(routeSnapshot); |
| if (clusterSelectionStoreKey !== this.clusterSelectionStoreKey.getValue()) { |
| this.clusterSelectionStoreKey.next(clusterSelectionStoreKey); |
| } |
| } |
| |
| private setUseMultiSelectionFromActivatedRouteSnapshot(routeSnapshot: ActivatedRouteSnapshot): void { |
| const multiClusterFilter: boolean | null = this.routingUtilsService.getDataFromActivatedRouteSnapshot( |
| routeSnapshot, 'multiClusterFilter' |
| ); |
| if (this.useMultiSelection.getValue() !== multiClusterFilter) { |
| this.useMultiSelection.next( |
| typeof multiClusterFilter === 'boolean' ? multiClusterFilter : this.defaultUseMultiSelection |
| ); |
| } |
| } |
| |
| private setDropdownSelectionByActivatedRouteSnapshot(routeSnapshot: ActivatedRouteSnapshot): void { |
| const clusterParamKey: string = this.routingUtilsService.getDataFromActivatedRouteSnapshot(routeSnapshot, 'clusterParamKey'); |
| let clusterSelection = this.routingUtilsService.getParamFromActivatedRouteSnapshot(routeSnapshot, clusterParamKey || 'cluster'); |
| if (clusterSelection) { |
| clusterSelection = this.useMultiSelection.getValue() ? clusterSelection.split(/[,;]/) : clusterSelection; |
| if (Array.isArray(clusterSelection)) { |
| clusterSelection = clusterSelection.map( |
| (clusterName: string) => Object.assign(this.utilsService.getListItemFromString(clusterName), { |
| isChecked: true |
| }) |
| ); |
| } else { |
| clusterSelection = Object.assign(this.utilsService.getListItemFromString(clusterSelection), { |
| isChecked: true |
| }); |
| } |
| this.dataAvaibilityStateStore.getParameter(DataStateStoreKeys.CLUSTERS_DATA_KEY) |
| .filter((state: DataAvailabilityValues) => state === DataAvailabilityValues.AVAILABLE) |
| .first() |
| .subscribe(() => { |
| this.filterDropdown.updateSelection(clusterSelection); |
| }); |
| } else { |
| this.filterDropdown.updateSelection(null); |
| } |
| } |
| |
| private actualizeDropdownSelectionByActivatedRouteSnapshot(routeSnapshot: ActivatedRouteSnapshot): void { |
| this.setClusterSelectionStoreKeyFromActivatedRouteSnapshot(routeSnapshot); |
| this.setUseMultiSelectionFromActivatedRouteSnapshot(routeSnapshot); |
| this.setDropdownSelectionByActivatedRouteSnapshot(routeSnapshot); |
| } |
| |
| private onNavigationEnd = (): void => { |
| this.actualizeDropdownSelectionByActivatedRouteSnapshot(this.router.routerState.root.snapshot); |
| } |
| |
| onDropDownSelectionChanged = (values): void => { |
| this.setSelectionInClusterSelectionStore(values); |
| } |
| |
| private setSelectionInClusterSelectionStore = (values): void => { |
| this.clusterSelectionStoreService.getParameter(this.clusterSelectionStoreKey.getValue()).first() |
| .subscribe(currentCluster => { |
| if (!this.utilsService.isEqual(currentCluster, values)) { |
| this.clusterSelectionStoreService.setParameter(this.clusterSelectionStoreKey.getValue(), values); |
| } |
| }); |
| } |
| |
| } |