blob: 0507cd8313cd25619b3d27d4d354074bc145e93e [file] [log] [blame]
/*
* Licensed 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 { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { Subject } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
import { collapseMotion } from 'ng-zorro-antd/core';
import { NzMessageService } from 'ng-zorro-antd/message';
import { NzModalService } from 'ng-zorro-antd/modal';
import { Interpreter, InterpreterPropertyTypes, InterpreterRepository } from '@zeppelin/interfaces';
import { InterpreterService } from '@zeppelin/services';
import { InterpreterCreateRepositoryModalComponent } from './create-repository-modal/create-repository-modal.component';
@Component({
selector: 'zeppelin-interpreter',
templateUrl: './interpreter.component.html',
styleUrls: ['./interpreter.component.less'],
animations: [collapseMotion],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class InterpreterComponent implements OnInit, OnDestroy {
searchInterpreter = '';
search$ = new Subject<string>();
showRepository = false;
showCreateSetting = false;
propertyTypes: InterpreterPropertyTypes[] = [];
interpreterSettings: Interpreter[] = [];
repositories: InterpreterRepository[] = [];
availableInterpreters: Interpreter[] = [];
filteredInterpreterSettings: Interpreter[] = [];
onSearchChange(value: string) {
this.search$.next(value);
}
filterInterpreters(value: string) {
this.filteredInterpreterSettings = this.interpreterSettings.filter(e => e.name.search(value) !== -1);
this.cdr.markForCheck();
}
triggerRepository(): void {
this.showRepository = !this.showRepository;
this.cdr.markForCheck();
}
removeRepository(repo: InterpreterRepository): void {
this.nzModalService.confirm({
nzTitle: repo.id,
nzContent: 'Do you want to delete this repository?',
nzOnOk: () => {
this.interpreterService.removeRepository(repo.id).subscribe(() => {
this.repositories = this.repositories.filter(e => e.id !== repo.id);
this.cdr.markForCheck();
});
}
});
}
addInterpreterSetting(data: Interpreter): void {
this.interpreterService.addInterpreterSetting(data).subscribe(res => {
this.interpreterSettings.push(res);
this.showCreateSetting = false;
this.filterInterpreters(this.searchInterpreter);
this.cdr.markForCheck();
});
}
updateInterpreter(data: Interpreter): void {
this.interpreterService.updateInterpreter(data).subscribe(res => {
const current = this.interpreterSettings.find(e => e.name === res.name);
if (current) {
current.status = res.status;
current.errorReason = res.errorReason;
current.option = res.option;
current.properties = res.properties;
current.dependencies = res.dependencies;
}
this.filterInterpreters(this.searchInterpreter);
this.cdr.markForCheck();
});
}
removeInterpreterSetting(settingId: string): void {
this.nzModalService.confirm({
nzTitle: 'Remove Interpreter',
nzContent: 'Do you want to delete this interpreter setting?',
nzOnOk: () => {
this.interpreterService.removeInterpreterSetting(settingId).subscribe(() => {
const index = this.interpreterSettings.findIndex(e => e.name === settingId);
this.interpreterSettings.splice(index, 1);
this.filterInterpreters(this.searchInterpreter);
this.cdr.markForCheck();
});
}
});
}
restartInterpreterSetting(settingId: string): void {
this.nzModalService.confirm({
nzTitle: 'Restart Interpreter',
nzContent: 'Do you want to restart this interpreter?',
nzOnOk: () => {
this.interpreterService.restartInterpreterSetting(settingId).subscribe(() => {
this.nzMessageService.info('Interpreter stopped. Will be lazily started on next run.');
});
}
});
}
createRepository(): void {
const modalRef = this.nzModalService.create({
nzTitle: 'Add New Repository',
nzContent: InterpreterCreateRepositoryModalComponent,
nzFooter: null,
nzWidth: '600px'
});
modalRef.afterClose.subscribe(data => {
if (data === 'Done') {
this.getRepositories();
}
});
}
getPropertyTypes(): void {
this.interpreterService.getAvailableInterpreterPropertyTypes().subscribe(data => {
this.propertyTypes = data;
this.cdr.markForCheck();
});
}
getInterpreterSettings(): void {
this.interpreterService.getInterpretersSetting().subscribe(data => {
this.interpreterSettings = data;
this.filteredInterpreterSettings = data;
this.cdr.markForCheck();
});
}
getAvailableInterpreters(): void {
this.interpreterService.getAvailableInterpreters().subscribe(data => {
this.availableInterpreters = Object.keys(data)
.sort()
.map(key => data[key]);
this.cdr.markForCheck();
});
}
getRepositories(): void {
this.interpreterService.getRepositories().subscribe(data => {
this.repositories = data;
this.cdr.markForCheck();
});
}
constructor(
private interpreterService: InterpreterService,
private cdr: ChangeDetectorRef,
private nzModalService: NzModalService,
private nzMessageService: NzMessageService
) {}
ngOnInit() {
this.getPropertyTypes();
this.getInterpreterSettings();
this.getAvailableInterpreters();
this.getRepositories();
this.search$.pipe(debounceTime(150)).subscribe(value => this.filterInterpreters(value));
}
ngOnDestroy(): void {
this.search$.next();
this.search$.complete();
this.search$ = null;
}
}