diff options
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; + } + }); + } } |