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.ts221
1 files changed, 167 insertions, 54 deletions
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts
index c9252caa..9dfabdb3 100644
--- a/frontend/src/app/_elements/folder/folder.component.ts
+++ b/frontend/src/app/_elements/folder/folder.component.ts
@@ -15,6 +15,8 @@ import { ActivatedRoute, Router } from '@angular/router';
import Predictor from 'src/app/_data/Predictor';
import FileSaver from 'file-saver';
import isEqual from 'lodash.isequal';
+import { ShareDialogComponent } from 'src/app/_modals/share-dialog/share-dialog.component';
+import { MatDialog } from '@angular/material/dialog';
@Component({
selector: 'app-folder',
@@ -23,8 +25,10 @@ import isEqual from 'lodash.isequal';
})
export class FolderComponent implements AfterViewInit {
- @ViewChild(FormDatasetComponent) formDataset!: FormDatasetComponent;
- @ViewChild(FormModelComponent) formModel!: FormModelComponent;
+ @ViewChild('selectedDataset') formDataset!: FormDatasetComponent;
+ @ViewChild('selectedModel') formModel!: FormModelComponent;
+ @ViewChild('newDataset') formNewDataset!: FormDatasetComponent;
+ @ViewChild('newModel') formNewModel!: FormModelComponent;
@Input() folderName: string = 'Moji podaci';
@Input() files!: FolderFile[]
@@ -40,8 +44,7 @@ export class FolderComponent implements AfterViewInit {
selectedFileIndex: number = -1;
selectedFile?: FolderFile;
hoveringOverFileIndex: number = -1;
-
- fileToDisplay?: FolderFile;
+ saveDisabled: boolean = false;
@Output() selectedFileChanged: EventEmitter<FolderFile> = new EventEmitter();
@Output() fileFromRoute: EventEmitter<FolderFile> = new EventEmitter();
@@ -49,7 +52,7 @@ export class FolderComponent implements AfterViewInit {
searchTerm: string = '';
- constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService, private signalRService: SignalRService, private router: Router, private route: ActivatedRoute) {
+ constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService, private signalRService: SignalRService, private router: Router, private route: ActivatedRoute, public dialog: MatDialog) {
this.tabsToShow.forEach(tab => this.folders[tab] = []);
}
@@ -60,7 +63,10 @@ export class FolderComponent implements AfterViewInit {
this.signalRService.hubConnection.on("NotifyDataset", (dName: string, dId: string) => {
if (this.type == FolderType.Dataset) {
this.refreshFiles(dId);
+ this.okPressed.emit();
}
+ this.saveDisabled = false;
+ console.log("Notify dataset ", this.saveDisabled);
});
} else {
console.warn("Dataset-Load: No connection!");
@@ -68,59 +74,82 @@ export class FolderComponent implements AfterViewInit {
}
displayFile() {
- 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;
- }
-
- hoverOverFile(i: number) {
- /*this.hoveringOverFileIndex = i;
- if (i != -1) {
- this.fileToDisplay = this.files[i];
+ if (this.newFileSelected) {
+ if (this.type == FolderType.Dataset) {
+ this.formNewDataset.dataset = <Dataset>this.newFile;
+ this.formNewDataset.existingFlag = false;
+ }
+ else if (this.type == FolderType.Model)
+ this.formNewModel.newModel = <Model>this.newFile;
} else {
- if (this.newFileSelected) {
- this.fileToDisplay = this.newFile;
- } else {
- this.fileToDisplay = this.files[this.selectedFileIndex];
+ if (this.type == FolderType.Dataset) {
+ this.formDataset.dataset = <Dataset>this.selectedFile;
+ this.formDataset.existingFlag = false;
}
+ else if (this.type == FolderType.Model)
+ this.formModel.newModel = <Model>this.selectedFile;
}
- this.displayFile();*/
}
selectNewFile() {
if (!this.newFile) {
this.createNewFile();
}
- this.fileToDisplay = this.newFile;
this.newFileSelected = true;
this.listView = false;
this.displayFile();
+
+ this.selectedTab = TabType.NewFile;
+
if (this.type == FolderType.Dataset) {
- this.formDataset.clear();
+ this.formNewDataset.clear();
}
}
selectFile(file?: FolderFile) {
+ if (this.privacy == Privacy.Public) {
+ if (file) {
+ if (this.type == FolderType.Dataset) {
+ this.router.navigate(['dataset', file?._id]);
+ } else if (this.type == FolderType.Model) {
+ this.router.navigate(['model', file?._id]);
+ }
+ }
+
+ }
+
+
this.formDataset.resetPagging();
this.selectedFile = file;
- Object.assign(this.lastFileData, this.selectedFile);
- this.fileToDisplay = file;
+ this.updateLastFileData(file);
if (this.type == FolderType.Experiment && file) {
this.router.navigate(['/experiment/' + file._id]);
}
this.newFileSelected = false;
this.listView = false;
this.selectedFileChanged.emit(this.selectedFile);
- this.selectTab(TabType.File);
this.displayFile();
+ this.selectedTab = TabType.File;
+
if (this.type == FolderType.Dataset)
this.formDataset.loadExisting();
}
+ updateLastFileData(file: FolderFile | undefined) {
+ if (!file) return;
+
+ Object.assign(this.lastFileData, file);
+ if (this.type == FolderType.Model) {
+ const lastModel = (<Model>this.lastFileData)
+ lastModel.layers = [];
+ (<Model>file).layers.forEach(layer => {
+ const clone = Object.assign({}, layer);
+ lastModel.layers.push(clone);
+ })
+ }
+ }
+
goToExperimentPageWithPredictor(file: FolderFile, predictor: Predictor) {
this.router.navigate(['/experiment/p/' + predictor._id]);
}
@@ -128,6 +157,9 @@ export class FolderComponent implements AfterViewInit {
createNewFile() {
if (this.type == FolderType.Dataset) {
this.newFile = new Dataset();
+ this.formNewDataset.files = [];
+ this.formNewDataset.firstInput = false;
+ this.formNewDataset.filename = "";
} else if (this.type == FolderType.Model) {
this.newFile = new Model();
}
@@ -137,6 +169,22 @@ export class FolderComponent implements AfterViewInit {
this.okPressed.emit();
}
+ fileToShare: FolderFile | undefined = undefined;
+
+ shareFile(file: FolderFile, event: Event) {
+ event.stopPropagation();
+
+ this.fileToShare = file;
+
+ const dialogRef = this.dialog.open(ShareDialogComponent, {
+ width: '550px',
+ data: { file: this.fileToShare, fileType: this.type }
+ });
+ dialogRef.afterClosed().subscribe(experiment => {
+ this.refreshFiles();
+ });
+ }
+
_initialized: boolean = false;
refreshFiles(selectedDatasetId: string | null = null, selectedModelId: string | null = null) {
@@ -172,7 +220,9 @@ export class FolderComponent implements AfterViewInit {
if (!this._initialized) {
this.files = this.folders[this.startingTab];
this.filteredFiles = [];
- this.selectTab(this.startingTab);
+ setTimeout(() => {
+ this.selectTab(this.startingTab);
+ });
this._initialized = true;
}
}
@@ -229,35 +279,47 @@ export class FolderComponent implements AfterViewInit {
})
/* ------------------------------------------------ */
this.searchTermsChanged();
+ if (this.selectedTab == TabType.MyExperiments)
+ this.selectTab(TabType.MyExperiments);
})
});
});
}
saveNewFile() {
+ console.log("USAO U saveDisabled: ", this.saveDisabled);
+ if (this.saveDisabled) {
+ console.log("USAO U IF");
+ return;
+ }
+ this.saveDisabled = true;
this.loadingAction = true;
switch (this.type) {
case FolderType.Dataset:
- this.formDataset!.uploadDataset((dataset: Dataset) => {
+ this.formNewDataset!.uploadDataset((dataset: Dataset) => {
this.newFile = undefined;
this.loadingAction = false;
- this.okPressed.emit();
+ //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();
+ this.createNewFile();
},
() => {
Shared.openDialog("Neuspeo pokušaj!", "Izvor podataka sa unetim nazivom već postoji u Vašoj kolekciji. Izmenite naziv ili iskoristite postojeći dataset.");
+ this.saveDisabled = false;
});
break;
case FolderType.Model:
- this.formModel.newModel.type = this.formModel.forProblemType;
- this.modelsService.addModel(this.formModel.newModel).subscribe(model => {
+ this.formNewModel.newModel.type = this.formModel.forProblemType;
+ this.modelsService.addModel(this.formNewModel.newModel).subscribe(model => {
this.newFile = undefined;
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
+ this.createNewFile();
}, (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.");
+ this.saveDisabled = false;
});
break;
}
@@ -300,10 +362,29 @@ export class FolderComponent implements AfterViewInit {
onFileChange() {
setTimeout(() => {
- this.selectedFileHasChanges = !((this.selectedTab == TabType.NewFile) || isEqual(this.selectedFile, this.lastFileData));
+ this.selectedFileHasChanges = !((this.selectedTab == TabType.NewFile) || this.checkFileDataEqualToLastFileData());
});
}
+ checkFileDataEqualToLastFileData() {
+ if (this.type == FolderType.Model) {
+ let layersEqual = true;
+ const oldModel = (<Model>this.lastFileData);
+ const selectedModel = (<Model>this.selectedFile)
+ const oldLayers = oldModel.layers;
+ oldModel.layers = selectedModel.layers;
+ const objEqual = isEqual(this.selectedFile, oldModel);
+ oldLayers.forEach((layer, index) => {
+ if (!isEqual(layer, selectedModel.layers[index])) {
+ layersEqual = false;
+ }
+ });
+ return objEqual && layersEqual;
+ } else {
+ return isEqual(this.selectedFile, this.lastFileData);
+ }
+ }
+
updateFile() {
const file = this.selectedFile;
this.loadingAction = true;
@@ -324,7 +405,7 @@ export class FolderComponent implements AfterViewInit {
fileUpdatedSuccess() {
this.loadingAction = false;
this.selectedFileHasChanges = false;
- Object.assign(this.lastFileData, this.selectedFile);
+ this.updateLastFileData(this.selectedFile);
this.refreshFiles();
this.selectedFileChanged.emit(this.selectedFile);
}
@@ -336,22 +417,47 @@ export class FolderComponent implements AfterViewInit {
case FolderType.Dataset:
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);
+ if (this.selectedTab == TabType.MyDatasets) {
+ 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;
+ if (this.selectedTab == TabType.File) {
+ this.refreshDatasets(null);
+ this.selectedFile = undefined!;
+ setTimeout(() => {
+ this.selectTab(TabType.MyDatasets);
+ });
+ }
+ if (this.archive) {
+ this.refreshExperiments();
+ }
+
});
})
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);
+ if (this.selectedTab == TabType.MyModels) {
+ 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;
+ if (this.selectedTab == TabType.File) {
+ this.refreshModels(null);
+ this.selectedFile = undefined!;
+ setTimeout(() => {
+ this.selectTab(TabType.MyModels);
+ });
+ }
+ if (this.archive) {
+ this.refreshExperiments();
+ }
});
})
@@ -370,11 +476,20 @@ export class FolderComponent implements AfterViewInit {
} 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);
+ if (this.selectedTab == TabType.MyExperiments) {
+ 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;
+ if (this.selectedTab == TabType.File) {
+ this.refreshExperiments();
+ this.selectedFile = undefined!;
+ setTimeout(() => {
+ this.selectTab(TabType.MyExperiments);
+ });
+ }
});
});
}
@@ -461,21 +576,19 @@ export class FolderComponent implements AfterViewInit {
hoverTab: TabType = TabType.None;
selectTab(tab: TabType) {
- setTimeout(() => {
- if (tab == TabType.NewFile) {
- this.selectNewFile();
- this.selectedFile=undefined!;
- }
-
- this.listView = this.getListView(tab);
- this.type = this.getFolderType(tab);
- this.privacy = this.getPrivacy(tab);
- this.selectedTab = tab;
- this.files = this.folders[tab];
+ if (tab == TabType.NewFile) {
+ this.selectNewFile();
+ } /*else if (tab == TabType.File) {
+ this.selectFile(this.selectedFile);
+ }*/
+ this.listView = this.getListView(tab);
+ this.type = this.getFolderType(tab);
+ this.privacy = this.getPrivacy(tab);
+ this.selectedTab = tab;
+ this.files = this.folders[tab];
- if (tab !== TabType.File && tab !== TabType.NewFile)
- this.searchTermsChanged();
- });
+ if (tab !== TabType.File && tab !== TabType.NewFile)
+ this.searchTermsChanged();
}
getListView(tab: TabType) {