| /******************************************************************************** |
| * Copyright (c) 2015-2018 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, Input, Output, EventEmitter, OnInit, ViewChild } from '@angular/core'; |
| import { DomSanitizer } from '@angular/platform-browser'; |
| import { ModalDirective } from 'ngx-bootstrap'; |
| |
| import { BasketService, Basket} from './basket.service'; |
| |
| import { MDMItem} from '../core/mdm-item'; |
| import { OverwriteDialogComponent } from '../core/overwrite-dialog.component'; |
| import { NavigatorService } from '../navigator/navigator.service'; |
| import { Node} from '../navigator/node'; |
| import { NodeService } from '../navigator/node.service'; |
| import { TableviewComponent } from '../tableview/tableview.component'; |
| import { ViewComponent } from '../tableview/view.component'; |
| import { View } from '../tableview/tableview.service'; |
| import { QueryService, SearchResult, Row } from '../tableview/query.service'; |
| |
| import { deserialize } from 'class-transformer'; |
| |
| import {MenuItem} from 'primeng/primeng'; |
| import * as FileSaver from 'file-saver'; |
| |
| import {MDMNotificationService} from '../core/mdm-notification.service'; |
| |
| import { TranslateService } from '@ngx-translate/core'; |
| import { streamTranslate, TRANSLATE } from '../core/mdm-core.module'; |
| |
| @Component({ |
| selector: 'mdm-basket', |
| templateUrl: 'mdm-basket.component.html', |
| styleUrls: ['./mdm-basket.component.css'], |
| }) |
| export class MDMBasketComponent implements OnInit { |
| @Output() onActive = new EventEmitter<Node>(); |
| @Output() onSelect = new EventEmitter<Node>(); |
| @Input() activeNode: Node; |
| |
| basketName = ''; |
| basketContent: SearchResult = new SearchResult(); |
| basket = 'Warenkorb'; |
| |
| baskets: Basket[] = []; |
| selectedBasket: Basket; |
| environments: Node[]; |
| |
| public selectedRow: string; |
| public lazySelectedRow: string; |
| |
| _currentChange: any; |
| |
| contextMenuItems: MenuItem[] = [ |
| { label: 'Remove selection from basket', icon: 'fa fa-times', command: (event) => this.removeSelected() } |
| ]; |
| |
| fixedLaunchers: MenuItem[] = [ |
| {label: 'ATFX', command: (event) => this.saveBasketAsATFX(event.originalEvent)} |
| ]; |
| launchers: MenuItem[] = []; |
| |
| @ViewChild(TableviewComponent) |
| tableViewComponent: TableviewComponent; |
| @ViewChild(ViewComponent) |
| viewComponent: ViewComponent; |
| @ViewChild('lgLoadModal') |
| childLoadModal: ModalDirective; |
| @ViewChild('lgSaveModal') |
| childSaveModal: ModalDirective; |
| @ViewChild(OverwriteDialogComponent) |
| overwriteDialogComponent: OverwriteDialogComponent; |
| |
| constructor(private _basketService: BasketService, |
| private queryService: QueryService, |
| private navigatorService: NavigatorService, |
| private sanitizer: DomSanitizer, |
| private nodeService: NodeService, |
| private notificationService: MDMNotificationService, |
| private translateService: TranslateService) { |
| } |
| |
| removeSelected() { |
| this._basketService.remove(this.tableViewComponent.menuSelectedRow.getItem()); |
| } |
| |
| ngOnInit() { |
| streamTranslate(this.translateService, TRANSLATE('basket.mdm-basket.remove-selection')).subscribe( |
| (msg: string) => this.contextMenuItems[0].label = msg); |
| |
| this.nodeService.getRootNodes().subscribe( |
| envs => this.environments = envs, |
| error => this.translateService.getTranslation(TRANSLATE('basket.mdm-basket.err-cannot-load-sources')) |
| .subscribe(msg => this.notificationService.notifyError(msg, error) |
| )); |
| |
| this._basketService.getFileExtensions() |
| .map(launchers => launchers.map(l => <MenuItem> { |
| label: l.label, |
| command: (event) => this.saveBasketWithExtension(event.originalEvent, l.extension) })) |
| .subscribe(l => this.launchers = this.fixedLaunchers.concat(l) ); |
| |
| this.setItems(this._basketService.items); |
| |
| this._basketService.itemsAdded$.subscribe( |
| items => this.addItems(items), |
| error => this.translateService.getTranslation(TRANSLATE('basket.mdm-basket.err-cannot-add-selection')) |
| .subscribe(msg => this.notificationService.notifyError(msg, error) |
| )); |
| |
| this._basketService.itemsRemoved$.subscribe( |
| items => this.removeItems(items), |
| error => this.translateService.getTranslation(TRANSLATE('basket.mdm-basket.err-cannot-remove-selection')) |
| .subscribe(msg => this.notificationService.notifyError(msg, error) |
| )); |
| |
| this.viewComponent.viewChanged$.subscribe( |
| () => this.setItems(this._basketService.items), |
| error => this.translateService.getTranslation(TRANSLATE('basket.mdm-basket.err-cannot-select-view')) |
| .subscribe(msg => this.notificationService.notifyError(msg, error) |
| )); |
| } |
| |
| onViewClick(e: Event) { |
| e.stopPropagation(); |
| } |
| |
| setItems(items: MDMItem[]) { |
| this.basketContent.rows = []; |
| this.addItems(items); |
| } |
| |
| addItems(items: MDMItem[]) { |
| if (this.viewComponent.selectedView) { |
| this.queryService.queryItems(items, this.viewComponent.selectedView.columns.map(c => c.type + '.' + c.name)) |
| .forEach(q => |
| q.subscribe( |
| r => this.addData(r.rows), |
| error => this.notificationService.notifyError( |
| this.translateService.instant('basket.mdm-basket.err-cannot-add-items-to-shopping-basket'), error)) |
| ); |
| } |
| } |
| |
| removeItems(items: MDMItem[]) { |
| // copy and reasign to get new object refference triggering angular change detection in tableview. |
| let tmp = Object.assign({}, this.basketContent); |
| items.forEach(item => |
| tmp.rows = tmp.rows.filter(row => |
| !(row.source === item.source && row.type === item.type && row.id === item.id))); |
| this.basketContent = tmp; |
| } |
| |
| setView(view: View) { |
| console.log('setView', view); |
| } |
| |
| saveBasket(e: Event) { |
| if (e) { |
| e.stopPropagation(); |
| } |
| if (this.baskets.find(f => f.name === this.basketName) != undefined) { |
| this.childSaveModal.hide(); |
| this.overwriteDialogComponent.showOverwriteModal( |
| this.translateService.instant('basket.mdm-basket.item-save-shopping-basket')).subscribe( |
| needSave => this.saveBasket2(needSave), |
| error => { |
| this.saveBasket2(false); |
| this.notificationService.notifyError(this.translateService.instant('basket.mdm-basket.err-save-shopping-basket'), error); |
| }); |
| } else { |
| this.saveBasket2(true); |
| } |
| } |
| |
| saveBasket2(save: boolean) { |
| if (save) { |
| this._basketService.saveBasketWithName(this.basketName); |
| this.childSaveModal.hide(); |
| } else { |
| this.childSaveModal.show(); |
| } |
| } |
| |
| loadBasket(basket?: Basket) { |
| if (basket == undefined) { |
| basket = this.selectedBasket; |
| if (this.selectedBasket == undefined) { |
| return; |
| } |
| } |
| this.basketName = basket.name; |
| this.setItems(basket.items); |
| this._basketService.setItems(basket.items); |
| this.childLoadModal.hide(); |
| } |
| |
| loadBaskets() { |
| this._basketService.getBaskets().subscribe( |
| baskets => this.baskets = baskets, |
| error => this.notificationService.notifyError( |
| this.translateService.instant('basket.mdm-basket.err-cannot-load-shopping-basket'), error)); |
| } |
| |
| clearBasket(e: Event) { |
| e.stopPropagation(); |
| this.basketContent = new SearchResult(); |
| this._basketService.removeAll(); |
| this.basketName = ''; |
| } |
| |
| showLoadModal(e: Event) { |
| e.stopPropagation(); |
| this.selectedBasket = undefined; |
| this.loadBaskets(); |
| this.childLoadModal.show(); |
| } |
| |
| showSaveModal(e: Event) { |
| e.stopPropagation(); |
| this.loadBaskets(); |
| this.basketName = this.selectedBasket ? this.selectedBasket.name : ''; |
| this.childSaveModal.show(); |
| } |
| |
| stopEvent(event: Event) { |
| event.stopPropagation() |
| } |
| |
| saveBasketWithExtension(event: any, extension: string) { |
| if (event) { |
| event.stopPropagation(); |
| } |
| let downloadContent = new Basket(this.basketName, this._basketService.getItems()); |
| |
| this._basketService.getBasketAsXml(downloadContent) |
| .map(xml => new Blob([xml], { type: 'application/xml' })) |
| .subscribe(blob => this.saveAsFile(blob, extension, 'shoppingbasket')); |
| } |
| |
| saveBasketAsATFX(event: any) { |
| if (event) { |
| event.stopPropagation(); |
| } |
| let downloadContent = new Basket(this.basketName, this._basketService.getItems()); |
| |
| this._basketService.getBasketAsAtfx(downloadContent) |
| .map(atfx => new Blob([atfx], { type: 'application/xml' })) |
| .subscribe(atfx => this.saveAsFile(atfx, '.atfx')); |
| } |
| |
| saveAsFile(blob: Blob, fileExtension: string, defaultFilename = 'export') { |
| let name = 'export.' + fileExtension; |
| if (this.basketName && this.basketName.trim().length !== 0) { |
| name = this.basketName + '.' + fileExtension; |
| } |
| FileSaver.saveAs(blob, name); |
| } |
| |
| onUploadChange(event: Event) { |
| this._currentChange = event.target; |
| this.onUploadEvent(this._currentChange); |
| } |
| |
| onUploadClick(e: Event) { |
| e.stopPropagation(); |
| } |
| |
| toggleSelect(basket: Basket) { |
| this.selectedBasket = this.selectedBasket === basket ? undefined : basket; |
| } |
| |
| isDownloadDisabled() { |
| return this.basketContent.rows.length <= 0; |
| } |
| |
| getSaveBtnTitle() { |
| return this.basketName |
| ? TRANSLATE('basket.mdm-basket.tooltip-save-shopping-basket') |
| : TRANSLATE('basket.mdm-basket.tooltip-no-name-set'); |
| } |
| |
| private onUploadEvent(fileInput: any) { |
| if (fileInput.files[0]) { |
| let file = fileInput.files[0]; |
| let reader = new FileReader(); |
| reader.onloadend = (event) => { |
| let upload: Basket = deserialize(Basket, <string> reader.result); |
| this.loadBasket(upload); |
| fileInput.value = ''; |
| }; |
| reader.readAsText(file); |
| } |
| } |
| |
| private addData(rows: Row[]) { |
| this.basketContent.rows.push(...rows); |
| // copy and reasign to get new object refference triggering angular change detection in tableview. |
| this.basketContent = Object.assign({}, this.basketContent); |
| } |
| |
| onRowSelect(e: any) { |
| if (this.lazySelectedRow !== e.data) { |
| this.selectedRow = e.data; |
| this.basketName = e.data.name; |
| } else { |
| this.selectedRow = undefined; |
| this.basketName = ''; |
| } |
| this.lazySelectedRow = this.selectedRow; |
| } |
| } |