diff options
8 files changed, 96 insertions, 33 deletions
diff --git a/backend/api/api/Controllers/ExperimentController.cs b/backend/api/api/Controllers/ExperimentController.cs index 08354615..b599ca4e 100644 --- a/backend/api/api/Controllers/ExperimentController.cs +++ b/backend/api/api/Controllers/ExperimentController.cs @@ -61,7 +61,7 @@ namespace api.Controllers return Ok(experiment); } - [HttpGet("get")] + [HttpGet("get/{id}")] [Authorize(Roles = "User,Guest")] public async Task<ActionResult<Experiment>> Get(string id) { diff --git a/frontend/src/app/_elements/column-table/column-table.component.html b/frontend/src/app/_elements/column-table/column-table.component.html index 8a4164f1..31c32dfd 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.html +++ b/frontend/src/app/_elements/column-table/column-table.component.html @@ -45,10 +45,10 @@ </tbody> </table> <div class="mb-3"> - <button mat-button (click)="goBack()"><mat-icon>keyboard_arrow_left</mat-icon></button> + <button mat-button (click)="goBack()"><mat-icon>keyboard_arrow_left</mat-icon></button> <div style="display: inline;">{{(this.begin/10)+1}}...{{getPage()}}</div> <button mat-button (click)="goForward()"><mat-icon>keyboard_arrow_right</mat-icon></button> - + </div> </div> diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts index ed2f0380..9fdb6936 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -14,6 +14,7 @@ import { AlertDialogComponent } from 'src/app/_modals/alert-dialog/alert-dialog. import Shared from 'src/app/Shared'; import { PieChartComponent } from '../_charts/pie-chart/pie-chart.component'; import { BoxPlotComponent } from '../_charts/box-plot/box-plot.component'; +import { ActivatedRoute } from '@angular/router'; @Component({ selector: 'app-column-table', @@ -41,14 +42,12 @@ export class ColumnTableComponent implements AfterViewInit { columnsChecked: boolean[] = []; //niz svih kolona loaded: boolean = false; - begin:number=0; step:number=10; - constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog) { - //ovo mi nece trebati jer primam dataset iz druge komponente + constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog, private route: ActivatedRoute) { } resetPagging(){ this.begin=0; @@ -107,22 +106,51 @@ export class ColumnTableComponent implements AfterViewInit { loadDataset(dataset: Dataset) { console.log("LOADED DATASET"); - this.dataset = dataset; - this.setColumnTypeInitial(); - - this.dataset.columnInfo.forEach(column => { - this.columnsChecked.push(true); - }); - - this.resetInputColumns(); - this.resetOutputColumn(); - this.resetColumnEncodings(Encoding.Label); - this.setDeleteRowsForMissingValTreatment(); - this.nullValOption = []; - this.dataset.columnInfo.forEach(colInfo => { - this.nullValOption.push(`Obriši redove (${colInfo.numNulls})`); - }); + if (this.route.snapshot.paramMap.get("id") == null) { + this.dataset = dataset; + this.setColumnTypeInitial(); + + this.columnsChecked = []; + this.dataset.columnInfo.forEach(column => { + this.columnsChecked.push(true); + }); + + this.resetInputColumns(); + this.resetOutputColumn(); + this.resetColumnEncodings(Encoding.Label); + this.setDeleteRowsForMissingValTreatment(); + + this.nullValOption = []; + this.dataset.columnInfo.forEach(colInfo => { + this.nullValOption.push(`Obriši redove (${colInfo.numNulls})`); + }); + } + else { + this.dataset = dataset; + this.columnsChecked = []; + this.dataset.columnInfo.forEach(column => { + if (this.experiment.inputColumns.find(x => x == column.columnName) != undefined) + this.columnsChecked.push(true); + else + this.columnsChecked.push(false); + }); + this.nullValOption = []; + for (let i = 0; i < this.dataset!.columnInfo.length; i++) { + let nullValRep = this.experiment.nullValuesReplacers.find(x => x.column == this.dataset!.columnInfo[i].columnName); + if (nullValRep != undefined) { + if (nullValRep.option == NullValueOptions.DeleteRows) + this.nullValOption.push(`Obriši redove (${this.dataset.columnInfo[i].numNulls})`); + else if (nullValRep.option == NullValueOptions.DeleteColumns) + this.nullValOption.push(`Obriši kolonu`); + else { + this.nullValOption.push(`Popuni sa ${nullValRep.value}`); + } + } + else + this.nullValOption.push(`Obriši redove (${this.dataset.columnInfo[i].numNulls})`); + } + } this.resetPagging(); this.loadData(); this.loaded = true; @@ -141,8 +169,6 @@ export class ColumnTableComponent implements AfterViewInit { } ngAfterViewInit(): void { - console.log(this.dataset?.columnInfo); - } setColumnTypeInitial() { diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index be72ebc5..b09cb543 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -11,7 +11,7 @@ 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'; @Component({ @@ -42,11 +42,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] = []); } @@ -105,7 +106,7 @@ export class FolderComponent implements AfterViewInit { this.selectedFile = file; 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; @@ -116,6 +117,12 @@ export class FolderComponent implements AfterViewInit { if (this.type == FolderType.Dataset) this.formDataset.loadExisting(); } + /* + goToExperimentPage(file: FolderFile) { + console.log(<Experiment>file); + //this.router.navigate(['/experiment/', this.experiment._id]); + } + */ createNewFile() { if (this.type == FolderType.Dataset) { diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index ee9cca8c..9af2a305 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.ts +++ b/frontend/src/app/_pages/experiment/experiment.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, ViewChild, ViewChildren, Input } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, ViewChild, ViewChildren, Input, OnInit } from '@angular/core'; import { StepperSelectionEvent } from '@angular/cdk/stepper'; import { MatStepper } from '@angular/material/stepper'; import Shared from 'src/app/Shared'; @@ -12,13 +12,15 @@ import Dataset from 'src/app/_data/Dataset'; import { ColumnTableComponent } from 'src/app/_elements/column-table/column-table.component'; import { SignalRService } from 'src/app/_services/signal-r.service'; import { MetricViewComponent } from 'src/app/_elements/metric-view/metric-view.component'; +import { ActivatedRoute, Router } from '@angular/router'; +import { DatasetsService } from 'src/app/_services/datasets.service'; @Component({ selector: 'app-experiment', templateUrl: './experiment.component.html', styleUrls: ['./experiment.component.css'] }) -export class ExperimentComponent implements AfterViewInit { +export class ExperimentComponent implements AfterViewInit, OnInit { @ViewChild(MatStepper) stepper!: MatStepper; @ViewChild('stepsContainer') stepsContainer!: ElementRef; @@ -37,10 +39,26 @@ export class ExperimentComponent implements AfterViewInit { step3:boolean=false; step4:boolean=false; - - constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService, private signalRService: SignalRService) { + constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService, private datasetsService: DatasetsService, private signalRService: SignalRService, private route: ActivatedRoute) { this.experiment = new Experiment("exp1"); } + + ngOnInit(): void { + this.route.queryParams.subscribe(params => { + let experimentId = this.route.snapshot.paramMap.get("id"); + if (experimentId == null) + return; + this.experimentsService.getExperimentById(experimentId).subscribe((response) => { + this.experiment = response; + this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { + this.dataset = response; + + this.folderDataset.forExperiment = this.experiment; + this.folderDataset.selectFile(this.dataset); + }); + }); + }); + } /*updateExperiment(){ @@ -158,14 +176,19 @@ export class ExperimentComponent implements AfterViewInit { this.folderModel.updateExperiment(); } - setDataset(dataset: FolderFile) { + setDataset(dataset: FolderFile | null) { + if (dataset == null) { + this.columnTable.loaded = false; + this.dataset = undefined; + this.experiment.datasetId = ''; + return; + } const d = <Dataset>dataset; this.experiment.datasetId = d._id; this.dataset = d; this.columnTable.loadDataset(this.dataset); this.step1=true; - } modelToTrain?: Model; diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 1b961442..8d07674d 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -40,6 +40,9 @@ export class DatasetsService { getDatasetFilePartial(fileId: any, startRow: number, rowNum: number): Observable<any> { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${startRow}/${rowNum}`, { headers: this.authService.authHeader(), responseType: 'text' }); } + getDatasetById(datasetId: string): Observable<Dataset> { + return this.http.get<Dataset>(`${Configuration.settings.apiURL}/dataset/get/${datasetId}`, { headers: this.authService.authHeader() }); + } editDataset(dataset: Dataset): Observable<Dataset> { return this.http.put<Dataset>(`${Configuration.settings.apiURL}/dataset/` + dataset._id, dataset, { headers: this.authService.authHeader() }); diff --git a/frontend/src/app/_services/experiments.service.ts b/frontend/src/app/_services/experiments.service.ts index 29569fca..f4473c8c 100644 --- a/frontend/src/app/_services/experiments.service.ts +++ b/frontend/src/app/_services/experiments.service.ts @@ -20,6 +20,10 @@ export class ExperimentsService { return this.http.get<Experiment[]>(`${Configuration.settings.apiURL}/experiment/getmyexperiments`, { headers: this.authService.authHeader() }); } + getExperimentById(id: string): Observable<Experiment> { + return this.http.get<Experiment>(`${Configuration.settings.apiURL}/experiment/get/${id}`, { headers: this.authService.authHeader() }); + } + updateExperiment(experiment: Experiment): Observable<Experiment> { return this.http.put<Experiment>(`${Configuration.settings.apiURL}/experiment/` + experiment._id, experiment, { headers: this.authService.authHeader() }); } diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index f5f1ccae..9f8c623d 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -12,11 +12,11 @@ import { TestComponent } from './_pages/test/test.component'; const routes: Routes = [ { path: '', component: HomeComponent, data: { title: 'Početna strana' } }, + { path: 'experiment/:id', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'experiment', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'archive', component: ArchiveComponent, data: { title: 'Arhiva' } }, { path: 'profile', component: ProfileComponent, canActivate: [AuthGuardService], data: { title: 'Profil' } }, { path: 'playground', component: PlaygroundComponent, data: { title: 'Zabava' } }, - { path: 'sonja', component: ColumnTableComponent }, { path: 'test', component: TestComponent, data: { title: 'Test' } } ]; |