blob: a874ae7a92811866bd2473944f2f4a996eb2a30d [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, Input, OnInit } from '@angular/core';
import { MessageService, NoteListService } from '@zeppelin/services';
import { NzModalRef } from 'ng-zorro-antd/modal';
import { MessageListener, MessageListenersManager } from '@zeppelin/core';
import { InterpreterItem, MessageReceiveDataTypeMap, Note, OP } from '@zeppelin/sdk';
@Component({
selector: 'zeppelin-note-create',
templateUrl: './note-create.component.html',
styleUrls: ['./note-create.component.less'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class NoteCreateComponent extends MessageListenersManager implements OnInit {
@Input() path?: string;
@Input() cloneNote?: Exclude<Note['note'], undefined>;
noteName = '';
defaultInterpreter?: string;
listOfInterpreter: InterpreterItem[] = [];
@MessageListener(OP.INTERPRETER_SETTINGS)
getInterpreterSettings(data: MessageReceiveDataTypeMap[OP.INTERPRETER_SETTINGS]) {
this.listOfInterpreter = data.interpreterSettings;
this.defaultInterpreter = data.interpreterSettings[0].name;
this.cdr.markForCheck();
}
@MessageListener(OP.NEW_NOTE)
newNoteCreated(_: MessageReceiveDataTypeMap[OP.NEW_NOTE]) {
this.nzModalRef.destroy();
}
newNoteName(path: string) {
let newCount = 1;
this.noteListService.notes.flatList.forEach(note => {
const noteName = note.path;
if (noteName.match(/^\/Untitled Note [0-9]*$/)) {
const lastCount = +noteName.substr(15);
if (newCount <= lastCount) {
newCount = lastCount + 1;
}
}
});
return `${path ? `${path}/` : ''}Untitled Note ${newCount}`;
}
cloneNoteName(cloneNote: Exclude<Note['note'], undefined>) {
let copyCount = 1;
let newCloneName = '';
const lastIndex = cloneNote.name.lastIndexOf(' ');
const endsWithNumber = !!cloneNote.name.match('^.+?\\s\\d$');
const noteNamePrefix = endsWithNumber ? cloneNote.name.substr(0, lastIndex) : cloneNote.name;
const regexp = new RegExp(`^${noteNamePrefix}.+`);
this.noteListService.notes.flatList.forEach(note => {
const noteName = note.path;
if (noteName.match(regexp)) {
const lastCopyCount = parseInt(noteName.substr(lastIndex).trim(), 10);
newCloneName = noteNamePrefix;
if (copyCount <= lastCopyCount) {
copyCount = lastCopyCount + 1;
}
}
});
if (!newCloneName) {
newCloneName = cloneNote.name;
}
return `${newCloneName} ${copyCount}`;
}
createNote() {
if (this.cloneNote) {
this.messageService.cloneNote(this.cloneNote.id, this.noteName);
} else {
this.messageService.newNote(this.noteName, this.defaultInterpreter);
}
}
constructor(
public messageService: MessageService,
private cdr: ChangeDetectorRef,
private noteListService: NoteListService,
private nzModalRef: NzModalRef
) {
super(messageService);
}
ngOnInit() {
this.messageService.getInterpreterSettings();
// Component should have either defined 'cloneNote' or defined 'path' property.
this.noteName = this.cloneNote ? this.cloneNoteName(this.cloneNote) : this.newNoteName(this.path!);
}
}