aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/app/_elements/folder/folder.component.ts
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/app/_elements/folder/folder.component.ts')
-rw-r--r--frontend/src/app/_elements/folder/folder.component.ts192
1 files changed, 171 insertions, 21 deletions
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts
index 665659a8..93e8ba98 100644
--- a/frontend/src/app/_elements/folder/folder.component.ts
+++ b/frontend/src/app/_elements/folder/folder.component.ts
@@ -1,7 +1,7 @@
import { AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
import Dataset from 'src/app/_data/Dataset';
import { FolderFile, FolderType } from 'src/app/_data/FolderFile';
-import Model from 'src/app/_data/Model';
+import Model, { ProblemType } from 'src/app/_data/Model';
import { DatasetsService } from 'src/app/_services/datasets.service';
import Shared from 'src/app/Shared';
import { ModelsService } from 'src/app/_services/models.service';
@@ -11,8 +11,10 @@ import { ExperimentsService } from 'src/app/_services/experiments.service';
import { PredictorsService } from 'src/app/_services/predictors.service';
import { SignalRService } from 'src/app/_services/signal-r.service';
import { FormModelComponent } from '../form-model/form-model.component';
-import { Router } from '@angular/router';
+import { ActivatedRoute, Router } from '@angular/router';
import Predictor from 'src/app/_data/Predictor';
+import FileSaver from 'file-saver';
+import isEqual from 'lodash.isequal';
@Component({
selector: 'app-folder',
@@ -42,11 +44,12 @@ export class FolderComponent implements AfterViewInit {
fileToDisplay?: FolderFile;
@Output() selectedFileChanged: EventEmitter<FolderFile> = new EventEmitter();
+ @Output() fileFromRoute: EventEmitter<FolderFile> = new EventEmitter();
@Output() okPressed: EventEmitter<string> = new EventEmitter();
searchTerm: string = '';
- constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService, private signalRService: SignalRService, private router: Router) {
+ constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService, private signalRService: SignalRService, private router: Router, private route: ActivatedRoute) {
this.tabsToShow.forEach(tab => this.folders[tab] = []);
}
@@ -65,8 +68,10 @@ export class FolderComponent implements AfterViewInit {
}
displayFile() {
- if (this.type == FolderType.Dataset)
+ if (this.type == FolderType.Dataset) {
this.formDataset.dataset = <Dataset>this.fileToDisplay;
+ this.formDataset.existingFlag = false;
+ }
else if (this.type == FolderType.Model)
this.formModel.newModel = <Model>this.fileToDisplay;
}
@@ -93,15 +98,18 @@ export class FolderComponent implements AfterViewInit {
this.newFileSelected = true;
this.listView = false;
this.displayFile();
- if (this.type == FolderType.Dataset)
+ if (this.type == FolderType.Dataset) {
this.formDataset.clear();
+ }
}
selectFile(file?: FolderFile) {
+ this.formDataset.resetPagging();
this.selectedFile = file;
+ Object.assign(this.lastFileData, this.selectedFile);
this.fileToDisplay = file;
if (this.type == FolderType.Experiment && file) {
- this.router.navigate(['/experiment'/*, file._id*/])
+ this.router.navigate(['/experiment/' + file._id]);
}
this.newFileSelected = false;
this.listView = false;
@@ -113,6 +121,10 @@ export class FolderComponent implements AfterViewInit {
this.formDataset.loadExisting();
}
+ goToExperimentPageWithPredictor(file: FolderFile, predictor: Predictor) {
+ this.router.navigate(['/experiment/p/' + predictor._id]);
+ }
+
createNewFile() {
if (this.type == FolderType.Dataset) {
this.newFile = new Dataset();
@@ -128,10 +140,7 @@ export class FolderComponent implements AfterViewInit {
_initialized: boolean = false;
refreshFiles(selectedDatasetId: string | null = null, selectedModelId: string | null = null) {
- this.files = []
- this.filteredFiles.length = 0;
- this.folders[TabType.NewFile] = [];
- this.folders[TabType.File] = [];
+
this.tabsToShow.forEach(tab => {
this.folders[tab] = [];
});
@@ -173,6 +182,9 @@ export class FolderComponent implements AfterViewInit {
this.folders[TabType.MyModels] = models;
if (selectedModelId) {
this.selectFile(models.filter(x => x._id == selectedModelId)[0]);
+ setTimeout(() => {
+ this.okPressed.emit();
+ });
}
this.searchTermsChanged();
});
@@ -180,12 +192,18 @@ export class FolderComponent implements AfterViewInit {
this.folders[TabType.PublicModels] = models;
this.searchTermsChanged();
});*/
- this.folders[TabType.PublicModels] = [];
+
+ this.modelsService.getPublicModels().subscribe((models) => {
+ this.folders[TabType.PublicModels] = models;
+ this.searchTermsChanged();
+ });
+ //this.folders[TabType.PublicModels] = [];
}
refreshDatasets(selectedDatasetId: string | null) {
this.datasetsService.getMyDatasets().subscribe((datasets) => {
this.folders[TabType.MyDatasets] = datasets;
+ console.log(this.filteredFiles);
if (selectedDatasetId) {
this.selectFile(datasets.filter(x => x._id == selectedDatasetId)[0]);
}
@@ -208,7 +226,7 @@ export class FolderComponent implements AfterViewInit {
this.predictorsForExp[exp._id].forEach(pred => {
const model = this.folders[TabType.MyModels].find(model => model._id == pred.modelId);
pred.name = model?.name!;
- pred.lastUpdated = model?.lastUpdated!;
+ //pred.lastUpdated = model?.lastUpdated!;
})
/* ------------------------------------------------ */
this.searchTermsChanged();
@@ -218,11 +236,14 @@ export class FolderComponent implements AfterViewInit {
}
saveNewFile() {
+ this.loadingAction = true;
switch (this.type) {
case FolderType.Dataset:
this.formDataset!.uploadDataset((dataset: Dataset) => {
this.newFile = undefined;
- Shared.openDialog("Obaveštenje", "Uspešno ste dodali novi izvor podataka u kolekciju. Molimo sačekajte par trenutaka da se procesira.");
+ this.loadingAction = false;
+ this.okPressed.emit();
+ //Shared.openDialog("Obaveštenje", "Uspešno ste dodali novi izvor podataka u kolekciju. Molimo sačekajte par trenutaka da se obradi.");
this.refreshFiles();
},
() => {
@@ -230,9 +251,11 @@ export class FolderComponent implements AfterViewInit {
});
break;
case FolderType.Model:
+ this.formModel.newModel.type = this.formModel.forProblemType;
this.modelsService.addModel(this.formModel.newModel).subscribe(model => {
this.newFile = undefined;
- Shared.openDialog("Obaveštenje", "Uspešno ste dodali novu konfiguraciju neuronske mreže u kolekciju.");
+ this.loadingAction = false;
+ //Shared.openDialog("Obaveštenje", "Uspešno ste dodali novu konfiguraciju neuronske mreže u kolekciju.");
this.refreshFiles(null, model._id); // todo select model
}, (err) => {
Shared.openDialog("Neuspeo pokušaj!", "Konfiguracija neuronske mreže sa unetim nazivom već postoji u Vašoj kolekciji. Izmenite naziv ili iskoristite postojeću konfiguraciju.");
@@ -253,7 +276,12 @@ export class FolderComponent implements AfterViewInit {
searchTermsChanged() {
this.filteredFiles.length = 0;
if (!this.files) return;
- this.filteredFiles.push(...this.files.filter((file) => file.name.toLowerCase().includes(this.searchTerm.toLowerCase())));
+ this.filteredFiles.push(...this.files.filter((file) => {
+ return (file.name.toLowerCase().includes(this.searchTerm.toLowerCase())
+ && (!this.forExperiment
+ || this.type != FolderType.Model
+ || (this.type == FolderType.Model && (<Model>file).type == this.forExperiment.type)))
+ }));
/*if (this.selectedFile) {
if (!this.filteredFiles.includes(this.selectedFile)) {
if (this.hoverTab === TabType.None && this.getFolderType(this.selectedTab) === this.type) {
@@ -268,23 +296,136 @@ export class FolderComponent implements AfterViewInit {
listView: boolean = true;
- deleteFile(file: FolderFile, event: Event) {
+ loadingAction = false;
+ selectedFileHasChanges = false;
+ lastFileData = {};
+
+ onFileChange() {
+ console.log(this.selectedFile, this.lastFileData)
+ setTimeout(() => {
+ this.selectedFileHasChanges = !((this.selectedTab == TabType.NewFile) || isEqual(this.selectedFile, this.lastFileData));
+ });
+ }
+
+ updateFile() {
+ const file = this.selectedFile;
+ this.loadingAction = true;
+ switch (this.type) {
+ case FolderType.Dataset:
+ this.datasetsService.editDataset(<Dataset>file).subscribe((response) => {
+ this.fileUpdatedSuccess();
+ });
+ break;
+ case FolderType.Model:
+ this.modelsService.editModel(<Model>file).subscribe((response) => {
+ this.fileUpdatedSuccess();
+ });
+ break;
+ }
+ }
+
+ fileUpdatedSuccess() {
+ this.loadingAction = false;
+ this.selectedFileHasChanges = false;
+ Object.assign(this.lastFileData, this.selectedFile);
+ this.refreshFiles();
+ }
+
+ deleteFile(file: FolderFile, event: Event, deletePredictor: boolean = false) {
event.stopPropagation();
- //console.log('delete');
+
switch (this.type) {
case FolderType.Dataset:
- this.datasetsService.deleteDataset(<Dataset>file).subscribe((response) => {
+ const dataset = <Dataset>file;
+ Shared.openYesNoDialog("Obriši izvor podataka", "Eksperimenti i trenirani modeli nad ovim izvorom podataka će takođe biti obrisani, da li ste sigurni da želite da obrišete izvor: " + dataset.name + "?", () => {
+ this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1);
+ this.files.splice(this.files.indexOf(file), 1);
+ this.loadingAction = true;
+ this.datasetsService.deleteDataset(dataset).subscribe((response) => {
+ this.loadingAction = false;
+ });
+ })
+ break;
+ case FolderType.Model:
+ const model = <Model>file;
+ Shared.openYesNoDialog("Obriši konfiguraciju neuronske mreže", "Trenirani modeli za ovu konfiguraciju će takođe biti obrisani, da li ste sigurni da želite da obrišete konfiguraciju: " + model.name + "?", () => {
this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1);
+ this.files.splice(this.files.indexOf(file), 1);
+ this.loadingAction = true;
+ this.modelsService.deleteModel(<Model>file).subscribe((response) => {
+ this.loadingAction = false;
+ });
+ })
+
+ break;
+ case FolderType.Experiment:
+ if (deletePredictor) {
+ const predictor = <Predictor>file;
+ Shared.openYesNoDialog("Obriši trenirani model", "Da li ste sigurni da želite da obrišete trenirani model: " + predictor.name + "?", () => {
+ this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1);
+ this.files.splice(this.files.indexOf(file), 1);
+ this.loadingAction = true;
+ this.predictorsService.deletePredictor(predictor).subscribe((response) => {
+ this.loadingAction = false;
+ });
+ });
+ } else {
+ const experiment = <Experiment>file;
+ Shared.openYesNoDialog("Obriši eksperiment", "Trenirani modeli za ovaj eksperiment će takođe biti obrisani, da li ste sigurni da želite da obrišete eksperiment: " + experiment.name + "?", () => {
+ this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1);
+ this.files.splice(this.files.indexOf(file), 1);
+ this.loadingAction = true;
+ this.experimentsService.deleteExperiment(experiment).subscribe((response) => {
+ this.loadingAction = false;
+ });
+ });
+ }
+ break;
+ }
+ }
+ downloadFile(file: FolderFile, event: Event) {
+ event.stopPropagation();
+ if (this.type == FolderType.Dataset) {
+ const fileId = (<Dataset>file).fileId;
+ const name = (<Dataset>file).name;
+ const ext = (<Dataset>file).extension;
+ if (fileId != undefined)
+ this.datasetsService.downloadFile(fileId).subscribe((response) => {
+ FileSaver.saveAs(response, name + ext);
+
+ });
+
+ }
+ }
+
+ addFile(file: FolderFile, event: Event) {
+ event.stopPropagation();
+ switch (this.type) {
+ case FolderType.Dataset:
+ (<Dataset>file)._id = "";
+ (<Dataset>file).isPreProcess = true;
+ (<Dataset>file).isPublic = false;
+ this.datasetsService.stealDataset(<Dataset>file).subscribe((response) => {
+ Shared.openDialog("Obaveštenje", "Uspešno ste dodali javni izvor podataka u vašu kolekciju.");
this.refreshFiles(null);
+ }, (error: any) => {
+ if (error.error == "Dataset with this name already exists") {
+ Shared.openDialog("Obaveštenje", "Izvor podataka sa ovim imenom postoji u vašoj kolekciji.");
+ }
});
break;
case FolderType.Model:
- this.modelsService.deleteModel(<Model>file).subscribe((response) => {
+ this.modelsService.stealModel(<Model>file).subscribe((response) => {
+ Shared.openDialog("Obaveštenje", "Uspešno ste dodali javnu konfiguraciju neuronske mreže u vašu kolekciju.");
this.refreshFiles(null);
+ }, (error: any) => {
+ if (error.error == "Model already exisits or validation size is not between 0-1") {
+ Shared.openDialog("Obaveštenje", "Model sa ovim imenom postoji u vašoj kolekciji.");
+ }
});
break;
case FolderType.Experiment:
- // this.experimentsService.deleteExperiment(<Model>file).subscribe((response) => {
+ // this.experimentsService.addExperiment(<Model>file).subscribe((response) => {
// console.log(response);
// });
//todo delete za predictor
@@ -305,6 +446,7 @@ export class FolderComponent implements AfterViewInit {
};
FolderType = FolderType;
+ ProblemType = ProblemType;
Privacy = Privacy;
TabType = TabType;
@@ -325,6 +467,7 @@ export class FolderComponent implements AfterViewInit {
setTimeout(() => {
if (tab == TabType.NewFile) {
this.selectNewFile();
+ this.selectedFile=undefined!;
}
this.listView = this.getListView(tab);
@@ -395,9 +538,16 @@ export class FolderComponent implements AfterViewInit {
updateExperiment() {
if (this.formModel) {
- this.formModel.updateGraph();
+ setTimeout(() => {
+ this.formModel.updateGraph();
+ });
}
}
+
+ newTabTitles: { [tab: number]: string } = {
+ [FolderType.Dataset]: 'Novi izvor podataka',
+ [FolderType.Model]: 'Nova konfiguracija neuronske mreže',
+ };
}
export enum Privacy {