aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/app
diff options
context:
space:
mode:
authorIvan Ljubisavljevic <ivan996sk@gmail.com>2022-05-19 00:33:36 +0200
committerIvan Ljubisavljevic <ivan996sk@gmail.com>2022-05-19 00:33:36 +0200
commit684b924b88e5aea92c74e58f3656b4518e3950ce (patch)
tree775eb4f45ae9b615de1907571fb92a023f7789b5 /frontend/src/app
parentc1f507071e65903a6efda7285fff096bb7b8a7e5 (diff)
parent1c1efd8424242700e15af9b02582e1395916b7bc (diff)
Merge branch 'redesign' of http://gitlab.pmf.kg.ac.rs/igrannonica/neuronstellar into redesign
Diffstat (limited to 'frontend/src/app')
-rw-r--r--frontend/src/app/_data/Dataset.ts2
-rw-r--r--frontend/src/app/_elements/_charts/pie-chart/pie-chart.component.ts43
-rw-r--r--frontend/src/app/_elements/column-table/column-table.component.css2
-rw-r--r--frontend/src/app/_elements/column-table/column-table.component.ts11
-rw-r--r--frontend/src/app/_elements/folder/folder.component.html12
-rw-r--r--frontend/src/app/_elements/folder/folder.component.ts25
-rw-r--r--frontend/src/app/_pages/experiment/experiment.component.ts46
-rw-r--r--frontend/src/app/_services/datasets.service.ts4
-rw-r--r--frontend/src/app/_services/models.service.ts4
-rw-r--r--frontend/src/app/app-routing.module.ts1
10 files changed, 112 insertions, 38 deletions
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/_charts/pie-chart/pie-chart.component.ts b/frontend/src/app/_elements/_charts/pie-chart/pie-chart.component.ts
index c2bd3262..cba5252a 100644
--- a/frontend/src/app/_elements/_charts/pie-chart/pie-chart.component.ts
+++ b/frontend/src/app/_elements/_charts/pie-chart/pie-chart.component.ts
@@ -14,16 +14,16 @@ export class PieChartComponent implements AfterViewInit {
@Input()uniqueValuesPercent?: number[] = [];
updatePieChart(uniqueValues: string[], uniqueValuesPercent: number[]){
- console.log(this.uniqueValues, this.uniqueValuesPercent);
- const newPieChartData = {
- datasets: [{
- label: "Population (millions)",
- backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"],
- data: [2478,5267,734,784,433],
- }]
-
- }
- };
+ //console.log(this.uniqueValues, this.uniqueValuesPercent);
+ this.pieChartData.datasets = [{
+ label: "%",
+ backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850", "#000000"],
+ data: uniqueValuesPercent,
+ }];
+ this.pieChartData.labels = uniqueValues
+ console.log(this.uniqueValues, this.uniqueValuesPercent);
+ this.myChart?.update()
+ };
@ViewChild('piechart') chartRef!: ElementRef;
constructor() { }
@@ -33,13 +33,30 @@ export class PieChartComponent implements AfterViewInit {
label: "Population (millions)",
backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"],
data: [2478,5267,734,784,433]
- }]
+ }], labels : [""]
}
+ myChart?: Chart;
ngAfterViewInit(): void {
- const myChart = new Chart(this.chartRef.nativeElement, {
+ let rem = 100;
+ const percents : number[] = []
+ this.uniqueValuesPercent?.forEach(percent => {
+ rem-=percent*100;
+ percents.push(percent*100)
+
+ })
+ const data = {
+ datasets: [{
+ label: "%",
+ backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850", "#000000"],
+ data: [...percents, rem]
+ }], labels : [...this.uniqueValues!,"Ostalo"]
+ }
+
+ const myChart = new Chart(this.chartRef.nativeElement, {
type: 'pie',
- data: this.pieChartData,
+ data: data
+ ,
options: {
/*title: {
display: true,
diff --git a/frontend/src/app/_elements/column-table/column-table.component.css b/frontend/src/app/_elements/column-table/column-table.component.css
index 0477b7be..f7f07e62 100644
--- a/frontend/src/app/_elements/column-table/column-table.component.css
+++ b/frontend/src/app/_elements/column-table/column-table.component.css
@@ -198,7 +198,7 @@ table ::ng-deep .mat-form-field-wrapper {
font-size: large;
position: relative;
background-color: var(--ns-primary);
- width: 10rem;
+ width: 13rem;
height: 2.3rem;
border-color: var(--ns-primary);
border-style: solid;
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 9fdb6936..ad78feaf 100644
--- a/frontend/src/app/_elements/column-table/column-table.component.ts
+++ b/frontend/src/app/_elements/column-table/column-table.component.ts
@@ -83,8 +83,8 @@ export class ColumnTableComponent implements AfterViewInit {
let i = 0;
this.boxplotComp.changes.subscribe(() => {
const bps = this.boxplotComp.toArray();
- this.dataset?.columnInfo.forEach(colInfo => {
- if (this.experiment.columnTypes[i] == ColumnType.numerical) {
+ this.dataset?.columnInfo.forEach((colInfo, index) => {
+ if (this.experiment.columnTypes[index] == ColumnType.numerical) {
bps[i].updateChart(colInfo!.min, colInfo.max, colInfo.q1, colInfo.q3, colInfo.median);
i++;
}
@@ -96,8 +96,11 @@ export class ColumnTableComponent implements AfterViewInit {
//min: number, max: number, q1: number, q3: number, median: number
let i = 0;
const pieChart = this.piechartComp.toArray();
- this.dataset?.columnInfo.forEach(colInfo => {
- if (this.experiment.columnTypes[i] == ColumnType.categorical) {
+ console.log(pieChart)
+ this.dataset?.columnInfo.forEach((colInfo, index) => {
+ console.log(i)
+ if (this.experiment.columnTypes[index] == ColumnType.categorical) {
+ console.log("prosao IF")
pieChart[i].updatePieChart(colInfo!.uniqueValues, colInfo.uniqueValuesPercent);
i++;
}
diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html
index da04b219..de9a6353 100644
--- a/frontend/src/app/_elements/folder/folder.component.html
+++ b/frontend/src/app/_elements/folder/folder.component.html
@@ -59,6 +59,11 @@
<button *ngIf="this.selectedFile && selectedTab == TabType.File" class="btn-clear file-button" (click)="deleteFile(this.selectedFile, $event)">
<mat-icon>delete</mat-icon>
</button>
+ <button *ngIf="this.selectedFile && selectedTab==TabType.File && FolderType.Dataset==this.type" class="btn-clear file-button" (click)="downloadFile(this.selectedFile,$event)" style="display: inline-block;">
+ <mat-icon>download</mat-icon>
+ </button>
+
+
<!-- <button class="btn-clear file-button">
<mat-icon>zoom_out_map</mat-icon>
</button> -->
@@ -76,7 +81,10 @@
{{file.lastUpdated | date}}
</div>
<div class="mx-2 hover-show" *ngIf="selectedTab !== TabType.PublicDatasets && selectedTab !== TabType.PublicModels">
- <button class="btn-clear file-button" (click)="deleteFile(file, $event)">
+ <button *ngIf="selectedTab==TabType.MyDatasets" class="btn-clear file-button" (click)="downloadFile(file,$event)" style="display: inline-block;">
+ <mat-icon>download</mat-icon>
+ </button>
+ <button class="btn-clear file-button" (click)="deleteFile(file, $event)" style="display: inline-block;">
<mat-icon>delete</mat-icon>
</button>
</div>
@@ -87,7 +95,7 @@
</div>
</div>
<div *ngIf="type == FolderType.Experiment" class="list-view">
- <div *ngFor="let predictor of predictorsForExp[file._id];" class="list-item">
+ <div *ngFor="let predictor of predictorsForExp[file._id];" class="list-item" (click)="goToExperimentPageWithPredictor(file, predictor)">
<div class="mx-3">
<div class="f-row">
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts
index e521f264..254298fb 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',
@@ -106,7 +107,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;
@@ -117,12 +118,10 @@ 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]);
+
+ goToExperimentPageWithPredictor(file: FolderFile, predictor: Predictor) {
+ this.router.navigate(['/experiment/' + file._id + "/" + predictor._id]);
}
- */
createNewFile() {
if (this.type == FolderType.Dataset) {
@@ -309,6 +308,20 @@ export class FolderComponent implements AfterViewInit {
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();
diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts
index 312b1af1..22894131 100644
--- a/frontend/src/app/_pages/experiment/experiment.component.ts
+++ b/frontend/src/app/_pages/experiment/experiment.component.ts
@@ -14,6 +14,7 @@ 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';
+import { PredictorsService } from 'src/app/_services/predictors.service';
@Component({
selector: 'app-experiment',
@@ -39,24 +40,47 @@ export class ExperimentComponent implements AfterViewInit, OnInit {
step3: boolean = false;
step4: boolean = false;
- constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService, private datasetsService: DatasetsService, private signalRService: SignalRService, private route: ActivatedRoute) {
+ constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService, private datasetsService: DatasetsService, private predictorsService: PredictorsService, 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);
+ let predictorId = this.route.snapshot.paramMap.get("predictorId");
+
+ if (predictorId != null && experimentId != null) {
+ 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); //sad 3. i 4. korak da se ucitaju
+
+ //this.predictorsService.getPredictor(predictorId!).subscribe((response) => {
+ let predictor = response;
+ //this.modelsService.getModelById(predictor.modelId).subscribe((response) => {
+ this.modelsService.getModelById("62853d70696d62ceeb8db7cd").subscribe((response) => {
+ //imamo model
+ this.folderModel.formModel.newModel = response;
+ //this.metricView.update(predictor.metrics);
+ });
+ //});
+ });
});
- });
+ }
+ else if (predictorId == null && experimentId != null) {
+ 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);
+ });
+ });
+ }
+
});
}
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<Blob>{
+ return this.http.get(`${Configuration.settings.apiURL}/file/Download?id=`+id, { headers: this.authService.authHeader(), responseType: 'blob' });
+ }
}
diff --git a/frontend/src/app/_services/models.service.ts b/frontend/src/app/_services/models.service.ts
index 5f7b1947..f5d95ec1 100644
--- a/frontend/src/app/_services/models.service.ts
+++ b/frontend/src/app/_services/models.service.ts
@@ -62,4 +62,8 @@ export class ModelsService {
return this.http.get<Model[]>(`${Configuration.settings.apiURL}/model/publicmodels`, { headers: this.authService.authHeader() });
}
+ getModelById(modelId: string): Observable<Model> {
+ return this.http.get<Model>(`${Configuration.settings.apiURL}/model/byid/${modelId}`, { headers: this.authService.authHeader() });
+ }
+
}
diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts
index 9f8c623d..8c60a666 100644
--- a/frontend/src/app/app-routing.module.ts
+++ b/frontend/src/app/app-routing.module.ts
@@ -12,6 +12,7 @@ import { TestComponent } from './_pages/test/test.component';
const routes: Routes = [
{ path: '', component: HomeComponent, data: { title: 'Početna strana' } },
+ { path: 'experiment/:id/:predictorId', component: ExperimentComponent, data: { title: 'Eksperiment' } },
{ path: 'experiment/:id', component: ExperimentComponent, data: { title: 'Eksperiment' } },
{ path: 'experiment', component: ExperimentComponent, data: { title: 'Eksperiment' } },
{ path: 'archive', component: ArchiveComponent, data: { title: 'Arhiva' } },