From 11d83e1ea6c25a851b3eb7559ee85061d77337c9 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sun, 15 May 2022 23:45:29 +0200 Subject: Dodati dugmici za napred i nazad. Napravljen api upit. --- frontend/src/app/_services/datasets.service.ts | 3 +++ 1 file changed, 3 insertions(+) (limited to 'frontend/src/app/_services/datasets.service.ts') diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 2211996f..6d0e06db 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -27,6 +27,9 @@ export class DatasetsService { getDatasetFile(fileId: any): any { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/-1/11`, { headers: this.authService.authHeader(), responseType: 'text' }); } + getDatasetFilePaging(fileId:any,begin:any,end:any){ + return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${begin}/${end}`, { headers: this.authService.authHeader(), responseType: 'text' }); + } getDatasetFilePartial(fileId: any, startRow: number, rowNum: number): Observable { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${startRow}/${rowNum}`, { headers: this.authService.authHeader(), responseType: 'text' }); } -- cgit v1.2.3 From 49d213824ee6dda9eaf9ba75041bb059075a30e5 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Mon, 16 May 2022 00:30:15 +0200 Subject: Napravljen zahtev koji trazi header Dataseta od api-ja. Dodato da se prikazuje header na stranama posle prve. --- .../app/_elements/form-dataset/form-dataset.component.html | 2 +- .../app/_elements/form-dataset/form-dataset.component.ts | 14 ++++++++------ frontend/src/app/_services/datasets.service.ts | 3 +++ 3 files changed, 12 insertions(+), 7 deletions(-) (limited to 'frontend/src/app/_services/datasets.service.ts') diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index 1f91405b..e7084c6d 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -49,7 +49,7 @@
-
{{((this.begin+1)/10)+1}}
+
{{(this.begin/10)+1}}
diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts index 99583437..aa3745d0 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts @@ -24,8 +24,8 @@ export class FormDatasetComponent { files: File[] = []; rowsNumber: number = 0; colsNumber: number = 0; - begin:number=-1; - end:number=11; + begin:number=0; + end:number=10; existingFlag:boolean=false; @Input() dataset: Dataset; //dodaj ! potencijalno @@ -44,11 +44,11 @@ export class FormDatasetComponent { //@ViewChild('fileImportInput', { static: false }) fileImportInput: any; cemu je ovo sluzilo? resetPagging(){ - this.begin=-1; + this.begin=0; } goBack(){ if(this.begin-10<=0) - this.begin=-1; + this.begin=0; else this.begin-=10; this.loadExisting(); @@ -113,16 +113,18 @@ export class FormDatasetComponent { this.tableData.hasInput = true; this.tableData.loaded = false; - + this.datasetsService.getDatasetHeader(this.dataset.fileId).subscribe((header: string | undefined)=>{ + this.datasetsService.getDatasetFilePaging(this.dataset.fileId,this.begin,this.end).subscribe((file: string | undefined) => { if (file) { this.tableData.loaded = true; this.tableData.numRows = this.dataset.rowCount; this.tableData.numCols = this.dataset.columnInfo.length; - this.tableData.data = this.csv.csvToArray(file, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "novi red") ? "\t" : this.dataset.delimiter); + this.tableData.data = this.csv.csvToArray(header+'\n'+file, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "novi red") ? "\t" : this.dataset.delimiter); } }); + }); } diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 6d0e06db..f5677097 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -30,6 +30,9 @@ export class DatasetsService { getDatasetFilePaging(fileId:any,begin:any,end:any){ return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${begin}/${end}`, { headers: this.authService.authHeader(), responseType: 'text' }); } + getDatasetHeader(fileId:any){ + return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/-1/1`, { headers: this.authService.authHeader(), responseType: 'text' }); + } getDatasetFilePartial(fileId: any, startRow: number, rowNum: number): Observable { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${startRow}/${rowNum}`, { headers: this.authService.authHeader(), responseType: 'text' }); } -- cgit v1.2.3 From 00915357e9af2e6d3c1e312cdd46efd502cf106c Mon Sep 17 00:00:00 2001 From: Ivan Ljubisavljevic Date: Mon, 16 May 2022 21:25:36 +0200 Subject: Rrrrressii dodavanje public datasetova u svoje --- backend/api/api/Controllers/DatasetController.cs | 68 ++++++++++++++++++++++ backend/api/api/Interfaces/IFileService.cs | 2 + backend/api/api/Services/FileService.cs | 6 ++ backend/api/api/Services/FillAnEmptyDb.cs | 20 ++++--- frontend/src/app/_data/Dataset.ts | 1 + .../src/app/_elements/folder/folder.component.ts | 4 +- frontend/src/app/_services/datasets.service.ts | 4 ++ 7 files changed, 96 insertions(+), 9 deletions(-) (limited to 'frontend/src/app/_services/datasets.service.ts') diff --git a/backend/api/api/Controllers/DatasetController.cs b/backend/api/api/Controllers/DatasetController.cs index a6ebe8ac..7602a621 100644 --- a/backend/api/api/Controllers/DatasetController.cs +++ b/backend/api/api/Controllers/DatasetController.cs @@ -148,7 +148,75 @@ namespace api.Controllers return Ok(); } } + // POST api//stealDs + [HttpPost("stealDs")] + [Authorize(Roles = "User,Guest")] + public async Task> StealDs([FromBody] Dataset dataset) + { + string uploaderId = getUserId(); + + dataset.uploaderId = uploaderId; + + //da li ce preko tokena da se ubaci username ili front salje + //dataset.username = usernameToken; + //username = "" ako je GUEST DODAO + var existingDataset = _datasetService.GetOneDatasetN(dataset.uploaderId, dataset.name); + + if (existingDataset != null) + return NotFound($"Dataset with this name already exists"); + else + { + dataset.dateCreated = DateTime.Now; + dataset.lastUpdated = DateTime.Now; + dataset.isPublic = false; + + FileModel fileModel = _fileService.getFile(dataset.fileId); + string folderName = "UploadedFiles"; + var folderPath = Path.Combine(Directory.GetCurrentDirectory(), folderName, uploaderId); + + string ext = ".csv"; + + //nesto + + //Check Directory + if (!Directory.Exists(folderPath)) + { + Directory.CreateDirectory(folderPath); + } + //Index file if same filename + var fullPath = Path.Combine(folderPath, dataset.name + ext); + int i = 0; + + while (System.IO.File.Exists(fullPath)) + { + i++; + fullPath = Path.Combine(folderPath, dataset.name + i.ToString() + ext); + } + + dataset.fileId = ""; + + _fileService.CopyFile(fileModel.path, fullPath); + + + FileModel fileModel1 = new FileModel(); + fileModel1.type = ext; + fileModel1.path = fullPath; + fileModel1.uploaderId = uploaderId; + fileModel1.date = DateTime.Now.ToUniversalTime(); + fileModel1 = _fileService.Create(fileModel1); + + dataset.fileId = fileModel1._id; + + //nesto + + + dataset.isPreProcess = false; + _datasetService.Create(dataset); + _mlConnectionService.PreProcess(dataset, fileModel.path, uploaderId); + return Ok(); + } + } // PUT api//{name} [HttpPut("{id}")] diff --git a/backend/api/api/Interfaces/IFileService.cs b/backend/api/api/Interfaces/IFileService.cs index e061dfdb..00dc0002 100644 --- a/backend/api/api/Interfaces/IFileService.cs +++ b/backend/api/api/Interfaces/IFileService.cs @@ -9,5 +9,7 @@ namespace api.Services public FileModel getFile(string id); bool CheckDb(); string GetFileId(string fullPath); + bool CopyFile(string sourceFile, string destinacionFile); + } } \ No newline at end of file diff --git a/backend/api/api/Services/FileService.cs b/backend/api/api/Services/FileService.cs index ea3fe56e..6ef74ca1 100644 --- a/backend/api/api/Services/FileService.cs +++ b/backend/api/api/Services/FileService.cs @@ -59,5 +59,11 @@ namespace api.Services return file._id; } + + public bool CopyFile(string sourceFile, string destinacionFile) + { + File.Copy(sourceFile, destinacionFile, true); + return true; + } } } diff --git a/backend/api/api/Services/FillAnEmptyDb.cs b/backend/api/api/Services/FillAnEmptyDb.cs index fc169853..28f293ce 100644 --- a/backend/api/api/Services/FillAnEmptyDb.cs +++ b/backend/api/api/Services/FillAnEmptyDb.cs @@ -53,7 +53,7 @@ namespace api.Services dataset._id = ""; dataset.uploaderId = "000000000000000000000000"; - dataset.name = "Titanik dataset"; + dataset.name = "Titanik dataset(public)"; dataset.description = "Titanik dataset"; dataset.fileId = _fileService.GetFileId(fullPath); dataset.extension = ".csv"; @@ -61,7 +61,7 @@ namespace api.Services dataset.accessibleByLink = true; dataset.dateCreated = DateTime.Now; dataset.lastUpdated = DateTime.Now; - dataset.delimiter = ""; + dataset.delimiter = ","; dataset.columnInfo = new ColumnInfo[] { }; dataset.columnInfo = new[] { @@ -84,7 +84,7 @@ namespace api.Services dataset.nullRows = 708; dataset.isPreProcess = true; dataset.cMatrix = new float[11][]; - dataset.cMatrix[0] = new float[] {1f,-0.005006660707294941f, -0.03514399379491806f,-0.03855886310338974f,0.04293888062238693f,0.03684719651937485f}; + dataset.cMatrix[0] = new float[] { 1f, -0.005006660707294941f, -0.03514399379491806f, -0.03855886310338974f, 0.04293888062238693f, 0.03684719651937485f }; _datasetService.Create(dataset); @@ -173,14 +173,14 @@ namespace api.Services dataset._id = ""; dataset.uploaderId = "000000000000000000000000"; dataset.name = "Diamonds dataset"; - dataset.description = "Diamonds dataset"; + dataset.description = "Diamonds dataset(public)"; dataset.fileId = _fileService.GetFileId(fullPath); dataset.extension = ".csv"; dataset.isPublic = true; dataset.accessibleByLink = true; dataset.dateCreated = DateTime.Now; dataset.lastUpdated = DateTime.Now; - dataset.delimiter = ""; + dataset.delimiter = ","; dataset.columnInfo = new[] { new ColumnInfo( "Unnamed: 0", true, 0, 26969.5f, 0, 53939, 26969.5f, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), @@ -199,6 +199,9 @@ namespace api.Services dataset.nullCols = 0; dataset.nullRows = 0; dataset.isPreProcess = true; + dataset.cMatrix = new float[11][]; + dataset.cMatrix[0] = new float[] { 1f, -0.005006660707294941f, -0.03514399379491806f, -0.03855886310338974f, 0.04293888062238693f, 0.03684719651937485f }; + _datasetService.Create(dataset); @@ -295,14 +298,14 @@ namespace api.Services dataset._id = ""; dataset.uploaderId = "000000000000000000000000"; dataset.name = "Iris dataset"; - dataset.description = "Iris dataset"; + dataset.description = "Iris dataset(public) "; dataset.fileId = _fileService.GetFileId(fullPath); dataset.extension = ".csv"; dataset.isPublic = true; dataset.accessibleByLink = true; dataset.dateCreated = DateTime.Now; dataset.lastUpdated = DateTime.Now; - dataset.delimiter = ""; + dataset.delimiter = ","; dataset.columnInfo = new[] { new ColumnInfo( "sepal_length", true, 0, 5.8433332443237305f, 4.300000190734863f, 7.900000095367432f, 5.800000190734863f, new string[]{ }, new int[] {}, new float[] {}, 0.01f, 0.1f ), @@ -314,6 +317,9 @@ namespace api.Services dataset.nullCols = 150; dataset.nullRows = 0; dataset.isPreProcess = true; + dataset.cMatrix = new float[11][]; + dataset.cMatrix[0] = new float[] { 1f, -0.005006660707294941f, -0.03514399379491806f, -0.03855886310338974f, 0.04293888062238693f, 0.03684719651937485f }; + _datasetService.Create(dataset); diff --git a/frontend/src/app/_data/Dataset.ts b/frontend/src/app/_data/Dataset.ts index a962fe6b..73b77bd0 100644 --- a/frontend/src/app/_data/Dataset.ts +++ b/frontend/src/app/_data/Dataset.ts @@ -17,6 +17,7 @@ export default class Dataset extends FolderFile { public rowCount: number = 0, public nullRows: number = 0, public nullCols: number = 0, + public isPreProcess : Boolean = false, public cMatrix: number[][] = [] ) { super(name, dateCreated, lastUpdated); diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index fff5a25d..d26ac999 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -301,9 +301,9 @@ export class FolderComponent implements AfterViewInit { switch (this.type) { case FolderType.Dataset: (file)._id=""; - + (file).isPreProcess = true; (file).isPublic=false; - this.datasetsService.addDataset(file).subscribe((response) => { + this.datasetsService.stealDataset(file).subscribe((response) => { this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1); this.refreshFiles(null); }); diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index f5677097..1b961442 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -24,6 +24,10 @@ export class DatasetsService { return this.http.post(`${Configuration.settings.apiURL}/dataset/add`, dataset, { headers: this.authService.authHeader() }); } + stealDataset(dataset: Dataset): Observable { + return this.http.post(`${Configuration.settings.apiURL}/dataset/stealDs`, dataset, { headers: this.authService.authHeader() }); + } + getDatasetFile(fileId: any): any { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/-1/11`, { headers: this.authService.authHeader(), responseType: 'text' }); } -- cgit v1.2.3 From 9233e6f193f68a0477e2900ac7a82928ab7f4adc Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Wed, 18 May 2022 13:52:29 +0200 Subject: Ispravljen bag: kad se izmeni dataset, refreshuje se 2. korak na eksperiment strani. Dodata ruta kako bi se eksperiment iz kolekcije otvorio na eksperiment strani. Sredjivanje otvaranja - pocetak --- .../api/api/Controllers/ExperimentController.cs | 2 +- .../column-table/column-table.component.html | 4 +- .../column-table/column-table.component.ts | 3 +- .../src/app/_elements/folder/folder.component.html | 6 +-- .../src/app/_elements/folder/folder.component.ts | 8 +++- .../app/_pages/experiment/experiment.component.ts | 44 +++++++++++++++++++--- frontend/src/app/_services/datasets.service.ts | 3 ++ frontend/src/app/_services/experiments.service.ts | 4 ++ frontend/src/app/app-routing.module.ts | 2 +- 9 files changed, 61 insertions(+), 15 deletions(-) (limited to 'frontend/src/app/_services/datasets.service.ts') 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> 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 3256ffee..8af56c43 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 @@
- +
{{(this.begin/10)+1}}
- +
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 a3469d90..7c2f8cef 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -41,14 +41,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 } resetPagging(){ this.begin=0; @@ -98,6 +96,7 @@ export class ColumnTableComponent implements AfterViewInit { this.dataset = dataset; this.setColumnTypeInitial(); + this.columnsChecked = []; this.dataset.columnInfo.forEach(column => { this.columnsChecked.push(true); }); diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html index db4f28f0..84946697 100644 --- a/frontend/src/app/_elements/folder/folder.component.html +++ b/frontend/src/app/_elements/folder/folder.component.html @@ -78,12 +78,12 @@
+
- +
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index d26ac999..4e2209a0 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -105,7 +105,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 +116,12 @@ export class FolderComponent implements AfterViewInit { if (this.type == FolderType.Dataset) this.formDataset.loadExisting(); } + /* + goToExperimentPage(file: FolderFile) { + console.log(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 abf4b697..62ef9257 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; @@ -32,9 +34,36 @@ export class ExperimentComponent implements AfterViewInit { @ViewChild("folderModel") folderModel!: FolderComponent; @ViewChild("metricView") metricView!: MetricViewComponent; - 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"); + console.log("EXPID u exp.comp:", experimentId); + if (experimentId == null) + return; + + this.experimentsService.getExperimentById(experimentId).subscribe((response) => { + this.experiment = response; + console.log(this.experiment); //OTKUD MI NAME + this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { + this.dataset = response; + console.log("EXP u exp.comp:", this.experiment); + console.log("DATASET u exp.comp:", this.dataset); + this.folderDataset.forExperiment = this.experiment; + this.folderDataset.fileToDisplay = this.experiment; + this.folderDataset.selectFile(); + this.columnTable.experiment = this.experiment; + this.columnTable.dataset = this.dataset; + //this.columnTable.loadDataset(this.dataset); + + //this.setDataset(); + //this.experimentChangedEvent(); + }); + }); + }); + } /*updateExperiment(){ @@ -151,13 +180,18 @@ 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; this.experiment.datasetId = d._id; this.dataset = d; this.columnTable.loadDataset(this.dataset); - } modelToTrain?: Model; diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 1b961442..11a6ee5e 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 { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${startRow}/${rowNum}`, { headers: this.authService.authHeader(), responseType: 'text' }); } + getDatasetById(datasetId: string): Observable { + return this.http.get(`${Configuration.settings.apiURL}/dataset/${datasetId}`, { headers: this.authService.authHeader() }); + } editDataset(dataset: Dataset): Observable { return this.http.put(`${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(`${Configuration.settings.apiURL}/experiment/getmyexperiments`, { headers: this.authService.authHeader() }); } + getExperimentById(id: string): Observable { + return this.http.get(`${Configuration.settings.apiURL}/experiment/get/${id}`, { headers: this.authService.authHeader() }); + } + updateExperiment(experiment: Experiment): Observable { return this.http.put(`${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' } } ]; -- cgit v1.2.3 From 2834795337f81e895c3b39948b5b04f7bc662071 Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Wed, 18 May 2022 17:22:09 +0200 Subject: Omogucen pristup glavnoj eksperiment strani odabirom eksperimenta iz kolekcije - automatski popunjeni prvi i drugi korak (forma za dataset i column-table). Korisnik moze da pocne od kreiranja modela (i prethodno izmeni sta zeli). --- .../column-table/column-table.component.ts | 65 +++++++++++++++------- .../src/app/_elements/folder/folder.component.ts | 5 +- .../app/_pages/experiment/experiment.component.ts | 16 +----- frontend/src/app/_services/datasets.service.ts | 2 +- 4 files changed, 52 insertions(+), 36 deletions(-) (limited to 'frontend/src/app/_services/datasets.service.ts') 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 8824ecf4..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', @@ -46,7 +47,7 @@ export class ColumnTableComponent implements AfterViewInit { - constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog) { + constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog, private route: ActivatedRoute) { } resetPagging(){ this.begin=0; @@ -105,23 +106,51 @@ export class ColumnTableComponent implements AfterViewInit { loadDataset(dataset: Dataset) { console.log("LOADED DATASET"); - 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})`); - }); + 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; @@ -140,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 4e2209a0..2b6f9aa7 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 = new EventEmitter(); + @Output() fileFromRoute: EventEmitter = new EventEmitter(); @Output() okPressed: EventEmitter = 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] = []); } diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index 6345307c..9af2a305 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.ts +++ b/frontend/src/app/_pages/experiment/experiment.component.ts @@ -46,26 +46,15 @@ export class ExperimentComponent implements AfterViewInit, OnInit { ngOnInit(): void { this.route.queryParams.subscribe(params => { let experimentId = this.route.snapshot.paramMap.get("id"); - console.log("EXPID u exp.comp:", experimentId); if (experimentId == null) return; - this.experimentsService.getExperimentById(experimentId).subscribe((response) => { this.experiment = response; - console.log(this.experiment); //OTKUD MI NAME this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { this.dataset = response; - console.log("EXP u exp.comp:", this.experiment); - console.log("DATASET u exp.comp:", this.dataset); + this.folderDataset.forExperiment = this.experiment; - this.folderDataset.fileToDisplay = this.experiment; - this.folderDataset.selectFile(); - this.columnTable.experiment = this.experiment; - this.columnTable.dataset = this.dataset; - //this.columnTable.loadDataset(this.dataset); - - //this.setDataset(); - //this.experimentChangedEvent(); + this.folderDataset.selectFile(this.dataset); }); }); }); @@ -200,7 +189,6 @@ export class ExperimentComponent implements AfterViewInit, OnInit { 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 11a6ee5e..8d07674d 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -41,7 +41,7 @@ export class DatasetsService { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${startRow}/${rowNum}`, { headers: this.authService.authHeader(), responseType: 'text' }); } getDatasetById(datasetId: string): Observable { - return this.http.get(`${Configuration.settings.apiURL}/dataset/${datasetId}`, { headers: this.authService.authHeader() }); + return this.http.get(`${Configuration.settings.apiURL}/dataset/get/${datasetId}`, { headers: this.authService.authHeader() }); } editDataset(dataset: Dataset): Observable { -- cgit v1.2.3 From 0dea04df11e9cb5f167473dddaffbc1a0d28bd59 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Wed, 18 May 2022 23:20:15 +0200 Subject: Korisniku omoguceno da preuzme dataset sa front-end-a. --- frontend/src/app/_data/Dataset.ts | 2 +- frontend/src/app/_elements/folder/folder.component.html | 5 ++++- frontend/src/app/_elements/folder/folder.component.ts | 15 +++++++++++++++ frontend/src/app/_services/datasets.service.ts | 4 ++++ 4 files changed, 24 insertions(+), 2 deletions(-) (limited to 'frontend/src/app/_services/datasets.service.ts') diff --git a/frontend/src/app/_data/Dataset.ts b/frontend/src/app/_data/Dataset.ts index 73b77bd0..c8d5771a 100644 --- a/frontend/src/app/_data/Dataset.ts +++ b/frontend/src/app/_data/Dataset.ts @@ -4,7 +4,7 @@ export default class Dataset extends FolderFile { constructor( name: string = 'Novi izvor podataka', public description: string = '', - public fileId?: number, + public fileId?: string, public extension: string = '.csv', public isPublic: boolean = false, public accessibleByLink: boolean = false, diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html index da04b219..6293ec7f 100644 --- a/frontend/src/app/_elements/folder/folder.component.html +++ b/frontend/src/app/_elements/folder/folder.component.html @@ -76,7 +76,10 @@ {{file.lastUpdated | date}}
- +
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index 262b3b7d..f13635e9 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -13,6 +13,7 @@ import { SignalRService } from 'src/app/_services/signal-r.service'; import { FormModelComponent } from '../form-model/form-model.component'; import { ActivatedRoute, Router } from '@angular/router'; import Predictor from 'src/app/_data/Predictor'; +import FileSaver from 'file-saver'; @Component({ selector: 'app-folder', @@ -308,6 +309,20 @@ export class FolderComponent implements AfterViewInit { break; } } + downloadFile(file: FolderFile, event: Event) { + event.stopPropagation(); + if (this.type==FolderType.Dataset) { + const fileId=(file).fileId; + const name=(file).name; + const ext=(file).extension; + if(fileId!=undefined) + this.datasetsService.downloadFile(fileId).subscribe((response)=>{ + FileSaver.saveAs(response,name+ext); + + }); + + } + } addFile(file: FolderFile, event: Event) { event.stopPropagation(); diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 8d07674d..3fb4e8f2 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -51,4 +51,8 @@ export class DatasetsService { deleteDataset(dataset: Dataset) { return this.http.delete(`${Configuration.settings.apiURL}/dataset/` + dataset._id, { headers: this.authService.authHeader(), responseType: "text" }); } + + downloadFile(id:string):Observable{ + return this.http.get(`${Configuration.settings.apiURL}/file/Download?id=`+id, { headers: this.authService.authHeader(), responseType: 'blob' }); + } } -- cgit v1.2.3 From 8d41b2ec76f7566bf51598670b51141cad9b66ef Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 19 May 2022 23:21:53 +0200 Subject: Ispravljen zahtev za updajtovanje dataseta. --- frontend/src/app/_elements/form-dataset/form-dataset.component.html | 2 +- frontend/src/app/_services/datasets.service.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'frontend/src/app/_services/datasets.service.ts') diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index 78bb4bd1..024f58e8 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -10,7 +10,7 @@
Naziv - + diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 3fb4e8f2..2775613c 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -44,8 +44,8 @@ export class DatasetsService { return this.http.get(`${Configuration.settings.apiURL}/dataset/get/${datasetId}`, { headers: this.authService.authHeader() }); } - editDataset(dataset: Dataset): Observable { - return this.http.put(`${Configuration.settings.apiURL}/dataset/` + dataset._id, dataset, { headers: this.authService.authHeader() }); + editDataset(dataset: Dataset){ + return this.http.put(`${Configuration.settings.apiURL}/dataset/` + dataset._id, dataset, { headers: this.authService.authHeader() ,responseType:'text'}); } deleteDataset(dataset: Dataset) { -- cgit v1.2.3