| /******************************************************************************** |
| * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation |
| * |
| * See the NOTICE file(s) distributed with this work for additional |
| * information regarding copyright ownership. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| ********************************************************************************/ |
| |
| |
| import {Component, ViewChild, OnInit, Output, EventEmitter} from '@angular/core'; |
| |
| import {map} from 'rxjs/operators'; |
| import {View, ViewColumn, ViewService} from './tableview.service'; |
| import {NodeService} from '../navigator/node.service'; |
| import {Node} from '../navigator/node'; |
| import {SearchService, SearchAttribute} from '../search/search.service'; |
| import {SearchattributeTreeComponent} from '../searchattribute-tree/searchattribute-tree.component'; |
| import {MDMNotificationService} from '../core/mdm-notification.service'; |
| import {TreeNode} from 'primeng/primeng'; |
| import {ModalDirective} from 'ngx-bootstrap'; |
| import {TypeaheadMatch} from 'ngx-bootstrap/typeahead'; |
| import {classToClass} from 'class-transformer'; |
| import { TranslateService } from '@ngx-translate/core'; |
| |
| @Component({ |
| selector: 'edit-view', |
| templateUrl: './editview.component.html', |
| styles: ['.remove {color:black; cursor: pointer; float: right}', '.icon { cursor: pointer; margin: 0px 5px; }'] |
| }) |
| export class EditViewComponent implements OnInit { |
| |
| @ViewChild('lgModal') public childModal: ModalDirective; |
| @ViewChild(SearchattributeTreeComponent) tree: SearchattributeTreeComponent; |
| |
| environments: Node[] = []; |
| isReadOnly = false; |
| currentView: View = new View(); |
| searchAttributes: { [env: string]: SearchAttribute[] } = {}; |
| typeAheadValues: {label: string, group: string, attribute: SearchAttribute }[] = []; |
| |
| selectedAttribute: SearchAttribute; |
| |
| @Output() |
| coloumnsSubmitted = new EventEmitter<View>(); |
| |
| constructor(private nodeService: NodeService, |
| private viewService: ViewService, |
| private searchService: SearchService, |
| private notificationService: MDMNotificationService, |
| private translateService: TranslateService) { } |
| |
| ngOnInit() { |
| this.tree.onNodeSelect$.subscribe( |
| node => this.selectNode(node), |
| error => this.notificationService.notifyError(this.translateService.instant('tableview.editview.err-cannot-select-node'), error) |
| ); |
| |
| this.nodeService.getNodes() |
| .subscribe( |
| envs => { |
| this.searchService.loadSearchAttributesStructured(envs.map(e => e.sourceName)).pipe( |
| map(attrs => attrs['measurements'])) |
| .subscribe( |
| attrs => this.refreshTypeAheadValues(attrs, envs), |
| error => this.notificationService.notifyError( |
| this.translateService.instant('tableview.editview.err-cannot-load-search-attributes'), error) |
| ); |
| }, |
| error => this.notificationService.notifyError(this.translateService.instant('tableview.editview.err-cannot-load-nodes'), error) |
| ); |
| } |
| |
| refreshTypeAheadValues(searchAttributes: { [env: string]: SearchAttribute[] }, environments: Node[]) { |
| |
| this.searchAttributes = searchAttributes; |
| this.environments = environments; |
| |
| let ar = Object.keys(this.searchAttributes) |
| .map(env => this.searchAttributes[env]) |
| .reduce((acc, value) => acc.concat(value), <SearchAttribute[]> []) |
| .map(sa => { return { 'label': sa.boType + '.' + sa.attrName, 'group': sa.boType, 'attribute': sa }; }); |
| |
| this.typeAheadValues = this.uniqueBy(ar, p => p.label); |
| } |
| |
| showDialog(currentView: View) { |
| this.currentView = classToClass(currentView); |
| this.isNameReadOnly(); |
| this.childModal.show(); |
| return this.coloumnsSubmitted; |
| } |
| |
| closeDialog() { |
| this.childModal.hide(); |
| } |
| |
| remove(col: ViewColumn) { |
| this.currentView.columns = this.currentView.columns.filter(c => c !== col); |
| } |
| |
| isLast(col: ViewColumn) { |
| return this.currentView.columns.indexOf(col) === this.currentView.columns.length - 1; |
| } |
| |
| isFirst(col: ViewColumn) { |
| return this.currentView.columns.indexOf(col) === 0; |
| } |
| |
| moveUp(col: ViewColumn) { |
| if (!this.isFirst(col)) { |
| let oldIndex = this.currentView.columns.indexOf(col); |
| let otherCol = this.currentView.columns[oldIndex - 1]; |
| this.currentView.columns[oldIndex] = otherCol; |
| this.currentView.columns[oldIndex - 1] = col; |
| } |
| } |
| |
| moveDown(col: ViewColumn) { |
| if (!this.isLast(col)) { |
| let oldIndex = this.currentView.columns.indexOf(col); |
| let otherCol = this.currentView.columns[oldIndex + 1]; |
| this.currentView.columns[oldIndex] = otherCol; |
| this.currentView.columns[oldIndex + 1] = col; |
| } |
| } |
| |
| selectNode(node: TreeNode) { |
| if (node.type !== 'attribute') { |
| return; |
| } |
| this.pushViewCol(new ViewColumn(node.parent.label, node.label)); |
| } |
| |
| pushViewCol(viewCol: ViewColumn) { |
| if (viewCol && this.currentView.columns.findIndex(c => viewCol.equals(c)) === -1 ) { |
| this.currentView.columns.push(viewCol); |
| } else { |
| this.notificationService.notifyInfo(this.translateService.instant('tableview.editview.attribute-already-selected'), 'Info'); |
| } |
| } |
| |
| isAsc(col: ViewColumn) { |
| return col.sortOrder === 1; |
| } |
| isDesc(col: ViewColumn) { |
| return col.sortOrder === -1; |
| } |
| isNone(col: ViewColumn) { |
| return col.sortOrder === null; |
| } |
| |
| toggleSort(col: ViewColumn) { |
| if (col.sortOrder === null) { |
| this.currentView.setSortOrder(col.type, col.name, 1); |
| } else if (col.sortOrder === 1) { |
| this.currentView.setSortOrder(col.type, col.name, -1); |
| } else if (col.sortOrder === -1) { |
| this.currentView.setSortOrder(col.type, col.name, null); |
| } |
| } |
| |
| private uniqueBy<T>(a: T[], key: (T) => any) { |
| let seen = {}; |
| return a.filter(function(item) { |
| let k = key(item); |
| return seen.hasOwnProperty(k) ? false : (seen[k] = true); |
| }); |
| } |
| |
| public typeaheadOnSelect(match: TypeaheadMatch) { |
| this.pushViewCol(new ViewColumn(match.item.attribute.boType, match.item.attribute.attrName)); |
| this.selectedAttribute = undefined; |
| } |
| |
| private isNameReadOnly() { |
| return this.isReadOnly = (this.currentView.name === '') ? false : true; |
| } |
| |
| applyChanges() { |
| this.coloumnsSubmitted.emit(this.currentView); |
| this.closeDialog(); |
| } |
| } |