| /******************************************************************************** |
| * 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, EventEmitter} from '@angular/core'; |
| |
| import { PreferenceView, View, ViewService} from './tableview.service'; |
| import { EditViewComponent } from './editview.component'; |
| |
| import {classToClass} from 'class-transformer'; |
| import { ModalDirective } from 'ngx-bootstrap'; |
| |
| import { OverwriteDialogComponent } from '../core/overwrite-dialog.component'; |
| import { MDMNotificationService } from '../core/mdm-notification.service'; |
| import { Scope } from '../core/preference.service'; |
| |
| import { TranslateService } from '@ngx-translate/core'; |
| import { TRANSLATE } from '../core/mdm-core.module'; |
| |
| @Component({ |
| selector: 'mdm-view', |
| templateUrl: 'view.component.html' |
| }) |
| export class ViewComponent implements OnInit { |
| |
| public selectedView: View; |
| public groupedViews: { scope: string, view: View[], label: string }[] = []; |
| public viewChanged$ = new EventEmitter(); |
| public viewName = ''; |
| public userViewNames: string[]; |
| public selectedRow: string; |
| public lazySelectedRow: string; |
| |
| @ViewChild(EditViewComponent) |
| editViewComponent: EditViewComponent; |
| |
| @ViewChild('lgSaveModal') |
| childSaveModal: ModalDirective; |
| |
| @ViewChild(OverwriteDialogComponent) |
| overwriteDialogComponent: OverwriteDialogComponent; |
| |
| constructor(private viewService: ViewService, |
| private notificationService: MDMNotificationService, |
| private translateService: TranslateService) { |
| } |
| |
| ngOnInit() { |
| this.viewService.getViews().subscribe( |
| views => this.setViews(views), |
| error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-load-views'), error) |
| ); |
| this.viewService.viewSaved$.subscribe( |
| view => this.onViewSaved(view), |
| error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-saving-view'), error) |
| ); |
| this.viewService.viewDeleted$.subscribe( |
| () => this.onDeleteView(), |
| error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-deleting-view'), error) |
| ); |
| } |
| |
| selectView(view: View) { |
| this.selectedView = view; |
| this.viewChanged$.emit(); |
| } |
| |
| public editSelectedView(e: Event) { |
| e.stopPropagation(); |
| this.editViewComponent.showDialog(this.selectedView).subscribe( |
| v => this.selectedView = v, |
| error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-select-view'), error) |
| ); |
| } |
| |
| public newView(e: Event) { |
| e.stopPropagation(); |
| this.editViewComponent.showDialog(new View()).subscribe( |
| v => this.selectedView = v, |
| error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-display-view-editor'), error) |
| ); |
| } |
| |
| private onDeleteView() { |
| this.viewService.getViews().subscribe( |
| prefViews => { |
| this.getGroupedView(prefViews); |
| if (prefViews.find(pv => pv.view.name === this.selectedView.name) == undefined |
| && this.viewService.defaultPrefViews.find(pv => pv.view.name === this.selectedView.name) == undefined) { |
| this.selectView(prefViews[0].view); |
| } |
| }, |
| error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-update-views'), error) |
| ); |
| } |
| |
| private onViewSaved(view: View) { |
| this.viewService.getViews().subscribe( |
| prefViews => this.getGroupedView(prefViews), |
| error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-update-views'), error) |
| ); |
| } |
| |
| private setViews(prefViews: PreferenceView[]) { |
| this.getGroupedView(prefViews); |
| this.selectView(prefViews[0].view); |
| } |
| |
| private getGroupedView(prefViews: PreferenceView[]) { |
| this.groupedViews = []; |
| for (let i = 0; i < prefViews.length; i++) { |
| let pushed = false; |
| for (let j = 0; j < this.groupedViews.length; j++) { |
| if (prefViews[i].scope === this.groupedViews[j].scope) { |
| this.groupedViews[j].view.push(prefViews[i].view); |
| pushed = true; |
| } |
| } |
| if (pushed === false) { this.groupedViews.push({ |
| scope: prefViews[i].scope, |
| view: [prefViews[i].view], |
| label: Scope.toLabel(prefViews[i].scope) |
| }); } |
| } |
| this.updateUserViewNames(); |
| } |
| |
| private updateUserViewNames() { |
| this.viewService.getViews().subscribe( |
| prefViews => this.userViewNames = prefViews.filter(pv => pv.scope === Scope.USER) |
| .map(pv => pv.view.name), |
| error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-update-views'), error) |
| ); |
| } |
| |
| saveView(e: Event) { |
| e.stopPropagation(); |
| if (this.groupedViews.find(gv => gv.view.find(v => v.name === this.viewName) != undefined)) { |
| this.childSaveModal.hide(); |
| this.overwriteDialogComponent.showOverwriteModal(this.translateService.instant('tableview.view.a-view')).subscribe( |
| needSave => this.saveView2(needSave), |
| error => { |
| this.saveView2(false); |
| this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-save-view'), error); |
| } |
| ); |
| } else { |
| this.saveView2(true); |
| } |
| } |
| |
| saveView2(save: boolean) { |
| if (save) { |
| let view = classToClass(this.selectedView); |
| view.name = this.viewName; |
| this.viewService.saveView(view); |
| this.childSaveModal.hide(); |
| this.selectView(classToClass(view)); |
| } else { |
| this.childSaveModal.show(); |
| } |
| } |
| |
| showSaveModal(e: Event) { |
| e.stopPropagation(); |
| this.viewName = this.selectedView.name === this.translateService.instant('tableview.view.new-view') ? '' : this.selectedView.name; |
| this.childSaveModal.show(); |
| } |
| |
| deleteView(e: Event) { |
| e.stopPropagation(); |
| let userGroup = this.groupedViews.find(gv => gv.scope === Scope.USER); |
| if (userGroup && userGroup.view.length > 0) { |
| this.viewService.deleteView(this.selectedView.name).subscribe(() => |
| this.viewService.getViews().subscribe( |
| views => { |
| this.setViews(views); |
| this.viewService.viewDeleted$.emit(); |
| }, |
| error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-delete-view'), error)) |
| ); |
| } else { |
| this.notificationService.notifyError('Forbidden.', |
| this.translateService.instant('tableview.view.err-cannot-modify-system-settings')); |
| } |
| } |
| |
| getSaveBtnTitle() { |
| return this.viewName ? TRANSLATE('tableview.view.tooltip-save-view') : TRANSLATE('tableview.view.tooltip-no-name-set'); |
| } |
| |
| onRowSelect(e: any) { |
| if (this.lazySelectedRow !== e.data) { |
| this.selectedRow = e.data; |
| this.viewName = e.data; |
| } else { |
| this.selectedRow = undefined; |
| this.viewName = ''; |
| } |
| this.lazySelectedRow = this.selectedRow; |
| } |
| } |