aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/api/api/Controllers/ExperimentController.cs2
-rw-r--r--frontend/src/app/_elements/column-table/column-table.component.html4
-rw-r--r--frontend/src/app/_elements/column-table/column-table.component.ts66
-rw-r--r--frontend/src/app/_elements/folder/folder.component.ts13
-rw-r--r--frontend/src/app/_pages/experiment/experiment.component.ts35
-rw-r--r--frontend/src/app/_services/datasets.service.ts3
-rw-r--r--frontend/src/app/_services/experiments.service.ts4
-rw-r--r--frontend/src/app/app-routing.module.ts2
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' } }
];