aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/api/api/Controllers/ModelController.cs3
-rw-r--r--backend/api/api/Controllers/PredictorController.cs3
-rw-r--r--backend/api/api/Services/ChatHub.cs39
-rw-r--r--backend/api/api/Services/MlConnectionService.cs5
-rw-r--r--backend/microservice/api/newmlservice.py2
-rw-r--r--frontend/src/app/_elements/column-table/column-table.component.ts14
-rw-r--r--frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.css13
-rw-r--r--frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.html20
-rw-r--r--frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.ts35
9 files changed, 88 insertions, 46 deletions
diff --git a/backend/api/api/Controllers/ModelController.cs b/backend/api/api/Controllers/ModelController.cs
index a0e51e1f..3145a080 100644
--- a/backend/api/api/Controllers/ModelController.cs
+++ b/backend/api/api/Controllers/ModelController.cs
@@ -86,7 +86,8 @@ namespace api.Controllers
var user = _userService.GetUserById(model.uploaderId);
if (ChatHub.CheckUser(user._id))
- await _ichat.Clients.Client(ChatHub.Users[user._id]).SendAsync("NotifyEpoch",model.name,info.ModelId,info.Stat,model.epochs,info.EpochNum);
+ foreach (var connection in ChatHub.getAllConnectionsOfUser(user._id))
+ await _ichat.Clients.Client(connection).SendAsync("NotifyEpoch",model.name,info.ModelId,info.Stat,model.epochs,info.EpochNum);
return Ok();
}
diff --git a/backend/api/api/Controllers/PredictorController.cs b/backend/api/api/Controllers/PredictorController.cs
index 3646187e..3a9e6649 100644
--- a/backend/api/api/Controllers/PredictorController.cs
+++ b/backend/api/api/Controllers/PredictorController.cs
@@ -162,7 +162,8 @@ namespace api.Controllers
return BadRequest("Model not found or user doesnt exist");
_predictorService.Create(predictor);
if (ChatHub.CheckUser(user._id))
- await _ichat.Clients.Client(ChatHub.Users[user._id]).SendAsync("NotifyPredictor", predictor._id,model.name);
+ foreach(var connection in ChatHub.getAllConnectionsOfUser(user._id))
+ await _ichat.Clients.Client(connection).SendAsync("NotifyPredictor", predictor._id,model.name);
return CreatedAtAction(nameof(Get), new { id = predictor._id }, predictor);
}
diff --git a/backend/api/api/Services/ChatHub.cs b/backend/api/api/Services/ChatHub.cs
index 47a1f099..790b4de6 100644
--- a/backend/api/api/Services/ChatHub.cs
+++ b/backend/api/api/Services/ChatHub.cs
@@ -23,10 +23,7 @@ namespace api.Services
if (token == null)
return;
string id=_tokenService.TokenToId(token);
- if (!Users.ContainsKey(id))
- Users.Add(id, Context.ConnectionId);
- else
- Users[id] = Context.ConnectionId;
+ Users.Add(Context.ConnectionId,id);
//await SendDirect(id, "poruka");
//await Send(Context.ConnectionId);
await base.OnConnectedAsync();
@@ -34,27 +31,27 @@ namespace api.Services
}
public override async Task OnDisconnectedAsync(Exception? exception)
{
- var user = Users.Values.Contains(Context.ConnectionId);
- if (user==false)
- return;
- Users.Remove(Users.FirstOrDefault(u => u.Value == Context.ConnectionId).Key);
+ Users.Remove(Context.ConnectionId);
}
- public async Task SendDirect(string id,string message)
- {
- if (Users[id]==null)
- return;
-
- await Clients.Client(Users[id]).SendAsync("Notify",message);
- }
- public async Task Send(string message)
+ public static bool CheckUser(string id)
{
- await Clients.All.SendAsync("Notify",message);
+ var users=Users.Values;
+ foreach (var user in users)
+ {
+ if(user==id)
+ return true;
+ }
+ return false;
}
- public static bool CheckUser(string id)
+ public static List<string> getAllConnectionsOfUser(string id)
{
- if (Users[id] == null)
- return false;
- return true;
+ List<string> keys=new List<string>();
+ foreach (var user in Users)
+ {
+ if(user.Value==id)
+ keys.Add(user.Key);
+ }
+ return keys;
}
}
diff --git a/backend/api/api/Services/MlConnectionService.cs b/backend/api/api/Services/MlConnectionService.cs
index 17c0f8b8..b6d422ad 100644
--- a/backend/api/api/Services/MlConnectionService.cs
+++ b/backend/api/api/Services/MlConnectionService.cs
@@ -59,8 +59,9 @@ namespace api.Services
Dataset newDataset = JsonConvert.DeserializeObject<Dataset>(result.Content);
newDataset.isPreProcess = true;
_datasetService.Update(newDataset);
- if(ChatHub.CheckUser(id))
- await _ichat.Clients.Client(ChatHub.Users[id]).SendAsync("NotifyDataset",newDataset.name,newDataset._id);
+ if (ChatHub.CheckUser(id))
+ foreach (var connection in ChatHub.getAllConnectionsOfUser(id))
+ await _ichat.Clients.Client(connection).SendAsync("NotifyDataset",newDataset.name,newDataset._id);
return;
}
diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py
index 0296828a..bca729e4 100644
--- a/backend/microservice/api/newmlservice.py
+++ b/backend/microservice/api/newmlservice.py
@@ -24,7 +24,7 @@ from dataclasses import dataclass
import statistics as s
from sklearn.metrics import roc_auc_score
import matplotlib.pyplot as plt
-from ann_visualizer.visualize import ann_viz;
+#from ann_visualizer.visualize import ann_viz;
def returnColumnsInfo(dataset):
dict=[]
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 0d17271d..e41cd51d 100644
--- a/frontend/src/app/_elements/column-table/column-table.component.ts
+++ b/frontend/src/app/_elements/column-table/column-table.component.ts
@@ -226,15 +226,13 @@ export class ColumnTableComponent implements AfterViewInit {
openSaveExperimentDialog() {
const dialogRef = this.dialog.open(SaveExperimentDialogComponent, {
- width: '400px'
+ width: '400px',
+ data: { experiment: this.experiment }
});
- dialogRef.afterClosed().subscribe(selectedName => {
- this.experiment.name = selectedName;
- //napravi odvojene dugmice za save i update -> za update nece da se otvara dijalog za ime
- this.experimentService.addExperiment(this.experiment).subscribe((response) => {
- this.experiment._id = response._id;
- this.okPressed.emit();
- });
+ dialogRef.afterClosed().subscribe(experiment => {
+ if (experiment) {
+ this.experiment = experiment;
+ }
});
}
diff --git a/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.css b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.css
index e69de29b..8225af36 100644
--- a/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.css
+++ b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.css
@@ -0,0 +1,13 @@
+#btnYes {
+ background-color: var(--offwhite);
+ color: var(--ns-bg-dark-100);
+}
+
+#btnNo {
+ color: gray;
+}
+
+.wrongInput {
+ color: var(--ns-warn);
+ font-size: 11px;
+} \ No newline at end of file
diff --git a/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.html b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.html
index bac73e0a..00ee98c5 100644
--- a/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.html
+++ b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.html
@@ -1,13 +1,13 @@
-<h1 mat-dialog-title>Čuvanje eksperimenta</h1>
-<div mat-dialog-content>
- <span>Unesi naziv eksperimenta:</span>
- <mat-form-field>
- <input type="text" matInput [(ngModel)]="selectedName">
+<h1 mat-dialog-title class="text-center">Sačuvaj eksperiment</h1>
+<div mat-dialog-content class="mt-5 mb-4 mx-1">
+ Naziv eksperimenta:<br>
+ <mat-form-field [style.width.px]=250>
+ <input type="text" matInput [(ngModel)]="selectedName" cdkFocusInitial>
</mat-form-field>
- <br><br>
- <p>Sačuvaj eksperiment:</p>
+ <p *ngIf="wrongAlreadyExists" class="wrongInput">Izaberi drugi naziv za eskperiment.<br>Eskperiment sa unetim nazivom već postoji u kolekciji.</p>
+ <p *ngIf="wrongEmptyName" class="wrongInput">Unesite naziv eksperimenta.</p>
</div>
-<div mat-dialog-actions>
- <button mat-button [mat-dialog-close]="selectedName" cdkFocusInitial>Da</button>
- <button mat-button (click)="onNoClick()">Odustani</button>
+<div mat-dialog-actions class="justify-content-center">
+ <button id="btnYes" mat-stroked-button color="basic" (click)="onYesClick()">Sačuvaj</button>
+ <button id="btnNo" mat-stroked-button (click)="onNoClick()">Odustani</button>
</div> \ No newline at end of file
diff --git a/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.ts b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.ts
index ca01f57e..610af351 100644
--- a/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.ts
+++ b/frontend/src/app/_modals/save-experiment-dialog/save-experiment-dialog.component.ts
@@ -1,5 +1,12 @@
import { Component, OnInit } from '@angular/core';
-import { MatDialogRef } from '@angular/material/dialog';
+import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import Experiment from 'src/app/_data/Experiment';
+import { ExperimentsService } from 'src/app/_services/experiments.service';
+import { Inject} from '@angular/core';
+
+interface DialogData {
+ experiment: Experiment;
+}
@Component({
selector: 'app-save-experiment-dialog',
@@ -9,8 +16,13 @@ import { MatDialogRef } from '@angular/material/dialog';
export class SaveExperimentDialogComponent implements OnInit {
selectedName: string = '';
+ wrongAlreadyExists: boolean = false;
+ wrongEmptyName: boolean = false;
- constructor(public dialogRef: MatDialogRef<SaveExperimentDialogComponent>) { }
+ constructor(public dialogRef: MatDialogRef<SaveExperimentDialogComponent>, @Inject(MAT_DIALOG_DATA) public data: DialogData, private experimentService: ExperimentsService) {
+ this.wrongAlreadyExists = false;
+ this.wrongEmptyName = false;
+ }
ngOnInit(): void {
}
@@ -18,4 +30,23 @@ export class SaveExperimentDialogComponent implements OnInit {
onNoClick() {
this.dialogRef.close();
}
+
+ onYesClick() {
+ if (this.selectedName == "") {
+ this.wrongEmptyName = true;
+ return;
+ }
+ this.wrongEmptyName = false;
+
+ this.data.experiment.name = this.selectedName;
+ this.experimentService.addExperiment(this.data.experiment).subscribe((response) => {
+ this.wrongAlreadyExists = false;
+ this.data.experiment = response;
+ this.dialogRef.close(this.data.experiment);
+ }, (error) => {
+ if (error.error == "Experiment with this name exists") {
+ this.wrongAlreadyExists = true;
+ }
+ });
+ }
}